Skip to content

Anthropic《Effective harnesses for long-running agents》结构译述

本文基于 Anthropic 于 2025-11-26 发布的文章《Effective harnesses for long-running agents》进行结构化译述。正文以中文解读为主,保留少量关键英文原句,帮助读者抓住原文最核心的判断。

这篇文章的价值,在于它讲的不是“agent 很强”这件事,而是 agent 为什么在长任务上仍然会不断失速。很多团队现在已经能让 coding agent 在几十分钟内完成一些不错的工作,但一旦任务跨多个 context window,系统就会开始出现连贯性断裂、状态遗失和目标漂移。

Anthropic 试图解决的是这个更现实的问题:如果 agent 的工作跨度以小时甚至天来计算,怎样让它在一次次重新开始的 session 中仍然持续推进,而不是每次都半途而废、重复劳动或者误判项目已完成。

长时运行 agent 的关键,不只是上下文压缩,而是让每一轮 session 都能快速接手、明确目标、留下可读 artifacts,并在结束前把环境收回到一个干净可继续的状态。

先把真正的问题说清楚(对应原文:The long-running agent problem)

Section titled “先把真正的问题说清楚(对应原文:The long-running agent problem)”

Anthropic 开头给出了一个很形象的比喻:像一个软件项目由轮班工程师接手,但每个新工程师上班时都没有之前的记忆。原文中的短句 "work in discrete sessions" 非常关键,它提醒我们长任务 agent 的核心限制并不是“会不会写代码”,而是“能不能跨 session 保持有效连续性”。

文章强调,单靠 compaction 还不够。上下文压缩可以延缓窗口耗尽,但不足以解决中途遗失目标、留下半成品、下一轮接手困难的问题。实际失败模式主要有两种:一是 agent 想一次性把事情做完,最后在半路耗尽上下文;二是项目已经推进到一定程度后,后来的 session 误以为“差不多完成了”。

所以问题被拆成两部分:第一轮需要搭好基础环境,使后续 session 可以按 feature 逐步推进;每一轮 coding session 都要被约束成“做一点真实进展,并为下一轮留下清晰交接物”。

两段式 harness:initializer + coding agent(对应原文:引言与整体方案)

Section titled “两段式 harness:initializer + coding agent(对应原文:引言与整体方案)”

Anthropic 的解法不是单纯加长 Prompt,而是把长时 agent 拆成两个不同角色。原文里有一句短语很值得保留:"make incremental progress"。initializer agent 负责首轮环境搭建,把任务拆成可以追踪的结构;coding agent 负责每一轮稳步推进,并留下可读 artifacts。

这个思路的重点在于分工。initializer 不直接承担长期开发,而是先把任务结构化,让后续每轮都能“有东西可读、有东西可测、有下一步可做”。coding agent 则不再试图一次性完成整个产品,而是接受它只能做增量改进的事实。

这看上去像是在降低 agent 自由度,但实际上是在提高它跨 session 的总产出。因为真正拖垮长任务的,往往不是单次能力不足,而是 session 之间的衔接质量过低。

环境管理不是附属细节,而是 harness 的主体(对应原文:Environment management)

Section titled “环境管理不是附属细节,而是 harness 的主体(对应原文:Environment management)”

这一节非常实操。Anthropic 不是笼统地说“写点中间文件”,而是明确提出几个关键环境组件:feature list、progress notes、git history、可直接启动项目的 init.sh、以及能用浏览器自动化或其他手段执行的基本 end-to-end 检查。

feature list 的作用,是防止 agent 一开始就“one-shot”整个应用,或者过早判断项目已完成。Anthropic 在文章里让 initializer 生成了完整的 feature requirements,并把所有功能先标成未通过。这样做的价值不是文档完美,而是让后续每一轮都知道“还有哪些事情没完成”。

