用 Agent 写代码写到后面它全忘了?让它每次干完活写一份进度记录

一、踩坑现场

最近我把一个项目丢给编码 Agent 自动跑。一开始交代得明明白白:技术栈、目录结构、命名规范、业务边界,全写在 prompt 里。

前几个任务它干得很漂亮。但跑到第十几个任务,问题来了——

它新建了一个文件,用的是 JavaScript,而我明明要求 TypeScript 严格模式;它写的错误处理直接 throw new Error(...),而不是我们一开始定的 AppError 封装;更离谱的是,它把一个早就废弃的接口又重新实现了一遍,完全不知道那个接口在上上个任务里已经被我否决了。

我质问它,它说:“抱歉,我修正。“然后下一轮接着忘。

问题不在它聪不聪明,在于它根本没有一个“我之前干了什么”的外部记忆。 每开一个新任务,它只带着你这次给的 prompt 上场,之前的决策、踩过的坑、否决过的方案,全靠上下文窗口硬扛——扛不住就开始编。

二、为什么 Agent 比普通对话更容易忘

跟你手动聊天不一样,Agent 是自动跑的:

  1. 任务之间是割裂的:你给它一个任务,它跑完,你再给下一个。每个新任务它不会自动带上全部历史。
  2. 它自己也在产出代码:跑久了,上下文里塞满了它自己生成的代码、报错、调试日志,真正关键的决策记录反而被挤没了。
  3. 它不会主动回顾:除非你让它做,否则它不会自己去翻“上次我们定了什么”。跑完一个任务,它就以为翻篇了。

三、解法:让它每干完一个任务,写一份进度记录

我后来加了一条硬规则,效果立竿见影:

每完成一个任务,在结束前必须更新项目根目录下的 <项目名>项目执行进度记录.md。

这个文件里记录四样东西:

1. 已完成的决策

技术栈选了什么、目录怎么组织的、错误怎么处理、哪些方案被否决了、为什么否决。

2. 当前状态

现在写到哪了,哪些模块完成了,哪些还没动。

3. 下次开工要注意的事

有什么坑踩过、有什么约束容易忘、有什么待办没闭环。

4. 文件清单

哪些文件是这次新建/改动的,分别干什么用的。

然后下一个任务开始前,第一句话永远是:“<项目名>项目执行进度记录.md,按里面记录的上下文和约束继续。”

四、为什么这招管用

本质上就一句话:把“记忆”从它的脑子里挪到文件里。

  • 上下文窗口会被稀释,但文件不会。每次开工它先读一遍,等于把之前所有关键决策重新注入眼前。
  • 它写记录的过程本身就是一次“复盘”——写完它自己也更清楚项目走到哪了。
  • 你打开这个文件就能 review 它干了什么,不用翻聊天记录。

听起来笨,但这是我试过最省事的方案。比每次开新任务重新贴一遍约束靠谱,比指望它长记性靠谱。

五、我的建议

用 Agent 干长项目,别把它当成“记得住你项目的队友”,把它当成一个每天下班要写工作日报、第二天上班第一件事读昨天日报的实习生。

日报写得清楚,第二天就不会跑偏;日报不写,第三天就开始给你重新发明轮子。

别考验它的上下文,给它一个能自己读的笔记本。