
Hook 是保证机制,而非 prompt
你的 agent 现在有了双手。它执行命令、编辑文件、调用 API、发送邮件、转移资金。那么请提出那个应该让你略感紧张的问题:是什么阻止它用错这双手?对大多数团队而言,答案是模型的良好判断力——一个概率系统,取决于你恰好如何措辞 prompt,它可能决定今天就在错误的文件夹里执行清理命令。Professor Glitch 2026 年 7 月发表在 askglitch.com 上的 Claude Code hooks 指南点出了修复之道:hook 是在 agent 循环固定点触发的确定性代码,而模型无法绕过它。你在意的属性由机制保证,而非靠请求模型小心。
Hook 就是代码形态的 Theorem 3
Hook 是在 agent 循环固定点自动运行的确定性代码——在工具执行前、完成后、agent 声明完成时、会话结束时。它不是模型推理的一部分。它坐在大脑之外,只是运行。Professor Glitch 2026 年 7 月在 askglitch.com 上的 hooks 指南把区别说得很清楚:模型是概率性的,每条指令都是它大概会遵循的建议;hook 是每次都在同一点、以相同规则运行的代码,模型无法忘记它、跳过它或绕过它。
[ORIGINAL DATA] 这正是 21 papers 中的 Theorem 3:一个属性恰好在其机制被实现且在测量时才被保证。Hook 就是那个机制。"测试在 agent 声明完成之前通过"是一个属性。一个运行测试套件并在失败时以代码 2 退出的 Stop hook,就是被实现且在测量的机制。移除 hook,你得到的是一个愿望。保留 hook,你得到的是一项保证——不是因为模型变聪明了,而是因为失败路径现在在物理上不可能。
Prompt 说"在完成前总是运行测试"。那是模型大概会遵守的建议。Hook 拒绝 stop,直到套件变绿。那是一条规则。建议与规则之差,就是期望与确知之差,而这一差别就是整门纪律。Professor Glitch 写道:把模型想象成人群,把 hook 想象成门口的保安;人群再迷人,保安也每次都检查每个人,无一例外。
模型是概率性的;边界是确定性的
机械地讲,根据官方 hooks 文档,Claude Code hook 是你注册在配置文件里的 shell 命令。当事件触发时,Claude Code 运行你的命令,把描述事件的 JSON payload 通过 stdin 传入——工具名、工具的精确输入、会话 id、工作目录——并从退出码和 stdout 读取你的裁定。退出 0 表示继续。退出 2 表示阻止,而你打印到 stderr 的内容作为理由回传给模型。你想用什么语言写都行:Bash、Python、编译好的二进制。只要它读 stdin 并返回退出码,它就是 hook。
[UNIQUE INSIGHT] 这是 agent 边界处的"the space is the router"。在 Everythink,network→community→room 拓扑在任何东西响应之前先路由请求——空间决定谁被寻址,而非响应者。PreToolUse hook 是低一层的同一模式:hook 在工具执行之前先路由工具调用。Agent 并不选择它对 .env 的读取是否继续;边界决定。路由先于检索,而在工具边界,hook 先于执行。
几乎人人都踩的坑,直接来自文档:只有退出码 2 会阻止。退出码 1——Unix 惯用的失败码——被当作非阻断错误,动作照样继续。如果你的守卫脚本以退出 1 崩溃,保安刚刚把整群人都放进去了。把你的 hook 写成失败路径显式的样子,当你想让决定毫无歧义时,优先用 JSON 输出形式(stdout 上 permissionDecision: "deny" 配退出 0)。一道静默地朝"开放"失败的护栏比没有护栏更糟,因为它卖出安全感而无机制。Theorem 3 在此毫不留情:一个被实现但不测量的机制不保证属性。一个朝开放崩溃的 hook 不在测量。
任务一:让某些失败不可能
Professor Glitch 列出他实际运行的三道护栏,按拯救他的程度升序排列。三者的模式相同:你不是在让模型更聪明或更小心。你是在让某些失败不可能。这是不同的工程问题,而第二个好解决得多。
阻止读取机密文件
PreToolUse hook 在每次工具调用执行前都看到完整输入。如果 agent 正要读 .env 或 secrets/ 下的任何东西,hook 以 2 退出,读取永不发生。冷冰冰。agent 的理由多合理都不重要,埋在某网页里的 prompt 注入是否客气地请求也不重要。保安不辩论。
阻止破坏性命令
同一事件,匹配到 Bash 工具。Hook 在运行前检查 tool_input.command 里的命令字符串——指向敏感处的 rm -rf、一次 force push、一个 DROP TABLE,凡你个人伤疤清单里的东西。在代码里拒绝它,它就根本不可能,无论模型推理到哪一步。
在测试通过前拒绝"完成"
这是最重要的一个,且用的是不同事件。Claude Code 在 agent 结束响应时触发 Stop 事件。你的 hook 在那一刻运行。如果它以 2 退出,agent 被阻止停止;你的 stderr 消息回到模型,它回到工作。Agent 说"好了,我把功能交付了"。Stop hook 静默地运行测试套件。三个失败。Hook 以 2 退出并带上失败输出。Agent 不能算完成。它被推回循环,手里攥着 bug。
被拒绝的 stop 才是关键的保证
人人都懂 hook 能阻止坏动作。被低估的一招是:hook 能阻止坏的 stop。这正是源文论点与 Theorem 3 最清晰地相遇之处。
你 prompt 里的"在完成前总是运行测试"是建议。拒绝 stop 的 Stop hook 是规则。套件为红时,agent 字面上无法宣告胜利。指南给出两条实务提示:保持检查快速且确定,因为它每次 stop 都跑;并确保真实失败产生可修的消息,因为那段 stderr 文本是 agent 唯一的指引。"测试失败"让它乱走。真实的失败输出把它直送 bug。
[PERSONAL EXPERIENCE] HAI Engine 自 2016 年起在生产运行,这些年学到的教训相同:我们保证的属性——概率恰在一处归一、场景降序排序、熵以 nats 计——活在 Oracle 的 ensemble 代码里,而非在请求 Sisters 小心的 prompt 里。Sisters 想象;Oracle 合并。归一化就是 hook。它每次都在同一点以相同规则运行,没有任何 Sister 能说服它交付一个概率和为 1.05 的锥。这就是 Theorem 3:属性成立,因为机制被实现且在测量。
同一模式低一层也成立:SubagentStop 在子 agent 完成时触发,因此委派工作可被保持在与主循环相同的标准。用 Everythink 的话说,这就是为何 the space is the router——一个 room 路由到正确的子 agent,而子 agent 的 stop 被 gating 它父辈的同一边界所 gating。保证在拓扑上组合。一个 network 路由到一个 community,一个 community 路由到一个 room,一个 room 路由到一个子 agent,而在每个边界同一纪律适用:机制保证属性,而非响应者的判断。
任务二:换班时的日志
护栏是人人用 hook 的理由。还有一份几乎没人谈的工作:hook 是 agent 记忆被写入的方式。
你的 agent 已经在读记忆;检索在任务开始时把相关事实拉进窗口。但总得有东西归档新事实——你陈述的偏好、奏效的方法、值得不重蹈的错误。那东西就是 hook。Claude Code 在会话终止时触发 SessionEnd。它无法阻止任何东西;其输出被忽略;它纯粹为副作用而存在。这正是一次记忆写入之所是:从 stdin 取走 transcript 路径,蒸馏对话,把持久的东西追加到你的存储。
它是换班日志,只不过日志自己写自己,每个班次,因为它是规则而非情绪。下一次会话,agent 走进来时已经知道上一次教了它什么。
两条规则防止它沦为玩具。给写入加 gate:大多数消息是"谢谢"和"收到",所以在会话结束时写,并让 prompt 以"若无持久内容,则什么都不写"收尾。存一切不是记忆,是杂乱。并用便宜的模型:把 transcript 蒸馏成一段并非难推理。资深模型在会话中思考;实习生事后写纪要。
这映射到我们在 21 papers 中守的一条纪律:不被 gate 的测量是噪声。Oracle 不记录每份 Sister 草稿——它记录归一后的 ensemble、熵、校准轨迹。SessionEnd hook 是记忆边界上的同一道门:写入持久事实,丢弃嘈杂。一个存一切的记忆系统什么也记不住。
事件地图
Claude Code 暴露约三十个事件。据文档,你最先会触及的:
PreToolUse——在任何工具调用执行前;可阻止;机密守卫、破坏性命令过滤。PostToolUse——在工具调用完成后;仅反馈;编辑后自动格式化、记录每条命令。UserPromptSubmit——当你提交 prompt;可拒绝 prompt;注入上下文、过滤 prompt。Stop——当 agent 结束响应;可拒绝 stop;在接受"完成"前运行测试。SubagentStop——当子 agent 完成;可阻止;把委派工作保持到同一标准。SessionStart——当会话开始;不可阻止,添加上下文;把今日状态载入窗口。PreCompact——在上下文压缩前;可阻止;在窗口被挤压前保存状态。SessionEnd——当会话终止;仅副作用;记忆写入。
注意对称:SessionStart 注入上下文入,SessionEnd 写出学习。这一对本身就是一套可用的记忆系统——而它是规则而非情绪构成的系统。PreCompact 事件是防止窗口静默丢弃状态的边界:在挤压前保存工作集,agent 从事实而非摘要恢复。
Everythink 以此保证什么
HAI Engine ✅ 是这门纪律产出的生产系统。Sisters ✅ 是想象者;Oracle ✅ 是合并者;ensemble 归一化是保证概率和为一的 hook。World Monitor ✅ 通过一个网关路由实时地理信号,该网关按我们的日程而非客户数来约束上游调用量——架构层的 rate-limit hook。Social ✅、Campaigns ✅ 与 Whitelabel Network ✅ 是把一个 network 的路由规则在代码中执行、而非在品牌手册里执行的模块。
Partial ⚠️ 模块——Matchmaking、Marketplace、Calendar——已被测量但尚未 fully hardened;我们如实说。Roadmap 🔵 模块——Wallet & Token、Super App、Community Credit——属 pre-revenue 且受 Howey 审查约束;我们不为之承诺结果,我们交付的任何 hook 都改变不了这份诚实。Hook 能保证属性;它不能保证市场。
客户主权是此模式最深的版本。你的 network、你的品牌、你的数据——路由规则是你的,因为它们活在你控制的代码里,而非某供应商的 prompt 里。范围伦理——仅限民用与防御——本身就是一个 hook:边界上的书面政策,而非希望模型拒绝错活。设计中的包容——多语言、多模态、低连通——是一次 SessionStart 注入:locale 与带宽塑造 agent 看到的首个上下文,先于它响应。
关键要点
- Hook 是 agent 循环固定点上的确定性代码;模型是概率性的,无法绕过它。属性由机制保证,而非由 prompt。
- 被拒绝的 stop 是代码形态的 Theorem 3:"测试在完成前通过"是属性;失败时以 2 退出的
Stophook 是被实现且在测量的机制。 - 退出 2 阻止;退出 1 朝开放失败。一道朝开放崩溃的护栏比没有更糟——它卖出安全感而无机制。
SessionEnd写记忆以便SessionStart能读它。这一对是规则而非情绪构成的记忆系统;给写入加 gate,否则存的是杂乱。- Hook 是工具边界处的"the space is the router":路由先于执行,边界决定,而非响应者。
常见问题
Claude Code hook 到底是什么? 你注册在配置文件里的 shell 命令。当 agent 循环中固定事件触发——工具运行前、agent 声明完成时、会话结束时——Claude Code 把 JSON payload 传入你的脚本并从退出码读取裁定。退出 0 继续,退出 2 阻止。
为什么 hook 比 prompt 指令更安全? Prompt 指令是概率模型大概会遵循的建议。Hook 是每次都在同一点以相同规则运行的代码。模型无法忘记它、跳过它或辩倒它。"期望它表现好"变成"确知它会"。
"拒绝 stop"是什么意思? Stop 事件在 agent 结束响应时触发。该事件上的 hook 可以以 2 退出以阻止 agent 停止,把 stderr 消息回传给模型。在那里运行测试套件,套件为红时 agent 字面上无法宣告胜利。
这与 Theorem 3 如何关联? Theorem 3 说一个属性恰好在其机制被实现且在测量时才被保证。Hook 就是那个机制:以代码实现,以退出码测量。移除它你得到愿望;保留它你得到保证。
Everythink 用 hook 吗? 同一纪律运行 HAI Engine ✅:Oracle 的 ensemble 归一化是保证概率和为一的 hook,在代码里,每次运行。没有 Sister 能说服它交付未归一的锥。
Sources
Professor Glitch, "Claude Code Hooks: The Guardrails Your Agent Can't Talk Past," askglitch.com, 2026 年 7 月 7 日 — https://www.askglitch.com/blog/claude-code-hooks
Claude Code hooks reference, code.claude.com — https://code.claude.com/docs/en/hooks
创建你的 network。

机制必须匹配查询类型,而非检索断言
ByteByteGo的GraphRAG解读读作五种机制形式:相似性搜索-用于-局部、知识图谱-用于-连接、社区报告-用于-全局、map-reduce-用于-聚合、路由-用于-查询类型。Theorem 3应用于每一种。
→ →
四层验证是机制,而非可靠性断言
Ciberpatrulla的合同前企业验证指南读作五种机制形式:四层验证、公共来源作为测量、分层架构作为路由、缺席作为信号、时间一致性。Theorem 3应用于每一种。
→ →
「相关性」才是机制,而非「叙事性输出」
一个运行在 Raspberry Pi 上的 AI 交易代理、一个模拟账户、一次净亏损。「诚实架构师」把相关引擎读作信号与噪声的机制、把指令文件读作人格边界、把入场带单读作风控、把「可交易优先」读作有用输出、把显式 schema 读作边界解析、把被度量的亏损读作诚实状态。
→ →