拆分测试质量谓词:代码 Agent 反馈式后训练中的拒真率与覆盖度联合门控
提出 SPLIT-Q,把 ExecCritic 的 Base-to-Gold 合取谓词拆成 (B, G, C) 三元组,用可执行的覆盖度标注与免 Gold 的 Ĝ 预测器,对代码 Agent 的反馈仪器做双侧门控与分层路由。
背景与动机
代码 Agent 的反馈式后训练依赖一条 test–verify–revise 环路:先生成一条可执行测试,冻结它,再让策略按执行反馈反复修订补丁。这条环路把「生成的测试」当成了奖励仪器。仪器本身有质量,而 ExecCritic(arXiv:2609.09133)的 Table 2 证明了这个质量会改变反馈的符号。固定 Qwen3.5-35B-A3B 的 Repair agent,换掉测试来源,SWE-bench Verified 的 resolved rate 会这样移动:无测试 61.2%,Base-35B 生成的测试 57.3%(Δ = −3.9),RL-35B 生成的测试 64.1%(+2.9),GPT-5.6-sol 生成的测试 65.3%(+4.1),Oracle F2P 69.4%(+8.2)。把 Repair agent 也训练完之后,Base-35B 测试依然是负的:64.6%,Δ = −3.7。同一个策略、同一套流程,只换仪器,增益就变成损害。
现有方案不够好的地方,在于质量谓词被用了一半。ExecCritic 定义的谓词本身是对的——Base-to-Gold success,写作 Q_x(b) = B_x(b)·G_x(b),其中 B 要求测试在 Base 仓库上干净失败,G 要求测试在 Gold 仓库上通过。这个合取被用在两处:一是 Test agent 的 GRPO 奖励(0 / 0.2 / 0.5 / 1.0 四档,后三档再由候选补丁上的 balanced accuracy 细分),二是离线审计指标(Table 1:Qwen3.5-35B-A3B 22.2% → +SFT 39.6% → +RL 62.2%)。
准入只取了其中一个边际。原文对这一点交代得不含糊:「the harness admits b solely when B_x(b) = 1」,「Gold outcomes … never for qualification or Repair-input selection」,「We do not use the Gold patch or Gold outcome to filter this pool」。于是两个边际在数据账本里地位悬殊:B 是硬门控,G 只是一个被统计的数字。结果是一个合取谓词被拆成「一半门控、一半仅审计」的结构,而被准入的测试里有多少比例满足 B=1 且 G=0——即通过了门控却拒绝参考修复本身——论文没有报告。Q 在 RL-35B 阶段是 62.2%,剩下 37.8% 的失败如何在 B=0 与 G=0 之间分配,是 ExecCritic 留下的一处空账。
这个缺口有正当理由:部署时没有 Gold,G 不可计算。真正的张力在于训练时有 Gold。训练语料 SWE-ReBench 带参考补丁,G 在那里是可观测、可标注、可据以分层的量,而 ExecCritic 明确不把它用于准入。
第二个缺口是覆盖度轴被点名却没有仪器。Figure 5a 给出一个跨基准的不对称:GPT-5.6 在 SWE-bench Verified 上,生成测试把 resolved rate 从 81.5% 抬到 85.7%(+4.2),Oracle F2P 抬到 89.7%(+8.2),生成测试回收了 51.2% 的可得 headroom;在 SWE-bench Pro 上,生成测试只从 61.6% 抬到 62.3%(+0.7),Oracle 抬到 73.4%(+11.8),回收率 5.9%。两者相差 8.7 倍。作者把原因指向覆盖——Pro 的 F2P 测试数中位数与均值为 3 与 14.43,Verified 为 1 与 3.03——并紧接着写下一句自我限定:「These aggregate statistics support a coverage-based explanation but do not isolate it from other benchmark differences.」覆盖度是被点名的自变量,语料账本里却找不到它。
第三个缺口是训练仪器与部署仪器不同源。Repair 主训练配置「select one Oracle fail-to-pass (F2P) test case for each task」,训练时面对的仪器 G 恒为 1,因为 F2P 按定义在 Gold 上通过;部署时面对的是生成 bundle,G 未知。策略在干净仪器上训练,在噪声仪器上部署,且训练全程没有见过 G=0 的仪器。奖励里那条兜底——「an officially correct patch rejected by the generated test receives 0.1」——只在 generated-test ablation 臂生效,不在主训练臂。
核心思路
提出 SPLIT-Q:把测试质量谓词从标量 Q 拆成三条样本级元数据,并把它们从「Test agent 的奖励项」重新定位为「Repair agent 训练语料的准入条件与路由键」。
三元组记作 (B, G, C)。B 是测试在 Base 仓库上是否干净失败,沿用 ExecCritic 现有门控。G 是测试在 Gold 仓库上是否通过,沿用现有离线审计,但恢复其准入资格。第三项 C 是行为覆盖度,定义为官方 F2P 集合中被该 bundle 真正覆盖的比例:分子是那些在 Base 上失败、在 Gold 上通过、且 bundle 在 Gold 状态下使其通过的 F2P 条目数,分母是 |F2P_x|。这一项论文里没有,却完全可执行——官方 F2P 集合、Base 与 Gold 两种仓库状态在训练语料中都是现成的,不需要裁判模型。
与现有工作的区别有三条。
第一条是从单一谓词打分转向三元组分层。现有做法把 Q 折算成一个标量奖励喂给 Test agent,Repair 侧看不到这个数;SPLIT-Q 把 (B, G, C) 记在样本上,交给 Repair 训练去路由。
第二条是把不可观的 G 换成可观的 Ĝ。G 在部署时算不出来,这正是单侧门控成立的理由。SPLIT-Q 在训练语料上监督学一个 Ĝ(b),输入只有测试包 b 与部署时可得的公开上下文(issue 文本、Base 仓库、bundle 自带的 JSON 行为契约),输出 P(G=1)。可用的免裁判特征包括 bundle 的测试节点数与断言数、断言触及的模块是否出现在 issue 文本里、行为契约与 issue 描述的重合度、以及 b 在 Base 上的失败形态(断言失败或异常)。有了 Ĝ,部署侧就能对 Ĝ < τ 的实例放弃反馈、保留 Round-0 补丁——这个开关正是用来挡掉 Base-35B 那 −3.7 损伤的位置。
第三条是训练时主动暴露噪声仪器。主训练不再统一使用 Oracle F2P,改为按 (G, C) 分层采样仪器,让策略在 G=0 与低 C 的仪器上也练过,而不是在干净的 Oracle 上练完直接推向噪声环境。
退化点设为 τ = 0:此时 Ĝ 不拦截任何实例,SPLIT-Q 严格退化为 ExecCritic 原协议。这条设计让四臂对照有干净归因,也让「τ=0 下测到增益等于噪声或 bug」成为一项可执行自检。
技术路线
第一步是标注三元组。在 SWE-ReBench 上对每个生成 bundle 跑三次执行——Base 仓库、Gold 仓库、官方 F2P 全量——直接读出 (B, G, C)。每实例三次执行,全部由沙箱给出,不需要裁判。
第二步补上那次缺失的拆分。在 RL-35B 阶段(Q = 62.2%),把 37.8% 的失败分解到两个边际:B=0 表示被门控挡在门外,B=1 ∧ G=0 表示被准入但拒绝参考修复。后者的占比是本提案的核心观测量,也是 ExecCritic 表 1 没有给出的数。
第三步训练 Ĝ。用第二步产出的 (b, G) 标签做监督学习,输入严格限定为部署时可得的信息,报告 AUC 与校准曲线,并做跨 Test-agent 留出验证。若 Ĝ 的 AUC 接近 0.5,部署侧门控这条路不成立,提案自动降级为只做训练侧分层,第二步与第四步的结论不受影响。
第四步设四臂对照。A 臂是 ExecCritic 原协议(Oracle F2P 训练、生成测试部署);B 臂只加部署侧 Ĝ 门控;C 臂只加训练侧 (G, C) 分层采样;D 臂两者都加。主指标是 SWE-bench Verified 与 SWE-bench Pro 的 resolved rate,次指标是 headroom recovery,定义为 Δ_generated / Δ_oracle。
第五步做跨基准分层匹配检验。在 Verified 与 Pro 上取 C 分布匹配的子集,重算两个 recovery ratio。若 8.7 倍差距显著收窄,作者的覆盖度解释得到支持;若匹配后差距不收窄,则该解释被证伪,主因要另找——例如 Pro 任务本身的难度分布,或单 bundle 与 Pro 多 F2P 结构之间的错配。
关键技术挑战集中在三处。Ĝ 的精度决定整条链路的上限,而 G 标签只在有参考补丁的语料上存在,跨仓库、跨 Test-agent 的迁移性必须单独验证,否则 Ĝ 学到的只是生成它的那个 Test agent 的风格。C 的定义依赖官方 F2P 集合,迁移到自举环境时需要换成「合成任务时注入的行为集合」,两个口径的换算关系待定。训练侧混入 G=0 仪器会让 Repair 奖励的 0.1 分支被大量触发,梯度信号被稀释,奖励档位需要重新校准。
预期成果
定量目标有三条。在 SWE-bench Pro 上,把生成测试的 headroom recovery 从 5.9% 提到 20% 以上,即 Δ 从 +0.7 提到不低于 +2.4。在 SWE-bench Verified 上,把 RL-35B 与 Oracle F2P 之间 5.0 个点的差距压缩一半以上。对 Base-35B 这类低质量仪器,把部署侧 Δ 从 −3.7 抬到 0 以上。
定性目标有三条。给出 Q 两个边际的首次实测拆分,量化「被准入却拒绝参考修复」这部分样本的规模。给出 C 在 Verified(F2P 中位数 1)与 Pro(中位数 3、均值 14.43)上的分布,并判定覆盖度解释是否成立。给出 Ĝ 在跨 Test-agent 迁移下的精度上界。
影响路径有两条。部署侧 Ĝ 门控若成立,「是否启用反馈」就从全局开关变成逐实例决策,凡是用生成测试充当奖励信号的代码 Agent 流水线都能直接接上。训练侧暴露噪声仪器若成立,则提供一条与「把仪器做强」正交的路线:不强求 Test agent 产出完美测试,而是让 Repair agent 对不完美的测试具备免疫力。
局限性与风险
本提案的核心观测量是「被准入却拒绝参考修复」的样本占比(B=1 ∧ G=0)。它对整条论证链是单点依赖:若这个比例极低,后续的分层路由与部署侧门控都会失去着力点。第二步要首先报告的应当是这个比例本身,而不是任何增益。
- 观测量可能过于稀疏。Q 在 RL-35B 阶段为 62.2%,若 37.8% 的失败几乎全部落在 B=0(门控已经挡住),B=1 ∧ G=0 的占比会小到没有统计效力。此时结论退化为「ExecCritic 的单侧门控在实践中是够用的」——这仍是一个此前无人报告的有效结论,但影响路径中的训练侧分层与部署侧门控两条都要重写。建议先在任务级与 Test-agent 级分片上报分布,再决定是否推进后续步骤。
- τ 的取值缺少推导。τ=0 是归因用的退化点,不是部署值。部署侧真正使用的 τ 如何确定,本提案没有给出方法——是按验证集上 Δ 的最大化选,还是按可容忍的反馈放弃率反推?建议补一条:在验证集上扫 τ,报告 (τ, resolved rate, 反馈放弃率) 三维曲线,把「门控挡掉了多少实例」作为显式成本列出。否则部署侧门控容易被读成一份免费的保险——它放弃的那部分实例原本是有机会被修好的。
- 每实例三次执行的开销被低估。C 的定义要求跑官方 F2P 全量,而 Pro 的 F2P 均值是 14.43(中位数 3),长尾任务的执行成本远高于 Verified。这一步在 Pro 上很可能成为标注流水线的主要瓶颈,建议先估一遍单实例 wall-clock,并给出抽样标注的可行性。
- Ĝ 的迁移性风险(技术路线已述,此处列为最高优先级)。G 标签只在带参考补丁的语料上存在,Ĝ 有可能学到的是生成它的那个 Test agent 的风格,而非测试本身的性质。跨 Test-agent 留出验证必须在第三步就做,不能留到部署前。
- C 的口径迁移未定。从官方 F2P 集合迁移到自举环境(EnvCraft 那类)时,需换成「合成任务时注入的行为集合」,两个口径的换算关系目前是空的。若无法建立换算,SPLIT-Q 的适用范围就被限制在有官方 F2P 的语料上。
- 训练侧混入 G=0 仪器会稀释奖励信号(技术路线已述)。0.1 分支被大量触发后,梯度信号的方差结构会改变,奖励档位需要重新校准——这一项的成本在提案里没有量化。
负结果预案:第三步 Ĝ 的 AUC 若接近 0.5,提案自动降级为只做训练侧分层,第二步与第四步的结论不受影响;第五步若 C 匹配后差距不收窄,则覆盖度解释被证伪,需另找主因(Pro 任务本身的难度分布,或单 bundle 与 Pro 多 F2P 结构之间的错配)。这两条已在技术路线中写明,此处汇总,以便一眼看出哪些分支会终止。
相关工作
- ExecCritic: Learn to Test, Test to Improve for Coding Agents(arXiv:2609.09133,2026-09-08,10 位作者,UW–Madison / Microsoft Research / Georgia Tech)。本提案直接建立在其 test–verify–revise 脚手架之上,改动的是测试准入谓词的用法。其 Table 2 的符号翻转与 Figure 5a 的跨基准不对称是全部实证起点。
- SWE-Bench Pro Verified: A Reliable Benchmark for Software Engineering Agents(arXiv:2609.08149,2026-09-08,8 位作者,上海人工智能实验室 / 华东师大 / 复旦)。该文在评测侧建立了测试作用域的两类问题——附录 A.2.2 overly narrow tests 与 A.2.3 overly broad tests——并按此修正实例;GLM-5.2 从 Baseline 78.80% 降到 Anti-hacking 57.32%,修正任务质量后回到 59.51%。本提案把这套双侧作用域视角搬到训练侧的生成测试上。
- FrogNano: Training a 4B Coding Agent via Online Task Synthesis(arXiv:2609.07925,2026-09-07,17 位作者,Microsoft Research Montréal / Mila / UCSD)。TaskPilot 每轮按当前 checkpoint 的可学习前沿合成约 300 个任务,五轮累计约 1,500 个环境;文中报告早期迭代习得的行为在后期丢失,需靠 consolidation 找回。其「任务随策略演化」与本提案的「仪器随策略分层」同属自举语料的记账问题。
- EnvCraft: Synthesizing Executable Environments in Agentic RL for Claw-like Agent(arXiv:2609.05576,2026-09-04,11 位作者)。合成 139 个可交互环境、约 20K 复杂任务,Qwen3/3.5 在 Claw 类基准上最高 +11.9%。代表环境侧的自举语料,是 C 口径迁移的目标场景之一。
- ToolLoop: Closed-Loop Tool-Use Data Synthesis via Decomposed Generation and Dynamic Self-Feedback(arXiv:2609.09072,2026-09-08,8 位作者,vivo AI Lab)。把工具调用数据合成从 generate-then-filter 改成 generate-verify-refine,11K 样本训出的 4B 模型在 BFCL 非推理模式达 86.40%。其阶段性自我反馈与本提案的逐样本仪器元数据是同一思路在不同数据轴上的落地。