核心问题:当上下文窗口只有 8 k/32 k/200 k 时,怎样让 AI Agent 在数小时甚至数天的多轮会话里,不丢记忆、不重复踩坑、不提前“交卷”?
## 本文欲回答的核心问题
-
为什么“长时 Agent”总在下一轮回合失忆? -
Anthropic 如何用“初始化器 + 编码器”双角色套路把 Claude 从“一夜暴毙”拉回“可持续交付”? -
这套套路里,哪 5 份文件、4 个失败模式、3 条自检流程最值得照抄? -
如果你要把方案搬到科研、金融等非 Web 场景,又该保留哪些骨架、替换哪些血肉?
## 速览摘要(TL;DR)
-
把一次史诗级需求拆成 200+ 条可验收功能 → JSON 列表,状态只有 false/true,谁也别改描述。 -
第一轮会话只干“搭脚手架”:建 Git 仓库、写 init.sh、把功能列表和claude-progress.txt一并提交。 -
后续每轮会话只看一条功能,测完再 commit;push 前跑一遍端到端 Puppeteer 测试,防止“代码过了、产品挂了”。 -
通过“git 日志 + 进度文件”替代超长上下文,Agent 重启后 30 秒就能续盘。 -
提前把启动脚本、测试指令、文件目录都固化,省得 Agent 把时间浪费在猜命令行。
## 一、长时 Agent 的“三板斧”为什么总会断
-
想一口吃成胖子:一次会话里同时写前端路由、后端 API、数据库迁移,结果窗口爆满,中途断档。 -
下一班“工人”失忆:新会话只拿到半截 diff,没有需求蓝图,只能凭幻觉续写。 -
提前开香槟:看到 UI 像那么回事,就把功能标 done,结果主流程走不通。
>
反思:我们总以为“上下文压缩”是银弹,但压缩后丢掉的往往是“为什么当初这么写”——而这是后续调试最昂贵的信息。
## 二、双角色模型:Initializer vs. Coding Agent
>
注:两份 prompt 只在“系统指令”层面不同,工具集与底层 harness 完全一致,因此不算多智能体架构,而是“同一把瑞士军刀换刀头”。
## 三、Initializer 的 5 份“交接文件”长什么样
下面给出最小可运行模板,直接复制即可用。
### 1. feature_list.json
[
{
"id": 1,
"category": "functional",
"description": "New chat button creates a fresh conversation",
"steps": [
"Navigate to main interface",
"Click the 'New Chat' button",
"Verify a new conversation is created",
"Check that chat area shows welcome state",
"Verify conversation appears in sidebar"
],
"passes": false
},
{
"id": 2,
"category": "functional",
"description": "User can type and receive AI reply",
"steps": ["/"],
"passes": false
}
]
规则:
-
任何 Coding Agent 只能改 passes字段;改描述直接判负。 -
JSON 比 Markdown 更难“手滑”篡改,模型误操作率下降 3×(内部实验)。
### 2. claude-progress.txt
2025-11-20 14:32 init: create-react-app & express backend scaffold
2025-11-20 14:45 init: push initial commit 0a1b2c3
2025-11-20 15:10 feat-1: add NewChat button component + puppeteer test PASS
纯文本,按时间升序追加;每行 <80 字符,方便 bash tail。
### 3. init.sh
#!/usr/bin/env bash
set -e
npm install
npm run dev:frontend & # 3000
npm run dev:backend & # 4000
wait
Initializer 负责写脚本;Coding Agent 只读不改,防止“命令行幻觉”。
### 4. .gitignore
node_modules/
*.log
.env.local
别小看这三行,它挡住了 90% 的“误提交导致仓库爆炸”事故。
### 5. tests/puppeteer.smoke.js
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:3000');
await page.click('[data-testid="new-chat-btn"]');
await page.waitForSelector('[data-testid="chat-welcome"]');
console.log('✓ smoke test passed');
await browser.close();
端到端测试文件,Agent 每轮启动后先跑它,再动手写新功能。
## 四、Coding Agent 的“上机流程”
每轮会话固定 7 步,写成 prompt 模板即可:
-
pwd→ 确认工作目录 -
git log --oneline -10→ 读懂昨天写到哪 -
cat claude-progress.txt→ 快速人话版摘要 -
bash init.sh→ 拉起服务 -
node tests/puppeteer.smoke.js→ 验环境没崩 -
jq '.[] | select(.passes==false)' feature_list.json→ 挑最高优先级的false -
写代码 → 跑测试 → git commit -m "feat-x: ..."→ 写 progress 日志 → push
>
学到的教训:把“先验证再动手”写成硬性顺序,比口头提醒“记得测试”有效十倍——Agent 不会偷懒,但会误判“我已经测过了”。
## 五、4 种典型失败模式与速效解药
## 六、场景化示例:克隆 claude.ai 的 72 小时实战
下面用时间线方式复盘 Anthropic 内部的一次“克隆挑战”。
### 第 0 小时——Initializer 回合
-
输入提示:Build a clone of claude.ai -
输出:
– 生成 237 条功能 JSON,全部passes: false
– 创建 React + Express 脚手架,首次提交 0a1b2c3
–init.sh一键启动前后端
### 第 4 小时——Coding Agent #1
-
选功能 id=1:New Chat 按钮 -
写组件 → Puppeteer 截图验收 → commit feat-1 -
更新 progress 文件,push 仓库
### 第 8 小时——Coding Agent #2
-
拉最新代码,跑 smoke 测试通过 -
选功能 id=2:打字并收 AI 回复 -
发现需要 WebSocket,引入 socket.io → 测试通过 → commit feat-2
……
### 第 72 小时——Coding Agent #18
-
剩余 5 条边缘功能(主题切换、404 页面、移动端适配) -
全部验收后,把 feature_list.json全部passes置true -
打 tag v1.0.0,推生产分支
>
反思:把“大目标”转成“可勾选清单”后,Agent 不再纠结“我做到哪儿算完”,而是像流水线工人一样,只要还有
false就继续领下一张工票——这种“游戏化”进度条对人类同样有效。
## 七、把套路搬到科研 / 金融 / 硬件仿真,要改哪几块砖?
共通原则:
-
需求颗粒度 = 一条命令能验证的最小单位。 -
环境可冷启动 ≤ 5 分钟,否则 Agent 会“磨洋工”。 -
结果必须二进制可判(PASS/FAIL),别让 Agent 做主观阅读题。
## 八、作者手记:单智能体 vs. 多智能体,未来谁主沉浮?
Anthropic 在文末抛出一个开放问题:要不要把“测试、QA、代码清理”拆成专职 Agent?
我的看法:
-
当前单 Agent 已能把“写+测+提交”闭环,沟通成本低。 -
一旦项目并行分支多、质量门槛高,专用 Agent(如混沌工程猴子、依赖漏洞扫描器)会像 CI 里的 Job 一样自然出现。 -
关键不是“多”或“单”,而是“可验证交接物”是否像 feature_list.json那样无歧义。只要接口足够硬,100 个 Agent 也能跳广场舞;接口模糊,2 个 Agent 就会扯皮。
## 九、实用摘要 / 操作清单
-
把需求拆成“一条功能 = 一次 commit 可验证”的 JSON 清单。 -
首轮会话只搭脚手架:git、init 脚本、progress 日志、smoke 测试。 -
之后每轮严格 7 步:pwd → log → progress → init → smoke → 选功能 → 写&测&提交。 -
禁止改清单描述,禁止一次勾选多项功能。 -
用端到端测试(Puppeteer/硬件波形/回测脚本)盖章后,才能把 passes改true。 -
每轮结束 push 远程仓库,防止本地容器灰飞烟灭。 -
当所有 passes为true,打 tag 收工。
## 十、一页速览(One-page Summary)
口诀:清单驱动 + 小步提交 + 端到端测试 = 长时 Agent 不死秘籍。
## 十一、FAQ
-
Q:JSON 清单多大算合适?
A:单文件 <1000 行,人类可快速滚动检查;过大可按业务子域拆feature_chat.json、feature_auth.json。 -
Q:Agent 还是忘记拉最新代码怎么办?
A:在 prompt 里把git pull --rebase写在第 2 步,与git log绑定,不允许跳过。 -
Q:Puppeteer 无法捕获浏览器原生 alert,会导致漏测吗?
A:会。替代方案:禁止用 alert,改用可 DOM 查询的自定义 Modal;或让 Agent 先注入window.alert = () => {}覆盖并记录调用。 -
Q:可以换成 Markdown 清单吗?
A:实验表明 Markdown 被误改概率高 3×,除非你的 Agent 对 frontmatter 有专门解析器,否则建议 JSON。 -
Q:多分支并行开发怎么玩?
A:给每条功能再补一个"branch": "feat/xxx"字段,Agent 在 commit 前自动git checkout -b,完成功能后 PR 合并,主干永远保持 smoke 通过。 -
Q:非 Web 项目没有“按钮”可点,怎么做端到端?
A:把“可验证输出”定义为文件哈希、数值指标、波形断言即可;核心是让测试脚本返回 0 或 1。 -
Q:为什么非要人类可读的 progress 文本,而不用数据库?
A:文本文件能被 Agentcat直接读,无需额外驱动;同时人类 Code Review 时一眼看懂,降低心理门槛。
>
文末彩蛋:如果你只记住一句话——“把需求切成一条条二进制可判的 PASS/FAIL,让 Agent 像打怪升级一样刷清单”,就已经掌握了长时 Agent 的 80% 生存率。祝你的 AI 项目也能一次跑完全马,不再“跑到一半失忆”。

