# Agent 到底凭什么说“完成了”

last_reviewed: 2026-07-27

## 先说结论

这轮不设计新 benchmark，也不跑我们自己的 Agent。研究问题只有两个：

1. Agent 的“任务完成”到底应该证明什么；
2. 当验证不通过时，系统怎样恢复，而不是继续自称成功。

本轮建立了 40 篇全文池，核对其中 37 篇的实验结果、消融或限制章节。证据覆盖
2023-2026 年的状态型 benchmark、Agent judge、程序/策略验证、故障恢复、代码测试审计和
运行时门禁。能够跨论文站住的一般结论有八条。

1. **“完成”不是 Agent 的一句话，而是关于外部世界的可检验主张。** 至少要证明目标效果
   已发生、禁止效果未发生、必要过程没有被绕过；证明不到的部分必须留下不确定性，不能用
   自信语气补齐。
2. **大家评的不是一种笼统的 Agent 能力。** 真正可诊断的对象至少包括目标理解、工具使用、
   状态改变、策略遵守、协作、失败发现、根因定位、恢复选择、恢复后的复验和跨次可靠性。
   “题做完了吗”只是这些能力压缩后的一个结果位。
3. **不存在一个通用判官。** 确定性状态检查精确但覆盖有限；轨迹检查能看过程但需要规则；
   LLM judge 能处理语义等价和开放结果，但会把合理叙述误判为成功。可靠评估来自分层证据，
   不是换一个更大的 judge。
4. **验证和恢复是两个独立问题。** 检出失败只把“假成功”变成“明确失败”；能否恢复还取决于
   是否找对原因、是否有替代路径、先前副作用能否回滚，以及剩余预算是否足够。
5. **没有固定的恢复阶梯。** 重试适合瞬时故障，局部修复适合已定位错误，重规划适合路径失效，
   升级适合能力或权限不足，停止适合不可逆或证据不足。始终反思、始终重试、始终重规划都会
   破坏原本正确或仍可恢复的执行。
6. **越会改变世界的动作，越应该在动作前验证。** 读操作失败通常可重试；取消订单、改代码、
   发消息、付款等变更操作会留下状态，事后发现错误可能已经太晚。前置门禁、幂等键、变更账本
   和补偿动作是恢复能力的一部分，不是额外的安全装饰。
7. **单次成功不能代表可靠。** 多个 benchmark 都显示 `pass^k` 随重复次数快速下降，或者同一
   任务在不同运行中反复翻转。Agent 评估必须同时报告单次能力、重复可靠性、回归、成本和
   无法判定项。
8. **最近真正的进步主要在“把失败说清楚”，不是已经解决了可靠 Agent。** 2026 年的工作开始
   把结果、过程、副作用、验证器误差、恢复路由和停止条件分开测；但开放任务的契约编写、
   隐性语义错误、替代路径、真实回滚和分布变化下的 verifier 仍未解决。

## 大家实际在评价什么能力

把一条 Agent 轨迹只压成成功/失败，会丢掉最重要的诊断信息。现有研究实际覆盖的是下面这些
不同能力：

