Skip to content

docs(decisions): ADR-009 由 ADR-046 取代 —— 两条腿都活着,账户信号只决定云腿在不在 (#1432) - #1439

Merged
jinjunnn merged 1 commit into
alphafrom
feat/1432-adr-009-supersede
Sep 24, 2026
Merged

jinjunnn merged 1 commit into
alphafrom
feat/1432-adr-009-supersede

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

这张 PR 做什么

owner 2026-09-23 裁决「本地与云的 web 工具都要活,按账户选路」,推翻了 ADR-009 决策 B 的 B1
(登录态门控 + 云优先 + 对本地腿 force-off)。那份文件还在,还写着旧规矩 —— 后面每一个照着它做的人
都会把新规矩又做回旧的,而他不会知道自己做错了,因为文件就是这么写的。

本 PR 只动决策资产,零代码行为变更:新建 ADR-046、把 ADR-009 标成 superseded
决策登记表两处。选路本身归 #1411(CODE-1)与 #1431(CODE-2)。

判据:supersede,不是就地修订

不是印象 —— ADR-009 上一次(2026-08-03)就地修订的第一句逐字写着「本条不是一次新决策……
B1 的登录态门控、B2 的 kill-switch 语义一个字都没变」,而这一次改的是决策实质。再往同一份
文件贴一段,同一个 id 下会同时存在两条互相矛盾的 B1。另三条理由在方案基线 §六
(形状被推翻不是参数 / 六轮收口是史料 / 决策 A 的适用面回到 2026-06-18 的原始形状)。

改了什么(3 个文件,+197 −2)

文件 改动
.claude/rules/adrs/ADR-046-web-tools-two-legs-account-routing.md 新建。含基线 §六 点名的 D1–D5
.claude/rules/adrs/ADR-009-websearch-default.md 只改 frontmatter 两行(status: amendedsuperseded,加 superseded-by: ADR-046);正文一字未动(git show 的 diff 恰好 3 行)
.claude/rules/DECISIONS.md ADR-009 那行状态列改 superseded → ADR-046(只改状态列),表尾追加 ADR-046 一行

D4 是事实订正(不是新决策),改正 ADR-009 已漂的两处:

  • B1 判据写的是 ALPHA_CLOUD_TOKEN,实读是 ALPHA_MCP_TOKEN
    (packages/ui-mac/src/main/server.ts:334alpha-config-injection.ts:100,#1195 换轴);
  • 「云 MCP 零凭证通道、走标准 MCP OAuth」与实读的
    headers.Authorization: "Bearer {file:…}" + oauth: false 不符
    (packages/ui-mac/src/main/cloud-sidecar-config.ts:33-50)。

D3 比勘破的措辞多一个条件(实读 b03e79da1):整 server 暗掉会带走该 server 上的每一个工具 ——
这件事在凭证缺席时无条件成立;而 kill-switch 只在 ext 未装载 / {file:} 引用读不到的降级态
成立。正常态下 packages/ext/src/plugin.ts:118config 钩子第一句无条件
installCloudMcp()(packages/ext/src/cloud-websearch-kill.ts:378),把真定义换回 enabled:true,
兄弟工具回来,只有 web search 仍被 tool.execute.before 拦住 ⇒ ADR-009 B2 的「不误伤兄弟」
在正常态成立。勘破 §5/§8.3 与基线 §三「已知不修」把这个条件性退化写成了无条件事实。ADR 里按
条件如实登记,并写明勘破自陈这一格从未在装载实例上复验(勘破 §9 第 6 条)。

文档影响

decisions。落点是受保护执行资产 .claude/rules/adrs/ + 其索引 .claude/rules/DECISIONS.md,
maintain-repository-docs 的规矩改(只补 supersession 链接与索引行,不删既有 ADR、不动正文)。
alpha-work 的跨仓登记簿不动:实读该仓 ADR-009 零命中,登记簿只映射跨仓组合域,本决策
由 alpha-code 独占(alpha-work:ADR-003 决策 1 与 3)。

本地门(真实输出,worktree 1432-code3,origin/alpha@b03e79da1)

pre-push 钩子跑的 scripts/alpha-check.sh 全 14 步,PUSH_RC=0:

▶ [1/14] ✓ zero upstream package edits          (改动只有 .claude/rules/**,packages/ 零触碰)
▶ [4/14] ✓ typecheck
▶ [5/14] ── bun exit=0 · 实际通过 5321 条 · 下界 3000 · (packages/ui-mac: src)
          ── bun exit=0 · 实际通过 208 条 · 下界 100 · (packages/ext: )
          ── bun exit=0 · 实际通过 60 条 · 下界 15 · (packages/alpha-contracts-consumer: )
▶ [6/14] ✓ gate files
▶ [8/14] ✓ 42 relative link(s) resolve across 3 file(s) · ✓ docs links (3 个 Markdown)
  • 与 base fail-set 的差 = 0:5321 pass / 0 fail,与派发给出的 base 逐字相同。
    websearch-copies.test.ts 仍绿(它只扫 packages/*/src/**/*.ts(x),structurally 看不到 Markdown)。
  • 文档闸先证明过能测出已知的坏:同一个脚本对一份故意写坏链接的副本报
    ✗ 3 broken relative link(s) / rc=1;它也真的抓到了我第一版写错深度的相对链接
    (../../docs/….claude/rules/adrs/ 解析到 .claude/docs/…),改成 ../../../ 后才绿。
  • check_docs_contract.py --strict(指向本 worktree):alpha-code … PASS;仓外 3 条 ERROR
    (alpha-platform 1 / alpha-web 2)在我改动之前的同一次基线运行里逐字相同,与本 PR 无关。
  • 一次假红的归因:第一次 push 的第 [6/14] 步 package-command-engine-visibility.test.ts
    2 pass / 1 fail,报错是 engine exited before listening … ServeError —— 它起真引擎
    serve --port $((4600+random%2000)),绑不上端口。同一棵树同一文件单跑 3 pass / 0 fail,
    而本 PR 的 diff 里没有一行 .ts。第二次 push 全 14 步绿。

主动没做的

  • 不碰 ADR-035(#1424 在改它的事实并给 webfetch 立普查闸)。两条 lane 在 DECISIONS.md
    上改的不是同一处:我改第 18 行(ADR-009 状态)与表尾追加,ADR-035 那行未动。
  • 不改 ADR-009 正文,也不给它加 ADR-001 那种「已被取代」正文横幅 —— 票面边界只许改
    frontmatter。status + superseded-by 在文件头 4~7 行,打开即见。
  • superseded-by 用连字符,不是基线里写的 superseded_by:仓内既有约定在 DECISIONS.md
    第 4 行与 ADR-001/ADR-020 的 frontmatter 里,键名从没有人解析(两条检索轴查过 scripts/
    测试与 workflow,零命中)。
  • 不改基线正文里那句更粗的 kill-switch 措辞(超出本票边界,已在上面点名回报)。
  • 不动 alpha-work 的跨仓登记簿(理由见「文档影响」)。

Fixes #1432
Refs #1414

🤖 Generated with Claude Code

owner 2026-09-23 裁决「本地与云的 web 工具都要活,按账户选路」,直接推翻 ADR-009 决策 B
的 B1(登录态门控 + 云优先 + 对本地腿 force-off)。那份文件还在,还写着旧规矩 ——
后面每一个照着它做的人都会把新规矩又做回旧的,而他不会知道自己做错了。

**supersede,不是就地修订**(判据实读,不是印象):ADR-009 上一次(2026-08-03)就地
修订的第一句逐字写着「本条不是一次新决策……B1 的登录态门控、B2 的 kill-switch 语义一个字
都没变」,而这一次改的是决策实质。再往同一份文件贴一段,同一个 id 下会同时存在两条互相
矛盾的 B1。另三条理由在方案基线 §六(形状被推翻不是参数 / 六轮收口是史料 / 决策 A 的适用面
回到 2026-06-18 的原始形状)。

新 ADR-046 含基线 §六 点名的 D1–D5,其中 D4 是**事实订正**(不是新决策),改正 ADR-009
已漂的两处:

- B1 的判据写的是 `ALPHA_CLOUD_TOKEN`,实读是 `ALPHA_MCP_TOKEN`
  (`packages/ui-mac/src/main/server.ts:334`、`alpha-config-injection.ts:100`,`#1195` 换轴);
- 「云 MCP 零凭证通道、走标准 MCP OAuth」与实读的
  `headers.Authorization: "Bearer {file:…}"` + `oauth: false` 不符
  (`packages/ui-mac/src/main/cloud-sidecar-config.ts:33-50`)。

D3 的 kill-switch 连带面按实读登记,比勘破的措辞多一个条件:整 server 暗掉带走该 server
全部工具,这件事在**凭证缺席**时无条件成立;而 kill-switch 只在 **ext 未装载 / `{file:}`
读不到**的降级态成立 —— 正常态下 `packages/ext/src/plugin.ts:118` 的 config 钩子第一句
无条件调 `installCloudMcp()`,把真定义换回 `enabled:true`,兄弟工具回来,只有 web search
仍被 `tool.execute.before` 拦住。ADR-009 B2 那条「不误伤兄弟」的不变量因此在正常态成立。
勘破自陈这一格从未在装载实例上复验(§9 第 6 条),ADR 里如实写了「要当事实用之前先跑」。

ADR-009 **正文一字不改**(它是史料),只改 frontmatter:`status: amended` → `superseded`
加 `superseded-by: ADR-046`;键名用仓内既有约定(`DECISIONS.md` 第 4 行与 ADR-001/ADR-020
的 `superseded-by`),不是基线里写的 `superseded_by`。决策登记表两处:ADR-009 那行状态改
`superseded → ADR-046`(只改状态列),并追加 ADR-046 一行。

主动没做的:
- 不碰 `ADR-035`(`#1424` 在改它的事实并给 `webfetch` 立普查闸),两条 lane 在 DECISIONS.md
  上改的不是同一处(我改第 18 行与表尾追加,ADR-035 那行未动);
- 不动 `alpha-work/governance/architecture-decision-registry.md` —— 实读该仓 `ADR-009` 零命中,
  跨仓登记簿只映射跨仓组合域,本决策由 alpha-code 独占(alpha-work ADR-003 决策 1/3);
- 不给 ADR-009 正文加「已被取代」横幅(那是正文,票面边界只许改 frontmatter);
- 不改基线正文里那句更粗的 kill-switch 措辞(超范围,回报编排者)。

Fixes #1432
Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jinjunnn
jinjunnn merged commit 16ac1b7 into alpha Sep 24, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REQ-1414][CODE-3] 让决策文件和代码说同一件事

1 participant