Stop 钩子看到 stop_hook_active 就要放行

反复返回 block 没有上限。相同反馈会把 CLI 卡进无限续写,只能杀进程。第二次必须允许完成。

Stop(以及 SubagentStop)的 stdin JSON 带 stop_hook_active。第一次 block 之后,Codex 会把反馈送回模型再跑一轮,然后再次调 Stop。运行时目前没有次数上限,也不会去重。钩子自己忽略这个旗标,或因为外部依赖坏了每次都返回同一段 block,会话就会空转烧额度。

最小可执行形状:

#!/usr/bin/env python3
import json, sys

payload = json.load(sys.stdin)
if payload.get("stop_hook_active"):
    print(json.dumps({"systemMessage": "Stop already continued; allowing complete."}))
    sys.exit(0)
# 第一次:校验失败才 block。依赖缺失时不要伪装成 policy block。
print(json.dumps({"systemMessage": "ok"}))

外部扫描器、网关、配置根路径找不到时,返回失败或放行,不要反复 decision: "block"。官方约定是:钩子看见「已经拦过一次」就允许完成。

逃出路目前只有杀 CLI 进程或重开会话。--dangerously-bypass-hook-trust 解决不了已经信任、但每次都 block 的钩子。改完钩子后新开会话,不要指望卡死的那一轮自己醒过来。

Esc / kill 打断正在跑的顶层轮时,Stop 不会跑。临时文件、扫描器状态不要只挂在 Stop 上,另外写 Interrupt

来源