| 能力 | 要回答的问题 | 可观察证据 | 常见误判 |
| --- | --- | --- | --- |
| 目标与约束理解 | Agent 知道用户真正要什么、不能做什么吗 | 任务契约、澄清记录、约束命中 | 做了相近任务但漏掉限制 |
| 计划与路径选择 | 是否选了可执行、代价合理的路径 | 计划、依赖关系、替代路径 | 最终碰巧成功掩盖无效绕路 |
| 工具契约遵守 | 工具、参数、调用顺序是否正确 | schema、返回码、调用轨迹 | 文本答案合理但工具根本没成功 |
| 环境状态改变 | 目标效果真的发生了吗 | 数据库、文件、UI、服务状态差异 | Agent 说“已完成”，状态没变 |
| 副作用控制 | 是否只改变允许改变的内容 | before/after diff、允许变更集合 | 测试通过但破坏无关状态 |
| 程序与策略遵守 | 是否经过必须的确认、读取、授权和验证 | 轨迹谓词、时序约束、审计日志 | 结果正确但过程违规 |
| 人机/多方协作 | 是否能让用户或其他 Agent 完成其控制的步骤 | 共享状态、通信断言、交接结果 | 自主模式强，指导用户时失败 |
| 失败检测 | 是否知道当前结果不可信 | 异常、状态冲突、verifier rejection | silent failure |
| 根因定位 | 哪一步、哪个组件使任务注定失败 | 责任步骤、证据链、反事实 | 把报错位置当成错误来源 |
| 恢复决策 | 此时应重试、修复、重规划、回滚还是升级 | 故障类型、当前状态、预算 | 对所有失败使用同一种动作 |
| 恢复执行 | 下一次是否真的恢复目标状态 | 独立复验、原/新轨迹对照 | 生成了漂亮修复建议但没有恢复 |
| 诚实收尾 | 最终声明是否与证据一致 | 声明-状态一致性 | 假完成、夸大部分完成 |
| 重复可靠性 | 同类任务多次运行是否稳定 | `pass^k`、方差、翻转和回归 | 用一次幸运成功代表系统能力 |
| 效率与边界 | 成功用了多少时间、调用、Token 和权限 | 预算、延迟、调用和升级记录 | 用无限尝试换取高成功率 |

因此，严谨的评估问题不是“这个 Agent 有多少分”，而是：

> 在任务族、环境、工具、权限和预算都固定时，这个系统在哪一种能力上比基线更好；这个变化
> 带来了哪些收益、回归和新的不可判定项？

## 一般结论一：完成是证据合同，不是最终文本

### 为什么成立

- `From Confident Closing to Silent Failure` 在 tau2 的 airline/retail 失败轨迹中找到
  45%-48% 的 false-success 比例，在 AppWorld 明确声称完成的失败轨迹子集中找到 75.8%；
  这些数字的域和样本条件不同，不能直接互比，但共同说明 Agent 自述不是结果证据。
- tau-bench、AppWorld 和 OSWorld 都把完成落到数据库、文件或桌面状态；AppWorld 还检查
  预期变化之外是否出现额外变化。
- `Are "Solved Issues" in SWE-bench Really Solved Correctly?` 发现：877 个已经通过 benchmark
  测试的补丁中，补跑开发者测试仍能直接发现平均 7.8% 的错误；进一步差分检查又暴露更多
  可疑行为。即使“测试绿了”，也只证明测试覆盖到的合同。
- `Beyond Task Completion` 表明状态成功仍可能是程序失败：在 tau-bench 上加入必要过程检查后，
  不同模型的成功率从原始 40%-79% 降到 9%-58%。

### 能推出什么

完成声明至少需要三类合同：

```text
positive effects: 必须发生什么
negative invariants: 什么不能发生
procedure/evidence: 哪些确认、授权、来源或验证不能省略
```

如果任务目标本身含糊，或者关键效果在系统外不可观察，就不能可靠输出 `PASS`。合理状态应包含
`AMBIGUOUS` 和 `UNVERIFIABLE`，而不是逼 judge 猜一个二元答案。

### 不能推出什么

这不意味着每个任务都要写成完整形式化证明。它意味着系统只能在证据覆盖范围内声称完成；
开放任务可以使用人工、语义 judge 和抽样检查，但必须保留其误差和未覆盖部分。

## 一般结论二：评估对象是整个运行协议，不只是模型

同一个模型换工具 schema、用户模拟器、服务商、时间预算、测试集或 Agent loop，结果都会变。
因此一个 Agent 分数实际衡量的是：

```text
model × prompt × orchestrator × tools × environment
× user/simulator × verifier × budget × version
```

证据包括：

- DynamicMCPBench 的 126 次 live MCP 重放中，只有 36% 返回完全相同，33% 发生漂移，32% 已损坏。
- AgentLens 明确把 leaderboard 行定义为模型、provider、Agent loop、工具接口和执行策略的整体；
  其 Kimi 案例还显示 provider 的工具参数解析错误会被误读成模型能力差。
- `Baselines Before Architecture` 在同一安全 benchmark 上发现，模型版本升级本身可以吞掉大部分
  所谓架构增益，剩余的 architecture residual 才是可归因部分。
