Harness Engineering:把 11 个 coding agent 拆开看看
今年 1 月我写过一篇,说 agent 能不能从 demo 走到真正上线,关键就在 harness,也就是模型外面那一层。7 月有篇论文把 11 个 coding agent 拆开,挨个读了源码,想看看这一层里到底装了些什么。
论文叫《Harness Engineering: Anatomy, Architecture, and Evolution of Coding Agents》,作者有四位:Paul Barbaste、Tristan Darrigol、Germain Vu 和 Tom Wiltberger,来自 Wavestone AI Lab 和 Inclusive Brains。他们没去跑 benchmark。每个系统的源码他们都读了一遍,加起来大约 400 万行 Python、TypeScript 和 Rust,然后比较各家是怎么搭起来的。
他们看了哪些系统
一共 11 个生产级的 coding harness。四个是模型厂商自己做的:Claude Code、Codex CLI、Gemini CLI 和 Mistral Vibe。另外七个是开源的:OpenHands、Aider、Mini-SWE-Agent、Hermes、Pi、OpenCode 和 OpenClaw。他们还看了 Databricks 的 Omnigent,它架在别的 harness 上面,专门用来跑这些 harness,后面再细说。
他们对 agent 的定义一句话就能说完:agent 就是模型加 harness。所谓 harness,就是模型以外的所有东西,包括循环、工具、上下文、安全控制、编排,还有各种扩展方式。
每个 harness 都绕不开这七块
小到 100 行的脚本,大到上百万行的 CLI,每个系统都得在这七块上表个态,哪怕态度就是“这块我们没有”。

