核心问题:当上下文窗口只有 8 k/32 k/200 k 时,怎样让 AI Agent 在数小时甚至数天的多轮会话里,不丢记忆、不重复踩坑、不提前“交卷”?


## 本文欲回答的核心问题

  1. 为什么“长时 Agent”总在下一轮回合失忆?
  2. Anthropic 如何用“初始化器 + 编码器”双角色套路把 Claude 从“一夜暴毙”拉回“可持续交付”?
  3. 这套套路里,哪 5 份文件、4 个失败模式、3 条自检流程最值得照抄?
  4. 如果你要把方案搬到科研、金融等非 Web 场景,又该保留哪些骨架、替换哪些血肉?

## 速览摘要(TL;DR)

  • 把一次史诗级需求拆成 200+ 条可验收功能 → JSON 列表,状态只有 false/true,谁也别改描述。
  • 第一轮会话只干“搭脚手架”:建 Git 仓库、写 init.sh、把功能列表和 claude-progress.txt 一并提交。
  • 后续每轮会话只看一条功能,测完再 commit;push 前跑一遍端到端 Puppeteer 测试,防止“代码过了、产品挂了”。
  • 通过“git 日志 + 进度文件”替代超长上下文,Agent 重启后 30 秒就能续盘。
  • 提前把启动脚本、测试指令、文件目录都固化,省得 Agent 把时间浪费在猜命令行。

## 一、长时 Agent 的“三板斧”为什么总会断

  1. 想一口吃成胖子:一次会话里同时写前端路由、后端 API、数据库迁移,结果窗口爆满,中途断档。
  2. 下一班“工人”失忆:新会话只拿到半截 diff,没有需求蓝图,只能凭幻觉续写。
  3. 提前开香槟:看到 UI 像那么回事,就把功能标 done,结果主流程走不通。

>

反思:我们总以为“上下文压缩”是银弹,但压缩后丢掉的往往是“为什么当初这么写”——而这是后续调试最昂贵的信息。


## 二、双角色模型:Initializer vs. Coding Agent

角色 出场次序 唯一任务 关键交付物
Initializer Agent 第 1 个会话 搭脚手架、拆需求 feature_list.jsoninit.sh、Git 初始提交
Coding Agent 第 2…N 会话 一次只啃一条功能 可运行的代码、测试截图、claude-progress.txt 更新

>

注:两份 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 模板即可:

  1. pwd → 确认工作目录
  2. git log --oneline -10 → 读懂昨天写到哪
  3. cat claude-progress.txt → 快速人话版摘要
  4. bash init.sh → 拉起服务
  5. node tests/puppeteer.smoke.js → 验环境没崩
  6. jq '.[] | select(.passes==false)' feature_list.json → 挑最高优先级的 false
  7. 写代码 → 跑测试 → git commit -m "feat-x: ..." → 写 progress 日志 → push

>

学到的教训:把“先验证再动手”写成硬性顺序,比口头提醒“记得测试”有效十倍——Agent 不会偷懒,但会误判“我已经测过了”。


## 五、4 种典型失败模式与速效解药

失败模式 症状 解药(文件/指令)
提前交卷 看到 UI 成型就把 passestrue 强制跑完 Puppeteer 测试才准改状态
环境脏乱 下一轮回合 npm start 报错 init.sh 固定版本 + 首轮提交 lock 文件
重复施工 新 Agent 把老功能重写一遍 claude-progress.txt 写清“已落地”边界
窗口爆炸 一次想写 5 个组件,结果 200 k tokens 打满 feature_list.json 只让选一条

## 六、场景化示例:克隆 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 全部 passestrue
  • 打 tag v1.0.0,推生产分支

>

反思:把“大目标”转成“可勾选清单”后,Agent 不再纠结“我做到哪儿算完”,而是像流水线工人一样,只要还有 false 就继续领下一张工票——这种“游戏化”进度条对人类同样有效。


## 七、把套路搬到科研 / 金融 / 硬件仿真,要改哪几块砖?