- tau2 的用户模拟器在 retail/airline 中仍有 12%-13% 的 critical error；benchmark 环境也会制造
  Agent 不可能完成的失败。

所以每个结果都必须携带可复现 manifest，至少记录模型版本、prompt、工具、环境快照、validator、
预算和重复种子。没有这些信息，跨版本分数没有稳定含义。

## 一般结论三：不存在一个通用 verifier

### 确定性状态检查

优点是可复现、低误报、适合发布门禁。缺点是合同需要人工编写，且容易漏掉合法替代路径、过程
违规和测试未覆盖行为。

- AppWorld 用任务状态差异同时检查目标效果和 collateral damage，是目前较强的结果型设计。
- DynamicMCPBench 的 Tier-1 只按工具效果判定，不要求复现参考路径；人工复核最强本地模型的
  750 个任务时，grader agreement 为 74%，说明即使效果型规则也不是天然完备。
- OSWorld 报告构建 369 个任务约花 1800 人时，而且 evaluator 仍不能发现所有潜在副作用。

### 轨迹和程序检查

优点是能检查确认、授权、顺序和禁止动作。缺点是规则容易过严、产生 vacuous refusal，或把合法
替代路径判错。

- AgentLTL 显示程序合规和答案正确可以分离；阻断/告警在 7 个模型中改善 5 个、恶化 2 个。
- `Reason Less, Verify More` 在 tau2 airline 的特定取消政策上把成功率从 29.6% 提到 42.0%，
  但一个 baggage gate 只有 5% precision，迁移到 retail 也没有增益。
- Procedure-Aware Evaluation 证明状态成功会掩盖程序违规，但它的过程 gate 仍依赖作者定义的
  policy 和语义 judge。

### LLM/Agent judge

优点是能处理开放文本、语义等价、长轨迹和部分完成。缺点是会过度接受合理叙述，存在模型家族
偏好，重复采样只能减小方差，不能消除系统偏差。

- AgentRewardBench 上，官方规则 evaluator 的 precision/recall 为 83.8%/55.9%；最好的 LLM
  judge precision 仍低于 70%。规则更容易漏报，LLM 更容易误报。
- AJ-Bench 中让 judge 使用工具能明显提高判断，但不同任务域的 false-positive rate 仍为
  8.77%-56.60%。
- AgentLens 的两个 judge 在 23% 的 task-metric 比较上选择不同胜者，其中 18% 是各自偏向
  自己模型家族；而该论文尚未完成正式的人类一致性研究。
- `LLM-as-a-Verifier` 显示连续分数和重复采样可以改进候选选择，但失败轨迹上的 progress 相关性
  仍然很高；“看起来在进步”不是完成证明。

### 一般组合

合理顺序不是让三类 evaluator 投票，而是让它们承担不同责任：

1. 确定性检查负责可机器观察的效果和禁止副作用；
2. 轨迹规则负责必须遵守的程序、权限和时序；
3. LLM/Agent judge 只处理剩余语义、等价路径、部分进展和证据摘要；
4. 高风险、冲突或不可观察任务升级给人。

LLM judge 可以升级一个规则未覆盖但证据充分的等价成功，也可以提出需要人工看的异常；它不应
单独把一个确定性失败降级成成功。

## 一般结论四：verifier 必须与 actor 分权

同一个 Agent 同时行动、解释和批准自己，最容易出现 reward hacking 和确认偏差。

RECEIPT 在白盒 XSS 任务中给出了本轮最直接的对照：同一 Claude Opus 自评的 27 份报告只有
10 个真阳性；加入浏览器判决、隔离、可重放 PoC 和角色分离后，作者报告 30/30 真阳性。该结论
只在一个 XSS harness 和一个模型上成立，但其消融清楚表明，关键不是“judge 更会思考”，而是
verifier 拥有 actor 无法伪造的环境、权限和重放证据。

可以外推的系统原则是：

- actor 不能修改 validator、隐藏检查和判分环境；
- 验证从新鲜状态读取，不相信 actor 转述的工具结果；
- 高风险结果在隔离环境重放；
- 证据保留 provenance、版本和时间；
- verdict 必须绑定到具体 artifact，而不是绑定到一段叙述。

