Agent 工程实践 / 04 · 共 12 篇

AI AGENT 原理图解 / 04 · 机制预览

代码修复闭环:补丁应用、回归验证与交付

代码执行 / 修改、复验与交付证据

补丁生成、代码写入和验证通过,分别描述修复的不同阶段。能否交付,还要核对验证报告是否属于当前代码版本。

修改后的代码,需要对应版本的验证证据。本例用最大值函数展示失败反馈、补丁应用和完整复验。

查看交互演示 ↓

机制分析

修复改变代码,验证改变可信度

任务约定是返回列表最大值,空列表返回 null,并保留原有功能。初始实现把最大值从0开始计算,对全负数会得到错误结果,空列表也不符合约定。六个固定用例先给出基线报告,再把具体失败交给模型。

第一份补丁把初值改为列表第一项。在它进入编辑台之前,工作区仍是旧代码;写入后才成为 v1。此时旧报告只能说明旧版发生了什么,不能继续代表 v1。重新运行全部用例,才能看见全负数修好了,空列表却仍返回 undefined。

第二份补丁补上空列表判断,工作区成为 v2。再次完整复验,代码与当前版本报告一起通过交付闸门。这里的闭环不是“提出两次建议”,而是每次都经过实际应用、独立执行和反馈更新。

状态此时可以作出的判断
补丁已提出有修改方案,工作区未必改变
补丁已应用代码已变更,还缺新版本验证
单项失败消失某个问题改善,仍需检查原有行为
完整复验通过本例约定与固定用例通过,可绑定当前版本交付

测试变绿,也可能只是要求被改了

对照实验保留同一份错误代码,却把空列表的测试预期从 null 改为 undefined。局部测试随即变绿,原任务仍没有完成。修复对象与验收依据必须区分,否则系统可以通过削弱检查获得一个漂亮的成功报告。

工程取舍

让验证足够独立,也控制验证成本

只跑失败项,还是完整复验?

失败项适合快速验证假设,完整复验用于发现对其他行为的破坏。大型项目可以先跑相关测试,再按变更影响补充回归范围;交付时应明确哪些检查真正执行过。把“相关项通过”写成“整个任务通过”,会隐去尚未获得的证据。

测试能不能随代码一起修改?

需求变化或测试本身有错误时,修改测试可能合理。但这需要独立的任务依据,不能只因当前实现失败就调低标准。本例固定验收用例不允许改动,因此改预期明确违反约定;真实项目应记录测试变更原因,并让评审能区分修复实现与改变需求。

报告绑定版本,绑定到多细?

示意中的 v0/v1/v2 足以讲清归属;真实仓库还需辨认实际代码、依赖、测试命令与运行环境。提交号可以提供索引,但若运行时还有未提交修改,只记录提交号仍不完整。保存适当的工作区标识和执行记录,能避免测试完成后代码继续变化,而旧绿灯仍被沿用。

落到实现

把失败反馈写成下一步可以使用的输入

“测试没过”只能提示失败;输入是什么、预期是什么、实际是什么,才能支持下一轮定位与修正。每次修改后,应让验证状态明确回到待验证,再接收本轮的新报告。这样,程序可以主动阻止拿旧证据交付,而不只依赖模型记得提醒自己。

本页模型输出与补丁流采用预设,六个 JavaScript 用例在浏览器内执行。用例全部通过,只能证明本例检查范围内的结果;它不等价于对所有输入的形式化证明,也不能代替真实仓库与目标环境的验收。

补丁说明打算怎样修,执行说明实际改了什么,复验说明哪些行为获得了支持。三份记录对齐,修复才有可以交付的依据。

交互演示 · 代码修复校验台

跟踪代码版本与六项用例,比较改测试得到的假绿灯
代码修复校验台任务:返回最大值 · 空列表返回 null
REPAIR / 04历史报告 / ARCHIVEv0v1v2待测试largest()v1补丁补丁// 返回最大值best = 0v0 · largest()v1保存编辑写入T1T2T3T4T5T6v0副本 IN0/6回执 OUT回归固定用例代码6/6代码证据交付
工作区版本
当前版本验证
待应用补丁
交付状态
旁白字幕

验证记录与对照实验

实际保存的代码

可检查的测试证据

用例输入预期实际结果

做个对照:把失败测试改成通过,算修好了吗?

独立对照使用 v1,把本地空列表预期改成 undefined;任务固定验收仍要求 null。此操作不改变上面的工作区。

模型输出、补丁与工具流为教学预设;六项 JavaScript 用例在浏览器实际运行。仅验证本例固定用例与约定,不代表所有输入都已证明正确。
登录后收藏评论 0

登录后发表评论

暂无评论。