Repository navigation
[REQ-131][CODE] #1128 分层工具策略:三态 resolver、结构化 selector、cap/approval 合成与会话隔离(B9/B13) - #1131
Merged
Merged
Conversation
#724 CLOSE_DECIDE §2-§5 第 1 张 CODE 票: - schema/alpha-tool-policy:三态/四类/结构化 selector + 共享 matcher(禁手拼 wildcard) - permission/alpha-managed-policy:managed cap 读取器 —— 系统目录不可被 OPENCODE_TEST_MANAGED_CONFIG_DIR 替换,env 只 additive 且优先级更低(本票必修) - permission/alpha-tool-policy-store:versioned 持久化 + (account, workspace) 分区 + 整份 quarantine + 原子写 + reset 恢复口 - permission/alpha-tool-policy:cap → user selector(tool>service>class)→ 默认 合成; binding guard(evidenceDigest / 去秘密 MCP definition);AlphaToolPolicy service - permission/index:approved: Rule[] → granted: SessionGrant[] —— always 仅在 sessionID 内保存、只能 discharge ask、结构性压不过 deny(#1122 B9/B13); 新增 clearGrants(切账户/登出清账口) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QHDS2BFKuzm9uNH1svU2oj
…s.tsv Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QHDS2BFKuzm9uNH1svU2oj
This was referenced Aug 26, 2026
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 #1128
Refs #723, #1122
方案基线:
#724CLOSE_DECIDE(2026-08-17)§2/§3/§4/§5/§9 第 1 条。只做基线四行,不接线咽喉(#1129)、不建 Settings(#1130)。改了什么
新增(全部 alpha 自有,ADR-043 谓词)
packages/schema/src/alpha-tool-policy.ts—— 三态/四类、结构化 selector(class/service/tool)+ 共享 matcher/compiler(§3:匹配是结构相等,零字符串通配;name="*"的 canonical 是%2A只匹配那个字面工具,手拼mcp:<srv>:*在 schema decode 时 loud fail)、versioned 文档ToolPolicyDocumentV1(records 带 selector 唯一性 + service/tool enabled 必须携带 bindingDigest)。packages/opencode/src/permission/alpha-managed-policy.ts—— managed cap 读取器(本票必修):系统 managed 目录无条件读取,OPENCODE_TEST_MANAGED_CONFIG_DIR只 additive 且优先级更低;测试对系统目录的控制仅经函数参数注入;系统目录/MDM plist 存在但读不出 ⇒ 整层unreadable⇒ resolver disabled。上游managed.ts未收编、本 PR 不碰它(见"没做"节)。packages/opencode/src/permission/alpha-tool-policy-store.ts——(account, workspace)分区持久化:文件名 = 分区 canonical JSON 的 sha256(不含明文),文档体内带分区、加载时核对(拷别人的文件 = quarantine);损坏/未知版本/部分非法/selector 重复 = 整份 quarantine;reset挪备份回默认;tmp+rename 原子写。packages/opencode/src/permission/alpha-tool-policy.ts—— §4 终局合成(cap → user selector(tool>service>class)→ 四类默认),binding guard(alpha-cloud 复用authority.evidenceDigest;第三方 MCPmcpBindingDigest去秘密:headers/environment/oauth/enabled/timeout 不参与,url/command+cwd 变了才算 rebind;enabled 的 digest 不等或缺失 ⇒ 回 ask,disabled 不因 rebind 失效);AlphaToolPolicy.Service(resolve 每次重读 cap+文档,§6)供 [REQ-131][CODE] 在目录与工具执行咽喉执行同一策略 #1129/[REQ-131][CODE] 设置页新增「工具」节:按来源、服务、单个工具设置停用/询问/允许 #1130 消费。test/permission/alpha-session-grants.test.ts(6 条)、test/permission/alpha-tool-policy.test.ts(25 条),均已登记scripts/gate-files.tsv精确条数。docs/contracts/tool-policy.md(+docs/README.md索引行)。修改(ADR-038 已收编面)
packages/opencode/src/permission/index.ts——approved: Rule[]→granted: SessionGrant[]:always仅在sessionID + permission + resource pattern内保存(§4.4);clearGrants({sessionID?})(§5 切账户/登出清账口,[REQ-131][CODE] 在目录与工具执行咽喉执行同一策略 #1129/[REQ-131][CODE] 设置页新增「工具」节:按来源、服务、单个工具设置停用/询问/允许 #1130 接线)。B9 / B13 生产路径前后对照(
test/tool/alpha-725-policy-chokepoints.cases.ts,真 MCP servertools/call计数)alpha@831f3c44f剩余 6 红是 #1129(E1/E2 执行咽喉 identity 轴)的范围,本 PR 刻意不动。
变异实验(每次单独施加、跑完即还原、
git status干净)门(本地实跑,CI 口径)
与 base fail-set 的差:上列门 base=空,本 PR 全绿,差 = 0。门外的
packages/opencode面(不属任何 alpha 门):typecheck 15 条既有红逐字不变;test/session/llm.test.ts4 红经"工作树还原 base 引擎重跑"证明为既有红(identity 缺失类,与本改动无关);其余 Permission 消费套件(arity/deadline/httpapi-session/read/system/prompt/lsp)全绿。已知分歧(如实登记,非门内)
上游
test/permission/next.test.ts从 79/0 → 78/1:唯一翻红的 “reply - always persists approval and resolves” 断言的正是 B13 的缺陷行为(跨会话 always 直通),与已批基线 §4.4/§4.5 相悖。该文件是上游资产(在origin/dev、未收编),不在任何 alpha 门内("全量 opencode 测试不属 alpha",alpha-ci.yml)。建议(供 owner 裁,非本票 AC):要么按 ADR-029 §3 走一轮收编把该用例改成会话隔离语义,要么保持记录为已知分歧;已写进docs/contracts/tool-policy.md。主动没做的事
packages/opencode/src/config/managed.ts。 它在origin/dev里、不在 north-star 收编表 —— 改它 = north-star 红,收编需要 owner 级 ADR("新增收编须自己的 ADR,不得静默加 exclude")。必修条款的实际安全要求("env 存在时系统 managed deny 仍生效")由新的 alpha 自有读取器在 cap 层满足并有负向闸;上游 Config 装载管线(config.ts:521)里 env 仍会替换 managed 目录 —— 那条路径喂的是通用 config/ability 规则,不再是工具策略 cap 的来源。若 owner 要求把上游那两行也改掉,需要先收编,建议随 [REQ-131][CODE] 在目录与工具执行咽喉执行同一策略 #1129 一并裁。anonymous(layer 注入口已留):引擎侧今天没有 alpha 账户权威;真实 subject 与clearGrants的登出接线归 [REQ-131][CODE] 在目录与工具执行咽喉执行同一策略 #1129/[REQ-131][CODE] 设置页新增「工具」节:按来源、服务、单个工具设置停用/询问/允许 #1130。deriveBindingDigest:安装 receipt/manifest/loader generation 的取值住在 plugin loader([REQ-131][CODE] 在目录与工具执行咽喉执行同一策略 #1129 的接线面),guard 本身(比对 + 失效回 ask)已完整交付并有判据。--no-verify:pre-push 钩子跑在共享树上;全部门已在上方显式实跑。文档影响
docs/contracts/tool-policy.md(新契约,SOT 指针齐全)+docs/README.md一行索引。链接门:✓ 26 relative link(s) resolve across 2 file(s)。🤖 Generated with Claude Code
https://claude.ai/code/session_01QHDS2BFKuzm9uNH1svU2oj