Skip to content

fix(1424): 订正 ADR-035 的注册路径事实,并给 webfetch 补一道普查闸 - #1440

Merged
jinjunnn merged 1 commit into
alphafrom
feat/1424-webfetch-registration-census
Sep 24, 2026
Merged

jinjunnn merged 1 commit into
alphafrom
feat/1424-webfetch-registration-census

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

Fixes #1424
Refs #1414

两件事

① ADR-035 的注册路径事实订正。 它是把工具注册面当成两个入口来推理的(v1
packages/opencode/src/tool/registry.ts 与 v2 packages/core/src/tool/builtins.ts),
「第二份已挂载的同名注册」这个结论就建在它上面。实读是四条,单一权威是
packages/opencode/src/session/tools.ts(:162 取 registry+plugin,:480 取 MCP):

# 路径 在出货桌面端的地位
R1 packages/opencode/src/tool/registry.ts(v1) 活的主路径,17 个 Tool.define 叶子
R2 Plugin.Service → tool/registry.ts:221,229 的 custom.push 活;与 R1 汇进同一个 ToolRegistry.all()
R3 MCP.Service → session/tools.ts:480 活;不经 ToolRegistry,到 session/tools.ts 才合流
R4 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 既无主权闸也无固定端点,合并等于用最松的
一方定义两者的语义)。两条:

  1. 集合恰好是那两份 —— 多一份或少一份都红。
  2. 谓词自检:三张网各喂一条该命中的合成样本(含带类型参数的 Tool.define<…>(,
    老闸那张网 Tool\.define\( 对它失明,实测 false)、三条只是提到名字的反例、
    一根不存在的负针要零命中、并钉住枚举规模(2490 个源文件)与必须走到的包 ——
    扫描退化成两三个包时第 1 条会假绿。

scripts/gate-files.tsv 登记一行(精确 2 条)。不需要
source-text-anchors.ts 条目:本文件不按字面路径读任何源码文件,谓词零命中
(gate-file-registry.test.ts 22 pass 已覆盖两个方向)。

AC3 —— 变异实验(六臂,git status 全程干净)

变异种一律放 packages/ext/src/alpha-third-webfetch-1424.ts(未追踪、跑完即删,零 commit)。

臂 变异 期望 实测
0 干净树 绿 2 pass / 0 fail · EXIT=0
1 第三份 · Tool.define("webfetch", …)(网 ①) 红 1 pass / 1 fail · EXIT=1,点名 packages/ext/src/alpha-third-webfetch-1424.ts
2 第三份 · export const name = "webfetch"(网 ②) 红 1 pass / 1 fail · EXIT=1,同上
3 第三份 · webfetch: tool({…})(网 ③) 红 1 pass / 1 fail · EXIT=1,同上
4 算出来的 id(["web","fetch"].join(""))+ 复用实现 绿(抬头声明的已知逃逸) 2 pass / 0 fail · EXIT=0
5 少一份:把 opencode 那份的注册名改掉 红 1 pass / 1 fail · EXIT=1,diff 里少的正是 packages/opencode/src/tool/webfetch.ts
6 全部撤掉 绿 2 pass / 0 fail · EXIT=0,git status --porcelain 0 行

臂 1 的原始输出:

@@ -2,3 +2,3 @@
    "packages/core/src/tool/webfetch.ts",
+   "packages/ext/src/alpha-third-webfetch-1424.ts",
    "packages/opencode/src/tool/webfetch.ts",

臂 5 的原始输出:

@@ -2,3 +2,3 @@
    "packages/core/src/tool/webfetch.ts",
-   "packages/opencode/src/tool/webfetch.ts",
  ]

臂 4 刻意留成绿:那是 ADR-035 R4 已登记的逃逸(算出来的注册名 + 复用实现),
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)。
  • base fail-set 自测:同一棵树、同一条命令,在 origin/alpha@b03e79da1 上
    bun test src = 5321 pass / 0 fail(与派发书给的数逐字相同)。
  • 本分支 bun test src = 5323 pass / 0 fail(+2 = 本 PR 新增的两条)。新增红 0 条。
  • typecheck EXIT=0 / grep -c "error TS" = 0。
  • north-star-guard.sh EXIT=0(✓ zero upstream package edits);git diff --name-only origin/alpha...HEAD
    三个文件全在 alpha 自有面。
  • assert-module-size.sh EXIT=0,三行棘轮全 = 基线(新文件是 .test.ts,不进 tree 口径)。
  • assert-gate-files.sh EXIT=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/ext 208 pass / 0 fail;packages/alpha-contracts-consumer 42 pass / 0 fail。
  • pre-push 全量门(14 步)真跑过,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

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>
@jinjunnn
jinjunnn merged commit 7115232 into alpha Sep 24, 2026
5 of 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.

决策文件说工具注册有两个入口,实读是四个;而唯一那道检查只盯了一半

1 participant