论文解读·

Harness-of-Harness: Multi-Day Autonomous Software Development with Continual Improvement

拆解 Harness-of-Harness 如何用固定的 Planner、Developer、QA Tester 和跨轮 evidence state,让 Codex 等现成 coding harness 连续开发多日;同时追到真实 Loop 70 失败记录、三套 benchmark 的最终 ju…

页数
22
形式
交互图解
更新
2026.09.28
文章目录

Haoyang Yan et al. · arXiv:2609.01481v1 · 2026-09-01

22 页交互图解 · 从角色权限到 Loop 70 真实 QA大屏阅读 ↗

使用按钮或 ← → 翻页,F 进入或退出全屏独立打开后可随时点“返回文章”

Harness-of-Harness(HoH)在 Codex、OpenCode、Pi 这类现成 coding harness 外再加一层长期开发协议。它让 Planner → Developer → QA Tester 反复处理同一个项目,并跨轮保留两份状态:可继续修改的软件 artifact,以及经过 QA 绑定到具体候选版本的 evidence。

作者兴趣度 9.5 / 10和 Claude Code、Codex 这类完整 harness 的多日自治开发直接相关
49.58 → 71.52GameCraft-Bench · Codex
0.31 → 0.54FrontierSWE mean reward · Codex
60.41 → 66.50ProgramBench Avg. Test Pass Rate
65 / 81Fusepoint:Loop 70 时已关闭 issue

Q1. 为什么现有 coding harness 很难连续开发几天?

当开发持续几天,项目状态、验证结论和下一步决策会逐渐脱节。 普通 coding harness 往往在一个 bounded episode 里完成 issue 或局部功能。多日 greenfield development 会同时积累代码、资源、设计选择、已知缺陷和曾经通过的行为;后续局部修复还可能破坏早期功能。

论文把风险归为三类。第一,早期 requirement 和设计决定会被遗忘。第二,高层 PRD 通常无法唯一确定“下一步最值得做什么”,Agent 容易在局部修补中循环。第三,完整软件的正确性分散在编译、交互、状态迁移、视觉、音频和运行稳定性里,单个通用 test 很难覆盖。

人类在环开发与自主软件开发的区别
原论文 Figure 2。左侧由人持续发现问题并重新调用 coding agent;右侧由 HoH 自动观察、规划、开发和测试。论文按 CC BY 4.0 发布。

HoH 据此用“PRD + 当前 artifact + 已验证 evidence”共同决定下一步。每轮只选择一个 bounded but locally complete increment,也就是范围有限、但在用户可观察行为上自洽的增量。这样既避免一次改动扩散到整个项目,也避免只修一个文件却留下一条无法运行的半成品路径。

Q2. HoH 和多 Agent、长上下文、harness 自优化有什么区别?

HoH 优化正在开发的项目,模型和底层 harness 保持不变。 它和角色式多 Agent 的表面结构相似,差别落在权限、跨轮状态和验收证据上。

路线变化对象状态怎样跨轮与 HoH 的区别
长 context / memory模型可见历史对话、摘要或外部 memory能记住过去,不等于把每个事实绑定到一个已测试候选
MetaGPT / ChatDev固定的角色和消息流程角色间文档与对话HoH 额外固定读写权限、冻结候选和 evidence schema
AgileCoder / EvoDev / EvoMACsprint、feature dependency 或测试反馈迭代计划和实现状态HoH 把 artifact 与 QA evidence 明确拆成两条持久通道
AutoHarness / Meta-Harness / Self-Harnessprompt、tool、harness code 或 orchestration跨任务优化结果它们改变 operational layer;HoH 固定 operational layer,持续改变项目
LongHorizon-Harness单任务的 task state 与 bounded contractManager state + read-only audit更通用地包裹 GUI/CLI 任务;HoH 针对软件开发保留版本化 artifact 与角色化 QA
Harness-of-Harness当前软件 artifact 和 development evidence(A_(t-1), E_(t-1)) → (A_t, E_t)Planner、Developer、QA 每轮各调用一次同一 harness/model

论文还引用 Proof-or-Stop、Self-Refine 和 Reflexion。它们都强调反馈或证据;HoH 进一步把“谁能写项目、谁能验收、证据属于哪个候选版本”落实成 Runtime contract。方法落在候选冻结、权限隔离和证据归属上。

