论文解读·

Agentic Harness Engineering:让 Agent 自己改进 Harness

从三层 observability、change manifest 和真实失败轨迹出发,拆解 AHE 如何自动修改 prompt、tool、middleware 与 memory,以及它在 Terminal-Bench 2 上真正证明了什么。

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

Jiahang Lin et al. · arXiv:2604.25850v4 · 2026-05-18

14 页交互图解 · 从失败轨迹到可回滚的 harness 修改大屏阅读 ↗

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

这篇论文把 coding agent 的 harness 当成一个可以自动维护的软件系统:模型本身保持不变,Evolve Agent 根据真实任务轨迹修改 prompt、tool、middleware 和 memory,再用下一轮任务的 pass/fail 变化检验修改是否有效。它最有价值的地方不是 77.0% 这个单点成绩,而是把“为什么改、改了什么、预期修谁、实际修到谁”串成了一条可以审计的链。

作者兴趣度 10 / 10和 Claude Code、Codex 一类完整 harness 的研究方向高度相关
69.7 → 77.0Terminal-Bench 2 pass@1
75.2 → 75.6SWE-bench Verified,冻结 harness
526k → 461kSWE-bench 每条 completed trial 的 tokens
11.8 / 11.1%regression prediction precision / recall

Q1. 为什么需要自动做 harness engineering?

同一个 base model 换一套 harness,完成率会明显变化;问题是目前这种优化主要靠人手看轨迹、找模式、改代码。 模型发布节奏越来越快,旧 harness 还可能和新模型不匹配。把所有经验继续堆进 system prompt,也解决不了执行时拦截、跨步骤状态和工具语义这些问题。

AHE 把难点分成三类。第一,修改面异构:一句 prompt、一个 tool schema、一段 middleware Python 和一条 memory 规则不是同一种动作。第二,证据过长:一次 Terminal-Bench rollout 可以跨很多轮工具调用,真正有用的失败点埋在数百万 tokens 里。第三,因果难归属:成绩变了,并不能自动说明是哪一项 edit 起作用,也不能说明它破坏了哪些原本能过的任务。

AHE 在 Terminal-Bench 2 上十轮演化曲线
论文 Figure 1,作者官方仓库版本。深色线是每轮 pass@1,浅色阶梯线是 best-so-far。四个峰值分别对应 contract-first workflow、publish-state guard、cross-step risk monitor 和 post-success hard block。官方仓库 MIT License。

论文的核心判断是:如果 optimizer 能看到清楚的修改面、压缩过且可回钻的执行证据,并且每次修改都带可检验的预测,那么完整 harness 可以进入自动优化闭环。这里的“自动”不是无限制地让 Agent 改自己;verifier、model config、tracer、runs 目录都只读,Agent 只能修改 workspace 中的 harness 文件。

Q2. 它和 prompt evolution、agent workflow search 有什么区别?

AHE 的边界在于“完整 harness + 真实执行证据 + 文件级回滚”。 相关工作里,Reflexion 一类方法改写下一次回答,ACE 把成功经验压成 in-context playbook,TF-GRPO 强化成功 tool sequence,DSPy 优化多阶段程序里的 instructions 与 demonstrations,AFlow 和 ADAS 则搜索 workflow 或 agent program。它们各自有效,但多数只开放一个表面给 optimizer。

路线可修改对象主要反馈和 AHE 的差别
人工 harness engineeringprompt、tools、hooks、memory 等开发者读 log 与 benchmark修改面完整,但依赖人工诊断和维护
ACE / Expel / Reflexionplaybook、instruction 或 episodic memory成功轨迹与文字反思经验主要回到上下文,没有直接修改执行层
TF-GRPOprompt 中的 trajectory feedbackgroup-relative 成功序列不打开 tool implementation 与 middleware
AFlow / ADASworkflow graph 或 agent programrollout score侧重程序结构搜索,不以 file-level harness component 为归因单位
AHE七类 harness componentlayered traces + next-round task flips每个 edit 有 manifest、Git commit 和 rollback 粒度

论文也直接比较了三种自演化设置。ACE、TF-GRPO 和 AHE 都从同一个 bash-only NexAU₀ 出发,base model 都是 GPT-5.4 high。ACE 得到 68.9%,TF-GRPO 为 72.3%,AHE 为 77.0%。作者的解释是 layer mismatch:前两者能改自然语言经验,AHE 还能把规律落实到 tool 和 middleware。这个解释得到组件消融支持,但实验没有把所有相关方法在多次独立 evolution run 下重做,因此还不能把差距完全归因于“修改面更完整”。

Q3. AHE 的闭环具体怎样运行?

3.1 三层 observability 各自产生什么 artifact?

COMPONENT七类组件固定为文件;每个逻辑修改一个 Git commit。目标是让 action space 可见、可写、可回滚。
EXPERIENCEAgent Debugger 把 raw traces 转成 benchmark overview 和 per-task reports,同时保留原始轨迹供回钻。
DECISIONchange manifest 记录 failure evidence、root cause、targeted fix、predicted fixes、risk tasks 与 constraint level。
AHE 三层 observability 闭环
论文 Figure 2,作者官方仓库版本。左侧是 NexAU harness 的可编辑组件,中间是执行环境和 raw trace,右侧是 Agent Debugger 与 Evolve Agent。官方仓库 MIT License。

Experience observability 的关键是 progressive disclosure。Evolve Agent 先读跨任务的 analysis/overview.md,再按需打开 analysis/detail/{task}.md;只有报告证据不够时才回到 nexau_in_memory_tracer.cleaned.json。论文称原始轨迹约 10M tokens,压缩后的入口约 10K tokens。Agent Debugger 本身仍由模型完成,公开仓库也注明其核心只部分开源,所以这里的“证据蒸馏”并不是一个完全可复现的确定性程序。

3.2 一轮不是“改完再看总分”,而是先结算上一轮

  1. 1 · ROLLOUT当前 harness 每题执行 k 次。
  2. 2 · CLEAN轨迹转成统一文件结构。
  3. 3 · ATTRIBUTE用 task-level flip 结算上一轮 manifest。
  4. 4 · DISTILLDebugger 生成分层证据。
  5. 5 · EVOLVE修改 workspace 并写新 manifest。
  6. 6 · COMMITGit 记录,更新 best-so-far。

论文主实验每题 k = 2。这很重要,因为同一题一条过、一条不过时,可以对照两个 rollout 的分歧点,而不是只看到总分。每轮会把上一轮的 predicted_fixes、risk_tasks 和实际 fail→pass、pass→fail 集合求交,给出 EFFECTIVE、PARTIALLY_EFFECTIVE、MIXED、INEFFECTIVE 或 HARMFUL。

3.3 官方代码里的 publish-state guard 是怎样拦命令的?

下面是我根据官方仓库 revision 8b2a55d 的 experiments/evolved_harness/tools/shell_tools/run_shell_command.py 压缩的等价片段。它不是 benchmark checker,而是 AHE 最终学出的 shell tool 行为。

# 根据官方实现压缩;Python 3.13 / NexAU runtime
def maybe_block(command, description, guard):
    override = "ALLOW_POST_SUCCESS_RESET" in (command + (description or ""))
    reasons, hard_reasons = [], []

    for path in guard["files"]:
        if destructive_rm(command, path):
            reasons.append(f"delete protected output {path}")
            if not path.startswith("/tmp/"):
                hard_reasons.append(reasons[-1])
        if writes_or_reruns(command, path):
            reasons.append(f"rewrite or rerun protected file {path}")
            hard_reasons.append(reasons[-1])

    if hard_reasons or (reasons and not override):
        return {"exit_code": 90, "type": "POST_SUCCESS_STATE_GUARD"}
    return None

Guard 什么时候开始保护?一次带有 final、evaluator-style 或 acceptance 描述的命令成功后,tool 从命令中提取明确出现的文件、script entrypoint、Git root、web root 和当前工作目录,写入 per-agent state。后续删除、重写、重跑或破坏 Git metadata 的命令会在 shell 真正执行之前被阻止。第 5 轮的 override token 仍能放行部分动作;第 8 轮把非 /tmp 交付物删除和 live root reset 升级成 hard block,override 也不能绕过。

Q4. 实验、真实 case 和 judge 到底说明了什么?

4.1 评测对象、可见输入与计分

主优化集是 Terminal-Bench 2 的 89 个 task,其中 Easy 4、Medium 55、Hard 30。Harbor 把每个 rollout 放进 fresh E2B sandbox,最长 3600 秒;模型能看到 task brief、workspace 与工具输出,不能修改 verifier、tracer、dispatcher 或 LLM config。Verifier 是任务自带的可执行检查。timeout、sandbox crash 和 API timeout 都按失败计入 pass@1,而 token mean 会排除这些未完整结束的 trial。

pass@1 = (1 / k|D|) · Σᵢ Σⱼ rᵢⱼ,rᵢⱼ ∈ {0, 1}

主实验只有一条十轮 evolution campaign,大约 32 小时。Code Agent、Agent Debugger 和 Evolve Agent 都用 GPT-5.4;Code Agent 是 high reasoning,Evolve Agent 是 xhigh。每个 task 两次 rollout,并行度 96。这里没有人工标注新的 benchmark:任务和 verifier 来自 Terminal-Bench 2,AHE 产生的是轨迹分析和 harness edit。

