01 · PAPER MAParXiv:2608.17393v1 · 2026-08-18 · CC0
HARNESS-NATIVE RL FOR CODING AGENTS

保留 Claude Code 等
原有执行流程,
用真实修复结果训练模型

LEGO-RL 不改写 Agent 怎样管理上下文和工具。它在模型服务处记录实际生成的 token,在隔离仓库里执行修复,最后用隐藏测试给出 0/1 分。

训练需要对上同一条记录:模型当时读了什么、生成了哪些 token、使用了哪些 MoE 专家。训练程序根据这些记录重算概率,更新模型权重,编码助手的执行流程不变。
LEGO-RL 训练架构
原论文 Figure 1:编码助手、代理程序、隔离环境、测试程序与训练程序。
64.0 → 70.4OpenHands · 验证最高分 %
62.4 → 68.2Claude Code · 验证最高分 %
57.2 → 66.6OpenCode · 验证最高分 %
> 0.99生成与训练概率的相关系数
论文 Abstract、Figure 1、Table 2。每种 harness 单独训练一次;数值为各自初始/验证最高分。
02 · PART 0一次生成、执行、验收与权重更新

Harness 决定怎样调用工具;policy 是它调用并训练的生成模型

一次 rollout 指模型与工具完成一道任务的整段执行记录。Claude Code 仍管理提示、工具调用和历史压缩;训练系统用代理程序(proxy)记录模型请求和返回。

01 · TASK

问题与仓库

Agent 收到 issue 描述和初始化仓库;参考修复和隐藏测试不可见。

02 · HARNESS

决定上下文

原生程序准备模型输入,执行工具操作,再发起下一次模型调用。

03 · PROXY

记录真实生成

保存 token ID、生成概率、哪些位置由模型生成的标记(mask)和 MoE 专家选择。

04 · SANDBOX

隔离执行

Agent 在独立容器内读写仓库,不影响其他任务。

05 · VERIFIER

结束后验收

注入隐藏测试。修复目标全过、原有测试不回归才给 1。

06 · TRAINER

更新模型

同题有效记录算相对得分;重算生成概率,做 GSPO 更新并同步新权重。

论文 §3.1 至 §3.2。图示为一批数据的依赖,异步生成和训练实际可重叠。
03 · PART 0同一任务 8 条记录;advantage 与序列概率比分开看

GSPO 根据同题相对成绩,提高好记录的生成概率

Âi = (ri − r̄) / (std(r1:8) + 10−6)ri 是隐藏测试的 0/1 分;Âi 是比组平均好多少。
σi = exp(meanj∈Mᵢ[log pθ − log pold])
Mi 只含模型生成位置;old 是生成此组记录时的权重。
σi 是整条记录的平均概率比,不是逐 token 的 PPO 比值。
一次更新完成执行并验收 → 计算 Â → 重算生成 token 概率 → 裁剪 σ × Â → 更新并同步模型权重。异常记录不参与组均值,训练权重 w=0;有效记录再算相对分。
公式说明例,不是作者日志

4 条通过、4 条失败

均值 0.5,按总体标准差 0.5 计算,成功的 Â≈+1,失败的 Â≈−1。裁剪限制单次概率改变幅度。

0 / 8

全错:Â 全为 0

没有组内差异,这组无法提供相对学习信号。

8 / 8

全对:Â 也全为 0

模型变强后,题池仍需要让它有时成功、有时失败。

论文 Eq. (1)、§3.1、§4.3。主实验:64 prompts/batch × 8 rollouts。
04 · PART 0历史改写、专家路由与异步旧权重是不同问题

历史文字可能被 harness 改写,训练仍须保留模型当时真正生成的 token

HARNESS

历史压缩或工具参数重新排版后,重新编码的文字可能不等于原始生成序列。

PROXY

论文要求保留原始 token、排除对不齐的历史;公开 a3e28f1 的异常分支却会重建,不能一概保证。

MOE 路由

MoE(混合专家模型)每个 token 只用部分子网络。代理保存选择,训练程序用 R3 沿用这些专家。

