code-review
多语言代码多维度专业 Code Review:以语义一致性为核心,覆盖安全、Bug 风险、规范、架构、性能、测试覆盖,输出分级问题清单。触发:"review 这个提交"、"code review"、"检查这段代码",或提供 git diff / commit hash 时。
SKILL.mdskills/code-review/SKILL.md
GitHub🧩 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 跑一遍验证获得确定性证据
使用场景:
- 用户要求 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.5 需求上下文感知 → 阶段 3 功能意图推理
→ 阶段 4 语义提取与建档 → 阶段 5 多维度 Review → 阶段 6 输出报告 → 阶段 7 无阻塞项自动质疑 → 阶段 8 测试验证(条件触发)
🚪 阶段 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.jsfetch/顶层await、Javarecord/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 |
| "review 对 master 的 PR" | 三点 diff | git diff master...HEAD |
| "review 这个分支的改动" | 三点 diff(自动识别目标分支) | git diff <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 上下文理解
- 获取变更文件列表和 diff 内容
- 对每个变更的源代码文件,读取完整文件内容,而不只看 diff 片段
- 获取文件的依赖关系(import / use / include / module 引用等)与文件中的符号(函数、类、接口、类型等)
- 理解变更在项目中的位置、调用链上下游及其影响范围
- 必要时读取变更所在函数 / 方法 / 类 / 模块的完整上下文,确认局部修改是否改变整体职责、返回契约或副作用
🧭 阶段 2:专家资产查询(按审查深度分层触发)
触发条件:仅当变更规模 ≥ 6 行时触发(口径见阶段 5 深度自适应表)。快速模式跳过,避免过度开销。若涉及多个被修改模块,仅查询核心变更模块(最多 2 个)的专家。
查询流程:
- 从被修改的核心文件中提取模块关键词(模块路径、功能域名称、核心类名等,3-5 个)
- 调用 use_skill("expert-solution-workflow") 查询相关经验、解决方案或记忆(如业务专家资产包;查询失败或不可用 → 忽略,不阻塞审查)
- 代码索引定位(与专家互补、成本极低):
use_skill("index-lookup")—— 读.fe-index/INDEX.md匹配改动文件判该查哪端 → 后端:tables.md(表 → 模块反查)+modules/*.md(被依赖 + 事件/命令耦合);前端:apis/*.md(接口 → 页面反查)。索引给的是穷举候选影响面清单,为维度 0.9 消费方追查、维度 4 架构评审提供基线;无索引 / 路径未命中 /--check报过期 → 忽略,不阻塞审查 - 如命中专家,按审查深度分层加载:
| 审查模式 | 加载资产 | 用途 |
|---|---|---|
| 🔍 标准模式(6-50行) | C0(使用总览 + 已知坑)+ C1(能力契约) | 为阶段 3 意图推理提供参考基线;为维度 0 提供公开方法契约基准 |
| 🔬 深度模式(51-200行) | C0 + C1 + C4(数据流向与消费,如有)+ implementation/01-架构 + 02-实现 + 03-数据流转 | 额外辅助维度 4 架构评审、维度 2 深层 Bug 识别、维度 0.6 整体语义分析;C4 为维度 0.9 提供现成消费方清单,免去从零追查消费链 |
- 向用户声明:「已查询 {N} 个模块,命中 {专家名清单},加载了 {资产清单}」
各资产在具体审查阶段的用途映射详见 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-servicevs ki group关联关系/订单服务)。三种情况直接全取,不筛:① 该模块本身 ≤5 条(成本等价)② 筛不动——单模块改动、耦合方全在外部时三级筛子可能全失效,"挑 5 条"= 随机挑 5 条 ③ 省不得的场景——改动涉及对外契约 / 公共 API / 数据 schema / 权限 / 资金 / 持久化。
⚠️ ≤5 条是筛得动时的目标,不是硬配额——宁可多取几条,不可随机漏掉。
使用指导要点(code-review 特有衔接):
- 漏改风险(核心):强关联命中但 diff 中未见关联目标端改动 → 标记为高风险候选(潜在漏改),在维度 0.9(跨模块语义/数据流一致)中重点核查
- 牵动识别:强关联揭示"改数据源必须连带改消费端"这类不对称契约。若被改模块是某强关联的源端,务必检查目标端是否同步修改或需本次覆盖
- 方向不对称:改目标端(消费方)时源端通常不用改,不必误报;改源端(生产方)时目标端必须检查
- 决策记忆核对(与强关联并行):调用
use_skill("ki-memory-lookup")的决策记忆策略,同样走双路并行——A 先按分类前缀、再按决策主题与改动面的重合度筛候选(目标 ≤5 条)+ Bki_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.5:需求上下文感知(两段式懒加载)
短路规则:用户已在请求中指明关联需求(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。
🕸 影响链文字树(结构类信息的默认表达;问题清单 / 严重度 / 建议仍用表格)——影响链涉及多个调用方 / 消费方或跨模块时,用它替代"一行图":
{变更点:{文件:行号} · {一句话改了什么}}
├─ {受影响调用方 A}({影响类型:行为变化 / 数据变化 / 无影响})← 受影响
├─ {受影响消费方 B}({影响类型})
│ └─ {下游 C}({影响类型})← 待验证
└─ {未覆盖的消费方 D}({高风险:漏改})
最小语法(跨 skill 统一,4 条):① │+▼ 串联、├─ └─ 分支 / 并行(只画与本次变更相关的主链);② 节点挂数字与状态,关键节点打标记(← 受影响 / ← 待验证 / ← 高风险);③ 并行标"(取 max)"、串行标"(串行相加)";④ 只画结构类信息——问题清单、严重度分级、修复建议一律保持表格;节点 ≤15、层级 ≤4。
步骤 B:推理功能意图
关键原则:不假设原始实现正确,基于代码结构、命名、上下文推理其在真实场景中想做什么。
推理依据(按权重排序):
| 推理依据 | 权重 | 说明 |
|---|---|---|
| 函数/方法命名 | 🔴 高 | 命名往往表达设计意图,即使实现可能有 bug |
| 原有 docstring / 注释 | 🔴 高 | 原作者对功能的描述,但可能过时 |
| 新增 docstring / 注释 | 🔴 低 | 本次提交新增,可能与实际实现有偏差,需与代码行为交叉验证 |
| 输入/输出结构 | 🔴 高 | 参数类型、返回值类型暗示功能契约 |
| 调用方使用方式 | 🟡 中 | 调用方如何使用该函数,反映期望行为 |
| 所在类/模块职责 | 🟡 中 | 函数在更大上下文中的角色 |
| 需求文档(REQ) | 🔴 高(如有) | 用户确认过的书面需求与验收标准(仅当阶段 2.5 名称匹配命中时加载) |
| 业务专家 C0/C1 资产 | 🟢 中(如有) | 专家契约层描述的能力边界和方法契约(仅当阶段 2 命中专家时可用) |
| 代码逻辑结构 | 🟡 中 | 代码实际流程,但可能有 bug |
推理方法:命名推断(从函数/变量名推断意图)、契约推断(从输入/输出推断功能契约与副作用)、上下文推断(从调用方推断期望行为)、场景推断(从使用场景推断真实需求:首次部署/正常运行/异常场景)。
步骤 C:意图确认(按模式分流)
⚡ 快速模式(≤5 行):跳过用户确认交互。 AI 推测功能意图并标注置信度后直接继续,报告中标注「意图推测未经确认,如有偏差请指出」。仅当推测置信度为 🔴 低且直接影响审查结论时,才中断询问。
免确认通道(任意模式):满足以下任一条件时,跳过确认交互直接继续:
- 用户已在请求中说明了变更意图(如"我把重试改成了指数退避,帮我 review")→ 将用户描述作为权威语义
- 用户明确要求"直接 review、不用确认"或处于无人值守/流水线场景
标准模式及以上(默认):将推理结果以结构化形式呈现,请用户核对确认后再进入阶段 4:
## 🎯 被改动代码的功能意图推测
### 受影响代码 #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 第八节。
置信度判断标准:
| 置信度 | 适用场景 |
|---|---|
| 🟢 高 | 语义来源明确、原文清晰、上下文充分,AI 理解几乎不可能跑偏 |
| 🟡 中 | 语义来源存在歧义、上下文部分缺失,AI 基于推断给出理解,需用户确认 |
| 🔴 低 | 命名模糊、注释含糊或缺失关键上下文,AI 理解可能显著偏离作者意图,强烈建议用户核实 |
强制要求:新增注释默认置信度 🔴 低;低置信度的语义声明必须在报告中显式提示用户核实,禁止 AI 自行采用低置信度理解作为后续维度分析的隐含前提。
步骤 C:语义充分性评估
- 无语义的代码(无注释、无 docstring、命名模糊)→ 标记 ⚠️ 待确认
- 语义模糊(注释与命名矛盾、docstring 过时)→ 标记 ⚠️ 需澄清
- 语义缺失(新增公开函数无 docstring / 接口说明)→ 标记 ❌ 必须补充
- 只有局部变更语义,缺失所在方法 / 模块的整体语义 → 标记 ❌ 语义上下文不完整
🧠 阶段 5:多维度 Review(核心)
🎯 审查深度自适应
变更规模统一按「净增 + 净删行数」计(不含纯空行和纯注释行;新文件按全部行数统计):
| 变更规模 | 审查模式 | 专家查询 | 执行策略 | 执行维度 | 意图确认 | 报告详细度 |
|---|---|---|---|---|---|---|
| 🔹 微小(≤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 + 完整文件、受影响代码清单、专家资产(如有)、命中的需求上下文(如有)、语言/运行时版本。子 agent 不重新执行阶段 0~4,直接消费主 agent 产出,保证所有维度基于同一套语义基准。
子 agent prompt 要点:① 角色定义(code-review 的 {维度名} 审查专家);② 共享上下文;③ 维度检查清单(从 reference.md 对应维度章节提取);④ 统一输出格式(行号、代码片段、问题描述、严重级别、修复建议);⑤ 约束:只审查分配的维度,发现跨维度问题标注「⚠️ 跨维度线索」而非自行处理;⑥ 发现静态无法收敛的问题时,标记 🧪 建议测试验证 并记录原因,交由主 agent 汇总到报告「测试验证建议」区。
汇总与跨维度一致性校验(主 agent):① 去重——同一位置多维度报告的问题合并为一条;② 冲突解决——不同维度矛盾建议时(如安全建议加密、性能建议避免开销),基于语义声明表判断哪个更符合功能意图;③ 跨维度线索在波次2深入分析;④ 维度 0 基于所有发现做最终语义一致性判定。
降级策略:task-dispatch 不可用或失败 → 降级为串行执行所有维度;子 agent 超时或结果异常 → 主 agent 接管该维度;共享上下文过大(超上下文窗口 50%)→ 精简为功能意图 + diff + 受影响代码清单。
🔑 维度 0:语义一致性检查(最高优先级,波次2 · 主 agent)
语义基准与检查优先级:① 权威语义 vs 实际实现 → ② 辅助语义 vs 实际实现 → ③ 权威语义 vs 辅助语义 → ④ 专家 C1 契约 vs 实际实现(如有)。
0.0 前置必做——AI 语义理解透明化:执行子维度判断前,先重新审视阶段 3 的推测语义是否基于真实代码结构;发现可能偏差 → 报告中显式声明,让用户判断。任何 ❌ 不一致结论都必须能追溯到"权威语义 → 实际实现"的对照,禁止隐式跳过。
子维度一览(完整检查项、隐式语义维度清单、审查动作与典型风险详见 reference.md 第一节):
| 子维度 | 检查核心 | 方向 |
|---|---|---|
| 0.1 提交意图 vs 实际实现 | 说修 X 真修了 X?只修表面症状?混入无关变更?阶段 2.5 命中需求时,以需求描述/验收标准为对照基准 | — |
| 0.2 注释 vs 代码行为 | 注释过时/误导?新增注释须与代码交叉验证(默认低可信) | — |
| 0.3 docstring vs 实际行为 | 参数/返回值/异常/副作用声明与实际是否一致 | — |
| 0.4 命名语义 vs 实际职责 | get 只读?validate 只验证?命名表达的整体职责仍成立? | — |
| 0.5 调用关系语义传递性 | 被调对象的语义维度(时间/集合/一致性/边界/单位/权限/排序)能否支撑上层诉求?禁止在概念错配的对象上打补丁 | 链路 |
| 0.6 局部改动 vs 整体功能语义 | 局部正确是否破坏方法/类/模块/业务流程的整体语义?以阶段 3 🌍 全局图景声明的整体成功判据为回扣基准,局部正确但全局失真 → P0 | 纵向 |
| 0.7 条件路径语义一致性 | 不同参数/隐式条件下各执行路径的语义是否仍一致?定位修改影响的路径范围,重点关注低频路径 | 横向 |
| 0.8 执行场景语义一致性 | 无参数函数/非参数驱动分支:按功能意义识别 3-5 个执行场景(调用时机/频率/外部状态/并发),验证修改在各场景下语义正确 | 场景 |
| 0.9 数据流守恒 | 数据从生产到消费三问:流向变了吗?数量变了吗(减少/增多)?内容还是原样吗?数据链画双轨(正常轨+异常轨),重点核查异常路径——catch 后跳过/continue 看似无害实则静默丢数据,静默丢弃按守恒破坏处理(最低 ⚠️,不得因效果判 🟰 放行);任一变化 → 追查所有消费方,逐个做效果等价性判定(🟰 效果一致 / 🟡 影响可忽略 / 🔴 影响重大),以消费端效果而非数据变化幅度定级;diff 新增数据元素(API 字段/Model 字段/事件字段等)时加做端到端贯通两问——正向:新增输入沿链路走到最终落点了吗(断链=意图未达成,联动 0.1)?反向:新增产出有人生产/消费吗(死字段标 🟡 待确认)?三问查存量、两问查增量;静态无法收敛的 [需运行验证] 项汇总到报告「测试验证建议」区,由阶段 8 动态验证 |
数据 |
| 0.10 搭车变更审计 | 把 diff 拆成「必要变更」(服务于声称意图;阶段 2.5 命中需求时以需求范围为意图授权边界)与「搭车变更」(顺手做的优化/清理/重构);每条搭车变更单独立案,正确性先行:先以 0.6/0.9 同等强度审查改动本身是否正确(切斯特顿围栏检查作为正确性证据来源之一),不因"只是顺手优化"降低标准;不正确即阻断提交(修复或回退),已证正确的才建议拆分独立提交单独评审 | 范围 |
0.6(纵向:局部→整体)与 0.7(横向:局部→同函数不同路径)、0.8(场景:按功能意义枚举)、0.9(数据:沿数据流追到消费方)正交互补,共同构成完整的语义影响面;0.10(范围)先于四者执行——只有先分清哪些改动是搭车的,才知道哪些改动缺少意图授权、需要更严的审视。
发现语义不一致时:按 reference.md 的「语义不一致分析模板」执行深度推演,输出根因判断 + 建议方向;当存在"更简单但鲁棒性更好"的替代方案时,同时呈现精确方案与鲁棒方案并基于可见性/变动风险/精确性需求给出推荐。不一致分类与处理策略表、决策树同见 reference.md。
维度 1-6 概览(完整检查清单见 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 合理性、隔离性 |
🧪 测试验证标记(跨维度,审查过程中随时标记):对以下场景静态分析无法完全收敛时,标记
🧪 建议测试验证并记录原因,汇总到报告「测试验证建议」区供阶段 8 处理:
- 0.9 数据流守恒:命中
[需运行验证]的项- 0.7/0.8 条件路径/执行场景:并发/异步逻辑、复杂状态转换无法静态验证
- 维度 2 Bug 风险:跨模块副作用链无法静态追踪
- 维度 5 性能:性能敏感路径需运行时验证
不确认就跑:以上场景是"标记点"而非"死磕点"——静态分析尝试收敛,但 2~3 轮推演仍无法确认时,停止静态下钻,直接标记
🧪 建议测试验证并继续主线审查;确定性证据由阶段 8 跑一遍临时测试获得,禁止在静态层无限推演。
📊 阶段 6:输出 Review 报告
快速模式:不使用本模板,仅列出发现的问题 + 一行维度状态(示例见 examples.md 场景 9)。
整体评分映射规则:整体评分 = 七维度得分均值映射——9.510 → A+;8.59.4 → A;78.4 → B;5.56.9 → C;4~5.4 → D;<4 → F。存在未修复 P0 问题时整体评分最高为 C。
标准模式及以上严格按以下模板输出:
📋 Code Review Report
Commit: <commit_hash_or_description>(无 git 上下文时标注 [无提交上下文])
变更文件: <文件列表>
关联需求: REQ-NNN《需求名》(匹配依据:用户指定 / 代码语义 ↔ 需求名称 🟡)/ [未关联到已知需求] / [未启用需求管理]
整体评分: <A+/A/B/C/D/F>(存在未修复 P0 时最高为 C)
🎯 功能意图推测(阶段 3)
🌍 全局图景:业务目标 <一句话>|系统位置 <上游 → 变更点 → 下游>|整体成功判据 <清单>(信息不足时标注 [全局信息缺失])
| 代码位置 | 推测的功能意图 | 确认状态 | 置信度 |
|---|---|---|---|
<文件:函数()> |
<推测的功能意图> |
✅ 已确认 / ⚠️ 已修正 / ⏩ 未确认(快速/免确认) | 🟢/🟡/🔴 |
修正记录(如有):<函数名>:原始推测为 <原始推测>,用户修正为 <用户修正>
📊 维度评分概览
| 维度 | 评分 | 状态 |
|---|---|---|
| 🔑 语义一致性 | X/10 | ✅/⚠️/❌ |
| ⚠️ 安全性 | X/10 | ✅/⚠️/❌ |
| 🐛 Bug 风险 | X/10 | ✅/⚠️/❌ |
| 📐 代码规范 | X/10 | ✅/⚠️/❌ |
| 🏗️ 架构设计 | X/10 | ✅/⚠️/❌ |
| ⚡ 性能 | X/10 | ✅/⚠️/❌ |
| 🧪 测试覆盖 | X/10 | ✅/⚠️/❌ |
状态标准:✅ = 8-10 无明显问题 | ⚠️ = 5-7 需改进 | ❌ = 0-4 严重问题
📝 语义提取记录
权威语义(阶段 3):
| # | 来源 | 🤖 AI 推测的功能意图 | 确认状态 | 涉及位置 |
|---|---|---|---|---|
| A1 | 阶段 3 推测 | <推测的功能意图> |
✅/⚠️/⏩ | <文件:行号> |
辅助语义(阶段 4):
| # | 来源 | 原文 | 🤖 AI 理解的语义 | 置信度 | 与权威语义关系 | 涉及位置 |
|---|---|---|---|---|---|---|
| S1 | commit message | <原文> |
<AI 一句话表达理解到的意图> |
🟢/🟡/🔴 | ✅/⚠️/❌ | <文件:行号> |
| S2 | docstring | <原文> |
<AI 理解的契约> |
🟢/🟡/🔴 | ✅/⚠️/❌ | <文件:行号> |
| S3 | 方法整体职责 | - | <AI 一句话概括整体语义> |
🟢/🟡/🔴 | ✅/⚠️/❌ | <文件:行号> |
⚠️ 请用户重点核实:⏩ 未确认的权威语义、置信度 🟡/🔴 的辅助语义、与权威语义 ❌ 冲突的辅助语义。
🔑 语义一致性分析(最高优先级展示)
[M1] <不一致标题>
- 🏷️ 类型:
<不一致类型> - 📍 涉及:
<语义声明#> ↔ <代码位置> - 💬 语义原文:
<原文> - 🤖 AI 对该语义的理解:
<AI 理解的意图,置信度 🟢/🟡/🔴> - 💻 实际做:
<实现行为描述> - 🔍 推演分析:语义的真正意图 / 当前实现的局限 / 根因判断
- 💡 建议方向:
<方向1 / 方向2> - 🔄 解决方案对比(精确 vs 鲁棒,仅当存在双方案时)+ 📊 权衡建议(可见性 / 变动风险 / 精确性需求 → 推荐方案及理由)——完整模板见 reference.md
🛤️ 条件路径与执行场景语义分析
本节承接维度 0.7(参数驱动路径)与 0.8(功能意义驱动场景)的验证结果。
被分析函数: <函数名> (<文件:行号>) 函数功能: <一句话概括>
参数路径枚举(0.7):
| 参数/条件组合 | 执行路径 | 路径语义 | 修改后是否受影响 |
|---|---|---|---|
<参数值域/隐式条件> |
<路径描述> |
<语义承诺> |
✅ / ⚠️ / ❌ |
执行场景覆盖(0.8):
| 场景 ID | 场景名称 | 修改代码是否执行 | 语义一致性 | 分析说明 |
|---|---|---|---|---|
| S1 | <场景名称> |
✅/⚠️/❌/❓ | ✅/⚠️/❌ | <具体分析> |
数据流守恒(0.9,仅当变更涉及数据生产/转换/消费时):
| 数据实体 | 流向变化 | 数量变化 | 内容变化 | 异常路径归宿 | 消费方及效果判定 | 结论 |
|---|---|---|---|---|---|---|
<集合/记录/字段> |
✅ 无 / ❌ <原流向→新流向> |
✅ 无 / ❌ <如 10→5,原因> |
✅ 无 / ❌ <字段/精度/格式变化> |
✅ 无异常处理点 / ✅ 有记录+补偿 / ❌ 静默丢弃<位置> |
<消费方>:🟰 效果一致 / 🟡 影响可忽略[待确认] / 🔴 影响重大<效果差异> |
✅/⚠️/❌ |
新增数据贯通(0.9 贯通两问,仅当 diff 新增数据元素时):
| 新增数据元素 | 正向贯通(沿链路 → 最终落点) | 反向消费(生产方/消费方) | 结论 |
|---|---|---|---|
<字段/表列/事件字段> |
✅ 逐跳接住并落地 / ❌ 断链于 <哪一跳> |
✅ 有生产有消费 / 🟡 死字段/空壳字段[待确认] / [消费方在仓库外,需人工确认] |
✅/⚠️/❌ |
搭车变更审计(0.10,仅当 diff 含与声称意图无关的改动时):
| 搭车变更位置 | 改动性质 | 围栏检查(原写法是否故意) | 正确性(0.6/0.9) | 结论 |
|---|---|---|---|---|
<文件:行号> |
<顺手优化/清理/重构> |
✅ 已证非故意(<注释/blame/测试证据>)/ ❓ 无法证明 |
✅ 正确 / ❓ 无法证明 / ❌ <破坏的判据> |
❌ 不正确 → 修复或回退(拆分不能替代修复)/ ⚠️ 无法证明 → 补证或回退 / ✅ 正确 → 放行,建议拆分独立提交 |
测试验证建议(汇总各维度 🧪 标记,供阶段 8 处理):
| # | 来源维度 | 验证类型 | 涉及代码 | 建议验证内容 | 原因 |
|---|---|---|---|---|---|
| 1 | 0.9 数据流 | 连通性+正确性 | <文件:行号> |
<数据流描述> |
<静态无法收敛的原因> |
| 2 | 0.8 执行场景 | 场景验证 | <文件:行号> |
<并发/异步场景> |
<静态无法验证的原因> |
快速模式(≤5 行):跳过阶段 8,本区如有内容,在报告末尾提示「建议手动接力 e2e-testing 或 debug 验证」。
问题聚焦(仅当存在 ⚠️/❌ 项时):
[ES1] <问题标题> — 🏷️ 路径/场景、📍 涉及代码行、🔍 问题分析(执行路径 / 具体行为 / 语义偏差)、💡 修复建议
🔴 严重问题(必须修复)
每条包含:行号 + 代码片段 + 问题描述 + 修复建议 + 关联语义声明编号
🟡 建议改进(推荐修复)
同上格式
🟢 亮点(值得肯定)
肯定好的实践和设计
📝 总结与行动项
🎯 合入结论:✅ 可直接合入 / ⚠️ 修复 P0 后可合入 / ❌ 建议拒绝(回扣全局图景的整体成功判据)
💥 缺陷 → 功能影响翻译(每个 P0/P1 缺陷必须翻译成功能语言:从 M*/0.9/ES* 的推演结论中回收,不新增分析;读者是合入决策者,不是修代码的人):
| 缺陷 | 预期功能行为 | 实际功能行为 | 功能影响 |
|---|---|---|---|
#M1 |
<用户/业务视角本该发生什么> |
<带缺陷合入后实际会发生什么> |
🔴/🟡 <一句话业务后果> |
🚧 合入前必须完成(P0):
| # | 行动项 | 对应功能影响 | 关联语义 |
|---|---|---|---|
| 1 | <必须修复项> |
<引用上表功能影响> |
#M1 |
📌 合入后跟进(P1/P2):
| 优先级 | 行动项 | 关联语义 |
|---|---|---|
| P1 | <建议修复项> |
#S3 |
| P2 | <可选优化项> |
- |
🧨 阶段 7:无阻塞项自动质疑(challenger 接力)
核心逻辑:存在阻塞项时用户反正要先修复,challenger 此时介入是浪费;恰恰是"全绿通过"的结论最需要对抗式二次验证,防止评审自身盲区放行问题代码。
触发条件(须同时满足,缺一不触发):
| # | 条件 | 说明 |
|---|---|---|
| 1 | 合入结论为 ✅ 可直接合入 | 阻塞项 = 🔴 严重问题(P0);🟡 建议改进(P1/P2)、🟢 亮点、优化/建议类意见均不算阻塞项 |
| 2 | 标准模式及以上(≥ 6 行) | ⚡ 快速模式不自动触发,仅在输出末尾提示一行「如需二次质疑可手动触发 challenger」 |
| 3 | 本会话未对同一变更执行过 challenger | 同一变更 = diff 内容未变;修复 P0 后重新 review 时 diff 已变化,视为新变更、去重不适用;本次 review 由 auto-review / writing-pipeline 等链路带起且 challenger 已对当前 diff 执行 → 跳过,避免重复质疑 |
| 4 | 用户未声明跳过 | 用户明确说"不用质疑"、"跳过 challenger"时不触发 |
执行方式:
- 触发前向用户声明一行:「Review 未发现阻塞项,自动发起 challenger 二次质疑」
- 调用
challengerskill(代码变更模式),作为调用方传入上下文:本次 diff、阶段 3 权威语义与全局图景、阶段 6 审查报告结论;输出路径指定为review/challenge-report.md(未启用需求管理时在对话中反馈)
结论回写(保持两份报告结论一致):
| challenger 质疑结果 | 处理 |
|---|---|
| 质疑成立且为阻塞级(🔴 高风险) | 更新合入结论为 ⚠️ 修复后可合入 / ❌ 建议拒绝,并在报告总结中追加「质疑推翻记录」(质疑点 + 原结论 + 新结论) |
| 质疑不成立,或仅 🟡/🟢 | 维持 ✅ 结论,质疑点并入「📌 合入后跟进」P1/P2 清单 |
存在阻塞项(合入结论非 ✅)时本阶段静默跳过;待修复后重新 review 通过,再按本阶段条件判定。
降级策略:challenger 不可用或执行失败 → 不阻塞交付,维持原合入结论,在报告末尾标注「⚠️ 自动质疑未执行(原因),建议手动触发 challenger」;禁止静默跳过不标注。
🧪 阶段 8:测试验证(条件触发)
定位:review 完成后的动态验证补充。阶段 0~7 以静态审查为主(约束 #15),本阶段是唯一的动态验证例外——承接审查中标记的不确定项(约束 #21:不确认就跑),对报告「测试验证建议」区中的项创建并执行临时测试,验证数据流连通性与复杂逻辑正确性。详细检查清单与测试模式见 reference.md 第十节。
触发判定(阶段 7 完成或跳过后执行;存在阻塞项时静默跳过,待修复后重新 review 通过再触发):
| # | 条件 | 动作 |
|---|---|---|
| 1 | 报告「测试验证建议」区有内容 | AI 自动触发 |
| 2 | 无显式建议项,但 AI 评估认为动态验证有价值 | 提示用户:「建议进行测试验证,原因:{...}」,用户确认后触发 |
| 3 | 无建议项且 AI 评估无需验证 | 跳过 |
快速模式(≤5 行)跳过本阶段;报告中如有「测试验证建议」区内容,在报告末尾提示「建议手动接力 e2e-testing 或 debug 验证」。
环境前置检查(执行前必做):
检测运行时依赖可用性(DB 连接、消息队列可达性、API 可达性等)。不可用时降级为标注 [环境不可用,建议接力 e2e-testing/debug],不创建无法执行的测试脚本。
执行流程:
步骤 A:确定存储位置
按优先级确定临时测试的存储目录:
| 优先级 | 条件 | 存储路径 |
|---|---|---|
| 1 | 有对应专家团(阶段 2 命中) | {专家目录}/test/ |
| 2 | 无专家,有需求(阶段 2.5 命中 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 已输出的内容。
| 临时测试结果 | 报告结论更新 |
|---|---|
| 通过 | 对应验证项标注 ✅(动态确认连通且正确) |
| 失败 | 对应验证项标注 ❌(动态确认断链/数据错误),按影响面定 P0/P1,写入「🔴 严重问题」 |
| 无法执行 | 维持原标注,追加 [动态验证执行失败:{原因}] |
步骤 F:清理策略
- 默认保留临时测试(作为审查证据,报告中标注路径)
- 用户可显式要求清理;清理时同步删除存储目录下的临时测试文件
约束与原则
- 语义优先:先确保"做对了东西",再确保"把东西做对",语义不一致的问题永远最优先
- 精准定位 + 建设性修复:问题必须给出具体行号和代码片段,并附修复示例代码;语义不一致时必须推演正确的实现方向和替代方案
- 语言与版本自适应:重点审查当前语言专属陷阱、惯用法与版本约束,不将合法语法误报为错误;不确定的语言特性/标准库行为/已知漏洞可查官方文档验证
- 变更聚焦:只 Review 变更的部分,未修改代码仅在有直接安全风险时才提及;不确定的问题标注
[需确认] - 语义溯源:每条 Review 意见尽量关联到具体的语义来源编号,做到有据可查
- 范围自适应:按变更规模选择快速/标准/深度模式;快速模式跳过专家查询、强关联查询、待生效变更台账、需求上下文感知、意图确认交互和并行派发
- 提交门禁:先审查提交本身是否合格(粒度、敏感文件、message 质量),再审查代码内容;无 git 上下文时跳过提交审查并标注
- 质疑被调对象:语义不一致的根源在"选错下游抽象"时,建议必须包含"更换被调对象 / 新建合适抽象"的方向,不得仅停留于在原对象上叠参数
- 完整语义影响面:任何局部修改都必须做纵向(0.6 整体语义)+ 横向(0.7 路径语义)+ 场景(0.8)+ 数据(0.9 数据流守恒)四重校验,防止"局部正确、整体失真"、"此路径正确、彼路径失真"或"代码正确、数据悄悄变少";搭车变更经 0.10 立案后同样逐条适用本条,不走另一套标准
- AI 语义理解透明化:所有 Review 输出必须显式呈现"AI 自己理解到的语义"及其置信度,禁止把隐式理解当作客观事实;低置信度理解必须提示用户核实,不得作为后续判断的隐含前提;新增注释可信度默认低,与代码行为不一致时以代码为准
- 方案鲁棒性权衡:存在"更简单但鲁棒性更好"的替代方案时,必须同时呈现精确方案与鲁棒方案,基于可见性/关联代码变动风险/调用方精确性需求给出推荐;禁止默认"精确即最优"
- 专家资产按需加载:仅标准模式及以上查询专家团;查不到不阻塞;代码实际行为永远最权威
- 并行纪律:语义一致性(0)与架构(4)必须主 agent 波次2串行执行,禁止派发子 agent;子 agent 只审查分配维度、消费共享上下文、跨维度问题标注线索不自行处理;
task-dispatch不可用时降级全串行 - 中文输出:所有 Review 意见用中文表达,代码注释可用英文
- 静态为主、测试验证为辅:阶段 0~7 以静态审查为主,不运行完整项目测试或性能测试;例外:阶段 8 对报告「测试验证建议」区的项创建并执行轻量临时测试,验证数据流连通性与复杂逻辑正确性(不替代正式测试套件);环境不可用时降级为标注建议;快速模式跳过阶段 8,标注
[需运行验证]并建议接力 debug / demo-verify / e2e-testing - 全局图景先行:审查前先建立全局图景(业务目标/系统位置/整体成功判据,见阶段 3 步骤 A),0.6 纵向校验与最终结论必须回扣该图景;局部正确但破坏整体成功判据 → P0,不得因局部正确而放行
- 搭车变更正确性先行:与声称意图无关的顺手优化/清理(0.10)不因"只是小改动"降低审查强度——它没有意图授权,反而要更严。判定分两段:先审正确性——不正确 → 阻断提交,修复或回退,"拆分独立提交"不能替代修复;正确性无法证明(围栏 ❓ 且无其他证据)→ 要求补证或回退,不得仅以拆分放行;已证正确 → 才建议拆分独立提交单独评审,保持变更原子性
- 需求上下文懒加载:
req list仅作轻量感知(只看最新需求的名称清单,不读文档);看完代码后按名称匹配、命中才读对应需求文档;用户已指明需求则直接读取该需求;req不可用或未命中均不阻塞审查 - 全绿须质疑后放行:标准模式及以上、合入结论为 ✅ 且本会话未对同一变更执行过 challenger 时,自动接力 challenger 二次质疑(阶段 7);快速模式仅提示不自动触发;用户声明跳过则不触发;质疑成立的阻塞级问题必须回写合入结论,禁止 review 报告与质疑报告结论不一致
- 测试验证条件触发:阶段 7 完成或跳过后,报告「测试验证建议」区有内容时 AI 自动触发阶段 8;无显式建议但 AI 评估有价值时提示用户确认后触发;存在阻塞项时静默跳过;快速模式跳过阶段 8 仅提示;阶段 8 发现的问题回写报告,与阶段 0~7 结论保持一致
- 不确认就跑(防静态死磕):审查中遇到复杂逻辑/不确定逻辑,静态推演 2~3 轮仍无法收敛时,停止下钻,标记
🧪 建议测试验证并继续主线;禁止在静态层无限推演(死磕)——确定性证据由阶段 8 跑一遍临时测试获得,推演成本 > 验证成本时优先移交验证
需求管理集成
当项目配置了 .requirements/config 且 storage_path 指向有效目录时,审查完成后自动执行:
审查前的需求感知与匹配已在阶段 2.5 完成(
req list轻量感知 → 命中才读需求文档),本节只负责审查完成后的报告写回。
- 写入审查报告到需求目录后注册文档关联:
req update {REQ-NNN} \
--docs add review/code-review.md,review --changelog "完成代码审查"
- 阶段 7 执行过 challenger 时,一并注册质疑报告(challenger 被调用时跳过自身集成,由本 skill 作为调用方统一注册):
req update {REQ-NNN} \
--docs add review/challenge-report.md,review --changelog "完成自动质疑审查"
- 错误处理:需求 ID 不存在 → 跳过集成,不影响审查;文件锁超时 → 自动重试 1 次,仍失败则告知用户
| 产出物 | 存储路径 | docs 类型 |
|---|---|---|
| 代码审查报告 | review/code-review.md |
review |
| 自动质疑报告(阶段 7,如执行) | review/challenge-report.md |
review |
| 测试验证(阶段 8,如执行且无专家团) | test/ |
test |
有专家团时测试存储在
{专家目录}/test/,不写入需求目录;无专家无需求时存储在.codebuddy/review/data-flow-test/。
附加资源
- 七维度完整检查清单、语义声明表格式、语义不一致分析模板、决策树、专家资产用途映射、阶段 8 测试验证检查清单:reference.md
- 典型场景示例(9 个,含快速模式输出示例):examples.md