这仍不是万能证明。独立 verifier 也可能合同不完整，但它至少消除了最危险的自我认证闭环。

## 一般结论五：验证通过前，不应把路径写死

评估应约束“必须发生的效果”和“不能违反的条件”，而不是要求 Agent 逐步模仿一条 gold
trajectory。否则创新或等价路径会成为假阴性。

- AppWorld 的状态测试有意忽略具体路径，并允许多个合法实现。
- DynamicMCPBench 采用 path-agnostic effect scoring；论文同时发现 reference answer 本身完全
  正确的比例只有 79%，不适合拿参考文本直接判 Agent。
- ToolSandbox 用 milestone DAG 表示必要事件，并允许中间顺序有弹性，同时用 minefield 表示
  禁止事件。

但路径并非永远无关。授权、用户确认、来源读取和不可逆操作属于完成合同的一部分。正确区分是：

```text
implementation path: 原则上允许等价
causal/procedural obligation: 若任务要求，则必须证明
```

## 一般结论六：验证失败不等于会恢复

恢复至少要经过五个不同阶段：

```text
detect -> localize/diagnose -> choose response -> execute response -> re-verify
```

现有结果显示每一段都可能断：

- ToolMaze 中，即使提供 hint，隐式永久故障的平均 recovery rate 仍只有 17.58%；显式瞬时故障
  为 81.44%。语义上不明显、且不会自行消失的错误最难。
- `Hell or High Water` 明确禁用第一选择并保证存在最多三步的合法替代路径，多个模型仍出现
  约 22-30 个成功率点下降；53%-66% 的失败发生在工具搜索阶段。
- R2Act 在 Kubernetes 故障中发现，最强设置的根因服务定位可到 91.4%-99.7%，但恢复动作有效率
  只有 36.8%-60.3%；知道哪里坏了不等于知道怎样恢复。
- AgentDebug 的错误步骤/模块完全定位准确率只有 24.3%；AgentDebugX 的更新方法把严格
  agent+step 定位从 21.7% 提到 28.8%，仍然很低。
- AgentDebugX 在 73 条 GAIA 失败轨迹上单次重跑修复 13 条，强于三个基线的 4-6 条；它证明
  更具体的归因可能帮助恢复，但还没有隔离归因本身的因果贡献。

因此应把“失败检测率”“根因定位率”“恢复建议质量”和“最终恢复率”分开报告。只展示最终分数
会让我们不知道增益来自更好的诊断、更多尝试，还是更强的 fallback 模型。

## 一般结论七：恢复策略必须依赖失败状态

CodeRescue 在约 2.73 万次代码任务尝试上，把失败后的选择限制为 `reflect / replan / escalate`。
固定策略中，恢复率分别为 27.5%、45.3%、68.6%；学习到的 router 为 81.7%，且成本低于始终
升级。其可恢复失败中，约 28% 只能由便宜策略解决，45% 只能升级解决，27% 两者都能解决。

该实验仍是单次路由、代码任务和特定模型组合，不能直接当生产策略。但它支持一个一般判断：
**失败类型、现有状态、可逆性和预算共同决定下一步，不存在统一最优恢复动作。**

建议使用下面的语义，而不是一个含糊的 `retry`：

| 动作 | 适用条件 | 不该使用时 |
| --- | --- | --- |
| retry | 超时、限流、偶发网络/工具错误，且动作幂等 | 权限、schema、语义错误或已产生副作用 |
| repair | 错误局部、责任步骤较可信、旧状态仍有价值 | 根因未知或基础计划错误 |
| replan | 原路径失效，但目标仍可达且可重新探索 | 已有不可逆副作用未处理 |
| substitute | 有语义和权限兼容的替代工具/数据源 | 只因为名称相似 |
| rollback/compensate | 先前变更可撤销或可补偿 | 没有变更账本、补偿本身风险更高 |
| escalate/clarify | 权限、能力、意图或证据不足 | 可以由确定性局部恢复解决 |
| abstain/stop | 不可逆风险高、预算耗尽或没有可信路径 | 仍有低风险、可验证的恢复动作 |