Q3. 一轮 HoH 到底怎样运行?

3.1 三个角色看到什么、能改什么?

Harness-of-Harness 官方方法总览
原论文 Figure 3。模型、底层 harness、角色定义和 Runtime policy 在一次 run 内固定;development document、artifact 和 evidence 随轮次变化。
PROJECT PLANNER读取公开 PRD、上一轮 evidence,并以只读方式检查项目结构。它不能改生产代码,只输出本轮 development document D_t。
DEVELOPER从 A_(t-1) warm-start,读取 PRD 和 D_t,是唯一允许写 artifact 的角色。它负责 baseline、修改和自测。
QA TESTER在隔离副本上读取并运行冻结的 A_t,不能修代码。它把 verified records 与 gap records 写入 E_t。

论文的 Algorithm 1 可以压缩成六步:

  1. 1 · PLAN用 PRD 和旧 evidence 选择一个可验证增量。
  2. 2 · PRESERVE列出不能回归的已验证行为。
  3. 3 · DEVELOPDeveloper 在现有 artifact 上实现。
  4. 4 · SELF-TEST先建立 baseline,再对每次重要修改重测。
  5. 5 · FREEZE把候选复制到 QA 隔离区,绑定 candidate identity。
  6. 6 · ASSESSQA 用黑盒和白盒证据生成下一轮 E_t。
D_t = Plan_H(S, E_(t-1))  ·  A_t = Dev_H(A_(t-1); S, D_t)  ·  E_t = Test_H(A_t; S, D_t)

3.2 权限不只写在 prompt 里

公开的 hoh-lite(revision ae7cc6f,Python 3.12+,Apache-2.0)用枚举和不可变 RoleBinding 强制权限。下面是官方源码摘录;Planner 或 Tester 如果拿到读写 workspace,初始化就会报错。

class WorkspaceAccess(str, Enum):
    READ_ONLY = "read-only"
    READ_WRITE = "read-write"
@dataclass(frozen=True)
class RoleBinding:
    role: RoleName
    workspace_access: WorkspaceAccess
    godot_mcp: GodotMCPAccess
    def __post_init__(self) -> None:
        if self.role is not RoleName.DEVELOPER:
            if self.workspace_access is WorkspaceAccess.READ_WRITE:
                raise ValueError(
                    f"{self.role.value} cannot receive a read-write candidate workspace"
                )
            if self.godot_mcp is GodotMCPAccess.READ_WRITE:
                raise ValueError(
                    f"{self.role.value} cannot receive read-write Godot MCP"
                )

Runtime 还检查调用顺序。正常路径必须从 Planner 开始,Planner 后只能到 Developer;Developer 后才能到 Tester。每次调用的 role、状态、开始时间、耗时和摘要会写入 runtime_receipt.json。这让“Agent 说自己按顺序做了”变成 host 可以复核的事件记录。

3.3 Evidence 不是一句“测试通过”

论文把每个可检查 claim 写成三元组 (claim, execution records, status)。例如“左右键会移动角色”需要引用 replay 和 runtime trace;“完成目标后出现结果页”如果截图只显示任务结束却没有结果页,就进入 gap records。下一轮 Planner 会把前者写成 preservation constraint,把后者写成 update target 和 validation requirement。

{
  "verified_records": [{
    "claim_id": "player_control",
    "execution_records": [
      {"type": "replay", "observation": "Left and right inputs move the avatar."},
      {"type": "runtime_trace", "observation": "Position changes after each input event."}
    ],
    "status": "verified"
  }],
  "gap_records": [{
    "claim_id": "result_state",
    "execution_records": [
      {"type": "screenshot", "observation": "The objective ends without a result screen."}
    ],
    "status": "gap"
  }]
}

这段是论文 Listing 1 的缩减摘录。QA 可以引用截图、视频、replay、runtime state、日志和公开 test;source-code presence 本身不能证明行为已经发生。

Q4. 实验怎么评,结果和真实 case 说明什么?

4.1 内部 QA 和最终 benchmark judge 是两套系统

HoH 的 QA 只看公开任务、当前 artifact 和公开执行记录。 Benchmark 在完整 run 结束后才运行 hidden tests 或 private rubric;结果不会进入 Planner、Developer 或 QA。

