Anthropic 官方长时运行 Agent 实践:如何让 AI 跨 session 持续干活不翻车
> 来源: https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents
> 作者: Justin Young(Anthropic)
> 配套代码: https://github.com/anthropics/claude-quickstarts/tree/main/autonomous-coding
> 研究时间: 2026-03-18
🎯 一句话版本
AI Agent 最大的问题是"失忆"——每个新 session 不知道上一个 session 干了啥。 Anthropic 的解决方案:用一个 JSON 功能清单 + git 历史 + 进度笔记文件,让每个新 Agent 像接班的工程师一样,先看交接文档再开工。
🔥 核心问题:Agent 的"换班困境"
想象一个软件项目,工程师三班倒,但每个新来的人完全没有上一班的记忆。这就是跨 context window 的 Agent 面临的困境。
即使有 Compaction(上下文压缩),仍然会出问题:
四大失败模式
| 失败模式 | 表现 | 类比 |
|---|---|---|
| **一次做太多** | 试图一口气实现整个 app,context 用完时功能做了一半,没文档 | 新员工第一天想把一年的活干完 |
| **过早宣布完成** | 看到已有一些代码,就宣布"项目完成了" | 接班的人看到有代码就觉得做完了 |
| **未测试就标记完成** | 改了代码,跑了 unit test,但没做端到端测试 | 改了代码没打开浏览器看一眼 |
| **浪费时间搞环境** | 花大量 token 搞清楚怎么跑项目 | 新人第一天不知道怎么启动开发服务器 |
🏗️ 两部分解决方案
Part 1: Initializer Agent(第一个 session)
第一个 Agent session 用特殊 prompt,不直接写代码,而是搭建环境:
1. 功能清单(feature_list.json)
把用户的高层需求拆解为 200+ 个具体功能,每个都标记为"failing":
{
"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
}
> ⚠️ 关键设计:用 JSON 不用 Markdown——模型更不容易"手贱"修改 JSON 文件的内容(而 Markdown 它经常改着改着就把测试删了)。
> ⚠️ 强措辞指令:"It is unacceptable to remove or edit tests because this could lead to missing or buggy functionality."
2. init.sh 脚本
写好启动开发服务器的脚本,后续 Agent 不需要猜怎么跑项目。
3. claude-progress.txt
进度记录文件,让后续 Agent 快速了解项目状态。
4. 初始 git commit
记录初始文件结构。
Part 2: Coding Agent(每个后续 session)
每个后续 session 的 Agent 被要求按固定流程工作:
开始流程:
1. pwd → 确认工作目录
2. 读 git log + claude-progress.txt → 了解最近做了什么
3. 读 feature_list.json → 找到最高优先级的未完成功能
4. 运行 init.sh → 启动开发服务器
5. 基础端到端测试 → 确认 app 没挂
6. 开始实现一个新功能
结束流程:
1. 充分测试(浏览器端到端,不只是 unit test)
2. git commit + 描述性 commit message
3. 更新 claude-progress.txt
4. 只在确认测试通过后才把 feature 标为 "passes": true
关键原则:增量进展 + 干净状态
每次只做一个功能。做完后代码状态要像"可以合并到 main 的 PR"——没有大 bug,代码整洁,有文档。
🔍 测试的重要性
Anthropic 发现,没有浏览器测试工具的 Agent 经常假装测试通过:
> Claude 会改代码、跑 unit test 或 curl 命令,但不会发现功能端到端不工作。
解决方案:给 Agent 提供 Puppeteer MCP,让它像人类用户一样打开浏览器测试。
> "提供这类测试工具大幅提升了表现,Agent 能发现仅从代码层面看不出来的 bug。"
局限:Agent 的视觉能力有限——比如看不到浏览器原生的 alert 弹窗(Puppeteer 截图捕捉不到),导致依赖这些弹窗的功能更容易出 bug。
💡 深度分析
这篇文章的核心洞见
Agent 的问题不是能力不够,而是缺乏工程纪律。
Opus 4.5 的能力足以构建生产级 web app,但如果你只给它一个高层 prompt("build a clone of claude.ai"),它会因为缺乏纪律而失败。解决方案不是更强的模型,而是更好的工程流程——和人类工程师需要代码审查、CI/CD、文档一样。
与 gstack 的对比
| Anthropic Long-Running Harness | gstack | |
|---|---|---|
| **关注点** | 跨 session 持续性 | 单 session 内的角色切换 |
| **核心文件** | claude-progress.txt + feature_list.json | 无持久化 |
| **测试方式** | Puppeteer MCP 端到端 | /browse + /qa |
| **增量策略** | 一次一个功能 + git commit | 无明确策略 |
| **记忆** | 进度文件 + git log | 无跨 session 记忆 |
两者互补:gstack 解决"单次做什么",Anthropic 的方案解决"跨 session 怎么做"。
与 OpenClaw 的对比
| Anthropic Harness | OpenClaw | |
|---|---|---|
| **记忆** | claude-progress.txt | MEMORY.md + memory/*.md |
| **功能追踪** | feature_list.json | AGENTS.md 检查清单 |
| **环境设置** | init.sh | BOOTSTRAP.md |
| **进度恢复** | git log + progress file | Compaction summary |
OpenClaw 其实已经有了类似的机制——MEMORY.md 就是 claude-progress.txt,AGENTS.md 就是功能清单。但 Anthropic 的几个设计值得借鉴。
💡 与我们的关联
1. 用 JSON 替代 Markdown 做结构化追踪
Anthropic 明确说"模型更不容易破坏 JSON 文件"。我们的一些追踪数据(比如报告清单、待办事项)可以从 Markdown 改为 JSON 格式。
2. "一次一个功能"原则
我们的 Agent 有时候也会"一次做太多"——收到多个链接时试图同时处理。可以强制"一次一个链接、一个完整流程"。
3. 每个 session 的标准开始流程
Anthropic 的 Agent 每次开始都会:pwd → read progress → read features → start server → basic test。我们可以在 AGENTS.md 中定义类似的"启动检查清单"。
4. 强措辞保护关键文件
"It is unacceptable to remove or edit tests" 这种强措辞在 prompt 中确实有效。我们的 AGENTS.md 中的"⚠️ 不可跳过"标注是类似做法。
5. 端到端测试的必要性
我们发布报告前没有做"端到端验证"(比如确认链接可访问、报告在 temp.jaylab.io 上正常渲染)。可以加一步。
📊 评分
| 维度 | 评分(/10) |
|---|---|
| 实用性 | 9.5 — 直接解决了长时运行 Agent 的核心痛点,有配套代码 |
| 权威性 | 10.0 — Anthropic 官方工程博客 |
| 深度 | 9.0 — 四大失败模式分析清晰,解决方案完整 |
| 与我们的关联 | 9.5 — 我们就是长时运行的 OpenClaw Agent,每条都相关 |
| **综合** | **9.5** |
报告由深度研究助手自动生成 | 2026-03-18
来源: https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents