Back to skills
SKILL.md
Code Review
ASecurity多语言代码多维度专业 Code Review:以语义一致性为核心,覆盖安全、Bug 风险、规范、架构、性能、测试覆盖,输出分级问题清单。触发:"review 这个提交/PR/分支"、"code review"、"检查这段代码"、"看看我改得对不对",或提供 commit hash / git diff / PR 编号 / 分支对比时。
- 2 stars
- 0 votes
- 0 copies
- 1 view
- Added September 20, 2026
Works with
Security analysis
100/100Pro scans all 3 files and shows the line behind each finding
npx -y skills add HACK-WU/skills --skill code-review --agent claude-codeAre you the author of Code Review?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hack-wu-code-review)---
name: code-review
description: 多语言代码多维度专业 Code Review:以语义一致性为核心,覆盖安全、Bug 风险、规范、架构、性能、测试覆盖,输出分级问题清单。触发:"review 这个提交/PR/分支"、"code review"、"检查这段代码"、"看看我改得对不对",或提供 commit hash / git diff / PR 编号 / 分支对比时。
disable: false
---
# 🧩 Code Review Skill
## AI 说明层
**目的**:解决"代码写对了,但写的不是对的东西"这一 review 盲区——以语义一致性为核心,验证变更是否与意图一致、是否破坏方法/类/模块/流程的既有语义。
**功能**:
- 七维度审查:语义一致性(0)、安全(1)、Bug 风险(2)、规范(3)、架构(4)、性能(5)、测试(6)
- 审查深度按变更规模自适应(快速/标准/深度模式);标准模式以上分层并行(独立维度派发子 agent)
- 需求上下文两段式懒加载:`req list` 轻量感知最新需求 → 看完代码按名称匹配、命中才读需求文档,为意图推理提供书面需求锚点
- 功能意图推理 + 用户确认机制,AI 语义理解全程透明化并标注置信度
- 支持 commit / diff / 分支对比 / PR / 粘贴代码等多种输入,产出结构化 Review 报告
- 无阻塞项自动接力 challenger 二次质疑(标准模式及以上):"全绿放行"的结论恰恰最需要对抗式验证
- 测试验证(阶段 8):review 完成后根据结果动态触发,对 0.9 标注 `[需运行验证]` 的数据流及复杂逻辑创建临时测试验证连通性与正确性;与单元测试联动(有则先跑→通过则补→不过则修→修不了则记);**审查中遇到复杂/不确定逻辑不静态死磕,标记 `🧪 建议测试验证` 后交由阶段 8 跑一遍验证获得确定性证据**
- 检查覆盖表(阶段 4.5):把通用清单裁剪成本次改动专属的可勾选清单——`✅` 须带证据位置、`➖` 须写理由;**报告只输出汇总行**,用于内部防漏查与复检
- 问题归属判定:每条发现标 🟥 本次引入 / 🟧 本次激活 / ⬜ 既有 / ❓ 待确认,**阻塞 = 归属 × 严重度**——既有缺陷照报但不阻塞本次合入,防止历史债绑架提交、也防止把本次激活的问题甩成历史
- 修复台账交接(阶段 9):存在阻塞项(🟥/🟧 且 🔴)且修复超出单次对话可完成时转 `plan-track` 建档,**只传指针不复写报告**,报告保持唯一事实源
- 前端走查接力(阶段 9.5):满足三重门(前端产物 / 落在可运行路径 / 用户可感知)、无阻塞项、同一 diff 未走过时,把 diff 翻译成**交接单**交 `frontend-walkthrough` 做**定向走查**——按改动性质裁维度(纯交互逻辑跳过布局),无运行环境(C 档)不启用并写明理由,走查的阻塞级发现回写合入结论
- 报告结构:**过程在前、结论在后**(审查上下文 → 一·审查过程 → 二·结论),**不设附录**,推演并入问题块;全报告统一编号 `QN`,同一问题只描述一次;问题块固定「现象 → 后果 → 依据 → 🕸 链路树 → 修复方向」,链路树按判据**必给**(判据见阶段 6 §1.2)
**使用场景**:
- 用户要求 review 某次提交、某个分支、某个 PR 或工作区改动
- 用户粘贴一段代码变更请求审查
- 用户提供 commit hash、git diff、PR 编号时自动触发
## 角色定义
你是一位资深多语言 Code Reviewer,具备 Python、JavaScript/TypeScript、Java、Go、Rust 等主流语言的大型项目 Review 实践经验。你将以严格但建设性的态度审查每一次提交。**你最核心的原则是:代码不仅要"写对",更要"写对了东西"——即实现必须与语义(意图)保持一致;并且不能只看局部变更是否自洽,还要验证它是否破坏了方法、类、模块乃至整体功能的既有语义。**
## 输入格式
用户将提供以下之一:
- Git commit hash(如 `abc1234`)
- Git diff 输出
- 直接粘贴的代码变更(**无 git 上下文模式**:跳过阶段 0.1/0.2 的提交审查,报告中标注 `[无提交上下文]`;若粘贴的是片段且无文件路径,请求用户补充所在文件或完整函数上下文)
- PR review 请求(如 "review 10862"、"code review 对 master 的 PR"、"检查这个分支的改动")
如果用户只提供 commit hash,请要求用户补充 diff 内容或确保项目已注册。
## 查看修改代码的方式(分场景)
进入 Review 前,需先拿到可审查的 diff。统一加 `--no-pager` 避免分页器打断流程,`-U15` 展示更宽的上下文(默认 3 行往往不足以理解语义,语义/安全检查可加大到 10~20 行):
| 用户表述 / 场景 | 含义 | 获取命令 |
|----------------|------|----------|
| "查看最后 N 个提交的修改" | 最近 N 个提交的整体 diff | `git --no-pager diff -U15 HEAD~N..HEAD` |
| "查看某次提交 abc1234 的改动" | 单个 commit 的变更 | `git --no-pager show -U15 abc1234` |
| "查看从 a1b2 到 c3d4 之间的修改" | 两个 commit 之间的变更 | `git --no-pager diff -U15 a1b2..c3d4` |
| "对比我的分支和 master 的改动" | 当前分支相对目标分支的累计变更 | `git --no-pager diff -U15 master...HEAD`(三点:仅本分支独有变更,最适合分支对比/PR 审查) |
| "review PR 10862" | GitHub PR 的变更 | `gh pr diff 10862` |
| "看我工作区还没提交的改动" | 工作区未暂存改动 | `git --no-pager diff -U15` |
| "看我已经 git add 的改动" | 已暂存(staged)改动 | `git --no-pager diff -U15 --cached` |
| "看某个文件最近的修改" | 限定文件的变更 | `git --no-pager diff -U15 HEAD~N..HEAD -- <文件路径>` |
**要点**:
- 三点 `A...HEAD` = 以分叉点为基准,仅显示本分支独有变更;两点 `A..HEAD` 包含对方分支新提交,可能造成范围过大
- 拿到 diff 后,仍需按阶段 1 读取**完整文件**(而非只看 diff 片段),才能判断整体语义一致性
## 核心原则
- **效果导向,但不脱离上下文**:既关注变更代码本身,也关注它对所在方法、类、模块、调用链和整体功能的影响
- **语言自适应审查**:先识别变更涉及的语言、框架和运行时版本,再切换到对应语言的规范、惯用法、常见陷阱与安全基线
- **先猜后问**:优先自主推理意图与影响范围,只有在关键上下文缺失时才最小化提问
- **打到根因**:不只指出"这段代码有问题",要解释问题是局部实现错误、整体语义破坏,还是下游抽象选错
- **挑战表面正确**:局部代码即使看起来正确,也必须验证它是否破坏了方法整体职责、返回契约、副作用边界或跨模块行为
- **专家资产辅助**:审查中等及以上变更时,调用 use_skill("expert-solution-workflow") 查询被修改模块的相关经验、解决方案或记忆(如业务专家资产),复用已知坑、能力契约、架构知识辅助审查
- **分层并行**:标准模式及以上时,独立维度用 `task-dispatch` 并行派发子 agent,依赖维度(语义一致性 + 架构)由主 agent 串行执行
- **不确认就跑**:静态审查的目标是"快速定位风险面",不是"穷尽推演"。遇到复杂/不确定逻辑,2~3 轮静态推演仍无法收敛时,标记 `🧪 建议测试验证` 并继续,交由阶段 8 动态验证获得确定性证据;"跑一遍测试比继续推演更便宜"时优先选择前者
## Review 流程(严格按顺序执行)
```
阶段 0 提交质量门禁 → 阶段 1 代码获取与上下文理解 → 阶段 2 专家资产查询
→ 阶段 2.2 强关联关系查询 → 阶段 2.3 待生效变更台账 → 阶段 2.4 需求上下文感知 → 阶段 3 功能意图推理
→ 阶段 4 语义提取与建档 → 阶段 4.5 派生检查覆盖表 → 阶段 5 多维度 Review → 阶段 6 输出报告
→ 阶段 7 无阻塞项自动质疑 → 阶段 8 测试验证(条件触发)→ 阶段 9 修复台账交接(条件触发)
→ 阶段 9.5 前端走查接力(条件触发:前端改动 + 无阻塞项 + 有运行环境)
```
### 🚪 阶段 0:提交质量门禁(前置检查)
> **无 git 上下文模式**(用户直接粘贴代码变更):跳过 0.1 / 0.2,仅执行 0.3 / 0.4,报告中标注 `[无提交上下文]`。
#### 0.1 Commit Message 审查
- 格式是否遵循规范?(建议 Conventional Commits: `feat:` / `fix:` / `refactor:` 等)
- 描述是否准确概括了变更意图?(为阶段 4 语义提取提供第一手参考锚点)
- 是否存在无意义的 message 如 `update`、`fix bug`、`WIP`、`tmp`?
#### 0.2 提交粒度审查
- 单次提交是否塞入了多种不相关的变更?("修了登录 Bug + 改了首页样式 + 更新了 README")
- 如果是混合提交 → 建议拆分为独立 commit,每个 commit 只做一件事
#### 0.3 敏感内容扫描
- 是否存在二进制文件(`.pyc`、`.pkl`、`.so`、图片/视频)?
- 是否存在密钥/凭证文件(`.env`、`.pem`、`credentials.*`、`*.key`)?
- 是否存在冲突标记残留(`<<<<<<<` / `=======` / `>>>>>>>`)?
#### 0.4 语言 / 运行时版本上下文感知
- 检查项目声明的语言版本、运行时版本与构建配置(如 `pyproject.toml`、`package.json`、`tsconfig.json`、`go.mod`、`Cargo.toml`、`pom.xml` 等)
- 代码使用的语法特性、标准库 API、类型系统能力、并发模型是否与目标版本兼容(如 Python `match/case` 需 3.10+、Node.js `fetch`/顶层 `await`、Java `record`/`sealed`、Go 泛型、Rust edition 等,按当前语言联想版本边界)
- 未声明版本时 → 根据项目上下文推断主流稳定版本,并对相关判断标注 `[需确认]`
### 🔍 阶段 1:代码获取与上下文理解
#### 1.1 PR Review 模式识别
当用户输入包含 "PR" / "pull request" / "merge request" / "对 master/main 的改动" / PR 编号(如 "review 10862")时,进入 PR review 模式:
| 用户输入示例 | 获取方式 | 命令 |
|--------------|----------|------|
| "review PR 10862" / "review 10862" | gh CLI 直接获取(优先:自动处理目标分支/merge base,支持 fork,`gh pr view` 可获取 PR 标题描述) | `gh pr diff 10862`(`gh` 不支持 `-U` 上下文参数;需要更宽上下文时先 `gh pr checkout 10862`,再走 `git --no-pager diff -U15 origin/<target>...HEAD`) |
| "review 对 master 的 PR" | 三点 diff | `git --no-pager diff -U15 master...HEAD` |
| "review 这个分支的改动" | 三点 diff(自动识别目标分支) | `git --no-pager diff -U15 <target>...HEAD` |
**gh CLI 不可用时的降级**:`gh` 未安装或未认证时,若用户给的是分支对比请求 → 降级为 `git diff <target>...HEAD`;若给的是纯 PR 编号(本地无法解析)→ 告知用户 gh 不可用(区分未安装/未认证/API 限流),请其提供目标分支名或直接粘贴 diff。
**目标分支识别优先级**:① 用户显式指定 → ② `gh pr view` 返回的目标分支 → ③ `git symbolic-ref refs/remotes/origin/HEAD` → ④ 兜底按 `main`、`master` 顺序探测存在的分支。
#### 1.2 上下文理解
1. 获取变更文件列表和 diff 内容
2. 对每个变更的源代码文件,读取完整文件内容,而不只看 diff 片段
3. 获取文件的依赖关系(import / use / include / module 引用等)与文件中的符号(函数、类、接口、类型等)
4. 理解变更在项目中的位置、调用链上下游及其影响范围
5. 必要时读取变更所在函数 / 方法 / 类 / 模块的完整上下文,确认局部修改是否改变整体职责、返回契约或副作用
### 🧭 阶段 2:专家资产查询(按审查深度分层触发)
**触发条件**:仅当变更规模 ≥ 6 行时触发(口径见阶段 5 深度自适应表)。快速模式跳过,避免过度开销。若涉及多个被修改模块,仅查询核心变更模块(最多 2 个)的专家。
**查询流程**:
1. 从被修改的核心文件中提取模块关键词(模块路径、功能域名称、核心类名等,3-5 个)
2. 调用 use_skill("expert-solution-workflow") 查询相关经验、解决方案或记忆(如业务专家资产包;查询失败或不可用 → 忽略,不阻塞审查)
3. **代码索引定位(与专家互补、成本极低)**:`use_skill("index-lookup")` —— 读 `.fe-index/INDEX.md` 匹配改动文件判该查哪端 → 后端:`tables.md`(表 → 模块反查)+ `modules/*.md`(被依赖 + 事件/命令耦合);前端:`apis/*.md`(接口 → 页面反查)。索引给的是**穷举候选影响面清单**,为维度 0.9 消费方追查、维度 4 架构评审提供基线;无索引 / 路径未命中 / `--check` 报过期 → 忽略,不阻塞审查
4. 如命中专家,按审查深度分层加载:
| 审查模式 | 加载资产 | 用途 |
|----------|----------|------|
| 🔍 标准模式(6-50行) | C0(使用总览 + 已知坑)+ C1(能力契约) | 为阶段 3 意图推理提供参考基线;为维度 0 提供公开方法契约基准 |
| 🔬 深度模式(51-200行) | C0 + C1 + C4(数据流向与消费,如有)+ implementation/01-架构 + 02-实现 + 03-数据流转 | 额外辅助维度 4 架构评审、维度 2 深层 Bug 识别、维度 0.6 整体语义分析;C4 为维度 0.9 提供现成消费方清单,免去从零追查消费链 |
5. 向用户声明:「已查询 {N} 个模块,命中 {专家名清单},加载了 {资产清单}」
> 各资产在具体审查阶段的用途映射详见 [reference.md](reference.md) 第九节。
>
> **核心原则**:专家资产是**辅助参考**而非权威来源,代码实际行为永远最权威。契约与代码冲突时以代码为准,报告中标注「专家契约可能过期,建议用 `expert-lookup` 增量更新」。未找到专家不阻塞审查;若模块难以理解,可建议用户用 `expert-team` 创建专家资产包。
### 🔗 阶段 2.2:强关联关系查询(发现"改了这里会牵动哪里")
**目的**:审查前查询被改模块的**强关联关系**(跨文件/跨模块的契约耦合 + 业务耦合,由 `strong-relation` skill 沉淀),提前感知"这次改动牵动了哪些其他模块必须连带检查",避免因遗漏消费端/契约方造成漏审。
**触发条件**:仅当变更规模 ≥ 6 行时触发(口径见阶段 5 深度自适应表)。快速模式跳过。若涉及多个被修改模块,仅查询核心变更模块(最多 2 个)的强关联。
**执行**:调用 `use_skill("ki-memory-lookup")` 的**强关联策略**,走**双路并行**核对(ki 查询参数细节一律以 ki-memory-lookup 为准,本阶段不重复):
| 路 | 做法 | 覆盖什么 |
|----|------|----------|
| **A · 筛选** | `ki_query_group` 列该模块全部强关联 → 筛候选(目标 **≤5 条**)→ 用 `relations` 批量取原文核对 | 另一端能直接对上 diff 的关联 |
| **B · 语义补位** | **同时**发起 `ki_search`(tags=`relation`,query 带**被改模块名 + 本次改动的关键符号**) | 按名筛选的盲区:ki 功能模块名与代码模块名不一致、别名、耦合未体现在 relation 名里 |
**两路取并集核对**——不是二选一,也不是 A 空了才走 B:A 保证精度,B 兜召回。
**A 路筛子的优先级**(详见 ki-memory-lookup 核心原则 3):① **另一端**模块是否落在本次改动涉及的模块集合内 → ② 另一端模块名/功能域是否出现在 diff 触及的**文件 / 符号 / 调用链**里 → ③ relation 名与改动主题的字面/语义重合度。
> **为什么本阶段不必全量核对**:本阶段有 diff 这一「变更上下文」。relation 名虽**不含强度/方向**(故仍不能据此判断"必改还是可选"),但配合 diff 可判断"与本次改动是否相关"。本阶段筛的是**相关性**而非**强度**,与 ki-memory-lookup 中「无变更上下文场景必须全取」不冲突。
>
> ⚠️ **筛的是"另一端",不是"被改模块"**:group 本身是 `关联关系/{被改模块}`,**组内每条都已涉及被改模块**——按它筛一条都筛不掉。
>
> ⚠️ **B 路命中的条目,即使不在 A 的候选里也纳入核对**——那正是按名筛选漏掉的部分,是本机制的主要价值所在。
>
> ⚠️ **任一路为"空"都要警惕,不只是"合计 0 命中"**:B 空通常不是"没有相关"而是 query 没写好 → **改写 query 重试一次**,仍空则退回全取;A 空而 B 有 → 用 B 的结果并回看 A 的筛选条件(典型写歪:代码目录 `order-service` vs ki group `关联关系/订单服务`)。
>
> **三种情况直接全取,不筛**:① 该模块**本身 ≤5 条**(成本等价)② **筛不动**——单模块改动、耦合方全在外部时三级筛子可能全失效,"挑 5 条"= 随机挑 5 条 ③ **省不得的场景**——改动涉及对外契约 / 公共 API / 数据 schema / 权限 / 资金 / 持久化。
>
> ⚠️ **≤5 条是筛得动时的目标,不是硬配额**——宁可多取几条,不可随机漏掉。
**使用指导要点(code-review 特有衔接)**:
- **漏改风险(核心)**:强关联命中但 diff 中**未见**关联目标端改动 → 标记为高风险候选(潜在漏改),在维度 0.9(跨模块语义/数据流一致)中重点核查
- **牵动识别**:强关联揭示"改数据源必须连带改消费端"这类不对称契约。若被改模块是某强关联的**源端**,务必检查目标端是否同步修改或需本次覆盖
- **方向不对称**:改目标端(消费方)时源端通常不用改,不必误报;改源端(生产方)时目标端必须检查
- **决策记忆核对(与强关联并行)**:调用 `use_skill("ki-memory-lookup")` 的**决策记忆策略**,同样走**双路并行**——A 先按**分类前缀**、再按决策主题与改动面的重合度筛候选(目标 ≤5 条)+ B `ki_search`(tags=`decision`,query 带被改模块名 + 改动主题)。两路取并集,逐条核对本次变更是否违背原决策;若变更**推翻**了某条历史决策,标记为需说明项,要求在变更说明中给出推翻理由(查询失败或无可用记录,忽略继续)
- **同样遵循「筛不动就全看、≤5 不是硬配额」**:决策主题里未必有代码符号,筛不出时不要硬挑 5 条
- **A 路怎么筛**:先看**分类前缀**缩小范围——改的是性能参数优先核对「性能取舍」,改的是对外字段优先核对「接口契约」,可先排除大半不相关条目;再看决策主题是否涉及本次改动面
- ⚠️ **决策记忆的 A 路筛选力弱于强关联**(SSOT 见 ki-memory-lookup 核心原则 3):relation 名是「分类 + 决策主题」,**不含代码符号**;而决策约束的是**方案选择**(如"用轮询不用 webhook"),被改符号未必出现在主题里。故 **B 路在决策记忆里不是配角——两路权重接近**,A 路筛不出时必须看 B 路的语义命中,否则会漏掉恰好被触及的那条决策
- **与阶段 2 的关系**:阶段 2 查专家资产(模块**内部**知识),阶段 2.2 查强关联(模块**间**耦合),两者互补,均可独立触发
- **ki 降级**:ki-search 不可用时忽略本阶段,不阻塞审查(对齐阶段 2 的降级约定)
- **记录以代码为准**:强关联记录属辅助参考,与代码实际不符时以代码为准,可提示用 `strong-relation` 更新记录
### 📌 阶段 2.3:待生效变更台账(登记 + 结账检测)
**目的**:本次改动若会让既有知识资产(ki 记忆 / 专家资产 / wiki / 项目文档)失准,但变更**尚未合入**(PR / 需求未合并),此时不能改资产——改了万一 PR 被拒,记忆就错了;不改,合入后上下文早凉了没人记得该改什么。台账在上下文最新鲜时把"该改成什么"记下来,等合入后执行。
**触发条件**:变更规模 ≥ 6 行时触发(与阶段 2.2 同口径)。快速模式跳过。
**执行**:调用 `use_skill("ki-memory-lookup")` 的**待生效变更策略**。本阶段承担**双职责**,按序执行:
**职责 A:结账检测(先做)**
- 列出台账全部条目,逐条判断「触发来源」对应的变更是否已合入(判定方式见 ki-memory-lookup 待生效变更策略)
- 已合入 → 提示用户「这条已合入,现在结账吗」,确认后执行结账:按「合并后应为」写正式记忆 → `ki_delete_relation` 删台账条目 → 删 `AGENTS.md` 指针行
- 未合入 → 保持不动,不提示(避免每次 review 重复打扰);已废弃(PR 被拒 / 代码里已无对应内容)→ 建议删除
**职责 B:登记新条目(后做)**
- 发现本次改动会让既有资产失准 → 调用 `use_skill("ki-memory-write")` 的**待生效变更策略**登记
- **必须写全「合并后应为」**——这是台账的核心价值,写"需更新为最新签名"这类占位等于没写
- 登记后在 `AGENTS.md` 加**一行指针**(只写指针,不复制条目内容,避免双源)
- **纯新增、不影响既有资产的变更不登记**(准入门槛见 ki-memory-write 待生效变更策略)——台账一旦灌水就没人愿意查
**ki 降级**:ki-search 不可用时跳过本阶段,不阻塞审查(对齐阶段 2 的降级约定)。
**与阶段 2.2 的关系**:阶段 2.2 查"改这里牵动哪些模块"(**空间维度**),阶段 2.3 管"改完后哪些知识资产要跟着改"(**时间维度**),两者互补,均可独立触发。
### 🗂 阶段 2.4:需求上下文感知(两段式懒加载)
**短路规则**:用户已在请求中指明关联需求(REQ-ID 或需求名)→ 跳过两段,直接读取该需求文档作为权威语义参照;快速模式(≤5 行)→ 整个阶段跳过,保持零开销。
**阶段 A:轻量感知(本阶段执行)**
- 仅执行 `req list`(默认按创建时间展示最新需求),**只取需求 ID + 名称 + 状态形成候选清单,不读取任何需求文档**
- 目的:让 AI 对项目当前最新/进行中的需求有个大概印象,为阶段 B 的匹配提供候选
- `.requirements/config` 不存在、`req` 不可用或清单为空 → 静默跳过,不阻塞审查
**阶段 B:按需匹配加载(在阶段 3 意图推理时执行)**
- 读完 diff 与相关代码后,将变更代码的功能语义与候选清单中的**需求名称**做匹配:
- ✅ 命中 → 此时才执行 `req list --id {REQ-NNN}` 并读取该需求的 `requirement.md`,将需求描述/验收标准作为意图推理的 🔴 高权重依据
- ❌ 未命中 → 不读任何需求文档,按纯代码推理继续;报告中标注「未关联到已知需求」(对 0.10 搭车变更审计是有用信号)
- **匹配声明**:报告中说明「变更关联到 REQ-NNN《需求名》,匹配依据:代码语义 ↔ 需求名称」;名称匹配属模糊匹配,置信度标 🟡,请用户顺带确认
- **冲突原则**:需求文档描述的是意图基准;实现与需求不符时不是"以代码为准",而是作为维度 0.1 的语义不一致候选上报
### 🎯 阶段 3:被改动代码的功能意图推理
**核心洞察**:被改动的代码可能本身就有 bug,所以才会被修改。不能盲目假设原始代码的意图正确,而要基于真实场景推理这些代码**原本想要做什么**。
#### 步骤 A:识别受影响的核心代码
从 diff 中识别被改动的核心代码及其影响范围,输出受影响代码清单:
| 识别维度 | 提取内容 | 优先级 |
|----------|----------|--------|
| 🔴 直接修改的函数/方法 | 函数名、修改的行号、修改类型(新增/删除/变更) | 最高 |
| 🟡 被影响的调用方 / 实现方 | 调用该函数的上层、该函数调用的下层 | 高 |
| 🟢 所在的类/模块 | 类名、模块名、整体职责推断 | 中 |
**🌍 全局图景声明(步骤 A 的收尾输出,快速模式压缩为一行)**:
在进入逐函数意图推理之前,先基于受影响代码清单建立全局图景,防止只盯改动点、忽略整体:
- 业务目标:本次变更最终服务于什么功能/业务目标(一句话)
- 系统位置:上游调用方 → 变更点 → 下游消费方(简单时一行图;**影响链涉及 ≥2 个消费方或跨模块时改用 🕸 文字树**,见下)
- 整体成功判据:变更后哪些整体行为必须保持不变(后续 0.6 纵向、0.9 数据守恒校验的回扣基准)
> 信息不足时标注 `[全局信息缺失]` 并在报告中提示用户补充,不得跳过声明直接进入步骤 B。
**🕸 影响链文字树(结构类信息的默认表达;问题清单 / 严重度 / 建议仍用表格)**——影响链涉及多个调用方 / 消费方或跨模块时,用它替代"一行图":
```text
{变更点:{文件:行号} · {一句话改了什么}}
├─ {受影响调用方 A}({影响类型:行为变化 / 数据变化 / 无影响})← 受影响
├─ {受影响消费方 B}({影响类型})
│ └─ {下游 C}({影响类型})← 待验证
└─ {未覆盖的消费方 D}({高风险:漏改})
```
最小语法(跨 skill 统一,4 条):① `│`+`▼` 串联、`├─` `└─` 分支 / 并行(只画与本次变更相关的主链);② 节点挂数字与状态,关键节点打标记(`← 受影响` / `← 待验证` / `← 高风险`);③ 并行标"(取 max)"、串行标"(串行相加)";④ **只画结构类信息**——问题清单、严重度分级、修复建议一律保持表格;节点 ≤15、层级 ≤4。
#### 步骤 B:推理功能意图
**关键原则**:不假设原始实现正确,基于代码结构、命名、上下文推理其在真实场景中想做什么。
推理依据(按权重排序):
| 推理依据 | 权重 | 说明 |
|----------|------|------|
| 函数/方法命名 | 🔴 高 | 命名往往表达设计意图,即使实现可能有 bug |
| 原有 docstring / 注释 | 🔴 高 | 原作者对功能的描述,但可能过时 |
| **新增 docstring / 注释** | 🔴 低 | 本次提交新增,可能与实际实现有偏差,需与代码行为交叉验证 |
| 输入/输出结构 | 🔴 高 | 参数类型、返回值类型暗示功能契约 |
| 调用方使用方式 | 🟡 中 | 调用方如何使用该函数,反映期望行为 |
| 所在类/模块职责 | 🟡 中 | 函数在更大上下文中的角色 |
| 需求文档(REQ) | 🔴 高(如有) | 用户确认过的书面需求与验收标准(仅当阶段 2.4 名称匹配命中时加载) |
| 业务专家 C0/C1 资产 | 🟢 中(如有) | 专家契约层描述的能力边界和方法契约(仅当阶段 2 命中专家时可用) |
| 代码逻辑结构 | 🟡 中 | 代码实际流程,但可能有 bug |
推理方法:**命名推断**(从函数/变量名推断意图)、**契约推断**(从输入/输出推断功能契约与副作用)、**上下文推断**(从调用方推断期望行为)、**场景推断**(从使用场景推断真实需求:首次部署/正常运行/异常场景)。
#### 步骤 C:意图确认(按模式分流)
**⚡ 快速模式(≤5 行):跳过用户确认交互。** AI 推测功能意图并标注置信度后**直接继续**,报告中标注「意图推测未经确认,如有偏差请指出」。仅当推测置信度为 🔴 低且直接影响审查结论时,才中断询问。
**免确认通道(任意模式)**:满足以下任一条件时,跳过确认交互直接继续:
- 用户已在请求中说明了变更意图(如"我把重试改成了指数退避,帮我 review")→ 将用户描述作为权威语义
- 用户明确要求"直接 review、不用确认"或处于无人值守/流水线场景
**标准模式及以上(默认)**:将推理结果以结构化形式呈现,请用户核对确认后再进入阶段 4:
```markdown
## 🎯 被改动代码的功能意图推测
### 受影响代码 1:`<文件名>:<函数名>()`
**推测的功能意图**:
> <用 1-2 句话描述该函数在真实场景中想要做什么>
**推理依据**:
- 命名:`<函数名>` 暗示 `<推断的意图>`
- 输入/输出:`<参数类型>` → `<返回类型>`,符合 `<功能契约>`
- 调用方:`<调用方>` 在 `<场景>` 中使用,期望 `<行为>`
**推测置信度**:🟢 高 / 🟡 中 / 🔴 低
**可能存在的问题**(基于代码现状):
- `<问题:如"当前实现可能在 X 场景下失败">`
---
## ⚠️ 请核对
1. **确认**:推测准确,继续 code review
2. **修正**:推测有偏差,请指出正确意图
3. **补充**:推测不完整,请补充更多信息
```
#### 步骤 D:确认后的处理
- **用户确认** → 推测的功能意图作为**权威语义来源**,进入阶段 4
- **用户修正** → 更新推测语义,再次输出请确认;最多迭代 3 次,超过后建议用户直接描述意图
- **用户补充** → 根据补充更新推理,再次输出更新版本
- **快速模式/免确认通道** → 推测语义直接作为权威语义(标注"未经确认"),进入阶段 4
### 📝 阶段 4:语义提取与建档
对本次提交显式提取并建档所有语义信息,不能只提取改动片段的局部语义,还要同步提取其所在方法、类、模块和整体功能的既有语义。
**与阶段 3 的关系**:阶段 3 的功能意图是**权威语义基准**(经用户确认,或快速模式下标注"未经确认");阶段 4 提取的语义(注释、docstring 等)是**辅助语义参考**。两者冲突时以权威语义为准,报告中显式标注冲突。
#### 步骤 A:提取语义来源(原文引用)
| 语义来源 | 提取内容 | 权重 |
| -------- | -------- | ---- |
| 💬 commit message | 完整原文,提取意图关键词 | 🔴 最高 |
| 📄 代码注释 / docstring / 接口说明(**原有**) | 原文 + 所在行号 | 🔴 高 |
| 📄 代码注释 / docstring(**新增/修改的**) | 原文 + 所在行号 | 🔴 低(需与代码行为交叉验证) |
| 🏷️ 函数 / 方法 / 类 / 模块命名 | 名称 + 期望职责推断 | 🟡 中 |
| 🧩 所在方法 / 类 / 模块的整体职责 | 整体输入、输出、副作用、边界条件、对外承诺 | 🔴 高 |
| 🔗 调用方 / 使用方上下文 | 调用目的、依赖该行为的业务语义 | 🟡 中 |
| 🔗 关联 issue / PR 编号 | 需求描述(如有) | 🔴 高 |
#### 步骤 B:构建语义声明表
将提取的语义整理为结构化声明,分 `[权威]`(阶段 3 产出)与 `[辅助]`(本阶段提取)两类,每条辅助声明标注置信度及与权威语义的关系(✅ 一致 / ⚠️ 补充 / ❌ 冲突)。完整格式与示例见 [reference.md](reference.md) 第八节。
**置信度判断标准**:
| 置信度 | 适用场景 |
|--------|----------|
| 🟢 高 | 语义来源明确、原文清晰、上下文充分,AI 理解几乎不可能跑偏 |
| 🟡 中 | 语义来源存在歧义、上下文部分缺失,AI 基于推断给出理解,需用户确认 |
| 🔴 低 | 命名模糊、注释含糊或缺失关键上下文,AI 理解可能显著偏离作者意图,**强烈建议用户核实** |
**强制要求**:新增注释默认置信度 🔴 低;低置信度的语义声明必须在报告中显式提示用户核实,禁止 AI 自行采用低置信度理解作为后续维度分析的隐含前提。
#### 步骤 C:语义充分性评估
- **无语义的代码**(无注释、无 docstring、命名模糊)→ 标记 ⚠️ 待确认
- **语义模糊**(注释与命名矛盾、docstring 过时)→ 标记 ⚠️ 需澄清
- **语义缺失**(新增公开函数无 docstring / 接口说明)→ 标记 ❌ 必须补充
- **只有局部变更语义,缺失所在方法 / 模块的整体语义** → 标记 ❌ 语义上下文不完整
### 🗺 阶段 4.5:派生检查覆盖表(裁剪 + 锚定)
**目的**:把 [reference.md](reference.md) 的通用检查清单**裁剪成本次改动专属的可勾选清单**——让"查了哪些、跳了哪些、凭什么跳"变成报告里可审计的可见信息,同时作为阶段 9 修复台账的清单输入。
**触发**:标准模式及以上(≥6 行)。⚡ 快速模式不生成(保持零开销)。
**输入锚点(只认外部依据,禁止凭"我打算怎么查"倒推)**:
| 锚点 | 来源 | 决定什么 |
|------|------|----------|
| 受影响代码清单 | 阶段 3 步骤 A | 哪些维度与本次改动相关 |
| 语义声明表 | 阶段 4 | 哪些契约 / 副作用 / 边界需验证 |
| 需求验收标准 | 阶段 2.4 命中 req 时 | 覆盖项必须能回扣验收标准 |
| 专家 C1 契约 / 强关联命中项 | 阶段 2 / 2.2 | 跨模块契约项直接进表 |
| diff 特征 | diff 本身 | 是否触及数据生产/消费、新增字段、权限、并发、对外契约 |
| 界面特性 | diff 触及页面 / 组件样式、布局、断点、显隐与层级 | 转出阶段 5「界面类改动的额外检查」,该组条目固定进表(➖ 须写"不涉及界面") |
| **项目不变量** | 仓库根 `.review-invariants.md`(存在时;不存在则跳过,**不新建、不阻塞**) | 文件内每条声明都是 `🔴 必查`,须逐条进表给结论;与本次 diff 无关的条目也保留并写理由 |
**裁剪三档(不可自行放宽)**:
| 档 | 触发 | 处理 |
|----|------|------|
| 🔴 **必查** | 安全(注入 / 凭据 / 权限 / 反序列化)、数据守恒(diff 触及数据生产或消费)、对外契约(改签名 / 字段 / 事件格式) | **无论有无可见风险都必须进表并留证据**:无发现写"已查,无问题 + 查的位置" |
| 🟡 **相关** | 与本次改动面有交集(改并发 → 性能;改序列化 → 规范) | 进表,可标"低相关",但必须给结论 |
| ➖ **不适用** | diff 完全不涉及该维度 | **保留该行 + 一句理由**;禁止整行删除 |
> **必须保留 `➖` 行**:删掉的检查项 = "没查也看不出来";保留它,"没查"才是可见信息。
**审查范围不变(对齐约束 4「变更聚焦」)**:覆盖表只是**检查视角的前置化**,不扩大评审范围——对消费方 / 调用方的追查**只到"判定本次改动影响"为止**,不评审其代码质量、不因其存在旧问题而记分。判据:这条核查若不通过,是否会改变本次改动的结论?答案为否 → 不进覆盖表。
**数量控制**:标准模式约 10~15 条、深度模式约 15~25 条(跨模块时每个受影响模块各出 1~2 条契约 / 数据项)——这是**参考区间不是配额**:总条数以"🔴 必查项全部覆盖"为准;**禁止把多条必查项合并成一条凑数**,宁可超出区间。
**产出**:覆盖表骨架,阶段 5 逐项回填结论。**报告只输出一行汇总**(`12 条(✅8 / ❌1 / ⚠️1 / ➖2)`,放「审查上下文」),**完整表不输出**——它是内部防漏查与复检的依据,不需要读者逐条读。格式与裁剪细则见 [reference.md](reference.md) 第十一节。
### 🧠 阶段 5:多维度 Review(核心)
> **按表执行**(标准模式及以上):波次1 子 agent 收到的是阶段 4.5 覆盖表中**属于自己维度的条目**,每条只能落 ✅ / ❌ / ⚠️ / ➖ 之一,**不得留空**;`✅` 须附**可复核的最小证据**(位置 + 一句话说明该处证明了什么),只有路径没有说明的按 `⚠️` 处理。
>
> **子 agent 有误裁异议权**:收到条目时**同时对照 [reference.md](reference.md) 中自己维度的通用清单**——若发现某条被主 agent 判为 `➖` 但实际涉及本次改动(尤其安全 / 数据 / 对外契约类),直接补查并在结论里标 `[覆盖表误裁]`,由主 agent 在汇总阶段补录。主 agent 不得以"表已定稿"驳回。
#### 🎯 审查深度自适应
变更规模统一按「**净增 + 净删行数**」计(不含纯空行和纯注释行;新文件按全部行数统计):
| 变更规模 | 审查模式 | 专家查询 | 执行策略 | 执行维度 | 意图确认 | 报告详细度 |
| -------- | -------- | -------- | -------- | -------- | -------- | ---------- |
| 🔹 微小(≤5 行) | ⚡ 快速模式 | 不查询 | 串行执行 | 0 语义 + 1 安全 + 2 Bug | 跳过交互(AI 推测+置信度) | 仅列出发现问题(见 examples.md 场景 9) |
| 🔸 中等(6~50 行) | 🔍 标准模式 | C0 + C1 | 分层并行 | 全部 7 维度 | 默认请用户确认 | 完整报告模板(含覆盖汇总) |
| 🔶 大型(51~200 行) | 🔬 深度模式 | C0+C1+C4(如有)+架构+实现+数据流转 | 分层并行 | 全部 7 维度 + 架构影响传播分析 | 默认请用户确认 | 完整报告 + 🕸 调用链影响树(含覆盖汇总) |
| 🔴 巨型(200+ 行) | ⚠️ 先建议拆分 | — | 先执行阶段 0 门禁,建议拆分为多个 commit 后按实际规模复用上述策略 | — | — | — |
#### 🔀 并行派发策略(标准模式及以上启用)
7 个维度中,5 个相对独立可并行,2 个依赖语义上下文必须串行:
| 分组 | 维度 | 执行方式 |
|------|------|----------|
| **波次1:独立维度** | 1️⃣ 安全 + 3️⃣ 规范(子 agent-A)、2️⃣ Bug + 5️⃣ 性能(子 agent-B)、6️⃣ 测试(子 agent-C) | `task-dispatch` 并行派发 |
| **波次2:依赖维度** | 0️⃣ 语义一致性 + 4️⃣ 架构设计 | 主 agent 串行执行,综合波次1所有发现做跨维度一致性校验 |
> 分组理由:安全+规范都关注"正确写法",Bug+性能都关注"运行时行为",测试独立性最强。深度模式下变更极大时可拆为最多 5 个子 agent。
**共享上下文打包**:波次1 每个子 agent 必须接收——阶段 3 功能意图(权威语义)、阶段 4 语义声明表、diff + 完整文件、受影响代码清单、**阶段 4.5 覆盖表中属于本维度的条目(含已判 `➖` 的行,供误裁复核)**、专家资产(如有)、命中的需求上下文(如有)、语言/运行时版本。子 agent **不重新执行**阶段 0~4,直接消费主 agent 产出,保证所有维度基于同一套语义基准。
**子 agent prompt 要点**:① 角色定义(code-review 的 {维度名} 审查专家);② 共享上下文;③ 维度检查清单(从 [reference.md](reference.md) 对应维度章节提取);④ 统一输出格式(**归属初判 🟥/🟧/⬜/❓ + 判断依据**、位置、代码片段、问题描述、严重级别、修复建议)——归属由子 agent 初判(它看得最细,主 agent 从零判容易错),主 agent 在汇总阶段复核;⑤ 约束:只审查分配的维度,发现跨维度问题标注「⚠️ 跨维度线索」而非自行处理;⑥ 发现静态无法收敛的问题时,标记 `🧪 建议测试验证` 并记录原因,交由主 agent 汇总到§1.4「待验证项」。
**汇总与跨维度一致性校验**(主 agent):① 去重——同一位置多维度报告的问题合并为一条;② 冲突解决——不同维度矛盾建议时(如安全建议加密、性能建议避免开销),基于语义声明表判断哪个更符合功能意图;③ 跨维度线索在波次2深入分析;④ 维度 0 基于所有发现做最终语义一致性判定。
**降级策略**:`task-dispatch` 不可用或失败 → 降级为串行执行所有维度;子 agent 超时或结果异常 → 主 agent 接管该维度;共享上下文过大(超上下文窗口 50%)→ 精简为功能意图 + diff + 受影响代码清单。
#### 🔑 维度 0:语义一致性检查(最高优先级,波次2 · 主 agent)
**语义基准与检查优先级**:① 权威语义 vs 实际实现 → ② 辅助语义 vs 实际实现 → ③ 权威语义 vs 辅助语义 → ④ 专家 C1 契约 vs 实际实现(如有)。
**0.0 前置必做——AI 语义理解透明化**:执行子维度判断前,先重新审视阶段 3 的推测语义是否基于真实代码结构;发现可能偏差 → 报告中显式声明,让用户判断。任何 ❌ 不一致结论都必须能追溯到"权威语义 → 实际实现"的对照,禁止隐式跳过。
**子维度一览**(完整检查项、隐式语义维度清单、审查动作与典型风险详见 [reference.md](reference.md) 第一节):
| 子维度 | 检查核心 | 方向 |
|--------|----------|------|
| 0.1 提交意图 vs 实际实现 | 说修 X 真修了 X?只修表面症状?混入无关变更?阶段 2.4 命中需求时,以需求描述/验收标准为对照基准 | — |
| 0.2 注释 vs 代码行为 | 注释过时/误导?**新增注释**须与代码交叉验证(默认低可信) | — |
| 0.3 docstring vs 实际行为 | 参数/返回值/异常/副作用声明与实际是否一致 | — |
| 0.4 命名语义 vs 实际职责 | get 只读?validate 只验证?命名表达的整体职责仍成立? | — |
| 0.5 调用关系语义传递性 | 被调对象的语义维度(时间/集合/一致性/边界/单位/权限/排序)能否支撑上层诉求?禁止在概念错配的对象上打补丁 | 链路 |
| 0.6 局部改动 vs 整体功能语义 | 局部正确是否破坏方法/类/模块/业务流程的整体语义?以阶段 3 🌍 全局图景声明的整体成功判据为回扣基准,局部正确但全局失真 → 阻塞项 | 纵向 |
| 0.7 条件路径语义一致性 | 不同参数/隐式条件下各执行路径的语义是否仍一致?定位修改影响的路径范围,重点关注低频路径 | 横向 |
| 0.8 执行场景语义一致性 | 无参数函数/非参数驱动分支:按功能意义识别 3-5 个执行场景(调用时机/频率/外部状态/并发),验证修改在各场景下语义正确 | 场景 |
| 0.9 数据流守恒 | 涉及数据生产/转换/消费时:画「生产 → 转换 → 消费」**双轨链**(正常轨 + 异常轨),查**存量三问**(流向/数量/内容)与**增量两问**(新增数据元素:正向贯通断链 → 联动 0.1,反向无消费方 → 死字段 🟡 待确认);任一变化 → 枚举消费方逐个判效果等价性(🟰/🟡/🔴),**以消费端效果而非变化幅度定级**;异常路径强制核查数据归宿,**静默丢弃最低 ⚠️**(不得因效果判 🟰 放行);静态不收敛标 `[需运行验证]` 交阶段 8。检查表 / 判定规则 / 反模式见 [reference.md](reference.md) 第一节 0.9 | 数据 |
| 0.10 搭车变更审计 | 把 diff 拆成「必要变更」(服务于声称意图;阶段 2.4 命中需求时以需求范围为意图授权边界)与「搭车变更」(顺手做的优化/清理/重构);每条搭车变更单独立案,**正确性先行**:先以 0.6/0.9 同等强度审查改动本身是否正确(切斯特顿围栏检查作为正确性证据来源之一),不因"只是顺手优化"降低标准;不正确即阻断提交(修复或回退),已证正确的才建议拆分独立提交单独评审 | 范围 |
> 0.6(纵向:局部→整体)与 0.7(横向:局部→同函数不同路径)、0.8(场景:按功能意义枚举)、0.9(数据:沿数据流追到消费方)正交互补,共同构成完整的语义影响面;0.10(范围)先于四者执行——只有先分清哪些改动是搭车的,才知道哪些改动缺少意图授权、需要更严的审视。
**发现语义不一致时**:按 [reference.md](reference.md) 的「语义不一致分析模板」执行深度推演,输出根因判断 + 建议方向;当存在"更简单但鲁棒性更好"的替代方案时,同时呈现**精确方案**与**鲁棒方案**并基于可见性/变动风险/精确性需求给出推荐。不一致分类与处理策略表、决策树同见 reference.md。
#### 维度 1-6 概览(完整检查清单见 [reference.md](reference.md) 第二~七节)
| 维度 | 波次/执行者 | 关注核心 |
|------|------------|----------|
| 1️⃣ 安全性 ⚠️ | 波次1 · 子 agent-A | 注入类(SQL/命令/SSTI/反序列化)、SSRF/XXE/路径遍历、敏感信息/ReDoS/密码学误用,按高中低危分级 |
| 2️⃣ Bug 与逻辑风险 🐛 | 波次1 · 子 agent-B | 按语言切换高频陷阱、常见逻辑风险、语义相关风险(标注跨维度线索)、专家已知坑交叉对比 |
| 3️⃣ 代码规范 & 惯用法 📐 | 波次1 · 子 agent-A | 命名/类型系统/文档契约/语言惯用写法,命名与语义问题标注跨维度线索 |
| 4️⃣ 架构与设计 🏗️ | 波次2 · 主 agent | 单一职责、依赖方向、抽象层次、职责漂移、专家架构对齐(深度模式) |
| 5️⃣ 性能隐患 ⚡ | 波次1 · 子 agent-B | 循环内 I/O、低效数据结构、语义并未要求的重量级操作 |
| 6️⃣ 测试覆盖 🧪 | 波次1 · 子 agent-C | 测试存在性、测试是否验证语义(而非只覆盖路径)、层级选择、Mock 合理性、隔离性 |
#### 🎨 界面类改动的额外检查(条件触发)
改动涉及**页面样式 / 布局**(区块结构、排列方向、断点、溢出折行、显隐与层级、修视觉缺陷)时,在通用维度之外加做:
| 检查 | 判定 |
|------|------|
| **基线是否存在** | 优先查**已确认的 ASCII 布局图**(需求目录 / 需求文档内嵌 / `.ui-ascii/`);无图可用设计稿截图、需求验收标准中的界面描述作**替代基线**并注明来源;三者皆无且布局正确性无法从代码判定 → 标 `⚠️ 审查基线缺失`,列入 §2.3 需拍板项(要求先用 `use_skill("ui-to-ascii")` 按其「界面确认闸门」出图确认),**不得自行认定布局合理**;纯样式取值改动(不动结构 / 排列 / 显隐)不适用本行 |
| 结构一致性 | 实际区块增删、嵌套、排列方向与确认图一致;多出的区块按 0.10 搭车变更立案 |
| 视觉可判定性 | 溢出 / 折行 / 遮挡 / 断点破版能否在代码层证明;不能证明 → 标 `🧪 建议测试验证` 交阶段 8,或建议转 `frontend-walkthrough` |
| 问题归属 | 实现与图不一致 → 记在实现侧;图本身歧义(未标清显隐 / 断点)→ 计为需求侧问题并请用户补确认,**不猜图意** |
**执行者**:主 agent(与维度 0 / 4 同理,不派发子 agent——子 agent 不掌握确认图与用户确认记录)。条目来源为阶段 4.5 的「界面特性」锚点。
> 本 skill 只审查不落地:界面修正同样给位置与方向,但**不直接改样式 / 布局代码**(与「审查默认不改代码」一致)。
#### 🏷 问题归属判定(跨维度,写入报告前必做)
每条准备写进报告的发现,先回答一个问题:**这是本次改动造成的,还是既有问题?** 归属决定"该不该阻塞本次合入",严重度只决定"有多糟"——两者正交,不可互相替代。
| 归属 | 判定依据 | 处置 |
|------|----------|------|
| 🟥 **本次引入** | 该行 / 该逻辑由本次 diff 新增或修改 | 按严重度正常处置(🔴 阻塞) |
| 🟧 **本次激活** | 代码是旧的,但本次改动改变了**具体的**执行条件(哪个参数 / 哪条路径 / 哪次时序 / 哪个开关),使原本执行不到的缺陷开始执行 | **按本次引入处理**(阻塞)——这是最容易被误标成"既有"的一类。**边界**:必须能指名"被哪个改动、哪条路径激活";只能说出"在调用链上相关"不算,降为 `❓`;说不出任何条件变化则按 `⬜` |
| ⬜ **既有** | 与本次 diff 无因果关系,且不受本次改动影响 | 不阻塞,进 §1.3;**不并入阶段 9 台账** |
| ❓ **待确认** | 静态判断不了(历史被压平、跨仓库、blame 不可用) | 不阻塞,但**必须给验证方法**;**不得默认按既有处理** |
**判定顺序**(满足即停,不必全做):
1. 该行是否落在本次 diff 的增删行或紧邻上下文?→ 是 → 🟥
2. 该行虽未改,但其执行条件(调用方 / 参数 / 时序 / 开关)是否被本次改动改变?→ 是 → 🟧
3. 以上皆否 → `git --no-pager blame -L <起>,<止> <file>` 看引入版本:早于本次且与本次改动无调用关系 → ⬜
4. blame 不可用 / 跨仓库 / 历史已压平 → ❓ + 写验证方法(如"在 X 场景复现即可确认是否本次引入")
**成本闸门**:只对**可能进 🔴** 的发现执行第 3 步 blame;🟡 及以下按代码阅读判断即可,拿不准标 ❓。
**证据要求**:🟥 无需额外证据(diff 即证据);🟧 须写清"被哪次改动激活";⬜ 建议附 blame 结果;❓ 必须附验证方法。
> **与 0.10 的分工**:0.10 查 **diff 内**与声称意图无关的改动(它们是本次的改动,只是没有意图授权);本节查 **diff 之外**被顺带读到的既有缺陷。两者合起来才覆盖完整的"范围"维度——**只做 0.10 会把历史债漏成"本次问题"**。
>
> **细则见 [reference.md](reference.md) 第十二节**:blame 的用法与局限、四类典型误判(甩锅 / 过度归因 / 拿不准归历史 / 只做 diff 内审计)与完整示例。
> **🧪 测试验证标记**(跨维度,审查过程中随时标记):对以下场景静态分析无法完全收敛时,标记 `🧪 建议测试验证` 并记录原因,汇总到§1.4「待验证项」供阶段 8 处理:
> - 0.9 数据流守恒:命中 `[需运行验证]` 的项
> - 0.7/0.8 条件路径/执行场景:并发/异步逻辑、复杂状态转换无法静态验证
> - 维度 2 Bug 风险:跨模块副作用链无法静态追踪
> - 维度 5 性能:性能敏感路径需运行时验证
>
> **不确认就跑**:以上场景是"标记点"而非"死磕点"——静态分析尝试收敛,但 2~3 轮推演仍无法确认时,**停止静态下钻**,直接标记 `🧪 建议测试验证` 并继续主线审查;确定性证据由阶段 8 跑一遍临时测试获得,禁止在静态层无限推演。
### 📊 阶段 6:输出 Review 报告
> 快速模式:不使用本模板,仅列出发现的问题 + 一行维度状态(示例见 [examples.md](examples.md) 场景 9)。
**整体评分映射规则**:整体评分 = 七维度得分均值映射——9.5~10 → A+;8.5~9.4 → A;7~8.4 → B;5.5~6.9 → C;4~5.4 → D;<4 → F。**存在未修复的阻塞项(🟥/🟧 且 🔴)时整体评分最高为 C**。覆盖表全为 `➖` 的维度标 `N/A 未评`、**不计入均值**(见报告开头的「检查覆盖」行)。
**报告结构:过程在前、结论在后,不设附录**
| 位置 | 放什么 |
|---|---|
| 审查上下文 | 变更范围 / 模式与需求 / 检查覆盖汇总 / 既有缺陷数——一眼看清"审的是什么" |
| **一 · 审查过程** | 1.1 我对意图的理解(判定的前提)→ 1.2 问题推演 → 1.3 既有缺陷 → 1.4 待验证项 |
| **二 · 结论** | 2.1 合入结论 → 2.2 质量评分 → 2.3 需要你拍板 → 2.4 亮点 |
> **为什么过程在前**:读者要能顺着"我理解的意图 → 查了什么 → 发现了什么"自己复核结论;结论放在末尾作为收束。
>
> **为什么不再设附录**:附录会把过程与结论割裂,读者来回翻页才能对上号;推演(依据 / 实际行为 / 链路 / 片段)已并入每条问题块,不再单独成区。
>
> **分层判据**(内容放哪):**说明"为什么这么判"的** → §1.2 对应问题块;**说明"审的是什么、能不能合"的** → 审查上下文与 §2。典型误放:把推演塞进结论区(结论区只下判断,不重述推理)。
**编号规则**:全报告问题统一用 `QN`,**只在 §1.2 定义一次**;§1.2 / §1.3、阶段 9 台账、challenger 输入等任何位置引用时**只写 `QN`,不重复描述**。语义声明编号 `A*` / `S*` 只用于阶段 4 建档与§1.2「依据」字段的引用,**不作为问题编号、不单独占表**。
**唯一清单**:一条问题只出现在§1.2(或 §1.3,按归属决定)。禁止在正文另起"严重问题 / 建议改进 / 行动项"分区重复列出。
**表格使用边界**:状态 / 评分 / 覆盖结论这类**短单元格矩阵**用表格(审查上下文、§1.1、§2.2);含大段描述、多跳因果的内容(问题描述、数据守恒分析、既有缺陷说明)用**分条块**(见 §1.2 格式)。**单元格文字超过 40 字时一律改分条**——长文本在表格里会被挤成竖排,完全不可读。
标准模式及以上严格按以下模板输出:
---
## 📋 Code Review · `<一句话:这次改了什么>`
## 审查上下文
| 项 | 值 |
|---|---|
| **变更** | `3 文件 +86 −12` · `<文件列表>`(无 git 上下文标 `[无提交上下文]`) |
| **模式 / 需求** | `标准 / 深度` · `REQ-NNN` / `未关联` · `commit hash` |
| **检查覆盖** | `12 条(✅8 / ❌1 / ⚠️1 / ➖2)` · 未覆盖维度:无 |
| **既有缺陷** | `2 项(Q6 Q7,非本次范围)` |
---
## 一 · 审查过程
### 1.1 我的理解(后面所有判定的前提,有误请直接指出)
- **业务目标**:`<一句话>`
- **系统位置**:`<上游> → <变更点> → <下游>`(链路涉及 **≥2 个消费方 / 跨模块** 时改用 🕸 文字树,语法同阶段 3;单链一行图即可——与 §1.2 判据同源,不在这里写一段散文)
- **整体成功判据**:`<必须保持不变的整体行为>`(0.6 纵向校验与 0.9 数据守恒的回扣基准)
| 位置 | 我以为它要做什么 | 置信度 | 状态 |
|------|-----------------|--------|------|
| `<文件:函数()>` | `<推测意图>` | 🟢/🟡/🔴 | ✅ 已确认 / ⚠️ 已修正 / ⏩ 未确认 |
**修正记录**(如有):`<函数名>`:原推测 `<原推测>` → 用户修正 `<修正>`
> **联动**:置信度 🔴 的意图,依赖它判断的结论(语义一致性 / 范围 / 架构职责)最高只能给 `⚠️`;与意图无关的检查(注入 / 凭据 / 序列化)不受影响。
### 1.2 问题(推演 + 清单合一,按 `QN` 索引,全报告只在此处描述)
> 每条一个问题块,**不用表格**。判定依据、因果链路、修复方向都在这一块里写完,结论区不再重复。
#### `Q1` · 🟧 本次激活 · 🔴
- **位置**:`<file:line>`(多处用顿号连接)
- **问题**:`<现象 + 直接原因,2~3 句说清>`
- **业务后果**:`<带缺陷合入后用户/业务会遇到什么>`
- **依据**:`<语义原文 / 需求 AC-N / diff 特征>`
- **链路**(**必给**,判据见下方「🕸 链路树必给判据」;语法同阶段 3 的 🕸 影响链,SSOT 见 `performance-analysis/reference.md` 9.4.3——`▼` 主链、`├─`/`└─` 分支、节点 ≤15、层级 ≤4):
```text
{触发点 · file:line}
▼
{关键一跳 · file:line} ← 缺口 / 异常在此
▼
{中间环节}(有分支时展开:├─ {路径 A} / └─ {路径 B})
▼
{最终现象:用户 / 业务看到什么}
```
- **片段**(需要指认具体写法时):`<关键代码 1~3 行>`
- **修复方向**:`<一句话方向;存在双方案时给 ① / ②>`
#### `Q2` · ❓ 待确认 · 🟡
- **位置**:`<file:line>`
- **问题**:`<...>`
- **业务后果**:若属本次则 `<后果>`,否则无
- **依据**:`<...>`
- **链路**(**必给**,同 Q1 判据;豁免才可省):`<命中判据 → 给同 Q1 的 text 树;豁免 → 写一行 A → B 并注明"单点封闭">`
- **修复方向**:`<方向>`(归属待定,见 §2.3)
**🕸 链路树必给判据**(命中任一即必给;`Q1`~`QN` 与 §1.3 同等适用,不因严重度低而省略):
| # | 命中条件 | 典型信号(出现这些就说明不是一跳) |
|---|----------|-----------------------------------|
| 1 | **多跳因果**(≥2 跳 / ≥2 个中间环节) | "A 覆写 B,B 又被 C 消费" |
| 2 | **多路径 / 多调用方 / 多消费方** | "两条链路失效机理不同"、"另一分支不受影响" |
| 3 | **状态流转** | 成功 → 失败 → 重试 → 回滚 / 保留旧值 / 缓存命中 / 幂等 |
| 4 | **跨模块 / 跨层** | 前端 → API → service → DB;A 模块 → B 模块;消费方在仓库外 |
| 5 | **时序 / 异步 / 并发 / 事件回调** | 竞态、双重提交、回调晚到、跨请求共享状态 |
| 6 | **归属 🟧 本次激活** | 必须先画「本次改动 → 新执行条件 → 旧缺陷被触发 → 现象」,否则"激活"只是断言 |
| 7 | **问题本身是两处逻辑互相抵消 / 双轨对比** | "一处兜底、另一处放行"、"注释说保留、代码已丢弃" |
**唯一豁免**:**单点封闭 + 因果一跳**(命名 / 注释 / 格式 / 魔法数 / 单行越界),且「问题」字段里已用一行 `A → B` 写清因果。豁免**只免画树、不免因果**——仍不得只写现象就下判断。**拿不准是否豁免时,一律画树。**
> **为什么是硬要求**:报告的用途是让用户顺着因果自己复核结论。只给"现象 + 后果",用户只能选择信或不信;给了树,他能在第 3 个节点上直接反驳你。**省略链路不是排版自由,是抽掉了可复核性。**
> **收录范围**:收 🟥 / 🟧 / ❓ 三类(都需要本次处置:修、或拍板定性);**⬜ 既有只进 §1.3**。`QN` 全局唯一,与 §1.3 连续共用编号。
>
> **归属图例**:🟥 本次引入(diff 新增或修改)|🟧 本次激活(旧代码被新路径 / 新参数 / 新时序触发,**按本次处理**)|⬜ 既有(与本次无因果,不阻塞)|❓ 待确认(须给验证方法,**不得默认按既有**)
>
> **阻塞判定**:`阻塞 = 归属 ∈ {🟥, 🟧} 且 严重度 = 🔴`。既有缺陷**无论多严重都不阻塞本次合入**,移入 §1.3。
### 1.3 既有缺陷(非本次范围)
> 与 §1.2 同样的块格式(含「链路树必给判据」——判"是否高危既有"本就要看因果链),编号连续共用。
#### `Q6` · ⬜ 既有 · 🟡
- **位置**:`file:120`
- **问题**:`<现象 + 直接原因>`
- **引入版本**:`2023-08 · abc1234`(`git blame` 所得;不可判定时写明原因)
- **建议**:另开任务 / 后续优化 / `🔴 高危既有 · 建议立即跟进`
> 高危既有(安全 / 数据不可逆)在 §2.3 请用户拍板是否本次一并修;其余不阻塞、**不进阶段 9 台账**(避免修复范围膨胀)。
### 1.4 待验证项(供阶段 8)
- `T1` · 0.9 数据流 · `<验证内容>` · 原因:`<静态无法收敛的原因>`
- `T2` · 0.8 执行场景 · `<并发 / 异步场景>` · 原因:`<...>`
> 无则写「无」。快速模式不使用本模板,改为在文末提示「建议手动接力 debug / e2e-testing 验证」。
---
## 二 · 结论
### 2.1 合入结论
**⚠️ 修复 `Q1` 后可合入**(✅ 可直接合入 / ❌ 建议拒绝)
阻塞项:`Q1`(🟥/🟧 且 🔴)|既有缺陷:2 项(不阻塞,见 §1.3)|理由:`<一句话,回扣整体成功判据>`
### 2.2 质量评分
| 维度 | 评分 | 状态 | 依据 |
|------|------|------|------|
| 🔑 语义一致性 | X/10 | ✅/⚠️/❌ | `<Q1 / 一句话 / 未触及>` |
| ⚠️ 安全性 | X/10 | ✅/⚠️/❌ | |
| 🐛 Bug 风险 | X/10 | ✅/⚠️/❌ | |
| 📐 代码规范 | X/10 | ✅/⚠️/❌ | |
| 🏗️ 架构设计 | X/10 | ✅/⚠️/❌ | |
| ⚡ 性能 | X/10 | ✅/⚠️/❌ | |
| 🧪 测试覆盖 | X/10 | ✅/⚠️/❌ | |
> 整体评分 = 七维度均值(映射规则见阶段 6 开头);`N/A` 维度不参与均值;**依据列写人话**(`Q1 数据口径未同步`),不要写 `B3` 这类内部编号。
### 2.3 需要你拍板
> 分条块,不用表格。每条写清「背景 / 为什么要你定 / 选项」。
#### `D1` · 是否拆成两个提交
- **背景**:本次混了两条意图(`<意图 A>` + `<意图 B>`),后者正是 `Q1` 的来源
- **为什么要你定**:拆与不拆影响回滚粒度,AI 不替你决定
- **选项**:拆分 / 保持
#### `D2` · `Q6`(⬜ 既有,见 §1.3)是否本次一并修
- **背景**:`<该既有缺陷与本次改动的交互>`
- **选项**:本次一并修 / 另开任务 / 不修
> 无拍板项时写「无」。编号 `D*` 与问题编号 `Q*` 区分;其他形态(待生效台账结账、口径取舍、是否接受某风险)按同格式追加,**每条都要写「为什么要你定」**。
### 2.4 亮点
`<一句话一条,没有则写"无">`
---
### 🧨 阶段 7:无阻塞项自动质疑(challenger 接力)
**核心逻辑**:存在阻塞项时用户反正要先修复,challenger 此时介入是浪费;恰恰是"全绿通过"的结论最需要对抗式二次验证,防止评审自身盲区放行问题代码。
**触发条件**(须同时满足,缺一不触发):
| # | 条件 | 说明 |
|---|------|------|
| 1 | 合入结论为 ✅ 可直接合入 | 阻塞项 = **归属 🟥 / 🟧 且 🔴**(见阶段 5 归属判定);🟡 建议改进、⬜ 既有缺陷、❓ 待确认、🟢 亮点、优化/建议类意见均**不算**阻塞项 |
| 2 | 标准模式及以上(≥ 6 行) | ⚡ 快速模式不自动触发,仅在输出末尾提示一行「如需二次质疑可手动触发 challenger」 |
| 3 | 本会话未对同一变更执行过 challenger | 同一变更 = **diff 内容未变**;修复阻塞项后重新 review 时 diff 已变化,视为新变更、去重不适用;本次 review 由 auto-review / writing-pipeline 等链路带起且 challenger 已对当前 diff 执行 → 跳过,避免重复质疑 |
| 4 | 用户未声明跳过 | 用户明确说"不用质疑"、"跳过 challenger"时不触发 |
**执行方式**:
1. 触发前向用户声明一行:「Review 未发现阻塞项,自动发起 challenger 二次质疑」
2. 调用 `challenger` skill(代码变更模式),作为调用方传入上下文:本次 diff、阶段 3 权威语义与全局图景、**阶段 6 报告全文**(§1.1 意图理解、§1.2 逐条推演)——**不可只传正文摘要**,否则质疑会失去推演依据、退化为"看结论挑刺";输出路径指定为 `review/challenge-report.md`(未启用需求管理时在对话中反馈)
**结论回写**(保持两份报告结论一致):
| challenger 质疑结果 | 处理 |
|---------------------|------|
| 质疑成立且为阻塞级(🔴 高风险) | 更新合入结论为 ⚠️ 修复后可合入 / ❌ 建议拒绝,并在报告总结中追加「质疑推翻记录」(质疑点 + 原结论 + 新结论) |
| 质疑不成立,或仅 🟡/🟢 | 维持 ✅ 结论,质疑点并入 §1.2 的 🟡 项或 §2.3 拍板 |
> 存在阻塞项(合入结论非 ✅)时本阶段静默跳过;待修复后重新 review 通过,再按本阶段条件判定。
>
> **降级策略**:challenger 不可用或执行失败 → 不阻塞交付,维持原合入结论,在报告末尾标注「⚠️ 自动质疑未执行(原因),建议手动触发 challenger」;禁止静默跳过不标注。
---
### 🧪 阶段 8:测试验证(条件触发)
> **定位**:review 完成后的动态验证补充。除本阶段外的各阶段以静态审查为主(约束 #15),本阶段是唯一的动态验证例外——承接审查中标记的不确定项(约束 #21:不确认就跑),对§1.4「待验证项」中的项创建并执行临时测试,验证数据流连通性与复杂逻辑正确性。详细检查清单与测试模式见 [reference.md](reference.md) 第十节。
**触发判定**(阶段 7 完成或跳过后执行;存在阻塞项时静默跳过,待修复后重新 review 通过再触发):
| # | 条件 | 动作 |
|---|------|------|
| 1 | §1.4「待验证项」有内容 | AI 自动触发 |
| 2 | 无显式建议项,但 AI 评估认为动态验证有价值 | 提示用户:「建议进行测试验证,原因:{...}」,用户确认后触发 |
| 3 | 无建议项且 AI 评估无需验证 | 跳过 |
> 快速模式(≤5 行)跳过本阶段;快速模式报告不套用完整模板(无 A3 测试验证建议),标有 `🧪 建议测试验证` 的项改为在问题清单末尾提示「建议手动接力 debug / e2e-testing 验证」。
**环境前置检查**(执行前必做):
检测运行时依赖可用性(DB 连接、消息队列可达性、API 可达性等)。不可用时降级为标注 `[环境不可用,建议接力 debug/e2e-testing]`,不创建无法执行的测试脚本。
**执行流程**:
#### 步骤 A:确定存储位置
按优先级确定临时测试的存储目录:
| 优先级 | 条件 | 存储路径 |
|--------|------|----------|
| 1 | 有对应专家团(阶段 2 命中) | `{专家目录}/test/` |
| 2 | 无专家,有需求(阶段 2.4 命中 req) | `{需求目录}/test/` |
| 3 | 两者都没有 | `.codebuddy/review/data-flow-test/` |
> 存储路径避免使用 `.test/` 或 `test/`,防止被 pytest 等测试框架自动发现并误执行。
#### 步骤 B:创建临时测试
为每个验证项创建测试脚本:
- **测试目标**:在数据流入口/逻辑入口注入测试数据 → 在消费层/输出层断言数据是否抵达(连通性)+ 数据内容是否正确(正确性)
- **测试性质**:code-review 临时测试,不进项目正式测试套件
- **文件命名**:`data-flow-test-{验证项标识}-{时间戳}.{ext}`
#### 步骤 C:单元测试交互
对每个验证项,检查是否存在覆盖该数据流/逻辑的单元测试:
```
检查是否存在覆盖该数据流/逻辑的单元测试
├── 有单元测试
│ ├── 先执行现有单元测试
│ │ ├── 通过 → 补充覆盖新增数据流/逻辑的单元测试
│ │ └── 不通过 → 判断是否可低成本修复
│ │ ├── 可修复 → 修复后执行 → 通过 → 补充单元测试
│ │ └── 不可修复 → 记录问题(步骤 D)
│ └── 执行临时连通性测试
└── 无单元测试
└── 仅执行临时连通性测试,不补充单元测试
```
> **"低成本修复"判定**:修改量 ≤ 10 行、不涉及测试框架迁移。**禁止修改现有断言语义**——只允许修复 setup/teardown、fixture 数据、import 路径等非断言部分;断言语义错误视为"不可低成本修复"。
#### 步骤 D:记录失败(单元测试失败且无法低成本修复时)
| 记录目标 | 记录内容 | 工具/方式 |
|----------|----------|-----------|
| 专家团(如有) | 在专家 test 目录下记录单测失败信息、原因分析 | 文件写入 `{专家目录}/test/known-failures.md` |
| 需求目录(如有) | 在需求 test 目录下记录单测失败信息 | `req update --docs add test/known-failures.md,test` |
| 项目记忆 | 一行事实:模块 X 单测 Y 存在已知失败 | `update_memory` |
#### 步骤 E:测试结果回写
测试验证结果**追加到报告末尾的「阶段 8 测试验证结果」section**,不修改阶段 6 已输出的内容。
| 临时测试结果 | 报告结论更新 |
|-------------|-------------|
| 通过 | 对应验证项标注 ✅(动态确认连通且正确) |
| 失败 | 对应验证项标注 ❌(动态确认断链/数据错误),按影响面定严重度,**写入 §1.2 问题块并补齐归属与业务后果**(归属按阶段 5 判定,不得默认 🟥) |
| 无法执行 | 维持原标注,追加 `[动态验证执行失败:{原因}]` |
> **同步清单**:回写时更新 §1.2——修复项标记结论与证据;新发现补成新 `QN`(含归属与业务后果);必要时同步更新内部覆盖表。阶段 8 新增的 ❌ 若构成阻塞项,同时影响 §2.1 合入结论与阶段 9 的建档判据。
#### 步骤 F:清理策略
- 默认保留临时测试(作为审查证据,报告中标注路径)
- 用户可显式要求清理;清理时同步删除存储目录下的临时测试文件
---
### 📒 阶段 9:修复台账交接(条件触发)
**定位**:review 的出口。报告出完、结论已定,若修复工作**超过一次对话能完成**,把「修什么 + 怎么算修完」交 `plan-track` 建档,避免阻塞项随对话上下文丢失。**报告始终是唯一事实源,plan 只存指针与状态**——禁止把报告内容复制进 plan(复制即双源,必然漂移)。
**判据**(全部可观测,对齐 `plan-track` 规则的场景识别):
- 必要条件:存在阻塞项(🟥/🟧 且 🔴)
- 且满足任一:
| 条件 | 可观测判据 |
|------|-----------|
| 修复面大 | 涉及 ≥3 个文件 |
| 跨模块 | 涉及 ≥2 个模块 / 服务 |
| 多阶段 | 修复需 ≥3 个可分离步骤(改码 → 改 schema → 回归等) |
| 用户要延后 | 说"稍后修 / 下次继续 / 先记下来" |
| 用户显式要求 | "建个计划" |
**明确不建**:无阻塞项(全绿);仅 1 项且单文件小改(`plan-track` 规则已明确排除);快速模式。
> **判据按预估**:文件数 / 模块数是**出报告时的估计**(修复尚未发生)。修着修着发现面变大 / 变小,允许事后补建或合并档案,不因预估偏差追责;但**不许"一边修一边不更新台账"**。
**执行**:
1. 调用 `use_skill("plan-track")` 建档,输入按下表取(**只传指针,不复制分析**):
| plan 字段 | 取什么 |
|-----------|--------|
| 目标 / 完成判据 | 报告的「合入结论」;判据 = §1.2 阻塞项(🟥/🟧 且 🔴)逐条清零 |
| 工作项 | 报告 **§1.2 阻塞项**(归属 🟥/🟧 且 🔴)按条记录,每条只写 `QN` + 短标题,正文引 `review/code-review.md` 的 `QN`;**既有缺陷(§1.3)不建工作项**——那是另开的任务,不是本次范围 |
| 注意事项(护栏) | 从「搭车变更审计」「0.9 数据流守恒」的结论提炼(如"不得为过 review 而放宽断言语义") |
| checklist 增补组 | **§1.2 阻塞项与 §1.4 待验证项**,逐条转成可判定问法(转写,不复制证据) |
| related | 报告路径 + 需求 ID(如有) |
> **报告未落盘时**(项目未启用需求管理,报告只存在于对话):工作项引用改写为「本次会话 code-review 报告 `QN`」,`related` 注明「报告未落盘,结论以会话为准」,并提示用户**先把报告落盘再跨会话续做**——否则 plan 里的指针指向不存在的东西。
> **跨会话可发现**:建档后在 `AGENTS.md` 加**一行指针**(写 `.plans/{目录}` 有阻塞项修复待续 + 下次从哪继续,**不复制条目内容**)——对齐阶段 2.3 对待生效台账的做法。没有这行指针,`.plans/` 只有在用户主动说"继续"时才会被读到,跨会话续做实际不成立。
> **建档 ≠ 闭环**:`.plans/` 里出现工作项只代表"待修已记录";**§1.2 的阻塞项全部转 ✅ 才算闭环**。报告中禁止把"已建档"表述为"已处理"。
2. **复检回填**:修复完成后回到本报告,按 §1.2 阻塞项与 §1.4 待验证项逐项复检 → 报告追加「复检记录」节(原 ❌ → ✅ + 证据;仍 ❌ → 写明原因)→ plan 工作项改状态、checklist 回填。**不重跑整轮 review**。
3. **降级**:`plan-track` 未安装 / 调用失败 → 报告末尾给一行建议(写明判据:阻塞项数、文件数),不阻塞交付。
**与阶段 7 / 8 的关系**:阶段 7(全绿质疑)只在无阻塞项时触发;有阻塞项时 7/8 静默跳过,直接到本阶段。三者的共同前提相同——**报告必须先完整输出**,不得把未完成的判断甩给下游。
---
### 🚶 阶段 9.5:前端走查接力(条件触发)
**定位**:review 是静态判断,回答"改得对不对";它不知道"用户点下去会怎样"。改动落在前端运行时路径上时,把 diff 翻译成**交接单**交 `frontend-walkthrough` 做**定向走查**——只走改动面,按改动性质裁维度。**与阶段 9 互斥**:有阻塞项走 9(先修),无阻塞项才走本阶段(再验)。
**触发三重门(全满足才触发)**:
| 门 | 判据 | 反例(不触发) |
|---|---|---|
| ① 前端产物 | diff 含 `*.vue` / `*.tsx` / `*.jsx` / `*.svelte` / `*.css` / `*.scss` / `*.less` / `*.html` | 纯后端、纯 SQL、纯文档、构建配置、CI 脚本 |
| ② 落在可运行路径 | 改动的组件 / 页面被路由或父组件引用 | 死代码、仅 Storybook 可见、仅单测引用 |
| ③ 用户可感知 | 改变用户看到的输出或能做的操作 | 注释、类型声明(`.d.ts`)、等价重构、mock 数据、测试文件 |
> **后缀只做初筛**:`.ts` 可能是 BFF / 工具脚本;`.css` 可能是全站 token——**token 改动反而必须走查布局**。判不准时按第 ③ 门定。
**门控(与阶段 7 同构)**:
- 存在阻塞项 → **不触发**(先修再查,走查一个确定要改的版本是浪费)
- 同一 diff 本会话已走过 → 不重复(diff 变化视为新变更)
- 用户声明跳过("不用走查""跳过前端验证")→ 不触发
- 快速模式 → 只在文末提示一行,不自动触发
**档位门控(review 常在无运行环境时执行)**:
| 走查档位 | 处理 |
|---|---|
| **A 可实操** | 自动执行定向走查 |
| **B 半实操** | 交用户按交接单的「必点路径」自查,回传截图后补 `🟢`;用户给预览链接时可做有限实操 |
| **C 纯静态** | **不启用**,报告末尾一行:「本次无运行环境,走查将退化为代码直读(与 review 重复),已跳过」——比跑一遍降级走查诚实 |
> **档位怎么定**:由交接单的「环境与副作用」判定——**拿不到可用服务地址 / 测试账号就按 C 档**,不要假设"用户可能有环境"。review 不负责探环境(那是走查阶段 0 的事),只负责如实传递;宁可按 C 档跳过,也不要把静态结论包装成"已验证"。
> **C 档不是"走查没用"**:走查在 C 档仍能出族 6/10 的写法缺口(🟢)与时序假设(🟡),但那与本次 review 的静态审查高度重叠、且结论不进合入判断。所以默认不启用;**用户明确要求"静态推演一遍"时才手动触发**,此时结论全为 🟡、不参与合入结论。
**交接单(必填,缺一不交接)**:
| 字段 | 取值来源 |
|---|---|
| 改动性质 | 纯交互逻辑 / 纯样式取值 / 布局结构 / 数据请求 / 权限 / 路由 / 文案(多选,取主性质) |
| 涉及页面与路由 | 从 diff 反查;有 `.fe-index/` 时用 `apis/*.md` 反查页面 |
| 改动入口 | 相关组件 / 函数 / 事件(`file:line`) |
| 受影响功能面(可选) | 能给就给(调用方 / 数据消费方 / 共享能力 / 页面入口四类),**填功能名不填函数名**;与「必点路径」分工:这里是**功能面**、那里是**操作步骤**;**给不出就留空**,由走查侧阶段 0.5 自建——不为了填满而猜 |
| UI 参考库版本(可选) | 项目有 `ui-tools/design-reference/` 时填 `meta.json.version`;无则留空,由走查侧按通用基线处理 |
| 涉及组件(可选) | 本次改动涉及的参考库组件名(如 `button, input, table`);无参考库/给不出就留空,不为填满而猜 |
| 必点路径 | 优先由 0.7 条件路径、0.9 数据流、0.10 搭车变更的结论转写(如"详情未返回时点保存""筛选连点 ×3");**0.7/0.9 全绿无结论时按 `frontend-walkthrough/references/09-targeted.md` 第三节从 diff 反推**,不许留空 |
| 明确跳过的维度 | 如"布局 / 视觉设计合理性",并写理由(本次 diff 未触及结构、样式、断点、显隐) |
| review 已覆盖 | 阶段 5「界面类改动的额外检查」已核对实现与已确认布局图 → 走查不重复核对设计意图,只看运行时破版 |
| 环境与副作用 | 服务地址 / 测试账号 / 数据准备(空列表、大数据量、超长文本是否需要构造)/ 允许的写操作(无环境即走 C 档) |
**回写**:走查报告出现**阻塞级**发现(写坏数据 / 越权可见 / 关键流程不可用)→ 追加到本报告 §1.2,**编号用 `QW*`**(同属 Q 系列,以 W 标来源「走查」,与 `QN` 不混用),**归属必标**(🟥 / 🟧 / ⬜ / ❓,见阶段 5)——否则违反约束 5(编号统一)与 25(归属必标);同时改写 §2.1 合入结论并附走查报告指针(对齐约束 19 的质疑回写)。**非阻塞发现**只追加「走查补充」一节,**不改评分**。两份报告结论不一致时以**更保守**者为准,**禁止并行两个合入结论**。
**降级**:`frontend-walkthrough` 未安装 / 调用失败 → 报告末尾给一行建议 + 交接单内容,不阻塞交付。
> **与阶段 8 的分工**:阶段 8 验"数据流是否连通、逻辑是否按断言成立"(代码级);阶段 9.5 验"用户操作路径上的可见结果"(交互级)。两者不互相替代,可能都触发。
---
## 约束与原则
1. **语义优先**:先确保"做对了东西",再确保"把东西做对",语义不一致的问题永远最优先
2. **精准定位 + 建设性修复**:§1 每条问题必须给精确位置(`file:line`)与可执行的修复方向;需要指认具体写法时,代码片段写进 §1.2 问题块的「片段」项;语义不一致时必须推演正确实现方向与替代方案
3. **语言与版本自适应**:重点审查当前语言专属陷阱、惯用法与版本约束,不将合法语法误报为错误;不确定的语言特性/标准库行为/已知漏洞可查官方文档验证
4. **变更聚焦 + 归属必标**:Review 范围仍以本次变更为中心(未修改代码只在能判定本次影响、或有直接安全风险时才展开);**一旦提及就必须标归属**(🟥 / 🟧 / ⬜ / ❓,见阶段 5「问题归属判定」),既有缺陷进 §1.3、不阻塞本次合入——不得因"顺带看到"把历史债塞进本次阻塞项,也不得因此把真问题甩成既有
5. **语义溯源**:每条问题用统一编号 `QN`(只在 §1.2 定义一次),并在 §1.2 的「依据」字段引用语义声明编号(`A*` / `S*`);其他位置引用问题只写 `QN`,不重复描述
6. **范围自适应**:按变更规模选择快速/标准/深度模式;快速模式跳过专家查询、强关联查询、待生效变更台账、需求上下文感知、检查覆盖表(阶段 4.5)、意图确认交互、并行派发和修复台账交接(阶段 9)
7. **提交门禁**:先审查提交本身是否合格(粒度、敏感文件、message 质量),再审查代码内容;无 git 上下文时跳过提交审查并标注
8. **质疑被调对象**:语义不一致的根源在"选错下游抽象"时,建议必须包含"更换被调对象 / 新建合适抽象"的方向,不得仅停留于在原对象上叠参数
9. **完整语义影响面**:任何局部修改都必须做纵向(0.6 整体语义)+ 横向(0.7 路径语义)+ 场景(0.8)+ 数据(0.9 数据流守恒)四重校验,防止"局部正确、整体失真"、"此路径正确、彼路径失真"或"代码正确、数据悄悄变少";搭车变更经 0.10 立案后同样逐条适用本条,不走另一套标准
10. **AI 语义理解透明化**:所有 Review 输出必须显式呈现"AI 自己理解到的语义"及其置信度,禁止把隐式理解当作客观事实;低置信度理解必须提示用户核实,不得作为后续判断的隐含前提;新增注释可信度默认低,与代码行为不一致时以代码为准
11. **方案鲁棒性权衡**:存在"更简单但鲁棒性更好"的替代方案时,必须同时呈现精确方案与鲁棒方案,基于可见性/关联代码变动风险/调用方精确性需求给出推荐;禁止默认"精确即最优"
12. **专家资产按需加载**:仅标准模式及以上查询专家团;查不到不阻塞;代码实际行为永远最权威
13. **并行纪律**:语义一致性(0)与架构(4)必须主 agent 波次2串行执行,禁止派发子 agent;子 agent 只审查分配维度、消费共享上下文、跨维度问题标注线索不自行处理;`task-dispatch` 不可用时降级全串行
14. **中文输出**:所有 Review 意见用中文表达,代码注释可用英文
15. **静态为主、测试验证为辅**:除阶段 8 外的各阶段(含 4.5 覆盖表、9 台账交接)以静态审查为主,不运行完整项目测试或性能测试;**例外**:阶段 8 对§1.4「待验证项」的项创建并执行轻量临时测试,验证数据流连通性与复杂逻辑正确性(不替代正式测试套件);环境不可用时降级为标注建议;快速模式跳过阶段 8,标注 `[需运行验证]` 并建议接力 debug / e2e-testing(与阶段 6 / 阶段 8 的接力清单保持一致)
16. **全局图景先行**:审查前先建立全局图景(业务目标/系统位置/整体成功判据,见阶段 3 步骤 A),0.6 纵向校验与最终结论必须回扣该图景;局部正确但破坏整体成功判据 → 阻塞项,不得因局部正确而放行
17. **搭车变更正确性先行**:与声称意图无关的顺手优化/清理(0.10)不因"只是小改动"降低审查强度——它没有意图授权,反而要更严。判定分两段:先审正确性——不正确 → 阻断提交,修复或回退,"拆分独立提交"不能替代修复;正确性无法证明(围栏 ❓ 且无其他证据)→ 要求补证或回退,不得仅以拆分放行;已证正确 → 才建议拆分独立提交单独评审,保持变更原子性
18. **需求上下文懒加载**:`req list` 仅作轻量感知(只看最新需求的名称清单,不读文档);看完代码后按名称匹配、命中才读对应需求文档;用户已指明需求则直接读取该需求;`req` 不可用或未命中均不阻塞审查
19. **全绿须质疑后放行**:标准模式及以上、合入结论为 ✅ 且本会话未对同一变更执行过 challenger 时,自动接力 challenger 二次质疑(阶段 7);快速模式仅提示不自动触发;用户声明跳过则不触发;质疑成立的阻塞级问题必须回写合入结论,禁止 review 报告与质疑报告结论不一致
20. **测试验证条件触发**:阶段 7 完成或跳过后,§1.4「待验证项」有内容时 AI 自动触发阶段 8;无显式建议但 AI 评估有价值时提示用户确认后触发;存在阻塞项时静默跳过;快速模式跳过阶段 8 仅提示;阶段 8 发现的问题回写报告,与报告既有结论(阶段 0~7)及阶段 9 的建档判据保持一致
21. **不确认就跑(防静态死磕)**:审查中遇到复杂逻辑/不确定逻辑,静态推演 2~3 轮仍无法收敛时,停止下钻,标记 `🧪 建议测试验证` 并继续主线;禁止在静态层无限推演(死磕)——确定性证据由阶段 8 跑一遍临时测试获得,推演成本 > 验证成本时优先移交验证
22. **影响面分工(与 code-change-impact 并列)**:本 skill 的 0.6~0.9 影响面推理**服务于发现问题**,是抽样审查;需要**穷举影响面清单 + 回归风险背书**时转 `code-change-impact`——它答"会牵连谁",本 skill 答"改得对不对"。转交时把已识别的影响点作为输入,避免它重复推导;反向由它转来时,聚焦评审其清单中的质量问题,不重算影响面
23. **覆盖表可审计**(A):标准模式及以上必须由阶段 4.5 派生本次检查覆盖表并在阶段 5 逐项回填(**内部记录**);**报告只输出一行汇总**(含 `➖` 计数与未覆盖维度),完整表不输出;`✅` 必须附**可复核的最小证据**(位置 + 一句话说明该处证明了什么),只有路径无说明的按 `⚠️` 处理;某维度在覆盖表中全为 `➖`/`⚠️` 时该维度评分不得 ≥ 9 分。快速模式不启用,保持零开销
24. **台账只存指针**(B):阶段 9 仅在存在阻塞项 **且**命中规模 / 跨模块 / 多阶段 / 用户要求时转 `plan-track`;plan 的工作项与 checklist 只引报告编号与覆盖表项,**不复制报告分析内容**;无阻塞项、单文件小改、快速模式一律不建档
25. **归属决定阻塞**:每条问题必须标归属(🟥 本次引入 / 🟧 本次激活 / ⬜ 既有 / ❓ 待确认);`阻塞 = 归属 ∈ {🟥, 🟧} 且 🔴`——**既有缺陷无论多严重都不阻塞本次合入**、不进阶段 9 台账(另开任务);`❓` 不得默认按既有处理,必须给验证方法;`🟧`(旧代码被本次改动激活)**必须按本次处理**,不得以"代码是旧的"甩锅
26. **过程在前、结论在后**:报告顺序为「审查上下文 → 一·审查过程(意图 / 推演 / 既有缺陷 / 待验证)→ 二·结论(合入结论 / 评分 / 拍板 / 亮点)」;**不设附录**,推演并入问题块;一条问题只在 §1.2 或 §1.3 描述一次,其他位置只写 `QN`;置信度 🔴 的意图所对应检查项,结论最高 `⚠️`
27. **界面改动以确认图为基线**:涉及页面样式 / 布局的改动,审查基线是该需求**已确认的 ASCII 布局图**(阶段 5「界面类改动的额外检查」;无图时依次退到设计稿截图、验收标准中的界面描述,并注明基线来源)——有基线则逐区对照实现(结构 / 排列 / 显隐 / 断点),不一致即为问题;基线全无且代码无法判定 → 判 `⚠️ 审查基线缺失` 并列入 §2.3 需拍板项(先用 `ui-to-ascii` 按其「界面确认闸门」出图确认);不得替用户假设布局合理,也不得自行改样式 / 布局代码
28. **因果必须画出来**:§1.2 / §1.3 每条问题按阶段 6「🕸 链路树必给判据」给 `text` 链路树——命中多跳因果 / 多路径 / 状态流转 / 跨模块跨层 / 时序并发 / 🟧 本次激活 / 双轨对比任一即**必给**;唯一豁免是"单点封闭 + 因果一跳"且在「问题」字段已用 `A → B` 写清(免画树、不免因果)。**禁止只写"现象 + 后果"就下判断**——读者无法复核因果,只能选择信或不信;省略链路时须自查该条是否真满足豁免,拿不准一律画树
29. **不写空泛赞赏**:报告只设 §2.4 亮点,且每条须**具体可复核**(如"用 X 取代 Y,消除了两处竞态");**没有就写"无"**。禁止"整体质量不错""代码写得很清晰"式评语、禁止在报告开头或结尾加鼓励段落、禁止为平衡问题数硬凑亮点——夸奖不产生信息,只会稀释结论
30. **不报没有触发路径的风险**:任何风险判断必须能写出"什么条件下触发 + 证据位置";写不出触发条件的不算风险——降为 `❓ 待确认` 并给验证方法,或直接不报。**有路径但静态推演不收敛** → 标 `[需运行验证]` / `🧪 建议测试验证` 交阶段 8(这是允许的,与"无路径猜测"是两回事)
31. **不主动邀约改码**:报告只给修复方向与位置,**结尾禁止"需要我帮你改吗""要不要我直接修"这类问句**;确需落地由用户显式发起(`request-guard` → 实施),或按阶段 9 判据交 `plan-track` 建档。审查默认不改代码,也不把"改不改"变成待用户回答的悬空问题
32. **前端改动默认接力定向走查**:三重门(前端产物 / 可运行路径 / 用户可感知)全满足、无阻塞项、同一 diff 未走过、用户未声明跳过时,按阶段 9.5 交接单接 `frontend-walkthrough` 定向走查(**快速模式只提示,不自动触发**);**无运行环境(C 档)不启用**并写明理由,禁止用降级走查冒充验证;走查的阻塞级发现以 `QW*` 编号回写 §1.2 并标归属、同时改写合入结论,禁止两份报告给出并行结论
## 需求管理集成
当项目配置了 `.requirements/config` 且 `storage_path` 指向有效目录时,审查完成后自动执行:
> 审查前的需求感知与匹配已在阶段 2.4 完成(`req list` 轻量感知 → 命中才读需求文档),本节只负责审查完成后的报告写回。
1. **写入审查报告**到需求目录后注册文档关联:
```bash
req update {REQ-NNN} \
--docs add review/code-review.md,review --changelog "完成代码审查"
```
2. **阶段 7 执行过 challenger 时**,一并注册质疑报告(challenger 被调用时跳过自身集成,由本 skill 作为调用方统一注册):
```bash
req update {REQ-NNN} \
--docs add review/challenge-report.md,review --changelog "完成自动质疑审查"
```
3. **错误处理**:需求 ID 不存在 → 跳过集成,不影响审查;文件锁超时 → 自动重试 1 次,仍失败则告知用户
| 产出物 | 存储路径 | docs 类型 |
|--------|----------|-----------|
| 代码审查报告 | `review/code-review.md` | `review` |
| 自动质疑报告(阶段 7,如执行) | `review/challenge-report.md` | `review` |
| 测试验证(阶段 8,如执行且无专家团) | `test/` | `test` |
| 修复台账(阶段 9,如执行) | `.plans/{日期}-{slug}/`(由 `plan-track` 管理,**不进需求目录**,靠 `AGENTS.md` 一行指针发现) | 不注册 |
> 有专家团时测试存储在 `{专家目录}/test/`,不写入需求目录;无专家无需求时存储在 `.codebuddy/review/data-flow-test/`。
## 附加资源
- 七维度完整检查清单、语义声明表格式、语义不一致分析模板、决策树、专家资产用途映射、阶段 8 测试验证检查清单:[reference.md](reference.md)
- 检查覆盖表的裁剪规则与格式:[reference.md](reference.md) 第十一节
- 问题归属判定细则(blame 用法、四类误判、示例)与报告分层判据:[reference.md](reference.md) 第十二节
- 典型场景示例(9 个,含快速模式输出示例):[examples.md](examples.md)
Files in this skill
- SKILL.md
- examples.md
- reference.md
Attribution
Related skills
View all in code-quality →Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.