Codex完成一个任务后,经常会给出这样的总结:

已修复问题。
相关测试已经通过。
没有发现其他风险。

如果只是个人写一个小工具,这句话也许够用。

但当Agent开始修改支付逻辑、重构公共模块、更新多个仓库,甚至连续工作几个小时以后,团队不能只凭一句“完成了”决定是否合并。

因为“Agent认为完成”和“工程上能够证明完成”,是两件完全不同的事情。

真正可靠的交付,需要回答:

修改了什么?
为什么这样修改?
原问题是否真的复现过?
修复后用什么证明有效?
哪些测试运行了?
哪些没有运行?
中间失败过几次?
当前还有什么没有验证?
谁最终批准了风险?

这些信息连起来,就是本文要讨论的:

AI Evidence Chain——AI工程证据链。

它的核心不是让Agent输出更长的总结,而是让每一次AI交付都留下可以复核、交接和追踪的证据。


一、为什么“测试通过”仍然不能代表任务完成?

假设Codex修复一个订单状态Bug,最后告诉你:

修改完成。

测试:
24 passed

结果:
订单状态问题已经解决。

看起来非常完整。

但真正Review时,还要继续问:

测试的是哪24个测试?

可能只运行了某个单元测试文件,并没有运行完整订单流程。

原问题真的复现过吗?

如果Agent从来没有成功复现Bug,那么测试通过只能说明新代码没有触发现有测试失败。

修改范围是不是合理?

Bug只涉及订单状态,却可能顺便修改了缓存、日志、类型定义和公共工具函数。

测试有没有被改弱?

有时“测试通过”的原因不是代码变正确,而是测试断言被删除或修改。

哪些内容没有验证?

例如:

  • 没有测试并发;

  • 没有测试旧客户端;

  • 没有测试生产配置;

  • 没有运行完整集成测试。

因此:

PASS只是证据之一,不是最终结论。


二、AI Evidence Chain到底是什么?

AI Evidence Chain可以理解为:

从任务输入到最终批准,每一个关键判断都有对应证据,并且这些证据能够互相连接。

一个完整链路可以写成:

需求
 ↓
问题复现
 ↓
根因证据
 ↓
修改Diff
 ↓
测试结果
 ↓
运行时验证
 ↓
独立Review
 ↓
剩余风险
 ↓
人工批准
 ↓
最终交付

其中任何一环缺失,可信度都会下降。

例如:

只有Diff,没有复现证据:

不确定修改解决的是不是原问题。

只有测试,没有Diff检查:

不确定有没有夹带无关修改。

只有Agent Review,没有测试:

只能证明“看起来合理”,不能证明运行正确。

只有全部自动化结果,没有人工批准:

高风险业务决策可能没人真正承担责任。

所以Evidence Chain不是单项质量检查,而是一条连续链。


三、第一类证据:任务输入证据

Agent开始执行前,也需要证据。

很多失败并不是发生在代码阶段,而是任务一开始就理解错了。

例如Issue写:

用户登录后偶尔被踢回登录页。

Agent可能理解为:

  • 登录接口失败;

  • Token过期;

  • 路由守卫错误;

  • Session丢失。

如果没有进一步事实,它只能猜。

因此任务开始时至少要记录:

任务目标:
原始Issue:
已确认事实:
复现条件:
相关模块:
允许修改范围:
禁止修改范围:
完成标准:

特别重要的是把:

已确认事实

和:

Agent推测

分开。

例如:

已确认:
问题只发生在Token刷新后。

未确认:
可能与路由守卫重复触发有关。

这样后面的Agent不会把一个猜测当成事实继续传播。


四、第二类证据:问题复现证据

修Bug之前,最好先建立Failure Evidence。

也就是:

修改之前,系统到底是怎么失败的?

可以是:

  • 错误日志;

  • 测试失败输出;

  • 页面截图;

  • 视频;

  • API响应;

  • Trace;

  • 数据库状态;

  • 可重复执行的复现步骤。

例如:

复现环境:
staging