我也核查了论文仓库引用的 harbor-datasets。截至 revision 37db1088,公开目录里没有 Terminal-Bench 2 task pack;AHE 仓库本身也没有打包这四个 task 的 verifier。因此下文的 task brief、隐藏检查和逐步结果来自论文 Appendix C,不能当作我从公开 checker 源码独立复核后的结论。可以独立复核的是 AHE 的 orchestration、change attribution,以及最终 evolved shell tool 和 middleware。

Harness / loopAllEasyMediumHard
OpenCode47.275.052.733.3
Terminus-262.975.074.540.0
Codex71.975.080.056.7
NexAU₀69.787.578.251.7
ACE68.991.778.248.9
TF-GRPO72.3100.079.455.6
AHE77.0100.088.253.3

结论要分层看。AHE 的总分最高,主要来自 55 个 Medium tasks;Hard 上 53.3% 仍低于 Codex 的 56.7% 和 TF-GRPO 的 55.6%。优化目标按 89 题平均,Medium 数量占优势,所以 Evolve Agent 有动机接受对 Medium 有利、对 Hard 略有代价的组合。

4.2 Case 1:正确图片为什么还会 FAIL?

path-tracing:生成成功,cleanup 删除交付物

  1. Terminal-Bench 2 task 要求 Agent 写出 /app/reconstructed.ppm。Verifier 只读取这个文件,和 reference image 做逐像素比较。
  2. 第 4 轮两个 rollout 都已经 render 出正确图片,并完成了自己的结构检查。
  3. Agent 最后执行类似 rm -rf /app/image /app/reconstructed.ppm /app/scratch 的 cleanup,然后把命令 exit code 0 当成可以提交的依据。
  4. Verifier 执行时,唯一交付物已经不存在,因此两条都失败,得分 0/2。
  5. 第 5 轮的 prompt rule 说明“通过 acceptance 后的状态就是 publish state”;shell tool 同时记录 protected output,并在后续删除命令执行前返回 block。
原始 FAIL正确文件曾经存在,但 verifier 运行时已经被删。
修复后 PASScleanup 被 tool 拦下,Agent 保留文件并结束,下一轮 2/2。

这个例子说明 prompt 和 execution guard 的差别。论文明确写到,seed prompt 已经提醒不要破坏 verified state,但模型仍会执行 cleanup;直到 tool implementation 把删除动作变成不可执行,错误才稳定消失。

4.3 Case 2:为什么“两个数字文件都在”仍然 FAIL?

mcmc-sampling-stan:proxy answer 代替真实 pipeline

  1. Task 要求安装 rstan 2.32.7,用 30 条观测拟合 hierarchical beta-binomial model,并写出 posterior mean。
  2. Verifier 会自己安装 package,再从头运行 Agent 提交的 analysis.R。最终要求 alpha ∈ [2.84, 2.91],beta ∈ [16.1, 16.7]。
  3. 失败 rollout 用独立 grid integration 算出看似合理的 2.876 / 16.375,把它们先写进文件;真正的 MCMC 放到后台后,约 3 分钟就被 kill,理由是“保留已经写好的 deliverables”。
  4. Agent 的最终检查只确认两个文件存在且内容能 parse。Verifier 重跑未收敛的 analysis.R,得到约 1.28e19 / 2.60e17,2/6 tests fail。
  5. 第 6 轮的 middleware 识别 inline proxy 与 shallow validation;publish-state guard 同时把 analysis.R 作为 protected entrypoint。修复后的 rollout 跑完 iter=100000,又在 /tmp 独立复跑,约 2.872 / 16.43,6/6 tests pass。

这里的 judge 不是“看文件有没有”,而是复现官方计算流程并检查数值区间。AHE 的作用也不是泄漏隐藏答案,而是逼 Agent 走完 task brief 明确要求的 pipeline,并用独立执行交叉验证。

AHE 的 middleware、prompt 与 tool 修改实例
论文 Figure 5,作者官方仓库版本。三个真实 edit 分别落在 middleware、prompt 和 tool 层。官方仓库 MIT License。

4.4 Transfer、消融和负结果

SWE-bench Verified 使用完整 500 题、七个 repository,AHE harness 不做 in-domain re-evolution。Aggregate success 从 NexAU₀ 的 75.2% 到 75.6%,只高 0.4 pp;tokens/trial 从 526k 降到 461k,少约 12%。收益主要集中在 django 与 sphinx-doc,scikit-learn、pydata、astropy 三个较小 repo 都退化。因而这张表更强的证据是效率迁移,不是大幅准确率迁移。