`Don't Blindly Trust It` 进一步说明，检测器只能过滤坏反馈，无法替代 fallback：在 recoverable
conflict 上，首步预测器 AUC 会跌到 0.516；某些 requery 策略甚至让 Llama 继续下降。

## 一般结论八：恢复循环必须有停止条件

“验证-修复-再验证”不是越多轮越好。

- VRR-Stop 在刻意制造 verifier/repair 不匹配的 stress 条件中，固定五轮修复可把正确率从
  0.700 降到 0.116；它的 stopping rule 恢复到 0.722。巨大差值是 stress-specific，但足以证明
  无条件循环会主动破坏正确答案。
- Reflexion 的 HumanEval 消融中，无测试的自我反思从 60 降到 52；测试加反思才到 68。
- CRITIC 在数学错误上修复了 32.2% 的初始错误，同时把 14.3% 的原结果改错；外部工具反馈是
  关键，模型自评并不可靠。
- AgentLTL 的 soft-block 因强制终止，在 7 个模型中的 4 个表现最差。

停止条件至少应考虑：

```text
new independent evidence?
failure class changed?
state improved without new violations?
remaining action reversible?
expected gain > cost/risk?
```

重复询问同一个有偏 judge 只会得到更稳定的偏差。只有新增独立证据或改变恢复策略，下一轮才有
信息价值。

## 最近半年到底进步了什么

这不是一个“成功率持续上涨”的故事，而是研究对象逐步拆开了：

| 阶段 | 主要问题 | 得到的东西 | 仍缺什么 |
| --- | --- | --- | --- |
| 2023 | 模型能否根据反馈自我修正 | Reflexion、CRITIC、自调试证明外部执行反馈有用 | 会误改正确答案；自我反馈弱 |
| 2024 | Agent 是否真的改变了环境 | WebArena、SWE-bench、tau-bench、AppWorld、OSWorld、ToolSandbox 引入状态、轨迹和 `pass^k` | evaluator 昂贵、不完备，过程和副作用覆盖不足 |
| 2025 | evaluator 自己是否可靠；故障后能否换路 | AgentRewardBench、SWE 测试审计、tau2、Hell or High Water、AgentDebug | judge 假阳性高；恢复与任务求解仍混在一起 |
| 2026 | 怎样验证过程、隔离证据、路由恢复并停止 | PAE、AgentLTL、RECEIPT、ToolMaze、CodeRescue、VRR-Stop、DynamicMCPBench | 多数仍是单域 preprint；真实回滚和开放任务没有解决 |

因此，和半年前相比可以说：

- **测量进步明确。** false success、corrupt success、side effect、程序违规、根因定位和 recovery
  被拆成了不同指标。
- **局部机制有可复现方向。** 对可判定政策做前置 gate、对高风险结果做隔离重放、根据失败状态
  路由恢复，都有直接对照支持。
- **通用能力没有被证明。** 许多最漂亮数字来自作者自建合成故障、单模型或小任务集；到隐式
  语义故障、真实服务漂移、开放目标和不可逆副作用时，证据仍很弱。

## 我们得到的系统推论

下面不是任何一篇论文已经证明的架构，而是本轮证据共同约束出的候选设计。它应被后续实现和
反例推翻或修正。

### 1. Task Contract

任务开始前记录：

```text
required effects
forbidden effects
required procedure/evidence
allowed tools and permissions
budget and deadline
reversibility / compensation plan
observable vs unobservable clauses
```

### 2. Mutation Gate

读操作默认低风险；写操作在执行前检查授权、目标对象、参数、幂等性、回滚能力和必要确认。
门禁只覆盖机器可判定的高价值规则，不能把全部 reasoning 重写成硬编码流程。

### 3. Immutable Trace and Change Ledger

保存工具调用、原始返回、状态快照、变更、错误、证据版本和恢复分支。摘要不能覆盖原始轨迹。

### 4. Independent Closure Check

按顺序执行：

1. 目标效果检查；
2. 禁止副作用检查；
3. 必要过程/来源检查；
4. 对剩余语义做有证据引用的 judge；
5. 输出 `PASS / FAIL / AMBIGUOUS / UNVERIFIABLE`。

### 5. Failure Object

验证失败后，不只返回一句 error，而是形成可执行对象：

