Skip to content

docs(#1448): 收窄逃生开关的作用面 —— 它只管我们自己提供的两条搜网腿 - #1451

Merged
jinjunnn merged 1 commit into
alphafrom
feat/1448-killswitch-scope
Sep 24, 2026
Merged

jinjunnn merged 1 commit into
alphafrom
feat/1448-killswitch-scope

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

我们有一个「关掉搜网」的开关。打开之后,模型确实搜不了我们提供的搜网工具 —— 但它换了个工具,
自己去打 duckduckgo 和 bing 的搜索页,照样搜到了。

owner 2026-09-24 裁决:他从来没有提过「关掉搜网」这个需求,他的需求一直是本地云端搜网都要可用;
如果有闸门,也只关注我们自己提供的搜网功能。
所以这不是闸门坏了,是我们把它的作用面写宽了 ——
这张 PR 只做一件事:把那句话改成实话。零行为改动。


改了什么

落点 改动
docs/design/2026-09-23-1414-web-tools-account-routing-baseline.md §三 S3 不变量由「本地与云两侧都不得有活的 web search 执行路径」收窄为「我们自己提供的两条搜网腿(本地 websearch + 云 cloud_cloud_web_search)都不得有活的执行路径」;新增〈S3 的作用面〉一节记来历、三条理由与 #1433 两臂实测
同文件 §二 四种账户态表 kill-switch 行的「搜网怎么走」由「都没有」改为「我们的两条腿都没有」,并指向〈S3 的作用面〉
.claude/rules/adrs/ADR-046-…md D3 同一句写宽了,一并就地修订(amended: 2026-09-24);后果表 kill-switch 行同改
.claude/rules/DECISIONS.md ADR-046 索引行登记 D3 作用面的收窄

diff 里没有一行生产代码(git diff --name-only origin/alpha HEAD 三个文件全是 .md),
判据一条未动。

为什么是收窄,不是加一道闸

  1. 它是应急闸,不是产品能力。 ALPHA_WEBSEARCH_DISABLE 出自 ADR-009 决策 A 第 4 条,
    原文就叫「逃生开关」(ADR-009-websearch-default.md:54),默认关闭,从未被当成功能交付。
  2. 「什么算搜索引擎」判别不了。 按工具名识别第三方 web search 的天花板本仓已经登记过
    (packages/ext/src/cloud-websearch-kill.ts:208-218 的 #223 R6 注释:非 ASCII 名经
    McpCatalog.sanitize 抹平后任何分类器都看不见);按目的地识别只会更糟 —— 那是一份
    永远补不完的域名清单,正是「手写别人文法的替身」那类错。
  3. 用户自带的第三方搜网工具归用户自己管(ADR-046 D6,#1443 已合)。

判决口径本身就写着这件事:webSearchToolDenial
(packages/ext/src/cloud-websearch-kill.ts:274-288)第一句是
if (!isWebSearchToolId(tool)) return undefined —— 入参只有工具名、env、server 归属,
没有任何目的地轴。一道以工具身份为判据的闸,结构上管不到「模型改用别的工具去打搜索引擎」。

#1433 的实测(已如实记进基线)

驱动句 kill-switch 态工具表 模型发了什么 结果
中性 7 个工具,websearch 不在其中(开关生效),webfetch 在 5 次 webfetch,头两次打 duckduckgo.com/html/?q=… 与 www.bing.com/search?q=… 两次都 completed,各拿回 12,323 B / 12,295 B 结果页,随后抓了三篇文章并正常作答
显式(「没有 web search 工具就明说」) 同上 0 个 tool_calls 明确回答没有该工具

生产出网策略代理对那两个目的地是 deny / unregistered / 403(对照臂:mcp.exa.ai:443、
search.parallel.ai:443 allow/200,刻意未登记的 example.com:443 403);而 #1412(PR #1426,
已合)让未登记目的地可由用户当场批准(network-egress-proxy.ts:214-236)。
⇒ 逃生开关拦得住我们自己的两条腿,拦不住模型自己想出来的路 —— 而后者按裁决本就不在它的辖区内。

两臂都入库,因为结论正是「行为由驱动句决定」,只留一臂就是在骗自己。

主动没做的

  • 不碰 webfetch 的批准面(#1412 / PR #1426,owner 已接受其残留);
  • 不实现任何「搜索引擎域名识别」;
  • 不改任何运行时行为。

文档影响

按 maintain-repository-docs:设计基线 + ADR + 决策索引,三处都落在既有的唯一规范路径上,
无新增/移动/删除文件。

本地门

门 结果
north-star ✓ exit 0,零上游包改动
typecheck(6 个包) ✓ exit 0,error TS 0 条
docs 闸(相对链接) ✓ 42 条链接 / 3 个 Markdown 全解析,exit 0;先用一条故意坏链证明它会红(exit 1,点名 missing)
bun test contracts-consumer / ext ✓ 60 条 / 257 条,均 exit 0
seed assets ✓
bun test src(ui-mac 全量) 5388 pass / 1 fail —— 该红属 base fail-set,与本 PR 无关,见下

那条红不是本 PR 引入的:src/main/mcp-server-derivation.test.ts:207 期望
X-Token: "t"、实得 "***"。根因是上游 82d4c8903 fix(opencode): redact credentials in debug config (#50956) —— 它随 57646831b 这次 sync 首次进入本仓
(git merge-base --is-ancestor 82d4c8903 57646831b^1 为假),而该测试靠真引擎的
debug config 读回配置。独立对照臂:同一红在另一棵 worktree(1445-exa-fake-success,
同 commit,本 PR 不存在时起跑)逐字复现。本 PR 的 git diff --name-only origin/alpha HEAD
非 .md 文件数 = 0。该红归 #1381 的判据,不在本票范围内,未登记进
scripts/known-fails.tsv
(登记会让那道闸此后对真缺陷恒绿,是主 session 的裁决)。

Fixes #1448
Refs #1414

🤖 Generated with Claude Code

方案基线 §三 S3 写的是「ALPHA_WEBSEARCH_DISABLE=1 之后,本地与云两侧都不得有活的
web search 执行路径」。那句话比这个开关的用途宽,#1433 的实测打到的正是这句话,
不是闸门坏了。

owner 裁决 2026-09-24:如果有闸门,也只关注我们自己提供的搜网功能。据此:

- 基线 §三 S3 收窄成「我们自己提供的两条搜网腿(本地 websearch + 云
  cloud_cloud_web_search)都不得有活的执行路径」,并新增〈S3 的作用面〉一节,
  写清来历(ADR-009 决策 A 第 4 条,原文就叫「逃生开关」,运维应急闸非产品能力)、
  三条理由,以及 #1433 两臂实测的原始数字;
- ADR-046 D3 同句写宽,一并就地修订(amended: 2026-09-24),并在 DECISIONS.md
  的索引行登记;
- 判决口径本身只看工具身份:webSearchToolDenial 首句是
  if (!isWebSearchToolId(tool)) return undefined,入参里没有任何目的地轴 ——
  一道以工具身份为判据的闸,结构上管不到「模型改用别的工具去打搜索引擎」。

零行为改动:diff 里一行生产代码都没有,判据一条未动。
明确不做:不收窄 webfetch 的批准面(#1412 已合,owner 已接受其残留);
不实现任何「搜索引擎域名识别」(补不完的域名清单 = 手写别人文法的替身)。

Fixes #1448
Refs #1414

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jinjunnn
jinjunnn merged commit 93c7d79 into alpha Sep 24, 2026
1 check 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