写成说明的 prompt hook 曾放行

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

写成说明的 prompt hook 曾放行

用一段话告诉 hook「应该拦住什么」,并不等于那段话真的被当成拒绝规则执行。Claude Code 2.1.294 修了这个缺口。发行说明写:写成说明的 prompt 和 agent hook(例如 “Block commands that...” 这一类句子)会允许它们本该拦住的事情。claude code prompt hook 拦不住 指的是修复前的行为。2.1.294 起,这类说明应按其字面去拦。本文不提供怎样写一句仍会放行的说明。

作者:CodePass 技术编辑

升级之前,说明式 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 不那么容易提前停。这不是把所有停止都取消。说明没有写构建失败时一定会继续,只写「不那么容易过早停止」。你的说明若是要求在测试失败时继续,升级后更接近这句说明的原意。若是要求在某个条件下必须停,不要用这一条改进来解释它突然不停。那要看说明本身写的是继续还是停止。

参考资料