步骤:
1. 登录测试账号
2. 等待Token过期
3. 刷新页面
4. 自动Token刷新成功
5. 页面再次跳回/login

复现次数:
5/5

关键日志:
refresh_token success
route_guard unauthenticated
redirect /login

有了修改前证据,后面才能做真正的:

Before / After

比较。

否则Agent很容易修复一个“理论上的问题”,却没有解决用户真正遇到的Bug。


五、第三类证据:根因证据

Agent找到根因后,不应该只说:

问题是Token刷新逻辑导致的。

应该说明为什么。

例如:

根因:
Token刷新成功后,用户状态写入Store是异步操作。

证据:
auth.ts第118行已经拿到新Token;
router.ts第64行在Store更新前读取authenticated=false;
因此触发/login跳转。

排除:
后端刷新接口返回正常;
Token内容有效;
Session没有丢失。

这类证据很重要,因为:

修复方案的可信度,取决于根因判断是否成立。

如果根因判断错了,即使代码写得很好,也只是对错误问题进行了漂亮修改。

建议根因输出至少包含:

  • 已确认根因;

  • 支持证据;

  • 被排除的候选原因;

  • 当前仍未确认的部分。


六、第四类证据:Diff Evidence

代码修改以后,需要证明:

Agent究竟改变了什么?

不要只让它输出:

修改了认证逻辑。

更有效的是:

修改文件:
src/auth/refresh.ts
src/router/guard.ts
tests/auth-refresh.test.ts

核心变化:

1. Token刷新成功后等待用户状态提交完成;
2. 路由守卫增加refreshing状态判断;
3. 新增Token刷新期间导航测试。

未修改:
后端接口
Token结构
公共路由API

随后再检查真实Git Diff。

Diff Evidence重点回答四件事:

修改是不是在任务范围内?

有没有无关重构?

有没有删除测试或降低断言?

有没有改变公开接口?

一个非常实用的规则是:

Agent总结只能做索引,Git Diff才是修改事实源。


七、第五类证据:Validation Evidence

测试证据不能只有:

Tests passed.

至少应该记录:

执行命令:
pnpm test auth
pnpm typecheck
pnpm lint

结果:
auth:28 passed
typecheck:passed
lint:passed

未运行:
完整E2E

原因:
本地缺少支付测试服务

这最后一项非常重要。

很多AI交付的问题不是测试失败,而是:

没跑的测试没有被说出来。

因此验证报告应该同时包含:

  • 已执行;

  • 已通过;

  • 已失败;

  • 已跳过;

  • 无法执行。

“没有证据”不能被自动解释成“没有问题”。


八、为什么还需要运行时证据?

代码测试通过,并不一定说明真实流程正常。

尤其是:

  • UI;

  • 网络交互;

  • 异步状态;

  • 权限;

  • 数据库;

  • 多服务系统。

这些问题往往需要运行时验证。

例如一个前端Bug,可以要求:

修复前:
页面刷新后跳回登录页。

修复后:
页面保持当前页面,
Token刷新完成,
用户状态恢复。

验证:
连续执行10次,
10次均未出现重复跳转。

如果条件允许,还可以保留:

  • 截图;

  • 浏览器Console;

  • Network请求;

  • 服务日志;

  • Trace;

  • 性能指标。

这类证据证明的是:

系统实际上做了什么。

而测试证明的是:

预先定义的检查是否通过。

两者不能完全互相替代。


九、第六类证据:独立Review

让实现Agent自己说:

我检查过了,没有问题。

可信度有限。

因为实现Agent已经形成自己的方案路径,很容易重复原来的判断。

更好的方式是:

实现和审查分离。

Review Agent只接收:

  • 任务目标;

  • 完成标准;

  • 最终Diff;

  • 测试证据。

然后要求:

不要修改代码。

重点检查:

1. 是否真正解决原问题;
2. 是否存在无关修改;
3. 是否遗漏边界场景;
4. 是否改变公共接口;
5. 测试是否足够证明结果;
6. 是否存在兼容性或安全风险。

