Ppdd.bot
中EN

你的规则文件太长了:哪些该留,哪些该挪走

把硬纪律和日常约定分开,让规则文件短到 agent 每次都能读完、读进去。

我公司主仓库的 CLAUDE.md(Claude Code 每次开工都会整个读进去的规则文件),第一版只有 13 行。

那是 7 月底,提交说明里有一句:「本文件刻意保持最小:只放必须硬性遵守的项目级纪律,日常开发约定仍写在各自 skill / docs 里。」三个多月过去,它长到了 26 行,第一行还是那句话:

本文件只放必须硬性遵守的项目级纪律。日常开发约定写在各自的 skill / docs 里,不要往这里堆。

规则文件很容易越写越长。技术栈、目录结构、命名规范、怎么跑测试、怎么部署,每踩一个坑再补一条「下次别这样」。每一条单看都有道理,可这个文件每次开工都要整个读进上下文,「测试用 pytest」这种 agent 扫一眼代码就知道的事,和「不准自己合并 PR」这种必须守住的事,排在一起,看着分量一样。真正要命的那几条,就这么被稀释了。

留下来的,是每次都必须成立的事

判断一条该不该留,我只问一个问题:这次任务要是没读到它,会不会出事?

现在留在那 26 行里的,大概是这些:分支从最新的 main 切;PR 描述必须写验证、风险、回滚三段;对外文案、计费、限制用户的决定要单列「待否决的决定」;改模型行为的改动单独提 PR;没处理的待办必须写进 ledger(仓库里一个专门放待办的目录)。它们跟具体做什么任务无关,哪次都得守,违反了代价不小,而且 agent 光看代码推不出来。

有意思的是第一版那 13 行,只管了一件事:待办不准只写在回复里。这条规矩我当天先写成了一个 skill,结果同一天又把它提进了规则文件,提交说明原话是「skill description 自动触发不够可靠,会漏」。skill 要靠 agent 自己判断什么时候调用,判断错了就漏掉;规则文件每次都读,不靠判断。

所以规则文件短,不是因为短本身有什么好处,是为了让必须每次成立的那几条,每次都真的被读进去。

挪走的,各有去处

做某件事的步骤,挪进 skill。部署、查数据库、把页面发布成链接,在那个仓库里各是一个 skill,平时上下文里只有一段描述,真要做这件事时才加载全文。

代码约定,挪进 docs。哪个目录放什么、某个模块有什么坑,agent 改到那块代码再去读就行,不用每次开工都背一遍。

最容易被忽略的是第三类:状态。10 月 8 日我连着提了两个 commit 改规则文件,干的都是同一件事,删过时的表述。一条说 CI 因为账单停跑了,其实已经恢复;另一条讲的是 CI 改造前的写法。改完写上了「Actions 已于 10 月初恢复」,没过几天额度又用完,CI 又停了一阵。

规则写进去,能管很久;状态写进去,变了就成了假话,agent 还会照着假话做判断。项目现在什么情况、哪次踩过什么坑,这类东西我放在记忆里。记忆的索引也是每次开工都加载的,9 月中旬我把它从 33KB 压到 9KB:索引里每条只留一行短钩子,正文放在单独的文件里,话题相关了再读,已经收官的项目挪到归档索引。同一天还在这个项目里关掉了 34 个用不上的 skill,每个 skill 的描述也都常驻在上下文里,用不上就是纯占地方。

怎么动手

把现在的规则文件打开,逐条问三个问题。这次没读到它会不会出事?它写的是规则还是状态?agent 看代码能不能自己知道?

第一个问题答「不会」,或者第三个答「能」的,挪走或删掉。第二个答「状态」的,挪进文档或记忆,规则文件里最多留一句去哪儿找。

剩下的就是你的硬纪律。下面是我那个文件的骨架,可以直接改了用(Codex 读的是 AGENTS.md,写法一样):

# 项目规则

> 本文件只放每次都必须遵守的硬纪律。做事的步骤写进 skill,
> 代码约定写进 docs,项目状态和踩坑记录写进文档或记忆。不要往这里堆。

## 加一条之前先问
- 这次任务没读到它,会不会出事?不会,就别放这里
- 它是规则还是状态?状态会过时,放进文档
- agent 看代码能不能自己知道?能,就不用写

从 13 行到 26 行,第一版管的那件事还在文件里,后来加的几条也都是哪次任务都得守的。第一行那句「不要往这里堆」,一直没删。