Specification-first convergence with an AI coding agent: a case study of dismantling a core architectural invariant across 189 files in a 717k-line codebase with no test oracle and no human code review
Joel Abenhaim
cs.SE, cs.AI
2026-08-12
单作者用规格先行协议驱动 AI agent 重构 717k 行闭源代码库:14 轮规格打磨加 17 轮代码核查在首次运行前修掉 201 个缺陷,三天 2430 美元完成,三十次使用零观察到的 bug。
现在的 AI coding agent(Claude Code、Codex、Copilot、Cursor)在孤立任务上吞吐量很高,但通行实践都默认一件事:生成的代码要有人审。审阅本身有扩展上限。一项覆盖数千名开发者的遥测研究显示,AI 辅助工作产出了更多 PR,审阅时间却最多上涨 91%,交付指标整体持平。当一个改动横跨几百个相互依赖的文件、要同时保住几十个隐式不变量时,没有任何审阅者能把整张依赖图装进工作记忆。
这篇论文报告的案例更极端:任务本身没有测试先知(oracle,即预先存在、能判定正确行为的测试集)。要实现的行为,「生成过程在面板关闭后存活」,在改动之前根本不存在,所以不可能有测试编码它。这正是 SWE-bench 那类基准的前提失效的地方:基准假设正确行为已经写在测试里,agent 只需找到满足测试的代码。
被改的系统是一个 VS Code 扩展形态的 AI coding agent,717,725 行 TypeScript、3,648 个文件,闭源,从未公开发布,排除了 agent 从训练数据里复读现成方案的可能。任务:拆掉「UI 面板在 AI 请求期间必须保持打开」这条核心生命周期不变量,让流式生成在面板关闭后存活、重开时重新挂回同一条流,不丢 token 也不重复。
核心思路是把控制点前移:不事后审代码,而是事前审意图。协议分五阶段,各阶段独立会话:
两个设计选择值得点出。第一,核查者不是另一个 agent,是同一 agent 的全新会话,分离性来自那个先于代码冻结的外部参照物,这与「模型没有外部参照时自我修正无效」的已有发现一致。第二,缺陷越早抓越便宜:规格里的缺陷改一段文字,同样的缺陷进了代码就要改一组联动改动。这是 refine 阶段存在的理由。
| 项目 | 数字 |
| 首次人工运行前修正的缺陷 | 201(规格约 85 + 代码 116) |
| 改动文件 | 189(含 31 个新建);连同提取阶段两个 commit 共 288 文件 |
| 插入/删除行 | 34,770 / 16,422 |
| 耗时与成本 | 三天,2,430 美元推理费 |
| 运行表现 | 首次运行即符合规格,之后约 30 次会话无观察到的 bug,存量单元测试无回归 |
整个第二阶段从头到尾没有运行过程序,第一次人工执行发生在第 17 轮核查之后。成果当天发布为 v2.3.0,任何人可下载验证:旧版关面板即杀掉请求,新版关面板再点开会挂回同一条进行中的流。1,500 多页法文原始会话日志连同冻结规格全文公开,可直接读,也可丢给语言模型做一致性核查。
它演示了一条与「加测试、加审阅」不同的路:当改动大到审阅不再是现实的质量门、目标行为又没有测试可依时,把正确性押在一个反复被现实挑战过的书面规格上。Bun 转 Rust 那次工业级演示靠的是百万断言的存量测试集;这个案例什么先知都没有,参照物是现造的。对做 agent 工程的人,协议本身(refine 直到不动、冻结、verify 直到连续零发现)可直接抄,它对单次通过的模型可靠性没有要求,只要求重复收敛。2,430 美元换掉一次原本要重写的子系统重构,这个成本结构对任何维护大型遗留系统的团队都有参考价值。
作者自己列了七条,挑要害的说:单一案例、无对照实验、闭源无法第三方复跑,而且作者既设计了工具(AI Sovereign Labs 发行的 AICode)又执行了操作又写报告,利益冲突是结构性的。代码库本身就是同一作者用同一套方法、约 4,000 个 commit 建起来的,agent 与代码库的风格同源,换一个代码库还能不能收敛完全未知。
读下来还有两处存疑。「无观察到的 bug」只覆盖约 30 次使用和存量测试,不是潜在缺陷不存在的证明,作者也承认这点。refine 轮次的修正数有部分是估计值(平台迁移丢了记录,缺的轮次一律记约 5),85 这个总数不硬。收敛判据「连续两轮零发现」是经验停止规则,不是正确性证据:同一 agent 找不到,不代表偏差不在。