按P0 / P1 / P2输出。

如果Reviewer提出P1问题,修复后必须重新产生新的Evidence。

这会形成:

Implementation
 ↓
Evidence
 ↓
Review
 ↓
Fix
 ↓
New Evidence
 ↓
Re-review

而不是:

Review一次就永久有效。


十、重试后为什么旧证据可能失效?

这是Agent系统非常容易忽略的问题。

假设第一版修改运行:

42 tests passed

随后Review发现问题,Agent又修改了三个文件。

此时原来的:

42 tests passed

还能不能证明当前代码正确?

不能直接证明。

因为测试对应的是旧版本代码。

所以Evidence必须与具体版本绑定。

至少记录:

Commit / Diff:
abc123

测试:
42 passed

Review:
P1:缓存失效逻辑存在遗漏

修复之后:

Commit / Diff:
def456

重新测试:
44 passed

Review:
无P0/P1

这样才构成真正连续的证据链。

可以记住一句话:

代码变了,关键验证证据就应该重新生成。


十一、完整案例:线上Bug怎样形成Evidence Chain?

假设问题是:

用户支付成功后,订单偶尔仍然显示“处理中”。

阶段一:任务输入

目标:
修复支付成功后订单状态没有更新的问题。

限制:
不修改支付协议;
不修改数据库结构;
生产数据只读。

阶段二:复现

Agent在测试环境成功复现:

支付成功:是
支付回调:收到
订单最终状态:processing
复现率:4/5

阶段三:根因

发现:

支付回调处理成功后,
消息消费者更新订单时发生数据库Timeout。

消费者没有重新投递失败消息。

证据包括:

  • 回调日志;

  • 消息ID;

  • 数据库Timeout;

  • 订单状态记录。

阶段四:实现

修改:

payment-consumer.ts
retry-policy.ts
payment-consumer.test.ts

没有修改:

payment-api
数据库Schema
退款逻辑

阶段五:验证

运行:

pnpm test payment-consumer
pnpm test order-state
pnpm typecheck

结果全部通过。

并模拟:

  • 正常回调;

  • 数据库第一次失败;

  • 重复回调;

  • 多次失败达到重试上限。

阶段六:Review

独立Reviewer发现:

重试可能导致同一事件重复写入。

于是要求增加幂等检查。

阶段七:重新验证

代码修改以后,之前测试全部重新执行。

再增加:

重复事件10次
最终只产生一次状态变更

阶段八:风险说明

仍未验证:

真实生产消息积压环境下的性能。

阶段九:人工批准

负责人判断:

  • 当前Bug已经解决;

  • 未验证风险可以接受;

  • 先灰度5%;

  • 监控失败重试指标。

这才是完整的:

AI Delivery Evidence。

而不是一句:

Codex已经修好了。


十二、证据链中哪些可以自动化?

Evidence Chain不意味着开发者每天人工整理几十页报告。

大量证据可以由工具自动生成。

可以自动生成

  • Git Diff;

  • 修改文件列表;

  • Commit SHA;

  • 测试命令;

  • 测试结果;

  • CI结果;

  • Lint和类型检查;

  • Agent执行日志;

  • Review意见;

  • 部署状态;

  • 监控指标。

Agent适合生成

  • 根因摘要;

  • 影响范围;

  • Diff解释;

  • 剩余风险;

  • 未验证项目;

  • 回退方案。

人类应该确认

  • 业务规则是否正确;

  • 风险是否可以接受;

  • 是否允许生产变更;

  • 是否批准公共接口变化;

  • 是否最终交付。

也就是说:

机器收集事实,Agent整理证据,人类接受风险。


十三、Evidence应该放在哪里?

不要把所有证据只留在聊天窗口里。

可以根据任务大小选择不同方式。

小任务

直接放在Pull Request描述:

Problem
Root Cause
Changes
Validation
Risks

中型任务

增加:

docs/evidence/ISSUE-123.md

大型迁移

按阶段保存:

