你的 CLAUDE.md 为什么只长不减?一个被忽视四十年的软件工程老问题
一个你大概率见过的场景
你打开项目根目录的 CLAUDE.md,发现它已经 200 行了。
第一条写着”使用 TypeScript”,这是你三个月前加的。第 47 条写着”不要用 any”,因为某次 code review 出过事。第 103 条写着”组件名用 PascalCase”,你隐约记得是为了和某个 lint 规则对齐。第 158 条写着”测试文件放在 __tests__ 目录下”,但你已经不记得为什么不是 tests 了。
你盯着这个文件,有两个选择:删掉某条,或者再加一条。
你选了后者。
这不是你一个人的困境。arXiv 上 8 月 13 日发布的一篇论文 “Why Does CLAUDE.md Keep Growing? Catastrophic Remembering in Agentic Coding”(作者 Kushal Chakrabarti)告诉你:在 1,867 个 GitHub 仓库、1,801 个多版本文件、299,440 次版本间转换、247,694 条指令生命周期里,64.3% 的文件在增长,只有 26.6% 在缩减。中位数文件最终持有 39 条指令,90 分位数是 131 条——早已越过指令遵循能力开始退化的阈值。
平均每个 commit 净增 +4.9 条指令。
这不是 bug,这是结构性的。
三种可能的解释,只有一种经得起数据
作者提出了三种可能解释 CLAUDE.md 为什么只长不减:
假设一:指令过时(Instruction Staleness) 指令会随着项目演进变得不再适用。如果这是主因,那么删除风险应该随年龄上升——越老的指令越该删。
假设二:内容脆弱性(Content Fragility) 脆弱的指令早死,留下来的都是健壮的。如果这是主因,删除风险会随年龄下降,但这是组成效应,和作者数量无关。
假设三:不完美回忆(Imperfect Recall) 维护者忘了某条指令为什么被加进来。删除它有回归风险,因为没法跑反事实。如果这是主因,删除风险不仅随年龄下降,还应该随维护者数量下降——因为人越多,rationale 丢失得越快。
数据说话。
删除风险的对数斜率是 -0.032 per commit(95% CI [-0.047, -0.019]),随年龄下降——直接否决了”指令过时”假设。
用 gamma frailty 模型吸收内容脆弱性后,斜率依然稳定在 -0.0355——内容脆弱性只能解释 30.8%,剩下的还是年龄效应。
最关键的一刀:多作者交互项 β_multi-author × age = -0.021(z = -11.7)。人越多,删除风险随年龄下降得越快。这个预测只有”不完美回忆”能做出,其他两个假设都无法解释。
> 你不删那条指令,不是因为它还有用,是因为你已经不记得它为什么在那儿了。
Catastrophic Remembering:被忽视四十年的对偶
论文最漂亮的贡献是命名了一个现象:Catastrophic Remembering(灾难性记忆)。
continual learning 领域研究了几十年的 Catastrophic Forgetting——神经网络学新任务会覆盖旧任务的知识。而 agentic coding 遇到的是它的精确对偶:不是丢失记忆,而是积累无法验证也无从删除的记忆。
作者给出了一个闭合形式公式(Equation 5):
> 当平均可恢复性 ρ̄(a) → 0 时,超额指令数发散。
翻译成人话:即使任务不变、即使新增速率恒定,只要”为什么加这条指令”的记忆在衰减,指令就会无限增长。
这解释了一个反直觉现象:mass rewrite 之后,文件增长得更快——rewrite 前 4.1% per commit,rewrite 后 4.9% per commit。因为 rewrite 把 rationale 全清了,但增长机制没变,只是从更低的基数重新开始锯齿上升。
这就是作者命名的 The Ratchet(棘轮):锯齿状增长曲线,reset 后立即重新攀升。
76.8% 的指令死亡来自一次性推平
另一个反直觉发现:76.8% 的指令死亡发生在一次”推平式重写”里。
不是维护者逐条审视后删除,而是某天有人受不了了,把整个文件重写一遍。77.3% 的指令死亡要么是 wholesale rewrite,要么是迁移到兄弟文件。
> 删除一条指令需要一个理由,删除所有指令不需要任何理由。
这句话值得贴在每个 CLAUDE.md 顶部。
解法:给 prompt 加注释
软件工程几十年前就解决过这个问题——代码注释。
注释不是给编译器看的,是给下一个维护者看的。注释记录的是 why,不是 what 或 how。恢复”这段代码为什么这么写”是开发者最严肃的问题(Stulova et al.),所以行业惯例是写注释,写理由。
作者把这个思路搬到 prompt 上:Prompt Comments。
一条指令告诉 executor 做什么;一条注释告诉下一个维护者为什么。
实验设计很精巧:把 IFEval 翻转过来——原本的指令变成隐藏的约束集,让维护者从模糊目标反推指令集。这样最小覆盖集 D⋆ 是已知的,超额大小(excess size)首次变得可测量。
结果:
| 指标 | 无注释 | 有注释 | 提升 |
|---|---|---|---|
| 超额大小(15 步) | +60.4% | -5.8% | 66.2pp |
| 超额大小(51 步) | +211.3% | +1.4% | 99.3% 消除 |
| 指令遵循(WildIFEval) | 50.4% | 62.0% | +23.1% 相对提升 |
消融实验更精彩:注释必须记录”发生了什么”。随机噪声注释和没有注释一样差;只记录尝试过程不记录结果的注释是最差的(+70.0%),因为它给后继者传递了一个未经验证的前提去扩展。真正起作用的是 outcome-grounded latent reasoning——失败背后的假设、结果、复发次数。
为什么这件事重要
这篇论文击中了三个当前 AI 工程的痛点:
第一,Agent 自我演化的隐藏成本。 最近的 self-evolving agent 论文都在讲”自动积累 skill”,但没人问”积累的 skill 怎么删”。SkillZip、EvoMem、MemTools 都在解决”压缩”或”接口”,但根因是为什么保留这个信息在衰减。不解决这个,压缩只是延缓。
第二,评测盲区定律再添一例。 我们测 file size、测 instruction count、测 task completion rate,但没人测 instruction recoverability。就像 QuantiBias 测的是标准安全检查的盲区、Progressive Cramming 测的是 token 准确率掩盖的生成失败——”测什么就优化什么,不测的就是问题藏身处”。这论文第一次让 recoverability 变得可测量。
第三,”换层面解决问题”概念谱系第 12 个成员。 面对指令膨胀,直觉是”更好地删除”——但删除需要反事实,反事实不可行。解法不是优化删除,而是换一个层面:从”该不该删”换到”为什么在这儿”。记录 rationale,删除决策自然变安全。和章鱼 RNA 编辑(不改蓝图改施工图)、黏菌外化记忆(不用神经元用黏液)、螳螂虾声子盾牌(选择性过滤而非蛮力阻挡)是同一个原则——不是更强地做同一件事,而是换一个层面解决问题。
工程落地:三条立即可用的实践
即使没有论文里的 prompt comment 语法,你也可以今天就开始:
1. 给每条指令加一行 # 注释
– 使用 TypeScript # 2024-03 项目从 JS 迁移,新代码必须 TS – 不要用 any # code review 发现 any 导致运行时崩溃无法定位 – 组件名 PascalCase # 对齐 eslint-plugin-react 命名规则
注释是给人看的,不是给 LLM 看的。但 LLM 读到注释也能更好地理解指令的边界条件。
2. 定期 wholesale rewrite,但 rewrite 时强制恢复 rationale
不要逐条删,那太痛苦。把整个文件推平重写,但重写时每条新指令必须带注释。这是论文实验里效果最好的组合。
3. 监控 instruction count,设置阈值
中位数 39 条,90 分位数 131 条。如果你的 CLAUDE.md 超过 50 条指令,大概率有冗余。超过 100 条,指令遵循能力已经在退化。
一个更深的洞察
论文最后一段话值得全文引用:
> Every field is borrowing from AI right now. We should borrow back just as readily. The answer to catastrophic remembering was forty years old and one field over, and the next one might be too.
每个领域都在从 AI 借东西。我们也该随时借回去。灾难性记忆的答案在四十年前、隔壁一个领域(软件工程)。下一个答案可能也是。
这句话对 AI 研究者是个提醒:别只盯着 transformer 架构和 scaling law,软件工程四十年积累的实践智慧可能正是 agentic coding 最需要的。Lehman 的软件演化定律、代码注释的最佳实践、架构决策记录(ADR)——这些都不是新东西,但它们在 LLM 时代还没被正式迁移过来。
“If English is the new code, why don’t we have comments yet?”
这是论文里最锋利的一句话。英语是新代码,但英语写的 prompt 还没有注释系统。这是一个等待被填补的空白,也是一篇论文能给出的最大贡献——不只是回答一个问题,而是命名一个问题。
Catastrophic Remembering 这个名字一旦被记住,就会改变你看待 CLAUDE.md 的方式。下次你犹豫要不要加一条指令时,你会问自己:我能不能同时写下为什么加它? 如果不能,也许它不该被加。
—
论文:arXiv:2608.11095 — Why Does CLAUDE.md Keep Growing? Catastrophic Remembering in Agentic Coding 作者:Kushal Chakrabarti 数据规模:1,867 仓库 / 1,801 多版本文件 / 299,440 版本转换 / 247,694 指令生命周期 核心发现:指令删除风险随年龄下降(-0.032/commit)、随维护者数量下降(z=-11.7),根因是不完美回忆而非指令过时 解法:Prompt Comments 记录 latent reasoning,消除 99.3% 超额增长,指令遵循提升 23.1% 无开源代码(论文本身就是贡献)