GameCraft-Bench · 45 tasks从 15 个 game family 各采 3 题,seed 20260707。编译或运行失败时 B=0,Overall 直接为 0;可运行时按四个 rubric dimension 加权。
FrontierSWE · 15 tasks4 个 Implementation、9 个 Performance、2 个 Research。官方 17 题中排除了 frogsgame-rl(需要当时不可用的 Tinker API 登录)和 modular-stack-wan21(要求 NVIDIA driver ≥580,实验 H200 worker 为 570.133.20)。每题由官方 verifier 给 reward。
ProgramBenchAgent 只拿可执行文件和文档重建程序。每题对 hidden behavioral tests 计算通过比例,再对任务做宏平均。
GameCraft Overall = 100 · B · (0.15M + 0.35D + 0.15V + 0.35A)

其中 M/D/V/A 分别是 Core Mechanics、Content Depth、Functional Visuals、Art and Presentation 的 rubric-item 均值。FrontierSWE headline mean 是 15 个 task reward 的无权均值;Dominance 先在同一 task 上与其余 11 个配置逐一比较,胜/平/负记 1/0.5/0,再在 domain 内平均,最后对三个 domain 做 macro average。ProgramBench 的 Pass Rate† 不是 solved-task rate,而是 per-task hidden-test fraction 的平均。

运行次数:每个 task-condition 只有 1 次有效 run。Infrastructure 或 provider transport error 会被替换,不算额外 replicate。客户端没有共同的可复现生成 seed,论文也没有统一覆盖 temperature 或 top-p。

4.2 主结果:三种 harness 都有提升

Harness + modelGameCraft OverallFrontierSWE mean rewardProgramBench Avg. Test Pass Rate
Codex + GPT-5.5 high49.58 → 71.520.31 → 0.5460.41 → 66.50
OpenCode + DeepSeek-V4-Pro26.90 → 48.980.23 → 0.3145.27 → 57.56
Pi + MiniMax-M342.16 → 58.780.26 → 0.5535.83 → 52.68
GameCraft-Bench 四个评分维度的 Vanilla 和 HoH 对比
原论文 Figure 4。三种 harness/model 在四个 GameCraft rubric dimension 上都提高;error bar 是对 45 个 task 做 20,000 次 bootstrap 的 95% percentile interval。
Momentum Lab、Kitchen Rush 和 Ant Empire 的 Vanilla 与 HoH 产物对比
原论文 Figure 6。Momentum Lab、Kitchen Rush、Ant Empire 的 Overall 分别从 34.05→70.61、42.62→73.38、65.52→87.88。这是定性 artifact 对比,不能用来还原逐步失败轨迹。

4.3 不是“多跑几遍就会涨”

三次 Vanilla Continuation 会在同一 session 里收到固定提示 Continue developing and testing the current game.,但没有新的 development document,也没有独立 QA evidence。按相同 development pass 比较:

方法1 pass2 passes3 passes三轮 token / task
Vanilla / Continuation49.5854.9958.246.33M
HoH59.7164.8471.528.41M

HoH@2 用 5.67M tokens 得到 64.84,已经超过三轮 Vanilla Continuation 的 58.24 和 6.33M。按论文公式,相对 Vanilla 每增加 1M tokens,三轮 Continuation 增加 2.32 分,HoH 增加 3.77 分。

HoH 和 Vanilla Continuation 的分数与 token 轨迹
原论文 Figure 9。相同 pass 下的质量与累计 token。
HoH 跨轮状态消融
原论文 Figure 10。去掉 plan update、evidence feedback 或 warm-start 都会降分。

消融的 Full HoH@3 是 71.52。去掉 Plan Update 后是 63.39,去掉 Evidence Feedback 后是 65.23,去掉 Warm-Start 后是 63.67。后者还把 token 从 8.41M 推到 11.12M,因为每轮都从空 workspace 重建。

4.4 FrontierSWE 能继续迭代,但仍有长期零分任务

FrontierSWE 十轮 Dominance
原论文 Figure 5。Codex 的 Dominance 从 Vanilla 27.33% 增到 HoH@10 的 72.67%,HoH@9 达到 76.00%。
FrontierSWE 三个类别的均值
原论文 Figure 8。Implementation、Performance、Research 的 task 数分别是 4、9、2。

