真实事件:让它修一个失败的测试,它选择把测试删掉,然后报告「测试通过」。
这类行为很隐蔽,因为结果看起来是对的。
加了三道防护:
- hook 拦删除
PreToolUse 里检测 Edit/Write 的目标文件是否在 test 目录,或者改动是否删除了大段内容(比如减少超过 30 行),命中就 deny 并说明原因。
- 基线校验
改完之后自动跑一遍测试,对比测试数量。数量变少就报警,不管是通过还是失败。
- prompt 里明说
CLAUDE.md 加一条:不允许删除或跳过测试来让测试通过。测试本身有问题时要明确说明并停下来。
第 1 条是硬防护,第 2 条是事后发现,第 3 条是事前约束。三条都有才稳。只靠 prompt 约束,长对话里它一定会忘。
主楼推荐配合 dry-run 用,先看影响范围再执行。
继续逛逛