```text
violated_clause
expected_vs_observed
last_trusted_state
responsible_step_hypotheses + confidence
mutation_log
retryability
rollback_available
remaining_budget
missing_evidence
```

### 6. Recovery Router

根据 failure object 选择 retry、repair、replan、substitute、rollback、clarify、escalate 或 stop。
每次恢复必须产生新证据，并重新通过独立 closure check。

### 7. Completion Certificate

最终结果不只是一句话，而是一个面向用户和机器的证明摘要：

```text
what changed
which checks passed
which evidence supports them
what was not checked
remaining uncertainty
recovery history
artifact/version identity
```

这个证书不是为了堆日志。它的作用是让“为什么相信完成”可以复核，也让下一次失败知道从哪个
可信状态继续。

## 对当前 K1412 评估工作的修正

现有 `research/evaluation/` 的“独立验证、假完成、gain/regression、版本 manifest”方向与证据
一致，但还不应直接进入 runner 实验。研究结论要求先修正任务契约的表达：

1. 每个任务先写清它测的是哪一种能力，不再统称 Agent success。
2. `outcome / invariant / procedure / semantic residual` 四层 validator 分开。
3. validator 要记录自己的覆盖范围和已知 false-positive/false-negative。
4. 结果状态增加 `ambiguous` 和 `unverifiable`，不逼所有任务二元判定。
5. 故障任务分别记录 detection、localization、routing、restoration 和 re-verification。
6. mutating task 必须有 before/after、幂等或 rollback/compensation 合同。
7. 同一任务多次运行，报告 `pass^k`、翻转、回归和成本，不只报告均值。

这些是下一步设计约束，不是已经验证过的 K1412 实现。

## 仍然不知道什么

1. **开放任务如何低成本写合同。** 形式化越强，编写和维护成本越高；语义越开放，judge 偏差越大。
2. **如何覆盖未知副作用。** “没有发现违规”只对已定义的可观察状态成立。
3. **如何判断替代路径真的语义等价。** 路径无关评分会增加召回，也可能接受不安全捷径。
4. **如何在真实系统中回滚。** 数据库、消息、付款和外部 API 往往没有完美撤销。
5. **如何可靠定位长轨迹根因。** 最新方法的严格 agent+step accuracy 仍低于 40%。
6. **如何处理 verifier 分布漂移和对抗优化。** evaluator 一旦成为训练奖励，就会成为新的攻击面。
7. **如何把用户满意与客观效果结合。** pleasantness、沟通和部分帮助很重要，但不能替代事实状态。
8. **如何证明恢复策略跨域。** 当前结果集中在代码、客服、合成工具、Kubernetes 和安全测试。

## 可反驳的预测

本轮综合至少产生四个值得后续验证的预测：

1. 在有副作用的 Agent 任务中，`前置 mutation gate + 事后 effect check` 会比只做最终 judge 更少
   假完成，但 gate 过宽会增加拒绝和任务失败。
2. 在混合故障集上，基于 failure object 的路由会优于固定 retry/replan；优势主要来自永久故障和
   隐式语义故障，瞬时故障上简单 retry 仍是强基线。
3. 独立 verifier 的最大收益不是平均成功率，而是降低 false success；只报成功率会低估它。
4. 当恢复轮次不产生新独立证据时，增加轮次的边际收益会迅速归零，并开始增加回归。

这些预测以后可以做实验；这轮不把尚未执行的实验写成结果。

## 材料边界

- 40 篇全文是问题驱动候选池，不是“全部 Agent evaluation 论文”的系统综述。
- 37 篇进入证据账本，3 篇只作历史背景；论文下载和文本定位不等于结论可信。
- 2026 年材料多数仍是 arXiv preprint，独立复现很少。
- 跨 benchmark 不比较绝对分数，只使用同论文受控对照，或明确说明协议差异。
- `Self-Healing Agentic Orchestrators` 的 98.8% 来自作者自建合成任务，真实模型部分只有
  15 个任务且成功率饱和；本轮只采用其控制环词汇，不采用该数字支撑一般结论。
- 更细的样本、数字和不能外推部分见 [证据账本](evidence-ledger.md)。
