2e6c0e7ac2
plan 根 Supervisor 此前拿到的是未按身份收窄的全量注册表:43 个原生工具外加 项目 MCP 目录。其中约 36 个在这条链路上根本执行不了——写入、补丁、删除、 命令、预览、画布、任务图、记忆、黑板、agent.spawn_isolated、 agent.route_manifest、agent.schedule_ready 都会被执行层拒绝。 广告一个执行不了的工具不是中性的。M1A-4 已经实测到同类后果:上下文里残留的 专业角色目录让 Supervisor 照着发起 agent.delegate,被拒后再没能自行改回 project-planning,整个 run 空转到预算耗尽。工具面同理——本链路的策划内容全部 由 project-planning 子 Agent 生产,Supervisor 手里多一个写文件或跑命令的入口, 就多一条它自己下场干活的诱导路径。 allowlist 定为 user.input_request、file.read、agent.delegate、 agent.goal_contract、agent.acceptance_update、agent.action_history、 agent.run_status,加上两个协议控制函数。后三个原生工具只为 §13.0 的审批前置 取证门存在(分页读 game/fast_gdd.md 并列出全部分页 actionId);file.list 一并 砍掉,取证路径是固定的,不需要列目录。 实现沿用 restrict_plan_root_goal_contract_schema 已有的后置收窄形状,而不是给 build_agent_runtime_native_function_tools_for_agent 加参数:两处调用点本来就在 `if plan_root` 里,改动面更小,也不会波及其它 lane 的目录构建。 收窄写成交集而非断言。协议修复路径会先整份重建目录再按场景收窄,其中 restrict_agent_runtime_supervisor_collaboration_repair_tools 硬要求目录里存在 agent.spawn_isolated;plan 根这一遍必须排在所有分支收窄之后取交集,早于分支 会让那条检查失败,晚于分支才能保证任何修复轮都不把被裁掉的 36 个工具重新广告 回去。 回归断言写成精确集合而不是「不包含某几个」,将来往注册表加工具不会静默漏进 plan 根;同时断言 MCP 前缀工具不残留、收窄确实裁掉了东西(否则测试是空跑)。 已变异验证。 本次只改广告目录。提示词头部仍按全量注册表拼工具清单,二者的一致性由紧随其后 的 prompt 提交收口——单独看这一笔存在「合同说有、请求里没有」的过渡态。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>