# 让 AI 记住教训，但别把 AGENTS.md 写成垃圾堆

**Published:** September 10, 2026

*把踩坑经验写进 AGENTS.md，容易变成不断追加的规则清单。我开源了 agentsmd-skill，用准入门槛、合并决策和 120 行上限管理项目经验，让新增、替换与删除都有依据。这篇文章拆解它的设计，展示如何把一次返工压缩为可执行规则，也讨论精简的边界：哪些信息应该保留，哪些细节应该交给项目文档。*

---
跟 AI 一起做项目，有一句话很容易脱口而出：**“把这次的教训写进 [AGENTS.md](https://agents.md/)，下次别再犯了。”**

这句话背后的期待很合理。既然已经花时间纠正过一次，就希望下一次任务能继承这份经验。但经验写进文件之后，还有另一件事要处理：新规则跟旧规则是什么关系？如果每次都只往后加，这份给 Agent 看的项目说明，迟早会变得难以维护。

所以我做了 [agentsmd-skill](https://github.com/kelegele/agentsmd-skill)。它的任务是把项目经验提炼成少量、可执行的规则，并在写入之前完成去重、合并和清理。2026 年 9 月 4 日，我把它放到了公开仓库。这篇聊聊它的设计，以及我为什么给它加了一条看起来有些生硬的限制：**不含空行，最多 120 行。**

## 写下来之后，还需要有人维护

AGENTS.md 是面向编码 Agent 的项目说明文件，可以放构建命令、代码约定和工作流程。它提供了一个相对明确的位置，让接手任务的 Agent 找到项目上下文。

但文件存在，不代表里面的信息一直有效。

项目可能换过包管理器，测试命令可能已经调整，某个临时解决方案可能早就被正式实现取代。如果旧规则没有同步处理，Agent 读到的就是不同阶段的要求。遇到矛盾时，它还得重新判断哪一条适用于当前项目。

重复也是一个问题。同一件事可能先写成“提交前检查”，下次改成“发布前验证”，再下次加上一段更具体的补充。单独看，每句话都有道理；放在一起，却不容易看出它们各自负责什么。

我希望这个 Skill 接住的，就是从“记录经验”到“维护规则”之间的这一步。

## 什么教训值得成为长期规则

最容易实现的方式，是让 Agent 总结本次对话，再追加到文件末尾。但一段对话里有很多只属于当下的信息：临时文件名、某次运行的参数、还没有验证的推测，都不适合长期留下来。

我在 Skill 里设了三个准入条件：

- 未来大概率还会遇到。
- 违反会带来实际损失，例如返工、缺陷或时间浪费。
- 能用一行说清楚要做什么。

三条要同时成立。用户的明确纠正、实际发生的错误和验证有效的做法，是优先考虑的来源；一次性任务细节和通用常识，则直接排除。

下面是一个说明规则加工方式的假设示例，并非项目事故记录。

原始教训可能是：

> 这次改了文章图片目录，预览时有张图打不开，后来发现正文路径没有一起修改。

这段话适合放在复盘里。如果项目确实反复遇到这类问题，提炼后的规则可以是：

```text
- 移动文章图片后，同步更新正文引用，并在预览中检查图片能否加载。
```

它保留了触发条件、具体动作和验证方式，去掉了某次任务的经过。

“一行说清楚”也有边界。需要多步操作的故障排查，不应该强行挤成一条越来越长的句子。详细流程可以留在项目文档里，规则只说明何时查阅它。精简的目的是让指令更明确，不能为了缩短文件而丢失必要条件。

## 真正关键的是合并旧规则

这个 Skill 的核心放在合并阶段：读取现有文件，建立规则清单，再逐条比较新增内容。

如果已经有等价要求，就丢弃新条目。如果部分重叠，就合并成更精确的表述。如果新经验只是已有规则的一个特例，就检查能否用一条覆盖范围合适的规则表达。明确过时的内容，则应当删除。

继续用一个假设示例说明。文件里原来写着：

```text
- 修改文章后检查图片。
```

后来又得到一条更具体的经验：

```text
- 移动文章图片后，同步更新正文引用。
```

直接追加当然可以，但两条之间的关系需要读者自己拼接。更清楚的写法是保留一般检查，再把路径变更的处理条件合进去：

```text
- 修改文章后检查图片加载；若移动图片文件，同步更新正文引用。
```

这里有个细节：不能为了合并，把原本适用于所有文章修改的检查，缩窄成只有移动图片时才检查。**删掉重复文字的同时，要保住原来的有效约束。**

当前 Skill 对矛盾规则采用“保留更新的实践”的处理方式。我的理解是，它需要建立在新实践确实适用的前提上。时间更新，本身不足以证明旧规则可以废弃；如果只是两个场景的要求不同，应该把适用条件说明白。

合并因此是一项判断工作。最后留下几行，只是结果的一部分；有没有改变规则原本的含义，同样需要检查。

## 为什么给它设 120 行上限

120 行不是 AGENTS.md 的官方限制，也不是经过实验得到的最佳长度。官方格式没有强制字段或固定章节；这个数字是我给当前 Skill 设定的维护约束。

我想用它制造一个明确的取舍时刻：文件接近上限时，加入新内容之前，先看看有什么应该退出。

当前削减顺序是：先清理过时规则，再处理重复项，然后检查通用性较弱的特例，最后审视较少触发的章节条目。Skill 还限制章节数量，并建议每个章节不要堆太多规则，避免文件靠增加标题继续膨胀。

不过，行数只能作为粗略指标。一行可以写十个字，也可以写两百个字；同样的行数不意味着同样的阅读负担。低频规则也不一定不重要，例如很少执行但影响很大的发布操作，仍然值得保留清晰的约束。

对更大的项目，官方也提供了在子目录放置 AGENTS.md 的组织方式。当前这个 Skill 的流程主要围绕项目根文件展开，不能把它的 120 行限制当成所有仓库都该照搬的标准。

我更看重的是限制带来的维护动作：**加一条之前，重新审视已有内容。**

## 没有文件时，先认识项目

另一个容易走偏的环节，是第一次生成 AGENTS.md。

如果只给 Agent 一个模板，它很容易填出一份看起来完整、却到处适用的文档：保持代码清晰、遵守最佳实践、提交前充分测试。读起来没什么问题，却没有告诉它这个项目到底怎么运行。

所以初始化流程要求先扫描目录、项目说明、依赖和构建配置，以及已有的自动化检查配置，再决定要写哪些内容。

实际使用什么命令，就写什么命令。没有对应流程，就省略相关章节。模板提供组织参考，不要求凑齐所有标题。

这也延续了我之前在[写一个零依赖 Skill 的感悟](/blog/skill-craft-lessons)里讨论的方向：让 Agent 学会从项目里获取依据。具体答案会随项目变化，找到答案的方法应该进入工作流程。

## 交付时，要把删改也说清楚

如果 Skill 最后只回复“已更新 AGENTS.md”，用户很难判断它到底做了什么。

因此我要求它报告三件事：新增了哪些规则；合并、替换或删除了什么，以及理由；更新后的非空行数和剩余容量。

其中，删除和替换尤其值得展示。新增一句话容易理解，删掉一句旧要求却可能影响后续任务。用户需要看到这次修改的依据，才能判断是否准确保留了项目约束。

想试用，可以按[仓库安装说明](https://github.com/kelegele/agentsmd-skill#安装)安装，然后在一次任务结束后说：

> 用 agentsmd 把这次的教训固化进 AGENTS.md。

第一次试用时，我建议选一个刚刚验证过的小问题，检查它如何提炼和合并。先看规则是否准确，再看文件是否更短。

目前公开仓库呈现的是这套工作流设计。我还没有可以据此宣称“错误减少多少”或“效率提升多少”的对照数据，120 行上限的实际效果也需要继续观察。

## 留下值得下次继续使用的经验

做这个 Skill，让我把注意力从“还有什么没写进去”，转向了“已经写进去的东西，还值得保留吗”。

一次纠正，可以先成为候选经验；经过验证、提炼和比对，才成为长期规则。之后项目发生变化，它仍然需要被修改，甚至删除。

我希望 AGENTS.md 最终留下的是少量清楚的指引：遇到什么情况，应该采取什么行动，如何确认做对了。让下一次任务继承这些判断，才是把教训写下来的意义。