Bug 修复(Corrective Flow)
归属:
docs/guides/sops/触发:已合并代码出现回归、行为不符合预期、用户报告缺陷 关联概念:CONTEXT.md中的 Corrective Flow(纠正流程)、Flow Record、Worktree Lifecycle
场景定义
针对已合并到默认分支的代码出现的回归或错误,以「恢复已确认行为」为目标的轻量 Flow。它不改变原 Flow 的完成状态,只链接导致回归的原 Flow 作为溯源。
目标与不做什么
- 目标:最小改动恢复正确行为,并留下回归测试防止复发。
- 不做:不为单点 bug 走完整
requirements → design → tasks链路(除非根因指向设计缺陷,见「升级通道」)。
标准方法论(行业通行)
借鉴业界成熟的 bug 处理与诊断纪律:
- Bug 分诊(Triage):先定严重度与优先级(P0 瘫痪 / P1 严重 / P2 一般),再决定处理路径与时效。
- 诊断循环(对应本地
diagnoseskill):- 建立反馈回路 → 复现 → 假设(3–5 个可证伪假设,展示给用户重排优先级)→ 插桩(一次只改一个变量)→ 修复 + 回归测试 → 清理 + 复盘。
- 核心洞察:先有快速、确定、可复现的失败信号,再谈修。没有反馈回路,别急着猜。
- TDD 修复:先写能复现 bug 的失败测试(RED)→ 最小修复(GREEN)→ 回归(对应
flow-tdd)。 - 根因分析(RCA)与复盘:
5 Whys追问「什么能阻止这个 bug」。若答案指向架构问题(无测试缝、调用链纠缠)→ 转improve-codebase-architecture。 - 回归防护:修复必须带回归测试,且修复后重跑原始(未最小化的)复现场景确认不再复发。
本项目落地流程
- 识别与分诊:确认是回归 / 缺陷,评估严重度与影响范围。
- 创建 Corrective Flow:
goal({op:"create", parent_issue_number:<原 Flow Record 或新 Issue>});在 Issue body 记录复现步骤、期望行为、实际行为、根因,并链接原 Flow(不改变其完成状态)。 - 建立反馈回路(重用
diagnose):构造最小化复现——失败测试 / 脚本 / 夹具,先确认能复现用户描述的同一个故障,而非邻近的其它故障。 - 假设与验证:生成并按优先级测试假设;一次改一个变量。
- 修复 + 回归测试:在独立分支
fix/<slug>/ worktree 内,RED→GREEN 周期;回归测试锁定正确行为。 - 审查与合并:复用
flow-review(双轴:规范 + 是否确实恢复行为);CI 绿后--match-head-commit合并。 - 清理 + 复盘:移除调试插桩、删除临时产物、销毁 worktree;在 commit/PR 中写明正确的根因假设,供后续排障者学习;必要时将架构问题转
improve-codebase-architecture并记录建议。
验证与门禁
- [ ] 原始(未最小化)复现场景不再复现
- [ ] 新增回归测试通过,且修复前能复现失败(RED→GREEN 已验证)
- [ ] 全量回归(
npm test)通过 - [ ] CI 绿 + 双轴审查通过后合并
- [ ] 调试日志/临时文件已清理(按唯一前缀
grep确认)
产出物
- Corrective Flow Issue(含复现、根因、修复说明、原 Flow 链接)
- 回归测试 + 修复 commit
- 合并的
fix/<slug>PR
复用与新增资产
- 复用:
flow-tdd(RED→GREEN)、flow-code(worktree 编码)、flow-review(审查合并)、goal 工具、Worktree Lifecycle。 - 新增(缺口):
flow-correctiveskill、/fix命令、fix/<slug>分支约定。
升级通道
若根因指向设计缺陷(无测试缝、架构耦合),修复后单独开一个 04-refactor 或功能 Flow 处理结构性变更,不要混入本次 bug 修复。
反模式 / 注意事项
- 不修「邻近的另一个 bug」——同一反馈回路应对应同一故障。
- 没有反馈回路就猜根因。
- 修复不带回归测试(留下复发风险)。
- 用完整功能流处理单点 bug(过载)。
- 修改原 Flow 的完成历史来「追溯」——Corrective Flow 应保持原 Flow 完成状态不变。