evidence/
├── 01-baseline.md
├── 02-migration.md
├── 03-tests.md
├── 04-review.md
└── 05-release.md

Evidence应该尽量跟代码一起版本化。

这样三个月以后重新调查问题时,可以知道:

当时为什么认为这个改动是安全的?


十四、团队可以建立Evidence Gate

当Agent承担越来越多任务以后,可以把证据要求变成合并门槛。

例如普通PR:

必须存在:
✓ Diff
✓ 单元测试
✓ Agent Review

高风险PR:

必须存在:
✓ 原问题复现
✓ 根因证据
✓ Diff
✓ 单元测试
✓ 集成测试
✓ 独立Review
✓ 剩余风险说明
✓ 人工审批

如果某项不存在,PR状态就不是:

Done

而是:

Evidence Missing

这会改变团队对“完成”的定义。

从:

Agent停止运行了。

变成:

交付证据满足标准了。


十五、不要把Evidence Chain做成新的形式主义

Evidence Chain也有一个风险:

最后变成Agent自动生成两千字报告,但没人看。

因此证据必须满足三个原则。

可验证

必须能回到真实Diff、日志、测试和运行结果。

可定位

出现问题时,可以快速知道证据对应哪个版本。

可决策

内容应该帮助Reviewer判断是否允许继续,而不是单纯增加文字。

例如:

错误写法:

经过全面测试,本次修改质量良好。

正确写法:

已运行:
单元测试:46/46通过
集成测试:8/8通过

未运行:
生产回放测试

原因:
当前环境没有匿名化生产数据。

剩余风险:
低概率支付渠道异常暂未覆盖。

后一种明显更有价值。


AI Delivery Evidence通用模板

# AI Delivery Evidence

任务:
负责人:
Agent:
当前版本/Commit:

## 1. Objective
本次需要解决什么问题?

## 2. Baseline Evidence
修改前如何证明问题存在?

复现步骤:
日志:
截图/Trace:
复现率:

## 3. Root Cause
确认根因:
支持证据:
已经排除:
仍未确认:

## 4. Changes
修改文件:
核心Diff:
未修改范围:

## 5. Validation
运行命令:
通过:
失败:
跳过:
无法验证:

## 6. Runtime Evidence
真实流程验证:
截图/日志/指标:
Before / After:

## 7. Review
Reviewer:
P0:
P1:
P2:
处理结果:

## 8. Retry History
失败次数:
失败原因:
重新规划内容:

## 9. Remaining Risks
仍然存在的风险:
未验证内容:

## 10. Rollback
回退方式:
触发条件:

## 11. Approval
人工负责人:
批准范围:
最终状态:

十六、从明天开始,团队可以先做三件事

第一,不允许Agent只说:

测试通过。

要求同时给出:

测试命令、结果和未运行内容。

第二,不允许Agent只说:

Bug已修复。

要求提供:

修改前复现证据 + 修改后验证证据。

第三,高风险任务结束前增加一次:

独立Review + Remaining Risks。

不需要一开始建立复杂平台。

先改变团队对“完成”的定义,就已经能减少很多AI交付风险。


结语

Agent越来越强以后,一个很容易出现的错觉是:

它能够独立完成任务,所以我们可以减少检查。

实际上恰恰相反。

Agent执行速度越快、修改范围越大、人类参与越少,团队越需要一套机器可生成、人类可复核的证据系统。

真正成熟的AI工程交付,不应该是:

Agent说完成了。

而应该是:

原问题有复现证据;
根因有事实支持;
修改有真实Diff;
测试有完整结果;
运行行为有验证;
Review有独立结论;
重试有历史记录;
剩余风险被明确说明;
高风险交付有人批准。

这才是一条完整的AI Evidence Chain。

未来团队判断一个Agent任务是否完成,最重要的问题可能不再是:

“Codex写完了吗?”

而是:

“它留下的证据,足不足以让另一个人相信并复现这个结论?”

如果答案是否定的,那么任务最多只能叫“Agent停止了”。

还不能叫“工程交付完成”。

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