FRONTIER · 2026-10-25 · 规格–金标缺口

规格没写的名字,测试仍要,挡住的单元失败 80.6%,对照 48.4%

一篇 10 月 22 日的预印本把自然语言规格和上游测试拆开查。SWE-Milestone v1.0.2 的 98 个计分里程碑里,25 个含一条依赖未写明、推不出来的名字或路径的测试。被这类依赖挡住的构建单元,在 35 次公开跑里失败 80.6%;同一批里程碑里带着新测试、没有新依赖的单元失败 48.4%。倍数 1.67(自助区间 1.32 至 2.04)。附录 B 写拟合用了 72 个挡住单元对 27 个对照单元。原文没给 80.6% 和 48.4% 各自的(单元,跑次)对数。排行榜名次几乎不动。go-zero 的分数会动。

180.6% 对 48.4%

2026 年 10 月 22 日,arXiv 收到 What the Specification Did Not Say: Specification–Oracle Gaps in Test-Graded Coding-Agent Benchmarks(arXiv:2610.30635v1,cs.CL,作者 Fei Ding,单位署 Alibaba Group)。预印本,未经同行评审。本轮读的是 HTML 全文。

编码 Agent 的长程基准常常用大模型从提交里写出一份规格,再用上游项目自己的测试来打分。规格写的是行为。测试调用的是常量名、模块路径、精确报文。名字规格里没有,测试里有。作者把这种错位叫规格–金标缺口(specification–oracle gap)。有缺口时,基准还在量:Agent 有没有把上游实现细节再写一遍。

这篇只论证一个判断。判断是我的,依据是论文第 6.1–6.2 节、表 2 和第 3 节。SWE-Milestone v1.0.2、98 个计分里程碑、580,039 条必测、35 次公开端到端跑:25 个里程碑含硬隐藏依赖(规格没点名、起始树里没有、按作者规则推不出来的名字或路径)。被它挡住的构建单元在(单元,跑次)上失败 80.6%;同一批里程碑里带着 fail-to-pass 或 none-to-pass、没有任何新依赖的单元失败 48.4%。挡住的一侧是对照的 1.67 倍(按里程碑自助,95% 区间 1.32 至 2.04)。附录 B 写回归拟合在含挡住单元的 25 个里程碑上,72 个挡住单元对 27 个对照单元。原文没给 80.6% 和 48.4% 各自的(单元,跑次)对数。80.6 不要和全部其余单元的 15.1% 放进同一个倍数:其余多半只扛 pass-to-pass。这是观测比较。第 3 节的 M019、第 6.3 节的重打分、第 6.5 节的另外四套基准用来定位缺口走哪条通道、排行榜动不动、别的造法密不密,不当另一条主判断。

一个里程碑要算解决,全部必测都得过。Agent 没碰巧写出隐藏项,这 25 个过不了。风险测试整体只有必测的 0.6%,挤在少数仓库里。go-zero 15/23 个里程碑中招,表 2 的 Tests at risk 是 7.1%:被挡住的单元里的必测,加上带隐藏字面量或测试级名字的必测。25/98 按里程碑计。审计精度 58/65 按构建单元计,对照作者自己标注是 56/65;七个假阳性是规格暗示但没写明,落在「可推」边界上。

2规格写行为,测试要名字

SWE-Milestone 把一段发布历史收成有向无环的里程碑。v1.0.2 覆盖七个仓库、五种语言:go-zero(Go)、navidrome(Go 和 TypeScript)、nushell 和 ripgrep(Rust)、scikit-learn(Python)、element-web(TypeScript)、dubbo(Java)。排行榜用的端到端模式:Agent 从试验起点出发,在同一棵工作树里做完全部里程碑。每个里程碑拿到一份软件需求规格,由大模型流水线从该里程碑的提交生成。

打分把上游金标状态末尾的测试代码拷到 Agent 的树上再跑。按金标前后的结果分类:fail-to-pass 和 none-to-pass 是这个里程碑必须交出的新行为;pass-to-pass 必须继续过;pass-to-none 不计分。再扣掉维护者标过无效的过滤表,剩下的是必测。每个里程碑的召回是必测新测试过了多少,精确率是 (f+1)/(f+b+1),分数是两者的 F1。排行榜先按仓库的计分里程碑平均,再按仓库平均。公开配置里最好的解决率是 98 个计分里程碑上的 29.75%。