领域 保留骨架 替换血肉
科研实验 feature_list.json → 实验步骤清单;Puppeteer → 实验数据自动校验脚本 init.sh 改成 conda 环境 + 实验仪器驱动
金融建模 清单变为“数据清洗→因子构造→回测→绩效分析”四阶段 用 Jupyter + Papermill 代替 React 服务器;测试用“回测夏普 > 0”断言
硬件 RTL 功能点拆为模块信号波形; smoke test 换成 RTL 仿真通过的 .fst 波形文件 把 git 换成支持大文件的 Git-LFS

共通原则:

  1. 需求颗粒度 = 一条命令能验证的最小单位。
  2. 环境可冷启动 ≤ 5 分钟,否则 Agent 会“磨洋工”。
  3. 结果必须二进制可判(PASS/FAIL),别让 Agent 做主观阅读题。

## 八、作者手记:单智能体 vs. 多智能体,未来谁主沉浮?

Anthropic 在文末抛出一个开放问题:要不要把“测试、QA、代码清理”拆成专职 Agent?
我的看法:

  • 当前单 Agent 已能把“写+测+提交”闭环,沟通成本低。
  • 一旦项目并行分支多、质量门槛高,专用 Agent(如混沌工程猴子、依赖漏洞扫描器)会像 CI 里的 Job 一样自然出现。
  • 关键不是“多”或“单”,而是“可验证交接物”是否像 feature_list.json 那样无歧义。只要接口足够硬,100 个 Agent 也能跳广场舞;接口模糊,2 个 Agent 就会扯皮。

## 九、实用摘要 / 操作清单

  1. 把需求拆成“一条功能 = 一次 commit 可验证”的 JSON 清单。
  2. 首轮会话只搭脚手架:git、init 脚本、progress 日志、smoke 测试。
  3. 之后每轮严格 7 步:pwd → log → progress → init → smoke → 选功能 → 写&测&提交。
  4. 禁止改清单描述,禁止一次勾选多项功能。
  5. 用端到端测试(Puppeteer/硬件波形/回测脚本)盖章后,才能把 passestrue
  6. 每轮结束 push 远程仓库,防止本地容器灰飞烟灭。
  7. 当所有 passestrue,打 tag 收工。

## 十、一页速览(One-page Summary)

组件 目的 模板文件名
需求清单 防提前交卷、防漏功能 feature_list.json
进度日志 替代上下文记忆 claude-progress.txt
一键启动 缩短环境冷启动 init.sh
冒烟测试 确保新功能不炸旧功能 tests/*.smoke.js
Git 历史 可追溯、可回滚 git log / git diff

口诀:清单驱动 + 小步提交 + 端到端测试 = 长时 Agent 不死秘籍。


## 十一、FAQ

  1. Q:JSON 清单多大算合适?
    A:单文件 <1000 行,人类可快速滚动检查;过大可按业务子域拆 feature_chat.jsonfeature_auth.json

  2. Q:Agent 还是忘记拉最新代码怎么办?
    A:在 prompt 里把 git pull --rebase 写在第 2 步,与 git log 绑定,不允许跳过。

  3. Q:Puppeteer 无法捕获浏览器原生 alert,会导致漏测吗?
    A:会。替代方案:禁止用 alert,改用可 DOM 查询的自定义 Modal;或让 Agent 先注入 window.alert = () => {} 覆盖并记录调用。

  4. Q:可以换成 Markdown 清单吗?
    A:实验表明 Markdown 被误改概率高 3×,除非你的 Agent 对 frontmatter 有专门解析器,否则建议 JSON。

  5. Q:多分支并行开发怎么玩?
    A:给每条功能再补一个 "branch": "feat/xxx" 字段,Agent 在 commit 前自动 git checkout -b,完成功能后 PR 合并,主干永远保持 smoke 通过。

  6. Q:非 Web 项目没有“按钮”可点,怎么做端到端?
    A:把“可验证输出”定义为文件哈希、数值指标、波形断言即可;核心是让测试脚本返回 0 或 1。

  7. Q:为什么非要人类可读的 progress 文本,而不用数据库?
    A:文本文件能被 Agent cat 直接读,无需额外驱动;同时人类 Code Review 时一眼看懂,降低心理门槛。


>

文末彩蛋:如果你只记住一句话——“把需求切成一条条二进制可判的 PASS/FAIL,让 Agent 像打怪升级一样刷清单”,就已经掌握了长时 Agent 的 80% 生存率。祝你的 AI 项目也能一次跑完全马,不再“跑到一半失忆”。