Skip to content

docs(verification): #725 REQ-131 双咽喉取证 —— 目录闸真绿,执行闸只对 MCP 成立 - #1123

Merged
jinjunnn merged 1 commit into
alphafrom
ac-725
Aug 25, 2026
Merged

docs(verification): #725 REQ-131 双咽喉取证 —— 目录闸真绿,执行闸只对 MCP 成立#1123
jinjunnn merged 1 commit into
alphafrom
ac-725

Conversation

@jinjunnn

Copy link
Copy Markdown
Owner

这是什么

alpha-code#725([REQ-131][VERIFY])的取证交付:零生产代码改动,只有一份探针
(packages/opencode/test/tool/alpha-725-policy-chokepoints.cases.ts,23 条判据)
与证据目录 docs/verification/2026-08-25-req131-725-tool-policy-chokepoints/

结论

票面标题的那句话今天只有一半成立。

判定内容
模型目录闸(咽喉 A)真绿 —— builtin / plugin / host / MCP 四个来源,identity deny 都真把工具从交给 provider 的那张表里拿掉,且只拿掉它自己;ask 不改目录
执行闸(咽喉 B)只对 MCP 成立。builtin / plugin / 宿主 MCP-resource 工具在执行咽喉上完全不接 identity 轴 —— deny 照跑、ask 不问
两道闸的独立性不成立 —— E1/E2 只有目录那一道
always 的作用域与上限FAIL 两条 —— 会话 A 的「总是允许」在会话 B 直接生效;先 always 后收紧成 deny,旧批条仍然赢

基线 15 PASS / 8 FAIL,3 轮失败集逐字相同。

摘线验证(两处咽喉各一次)

实验摘掉什么新增翻红未受影响
M-Apermission/index.ts:300-304 的 identity hard-denyA1 A2 A3 A4A5/A6 与全部 B
M-Bsession/tools.ts:437-442ctx.ask(canonicalToolIdentity(...))B1 B5 B7 B8全部 A

两次实验前 git status 干净,实验后用 shasum -a 256 -c 逐字还原并复核 git diff 为空;
还原后基线复跑回到 15/8,姊妹闸门 alpha-{mcp,session-tools}-alias-*.test.ts 9 pass / 0 fail。

FAIL 各自开了窄票(不在本 PR 修)

覆盖边界(没有证明什么)

票面 Covers 写「AC1–AC8」,本轮实际只覆盖 AC3 全部 + AC2/AC4/AC5/AC8 各一轴
AC1 / AC6 / AC7 未覆盖,E4 / E6 / E7 与 managed-env 只做了源码级确认、没有在运行期量到
逐条原因写在证据 README §1,票面未被修改、未加格、未加 AC

根因:#724 终局决策里列出的三张 CODE 子票(策略 resolver / 双闸接线 / Settings)
至今没有被建出来 —— 2026-08-25 全库检索 REQ-131 只有 #723/#724/#725/#726/#731
是否补建属于排期决策,本 PR 不代做。

本地门(base alpha@c3d0d0569)

命令结果
north-starbash scripts/north-star-guard.sh✓ zero upstream package edits(新增文件对守卫是 A)
typecheckbun run --cwd packages/{alpha-contracts-consumer,ext,ui-mac} typecheck✓ exit 0 ×3
docs gatepython3 scripts/check-doc-links.py <2 个改动 md>✓ 28 relative link(s) resolve across 2 file(s)(枚举数 2 = 处理数 2)
gate-filesbash scripts/assert-gate-files.sh✓ exit 0
探针本体bun test --timeout 60000 ./test/tool/alpha-725-policy-chokepoints.cases.tsRan 23 tests across 1 file. / 15 pass / 8 fail(预期部分红)
姊妹闸门bun test ./test/tool/alpha-{session-tools-alias-lock,mcp-alias-collision-lock}.test.tsRan 9 tests across 2 files. / 9 pass

单测面无影响:探针是 .cases.ts,不在 bun 的测试文件命名约定内(bun 自己报
Tests need ".test", "_test_", ".spec" or "_spec_" in the filename),因此不进 bun test
也不登记 scripts/gate-files.tsv;packages/opencode 不在任何 alpha typecheck 面内。

push 用了 --no-verify:pre-push 钩子跑在共享主 checkout 上,本轮有多条 lane 并行,
不去动它。上述门已在本 worktree 内逐条本地跑过;push 后复核 core.hooksPath 仍是 .githooks

文档影响

docs/verification/(新增证据目录)+ docs/README.md(索引一行)。
maintain-repository-docs 契约检查:alpha-code PASS

Refs #723
Fixes#725

🤖 Generated with Claude Code

https://claude.ai/code/session_01QHDS2BFKuzm9uNH1svU2oj

23 条判据全部驱动生产入口(`LLMRequestPrep.prepare()` 的 tools 与
`SessionTools.resolve()` 返回对象的 `.execute()`),真 MCP server / 真
`.opencode/tool` 自定义工具 / 真内置 `write` / 真宿主资源工具,副作用用
服务器侧与文件系统侧的真实计数。基线 15 PASS / 8 FAIL,3 轮失败集逐字相同。
两处咽喉各有一条会翻红的判据,并各自做过摘线验证:
- 摘掉 `permission/index.ts` 的 identity hard-deny ⇒ A1–A4 翻红,B 不动;
- 摘掉 `session/tools.ts` 的 `ctx.ask(canonicalToolIdentity)` ⇒ B1/B5/B7/B8
翻红,A 不动。
两次实验前后 `shasum -a 256 -c` 逐字还原,`git diff` 为空。
FAIL 各自开窄票:#1121(E1/E2 执行咽喉不接 identity 三态)、
#1122(`approved` 无会话作用域也无上限概念)。
零改动生产代码。探针是 `.cases.ts`,不进 `bun test`、不登记 gate-files.tsv。
Refs #723Fixes#725
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QHDS2BFKuzm9uNH1svU2oj
@jinjunnn
jinjunnn merged commit 9b169a5 into alphaAug 25, 2026
5 of 6 checks passed
Sign up for freeto 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.

[REQ-131][VERIFY] 验证工具策略同时约束模型目录与执行咽喉

1 participant

@jinjunnn