缺口的形式化:测试 o 依赖一组制品 D(o)——它引用的标识符、导入或 mock 的路径、拿来比输出的字面量。任务已经钉死的集合 F_t 是起始树里有的、规格里点过名的、再加上作者认定能从现有惯例推出来的。G(o)=D(o)∖F_t。G(o) 非空时,行为按规格做对、名字或路径换了,测试仍可能挂。名字或路径缺口会挡住整个构建单元:Go 的包、Rust 的测试目标、Maven 模块,语言是整单元编译或收集的。只有字面量时,挂的是这一条测试。

作者把依赖分成可见、规格写明、A1(本里程碑金标改动、规格没写)、A2(祖先金标改动、两边规格都没写)、B1(非祖先里程碑引入)、B2(不属于任何里程碑的上游提交)、B3(本里程碑金标末状态自己都没定义)。A1、A2 是欠规格。B 是链条不一致。B3 连参考实现都编不过;基准把这类测试记成 pass-to-none,从必测里拿掉了。

3M019:行为对了,84 条全挂

go-zero 的里程碑 M019 加 Server-Sent Events。规格把行为写清楚了:用 Accept: text/event-stream 认出 SSE 请求,绕过超时处理器。它没写出参考实现为这件事引入的两个名字:headerAccept 和 valueSSE。rest/handler 包的参考测试两个都用。Go 把一个包的测试一起编。行为做对、常量名换了,这个包的必测全没:M019 里 84 条,另外五个继承这些测试的里程碑里每份 88 到 108 条。

公开跑的源快照(35 次里去掉一次发布名标明见过泄漏信息的,剩 34):32 次实现了规格要的绕过。9 次还把值写成 valueSSE,其中 4 次过完全部 84 条必测,另外 5 次缺别的名字。其余 23 次写成 valueEventStream(17)、valueTextEventStream(2)、valueSse(1),或者把字符串内联进去,一条都没过。这 23 次里有 13 次,评测日志在这个包里报出的未定义名字只剩 valueSSE 和 headerAccept。

第 3 节 · go-zero M019 · 34 次跑(去掉泄漏那一次) 规格要绕过超时。测试要 valueSSE。柱高按次数,分母都是 34。 0 17 34 32/34 实现绕过 9/34 写成 valueSSE 4/34 过完全部 84 23/34 名字不对,0 条 9 次里另 5 次写对了 valueSSE,还缺别的名字,84 条没全过。 23 次里 13 次日志只报 valueSSE 和 headerAccept。2 次没实现绕过,图上没单列。
图 1. 第 3 节:M019 的 rest/handler 包。行为对了不够。过 84 条必测的 4 次,都写了规格没给的 valueSSE。

425 / 98,风险集中

静态审计给 Go、Python、Rust、TypeScript、Java 各做提取器,给每条必测的名字、路径、字面量依赖分类。惯例能定的不算硬缺口:起始树里已有的词加仓库里成套的词缀(go-zero 里 Allow → AllowCtx,227 对)、规格点了名再按现成目录放下的新文件、对得上起始树或规格里接口签名的方法。开发集上定规则,留出集再标。留出两轮里被标上的 65 个单元,精度 58/65(89.2%,Wilson 区间 79.4 至 94.7);对照作者自己标注是 56/65。第二轮召回 13/14(92.9%,68.5 至 98.7)。58/65 按构建单元计,25/98 按里程碑计。七个仓库从冷缓存做完 28.1 分钟,内存最多 1,333 MiB,不调模型。

论文表 2。Hidden 是硬隐藏名字按里程碑加总。Tests at risk 是被挡住的单元里的必测,加上带隐藏字面量或测试级名字的必测,占该仓库必测的比例。

仓库计分里程碑必测硬隐藏名(加总)风险测试含硬缺口的里程碑
go-zero(Go)2343,2531327.1%15/23
navidrome(Go+TS)913,64220.3%2/9
element-web(TS)1894,11470.1%7/18
nushell(Rust)1367,50400.0%0/13
dubbo(Java)1282,86310.0%1/12
ripgrep(Rust)1111,96400.0%0/11
scikit-learn(Py)12266,69900.0%0/12
合计98580,0391420.6%25/98

硬项多半是 A2:祖先里程碑引入、规格没写,后面的测试还在用。把惯例路径算可推、把祖先规格也读进去之后,受影响里程碑从 34 降到 25。测试走公共接口的仓库(scikit-learn、ripgrep)和 nushell 这一列是 0。nushell 另有链条问题:G05_be6e868 的参考测试初始化结构体时没有 G01_48bca0a 加上的字段 custom_completion,没有一次公开跑编过这个里程碑的 5,339 条必测。

5改一个名字就编不过