SettingSWE-bench VerifiedTokens / completed trialSucc / Mtok
ACE74.6%679k1.10
TF-GRPO74.2%582k1.27
NexAU₀75.2%526k1.43
AHE75.6%461k1.64
AHE 跨模型迁移结果
论文 Figure 3,作者官方仓库版本。冻结 AHE harness 在五个额外 operating point 上均高于各自 seed,增益从 +2.3 到 +10.1 pp。官方仓库 MIT License。

组件消融更值得注意:memory only 75.3%、tool only 73.0%、middleware only 71.9%,都高于 69.7% seed;system prompt only 为 67.4%。三个正向组件的增益相加是 +11.1 pp,高于 full AHE 的 +7.3 pp。作者在轨迹中看到几层组件都在反复做 closure verification,叠加后会耗掉 Hard task 的 turn budget。完整 harness 的组件不是可独立相加的积木。

最后看 self-attribution。跨九个可比较 round,fix prediction 的 precision / recall 是 33.7% / 51.4%,约为随机基线的五倍;regression prediction 是 11.8% / 11.1%,只比随机基线高约一倍。附录进一步报告累计 43 个 regression predictions 只有 5 个命中,同时有 40 个实际 regression 没被预见。AHE 会记录因果假设,但它对副作用的判断仍然很弱。

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

最直接的启发是把 harness 设计成可以实验和结算的组件系统。 如果所有逻辑都写进一段大 prompt,optimizer 很难知道某条规则是没有被读到、没有被执行,还是和另一个规则冲突。把“建议”升级成 middleware 或 tool guard,也应当有明确条件:必须先从跨任务轨迹里看到重复 failure pattern,并验证 prompt-level fix 不够稳定。

对完整 coding harness,我会优先复用下面四个研究设计:

  1. 每个组件固定路径、明确 schema,并让一个 logical edit 对应一个 commit。
  2. 同题至少两个 rollout,专门比较 partial-pass 的 divergence point。
  3. 让 optimizer 在修改前写 predicted fixes 与 risk tasks,下一轮按 task-level delta 结算。
  4. 把 soft instruction、runtime reminder 和 hard block 当成三个不同强度的控制层,按错误的可逆性和风险选择。

论文还暴露出一个很有研究价值的问题:怎样让 optimizer 预测 cross-component interference。AHE 的 manifest 以单个 edit 为中心,但实际执行中 prompt、memory、middleware 可能同时推动同一种行为,导致重复检查。更完整的后续实验可以把 edit 组合当作因果单元,加入 factorial 或 bandit-style 的组合消融,并为 Easy、Medium、Hard 分别设预算约束,而不是只优化一个由 55 个 Medium tasks 主导的 aggregate。

Q6. 这篇论文的证据边界和最终判断是什么?

AHE 已经证明完整 harness 可以进入自动优化闭环,但还没有证明这个闭环稳定、低成本、可跨场景长期自治。 下面几个边界会直接影响复现和研究设计:

  • 主结果来自一条十轮 campaign,没有多 seed 的均值和方差。每轮又只有每题两次 rollout,单 task flip 的噪声仍然大。
  • 三个角色都使用 GPT-5.4,且 Evolve Agent 是 xhigh reasoning。论文保持 base model 不变,隔离了 harness edit 的作用;它没有证明较弱 optimizer 也能完成同样的诊断。
  • Agent Debugger 的核心只部分开源。公开仓库能看到 loop、prompt、evolved harness 与 attribution code,但不能完全复现“10M tokens 如何压成 10K tokens 证据”的所有细节。
  • SWE-bench Verified 的 aggregate accuracy 只高 seed 0.4 pp,且三个小 repo 下降;跨 benchmark 结果应主要理解为 token efficiency 和部分 repository 上的迁移。
  • operating point 在 GPT-5.4 high 上调过。medium、high、xhigh 的增益不是单调的,xhigh 可能因为更慢而越过 task timeout。
  • self-modification 的安全边界仍是研究原型:workspace 限权、Git rollback 和 verifier 只读能防一批明显捷径,但不能替代完整的 misuse prevention 与长期 cleanup governance。

我的结论是:如果要研究 Claude Code、Codex 这一类完整 harness,这篇值得优先精读和复现。 它既给了可以直接实现的工程对象,也公开了很具体的失败轨迹;更重要的是,论文没有把 self-evolution 包装成一路单调上升,反而把 component interference 和 regression blindness 摆到了台面上。作者兴趣度因此是 10/10。

留言

留言正在载入…

搜文章