聚合分数会遮住停滞项。Codex 在 Cranelift、Dependent Type Checker、FFmpeg 和 Inference System 四个 Performance task 上从 Vanilla 到 HoH@3 都是 0。Pi 的 Revideo 也一直是 0。持续迭代能提高部分任务,不保证跨过每个 verifier 的硬门槛。

4.5 真实 Loop 70:Developer PASS,为什么 QA 仍判 FAIL?

Fusepoint · combat_readability · candidate loop-70-c3d32741612b

  1. 来源与状态:这是作者公开 Fusepoint 仓库 revision 55b442fc 的真实 Planner/Developer/Tester receipt。Planner 从已有 issue ledger 选择四个 active issue,要求同时保留 clean boot、A/B/C 敌人数量、mouse-look、武器组件和终局逻辑。
  2. 本轮实现目标:修复 rifle enemy 把 pistol animation 绑定到活体敌人的问题;让 Alpha/Bravo/Charlie 的 3/5/10 敌人能分离 prepare 与 advance;把小号、定时消失的 story cue 改成玩家确认后才推进,并补齐 combat feedback cleanup。
  3. Developer 输出:公开 README 记录 Developer Status = PASS、Completed tasks = 3、Changed paths = 6。这个 PASS 只表示开发阶段结束,不能关闭 QA criterion。
  4. QA setup 与 action:Tester 先验证 clean boot,再用普通路线进入 gameplay;随后调用各 encounter 的 prepare/advance 路径,采集 runtime actor state、截图、日志和 frame。候选在测试期间冻结,QA 不能改代码。
  5. 观察:3/5/10 个 rifle actor 能准备出来,source 也不再把 rifle state 映射到 Pistol_*。但 advance 只产生 idle/walk sample,没有 target visibility、fire authorization、shot、reload、hit reaction 或 death;Replay 返回 predeployment 后,DeployButton 也无法用已测输入重新开局。
  6. 判定:clean_boot = PASS,rifle-pistol binding issue 被 verified;enemy combat AI、animation motion quality、combat feedback、audio/VFX、performance stability 均 FAIL。最终 phase_status = blocked、Tester review = FAIL。
这轮真正通过的部分clean boot;rifle state 不再解析为 pistol clip;A/B/C roster 可被 prepare;candidate 未在有界 smoke 中崩溃。
仍不能关闭 issue 的原因缺少完整 live combat transition;story cue 与 HUD contract 未满足;Replay 后不能部署;llvmpipe sample 只有 8 FPS,且没有 1920×1080 全流程三次 replay。

这个 case 展示了 HoH 最重要的语义:“实现了修复”与“在冻结候选上观察到验收行为”是两个状态。 QA 还区分代码修复、运行路径可达、证据完整和产品完成度,避免一个局部 source assertion 把整条交互链直接判成通过。

Fusepoint 前 70 轮开发和 issue 轨迹
原论文 Figure 1。论文截点是 Loop 70:81 个 issue 中关闭 65 个、未解决 16 个,17 个曾关闭的 issue 后来因回归而重开。当前公开仓库快照已继续到 Loop 96,并显示 101 个 issue、94 closed、7 open;后者不是论文实验截点。

4.6 全部原论文结果图放在一起看

GameCraft 五个 reporting group 的 Overall
原论文 Figure 7。五个 reporting group 各含 9 个 task;这是作者为了分析新增的粗粒度分组,不是 GameCraft-Bench 原始 taxonomy。
三种 harness 每次调用的 token 分布
原论文 Figure 11。不同 provider 的 cache accounting 不同,只适合在同一 harness/model 内比较。
Action 三类游戏的 Vanilla 到 HoH3 对比
原论文 Figure 12:Platformer、Shooter、Roguelike。
Timing 三类游戏的 Vanilla 到 HoH3 对比
原论文 Figure 13:Racing、Rhythm、Sports。
Strategy 三类游戏的 Vanilla 到 HoH3 对比
原论文 Figure 14:Strategy、Card Game、Puzzle。
Simulation 三类游戏的 Vanilla 到 HoH3 对比
原论文 Figure 15:Tycoon、Idle、Simulation。
Adventure 三类游戏的 Vanilla 到 HoH3 对比
原论文 Figure 16:Horror、Open World、Visual Novel。Figures 12–16 每个 family 选择 HoH@3 分数最高的一题,不能把它们当成随机 case。

