跳转到内容

审查计算(队列、轴与确定性 diff)

PR 的评审标签页展示的是审查流水线运行期间的实时进度,随后是它发布出来的工件, 以及工件上的各种操作。一个标签页、两种状态,因为它们是同一件事在两个时刻的样子。 它不是默认标签页:除非有人主动请求,PR 就没有审查,因此打开它的是询问 AI。

在这个标签页背后,cc_server 构建文件队列、运行确定性轴,并通过 review_studio.* RPC 操作把它们对外提供(cohorts、blastRadius、cohortImpact、ciSignals、 dependencyDiffs、setContractDecision、approveVisual、compute,以及它们各自的 watch* 孪生操作)。一个仍然写着 pr.reviewStudio 的持久化布局,打开的也是这个 评审标签页。

在评审标签页上:

  • 汇总智能体用 publish_artifact 发布一个普通的会话工件,因此标签页会通过与聊天 气泡相同的工件查看器来渲染它 —— 工件系统并没有一个专为审查定制的副本。
  • 发现项放在它旁边的侧栏中,判定则位于工件上方的一条细窄横栏里,而不是仪表板的页眉。
  • 当 PR 的 head 已经越过这次审查时,会出现一条过期横幅。

流程见使用 AI 审查,如何据此采取行动见 审查并合并 PR。

队列把 PR 中变更的文件按内容归入若干文件桶,让含义上属于一组的文件聚在一起,并按影响 排序,使风险最高的一组最先被读到。每次 head-SHA 变化时它们都会被重新计算并整体替换; 每个队列都有一个跨 push 稳定的键,因此摘要和审查进度能挺过一次 rebase。

如果仓库尚未建立代码索引,队列会退回到按路径分组。要给仓库建立索引,请使用 设置 → 工作区 → 仓库 —— 每一行仓库都带有一个索引代码操作,它会运行 index_code 流水线,并就地报告进度。

代码图只解析有内置语法的语言(Dart、JS/TS、PHP、Python、Rust、Zig、C/C++、Go、Java、 Ruby、C#、Swift、Kotlin、R、Assembly、MATLAB、Ada)。任何其他语言的仓库都永远无法 产生语义队列,无论你索引它多少次。

智能体可以用 set_cohort_summary 为队列记录一份 markdown 摘要,并用 add_review_diagram 附加一张结构化的走查图 —— 一个带类型的序列、实体关系或状态机 对象,绝不是 mermaid 文本。每条边都会与真实代码图交叉核对,代码图无法证实的边会被 标记为未经验证,而不是被当作事实画出来。

契约轴只对显式的规范文件做 diff。它匹配六个默认文件名 —— openapi.yaml、 openapi.yml、openapi.json、swagger.yaml、swagger.yml、swagger.json —— 以及任何文件名包含 openapi 或 swagger、且以 .yaml、.yml 或 .json 结尾的 变更文件。从处理程序代码推断出的契约不在范围内,GraphQL schema 也不做 diff。

每个变更都会被分类 —— endpoint、parameter、schema 和 response 的新增、删除与修改 —— 并带有一个严重程度:breaking(删除 endpoint 或 param、收紧类型、新增必填 param)、 non-breaking(追加式)、或 informational。被拒绝的变更会让契约门禁失败,未作出决定的 breaking 变更同样如此;breaking 但已批准的会给出警告;没有 breaking 变更则通过。 标记为 派生(仅供参考) 的 diff 永不参与门禁。

批准或拒绝一个变更用的是 review_studio.setContractDecision。

如果 PR 在一个带有 Widgetbook 应用的 Flutter 仓库中改动了 UI 组件,计算这一遍会在 该 PR 的 base 与 head 工作树中,通过一次无头的 flutter test golden 运行渲染出这些 改动组件的前后状态,然后对像素做 diff。

标记为 changed 或 removed 的快照会扣住视觉门禁,直到被批准;unchanged、 added 和 approved 的快照则会放行。不可用有四种可能原因:主机上没有 Flutter SDK、仓库中没有 Widgetbook 应用、没有可用于 golden 测试的用例,或 golden 装置出错。

批准一个有意为之的变更用的是 review_studio.approveVisual。

轴 由什么驱动
正确性 审查智能体(token)
安全性 审查智能体(token)
测试缺口 审查智能体(token)
视觉 确定性(golden 装置)
API 契约 确定性(规范 diff)

三个 token 轴在主导智能体调用 finalize_review 时记录;两个确定性轴由计算这一遍记录。

每个轴会报告以下状态之一:

状态 含义
Pass 已运行,未发现任何阻塞性问题
Warn 已运行,存在非阻塞性的顾虑
Fail 已运行,发现了阻塞性问题
Partial 已运行但未能完成;结果不完整
Unavailable 根本无法运行

只有 pass 和 warn 能放行受门禁约束的轴。Partial 和 unavailable 与 fail 有意区分开来,两者都不会放行门禁。

各轴会汇总成 Ship、Hold 或 Block,而且它们只会让判定变得_更_严重 —— 判定绝不会被降级。一个受门禁约束的轴如果失败,会强制给出 Block;一个 partial 或 unavailable 的轴至少会强制给出 Hold。因此,一个无法运行的 阻塞性轴会_扣住_判定:证据缺失绝不会让门禁变绿。

评审标签页上的判定,就是 finalize_review 提交的那一个。