训练位置标记

只更新真实模型生成的位置。Harness 添加的文字和工具返回值不算模型输出;子 Agent 调用单独隔离。

正确重放 routePearson 0.9993,平均 |Δp| = 0.0025。
关闭重放Pearson 0.9946,平均 |Δp| = 0.0062。
故意错一位Pearson 0.7503;top-1 一致率 0.026。
异步旧权重另算:慢任务可能由较旧模型生成,允许的版本滞后受限,并用 Equation 1 的生成版本概率比处理。Token 对错、上下文丢失不是正常的版本滞后。
论文 §3.2、§4.4、Appendix B、Tables 3/7;Table 10 另列辅助 importance-sampling correction 关闭。
05 · RELATED WORK比较谁管理执行记录,以及怎样得到可靠得分

LEGO-RL 在模型 API 处接入现有 harness,再补足训练和验收

路线任务执行由谁组织优势与 LEGO-RL 的边界
verl / slime / MOLT / SkyRL / AReaL训练框架管理或提供抽象接口直接管理 token 与权重更新完整 coding harness 往往要改写为框架内部循环
ALE:ROLL + ROCK + iFlow训练、容器与 CLI Agent 共同设计整个系统可共同保证一致性一致性来自共同控制全套程序
Agent Lightning在现有 Agent 中加入 SDK 回调对原程序改动较少作者表中未报告历史对齐、R3 路由重放和防评分作弊
Polar / rLLM / OpenForgeRL在模型 API 处观察现有 harness保留原有执行流程最接近;历史对齐、容器与诊断覆盖不同
LEGO-RLClaude Code / OpenHands / OpenCode 原生循环token 捕获、路由重放、隐藏验收和 Live UI 组合贡献是完整系统组合,不声称每个组件都首次提出
论文 §2、Table 1。功能勾选来自作者整理,未做逐框架独立复现。
06 · ARCHITECTUREFigure 1

一次任务执行怎样进入模型训练

LEGO-RL training infrastructure
原论文 Figure 1(CC0)。隔离环境内运行编码助手;代理连接生成模型;执行记录和测试分进入训练程序。
07 · OPERATIONSFigure 2

数据准备、配置检查、运行、监控与人工复核各有职责

LEGO-RL workflow
原论文 Figure 2(CC0):Data Preparation → Run Validation → Training → Live UI → Human Review。
准备与验证检查训练索引、容器镜像、测试程序、模型和依赖。
训练运行 Figure 1 的模型代理、记录缓冲区和训练程序。
观察与复核监控界面(Live UI)查看具体任务、执行记录、工具使用和结束原因。
论文 §3.3、Figure 2。官方仓库提供 /rl:check、/rl:run、/rl:status、/rl:dashboard。
08 · DATA PROVENANCE36,884 candidates → 2,699 train tasks

先排除坏任务,再保留当前模型有时能做对的任务

36,884OpenSWE 候选任务

仓库、需求、参考修复、测试补丁与清单。

22,806静态过滤后

基本有效性、仓库多样性、粗略复杂度。

21,681可构建、可判分

评分审计发现约 2.5% 错误套入参考修复。

4 rolloutsQwen3.6-27B

固定用 OpenHands SDK 估计难度。

2,699四次通过 1 至 3 次

与 Verified 在仓库、任务两层不重叠。

筛选偏差难度只用 Qwen3.6-27B + OpenHands 估计,未证明这批任务对每种 harness 都最优。
论文 §4.1、§4.3。训练索引指向 Harbor 任务包,任务内容放在共享存储。
09 · REAL CASE12rambau__sepal_ui-814 · issue #813 / PR #814

第一次设置进度条 total,后续 update_progress 不应再次要求 total

# PR #814 的公开测试调用
alert.reset()
alert.update_progress(0, total=100)
alert.update_progress(50)

# 测试检查
assert alert.progress_bar.n == 50
assert alert.viz is True
需求和测试来自上游维护者Pierrick Rambaud 提出 issue #813,并在 PR #814 写参考修复与测试;不是训练 Agent 自己写的验收。
训练时隐藏,本文用公开补丁解释Agent 只收到需求和仓库;参考 PR、隐藏测试与评分器不可见。