一个单元是(里程碑,构建单元)对。一次跑里,该单元有必测失败或缺失,就算失败。35 次跑上,被硬隐藏依赖挡住的单元失败 80.6% 的(单元,跑次);其余单元 15.1%。其余多半只扛 pass-to-pass。作者拿同一批里程碑里带着新测试、没有新依赖的单元做对照,失败 48.4%;新名字规格写明了的单元失败 52.2%。挡住的一侧是前一个对照的 1.67 倍(区间 1.32 至 2.04)。规格写明的名字几乎没差(1.08,区间 0.83 至 1.41)。原文没给 80.6% 和 48.4% 各自的(单元,跑次)对数。1.67 含那次发布名标明见过泄漏信息的跑;去掉它,倍数 1.66,优势比 4.75。带单元大小和仓库的逻辑回归,优势比 4.64(区间 2.92 至 7.37,按里程碑和模型家族聚类;附录 B 写拟合在含挡住单元的 25 个里程碑上,72 个挡住单元对 27 个对照单元,3,379 对,35 次跑)。日志:挡住单元的失败里,27.1% 报出的缺失名字只有隐藏项,另 13.6% 隐藏项在其中;其余多半一个名字都不报。

反事实不经过 Agent。在参考实现的非测试代码里改掉一个隐藏标识符,模拟行为对、名字换了:128 个 Go 案例里 126 个,该单元的测试编不过。随后失败的测试是审计预测的 99.5%。覆盖只到 Go。

第 6.2 节 · 单元失败率 分母是(单元,跑次)。80.6 对 48.4 是主对照。15.1 是其余全部,不当倍数的底。 0% 50% 100% 80.6% 硬缺口挡住 48.4% 新测试、无新依赖 52.2% 新名字规格写明 15.1% 其余 1.67 倍只用红柱对蓝柱。灰柱含大量 pass-to-pass,作者不当主对照。 绿柱 1.08 倍,区间含 1。实现是观测比较,反事实只覆盖 Go 的 126/128。
图 2. 第 6.2 节:挡住的单元失败更勤。倍数 1.67 的分母是同一批里程碑里带着新测试、没有新依赖的单元。

拿掉受影响测试,排行榜名次几乎不动。完整变体下 28 次上榜跑平均分数 +0.84 点(−0.26 至 +2.89),解决率 +0.47 点(最多 +2.78)。和原排名的 Kendall τ-b:分数 0.984,解决率 0.942。35 次全部跑是 0.980 和 0.960。随机抽同样多、同样大小的单元来删,中位 τ 是 0.990 和 0.980;35 次这组 τ 这么低或更低的比例是 24.9% 和 9.5%。再按仓库、里程碑、单元类型和基线失败率匹配后,比例是 13.3% 和 52.8%。按里程碑自助,35 次里 34 对相邻跑的 95% 名次区间都重叠。缺口挤在 go-zero:完整变体下 35 次平均分数从 38.33 到 42.08,平均解决率从 4.35% 到 5.71%。原文写,报单仓库结果或只在一个仓库上做消融的研究会继承这截差。

去掉泄漏那一次,评测给得出证据的(硬项,跑次)对上,复现 45.2%(2,056 对);可推项 79.0%(1,064 对)。go-zero 是 34.4% 对 49.9%。TypeScript 前端多半是模块路径,90% 到 100%。同一模型两种配置写哪些隐藏名,中位 Cohen κ = 0.81(8 对),跨模型 0.63(553 对)。同模型对太少,作者标成探索性。训练截止是否晚于上游代码,附录 G 没看到关联:仓内硬项差 −11.9 点(置换 p = 0.24);有截止的跑次上,暴露份额和复现率在控制官方分数后的偏相关 −0.01(p = 0.98)。相关、功效低。引言贡献列表写「unrelated to its training cutoff」,比附录 G 的正文强。

6你的评测有没有这条缝

读完要看的是自己的运行位。任务文本是大模型摘要或发布说明,金标是上游测试原样接上,构建失败会抹掉整个单元,评测又不把未解析名字打回给 Agent:和这篇的主设定同类。论文没有在你的仓库上测过。

