Files
sanguo_moziplus_v2/docs/research/distill-skills-draft/code-review-quality.md
T
2026-05-26 23:43:38 +08:00

173 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: code-review-quality
description: >-
代码评审质量纪律:评审闭环必须包含最终代码确认、枚举一致性检查、
设计-代码三层对照、评审者自我纠正。在发评审、收评审结果、做评审时触发。
---
# 代码评审质量
> 来源:从三国团队(庞统/司马懿/诸葛亮)~2GB 对话历史中蒸馏
> 卡片数:6(合并自批次1卡片5/12 + 批次2卡片1/2/3/5
## 适用场景
- 发出代码评审请求时
- 收到评审结果需要处理时
- 自己作为评审者审查他人代码时
- 多步骤开发中方案评审 → 实现的闭环确认时
## 经验清单
### 1. 评审闭环必须包含最终代码确认(severity: high
**场景**:多步骤开发中,方案评审通过后,实现阶段可能有微调。评审者只确认了方案而没看最终代码,Bug 被遗漏。
**正确做法**
- **一键三连 = 改文档 → 改代码 → 司马懿确认最终代码片段**
- 每个方案落地后,必须把最终代码(不是方案描述)发给评审者确认
- 司马懿在评审中多次引用代码行号做交叉验证,这种精度只有看最终代码才能做到
**⚠️ 常见错误**
- 实现后只说"已采纳建议",没发最终代码让评审者确认
- "已采纳" ≠ "已验证"——采纳后的代码可能引入新问题
**关键细节**
- 庞统在 M2 阶段让司马懿 review 了方案但没发最终代码,用户发现后指出:[pangtong/experience]
> "一键三连最终肯定是以司马懿 review 完你的最终成果物收尾的"
- 司马懿多次在代码评审中发现方案评审没暴露的 Bug(如 `_do_retry` 续杯失效)
- 续杯评审中,司马懿看到最终代码才发现 `on_complete=None` 导致幻觉门控丢失
> 来源:批次2卡片1(评审闭环,freq=5+)
---
### 2. 状态机枚举值一致性是高频 Bug 根源(severity: high
**场景**:系统有多处引用任务/节点状态值,枚举定义与实际使用不一致会导致静默失败。
**正确做法**
1. 状态枚举集中定义,所有引用点从枚举取值,硬编码字符串零容忍
2. 状态转换函数只保留一个入口(如 `_transition_status`),禁止分散在多个模块
3. 评审时重点检查:新代码中的状态值是否与枚举定义一致
**⚠️ 常见错误**
- SQL 查询用 `'executing'` 但实际枚举值是 `'working'`,导致重启恢复遗漏 [pangtong/simayi-review]
- `failed→pending` 转换不清 `assignee`,与另一路径行为不一致
- `max_per_agent=2` vs 设计文档的 `1`,配置与设计不一致
**关键细节**
- 司马懿在 counter v2.1 评审中发现配置值与设计文档不匹配
- auto-sync 可能静默修改配置文件,需要与设计文档对照
- P0-2 状态不一致导致任务永久卡住,P0-1 导致重启恢复失败
> 来源:批次2卡片2(枚举一致性,freq=3+)
---
### 3. 评审者自我纠正是高质量评审的标志(severity: high
**场景**:评审者在审查代码时可能做出错误判断。高质量的处理不是掩盖,而是主动承认并修正。
**正确做法**
- 庞统发现两处自己之前的判断有误,主动发邮件给司马懿修正:
> "修正 1: 问题4 recent_compact 不是死代码,是设计实现遗漏" [pangtong/mail]
- 司马懿回复:"你说得对,我判断错了" [simayi/mail]
- 修正邮件明确标注"修正"而非静默修改,保留审计轨迹
**⚠️ 常见错误**
- 不主动修正,错误判断被当作已确认结论传播
- 后续实现基于错误假设,导致更严重问题
**关键细节**
- 评审者翻回设计文档交叉验证,是发现误判的有效手段
- 庞统和司马懿在同一次评审中都做了自我纠正——交叉验证机制在工作
- 评审者不是全知的,承认错误比坚持错误更有价值
> 来源:批次2卡片3(自我纠正,freq=3)
---
### 4. 设计文档-代码一致性审查不可省(severity: high
**场景**:迭代开发中设计文档更新不及时,或代码实现偏离设计。需要 PRD→设计→代码的三层一致性审查。
**正确做法**
1. 每次代码评审前,先对设计文档逐条检查实现覆盖度
2. 设计文档用明确编号(§B1/B2/B3)便于逐条追踪
3. 安排"背靠背一致性审查":PRD→设计→代码全覆盖审计
4. 司马懿的核心职责就是做这种三层对照
**⚠️ 常见错误**
- 设计文档 §B2(compact 进行中继续等)在代码中完全遗漏
- 司马懿初评时也未发现,直到庞统重新读设计文档才暴露 [pangtong/mail]
> "代码只实现了 B1/B3/B4B2 遗漏了。recent_compact 是 B2 实现的数据基础"
**关键细节**
- 庞统专门发了 #311 邮件请求"PRD→设计→代码三层一致性审查"
- 司马懿在 counter 生命周期评审中发现设计说 crash 3 次标 failed,但代码只 release counter 无计数
- 三层审查的顺序:先 PRD→设计(需求是否覆盖),再设计→代码(实现是否忠实)
> 来源:批次2卡片4(设计-代码一致性,freq=4+)
---
### 5. 要求深度评审而非最小改动(severity: medium
**场景**:将问题发给评审者时,评审标准应该是从需求和设计角度出发,而不是做最小改动。
**正确做法**
1. 评审时明确要求从需求和设计角度出发
2. 不接受以"延后到后续版本"为由的需求降级
3. 评审要回答"这个方案是否满足原始需求"
4. 用户说"全部做"时,不接受延后建议
**⚠️ 常见错误**
- 只要求评审者做"最小改动"或接受"需求降级"的建议
- 采纳评审者的"延后"建议,一步步推进
- 用户说"不要一步一步来"意味着要一次到位 [frag_2087]
**关键细节**
- "需求降级"是 agent 常见的偷懒方式——把困难的需求推到下个版本
- "你知道的"暗示用户偏好一步到位,这是长期偏好
- 评审意见分为采纳和拒绝,延后=拒绝
> 来源:批次1卡片5(评审标准,freq=1)+ 批次1卡片12(不延后,freq=1)+ 批次2卡片5(闭环标准,freq=2)合并
---
### 6. 方案确认的完整闭环标准(severity: medium
**场景**:多方案并行开发时,哪些方案算"完成"容易模糊。
**正确做法**
**一键三连收尾标准**(用户明确定义):
1. 改文档(设计/方案)
2. 改代码(实现)
3. **司马懿 review 并确认最终代码片段**
每步完成都要有明确证据(邮件编号、代码片段引用)。
**⚠️ 常见错误**
- 只跟踪"方案评审"状态,没跟踪"最终代码确认"状态
- 未闭环的方案被标记为"已完成"
**关键细节**
- 状态跟踪表要包含三列:方案评审 / 最终代码确认 / 状态
- 司马懿的确认必须是具体的("代码片段与实际改动一致"),不是笼统的"通过"
> 来源:批次2卡片5(闭环标准,freq=2)
---
## 检查清单(快速参考)
- [ ] 评审请求是否包含最终代码(不是方案描述)?
- [ ] 状态/枚举值是否全部从集中定义取用?有无硬编码字符串?
- [ ] 状态转换是否只有一个入口函数?
- [ ] 设计文档是否逐条检查了实现覆盖度?有无遗漏的 § 节?
- [ ] 发现评审误判时,是否主动发出修正(而非静默修改)?
- [ ] 是否有不合理的"延后到下一版本"建议?用户偏好一步到位
- [ ] 一键三连是否闭环:文档→代码→最终代码确认?
- [ ] 评审结果处理完是否把修改后的代码再发评审者确认?