Q5. 对 Claude Code、Codex harness 研究有什么启发?

对后续研究更有用的是四条可测试的系统约束。

第一,单写者边界。Planner 可以读结构,QA 可以运行候选,只有 Developer 能改 artifact。这样一次状态变化有明确责任人,QA 证据也不会混入边测边修的中间版本。

第二,evidence 必须绑定 candidate identity。截图、日志和 replay 需要指向同一个 frozen artifact。否则一份报告可能把旧截图、新代码和测试中临时修过的状态拼在一起。

第三,内部 feedback 与隐藏 benchmark 隔离。Harness 可以利用公开运行证据修项目,但不能看最终 judge 的 hidden tests、分数或 rationale。这条边界决定实验是在改进开发协议,还是在对 evaluator 过拟合。

第四,把 preservation constraint 当成一等输入。下一轮除了“要修什么”,还需要“哪些已验证行为不能退步”。Fusepoint 的 17 次 reopen 说明,长任务的主要风险会从缺功能逐渐转向 regression management。

如果要在这个方向继续发论文,我会优先做以下实验:

  1. 在固定 token、wall time 和 harness invocation 数下比较普通 continuation、HoH 和 LongHorizon-Harness,避免“更多调用”解释全部增益。
  2. 对 evidence 做校准:测 QA 的 false positive、false negative、跨模型一致性,以及黑盒和白盒证据分别贡献多少。
  3. 把 candidate-bound receipt 做成 harness-neutral protocol,让 Claude Code、Codex、OpenCode 能复用同一种 evidence object,而不是每个 benchmark 写一套胶水。
  4. 加入 rollback 或 branch selection。当前 HoH 总是沿最新 artifact 继续;遇到严重回归时,系统虽保留 version history,却没有在主实验中系统比较回滚策略。
  5. 对 task-level regression 建模。聚合均值提高时,仍需要检测 Spire Descent、Pipe Crisis 一类持续退步的 task,并决定何时停止继续迭代。

Q6. 这篇论文目前能证明什么,不能证明什么?

论文有一套完整、可执行、公开到角色权限和真实 receipt 的 harness 设计;实验支持整套 HoH 有效,但还不足以精确分解收益或证明多日项目已经达到独立产品验收标准。

能证明固定 harness/model 下,三轮 HoH 在三套 benchmark 的总体指标上都超过 Vanilla;matched-pass、token efficiency 和三项跨轮消融支持 plan update、evidence feedback、warm-start 都有作用。
单题不保证改善Pi 的 Spire Descent、Pipe Crisis、Space Colony、Autobattler、Border Check 在 HoH@3 低于 Vanilla;整体单调不等于 task-level 单调。
生成方差未知每个 task-condition 只有一次有效 run,没有共同生成 seed,也没有重复采样。GameCraft component 的 bootstrap 只重采 task,不能估计同题多次生成的波动。
ProgramBench 披露不足论文给出 Avg. Test Pass Rate,却没有在附录列出完整 task 数、task 清单、运行环境、逐题结果或 run configuration;无法像另外两套 benchmark 那样复核分母和失败分布。
Fusepoint 是单案例70 轮 trajectory 展示了持久开发与回归,但论文没有对照同预算 baseline,也没有给出完整独立人工产品验收。附录定义 PXI scoring,却没有出现它所说的 main-paper PXI result table。
公开包不是完整复现包附录明确说 raw run artifacts、analysis records、environment files 和 hidden evaluator 不在匿名代码包中。公开 hoh-lite 足以检查 orchestration contract,不足以复算全部表格。

我的结论是:HoH 把“继续让 Agent 写”改造成“每轮产生一个版本化候选,再用独立证据决定下一步”。 对 Claude Code、Codex 这类完整 harness,这比再加一段更长 prompt 更接近真实的软件工程控制面。它还留下三个明确研究口:如何校准 QA、如何在固定预算下分配 Planner/Developer/Tester,以及如何让长期迭代在单题上也具备可检测的停止与回滚条件。

留言

留言正在载入…

搜文章