Evoclaw Continuous Software Evolution
论文笔记:EvoClaw — 代码智能体的”长跑”难题:从单点任务到持续演化
| arXiv: 2603.13428 | USC, UCR, UCSD, Haven, OpenHands |
一句话总结
EvoClaw 发现了一个令人警醒的事实:12 个顶级代码智能体在独立任务上能拿到 >80% 的分数,但在连续演化场景下最高只能到 38%——暴露了现有评估体系对”时间维度”的系统性忽视。
核心问题:评估的是快照,不是生命体
现有代码智能体评估体系(HumanEval → SWE-bench → Commit0 → ProgramBench)有一个共同假设:每个任务是独立存在的。
- Agent 在一个干净的代码快照上修一个 bug
- 修完评分,reset,换下一个任务
- 任务之间没有任何依赖关系
但真实世界不是这样的:
- 今天的实现决策,约束明天的重构空间
- 快速通过的测试,可能在第三步引入技术债务
- 一个模块的捷径,导致另一个模块必须重写
EvoClaw 的核心论点是:现有 benchmark 测不出这个,因为它们根本不建模时间。
方法:Milestone DAG + 持续演化环境
里程碑(Milestone)粒度
EvoClaw 选择了”里程碑”作为任务粒度——比 commit 粗(避免噪声),比 release 细(保留依赖结构)。
里程碑定义:一组在功能上内聚的提交,共同推进一个具体的开发目标。
例如:实现”用户认证模块”可能由 5 个提交组成,它们合起来是一个里程碑。
为什么不用 commit?因为 commit 太细太乱(很多是 typo fix),且线性序列引入虚假的先后依赖。
为什么不用 release?因为 release 包含了成百上千个相互依赖的提交,粒度太粗,依赖关系被压平。
DeepCommit:从噪声 git 历史中重建里程碑 DAG
这是论文最有技术含量的部分——把一团乱的 git 历史自动重建为可执行的里程碑有向无环图。
三阶段管道:
Phase 1:提交历史预处理
- 收集主分支 commit、PR commit、GitHub API 数据(PR、Issue、Release)
- 静态分析:构建 commit 级 DAG(通过 git blame 追踪行级依赖)、符号级修改统计、文件级共变更矩阵
Phase 2:里程碑 DAG 构建(4 步 LLM Agent 流程)
- 种子发现:LLM Agent 评估 commit 语义 + DAG 拓扑结构,找出”引入不同开发主题的基础性提交”
- 里程碑整合:并行子 Agent 把种子扩展为完整里程碑,合并共享文件修改、时间接近、PR/Issue 引用的提交;冲突由协调 Agent 解决
- 依赖推断:直接依赖(行级文本依赖)+ 隐性依赖(符号调用关系,无共同 hunk),都由 LLM Agent 验证
- 里程碑分解:过大的里程碑按功能边界拆分,过小的合并,最终控制每个里程碑的代码行数变异系数 CV < 1.0(实际达到 0.96)
Phase 3:运行时环境解析
- MainAgent 编排:平衡测试床质量和解析成本
- MilestoneAgent:在基础 release tag 上按拓扑顺序 cherry-pick 提交,处理冲突
- EnvAgent:从 CI/CD 工作流生成 Dockerfile,必须通过三个硬门:源码编译成功 → 测试框架收集成功 → 里程碑 patch 引用的测试被捕获
- 修复模块循环直到每个里程碑达到稳定状态
评估框架:持续演化 + 隔离评分
三个核心组件:
- 依赖驱动的任务流:里程碑 M_i 只有在其所有前置里程碑完成后才解锁——真实模拟了软件工程的依赖约束
- 持续演化环境:Agent 的修改持久化到代码库,下一个任务在前一个任务的状态上继续——早期决策真实约束后期选择
- 快照隔离评分:开发在持久环境进行,完成后快照传入隔离容器评分——可复现,且 Agent 工作环境不被中断
评分指标:
Recall_m = N_fixed,m / N_required,m (F2P 测试通过率)
Precision_m = (N_fixed,m + ε) / (N_fixed,m + N_broken,m + ε) (P2P 回归率)
Score_m = 2 × Precision × Recall / (Precision + Recall)
Final Score = (1/|M|) × Σ Score_m
结果:单点强 ≠ 连续强
核心数据:
| 设置 | 平均分 |
|---|---|
| 独立任务(类似 SWE-bench) | >80% |
| 连续演化(EvoClaw) | 最高 38% |
这 42+ 百分点的落差说明什么?
- Agent 在独立任务上能解决问题
- 但在需要考虑历史约束、需要维护代码库健康的任务链上,错误会累积、技术债务会压垮后续开发
具体问题:
- 早期为了快速通过测试走了捷径,导致后期需要重构
- 修改了某个模块,破坏了另一个模块的假设,但这个破坏在单任务评估中不会被发现
- 随着里程碑增多,代码库的可维护性下降,Agent 开始犯更多错误
深层洞察:技术债务是一种”误差累积”
EvoClaw 揭示了一个在传统软件工程中很经典、但在 AI Agent 研究中很少被正式建模的现象:技术债务是一种误差累积。
在单任务评估中,每次任务都是独立的——债务不会传递,错误不会累积。这就像在一个没有记忆的强化学习环境中训练——每次都是新鲜的 start state。
但真实的软件开发是一个部分可观测的、状态ful 的、带历史依赖的序列决策过程。Agent 今天的决策,通过代码库的当前状态,影响明天能做的事。
EvoClaw 的里程碑 DAG,本质上是对这个”依赖图”的显式建模。
局限与开放问题
- 成本:完整评估一次约 $500(Claude Opus 4.5),限制了大规模实验
- 语言覆盖:5 种语言(Go、Rust、Java、TypeScript、Python),但每种数量有限
- 无法测出所有类型的技术债务:只建模了可测试的功能依赖,架构层面的隐性耦合很难被 F2P/P2P 测试捕获
- 里程碑粒度仍有主观性:虽然 CV 控制了大小分布,但里程碑的”功能内聚性”由 LLM 判断,可能有噪声
关联论文
- SWE-bench:Commit 级别的独立任务评估,EvoClaw 的前身
- SWE-CI:链式 commit-to-commit CI 轮次,但没有里程碑粒度和 DAG 依赖
- SlopCodeBench:测量结构性腐化,但粒度是手工设计的任务
- FeatureBench / SWE-Dev:独立特征级任务,同样缺少时间维度
结论:EvoClaw 最重要的贡献不是具体的算法或数据集,而是一个问题定义——它清楚地说明了”为什么现有 benchmark 测不出代码智能体的长跑能力”,并且提供了第一个可用的测量工具。对未来的 Agent 评估来说,”持续演化”应该成为标配设置,就像”多轮对话”之于对话系统一样。
💬 评论
💡 使用 GitHub 账号登录 即可参与讨论