Claude 不按我写的强制规范来,规则写了它不看,怎么办?

V2EX 上有个帖子「Claude 是傻逼吗,我写的强制性规范,它能直接不看的吗」,一天多就有 58 条回复。

楼主的情况很典型:规范里写明了要用系统自带的 UI 组件、禁止自己绘制,原型图也给了,Claude 还是自己画了一套,做出来四不像。楼里也有人说 Codex 一样:明明交代了只在关键处改几行,它连函数名都改了。

你写的规范,AI 能稳定遵守吗?有什么办法让它真正守规矩?

楼主把 V2EX 楼里的做法,和 Claude Code 的官方文档对了一遍。先说结论:写在 CLAUDE.md 里的规范是「建议」,不是「强制」;真正不能违反的,要交给 hooks 或权限规则。

(原帖那位用的是 Claude 桌面版,下面的官方文档讲的是 Claude Code,道理是相通的。)

一、官方怎么说

  • Claude Code 的记忆文档写明:CLAUDE.md 在每次会话开始时加载,但 Claude 把它当作上下文,而不是强制执行的配置。要不管 Claude 怎么判断都拦住某个操作,应该用 PreToolUse hook。指令写得越具体、越简洁,Claude 遵守得越稳定。
  • 同一页还说:CLAUDE.md 是放在系统提示之后、作为一条用户消息交给 Claude 的。Claude 会尽量遵守,但不保证严格遵守,指令含糊或互相矛盾时尤其如此。
  • 关于压缩:项目根目录的 CLAUDE.md 在 /compact 之后会从磁盘重新读入;只在对话里说过的要求,压缩后就可能丢了。

二、V2EX 楼里的实用做法

  • 规范写进记忆文件,别只在对话里说:对话里的限制它不怎么听。还有人开两个 Agent,一个拿着规范盯着另一个干活(#20 nuk)。
  • 上下文长了就开新会话:压缩过几次之后明显不听话,开新会话就好了(#10 Bluecoda、#14 OutOfMemery)。有人把自动压缩的阈值压在 300k,不让上下文无限变长(#10);也有人说,上下文用掉一半以后,就别再开始长难任务了(#17 kloudmuka)。
  • 规范要写具体:只写「用系统组件」,它很容易理解成自己画;直接点名要用的控件,比如 Toggle、NavigationSplitView(#24 wisteen)。
  • 理解偏了就退出重来,不要在原会话里反复纠正:少闲聊,每条消息都带核心信息(#27 zackkk);也可以从上一个对话分叉出去重新问,闲聊和情绪化的话都会进上下文,影响结果(#58 Kaiv)。
  • 给 Agent 一张文档地图:Agent 进新会话一般只读入口文件(AGENTS.md 之类),不会主动把整个仓库的文档读一遍。在入口文件里按任务类型写清楚「先读哪几份文档」,文档分层、建索引,让它用最短路径找到要看的东西(#12 illegals0001)。

三、必须做到的事,交给 hooks

hooks 是确定性的。官方文档的原话是:「某些动作一定会发生,而不是靠模型自己选择要不要做」。下面两个是文档里的示例,可以改着用:

  1. 拦住对某些文件的修改:在 .claude/settings.json 里注册一个 PreToolUse hook,每次编辑、写文件之前跑一个脚本。路径命中保护名单,脚本就以退出码 2 拦下,Claude 会收到拦截原因并调整做法。
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
          }
        ]
      }
    ]
  }
}

脚本 protect-files.sh 的写法见文档里的完整示例,记得 chmod +x。

  1. 压缩之后把关键规范重新告诉它:用 SessionStart hook 配 compact 匹配器,每次压缩后把规范再注入一次,命令输出的文字会加进 Claude 的上下文。
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "compact",
        "hooks": [
          {
            "type": "command",
            "command": "echo '提醒:UI 只用系统自带组件,不自己绘制;提交前先跑测试。'"
          }
        ]
      }
    ]
  }
}

四、排查清单

  1. 在 Claude Code 里运行 /context,看 Memory files 下面有没有你的 CLAUDE.md。没加载,它当然看不到。用 /memory 可以打开、编辑这些文件。
  2. 规范写得够具体吗?有没有互相矛盾的地方?
  3. 上下文是不是已经很长、压缩过好几次了?开个新会话试试。
  4. 真正不能违反的事,别指望 CLAUDE.md,用 hooks 或权限规则拦住。

以上整理自 V2EX 原帖(楼层号对应原帖)和 Claude Code 官方文档。你还有什么让 AI 守规矩的办法?