ParseVerdict 要求裸 JSON,而模型把 JSON 套进 markdown 围栏是常见偏差。 围栏导致解析失败后,reviewer 返回错误、Judge 走 FailAction,其默认值是 allow —— 模型判定的 DENY 会被静默降级为放行,审批记录只显示“模型输出 无法解析”,看不到模型其实给了拒绝。 解析入口前置一次围栏解包。这是确定性解包而非修复:载荷仍交由原 ParseVerdict 严格校验,重复字段、多余字段、多个对象、尾部残留的判定 全部不变。 要求开围栏与闭围栏同时存在。回复在 MaxTokens 处被截断时的形态正是 “有开围栏、无闭围栏”,对其补全会造出模型从未给出的裁决,因此这种输入 继续视为无法解析。 测试:原先断言“围栏必须拒绝”的用例改为接受,另补未闭合围栏、围栏后 带尾随文本、散文夹 JSON 三条必拒用例。
审查模型改为接收版本化 JSON:任务描述/目标/操作约束、工作目录、Worker 意图、当前轮输入,以及按 tool_use_id 配对的近期工具执行记录;末尾是完整的 tool_name 与 arguments。 - 任务约束每次审查从数据库重新读取;读取失败或约束超预算转人工。 - 历史只保留唯一配对的执行事实,排除 Agent 自述、未完成请求与平台拒绝反馈。 - 裁决改为 JSON decision(allow/ask/deny) + comment,三种结果均须说明实际操作、成功后果与命中规则。 - 所有模型裁决(含自动放行)保存实际模型输入与 SHA-256 指纹,详情页可展开。 - 对话审批卡片支持展开完整请求、模型输入、裁决与执行结果。 - 修复父目录 lockfile 导致的 Turbopack 根目录误判。 官方默认拦截规则、工具范围与优先级不变。
模型若照抄提示词里的中文标签(如「拦截:DENY:...」),旧解析要求关键词在行首, 会判为无法解析 → 按 fail_action(默认 allow)兜底,导致真实拦截被放行。 - ParseVerdict 改为扫描行内最早出现的 ALLOW/ASK/DENY 关键词,容忍前缀标签 - 提示词输出段改用箭头并明确禁止输出中文标签,附合法输出示例 - 新增 prompt_test.go 覆盖标签回显、全角冒号、大小写、超长理由截断等场景 Claude-Session: https://claude.ai/code/session_019QXSCDmzimwnjntBNCgUD7