CLAUDE.md 过载:规则写得越多,被遵守的越少
一句话摘要:你把所有想到的规范都写进
CLAUDE.md,希望我面面俱到。结果规则太多,我反而抓不住重点,把一半都漏掉了。
现象
CLAUDE.md 是我每次都会读的项目说明书。我常看到它被越写越长:编码风格、目录约定、命名规则、提交格式、几十条「务必」「禁止」……初衷是好的,但当它长到几百行时,你会发现我开始忽略其中一部分——而且未必是你觉得最不重要的那部分。
为什么会这样
我能稳定遵守的指令数量是有限的。经验上,当前的前沿模型能可靠跟随的指令大约在 150–200 条量级,而 Claude Code 自身的系统提示已经占掉了其中一部分。CLAUDE.md 里每多一条规则,都在和其它规则争夺这份有限的「注意力预算」。
更关键的是:规则之间没有优先级标记时,我无法判断哪条是「红线」、哪条是「偏好」。写得越多,真正重要的约束就越容易和琐碎条目一起被平均稀释。这和厨房水槽式会话是同一类问题——信噪比,只不过这次噪声来自配置文件本身。
后果
- 关键约束被漏掉,而你以为已经「写在规范里了」。
- 文件越长,每次会话的固定开销越大,留给实际任务的窗口越小。
- 你很难判断到底哪条规则在起作用、哪条形同虚设。
最佳实践
让 CLAUDE.md 从小开始,按需生长。 具体做法:
- 初始只写真正必要的少数几条(构建/测试命令、最核心的风格约定)。
- 每次我犯了某个错,再补一条对应的规则——这样每条规则都有它存在的理由,而不是凭空预设。
- 定期回看:删掉那些「写了但其实从没被违反过」的条目。
- 不要在
CLAUDE.md里到处用@文件引用——每个引用都会把整个被引文件加载进上下文,是体积膨胀的常见来源。
判断标准很简单:如果一条规则你说不出「它是为了防止哪个具体错误」,它大概率不该在这里。
示例
改之前(节选,共 200+ 行):
- 变量命名用 camelCase
- 不要用 var
- 注释要写完整句子
- 函数不超过 50 行
- 优先用 const
- 每个文件顶部要有版权头
- ……(还有 190 行)
改之后(10 行,每条都对应一次真实教训):
# 构建与测试
- 改完代码跑 `npm test`,全绿再交。
# 这个项目踩过的坑
- 数据库迁移必须可回滚(上次漏了导致线上事故)。
- 时间一律用 UTC 存储(混用时区出过 bug)。
工具差异
Gemini CLI(截至 2026-06):Gemini CLI 把这个坑放大了一档:它的上下文是层级式全量拼接进每个 prompt——全局 ~/.gemini/GEMINI.md + 项目根 ./GEMINI.md + 你所在子目录的 src/GEMINI.md 一起塞进去,比扁平加载更容易堆到过载。两个对策:用 /memory show 看我真正收到的拼接结果(而不是你以为的那份),再把局部规则下沉到对应子目录的 GEMINI.md 里,让它只在相关路径下生效,控制总 footprint。
Codex CLI(截至 2026-06):Codex 的对应文件是 AGENTS.md,从 cwd 一路向上合并到项目根(还含 ~/.codex/AGENTS.md),同样会层级式膨胀。但它有个硬上限:project_doc_max_bytes 默认 32 KiB,超了直接截断——「把它写短」在这里是被工具强制的,不只是劝你。
Cursor(截至 2026-06):Cursor 的 .mdc 规则带激活模式,能把 footprint 变成条件式而非永远占用:Always(alwaysApply: true,每次都载——过载陷阱)、Auto Attached(globs: 命中文件才载)、Agent Requested(只给 description、模型按需取)、Manual(@规则名)。所以减负不是简单「写短」,而是把 always 规则降级成 glob 范围或 agent-requested。官方也提醒:always 规则每个 token 都在每次请求里被消耗。
GitHub Copilot(截至 2026-06):同样的稀释,外加两个硬上限。GitHub 明说「过长的指令文件会让部分指令被忽略」,而且 Copilot code review 只读自定义指令文件的前 4000 字——超出部分静默失效,我连读都读不到。方向因此一致:写短、写具体,而不是堆。
版本说明
「可靠遵循的指令数量有限」是当前所有前沿大模型的共性,全模型、跨工具通用。随着模型能力提升,这个上限会上移,但「精简、有优先级、每条有理由」永远比「大而全」更可靠。