1192 字
6 分钟
评审的价值来自不知情,不是知情

给评审 agent 写 prompt 的常见写法,是先交代一段「这段代码是为了解决什么问题」,让它理解得更充分再动手。我的判断相反:在评审场景里,这段背景是污染源。评审的价值来自不知情,前提是切断之后把客观事实补回去。

评审看见的是行为,还是作者的意图

作者的解释会把评审变成确认#

我积累的 424 条去重后的子代理任务指令里,有 46 条评审任务以完全相同的一句话开场:

你是一名独立代码评审员,对这段代码的开发过程一无所知——
这是有意安排的,请只基于代码本身和仓库现状做判断,不要假设作者意图。

写成显式声明而不是直接省略背景,是因为两者的效果不同:省略会让 agent 以为信息不全而去猜,显式声明则把「不知情」定义成它的工作前提。

意图一旦进入上下文,就会成为评审的默认前提。评审者不再问「这段代码的行为是什么」,而是问「这段代码是不是在做作者说的事」。后一个问题几乎总会得到肯定答案——代码确实是照着那个意图写的,内部完全自洽。缺陷藏在意图和行为的落差里,而这个落差只有在不知道意图时才看得见。

配套还有两条:不相信提交说明里的声称,不轻信注释。代码里的自我声明同样是作者叙述的一部分。注释写着「此处已处理并发」不构成证据,必须在代码里找到对应的同步点。

一次评审里,评审 agent 从兼容性维度报出了单元测试全绿时发现不了的问题:某个函数把抛出的异常类型收窄了,调用方原有的 except 分支因此不再命中。这类缺陷不在改动内部,而在改动与外部约定的关系上。如果评审者事先知道「这次改动是为了让异常更精确」,它很可能把收窄读成改进,而不是破坏。

切断过程,就必须补足客观背景#

少给上下文和刻意隔离,写出来的 prompt 都很短,区别只在有没有补偿。没有补偿的隔离失败得很安静:agent 不会停下来说信息不够,它会自行构造一个看起来合理的意图,再照着评。这个结果比给了背景更差,因为构造出来的意图既不准确,也无从纠正。

所以切断过程信息的同时,要把这些补进去:

补什么为什么必须由我给
仓库路径与本次变更文件清单评审范围不能靠它推测
应当一并阅读的上下游文件跨文件影响是它最容易漏掉的部分
仓库内已有的约定文档这是契约,不是我对改动的叙述

分界线是:凡不包含「我想怎么做」的事实都可以给;实现思路、取舍理由和自我辩护一律不给。代码本身需要的上下文,让它自己去仓库里读,而不是由我转述——转述会自动带上我的理解方式。

同一条原则也用在只读契约的测试设计角色上,那里的边界划得更细:仓库路径可以用来阅读 README 和设计文档以了解项目背景,但禁止打开实现目录。禁止的是一个具体的信息源,不是全部信息。

这套做法不适用于哪些情况#

评审范围本身尚未确定时。 如果改动分散在多处、连哪些属于本次变更都说不清,零背景 agent 会评错对象。先把范围确定下来,再做隔离。

需要评价方案取舍时。 「为什么选 A 而不是 B」的答案不在代码里。不知道约束条件的评审者只能给出纸面上的更优解,看起来有道理,实际不可行。取舍评审要给足背景,它和缺陷评审是两件事。

改动小到一眼能看完时。 单行修改走完整的隔离流程,成本高于收益。

最后一种情况和上面三条不同:补偿清单写不出来。如果我自己也说不清这次改动该连带检查哪些上下游文件,说明我对影响范围的理解还不完整。那要补的不是 prompt,是我的理解。