DeepDojo.AI发布 2026-11-12English

CLAUDE.md 规则不被遵守的排查步骤

Claude CodeAI 编程

项目的 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 按六步排查规则未生效

规则没起作用,就按这个顺序查:

  1. 用 /memory 找到目标文件,再用 /context 确认它已经加载;
  2. 检查启动目录与文件范围,确认当前任务确实落在适用路径中;
  3. 检查规则是否包含明确动作和可观察结果;
  4. 搜索全局、项目、本地、子目录和 .claude/rules/ 中的冲突;
  5. 删除埋没重要规则的背景、教程和机械清单;
  6. 判断该要求是否需要权限、沙箱或 Hook 提供确定性控制。

先分清是没加载、范围不对、要求没写具体,还是需要换执行机制。改完沿原任务再试一次。

第 4 步要认真做。官方文档提醒,两条指令互相矛盾时,Claude 可能任选其一。全局配置里一句“改完跑 npm test”,就可能和项目里的专项测试要求打架。

沿用前面的认证测试例子:加载已确认,就核对修改是否位于 src/server/auth/,再检查全局与项目是否给出了不同的测试要求。修正对应来源后,用同类修改复测,并查看命令与结果。这样每一步都针对已观察到的偏差。

如果查到最后,结论是“这条测试无论如何都得跑”,那它已经超出 CLAUDE.md 的职责。用 Hook 在固定时机执行检查,做法可以参考用 Hook 保护 .env 和密钥文件里的拦截写法。

一次回复说得好不算数。同类任务复测通过,规则才算生效;必须挡住的动作,交给不依赖模型判断的控制机制。