Doc2Harness: Benchmarking LLMs on Long-Horizon Harness Engineering of Coding Agents
Yuyao Ge, Shenghua Liu, Peizhong Gao, Chendi Ge, Chenxu Liu, Yiwei Wang, Lingrui Mei, Baolong Bi, Jiayu Yao, Jiafeng Guo, Xueqi Cheng
cs.SE, cs.AI
2026-10-14
Doc2Harness 让模型按十二款 harness 合并后的规格,从约七十行接口骨架写出完整运行时,再用脚本 mock model 考三百二十八题。三次构建平均后,GPT-6 Astra 通过率 53.05%,Hy3 为 27.44%。
Coding agent 的成绩很大一块来自 harness。这层运行时包住模型,工具循环、权限、会话、上下文压缩和失败恢复都归它管。SWE-bench Pro、NL2Repo-Bench、Commit0 把 harness 钉死,只问下游任务过不过,这层软件由谁写出来不在考纲里。
仓库题的判分搬不过来。成熟项目可能反复出现在训练集里;harness 近几年才高频更新,更吃泛化。同一功能可以有很多种实现,固定接口的单元测试盖不住。harness 自己不完成下游任务,得拉一个驱动模型跑完会话才能判断。Doc2Harness 只测一件事:按规格从零写出 harness。中科院计算所牵头,清华、北大、东南大学参与。
两段各钉死一个部件。建造段用 OpenCode 1.17.0 做固定的 builder harness,不用 Claude Code 或 Codex CLI,免得厂商套件偏袒自家模型。
模型读开发文档和 contract skeleton。文档由十二款 harness 的用户文档合并消歧而成,包括 Claude Code、Kimi Code、Gemini CLI、Qwen Code、OpenCode、OpenClaw、Codex CLI、Aider、OpenHands、Cline、Crush、Cursor。同义命令收成一条,上下文压缩统一为 /compact。同名拆开:plan 在 Claude Code 中是只读权限,在 Aider 中接近角色分工,文档把权限和角色分开写。效果必须能从请求、磁盘文件、退出码、命令输出四条通道看到。
骨架是裁空的 mini-swe-agent,约五个 Python 文件、七十行,外加安装脚本、入口脚本和项目配置。命令行、headless 入口、评测 API 不许改。代表性成品约三十个文件、一万六千行,约 99.6% 为模型新写。
空容器除模型网关外断网。最多二十四轮,上下文到窗口百分之八十即压缩,限时两小时,至多提交三次。contract check 只验形式:能否编译安装、命令齐不齐、有没有占位 stub、三个接口在不在。通过即冻结。分数取模型宣布完成的那一版。
评测段一题一个隔离容器,mock model 按脚本跑完整段会话,真实模型的随机性进不来。超过九百秒记失败。自身通过且正控通过才算过,正控不进分母。
三百二十八题分三路合成:21083 条公开 issue,Claude Code、OpenCode、Gemini CLI、Kimi Code 分别为 9868、5438、4831、946;成熟源码按功能模块对照;从已能区分实现的种子出发,每次只改工具、输入形态、错误参数或返回位置中的一个。
正控堵空过。逃逸题里,读工具若任何文件都读不了,「没读到越界内容」也会成立。同形正控改用 bash 去读同一链接,确认文件其实可读;反向正控则确认工作区内的链接不会被一律拒绝。正控失败则同组记失败。一百三十题至少挂一个正控。
十九个模型、十一家厂商,各构建三次。五十七份候选对三百二十八题取平均。
| 模型 | 通过率 | 对照 |
| GPT-6 Astra | 53.05% ± 0.25 | 六类主项领先四类 |
| Opus 5 | 46.65% ± 1.80 | 普通场景 80.68%,Astra 为 72.46% |
| Qwen3.8 Max | 45.83% ± 0.14 | 交互终端类第一 |
| Grok 4.7 | 43.50% ± 2.49 | 文件操作第一,会话状态第十一 |
| 全体均值 | 38.30% | |
| Hy3 | 27.44% ± 0.43 | 全场最低 |
头尾相差约二十六个百分点。Astra 仍失败近一半。边界场景上 Astra 为 48.97%,Opus 5 降到 37.02%。
| 类别 | 题量 | 均分 | 强弱差 | 地板/天花板/可区分 |
| 权限 | 61 | 43.7% | 50.8 | 10/0/51 |
| 文件操作 | 75 | 39.6% | 20.9 | 3/0/72 |
| 会话状态 | 84 | 29.9% | 28.6 | 14/0/70 |
| headless | 40 | 26.4% | 41.7 | 9/0/31 |
| direct drive | 33 | 18.8% | 29.3 | 17/0/16 |
| 交互终端 | 20 | 79.9% | 33.3 | 0/7/13 |
权限强弱差 50.8 个点,最能分开模型。交互终端均分 79.9%,接近饱和。地板五十六题,天花板十六题,排序靠二百五十六题。Astra 领先四类,Grok 4.7 与 Qwen3.8 Max 各领先一类;Opus 4.6 的 direct drive 第三、权限第十九。类别相关全部为正,均值 +0.521。五十七份 harness 的 KR-20 为 0.913。
代码量主要随模型变,均值从 1271 行到 16681 行,五十七次构建跨 1062 到 19208 行,行数方差的 95.9% 在模型之间。行数与通过率相关 0.614。控住行数后,模块数与通过率偏相关 -0.423,留一模型后仍为负。Astra 平均 7964 行、12.3 个模块;Opus 5 为 13845 行、33.3 个模块;Qwen3.8 Max 为 16681 行、40 个模块,写得更长也更碎,分仍低于 Astra。GPT-5.5 只有 2.7 个模块,通过率 34.65%。少拆文件不够,横切功能还得写对。
下游任务分数把模型和 harness 缠在一起。Claw-SWE-Bench 里换 harness 挪动 27.4 分,换模型挪动 29.4 分。Doc2Harness 改成直接考按规格把 harness 写出来,并用脚本化 mock model 拿掉采样噪声,于是「不该发生的访问有没有发生」可以逐条判定。
交互终端已经不难,权限、会话、headless、direct drive 仍是大头失败项。同样的代码量,模块切得更碎,分更低。测量停在单次构建,协议里没有根据行为反馈再修补的循环。
论文写明两处。最多三次提交,没有按评测结果再修复的循环。contract check 不看行为,早交的通过率只是下界,冻结后不再改。单变量扩展留下的题目仍然相关,一个缺陷会连掉多题。
合成规格把结论圈在一个范围内。十二份文档消歧之后,正确答案对不上任何一款在售产品,/compact 和 plan 的归类是编写决定。脚本化 mock model 覆盖不了残缺参数和中途改口。建造端固定为 OpenCode,会偏向更熟它的模型,容器除模型网关外也不能上网。五十六道地板题无人通过,论文没有分开「做不到」和「断言过严」。正控只覆盖一百三十题。MiMo-V2.6-Flash 与 Step 5 Preview 的标准差达到 ±3.29,中段名次不稳。模块数的负相关只控了行数,GPT-5.5 模块极少而通过率只有 34.65%,少模块本身带不来高分。