Claude Code爆火背后:Agent Harness底层逻辑深度解析
两年过去了,用大模型写代码早已从新鲜事变成常规操作。从简单的代码补全到解决 GitHub issue、从竞赛编程到仓库级软件工程,圈内习惯用一个直白指标评估 coding agent:代码写对没?测试跑了没?
但换个角度想想:Claude Code、Codex 这类系统正在把焦点推向更底层的维度。真正强大的 coding agent,核心能力远不止“写代码”。它必须在长时间窗里持续做这些事:读仓库、做计划、改文件、跑命令、看报错、修失败、维护上下文,并在多轮反馈中一步步推进任务。
这套让模型长期稳定“跑起来”的执行基础设施,就是 Agent Harness。过去聊 harness,重点常放在模型外面包什么东西上:工具、API、沙箱、记忆、权限边界、验证器、反馈循环。这些回答的是“一个可用的 Agent 需要哪些系统组件”。
但 UIUC、Meta 和斯坦福联合发布的这份 102 页综述,标题就叫《Code as Agent Harness》。它提出了一个更本质的问题:当 Agent 被投放到长期任务环境时,真正把推理、行动、反馈、验证和协作串联起来的操作对象是什么?
答案是:代码。
- 论文标题:Code as Agent Harness
- 论文:https://arxiv.org/pdf/2605.18747
- GitHub 仓库:https://github.com/YennNing/Awesome-Code-as-Agent-Harness-Papers
这里的代码,绝不只是模型最后产出的那一段程序,也不仅仅指 Agent 框架本身由代码写成。它代表的是 Agent 在 harness 内不断生成、运行、修改、保存和共享的一系列代码化中间产物:Plan.md、测试脚本、shell 指令、补丁(patch)、执行日志、工作流、技能库、仿真器、验证器,甚至包括仓库共享状态。
传统代码生成里,代码通常是模型的最终交付物;但在 Agent Harness 的语境下,代码进入整个执行循环,承载着计划、执行、反馈、验证和状态管理,正逐步演化为组织长期执行流程的核心媒介。
简而言之,这篇综述将代码定义为 Agent 系统中一种可执行、可检查、有状态的媒介,并围绕接口、机制、多 Agent 扩展三个层面展开深入探讨。
为什么 Harness 必须拿代码当核心载体?
一个纯粹的大语言模型,本质上没有状态。它能根据上下文生成后续文本,却不会自动记录任务进度,也无法维护外部世界的状态变化。Harness 的核心作用,就是把模型接入一个真实的执行环境中。
为什么非代码不可?因为代码具备自然语言无法企及的三大硬属性:可执行、可检查、有状态。
可执行,让模型的意图落地为真实操作。一份计划不再只是“我将修改文件”,而是能变成 shell command、patch 或测试脚本。可检查,意味着执行过程产生客观反馈。编译错误、运行时异常、测试结果、日志和跟踪记录(trace),都向系统反馈当前状态,而非依赖模型自圆其说。有状态,确保任务进度能持久化。仓库、文件系统、配置、测试、提交历史(commit history)、技能库(skill library)都能记录 Agent 做了什么、在哪失败、下一步该从何继续。
因此,这份 survey 与一般 harness 综述的最大区别,不是罗列工具、记忆和沙箱,而是把代码置于中心位置:代码,是 harness 中最稳定、最可操作的状态载体。
代码如何打通 Harness 的接口?
综述的第一层,聚焦于 Harness Interface:代码如何成为模型与外部世界之间的桥梁。
首先,代码让推理变得可执行。过去模型依赖自然语言做 Chain-of-Thought 推理,文本推理难以验证。PoT、PAL 等方法将中间推理转化为程序,由解释器执行计算;Lean/Coq 相关工作更进一步,把推理变成机器可校验的证明过程。关键不在于“模型会写程序”,而在于推理本身被外部化为一个可执行对象。
其次,代码让行动得以真正落地。对于 Claude Code 或 Codex,行动不是一句“我会修复 bug”,而是实际修改文件、运行测试、分析报错、再生成补丁。机器人领域,SayCan、Code as Policies、Voyager 等案例展示了另一种形态:语言目标被转为技能调用、控制脚本或可复用函数。
第三,代码让环境可被建模。Agent 长期运行,必须感知环境状态。软件仓库、测试结果、执行日志、DOM tree、仿真器、数据分析脚本,都能成为 Agent 理解世界的结构化表示。SWE-bench、AgentBench 这些可执行评测环境正是基于此——任务不再是静态问答,而是在可执行环境中动态完成。
代码融入 Harness Interface 后,推理不再是纯文本,行动不再是口头承诺,环境也不再是静态描述。它们全部变成了可执行、可检查、可更新的状态。
Harness 如何用代码管理状态与反馈?
真实任务极少能一步到位。修复一个 bug,往往需要多次定位、修改、测试和回滚;操作网页系统,要跨多个页面和工具;做科学实验,得提出假设、运行模拟、分析数据,再根据结果调整下一步。
此时,关键不只在于模型更强,而在于 Agent 每一步能否被组织进一个可控的执行循环里。
Planning 不再只是模型脑内的计划,它能变成 Plan.md、工作流或可执行任务图。Memory 也不仅仅是“更大的上下文窗口”,而是决定哪些仓库证据、执行日志、失败经验、历史补丁该被保存、压缩或卸载到外部状态中。Tool use 也不只是 API 调用,而是通过终端、沙箱、测试框架、静态分析器等工具,去改变外部世界。
其中最核心的,是Plan-Execute-Verify 循环。计划划定操作范围,执行在沙箱或受限环境进行,验证依赖测试、linter、静态分析和运行日志。SWE-agent、OpenHands 这类系统之所以重要,不仅因为它们会调用工具,更因为它们把“写代码 — 运行 — 失败 — 修复”组织成可重复的状态转移过程。
成熟的 Agent,不会惧怕报错。报错、测试失败和执行日志,正是代码 harness 控制 Agent 行为、使其逐步收敛的反馈传感器。
多 Agent 协作时,代码就是共享基底
当任务复杂到单个 Agent 搞不定,多 Agent 协作自然成为方向。一个 Agent 当 manager,一个做 planner,一个写代码,一个写测试,一个做 reviewer。
但多 Agent 的真正难点,不是“多叫几个模型讨论”,而是它们如何共享同一个世界状态。
如果多个 Agent 只靠聊天记录协作,极易出现状态发散:每个 Agent 都觉得自己理解了当前进展,但代码到底被改成了什么样、测试失败在哪、哪些修改已生效,它们之间可能没有共同认知。
代码恰好提供了更稳定的共享基底。仓库、测试、PR、issue、CI log、review comment、执行 trace,都能成为多个 Agent 共同读写和验证的对象。真正的协作不是“互相说服”,而是围绕共享程序状态不断收敛。
多 Agent 系统的共同语言,不应只是自然语言对话,而应该是可执行的共享代码状态。
从 Claude Code 到机器人:代码正在演变为 Agent 的操作系统
Code as Agent Harness 这个思路先由 coding agent 凸显,并不意外。软件世界天然可执行、可测试、可回滚、可记录,是最适合 Agent 落地的样板间。
但这个趋势远不止于写代码。在 GUI/OS Agent 领域,网页和操作系统正被转化为可编程环境,DOM tree、accessibility tree、Playwright 脚本让界面操作变为可执行状态转移。在机器人领域,语言意图需转为技能库、控制脚本和仿真反馈,抽象目标只有落到可执行代码里,才能被物理约束校验。在科学发现中,假设、实验、模拟、数据分析和实验记录能组织成代码流水线,Agent 不只是生成想法,而是通过可执行 pipeline 推动发现进程。
因此,未来许多 Agent 不一定都叫 coding agent,但它们大概率会运行在某种 code-centric harness 之上。
模型像大脑,harness 像身体和神经系统;而代码,就是那个把大脑、身体、反馈和记忆连接起来的操作系统。
开放问题:下一代 Agent 不能只评测最终结果
当 Agent 变为长期执行系统,评测方式也必须跟着转变。过去的 benchmark 主要看最终结果:答案对不对、测试过没过、任务完成没。但对 code-harnessed agent,这远远不够。
举个例子:一个 Agent 可能最终通过了测试,但过程中大搞危险修改、污染共享状态,或引入隐藏的回归缺陷。另一个 Agent 可能没完成任务,但执行轨迹清晰、失败原因明确、状态可恢复。在真实部署环境里,后者未必更差。
论文因此抛出几个开放问题:如何做 harness-level evaluation,不只评估最终输出,也评估计划、工具调用、状态转移和反馈使用;如何处理不完整反馈(incomplete feedback),测试通过不代表程序真正正确;如何实现无回归的自我进化(regression-free self-evolution),避免 harness 在自我优化中引入新失败模式;如何解决多 Agent 共享状态中的语义冲突;以及如何将人机协同(human-in-the-loop)变成可记录、可追责、可验证的系统状态。
AI Agent 的下一步,不只是让模型更会回答,而是让整个代码化执行过程变得更可检查、更可恢复、更可治理。
过去,代码是模型的考题。
现在,代码正在成为 Agent 的操作系统。






