﻿---
title: "Stop 钩子看到 stop_hook_active 就要放行"
summary: "反复返回 block 没有上限。相同反馈会把 CLI 卡进无限续写，只能杀进程。第二次必须允许完成。"
category: hooks
level: advanced
surfaces: [cli]
tags: ["hooks", "Stop", "stop_hook_active"]
canonical: /tips/stop-hook-active/
---

# Stop 钩子看到 stop_hook_active 就要放行

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

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

最小可执行形状：

```python
#!/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`。

## 来源

- [OpenAI · Hooks](https://learn.chatgpt.com/docs/hooks)
- [openai/codex#37937](https://github.com/openai/codex/issues/37937)
