AI 编码缺的不是计划,而是验收

在开始做 OpenNori 之前,我已经反复遇到同一个问题,并逐渐形成了一个判断:

AI 编码缺的不是更长的计划,而是一个让人能判断“这件事到底算不算完成”的验收层。

很多 agent 已经很会写代码了。它能读文件、改实现、跑测试、修报错,甚至能自己拆任务、自己推进很久。

但越是这样,一个更基础的问题就越明显:

它完成的,到底是不是你想要的完成?

Agent 最危险的能力,是太容易继续

人给 agent 一个目标:

帮我把设置页做完整。

它通常不会停下来问“完整是什么意思”。它会根据当前上下文补全一个合理版本,然后开始执行。

这个过程很流畅,也很危险。

因为“设置页做完整”在不同人眼里可能完全不是一件事:

如果这些问题没有被确认,agent 依然可以写出一个看起来不错的页面。

只是它完成的是它脑子里的版本,不一定是用户能接受的版本。

以前 AI 不够强时,这个问题没那么刺眼。因为它跑不远,人很快会接管。

现在 agent 能跑得越来越远,问题反而变严重了:它可以在一个错误的完成定义上,非常努力地跑很久。

计划解决不了验收问题

很多人会说,那就先让 agent 写计划。

计划当然有用。但计划解决的是“准备怎么做”,不是“什么叫做完”。

一个计划可能写得很完整:

1. 新增表单字段
2. 接入保存接口
3. 增加 loading 状态
4. 添加错误提示
5. 运行测试

这仍然没有回答几个关键问题:

计划是执行前的路线图。

验收标准是完成后的判断依据。

AI 编码真正容易缺失的,恰恰是后者。

我想要的不是任务列表,而是验收契约

这个判断后来长成了 OpenNori。它的核心想法很简单:

把一个自然语言目标,变成一份人能审阅、agent 能执行、结果能复查的验收契约。

这里的“契约”不是法律意义上的东西,也不是繁琐流程。它只是要求在动手前,把完成判断说清楚。

一个好的验收标准,不应该写成:

设置页 CRUD 可用。

这句话太空了。

它应该更接近:

用户从个人中心进入设置页,修改昵称并点击保存后,可以看到明确的成功反馈;刷新页面后,新昵称仍然显示;如果保存接口失败,页面保留用户输入并展示可理解的错误提示。

这才是人能判断的东西。

它包含了入口、动作、可见结果、持久化、失败边界和证据方向。

我在工具内部会把这种验收标准简称为 AC,也就是 Acceptance Criteria。但对大多数读者来说,直接叫“验收标准”更好。缩写不是重点,重点是把“做完”的含义从 agent 的自我理解里拿出来,放到人可以审阅的地方。

每次只推进一个缺口

只有验收标准还不够。

另一个关键思想是:不要让 agent 一口气把所有事情跑到底。

更稳的方式是让它每次只推进一个当前缺口:

读取当前状态
找到当前缺口
推进一轮
提交证据
遇到人类决策就停下

这也是后来进入 OpenNori 的 Loop Engineer 思想。

它不是让 agent 变成一个永不停机的自动化机器。恰恰相反,它要求 agent 知道什么时候该停。

好的 agent 不应该每次都问人下一步做什么。那样人还是在遥控。

但它也不应该遇到所有问题都自己替人决定。那样人会失去完成定义和风险判断权。

我想要的节奏是中间态:

所以好的 AI 编码系统,不是让 agent 永不停机,而是让它知道什么时候该停下来等人判断。

证据和决策必须分开

AI 编码里还有一个常见混乱:把证据和决策混在一起。

测试通过,是证据。

页面截图,是证据。

接口返回 200,是证据。

Git diff 很小,是证据。

但这些都不等于“用户接受了”。

证据只能说明某个判断有依据,不能替用户做判断。

比如一个页面通过了所有测试,但布局很挤,文案很难懂,移动端按钮遮住了内容。agent 可以提供截图、浏览器记录、UI observation log,但最终“这个体验是否可以接受”,仍然是人的判断。

再比如一个功能客观上完成了,但偏离了项目原本的技术约束。agent 可以说明偏离原因、影响范围和替代方案,但不能自己批准这个风险。

这个思想要守住的边界就是:

Agent 负责推进和提交证据。
人负责定义完成和接受结果。

这个边界一旦模糊,agent 就会很容易把“我已经做了很多”包装成“这件事已经完成”。

完成报告不是总结,而是判断界面

很多 agent 的最终回复像工作日志:

我修改了 A、B、C 文件。
我新增了 X 逻辑。
我运行了测试,全部通过。

这些信息有价值,但还不够。

人真正需要的是一个完成判断:

所以完成报告不应该只是“我做了什么”的总结。

它更应该像一个判断界面:把证据、风险和需要人的决策摆清楚,让用户可以决定是否接受。

这也是我为什么不想把 OpenNori 做成一个流程归档工具。

流程归档关心发生过什么。

验收报告关心现在能不能接受。

两者很不一样。

OpenNori 不想替代人

我不希望 OpenNori 变成一个更重的项目管理系统,也不希望它变成 agent runtime。

它不负责让 agent 接管一切。

它只补一层很薄但很关键的东西:

目标 -> 验收标准 -> 当前缺口 -> 证据 -> 完成判断

人仍然用自然语言说目标。

Agent 仍然负责编码、验证、修复、整理报告。

OpenNori 只是把这个问题持续摆到中间:

这件事,用户到底凭什么判断完成?

如果这个问题没有答案,就不该急着实现。

如果证据不够,就不该宣布完成。

如果需要人做判断,agent 就不该替人判断。

人的位置会更靠前

AI 越能执行,人越不应该被拖进每一个细节。

但这不代表人要退出。

人的位置会更靠前:定义目标、划定边界、确认验收标准、判断风险、接受结果。

Agent 的位置会更靠后:读取上下文、推进当前缺口、运行验证、提交证据、整理报告。

这不是把工作全部交给 AI。

这是把执行交给 AI,把判断留在人手里。

我开始做 OpenNori,想解决的就是这个界面问题。

不是让 AI 编码更热闹,而是让 AI 编码更可接受。

如果只记一句话,我希望是:

AI 编码真正需要补上的,不是更长的计划,而是人能判断完成的验收契约。

← 返回构建记录