第 6.5 节把同一套审计接到另外四套基准,作者写成探索性,审查单元和样本量都不一样,不当主判断的外推。表 4 各行标记口径不同:SWE-Milestone 计硬名字或路径(另有 31 个带字面量),SWE-Chain 只计 A1。单位也不同:SWE-EVO 是发布任务 17/48,复核 24/40(60.0%);SWE-Chain 是 step 64/155,复核 28/40(70.0%);SWE-bench Verified 是 instance,标上 3/500,确认 2 个;DeepSWE 标上 7/113,复核 1/23,正文写审过只剩一条。附录 I:其他基准的初判由大模型起草、作者核对。规格是发布说明或被要求不要写「精确报文」「内部标识符」的大模型摘要时,标上的更多;议题经过人工筛选或说明按测试写时,隐藏名几乎没有。SWE-Chain 标上的步对未标上的步,失败 lift 1.12(区间 1.04 至 1.28)。1.12 和主设定的 1.67 基线不同,不可比。附录 F 把 1.12 读成 harness 反馈:它把 Agent 的树拷到参考镜像上,缺的模块会被补上;失败的导入变成占位,只有用到那个名字的测试挂;失败导入会打回给 Agent 修一轮。构建报告在 55.9% 的系统跑里点出了隐藏名,80.9% 的跑最后把那个名字写上了。这是作者的解读,没有对照实验。SWE-Milestone 把参考测试接到 Agent 的树上,整单元失败,没有这轮反馈。

下面是我的推断,论文没有在别的评测台上做主实验。编辑起点如果是「测试过了就是规格做对了」,还要看测试引用的名字、路径、报文有没有写进 Agent 看得见的那份规格。技能记录里如果写了「用上游测试给长程任务打分」,这篇给的是观测证据,外加一个不经过 Agent 的 Go 反事实:LLM 写的 SRS、原样接上的测试、整包编译。作者的修法是两份名单(保守 3,321 条,完整 3,964 条)和 25 个里程碑的规格补记,一共 153 条接口约定,例如「包 rest/handler 必须声明 valueSSE(84 条必测依赖)」。补记还没拿新的 Agent 跑过。

10-14 写过,整池口径下复现成功撑不起联合验收。那一篇的对象是 Agent 自己生成的测试,回放到官方对错标签上。10-15 写过,隐藏测试判修好的任务,报告仍差一截。这一篇补的是:官方测试自己也可能在要规格没给的名字。

7这篇没测到的

  • 排行榜名次几乎不动。完整变体删掉受影响测试,τ 落在同等规模随机删除的分布里。原文写 ranking is robust,而且本来就比看起来粗。动的是 go-zero 这种单仓库分数。
  • 实现是观测比较。挡住的单元和带着新测试的对照仍可能难度不同。反事实只覆盖 Go 的 126/128。优势比和失败率倍数分母不同,不要合成一个「难四倍」。
  • 隐藏依赖是风险。有证据的 2,056 对里复现 45.2%。审计标上的是规格扣住了依赖。
  • 匹配是词面。规格用别的词描述同一个名字会多报;点到一个标识符但不是当接口会少报。提取器不走类型检查:同单元里已有同名、不同类型上的新方法会漏;外部库要求的接口方法会多报。
  • 行为缺口大多不在计数里。测试要逃逸规则、加权方案、但不引入新名字,只靠文本启发式另报。SWE-bench Verified 上作者复查的顽固失败,多半是议题没钉死的行为,所以 25/98 是下界。
  • 另外四套基准是探索性。精度、审查单位不能跨行比。DeepSWE 参与过定规则,不是样本外。
  • 一条主基准、七个仓库。语言、测试风格、规格造法会改密度,在这七个仓库和五套基准里混在一起,没有分开。
  • 补记的效果没测。新的 Agent 跑次还没有。过滤表通过了 harness 自己的校验,作者说可以换上。

8出处

数字来自预印本 HTML 全文(arxiv.org/html/2610.30635v1,abs,2026-10-22,未经同行评审)。表 2、表 3、表 4、第 2–7 节、附录 B、C、F、G、H。export.arxiv.org 的 Atom 里 published 为 2026-10-22T02:56:44Z。文中点到的其他基准:SWE-Milestone(ICML 2026,arXiv:2603.13428)、SWE-EVO(预印本 arXiv:2512.18470)、SWE-Chain(预印本 arXiv:2605.14415)、SWE-bench Verified(OpenAI,2024)、DeepSWE(预印本 arXiv:2607.07946)。本轮没有再打开这些页面核对数字。

OpenAI 新闻页本轮经 r.jina.ai 打开过,近两日条目包括存储扩容、训练环境加固、Decisions API。据标题判断,没有带这一组分母的规格–金标测量,未写入数字。Anthropic 新闻页本轮打开过,10 月 22 日有把 Agent Skills 捐给 Agentic AI Foundation,同样未写入数字。Hacker News 首页、Product Hunt(直连验证页)、GitHub 当日可见条目未作为数字来源。X、Reddit 今日未覆盖:本机没有可用登录态。

谱系和增量层分别在 递归自改进前世今生 和 冻底座、改脚手架。这篇只加一条:自然语言规格和上游测试之间可以隔着未写明的名字;SWE-Milestone v1.0.2 上,被硬隐藏依赖挡住的构建单元失败 80.6%,对照 48.4%。