写成说明的 prompt hook 曾放行
Claude Code 2.1.294 修复:写成自然语言说明的 prompt 和 agent hook(例如「拦住某某命令」)会放行它们本该拦住的动作。同一版还调整了写在 Stop 和 SubagentStop 上的说明式 hook,让 Claude 不那么容易提前停。这里不写怎样把 hook 写成放行。

用一段话告诉 hook「应该拦住什么」,并不等于那段话真的被当成拒绝规则执行。Claude Code 2.1.294 修了这个缺口。发行说明写:写成说明的 prompt 和 agent hook(例如 “Block commands that...” 这一类句子)会允许它们本该拦住的事情。claude code prompt hook 拦不住 指的是修复前的行为。2.1.294 起,这类说明应按其字面去拦。本文不提供怎样写一句仍会放行的说明。
升级之前,说明式 hook 不能当锁
低于 2.1.294 时,一段看起来像策略的英文说明可能没有拦住对应动作。发行说明没有写哪些句式一定失败,只给了 “Block commands that...” 作为这类写法的例子。也没有写已经发生的放行会被补记。处理是升到 2.1.294 或更高,然后用你原来那条说明再试一次不该发生的动作,看它是否被拦。不要在旧版本上用「hook 文件里有这句话」当作已经生效。
命令 hook 的退出码、匹配器写错、脚本不可执行,是另一类「hook 没触发」,见 hook 不触发怎么查。那篇对的是脚本和配置没跑起来。2.1.294 对的是 hook 跑了,但说明式判断把该拦的放了。日志里看得到 hook 被调用、动作仍继续,才更像这一条。
Stop 上的说明不再那么容易提前停
同一版还改进了写在 Stop 和 SubagentStop 上、同样是说明句的 prompt hook(例如 “Carry on if the build is broken”)。判断方式改了,Claude 不那么容易提前停。这不是把所有停止都取消。说明没有写构建失败时一定会继续,只写「不那么容易过早停止」。你的说明若是要求在测试失败时继续,升级后更接近这句说明的原意。若是要求在某个条件下必须停,不要用这一条改进来解释它突然不停。那要看说明本身写的是继续还是停止。