--- 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/B4,B2 遗漏了。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) --- ## 检查清单(快速参考) - [ ] 评审请求是否包含最终代码(不是方案描述)? - [ ] 状态/枚举值是否全部从集中定义取用?有无硬编码字符串? - [ ] 状态转换是否只有一个入口函数? - [ ] 设计文档是否逐条检查了实现覆盖度?有无遗漏的 § 节? - [ ] 发现评审误判时,是否主动发出修正(而非静默修改)? - [ ] 是否有不合理的"延后到下一版本"建议?用户偏好一步到位 - [ ] 一键三连是否闭环:文档→代码→最终代码确认? - [ ] 评审结果处理完是否把修改后的代码再发评审者确认?