DeepDojo.AI发布 2026-11-12English
CLAUDE.md 规则不被遵守的排查步骤
项目的 CLAUDE.md 里写着:“修改 src/server/auth/ 后运行 pnpm vitest src/server/auth。”你提醒过一次,Claude 也回了一句“好的,我会遵守”。可这次改完认证模块,它只跑了类型检查,专项测试一条都没跑。
这时最常见的反应是把规则改得更重:加粗、加“务必”、加“绝对不要忘记”。效果通常很有限,因为你还不知道问题出在哪一层。规则没生效,可能是下面任何一种情况:
- 文件根本没加载进这次会话;
- 文件加载了,但这次修改不在规则覆盖的范围里;
- 规则写得太模糊,Claude 不知道何时该做、做到什么程度;
- 这条要求本来就需要强制控制,光靠一句说明兜不住。
四种情况的修法完全不同,所以先定位,再动手。具体做法是:先用 /context 看文件有没有加载,再对照这次修改核对规则的触发条件,然后用同类任务复测;必须百分之百挡住的动作,交给权限或 Hook。Claude 回一句“会遵守”,回答不了上面任何一个问题。
01 先分清说明和强制控制
CLAUDE.md 为模型提供项目知识和行动要求,效果依赖于正确加载与理解。需要阻止的操作,还应由权限、沙箱或 Hook 提供相应控制。
可以按需求选择机制:
| 需求 | 适合的机制 |
|---|---|
| 说明架构、命令和团队习惯 | CLAUDE.md |
| 只在处理特定路径时补充规则 | .claude/rules/ 的路径规则 |
| 封装特定任务的重复方法 | Skill |
| 阻止危险命令或敏感文件访问 | 权限与沙箱 |
| 在事件发生时执行检查或拦截 | Hook |
拿“迁移文件必须经人工确认”来看,写在项目指令里,Claude 就有了判断依据。但如果一次漏读就可能造成不可接受的写入,单靠这句话还不够,需要权限或 Hook 参与控制。先想清楚违反这条要求会有什么后果,再决定用哪种机制。
Claude Code 最佳实践把这两类指令分得很清楚:写在提示词、CLAUDE.md 和 Skill 里的内容由模型阅读后自行决定怎么做,通常会照做,但没有保证;Hook、拒绝规则和组织托管设置则由 Claude Code 每次强制执行。官方的建议是:每次都必须发生的事,做成 Hook、拒绝规则或托管设置;CLAUDE.md 用来写指导原则,而 Claude 可以判断某条原则不适用于眼前的情况。
02 确认规则真的加载了
/memory 用于定位和编辑指令文件,也可能显示尚未创建的入口。它只告诉你文件在哪里,不能证明正文已经进入这次会话。
核对实际加载,用 /context。Claude Code 的记忆文档建议运行 /context all,查看 Memory files 列表里有没有这份文件。
- 文件没加载,就查启动目录、文件名和路径;
- 已加载但行为不符,再查表达和冲突。
加载出了问题,加重语气补不上缺失的内容。子目录里的 CLAUDE.md 要等 Claude 碰到那个目录的文件才加载,启动目录不同,读到的文件也不同。
03 用同类任务复测
加载确认后,拿两三个真实任务试试:命令用对了吗,修改范围符合要求吗,约定的检查做了吗?一次回复说得好,还不足以判断规则是否稳定生效。发现偏差,再改规则、用同类任务复测。
如果认证规则明明加载了,专项测试却没跑,先回到这次修改:它确实满足规则里的条件吗?记录里有命令和结果吗?Claude 回一句“会遵守”,还没回答这两个问题。
调整后再做同类认证任务,才看得到变化;换成文档任务就查不到这条规则。普通偏好可以通过观察行为来检查,必须阻止的动作再补控制。
规则本身是否写到了能检查的程度,可以对照CLAUDE.md 怎么写,Claude 才会照做 里的三要素:触发条件、动作和检查依据。
04 按六步排查规则未生效
规则没起作用,就按这个顺序查:
- 用
/memory找到目标文件,再用/context确认它已经加载; - 检查启动目录与文件范围,确认当前任务确实落在适用路径中;
- 检查规则是否包含明确动作和可观察结果;
- 搜索全局、项目、本地、子目录和
.claude/rules/中的冲突; - 删除埋没重要规则的背景、教程和机械清单;
- 判断该要求是否需要权限、沙箱或 Hook 提供确定性控制。
先分清是没加载、范围不对、要求没写具体,还是需要换执行机制。改完沿原任务再试一次。
第 4 步要认真做。官方文档提醒,两条指令互相矛盾时,Claude 可能任选其一。全局配置里一句“改完跑 npm test”,就可能和项目里的专项测试要求打架。
沿用前面的认证测试例子:加载已确认,就核对修改是否位于 src/server/auth/,再检查全局与项目是否给出了不同的测试要求。修正对应来源后,用同类修改复测,并查看命令与结果。这样每一步都针对已观察到的偏差。
如果查到最后,结论是“这条测试无论如何都得跑”,那它已经超出 CLAUDE.md 的职责。用 Hook 在固定时机执行检查,做法可以参考用 Hook 保护 .env 和密钥文件里的拦截写法。
一次回复说得好不算数。同类任务复测通过,规则才算生效;必须挡住的动作,交给不依赖模型判断的控制机制。