Skip to content

[#642] ADR-009 裁决 (c) 收口 —— 「禁用 provider 棘轮」是假闸门 - #644

Merged
jinjunnn merged 1 commit into
alphafrom
fix/adr009-642
Jul 27, 2026
Merged

[#642] ADR-009 裁决 (c) 收口 —— 「禁用 provider 棘轮」是假闸门#644
jinjunnn merged 1 commit into
alphafrom
fix/adr009-642

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

alpha-code#642(#223 的 AC6 实现票)。

票的前提查错了

#642 写「ADR-009 仍是 #639 之前的版本」——不成立d341b208d(PR#639)自己就改了这份 ADR(+88 行,R3–R7 全部收口在内),同批还新建了 ADR-035、改了 DECISIONS.md 与 E7 基线。逐条核对 AC:六项记载(登录态门控 / 云权威 / 逃生开关跨本地+云 / force-off 全 keyless flag / 失败诚实 / 唯一回退=模型自带 search)与裁决 (a)(b)(d) 均已在册

剩下两处真缺口,本 PR 收口。

一、裁决 (c) 声明的闸门不存在,而且它守的也不是这条路

「以禁用 provider 棘轮(断言打包端 provider 目录不含 opencode)守死」——按 forbidden-provider 与「provider 目录集合」两个方向普查全仓测试,零命中。这是一处假闸门:ADR 与 E7 基线都声明了保证,却没有任何可执行判据钉住它。

即便补上,它守的也是错的层:

环节 事实
alpha-models.ts:115-117 遍历 readUserProviderIds()enabled.push(id),零过滤
ext-config.ts:784 opencode.jsoncprovider 键,原样返回
registry.ts:58 webSearchEnabled = providerID===opencode || exa || parallel

用户写一条 {"provider":{"opencode":{…}}},opencode 就进 enabled_providers,该 OR 分支恒真 —— 与 4 个 keyless flag 是否被 force-0 无关。所以「打包端不可达 / 恒为死码」是错的。

但主权判决不受影响,因为保证本来就不在注册闸上:执行面撞裁决 (b) 的传输层最终闸(ALPHA_LOCAL_WEBSEARCH_DENY,mcp-websearch.tscall()packages/core/src/tool/websearch.tscallMcp() 各自第一句),调用被拒且零出网。与已登记的残留同类:能力真关,可见性是 cosmetic

裁决:不补棘轮(守错层,补了只是把假闸门换成一道守不住东西的真测试),也不过滤该 id(登出/BYOK 态自带 Zen key 是决策 A 明示允许的形态,过滤会误伤)。(c) 从「死码 + 棘轮」降级为**「注册面可达、执行面被传输闸兜住」**,按现状诚实登记。「无需为它 patch 上游 registry.ts」这一半仍成立。

二、frontmatter amended 停在 2026-07-25

正文已含 07-26 的 R3–R7 收口段。→ 2026-07-27

E7 基线

按其既有的「勘破更正」体例(§1 那块 402 更正)加同一个块,并声明本稿凡出现该表述之处一律以该块为准(§3a、票 3、票 3b、票 5,共 7 处),不逐处改写。

顺带查出、在本 PR 修的

#642 的 AC (d) 与 #643 的 out-of-scope/退出条件仍写着「host-tool 无 402/余额门为现状」「失败集证据无 402 项」—— 这是从 2026-07-22 的基线原文抄的,而基线自己已在 2026-07-25 更正为「402 与余额门已上线」。已按 alpha-platform 现役代码复核:worker.ts:1240webSearchHandler 确有 accountPreauth(:1258)与两条 402(:1254 per-job 超预算、preauth 拒绝)。两张票的正文需更正,否则 #643 会照着作废的规格取错证据。已在两张票下留言。

本地闸

  • scripts/alpha-check.sh:3077 pass / 0 fail(209 文件)
  • scripts/check-doc-links.py <两个改动文件>:绿(0 相对链接,rc=0)
  • north-star:改动仅 .claude/rules/adrs/docs/design/,零 UPSTREAM_PATHS

Fixes #642

🤖 Generated with Claude Code

#642 的前提「ADR-009 仍是 #639 之前的版本」不成立:PR#639 自己就改了这份 ADR
(+88 行,R3–R7 全部收口在内),AC 要求的六项记载与裁决 (a)/(b)/(d) 均已在册。
逐条核对后剩下的是两处真缺口。

一、裁决 (c) 声明的闸门不存在,且它守的也不是这条路。

「以禁用 provider 棘轮(断言打包端 provider 目录不含 opencode)守死」——按
forbidden-provider 与 provider 目录集合两个方向普查全仓测试,零命中。它是被写进
ADR 与 E7 基线的一处假闸门:声明了保证,没有任何可执行判据钉住它。

即便补上,它守的也是错的层。注入面把用户自配 provider id 无条件并回硬白名单:
alpha-models.ts:115-117 遍历 readUserProviderIds()(ext-config.ts:784,取
opencode.jsonc 的 provider 键,零过滤)后 enabled.push(id)。用户写一条
{"provider":{"opencode":{…}}},opencode 即进 enabled_providers,
webSearchEnabled(ProviderV2.ID.opencode, …)(registry.ts:58)恒真 —— 与 4 个
keyless flag 是否被 force-0 无关。「恒为死码」是错的。

主权判决不受影响,因为保证本来就不在注册闸上:执行面撞裁决 (b) 的传输层最终闸
(ALPHA_LOCAL_WEBSEARCH_DENY,mcp-websearch.ts 的 call() 与 core 的 callMcp()
各自第一句),调用被拒且零出网。与已登记的残留同类 —— 能力真关,可见性 cosmetic。

裁决:不补棘轮(守错层),不过滤该 id(登出/BYOK 自带 Zen key 是决策 A 明示允许的
形态,过滤会误伤);(c) 从「死码 + 棘轮」降级为「注册面可达、执行面被传输闸兜住」,
按现状诚实登记。「无需为它 patch 上游 registry.ts」这一半仍成立。

二、frontmatter amended 停在 2026-07-25,而正文已含 07-26 的 R3–R7 收口段。

E7 基线按其既有的「勘破更正」体例加同一个块,并声明本稿凡出现该表述之处一律以
该块为准(§3a、票 3、票 3b、票 5 共 7 处),不逐处改写。

本地闸全绿:3077 pass / 0 fail、docs 链接闸绿。

Fixes #642

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jinjunnn
jinjunnn merged commit 94a76b6 into alpha Jul 27, 2026
6 checks passed
@jinjunnn
jinjunnn deleted the fix/adr009-642 branch July 27, 2026 08:16
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.

[E7][DECIDE] 修订 ADR-009 收编云优先 + kill-switch 语义

1 participant