From 37ef4ac48c5ae9f90071e93fb48a276747307d14 Mon Sep 17 00:00:00 2001 From: jinjunnn Date: Thu, 24 Sep 2026 00:16:32 -0400 Subject: [PATCH] =?UTF-8?q?docs(adr):=20ADR-035=20=E6=8E=A5=E7=AE=A1?= =?UTF-8?q?=E7=9A=84=E6=98=AF=E4=B8=89=E4=B8=AA=E6=BA=90=E6=96=87=E4=BB=B6?= =?UTF-8?q?,=E4=B8=8D=E6=98=AF=E4=B8=A4=E4=B8=AA=20=E2=80=94=E2=80=94=20?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E4=B8=8E=E7=B4=A2=E5=BC=95=E8=A1=8C=E9=83=BD?= =?UTF-8?q?=E6=B2=A1=E8=B7=9F=E4=B8=8A=E6=B8=85=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2026-09-24 由 #1424 勘破发现并回报。事实: - ADR-035 §决策 的标题写「以下两个文件」,而紧随其后的清单自 2026-07-26 (#223 R3 Blocker 1)起就是三个,第三个是 packages/core/src/tool/websearch.ts; - 同一份 ADR 的 §背景 第 59 行「接管面不变(仍是三个源文件)」是对的,是标题没跟上; - .claude/rules/DECISIONS.md 的索引行同样写「两个源文件」。 两处一起订正。纯数字更正,零代码改动,不改接管面本身。 出处链条:#1424 在做 webfetch 普查闸时读到该 ADR,回报但按票面边界没顺手改; #1432 合并时也没带走它(它只改第 18 行与表尾)。由编排者补。 Refs #1424 Co-Authored-By: Claude Opus 5 --- .claude/rules/DECISIONS.md | 2 +- .claude/rules/adrs/ADR-035-websearch-tool-takeover.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.claude/rules/DECISIONS.md b/.claude/rules/DECISIONS.md index c3305077e177..b9d786df1bad 100644 --- a/.claude/rules/DECISIONS.md +++ b/.claude/rules/DECISIONS.md @@ -37,7 +37,7 @@ | [ADR-031](adrs/ADR-031-hybrid-user-memory.md) | 混合用户记忆——本地优先、选择性云发布与有界上下文 | proposed | 2026-07-19 | | [ADR-033](adrs/ADR-033-permission-kernel-takeover.md) | Permission 内核接管:REQ-090 #433 的 permission 引擎/契约面走 L3 冻结接管(ADR-029 §3;文件级守卫 `:(exclude)` 例外 + 生成文件整类移出;4 个 B 类连带退回 seam;放弃上游 permission 白嫖=单向门;逐文件审计 `docs/audits/2026-07-21-north-star-guard-upstream-delta.md`;#456 owner 拍板) | accepted | 2026-07-21 | | [ADR-034](adrs/ADR-034-frontend-rolling-pin.md) | 前端滚动 pin(B 方案):packages/{app,ui} 从「冻结钉 tag」迁到「pin + 补丁序列」持续白嫖上游前端(**supersede ADR-020**,反转 ADR-016 前提);`frontend-pin.lock` + `alpha-frontend.patch` SOT;日常 sync `apply_alpha_frontend_delta`(pin+补丁,不擦 seam/不丢上游);月更 bump 升 pin(人门禁,见 `frontend/README.md`);owner 2026-07-21 拍板 | accepted | 2026-07-21 | -| [ADR-035](adrs/ADR-035-websearch-tool-takeover.md) | web search 工具失败面接管:`packages/opencode/src/tool/{websearch,mcp-websearch}.ts` 两个**源文件**走 ADR-029 L3 文件级 `:(exclude)`,解锁 #489 失败诚实(禁伪成功 / 任何非 2xx LOUD / 结构化零命中与 provider error 分辨 / 传输有界);上游测试文件**不接管**(新增断言落 alpha 自有 `test/tool/alpha-websearch-failure.test.ts`,避免整文件 exclude 连带放行 `registry.ts` 的 `webSearchEnabled` 断言);云路径 `catalog.ts` / `code-mode.ts` 已 loud,**刻意不收编**,且云侧无状态透传(归 alpha-platform#105);顺带把 `scripts/alpha-check.sh` 的守卫与 `alpha-ci.yml` 恢复 1:1(此前无 exclude 表、自 ADR-033 起恒假红);放弃这两文件上游白嫖=单向门,owner 2026-07-25 拍板 | accepted | 2026-07-25 | +| [ADR-035](adrs/ADR-035-websearch-tool-takeover.md) | web search 工具失败面接管:`packages/opencode/src/tool/{websearch,mcp-websearch}.ts` 与 `packages/core/src/tool/websearch.ts` 共**三个**源文件走 ADR-029 L3 文件级 `:(exclude)`,解锁 #489 失败诚实(禁伪成功 / 任何非 2xx LOUD / 结构化零命中与 provider error 分辨 / 传输有界);上游测试文件**不接管**(新增断言落 alpha 自有 `test/tool/alpha-websearch-failure.test.ts`,避免整文件 exclude 连带放行 `registry.ts` 的 `webSearchEnabled` 断言);云路径 `catalog.ts` / `code-mode.ts` 已 loud,**刻意不收编**,且云侧无状态透传(归 alpha-platform#105);顺带把 `scripts/alpha-check.sh` 的守卫与 `alpha-ci.yml` 恢复 1:1(此前无 exclude 表、自 ADR-033 起恒假红);放弃这两文件上游白嫖=单向门,owner 2026-07-25 拍板 | accepted | 2026-07-25 | | [ADR-036](adrs/ADR-036-single-engine-generation-for-session-send.md) | 会话发送保持**单一引擎代次**:会话页 composer 与时间线续钮从 v2 durable 队列(`c.v2.session.prompt`)改回 v1 `session.promptAsync`,与首页 `startChat` 同一条;档位随每条消息走 `PromptInput.agent`,v2 的 switchAgent + 权威读 + CAS 回滚账本一并退役。理由是事实而非偏好:`packages/core`(v2)**没有 MCP 运行时**、**没有 alpha ext 插件的钩子挂载点**(`tool.execute.before/after`、`experimental.chat.system.transform`),而云搜索/kill switch/prompt 接管/工厂拒绝/skill 注入整个主权层都建在 v1 钩子上;#652 实测 v2 受理 8 次 failed 8 次零成功且 UI 零投影。REQ-125 的 UI 成果(直挂 composer/审批停靠/任务卡/上下文 ring/斜杠登记)全部保留;v2 读侧(模型目录、switchModel、PermissionV2 feed)不受限。重新迁移的准入判据三条见 ADR §决策 3。owner 2026-07-28 拍板 | accepted | 2026-07-28 | | [ADR-037](adrs/ADR-037-engine-generation-switch-is-its-own-change.md) | **引擎代次切换是一次独立变更**(类级规矩,不裁决具体链路):把任一产品链路从一代引擎 API 改到另一代 —— **含部分链路、含「只改一个入口」、含反向退回** —— 必须独立成票、独立成 PR、独立决策(ADR)、独立验证,不得作为功能提交的附带项;切换前必须交一份**能力清点表**,逐项用 `file:line` 或可复现命令证明「新代次有没有这条链路依赖的能力」(强制六轴:凭证面/工具运行时/插件钩子挂载点/事件投影面/持久化面/审批面),**缺项的唯一合法处置是不切**;合并闸的判据只认**端到端可观测行为**(跑生产代码 + 走用户入口 + 断言渲染/落库/真实请求 + 自己先反向绕过一遍确认转红),typecheck 绿、整包全绿、对抗审计过、源码文本断言、schema 有字段、HTTP 200 一律不算;同一流程的全部入口必须同代次,**半代次迁移禁止**。每条决策附「如何检验某个 PR」。立规代价来自 #652:PR#569 把切换夹带进 UI 重构,产出「每个会话只能发第一条消息」并活了四天,期间 2526 条测试全绿且过了对抗审计 —— 逐条解剖见 [`docs/audits/2026-07-28-652-engine-generation-split-incident.md`](../../docs/audits/2026-07-28-652-engine-generation-split-incident.md) | accepted | 2026-07-28 | | [ADR-038](adrs/ADR-038-v1-permission-ask-deadline.md) | **v1 审批请求的应答期限**:`packages/opencode/src/permission/index.ts` 按 ADR-029 §3 进入 ADR-033 的 L3 接管集(单文件),给 `Permission.ask` 的 `Deferred.await` 加期限 —— 到点**只能失败**(`Effect.timeoutOrElse` 的 orElse 无成功分支,「到点自动放行」在类型层写不出来)、失败具名(`UnansweredError`,继承 `RejectedError` 以复用 processor 的 blocked 分支)、文案含「没有放行/是哪个请求/下一步做什么」、并广播 `permission.replied{reject}` 让呈现面收卡;默认 300s,`ALPHA_PERMISSION_ASK_TIMEOUT_MS` 可覆盖,非法值回落默认而非"无期限"。L0 接缝(plugin `permission.ask` 只能改判定)、壳侧看门狗(只在打包壳存在 + v1 reject 会连带拒绝同会话全部 pending)、L1/L2(引擎不经 vite 管道;`patch-server-version.ts` 式产物字符串替换无法 loud-fail 承载安全语义)逐条不可行证据见 ADR §2。放弃该文件上游白嫖 = 单向门。owner 2026-07-28 裁决 [#668](https://github.com/jinjunnn/alpha-code/issues/668) 半场 E | accepted | 2026-07-28 | diff --git a/.claude/rules/adrs/ADR-035-websearch-tool-takeover.md b/.claude/rules/adrs/ADR-035-websearch-tool-takeover.md index c2ea6df5fa4b..ffb9bfea2f74 100644 --- a/.claude/rules/adrs/ADR-035-websearch-tool-takeover.md +++ b/.claude/rules/adrs/ADR-035-websearch-tool-takeover.md @@ -105,7 +105,11 @@ issue: https://github.com/jinjunnn/alpha-code/issues/489 ## 决策 -**按 [[ADR-029]] L3 冻结接管以下两个文件**(逐要件登记): +**按 [[ADR-029]] L3 冻结接管以下**三个**源文件**(逐要件登记): + +> **事实更正(2026-09-24,`#1424` 勘破)**:本行初版写「两个文件」,而紧随其后的清单自 +> 2026-07-26(#223 R3 Blocker 1)起就是**三个** —— 第三个是 `packages/core/src/tool/websearch.ts`。 +> 本 ADR §背景 第 59 行「接管面不变(仍是三个源文件)」是对的,是这一行没跟上。 ### 1. 被接管表面(退出上游同步集,alpha 全所有权 → L3)