跳到主要内容
返回时间线
arXiv来源发表:

RucTangle让编码智能体生成的补丁拆分为每个提交都可运行的提交历史,并在回归修复中把pass@1平均提升16.6%

核心概要

该工作提出RucTangle,一种智能体式提交拆分方法:它按开发目的对补丁中的改动分组并排序,逐个应用提交并检查代码是否仍可运行,失败时先调整顺序、再让智能体重新分组、最后合并相邻提交,同时保持最终代码不变;在131个智能体生成的补丁上,RucTangle是唯一全部重建原补丁且每个提交后代码均可运行的方法,中位数为8个提交,而基线有20.6%–37.4%的历史至少含一个不可运行版本。作者还提出TangleEval,用453个引入回归的补丁让两个编码智能体修复,加入RucTangle历史与git bisect结果后pass@1从26.9%升至31.3%、从30.8%升至36.0%。

Source-provided article image: Runnable Commit Untangling for Coding Agents
Figure 1 ·

Figure 1 : A simplified patch with two development purposes: adjusting the logging level (A) and switching the default backend from local to sqlite (B and C). Change B replaces the entry in the backend dictionary, and Change C updates the default selection. Because bootstrap.py evaluates BACKENDS[DEFAULT_BACKEND] at import time, separating B and C causes a KeyError between these commits. Keeping A separate and grouping B with C avoids this mismatch.

arXiv

深度剖析

RucTangle在131个智能体生成的补丁上全部重建原补丁,且每个提交后的代码都通过可运行性检查(pytest能发现并加载测试),中位数为8个提交,仅0.8%的历史只含一个提交。 此前方法(FileSplit、HunkSplit、Armchr、Atomizer)虽能重建96.2%–100%的补丁,但只有62.6%–79.4%的历史在每个提交后都可运行;论文把“可运行”作为提交拆分的显式约束,并用执行反馈驱动分组与排序的修订。 在SWE-CI的100个Python仓库、131个Claude Opus 4.6生成的补丁上,与四个基线对比;可运行性定义为pytest能发现并加载测试,每个版本在独立容器中检查。

RucTangle生成的历史中临时测试失败更少:在最终版本通过的测试里,平均1.7%在某个提交后由通过转为失败,而四个基线为16.4%–32.4%;其测试增益分布也更分散(MTP 0.552对0.610–0.739,TPE 0.562对0.361–0.419)。 论文用“测试增益分布”作为开发目的的代理指标,把评估从与参考分组的语法一致性扩展到提交序列上的功能分解与临时回归。 同一131个补丁上的统计;RucTangle在修订分组与顺序时并未使用测试的通过/失败结果,因此该结果不是直接优化目标。

在453个引入回归的智能体补丁上,把RucTangle生成的历史连同git bisect定位到的候选提交加入修复智能体上下文,Qwen3-Coder-Next的pass@1从26.9%升至31.3%,Nemotron从30.8%升至36.0%,两个模型平均相对提升16.6%;Armchr与Atomizer的平均相对增益分别为4.5%与6.1%。 此前对提交拆分的评估只做与开发者原始提交的语法比较,未直接展示维护收益;TangleEval首次把“拆分后的历史是否帮助编码智能体修复回归”作为可量化指标。 两个模型在453个补丁上每补丁三次尝试,各条件使用相同的失败代码、测试与修复预算;另有四个模型在150个补丁样本上各一次尝试,其中两个提升、一个持平、一个略降。

轨迹案例显示智能体用提交diff与更早版本判断哪些改动需要修复,用提交信息判断哪些行为应当保留;但一条把删除换行处理称为“redundant”的生成信息,使智能体反复质疑一个正确修复并耗尽步数。 论文把提交信息质量与后续智能体决策联系起来,指出误导性信息会削弱拆分历史的价值,并提出面向后续智能体的历史设计方向。 来自回归修复评估中NoHistory与RucTangle结果不同的补丁的轨迹案例研究,比较同一补丁、模型与尝试序号下的记录。

启示与展望

该结果面向使用编码智能体维护Python项目的团队:把智能体产出的大补丁拆成按目的分组、每个提交后仍可运行的提交序列,并把git bisect定位到的候选提交与提交信息一并提供给修复智能体,可在不重新训练模型的情况下改善回归修复。可运行性判据是pytest能发现并加载测试,因此适用于有可收集测试的Python项目;论文也把该检查阶段在其他语言或不同部署要求下的有效性列为待评估。方法保留原补丁的最终代码,不要求功能测试通过,也不修复原补丁引入的错误——修复是独立任务。

修复收益随模型而异:六个模型中四个提升、一个持平、一个略降,因此不宜把单一提升幅度当作普遍结论。多数模型在修复目标回归的同时更常引入新的测试失败,pass@1的净提升因此小于“目标失败被修复”的比例。合并历史实验只评估Nemotron,且合并同时改变了bisect候选提交的范围与一并呈现的提交信息,结果反映的是可用信息的整体变化而非提交数量的单独效应。论文未独立控制提交信息质量,其影响仍是开放问题。此外,修复对比评估的是包含bisect定位在内的完整RucTangle系统,未分离各组件贡献。

来源