Skip to content

[CHORE] UPSTREAM_PATHS 内的 alpha 自有文件没有 exclude —— 11 个文件今天「改一个字守卫就红」 #971

Closed

Description

@jinjunnn

大白话

我们有一批自己写的文件,住在上游包的目录里(packages/opencode/、packages/core/、packages/schema/)。north-star 守卫的规则是「alpha 不许改上游包」,它看的是 git diff --diff-filter=DMR(删除/修改/改名)。

新增文件是 A,不触发 —— 所以这些文件落地那一次是绿的。ADR-041 第 72 行据此写下「新增文件因 guard 的 DMR 策略不需要排除」。

那个豁免是一次性的。 文件一旦进了 origin/alpha,以后任何修改都是 M,守卫当场红。也就是说:今天想给自己写的判据补一条用例、修一次 flake、改一句注释,都要先走一轮 owner 级的 ADR 修订 —— 而在门红之前,没有任何东西会告诉你这件事。人在门红时最省事的反应是 --no-verify,那会把所有门一起关掉。

这是一个类,不是 4 个实例

原本的写法是「ADR-041 忘了排除自己新增的 4 个文件」。实测下来共同前提不是 ADR-041,而是:

任何 alpha 自有文件,只要落在 UPSTREAM_PATHS 内,进了 origin/alpha 之后的任何修改都是 M ⇒ 守卫红。

按 4 个实例开票,下一次冒出新成员时枚举默认放行。按共同前提开票,新成员默认被覆盖。

