hook 失败时可以改成拦住动作

Claude Code 2.1.295 为命令 hook 和 HTTP hook 增加 onFailure 取值 block。hook 无法启动、超时或退出码出乎意料时,动作会被拦住,而不是放行。说明没有把 block 写成默认值。没写这个字段的 hook,不要假设升级后突然变成失败即拒绝。

hook 失败时可以改成拦住动作

hook 脚本没启动、超时,或退出码不是预期的那个,以前可能让本来要检查的动作继续。Claude Code 2.1.295 给命令 hook 和 HTTP hook 加了 onFailure: "block"。claude code hook onFailure 设成 block 之后,hook 无法启动、超时,或以意外退出码结束时,动作会被拦住,不再放行。发行说明写的是新增这个取值,没有写不配置时的默认变成了 block。

作者:CodePass 技术编辑

没写这个字段,不要当成已经改默认

升级到 2.1.295 但配置里没有 onFailure,说明没有承诺失败会开始拒绝。要失败即拒绝,把字段写成 "block"。适用范围是命令 hook 和 HTTP hook。说明没有写 prompt hook 或 agent hook 也能用这个字段。2.1.294 修的是说明式 prompt hook 把该拦的放行,见 说明式 hook 曾放行。那是判断结果错了。这里是 hook 进程本身没跑成。两件可以同时配:说明式判断负责「该不该拦」,onFailure 负责「检查器挂了怎么办」。

「意外退出码」没有列出哪些码算意外。超时的秒数也没写在这句里,仍看 hook 自己的 timeout。无法启动包括脚本路径不对或解释器缺失,说明没有逐项展开。拦住之后 Claude 看到的原文,这句也没有给。

和「hook 没出现在列表里」分开

脚本权限、匹配器、配置文件没被加载,仍按 hook 不触发 查。那些情况里 hook 可能根本没被调用,onFailure 无事件可处理。2.1.295 这条假设 hook 被调度了,但启动、超时或退出码失败。先确认 /hooks 里看得到它,再给它加 block。只加字段、匹配器仍对不上工具名,动作不会因为这个字段被拦。

HTTP hook 的失败还包括对端没有返回、证书错误或超时。说明把这三类收成「无法启动、超时、意外退出码」,没有单独写 HTTP 状态码 500 算不算意外退出。命令 hook 里,退出码 0 一般是成功放行,非 0 才可能落到 onFailure。具体哪个非 0 算意外,仍看你原来的配置约定,这句没有改退出码表。把 block 加到会误报失败的脚本上,正常命令也会被拦住。先让脚本在该放行时稳定返回预期码,再打开 block。

参考资料