我为什么不相信 Agent 说「完成了」
从分阶段实施到全项目回归检查:Agent 可以承担越来越多的执行工作,但「Agent 说完成了」不能自动等于「工程结果已经完成」。记录我如何把它的执行结果变成可验证的工程结果。
- AI Coding
- Agent
- 验证
- 工程实践
Agent 最容易让我放松警惕的地方,不是它不会做,而是它经常能把事情做到「看起来已经完成」:功能写出来了、测试跑起来了、汇报也交得出来。
但这些只是执行结果的信号,不是结论。我现在不会把「Agent 说完成了」当成结论,只把它当成一个待验证的信号 —— 因为作品集的阶段报告本身就是执行者写的,仓库里那句原文是「作者(AI)」。自己写的报告,不能自己当验收。
一、Agent 最容易让人放松警惕的地方
「完成」是一个需要被验证的工程状态,而不是 Agent 自己宣布的状态。
二、我的实际工作方式
我通常先让 GPT 帮忙分析需求和架构,再把工作拆成阶段交给 Agent 实现:
- 把需求写清楚,让 GPT 分析需求与架构。
- 把工作拆成几个阶段,而不是一次做完整个项目。
- 让 Agent 按阶段实现,每阶段结束后检查一次。
- 检查里除了「这一阶段做完没有」,还要回答「之前已经完成的东西有没有被搞坏」。
- 全部阶段完成后,再对整个项目检查一次。
三、第一条经验:阶段完成 ≠ 项目没有问题
有一条典型记录:Stage 1 被认为完成之后,Stage 2 的一致性检查发现主按钮的前景色丢了。原因是类名合并工具不认识本项目的字号刻度:text-body(字号)与 text-accent-fg(颜色)被判成同组冲突,后者被删掉,Lighthouse 报出的对比度只有 3.45:1。修复是显式声明字号刻度(extendTailwindMerge):产物里的按钮重新包含 text-accent-fg,无障碍得分从 96 回到 100,并补了回归测试 tests/unit/cn.test.ts。
这是 Stage 1 遗留的问题:当时它的页面没有主按钮实例,直到 Stage 2 的首页第一次真实使用它才暴露。阶段完成,不等于它留下的结果仍然成立。
四、第二条经验:测试通过 ≠ 用户看到的结果正确
有两类问题在「测试通过」这一层完全看不见:一类在部署链路上,一类在真实运行环境里。
CSP 头曾经长到 4,154 字节 / 72 个 hash,超过 nginx 单参数 4,096 字节的上限 —— 服务器加载这份配置时 nginx -t 直接失败。排除不该计入的 30 段 JSON-LD 后,hash 72 → 60、这一行 4,154 → 3,506 字节;再加护栏,超限就让构建失败。后来(2026-10-08)加入 Blog,数字再次涨到 4,694 字节 / 82 个 hash,最终拆进多个 nginx set 参数,每个都远小于 4,096,但仍只发一个 CSP header。
另一个例子更小:简历链接在非生产构建里被写成绝对 localhost 地址(http://localhost:3000/resume.pdf),本地门禁全部通过,只有在 CI 里跑浏览器冒烟时它才被判成坏链接。
| 看到的结果 | 它真正证明了什么 | 还需要验证什么 |
|---|---|---|
npm run verify 全绿 | 这些层在这一刻成立 | 服务器能不能加载这份配置、浏览器会不会拦掉某个资源 |
| 单元测试全部通过 | 被测到的行为是正确的 | 真实运行链路(部署、浏览器、网关) |
所以我现在把「测试通过」当成某一层的证据,而不是最终结论。
五、第三条经验:Agent 的上下文也需要边界
我使用 Agent 时,遇到过输出里出现明显不属于当前项目的内容。遇到这种情况,我不会先给原因下结论 —— 是哪一层机制造成的,手上没有证据;动作是回到项目本身重新检查上下文与既有设计。
这类「走偏」在这个仓库里也有更朴素的版本:内部作者笔记被导出到公开产物、文档引用过从未存在的阶段编号。共同点是:生成的内容和工程上下文都需要一道边界检查。
六、我最终形成的验证方式
把这些放在一起,就是现在在用的五件事:
- 分阶段:13 份阶段报告,每份都写明范围与「未完成内容」。
- 阶段完成检查:看每阶段的测试结果与 Stage Gate。
- 阶段间回归检查:Stage 2 的 9 项一致性检查,其中一项是「是否破坏 Stage 1 门禁」。
- 全项目最终检查:
npm run verify(10 道门禁)、npm run test(46 个测试文件 / 382 个用例)、npm run smoke-check(92 项浏览器检查),CI 在构建后再检查一次产物。 - 高风险结果人工确认:数据库与测试结果我自己确认;发布门槛是人工确认,架构与文案类改动不擅自执行。
七、最终反思:不把「AI 的结论」当成最终证据
我并不要求 Agent 永远不犯错。我更在意的是:它犯错以后,我有没有办法发现。
Agent 越能承担执行工作,验证反而越重要 —— 执行变快了、验证没跟上,只是把不确定性往后推了一步。
这个 Blog 的六篇文章是同一个判断的六个切面:并发约束、真实运行链路、不让大模型自己决定评分结果、评价体系可信、固定测试集比较检索策略、模型看到的页面状态是否真实。这一篇是第七个:不让 Agent 自己宣布项目已经完成。
一句话概括现在的习惯:先让结论可验证,再谈优化。 相关的项目与实测数据在项目页里:查看 CodePilot AI 项目详情。
韦坤计算机科学本科生 · 后端开发 / AI 应用开发方向
相关项目
导入真实代码项目后形成成长闭环:代码扫描 → 12 维度 AI 工程审计 → 改进任务 → Git 代码评审 → 模拟面试 → 能力画像。评分由确定性引擎计算,LLM 只负责找问题。
- Next.js 14(App Router)
- TypeScript
- Tailwind CSS
- 还有 23 项技术
相关文章
为什么不让大模型给自己打分:CodePilot 的评分引擎与不可信输入边界
AI / Agent约 4 分钟同一份代码多次审计分数会变,所以我把「找问题」和「算分数」拆开:LLM 只输出结构化 Finding,总分由确定性评分引擎按维度权重计算,并给不可信输入划出明确边界。
Agent 反复填同一个输入框:一个属性读取方式引起的静默循环
AI / Agent约 4 分钟WebRunner 里最难查的一个缺陷:观察层读的是 HTML 初始属性,动作改的却是运行时状态,于是模型永远看不到「已经填过」。以及它如何变成一条写进设计里的约束。