实测枚举(2026-08-14,alpha-code@41a4082 + PR #726 的分支)

逐字转写 scripts/north-star-guard.sh:39 的 UPSTREAM_PATHS 与 :42-106 的 44 条 exclude(转写条数 = 44,与守卫自己的注释一致),跑 git ls-files -- $UPSTREAM_PATHS "${EX[@]}",过滤 alpha 自有命名 —— 11 个成员:

packages/core/test/alpha-tool-identity.test.ts
packages/core/test/alpha-websearch-sovereignty.test.ts
packages/opencode/src/session/tool-display.ts
packages/opencode/test/mcp/alpha-cloud-mcp-multisource.test.ts
packages/opencode/test/mcp/alpha-cloud-mcp-revival.test.ts
packages/opencode/test/permission/alpha-ask-deadline.test.ts
packages/opencode/test/tool/alpha-mcp-alias-collision-lock.test.ts   ← #726 的 PR 新增,第 11 个成员
packages/opencode/test/tool/alpha-mcp-websearch-gate.test.ts
packages/opencode/test/tool/alpha-tool-identity.test.ts
packages/opencode/test/tool/alpha-websearch-failure.test.ts
packages/schema/src/tool-identity.ts

其中 5 个是已登记在 scripts/gate-files.tsv 的闸门文件(core/test/alpha-tool-identity、core/test/alpha-websearch-sovereignty、opencode/test/permission/alpha-ask-deadline、opencode/test/tool/alpha-tool-identity、opencode/test/tool/alpha-websearch-failure,加上 #726 新增的那个共 6 个)—— 也就是说我们最需要维护的那批判据,恰好是最难改的那批。

packages/schema/src/tool-identity.ts 是 ToolAliasLedger 本体。

「改一个字就红」不是推断,是跑出来的

读一个历史区间跑守卫自己的谓词(只读,无变异):

$ sha=$(git log --diff-filter=M --format=%h -1 -- packages/opencode/test/tool/alpha-tool-identity.test.ts)
98acf36f8
$ git diff --diff-filter=DMR --name-only ${sha}^..${sha} -- $UPSTREAM_PATHS "${EX[@]}"
packages/opencode/test/tool/alpha-tool-identity.test.ts

守卫点名了它。

处置(需要 owner 裁决,不是实现方顺手改)

按 ADR-029 §3,不得静默加 exclude —— 新增收编须有自己的 ADR。所以这张票要的是:

  1. ADR-041 第 72 行原文划掉保留 + 带日期订正块,写清「新增文件不需要排除」为何只在落地那一刻成立;
  2. 裁决这 11 个文件(以及未来同形新增)的处置口径 —— 逐文件补进 scripts/north-star-guard.sh 的 exclude 清单,还是给 alpha 自有命名一条结构性规则;
  3. 若走逐文件路线,同步更新 .github/workflows/alpha-ci.yml 里的条数说明与 local-gate-parity 的判据。

已知不做

不在 #726 的 PR 里顺手改 exclude 清单 —— 那是 owner 级的 ADR 修订。

Refs #726

Activity

  1. added
    type:choreMaintenance or operational work
    prio:P1High-value near-term delivery
    area:governanceStandards or lifecycle governance
    on Aug 14, 2026
  2. added a commit that references this issue on Aug 15, 2026
  3. self-assigned this
    on Aug 21, 2026
  4. jinjunnn commented on Aug 21, 2026

    @jinjunnn
    OwnerAuthor

    Ready-gate 勘破(2026-W34)

    问 答
    还有效吗? 是 — UPSTREAM_PATHS 内 alpha 自有文件改 M 仍会点名 north-star
    已完成吗? 否 — 未见合入的 exclude/ADR-041 订正把这 11 个成员收编
    下一步? Owner 裁决(票面已写):逐文件 exclude vs 结构性规则;ADR-029 §3 禁止静默加 exclude。实现方不能在无 ADR 下改守卫。

    Orchestrator: 退回 Blocked / Owner action;另开一张可实施 CODE 进 Ready。

  5. jinjunnn commented on Aug 21, 2026

    @jinjunnn
    OwnerAuthor

    Blocked — Owner action, review 2026-08-28.

    ADR-041/029: decide exclude-list vs structural rule for alpha-owned files under UPSTREAM_PATHS

  6. jinjunnn commented on Aug 23, 2026

    @jinjunnn
    OwnerAuthor
  7. jinjunnn commented on Aug 24, 2026

    @jinjunnn
    OwnerAuthor

    关闭条件已验证(双向,在合并后的树上实跑)

    票面的条件不是「子票合了」,而是「alpha 自有文件落在 UPSTREAM_PATHS 内,修改不再让守卫红」。
    #1085(CHOICE=2,ADR-043)落地后在 origin/alpha@c25e3e636 实跑:

    ① 正向 —— 改 alpha 自有文件,守卫必须绿

    改 packages/core/test/alpha-tool-identity.test.ts(住在 packages/core/ 内)⇒

    · alpha 自有(住在上游包里,但 origin/dev 从来没有过这条路径)—— 不算上游改动:
      packages/core/test/alpha-tool-identity.test.ts
    ✓ zero upstream package edits (…ADR-033 收编白名单 + ADR-043 alpha 自有谓词除外)
    exit=0
    

    ② 反向 —— 改真上游文件,守卫必须仍然红

    这一条比 ① 更要紧:一个放松过头的谓词会放行真上游改动,那比原缺陷更贵。
    改 packages/opencode/src/tool/read.ts(已核实确实存在于 origin/dev = 真上游)⇒

    ✗ upstream files modified/deleted/renamed (fork-sync would conflict):
      packages/opencode/src/tool/read.ts
      → 它其实是 alpha 自有文件?命名成 alpha-*,或在文件里写一行 'north-star:alpha-owned'(ADR-043)
    exit=1
    

    两次实验均用副本法还原,树零 diff。

    谓词是合取(① 路径在 origin/dev 里不存在 ② basename alpha- 开头或文件含
    north-star:alpha-owned),合取那一半正是 ② 能红的原因 —— 单靠自报家门会被真上游
    文件冒名顶替。

    ⇒ 本票的类前提(「任何 alpha 自有文件进了 alpha 之后的修改都是 M ⇒ 守卫红」)已被
    结构性谓词消解,新成员默认覆盖而非默认放行。关闭。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:governanceStandards or lifecycle governanceprio:P1High-value near-term deliverytype:choreMaintenance or operational work

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions