fix(1424): 订正 ADR-035 的注册路径事实,并给 webfetch 补一道普查闸 - #1440
Merged
Merged
Conversation
ADR-035 是把工具注册面当成**两个**入口来推理的(v1 `tool/registry.ts` 与 v2 `core/tool/builtins.ts`),实读是**四条**:R1 registry、R2 plugin 的 `custom.push`、R3 MCP(`session/tools.ts:480`,不经 ToolRegistry)、R4 v2 builtins。单一权威是 `packages/opencode/src/session/tools.ts`(`:162` 取 R1+R2,`:480` 取 R3)—— 照 `registry.ts` 一条列表会整类漏掉 MCP 工具。 第二处:ADR-035 立的普查闸只盯 `websearch`,而 `webfetch` 同样有两份注册 (`opencode/src/tool/webfetch.ts` 与 `core/src/tool/webfetch.ts`)却一份检查 都没有 —— `#1414` 的选路只接一份不会有任何东西变红。 - ADR-035 §背景 2 末尾加一块带日期的注册路径事实更正(四条路径表 + 单一 权威 + 三条后果),§后果「两份副本」那一条加一句指针,免得单读该节又推出 「入口只有两个」。 - 新 `packages/ui-mac/src/main/webfetch-copies.test.ts`:照 `websearch-copies.test.ts` 的形状**复制**一份(刻意不抽通用框架 —— webfetch 既无主权闸也无固定端点,合并等于用最松的一方定义两者)。 第 1 条钉集合恰好两份;第 2 条是谓词自检:三张网各喂一条该命中的合成样本 (含带类型参数的 `Tool.define<…>(`)、三条只提到名字的反例、一根不存在的 负针零命中、并钉住枚举规模与必须走到的包(扫描退化成两三个包时集合断言会 假绿)。 - `scripts/gate-files.tsv` 登记一行(精确 2 条)。 守不住什么写在文件抬头,不重新发明:算出来的注册名 + 复用实现;以及 plugin / MCP 两条不产生源文件的注册路径 —— 本闸绿 ≠ 只有两个入口。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1424
Refs #1414
两件事
①
ADR-035的注册路径事实订正。 它是把工具注册面当成两个入口来推理的(v1packages/opencode/src/tool/registry.ts与 v2packages/core/src/tool/builtins.ts),「第二份已挂载的同名注册」这个结论就建在它上面。实读是四条,单一权威是
packages/opencode/src/session/tools.ts(:162取 registry+plugin,:480取 MCP):packages/opencode/src/tool/registry.ts(v1)Tool.define叶子Plugin.Service→tool/registry.ts:221,229的custom.pushToolRegistry.all()MCP.Service→session/tools.ts:480ToolRegistry,到session/tools.ts才合流packages/core/src/tool/builtins.ts(v2)⇒ 照
registry.ts一条列表会整类漏掉 MCP 工具。勘破不在本 PR 重做,原件是docs/architecture/2026-09-23-native-tool-gate-inventory.md§1.1–§1.3(#1414)。订正落在
ADR-035§背景 2 那条更正链的末尾(带日期,照该文件既有形式),外加 §后果「两份副本」那一条一句指针 —— 免得单读该节又推出「入口只有两个」。
② 给
webfetch也立一道普查闸。webfetch同样有两份注册(
packages/opencode/src/tool/webfetch.ts与packages/core/src/tool/webfetch.ts),而
websearch有websearch-copies.test.ts钉着、webfetch一份检查都没有 ——#1414的选路只接一份不会有任何东西变红。新
packages/ui-mac/src/main/webfetch-copies.test.ts,照websearch-copies.test.ts的形状复制一份(刻意不抽通用框架:
webfetch既无主权闸也无固定端点,合并等于用最松的一方定义两者的语义)。两条:
Tool.define<…>(,老闸那张网
Tool\.define\(对它失明,实测false)、三条只是提到名字的反例、一根不存在的负针要零命中、并钉住枚举规模(2490 个源文件)与必须走到的包 ——
扫描退化成两三个包时第 1 条会假绿。
scripts/gate-files.tsv登记一行(精确 2 条)。不需要source-text-anchors.ts条目:本文件不按字面路径读任何源码文件,谓词零命中(
gate-file-registry.test.ts22 pass 已覆盖两个方向)。AC3 —— 变异实验(六臂,
git status全程干净)变异种一律放
packages/ext/src/alpha-third-webfetch-1424.ts(未追踪、跑完即删,零 commit)。2 pass / 0 fail· EXIT=0Tool.define("webfetch", …)(网 ①)1 pass / 1 fail· EXIT=1,点名packages/ext/src/alpha-third-webfetch-1424.tsexport const name = "webfetch"(网 ②)1 pass / 1 fail· EXIT=1,同上webfetch: tool({…})(网 ③)1 pass / 1 fail· EXIT=1,同上["web","fetch"].join(""))+ 复用实现2 pass / 0 fail· EXIT=01 pass / 1 fail· EXIT=1,diff 里少的正是packages/opencode/src/tool/webfetch.ts2 pass / 0 fail· EXIT=0,git status --porcelain0 行臂 1 的原始输出:
臂 5 的原始输出:
臂 4 刻意留成绿:那是
ADR-035R4 已登记的逃逸(算出来的注册名 + 复用实现),websearch那边靠「闸下沉到共同出网出口」收口,而webfetch的 URL 由模型当场给、没有那个出口 ⇒ 这一支今天没有兜底,写在文件抬头,不声称按类闭合。
本地门(worktree
.worktrees/1424-registry,已补齐两个未追踪产物)electron/{dist,path.txt}软链主 checkout;alpha_fence.node用bun run --cwd packages/ui-mac build:fence-addon在本树现编(buildId=fence-20260924T023217772Z)。origin/alpha@b03e79da1上bun test src= 5321 pass / 0 fail(与派发书给的数逐字相同)。bun test src= 5323 pass / 0 fail(+2 = 本 PR 新增的两条)。新增红 0 条。typecheckEXIT=0 /grep -c "error TS"= 0。north-star-guard.shEXIT=0(✓ zero upstream package edits);git diff --name-only origin/alpha...HEAD三个文件全在 alpha 自有面。
assert-module-size.shEXIT=0,三行棘轮全= 基线(新文件是.test.ts,不进 tree 口径)。assert-gate-files.shEXIT=0,✓ 222 个闸门文件全部在位且真的跑过,其中✓ 2 条断言真的执行了(packages/ui-mac: src/main/webfetch-copies.test.ts)。check-doc-links.py对改动的 md:✓ 2 relative link(s) resolve across 1 file(s);先用一根坏链证明它测得出已知的坏(合成样本
✗ 1 broken relative link(s)· EXIT=1)。packages/ext208 pass / 0 fail;packages/alpha-contracts-consumer42 pass / 0 fail。git push未用--no-verify,PUSH_EXIT=0;远端读回
git ls-remote --heads=50929d030…(不信退出码)。跑完
core.hooksPath仍是.githooks,本次运行零探针 worktree 泄漏。门自报四步「未验证/未比对/未测量」,全部是环境依赖(registry 不可达 / 取不到
origin/dev镜像 / 三个 BYOK provider 本机无 key),与本 PR 改动无关。文档影响
.claude/rules/adrs/ADR-035-…md(受保护资产,改动经票面 AC1 明确授权)。不动
.claude/rules/DECISIONS.md、不动ADR-009、不动docs/architecture/2026-09-23-native-tool-gate-inventory.md(它是那一轮的勘破原件)。主动没做的事
websearch-copies.test.ts那张对Tool.define<…>(失明的网(实测确认失明,但那是既有闸的范围,不在本票)。
.claude/rules/DECISIONS.md—— 另一条 lane(#1432)正在改那张登记表。顺带发现该表第 40 行仍写
ADR-035接管「两个源文件」,而 ADR §1 自 R3 起是三个:陈旧,但不是本票范围,留给票面裁决。
#1414。#1412的webfetch围栏修复。🤖 Generated with Claude Code