code-review

多语言代码多维度专业 Code Review:以语义一致性为核心,覆盖安全、Bug 风险、规范、架构、性能、测试覆盖,输出分级问题清单。触发:"review 这个提交"、"code review"、"检查这段代码",或提供 git diff / commit hash 时。

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.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
"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 上下文理解

  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 提供现成消费方清单,免去从零追查消费链
  1. 向用户声明:「已查询 {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-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.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"时不触发

执行方式:

  1. 触发前向用户声明一行:「Review 未发现阻塞项,自动发起 challenger 二次质疑」
  2. 调用 challenger skill(代码变更模式),作为调用方传入上下文:本次 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:清理策略

  • 默认保留临时测试(作为审查证据,报告中标注路径)
  • 用户可显式要求清理;清理时同步删除存储目录下的临时测试文件

约束与原则

  1. 语义优先:先确保"做对了东西",再确保"把东西做对",语义不一致的问题永远最优先
  2. 精准定位 + 建设性修复:问题必须给出具体行号和代码片段,并附修复示例代码;语义不一致时必须推演正确的实现方向和替代方案
  3. 语言与版本自适应:重点审查当前语言专属陷阱、惯用法与版本约束,不将合法语法误报为错误;不确定的语言特性/标准库行为/已知漏洞可查官方文档验证
  4. 变更聚焦:只 Review 变更的部分,未修改代码仅在有直接安全风险时才提及;不确定的问题标注 [需确认]
  5. 语义溯源:每条 Review 意见尽量关联到具体的语义来源编号,做到有据可查
  6. 范围自适应:按变更规模选择快速/标准/深度模式;快速模式跳过专家查询、强关联查询、待生效变更台账、需求上下文感知、意图确认交互和并行派发
  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. 静态为主、测试验证为辅:阶段 0~7 以静态审查为主,不运行完整项目测试或性能测试;例外:阶段 8 对报告「测试验证建议」区的项创建并执行轻量临时测试,验证数据流连通性与复杂逻辑正确性(不替代正式测试套件);环境不可用时降级为标注建议;快速模式跳过阶段 8,标注 [需运行验证] 并建议接力 debug / demo-verify / e2e-testing
  16. 全局图景先行:审查前先建立全局图景(业务目标/系统位置/整体成功判据,见阶段 3 步骤 A),0.6 纵向校验与最终结论必须回扣该图景;局部正确但破坏整体成功判据 → P0,不得因局部正确而放行
  17. 搭车变更正确性先行:与声称意图无关的顺手优化/清理(0.10)不因"只是小改动"降低审查强度——它没有意图授权,反而要更严。判定分两段:先审正确性——不正确 → 阻断提交,修复或回退,"拆分独立提交"不能替代修复;正确性无法证明(围栏 ❓ 且无其他证据)→ 要求补证或回退,不得仅以拆分放行;已证正确 → 才建议拆分独立提交单独评审,保持变更原子性
  18. 需求上下文懒加载:req list 仅作轻量感知(只看最新需求的名称清单,不读文档);看完代码后按名称匹配、命中才读对应需求文档;用户已指明需求则直接读取该需求;req 不可用或未命中均不阻塞审查
  19. 全绿须质疑后放行:标准模式及以上、合入结论为 ✅ 且本会话未对同一变更执行过 challenger 时,自动接力 challenger 二次质疑(阶段 7);快速模式仅提示不自动触发;用户声明跳过则不触发;质疑成立的阻塞级问题必须回写合入结论,禁止 review 报告与质疑报告结论不一致
  20. 测试验证条件触发:阶段 7 完成或跳过后,报告「测试验证建议」区有内容时 AI 自动触发阶段 8;无显式建议但 AI 评估有价值时提示用户确认后触发;存在阻塞项时静默跳过;快速模式跳过阶段 8 仅提示;阶段 8 发现的问题回写报告,与阶段 0~7 结论保持一致
  21. 不确认就跑(防静态死磕):审查中遇到复杂逻辑/不确定逻辑,静态推演 2~3 轮仍无法收敛时,停止下钻,标记 🧪 建议测试验证 并继续主线;禁止在静态层无限推演(死磕)——确定性证据由阶段 8 跑一遍临时测试获得,推演成本 > 验证成本时优先移交验证

需求管理集成

当项目配置了 .requirements/config 且 storage_path 指向有效目录时,审查完成后自动执行:

审查前的需求感知与匹配已在阶段 2.5 完成(req list 轻量感知 → 命中才读需求文档),本节只负责审查完成后的报告写回。

  1. 写入审查报告到需求目录后注册文档关联:
req update {REQ-NNN} \
  --docs add review/code-review.md,review --changelog "完成代码审查"
  1. 阶段 7 执行过 challenger 时,一并注册质疑报告(challenger 被调用时跳过自身集成,由本 skill 作为调用方统一注册):
req update {REQ-NNN} \
  --docs add review/challenge-report.md,review --changelog "完成自动质疑审查"
  1. 错误处理:需求 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