2026年8月25日 · 阅读 —

一条命令看清改动边界:看看真正严苛的开源库是怎么做 PR 评审的

AI 工程实践

正确的代码评审不是挑格式毛病:DeepSeek 官仓这套“评审技能”,藏着工程该较真的地方

先问个很实际的问题:你评审一个 PR 的时候,到底在看什么?

多数人会给“代码能不能跑”打个勾,然后一头扎进变量命名、括号风格、注释有没有写这几件事里。这也是开源项目的通病——reviewer 容易被“改了一堆文件”吓住,就顺着格式、缩进、命名这种最好挑的毛病一路挑过来。

但大型代码库的严格程度往往是反过来的:先抓正确性、生命周期、安全,还有那些“代码本身看不出、必须靠上下文”的东西;格式那点小事,机器早帮你兜住了。 真正值得人眼盯的,是设计是否成立、有没有越界、会不会在某个角落炸。

最近看 DeepSeek 官方在 deepseek-harness 这个仓库里,把“怎么评审这个库的 PR”固化成了一个可复用的技能文档(叫 dsh-code-review),既有具体命令、也有完整准则。里面最打动我的一句是:“一两句话、带一个站得住脚的阻塞性问题的短评审,也强过一整页琐碎指摘。” 光冲这句话,就值得拆开讲讲它到底怎么看待评审。


它不是一个面向使用者的产品,而是一份给评审者看的“评审准则”——用在 deepseek-harness 这个 monorepo 里,把“这仓库的规范、防御性模式、ADR、质量门禁”这些只有内部人看得懂的东西,翻译成一套能照着执行的检查项。

一句话结论:在多人协作的大工程里,代码评审不是“看 diff 有没有格式问题”,而是把跟这份改动一同进来的规范和设计上下文都覆盖到,逐条验证“实现真的对得上”。

对想提升自己评审水平、或者想把自家项目评审做严的人,这套清单很值得借来对照。


核心亮点,我按它的逻辑捋几层:

1. 把“真凭实据出处”钉死,一切以仓库真实约定为准。 它不许 reviewer 凭感觉发挥,而是把“每项判据的出处”列清楚:根目录的 AGENTS.md 定仓库和包层的硬规矩、defensive-patterns 管子进程、回调、异步状态、释放这些 bug 类别、prose 标准管所有新增文字质量、测试跟质量门禁管覆盖等级。评审的每一个关切都要能在这些出处里找到依据,而不是 reviewer 的个人口味。

  1. 几条“硬性门槛”直接咬死,不商量。 新加的每段文字要过语义级评审;配置、默认值、错误、wire 字段一旦动,同一份 diff 里就得把项目的说明文档和 JSDoc 一起改(文档必须跟代码同进同出);核心词汇变化要更新对应的 subsystems 页和 type-equiv 条目;每个新注册项都要过对应的销毁类测试。合起来就把“我只看代码、说明书我才不管”这类偷懒堵死了。

  2. 一堆只靠 diff 看不出来的“人工检查”。 这是文档最有价值的部分——它把那些**“光看代码根本发现不了”的问题逐个点名:接口契约要“双向追踪”实现、错误、取消、所有权、释放;生命周期并发要防“发布前竞态”,异步初始化、回调、子进程、拆解时做一遍防御模式;还有一个比较扎心的——如果一个泛用服务(registry、session、agent)上新增的公共方法只有一个内部消费者在用,那就是“不必要的 API 扩张”**,正确写法是在构造时塞一个私有能力给它。

  3. 连“模型视角”都替你规划了。 因为这是给 AI agent 仓库设计的 skill,它专门提醒要盯着:模型在受影响模式下实际收到的提示词、工具校验、结果、diagnostics;凡是超出模型任务范围的概念要标出来,并确认稳定文本一字不差、动态行为要靠快照或端到端覆盖来验证。普通仓库评审可不会去操心“模型拿到的那份东西和文档对不对得上”。

  4. “过门禁”只算过关,不算证据。 一个跑全绿的 gate,只代表等级门槛过了,不代表方案正确。它直说:“覆盖 ≠ 正确”。断言要能主动捕获回归、要验证外部状态、日志、事件、销毁这类结果,而不能只复述实现,或盲信 agent 自己的汇报。

  5. 反对“猜测性通用”,到近乎偏执。 每一个抽象、状态机、选项、防御拷贝、兼容路径,都要能落到它的当前契约、真实消费者、和所属插件或服务上。你在 PR 里顺带加的不相关功能、为“以后也许用”而造的通用化,丢到约定里多半当场打回。这跟“看着顺眼就先 merge”的心态正好相反。