另一个关键组件是 progress notes。它解决的是接力问题,而不是记录问题。新一轮 session 要能快速知道上一轮做了什么、留下了哪些坑、当前项目是否已经处于可运行状态。没有这层交接物,后续 session 会先浪费大量 token 在重新理解局面上。

测试能力必须被放进 harness,而不是留给模型自己猜(对应原文:Environment management 中的 testing 部分)

Section titled “测试能力必须被放进 harness,而不是留给模型自己猜(对应原文:Environment management 中的 testing 部分)”

Anthropic 还特别强调,为 agent 提供明确的测试工具会显著提升效果。对 web app 场景,他们让 Claude 使用浏览器自动化工具,按真实用户路径去点击和验证。这样做的价值,在于很多 bug 根本不是从代码表面能看出来的。

这其实是在提醒工程团队:如果 harness 没有把“怎么验证结果”内置进去,模型就只能边做边猜。让 agent 自己想测试方法,成本高且不稳定;把测试路径写进环境和流程里,效果会可靠得多。

文章也没有把这件事说得过于乐观。它明确承认工具和视觉能力仍有限,有些浏览器原生弹窗或更细粒度的 UI 问题仍然不容易被抓到。这一点很重要,因为它提醒我们 harness 能提升下限,但不能替代所有验证层。

每轮 session 的标准开场动作(对应原文:Getting up to speed)

Section titled “每轮 session 的标准开场动作(对应原文:Getting up to speed)”

这一节非常像给长时 coding agent 写 SOP。每轮开始时先看当前目录、读 progress notes、读 feature list、看 git log、启动开发环境并跑一遍基础端到端测试。之所以这些动作看起来很“机械”,恰恰说明 Anthropic 把它们视为不应再让模型自由发挥的固定动作。

这个设计的本质,是把“重新熟悉现场”标准化。与其让每轮 agent 自己决定先看什么,不如把最值得看的状态材料、最先该做的基本检查明确规定好。这样不仅节省 token,也降低了接手失败的概率。

站在工程角度看,这部分特别像交接班制度。好的 harness 不是让模型显得更聪明,而是让它不必在最容易出错的地方重复做决策。

失败模式总结与未解问题(对应原文:总结表与 Future work)

Section titled “失败模式总结与未解问题(对应原文:总结表与 Future work)”

文章最后把几类常见失败模式和对应解决思路收束得很清楚:环境被留脏、进展没有记录、功能过早被标记完成、项目启动方式不明确等。Anthropic 给出的解法基本都是“把隐性经验变成显式 artifacts 或固定流程”。

同时,他们也承认还有开放问题。比如是否应该继续使用单一通用 coding agent,还是拆分成测试 agent、QA agent、cleanup agent 等更专门的角色。也就是说,这篇文章不是把问题彻底解决了,而是给出一个被验证过的强基线。

  • 长时 agent 的核心问题是跨 session 连贯性,而不是单轮写代码能力。
  • compaction 能缓解窗口压力,但不能替代明确的 handoff 结构。
  • initializer agent 的作用是搭任务环境和交接机制,不是直接完成产品。
  • feature list、progress notes、git log、init.sh 和基础测试脚本是高价值 artifacts。
  • 好的 harness 会把每轮接手动作标准化,避免模型在低价值环节重新摸索。

如果你们正在尝试让 coding agent 连续工作几个小时以上,这篇文章最值得立刻借鉴的不是某个 Anthropic 专用能力,而是它对交接材料的重视。很多团队把 attention 都放在 Prompt 和模型选择上,却低估了 progress file、feature checklist、固定启动脚本、最小回归测试这类“工程琐事”的价值。

真正能让 agent 持续推进的,往往不是更强的一次性推理,而是更像团队协作的 session handoff 机制。把这些结构补上,agent 的整体质量通常会比继续加长 Prompt 更稳定。

原文由 Anthropic Engineering 发布:

本文为结构化译述与观点整理。如需查看原文示例与更完整的上下文,请直接阅读原始页面。