具体到每一块,各家的做法能差得非常远。比如工具,Mini-SWE-Agent 就只有一个 bash,Claude Code 有 43 个带类型定义的工具,而且大部分是用到了才加载。再比如记忆,Mini-SWE-Agent 把全部历史放在一个列表里,Codex 在 sandbox 里专门跑了一个子 agent 来管跨 session 的记忆,记忆放在一个用 git 跟踪的存储里。安全这块,Mini-SWE-Agent 只有花费上限和步数上限,Codex 有策略规则、一个负责审批的 LLM,还有覆盖三个平台的 OS 级 sandbox。
我印象最深的五点
1. 循环本身最不值钱
Mini-SWE-Agent 只有 100 行左右的 Python,它的作者自己报的 SWE-bench Verified 成绩在 74% 以上,跟比它大一千倍的系统是一个水平。循环写得再花哨,也换不来更高的分数。
那剩下的上百万行代码都花在哪了?花在了安全、用户体验和可扩展性上,客户端的比重也越来越大。拿 OpenCode 来说,不算测试的话,大约五分之三的代码都是客户端:TUI、Web、桌面端和 SDK。
2. 没人用 agent 框架,也没人用 RAG 查代码
这 11 个系统,没有一个依赖通用的 agent 框架。LangChain、LangGraph、AutoGen、CrewAI,加上他们查过的另外十来个,一个都没用上。Gemini CLI 连 Google 自家的都没用。所有循环都是手写的 async 代码。
检索代码也没有一个用 embedding 的。大家靠的是 ripgrep、glob、tree-sitter,再加上
AGENTS.md、CLAUDE.md 这类 Markdown 文件,harness 会自己把它们读进来。论文有个脚注提到一件挺讽刺的事:“harness engineering”这个词本身就是在 LangChain 内部定义的,可这些系统里没有一个用到 LangChain 的库。LangChain 后来干脆自己也做了一个 harness,叫 Deep Agents。
3. Skill 反超了 MCP
11 个系统里有 9 个支持
SKILL.md 形式的 skill,比支持 MCP 的还多一个。现在 skill 已经有了 registry 和信任分级,第一批 agent 自己写的 skill 也开始冒出来了。4. 90 天里,各家从越做越像变成了直接照抄
这篇论文 4 月就出过一版,当时已经分析过其中 8 个系统,所以作者能拿同一套代码隔三个月 diff 一下。就在这三个月里,Codex 一字不差地照搬了 Claude Code 的 hook 事件名,还出了个导入工具,能把 Claude Code 的 session 和设置导进来。OpenHands 用上了 Claude Code 的 plugin 格式。Codex 自己的 Rust 代码也从 62.1 万行涨到了大约 112 万行。
用作者的话说:“这个领域里,差异化优势的半衰期,现在是按周算的。”
规则也在往 prompt 外面搬。Codex 最新的 prompt 删掉了“不要 commit”和“不要画蛇添足”这两条,换成了 feature flag。Mistral Vibe 也把“Never Commit”这条规则删了。也就是说,策略正在从 prompt 挪进配置。写在 prompt 里,是给模型看的,写进配置,平台才会强制执行。
5. Harness 变成了平台
Omnigent 把 11 家厂商的 harness 包在同一个 API 后面。比如可以让 Claude Code 当 orchestrator,把活派给 Codex,再让 Cursor 来 review。同一套策略借着各家自己的 hook,对所有 harness 都生效。每个 adapter 都要测流式输出、工具调用、中断,还有被策略拦下的情况。论文的原话是:“harness 是当硬件来测的。”
这正是论文的核心观点:厂商现在拼的,是 agent 循环外面那一圈生态,也就是 plugin、plugin 市场、导入工具,还有治理。
他们建议怎么做
论文最后列了 18 条建议,每条都能对上具体的代码,可以自己去读。下面这几条,我会抄到便利贴上:
- 先用一个 while 循环加一个 bash 工具起步。等真有任务因为缺工具失败了,再加新工具。
- 工具超过 15 个左右,就改成懒加载。Claude Code 就是这么做的,第一个 prompt 小了大约 40%。
- 用前沿模型改代码,就用精确的字符串替换,要换的那段原文在文件里必须唯一。千万别按行号改。
- 项目级、用户级的 Markdown 上下文文件都要读进来,别家 harness 约定的文件名也顺手支持上。
- 离上下文上限还剩一段固定余量,就做 compaction。最近几轮原样保留,摘要接着上一版往下合,别每次推倒重来。
- 代码检索别上 RAG,ripgrep 和 tree-sitter 就够了。
- 安全规则要写成数据。如果提供 YOLO mode,也得给它留一条底线。
- 能用单 agent 就别上多 agent,除非真有一个广度优先的阶段。多 agent 跑一次,烧的 token 大约是普通聊天的 15 倍。
- 工作流和各种经验做成 skill,接外部系统用 MCP。
论文还附了一个 90 行的 Python harness,18 条里实现了 10 条。它的核心循环简化一下是这样的:
我的收获
1 月那篇里,我引过 Anthropic 的建议:先从最简单、能跑通的工作流做起,等问题真需要了,再给 agent 更多自主权。这篇论文最后也落到了同一条建议上,只不过背后是 400 万行生产代码。作者还提到,Anthropic 那几篇 Effective Agents 文章跟这 11 个系统的做法很吻合,而 11 个里只有一个是 Anthropic 自己做的。
我自己的变化是,注意力要换个地方放了。讲循环、讲编排模式的东西我读了不少,可从代码看,真正费功夫的活在别处:权限、sandbox、compaction、编辑格式,还有让别的工具能接进来的胶水代码。
论文自己也提了两点局限。一是 Claude Code 那部分分析,用的是 2026 年 3 月流传出来的一份源码快照,不是官方发布版,所以说到可复现性,这是全文最弱的一环。二是 benchmark 数字都是各个项目自己报的。
作者还有个观点,我想记下来。像工具数量、版本号这种清单类的结论,几周就会过时。像那七块、那两样没人用的东西,这类结构性的结论到现在都还站得住。读任何讲 agent 的文章,都可以用这个眼光去看,我这篇也一样。
论文:Paul Barbaste 等,Harness Engineering: Anatomy, Architecture, and Evolution of Coding Agents,arXiv 2609.00006,2026 年 7 月。CC BY 4.0。
封面:Eadweard Muybridge,The Horse in Motion,1878 年。马叫“Abe Edgington”,主人是 Leland Stanford,驾车的是 C. Marvin,地点是 Palo Alto 的赛道。一匹马,一副挽具(harness),一个驾车的人。美国国会图书馆藏,公有领域。