旧实现:第二次调用报错

50 > total=1

第二次没有传 total,旧代码又读取默认值 1;检查“进度必须在 0 到 total 内”后抛 ValueError,目标测试失败。

参考修复:沿用已初始化的总量

n=50 / total=100

进度条已存在时读取 self.progress_bar.total,更新后进度为 50、进度条可见。完整判分还要求原有通过测试不回归。

Appendix J / Figure 15、上游 PR #814。失败路径由公开补丁推导,未声称是作者模型日志;原图保留在下一页。
10 · JUDGE TRACEAgent 执行阶段和 verifier 评分阶段分开

同一任务从原始记录变成验收包;训练索引只保存包的路径

Raw task record
Figure 15 · issue、base commit、参考修复、测试补丁与清单。
Harbor task directory
Figure 16 · 数据准备阶段生成的 Harbor 包:配置与仅供验收的文件。
Task index row
Figure 17 · trainer 从索引读取一个 Harbor 包路径;包在共享存储中。
结束以后,verifier 才获得 tests/恢复测试文件 → 应用隐藏 test patch → 跑测试 → 解析结果。FAIL_TO_PASS 全过且 PASS_TO_PASS 无回归才给 1,否则 0。官方 GitHub 未含此任务完整测试包;这里只核对上游测试和论文协议,没有复现作者评分。
原论文 Figures 15-17(CC0);文件目录在宿主侧,不能当成 Agent 可见的文件系统。
11 · TRAINING BEHAVIORFigure 3 · 126 steps / 3 epochs

同一初始模型在三种 harness 下,成绩与执行长度都不同

Training curves
原论文 Figure 3(CC0):训练分、验证分、生成分布的熵、回复长度。
OpenHands SDK初始 64.0%,验证最高 70.4%。
Claude Code初始 62.4%,验证最高 68.2%。
OpenCode初始 57.2%,验证最高 66.6%。
不能横向排名 harnessstep-0 已不同;论文比较各自训练前后。
论文 Figure 3、Table 2。Validation temperature 0.7,1 sample/instance。
12 · ADMISSION & REWARDFigures 4-5

按结束原因给训练权重;不能把所有未完成任务都当成模型答错

Termination profiles
Figure 4 · 排除比例:Claude Code 7.1%,OpenHands SDK 2.4%,OpenCode 6.4%。
Reward distributions
Figure 5 · 同题八条记录全错或全对,都没有相对 advantage。
Figures 4-5;代码 patches/verl_sao_7aed6b23.patch。设施故障记录先脱离组统计,再清零训练贡献;有效但达轮数上限的记录仍保留测试结果。
13 · TASK SELECTIONFigure 6 · four 951-task pools

四组同样各 951 题,偏难任务和随机题池更难提供组内差异

Task selection ablation
原论文 Figure 6(CC0)。Validation 只在实际执行的任务上计算。
完整段:1–3/4预热后平均验证分 0.671。
偏易半段:2–3/4预热后平均验证分 0.670。
偏难半段:1–2/4预热后平均验证分 0.640。
未做难度筛选72.7% 从未解出,13.4% 总能解出;训练前后没有净改善。
论文 §4.3、Figure 6。四组生成并发不同,验证分母仅含实际执行题目;不是主实验固定 500 题的口径。
14 · OBSERVABILITYFigures 7-8

训练分下降时,要查结束原因、具体任务和执行记录

Failure diagnosis
Figure 7 · 环境故障运行与模型停止调用工具的运行。
Behavior analysis
Figure 8 · Claude Code:单题八条工具记录与逐题通过率。
原论文 Figures 7-8(CC0)。Figure 7 两个子图来自不同诊断运行,都不是前面的主实验曲线。
15 · BEHAVIORFigures 11-12

模型更常重读和测试代码,格式错误的工具调用变少

