长时应用开发的 Harness 设计

原文:Harness design for long-running application development

导读

本文围绕长时应用开发讨论 harness 设计:如何把目标、状态、工具、验证和恢复机制组织起来,让 agent 能跨多轮持续推进真实软件工程任务。

说明:本文按 Agent Learning 的中文阅读页格式,对原文结构与关键技术细节做逐节中文转述与解读;为避免整篇镜像转载,正文保留原文章节脉络、关键数字和术语,但不做逐字复刻。

核心观点

正文

原文主线

本文围绕长时应用开发讨论 harness 设计:如何把目标、状态、工具、验证和恢复机制组织起来,让 agent 能跨多轮持续推进真实软件工程任务。

为什么应用开发需要 harness

应用开发任务往往跨越多个文件、多个测试循环和多个设计决策。模型如果只依赖当前 context window,很容易忘记早期约束,或者在修复一个 bug 时破坏另一处行为。harness 的作用,是把这种长链路工作组织成可观察、可恢复、可验证的系统。

与短任务不同,长时开发的难点不只是生成代码,而是持续维护问题边界。agent 需要知道当前目标是什么、哪些假设已经被验证、哪些命令失败过、哪些文件属于修改范围,以及何时应该停止。

状态分层

一个实用 harness 应把状态分成几类:用户目标、实现计划、项目事实、执行日志、测试结果和开放问题。用户目标通常变化慢,执行日志变化快;把它们混在同一个聊天历史里,会让 context 变得嘈杂。

更稳的做法是让 agent 在关键节点写出结构化 notes,例如当前策略、已修改文件、失败测试、下一步动作和需要用户判断的问题。compaction 时优先保留这些结构化事实。

工具与验证

开发 harness 的工具不应只是 shell。它还需要清晰的读文件、搜索、patch、测试、截图、服务启动和 diff 查看能力。每个工具返回值都应该帮助下一步决策,而不是把无关日志全部塞进 context。

验证是 harness 的中心。没有测试命令、构建命令或手工验收步骤,agent 会倾向于把“代码看起来合理”误认为完成。长时任务里,每个阶段都应该有局部验证,最终再做全局验证。

恢复与人类介入

长任务一定会失败:命令超时、依赖缺失、测试 flaky、需求理解偏差、权限不足。harness 应把失败转化为可恢复状态,而不是让 agent 不断重试同一路径。checkpoint 和 rewind 可以让探索保持低成本。

人类介入不应只在失败后出现。更好的点位是:需求含糊时、需要修改公共接口时、需要提升权限时、需要删除数据时、以及准备发布前。这样 harness 既保护系统,也不会把 agent 绑到无法行动。

深度解读

这篇主题的关键,是把 agentic coding 从“模型会写代码”推进到“系统能持续承载开发过程”。长时任务中,真正稀缺的不是单次生成能力,而是连续性:目标连续、状态连续、验证连续、责任边界连续。harness 就是这种连续性的工程化载体。它不应该过度控制模型,而应该给模型一个可靠的工作台:能查事实、能动手、能验证、能回滚、能在不确定时找人。做到这一点,agent 才能从代码补全工具变成真正的开发协作者。

落地启示