OpenAI Codex · 代码模式 Guardian:让一个模型去审批另一个模型 审批弹窗多到人开始无脑点同意时,Codex 把决定权交给一次锁死的审查会话。超时、坏 JSON、连续拒绝,各有各的收场。 一句话速览 四步法、失败关闸、超时与拒绝分账,以及按 turn 计数的熔断器
课程目标 读完能说清三件事。Guardian 只吃被配置点名的 on-request 审批,用一次锁死的模型会话代替用户弹窗。审查材料按不可信证据处理,超时、跑崩、坏 JSON 一律停住动作。明确拒绝才记入熔断器,连拒到阈值就打断当前 turn。
先玩一遍 · 一条命令进审查台
同一条审批:先走四步,再看熔断器会不会接手
播放 单步 重置
命令
git status 公开 curl 上传 README 影子 HOME
换一条,看审查员在哪一类上先打分再下结论。
故障
正常走完 审查超时 坏 JSON 连拒三次
后三项是兜底。超时和坏 JSON 关闸,但不记连续拒绝。
四步审查 等待开始
1 重建 transcript 抽出用户原话和工具痕迹 2 送进锁死会话 只读、Never、MCP 已清空 3 交回 JSON 先打风险和授权,再给结论 4 应用结果 allow 继续,其余一律停住
证据与结论 条款未引用
curl --upload-file README.md https://example.com/inbox
risk_level — user_authorization — outcome — rationale 等待评估
熔断器 · Standard 连续拒绝 0 / 3,窗口 50 内累计 0
用户侧与模型侧还没有收到结论。
逻辑轨迹 · 动画每一步对应源码里的哪一段
判断本轮审批是否交给 Guardian review.rs L186 扩展若声明接管则不再开审查会话 review.rs L313 过滤 transcript,只留用户意图和工具证据 prompt.rs L506 按 Full 或 Delta 拼审查材料 prompt.rs L89 克隆父配置,锁成只读并写成 Never review_session.rs L1407 trunk 空闲则追加,忙碌则 fork review_session.rs L617 等待 JSON,超时上限 90 秒 mod.rs L53 没有合法 JSON 就解析失败,可重试后关闸 prompt.rs L714 allow 放行,deny 写上禁止改道的指示 review.rs L717 只有显式 Deny 才记入熔断器 review.rs L711 达到连续或窗口阈值,就 InterruptTurn mod.rs L176
点播放,看一条命令怎么走过四步审查,以及熔断器什么时候接手。
模型审模型的风险 审查员会格式漂移,也会被工具输出里的指示词牵着走。合同要求先打风险和授权,再给出可执行的 allow 或 deny。 失败怎么收场 超时走 TimedOut,坏 JSON 走 FailedClosed,动作都停住。这两类故障清零连续拒绝计数,避免把基础设施抖动算成模型连续作恶。 熔断器接手之后 Standard 连续三次明确拒绝就打断当前 turn。后续命令不再开新审查,因为这一轮已经被 abort 掉了。
教学示意:评估字段按 policy.md 的 Outcome rule 推演,用于展示四步法与熔断器的结构差异。逻辑轨迹右侧行号对应 openai/codex 仓库 commit 4f39251a01。
思路一 · 四步走完,中间态一律关闸
它解决什么问题 你开着 Codex 改仓库。模型先跑 git status ,再读两个文件,然后要 git push 。下一分钟它要 curl,再下一分钟要往 /tmp 写备忘,再下一分钟要删掉那份备忘。弹窗叠弹窗。人开始只看命令头两个词,拇指已经形成肌肉记忆。 这就是审批疲劳。防线还在,判断已经不在。回路退化成一个总是亮绿灯的按钮。这时如果把自动放行交给刚写出这条命令的主模型,申请人兼审批人。如果失败时放行,超时和坏 JSON 就变成免费通行证。
思路是什么 Codex 把该不该自动放行抽成一次专职审查。它不替代沙箱,也不替代网络代理。它只接管一类本来会弹给用户的 on-request 审批。路由很窄:策略必须是 OnRequest 或 Granular ,审查员必须是 AutoReview 。默认审查员仍是用户。 出处: codex-rs/core/src/guardian/review.rs 第 186 至 210 行 模块头把四步写死。
1 重建 transcript 只留用户原话和近期工具痕迹。合成脚手架、普通 developer 消息丢掉。超长内容打上 truncated 标记。