Reasoning share
Figure 11 · 推理文字占比描述记录组成,不证明更多推理导致成功。
Behavior changes
Figure 12 · 工具分布变化;Table 9 另报告重读 73.6%→98.1%、测试 85.0%→93.6%。
原论文 Figures 11-12、Table 9(CC0)。行为标签由程序扫描执行记录得到,不是模型评分。
16 · SYSTEMSFigures 9-10

异步不必等待整批最慢任务;按需下载镜像减少启动传输

Sync versus async
Figure 9 · 7.5 小时同步 3 步、异步 7 步;每步实测 2.5×,GPU 吞吐修正后估计 1.9×。
Nydus versus OCI
Figure 10 · network 21.6GB→1.59GB,disk writes 65.6GB→5.29GB。
原论文 Figures 9-10、Tables 4-5(CC0)。同步与异步组的参数更新吞吐不同;1.9× 是估计,不是匹配硬件重跑结果。
17 · UI EVIDENCEFigures 13-14

从任务网格查看结束原因,以及生成和训练概率是否一致

Task grid
Figure 13 · 每个任务的执行得分与状态分布。
Diagnostic panels
Figure 14 · 结束原因分布,以及生成和训练的概率核对。
原论文 Figures 13-14(CC0)。UI 是诊断工具,不自动把相关性解释成原因。
18 · RESULTStemperature 0.7 · 200 turns · 200k context

三次训练的验证最高分都超过各自起点,不等于最终固定表现

HarnessQwen3.5Qwen3.6KAT-Coder-V2.5-DevLEGO-RL 验证最高分
OpenHands SDK64.067.467.070.4 (+6.4)
Claude Code62.463.466.868.2 (+5.8)
OpenCode57.260.664.866.6 (+9.4)
CONTROL同一行使用相同 harness 版本、温度与交互/上下文上限。
VARIANCE每个配置只训练一次,没有重复运行方差。
HETEROGENEITYClaude Code:1,135 题观测成功率上升、471 下降;每题只采八条,不能直接称为学会/遗忘。
论文 Table 2、§4.2、§4.5。单位:SWE-bench Verified solve rate (%)。
19 · LIMITATIONS论文能证明什么,不能证明什么

有端到端提升,也有生成对齐、案例复现和对照实验的缺口

重复次数训练方差未知三种 harness 各训练一次,主表使用验证最高分;不是最终固定 checkpoint 成绩。
任务选择筛选只用一种 harnessQwen3.6-27B + OpenHands SDK 估计难度,未证明对三种程序都最优。
论文与代码不同历史重建不一定被排除a3e28f1 可能重编码 assistant 段并保留占位概率;官方脚本关闭概率重算,模块单独启动却默认开启。
案例与输入范围完整测试包未公开sepal_ui-814 的 Harbor 包未完整发布;这版代理对真实多模态请求也不收集训练 token。
同步/异步对照硬件吞吐不完全匹配2.5× 是实测;1.9× 是校正估计,并未按相同吞吐重新实验。
行为变化相关变化不能确定因果重读、测试与推理文字同时变化,没有只改变其中一种行为的对照。
论文全文与附录、官方仓库 a3e28f1、公开 issue/PR。未公开项按 unknown 处理。
20 · TAKEAWAYS对 Claude Code / Codex harness 训练有用的检查项

训练原生 coding Agent,要把实际生成记录与验收结果对应起来

实际生成

保存原始 token

正常路径保留模型实际输出;公开版本的历史重建回退不能保证同样准确。

REWARD

执行结束再注入验收文件

Agent 执行时看不到隐藏测试、参考修复和评分脚本。

任务难度

保留有组内差异的任务

同题全错或全对都不给相对学习信号;固定题池会随模型变化而变易。

诊断

从均值追到具体记录

查结束原因、工具调用、任务变化,以及生成和训练概率是否一致。

尚未验证

一个模型通用多种 harness

论文分别训练三次;不能据此宣称已学到跨 harness 的通用行为。

INTEREST

作者兴趣度 9.5 / 10

与 Claude Code、Codex 一类完整 harness 的 RL 训练直接相关。

核心结论 1 / 20