你不用把上面全背下来,先照镜子:你平时评审,跳过了哪几条?


它有个帮你界定“改了多大范围”的开场动作,值得抄:看不懂一份 diff,先跑这条命令拿到受影响的路和脏的层,确认 base 和 head 都核实到真实提交:

pnpm --silent run change-scope --base <verified-base-ref> --head <verified-head-ref>

它报告的是路径和脏层,不能替代语义评审——重新定向(retarget)或合并之后,还要重建 base 再跑一次。先摸清范围,再谈细。

评审该盯什么,我把它那张人工检查清单压成一张速查表:

范畴评审重点一句话收益
双向接口实现、错误、取消、所有权、释放对不对得上契约不掉链
生命周期并发竞态、await、回调、拆解的释放不挂个、不泄漏
通用能力适配泛服务是否只给单一消费者加公开方法防 API 乱涨
作用域必要性抽象、状态机、选项是否有真实产出杀投机性通用
配置公开选择每个默认值、操作集、格式先有消费者证据设计经得起问
模型视角提示词、工具校验、结果、诊断是否超出任务模型不迷路
强制路径每个否定分支追到真正执行的操作拦不住就炸
借入与归属保留的值是借的还是所有的、通知到哪共享状态不串味
边界覆盖产物由谁持有、最小/最大/多字节文本兜住 byte 上限
测试强度断言打真回归、看外部状态与清理覆盖≠正确

整体流程其实是一段有序流,我画一张抽象图(逻辑关系,不代表流水线里的真实工具名):

flowchart LR
  A[核实 base 和 head] --> B[跑 change-scope 拿到范围]
  B --> C[读 diff 加足够上下文]
  C --> D[硬性闸门逐条核]
  D --> E[人工检查清单]
  E --> F[组织报告]
  F --> G[就地 inline 或 PR 级评论]

报告怎么出,文档也规定死了:先说缺陷、位置、影响、证据,别只丢一句“这写错了”。定位很具体的放在 diff 里最紧的位置用 inline 评,跨架构、跨范围、综述性的用 PR 级 comment;被绿 gate 已兜住的东西不要重复提;收到反馈时逐条验证,要么改进、要么要用工程理由反驳,不做表演式的点头。


最后聊几句我的观感,不吹。

值得抄走的是它“反臆测通用”和“重质量不重数量”的评审观。让一个人把实现、文档、日志、清理都写全,比十个改动塞一堆格式小毛病更有价值,尤其是那句“短评加一个实锤阻塞强过一篇清单”,对还在纠结“评审条数”的人来说是一记耳光。

它的边界也很清楚:一堆名词(Agent Note、type-equiv、blade、seam)都是这个仓库独有的语境。你跳到自己项目上,内容不能照搬,得先重新翻译成“你仓库里那些算数的出处”到底有几样。正确打开方式是把它的方法论(先定边界 → 用来源对实现 → 既有闸门又有手工清单逼着人看全)套用到你自己的评审里,而不是一上来就抄那一串具体检查项。

我本人没在那个仓库实际审过 PR,这篇是基于文档的判断——它公开的是全套准则,狠是狠了点,但说得都在点子上。而且说实话,绝大多数个人项目根本不需要这套重量级,那是给多包、多插件、多人、多 agent 的 monorepo 量身定的。但对想把评审做硬一点的人,这份“评审 rulebook”的头脑冲击,比十篇讲“怎么写代码审查”的帖子都强。

一句话收尾:代码评审的高级阶段,不是找毛病,而是证明“这个改动,真的和它该长成的那样站在一起”。 这条准则至少是个值得翻一翻的路标。

deepseek-harness/.agents/skills/dsh-code-review/SKILL.md at master · deepseek-ai/deepseek-harness · GitHub

#代码评审 #开源项目 #工程规范 #GitHub #PR #评审 #工程实践 #AI工程 #质量保障