每个 CLAUDE.md 的开头都很小。某次运行失败,补一条规则;过一个月,又补一条。半年后文件膨胀到三倍,却没人敢删任何一行——因为删除意味着要证明这条规则不再重要,而这个证明太贵了。这不是自律问题。这是一项刚被测量、有了名字的现象:「灾难性留存」(catastrophic remembering)。
独立研究者 Kushal Chakrabarti 的论文《Why Does CLAUDE.md Keep Growing? Catastrophic Remembering in Agentic Coding》(arXiv:2608.11095)追踪了 1,867 个 GitHub 仓库中 24.7 万条指令的生命周期,量化了每个开发者都有的直觉:CLAUDE.md、AGENTS.md、copilot-instructions.md 这类智能体指令文件,平均膨胀 226%,每个 commit 净增 4.9 条指令。而且指令越老,被删除的概率越低。
只进不出的根源:加一条很便宜,删一条很贵
论文的回答简单得近乎残酷:添加零成本,删除高成本。追加一条新指令几乎没有负担——失败后随手写一行,当场就能验证。但几个月后想删掉它,要回答一连串问题:当初的失败是偶发还是常态?后来的规则是否已经覆盖?和其他指令有没有看不见的组合效应?论文把它形式化:审计一条指令需要重建它的「潜在推理」(当初为什么存在),没有这份上下文时,验证成本是指数级的(O(2^|D|) 子集探测);理由被记录下来时,成本降到 O(1)。
数据印证了机制:指令活得越久,作者越可能离开、背景越模糊。删除风险随年龄递减(log-hazard −0.032/commit)——和自然过时该有的曲线正好相反。旧规则不是被删掉的,而是「规则还在,理由没了」。
灾难性留存:灾难性遗忘的镜像
机器学习界早就研究过灾难性遗忘——模型覆盖了本该保留的东西。Chakrabarti 给智能体编码的镜像命名:维护者保留了本该覆盖的东西。两者败在同一个地方:允许更新的依据消失了。
这也能解释为什么「掀桌重写」不解决问题:不敢逐条修剪的人,却敢整份推倒重来——贪吃蛇被截短,很快又会吃回来。论文发现重写后增长模式会复现,因为底层激励结构没变。而问题在智能体工作流里还会自我放大:能改写自身指令的智能体(如 DeepSeek 的自进化智能体研究),会继承文件里已有的脆弱性。
解法:给每条长期指令补一条「为什么」注释
论文的方案平淡到近乎反高潮:给每条长期指令加注释,记录它为什么存在。不是「有用。」不是「我想加。」而是一条真注释:什么失败触发了它、作者当时什么假设、这条规则到底有没有解决问题。
效果惊人。对照实验中,带真实原因和验证结果的结构化注释,把提示词超额规模从 211.3% 压到 1.4%——消除了约 99.3% 的冗余指令。文件变短没有牺牲正确性:用更贴近真实用户的指令测试,有效注释让模型听话程度最高提升 23.1%。规则不是越多越保险,无关、重复甚至冲突的指令反而分散模型注意力。注释的价值,就是给维护者筛掉噪声的证据。
实验也验证了什么没用:占位注释(「我觉得行。」「能用。」)和没有注释几乎无差别;只记尝试不记结果的注释还会误导——一条写「怀疑 token 截断,把 max_tokens 从 2048 调到 4096」却不写结果的注释,会把未验证的猜测变成下一位维护者的默认方案。
更深一层:这是工具链的问题,不是用户自律的问题
细读论文,最锋利的一点不在注释卫生,而在:整个智能体工具链缺少可维护性原语。代码有注释、版本历史、测试和架构决策记录;一条长期智能体指令什么都没有——没有作者、没有触发事件、没有验证结果、没有失效条件。
AI 厂商一边要求用户「写精简」,一边不给判断去留的依据。「保持简短」是一句没有证据的要求。工具链应该主动提示:「这条规则半年没触发、依赖已被替换、相关测试全部通过,是否进入删除审查?」在那之前,每个维护者都会理性地选择「留着,别冒险」,聚合的结果就是文件只长不短。这和 Anthropic 的多智能体实验暴露的是同一类空白——我们在系统上线之后,才用经验补课智能体的行为和维护规则。
今天就能做的三件事
- 给每条长期规则写注释。三个字段:为什么加、解决了什么问题、现在是否仍然有效。这就是全部解法。
- 按年龄审计。最老的指令最不可信——它们的理由腐烂时间最长。对超过一个季度的旧规则做一轮「它为什么存在?」排查。
- 把指令文件当代码对待。改动要评审、要有变更记录、要有能验证该规则的测试或检查。能验证的规则,才是能删的规则。
灾难性留存是智能体记忆第一个被命名、被测量的疾病。解药很朴素:把为什么写下来。而更深的一课是——智能体工具要走向生产成熟,记住与遗忘都必须成为一等公民。