为什么重要
过去两年仓库级编码基准(SWE-bench 及其衍生)有一个共同的隐含假设:任务和环境在 Agent 跑到一半时不会变。真实开发不是这样——同事改了你要改的那个文件、依赖升了个小版本、端口被占、锁被别人拿走、需求方中途补一句”还要兼容旧接口”、你刚读到的测试结果是更新前的。
SWE-Shift 的关键设计不是”出更难的题”,而是配对续跑(matched continuation):先让 Agent 正常跑到中间某个点,把这个时刻的执行状态(历史、工作区、可观测信息)存成快照,然后从同一个前缀分叉出两条续跑——
- Clean:不加任何干预,继续跑完;
- Shifted:注入一次与任务相关的变更,再继续跑完。
这样一来,如果 Agent 在 Shifted 下失败,就能判断”它本来也做不出来”还是”它本来做得出、被变更打断了”。只看变更后的失败率回答不了这个问题,而此前所有基准都只给后者。这是本卡最重要的读数。
构建方式
12 个变化族 × 每族 10 个场景 = 120 个场景,分为三大组:
| 族 | 变了什么 | 续跑时必须做到什么 |
|---|---|---|
| F01 用户实现 | Agent 编辑区内被加入了合法代码 | 完成原任务,同时保留用户的行为 |
| F02 用户契约 | 公开 API 或数据契约变了 | 满足新契约并保留兼容性检查 |
| F03 直接协作者 | 协作者改了目标代码或直接依赖 | 整合变更并保留协作者行为 |
| F04 间接协作者 | 传递依赖变了,本地目标代码没动 | 考虑依赖变化并保留协作者行为 |
| F05 运行时与资源 | 进程、端口、锁、缓存、资源属主变了 | 恢复到合法运行时状态,不伤及无关资源 |
| F06 工具与会话 | 会话、授权、schema 或协议变了,之前的调用失效 | 改用当前允许的接口,保留无关会话状态 |
| F07 外部效应 | 操作的实际结果与响应所说的不一致 | 查效应账本,保留合法效应,只做被授权的补偿 |
| F08 披露 | 一个此前隐藏的约束在中途变得可见 | 在同一目标下满足被披露的要求 |
| F09 纠正性反馈 | 新证据推翻了此前的判断或实现 | 应用并保留该纠正,完成未变的目标 |
| F10 目标修订 | 授权更新修改了目标与验证器 | 跟随新目标,保留仍然生效的要求 |
| F11 陈旧证据 | 结果指向的是更新前的状态 | 在改代码或宣布完成前取得绑定当前状态的证据 |
| F12 错绑证据 | 证据指向另一个请求、分支、会话或相互冲突的来源 | 通过允许的查询核对其来源,验证目标状态 |
干预时机不是固定的:每个场景在轨迹的 10%–90% 共 9 个位置(T10…T90)各排一次,每个系统 1,080 个定时单元。这解决了”只在某个固定时刻注入”带来的偶然性。
成功不是”测试过了”:终态要同时通过七类检查——任务、保全、禁止副作用、当前权威(目标与验证器版本匹配)、新鲜观测(更新后、第一次改动前必须有一次允许的观测)、恢复顺序、恢复完成、暴露与预算。这七类正是原任务测试覆盖不到的部分,也是本基准的核心增量。
关键发现
一、17 个编码 Agent 系统全部下滑,无一例外。 Clean 的成功率区间是 10.71%–67.35%,Shifted 只剩 1.16%–24.79%,配对成功率 PSR 只有 0.90%–20.34%。头名 GPT-6 Astra 是 67.35 → 24.79,配对成功率 20.34%。能力没有消失,是”存活率”极低。
二、Clean 高不等于留得住。 论文专门给了反例:Kimi-K3 的 Clean 是 31.41%、PSR 8.20%、CRR 25.12%;DeepSeek V4-Pro 的 Clean 更低(29.37%),PSR(8.83%)和 CRR(29.15%)却都更高。Kimi-K2.6 的 Clean 只有 20.50%,CRR 却是全场最高的 34.63%。CRR 是条件于 Clean 成功的保留率,它和绝对分数给出的是不同排序——这正是”配对”设计买到的东西。
三、两个变化族是全体归零的硬失败点。 工具与会话变化(F06)和陈旧证据(F11)在 17/17 个系统上的 PSR 都是 0.00%。运行时与资源变化(F05)里 16/17 个系统归零,唯一拿到分的是 MiMo-V2.5-Pro 的 0.60%。披露变化(F08)有 13/17 个系统归零。
四、剩下的族暴露的是选择性长处,不是通用能力。 Kimi-K3 在 F01(用户实现)上能到 63.50% PSR,Claude Fable 5.1 60.80%;F04(间接协作者)上 GPT-6 Astra 57.30%、GPT-5.6 Sol 39.30%;F07(外部效应)上 Astra 只有 22.10%,13/17 个系统归零。总榜 PSR 高的系统,在每一个族上都不会都高。
五、干预来得越晚,有的系统越差、有的反而更好。 比较 T70–T90 与 T10–T30 的平均 PSR:GPT-6 Astra 掉 20.05 个百分点、Claude Fable 5.1 掉 15.43、GPT-5.6 Sol 掉 12.53、Claude Opus 5 掉 11.93;而 GLM-5.3-Flash 涨 2.97、Kimi-K2.6 涨 2.20、DeepSeek V4-Flash 涨 1.60。这不是噪声,是两种截然不同的失败剖面:前一批在上下文与已完成工作变多之后更难掉头,后一批反而受益于”还没写太多”。
六、测试通过不等于工作保住了。 三个 24 例定性审计案例很有代表性:Django 那条,协作者加了一个控制迁移操作合并时机的 API,Agent 先用了它、修原问题时又把它删了,39 条原测试全过,但保全检查报”协作者的 API 没了”;Astropy 那条,Agent 的补偿动作本身成功了、工具记录也确认了,工作区保全检查仍然失败;scikit-learn 那条,Agent 恢复了当前证据的访问权却没再查一次就改了代码,任务检查通过但缺失必需的新鲜观测,且改动超出了允许范围。
七、给提示和给状态都只能救回一小部分。 在 5 个系统上的累积干预(变更通知 → 只读状态刷新 → 移除变更前对话)合计只加 5.98–8.71 个 PSR 点,最终 PSR 仍只有 10.89%–17.54%。历史重置在 5 个系统里有 4 个贡献最大(MiniMax-M2.7 加了 5.50 点),但 Qwen3.8-27B 反而是状态刷新(2.89)比历史重置(2.63)更值。
八、加 token 预算在 4 倍之后基本失效。 后分叉预算从 B 每次翻倍到 16B(B = 100 万 input+output token):每次翻倍到 4B 能加 0.79–2.67 点,4B→8B 只加 0.12–0.28 点,8B→16B 是 −0.09 到 +0.15 点。从 4B 到 16B 四倍预算总共只换来 0.19–0.28 点,16B 时 PSR 仍在 7.15%–11.98%。 和”想得久就是没线索”是同一个形状。
与同类基准的差异
论文的对照表(Table 1)逐条比了七个维度——中途变更、同一前缀、跨层面变更、保全/伤害检查、多位置注入、轨迹 oracle、需要新鲜证据。SpecPath、SyncMind、ToolSandbox 各只满足 1–3 条;SWE-Touch 满足 3 条;GAIA2 满足 4 条;SWE-Shift 是唯一七条全中的。
它和最接近的几个兄弟的区别值得单独说:SWE-INTERACT 与 SWE-Together 改的是需求(对话里用户怎么说),SWE-Shift 改的是世界(代码、依赖、运行时、会话、证据来源);SyncMind 只在恢复开始前才让状态变陈旧,SWE-Shift 让变更发生在轨迹的九个不同位置;SpecPath 在实现开始前给完整契约,SWE-Shift 在实现过程中改契约。
局限
作者自己写得很清楚:120 个场景里有一部分共享题目根;每次运行只注入一次变更(真实开发里变更是重复的);诊断性对照只覆盖 5 个系统;配对固定了记录下来的历史与工作区状态,但模型采样随机性没有被控制(同一配置重复跑的方差未测,这一点可对照「Agents Are Systems, Not Models」里约 54% 方差来自重复同一配置的结论);干预位置与执行阶段、累积上下文、剩余工作量是耦合的;后分叉 token 预算是固定的。
此外,Agent 侧的形态差异也要留意:闭源系统走的是各家原生应用(Codex app / Claude Code app,均 xhigh),开源权重系统在 4 台各 8 张 B300(共 32 卡)上本地serving。“系统”而不是”模型”是这里的被测单位——和 Computer Use 类基准一样,脚手架差异会被算进分数里。
怎么读这张卡
引用本基准时请带上四列中的至少两列:只报 Clean 等于没报这个基准,只报 Shifted 无法判断是不是本来就做不出来。CRR 是给”这个系统有多抗变更”下判断时最该看的一列,因为它已经把”基础能力差”这个混淆项除掉了。另外,F06 与 F11 全体归零是到目前为止本基准最硬的一条结论:它不依赖任何模型排名的可信度。