skills/issue-troubleshooting/SKILL.md
系统化问题排查与修复skill。五阶段流程(根因调查→模式分析→假设验证→修复规模评估→修复实施)定位问题根因并完成修复, 大修时联动 implementation-planning 创建修复计划(引用已有技术方案,不创建新方案文档)。 触发场景:遇到任何 bug、测试失败、异常行为、性能问题、构建失败时使用。 即使用户只说"这个报错了"、"帮我看看这个问题"、"这个功能不对",也应触发此 skill。 当问题涉及多模块改动、架构调整、或预估修复超过4小时,务必联动 implementation-planning。
npx skillsauth add anian0/pick-skills issue-troubleshootingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
随机猜测式修 bug 浪费时间,还会引入新问题。快速补丁掩盖根因,迟早复发。
核心原则:先找到根因,再动手修复。治症不治本就是失败。
本 skill 在经典调试流程基础上,新增修复规模评估环节——当修复工作量较大时,
联动 implementation-planning skill 创建结构化修复计划,避免盲目修改导致混乱。
1.X 为占位符,详见 requirements-workshop/SKILL.md。真实路径必须替换为具体数字(如 workplace/1/tech-design/)。
没有根因调查,就不允许提修复方案
未完成 Phase 1 之前,不能提出任何修复建议。
适用于任何技术问题:测试失败、生产 bug、异常行为、性能问题、构建失败、集成问题。
以下场景尤其需要严格遵循流程:问题看似简单、有时间压力、已多次修复未果、上次修复未生效、未完全理解问题时。
每个阶段必须完成后才能进入下一阶段。
在提出任何修复之前:
仔细阅读错误信息
稳定复现
检查近期变更
多组件系统收集证据
当系统有多个组件(CI → 构建 → 签名,API → 服务 → 数据库):
在提出修复之前,添加诊断埋点:
对每个组件边界:
- 记录进入组件的数据
- 记录离开组件的数据
- 验证环境/配置传播
- 检查每层状态
运行一次收集证据,定位故障出现在哪一层
再针对该组件深入调查
追踪数据流
当错误在调用栈深处:
参见 references/root-cause-tracing.md 的完整回溯追踪技术。
简版:
不确定是哪个测试造成污染时:
使用 scripts/find-polluter.sh 二分定位:
./scripts/find-polluter.sh '.git' 'src/**/*.test.ts'
⚠️ 特殊情形:测试通过但主流程不对
如果你发现"测试全部通过,但手动跑主流程明显不正常",这是降级逻辑的典型信号,在继续 Phase 2 之前先做降级排查:
搜索代码中的降级信号:
- catch 后返回假成功(try { ... } catch { return { success: true } })
- 功能缩水:声称实现A,实际执行B(如"上传文件"只存了文件名)
- 条件跳过:if (error || !config) return defaultValue
- Mock泄漏:硬编码返回值残留在生产路径
- 静默忽略:日志打印错误但继续往下走
找到降级逻辑后,先移除它,再重新从 Phase 1 步骤 1 开始——因为降级逻辑一旦移除,真实错误才会暴露出来,之前的错误信息和复现步骤很可能会变化。
修复前先找模式:
找正常工作的参照
对比参考实现
识别差异
理解依赖
科学方法:
提出单一假设
最小化测试
验证后再继续
不懂就说不懂
根因未确认前,禁止提出修复方案
在进入实施之前,评估修复的规模和复杂度。这是本 skill 区别于普通调试流程的关键步骤。
对已确认的根因,评估以下维度:
| 维度 | 小修 | 大修 | |------|------|------| | 涉及文件数 | ≤ 3 个文件 | > 3 个文件 | | 涉及模块 | 单一模块 | 跨模块/跨层 | | 预估工时 | < 4 小时 | ≥ 4 小时 | | 变更性质 | 逻辑修正/参数调整 | 架构调整/接口变更/新增组件 | | 测试影响 | 修改少量测试 | 需要新增测试套件/重构测试结构 | | 前后端 | 仅一端 | 前后端都需改动 |
小修(满足以下全部条件)→ 直接进入 Phase 5:
大修(满足以下任一条件)→ 联动 implementation-planning:
当判断为大修时:
整理修复方案概要
检查技术方案是否已存在(只读引用)
workplace/1.X/tech-design/ 下有相关技术方案 → 引用其架构、数据模型、API 设计等章节作为修复依据调用 implementation-planning skill
[BUGFIX] 前缀,区分于正常需求开发plan-execution skill 执行修复计划模板补充
联动生成的计划中,每个模块详情需额外包含:
**关联根因**:[本模块修复的根因部分]
**风险点**:[本模块修改可能影响的现有行为]
**回退方案**:[如果修复引入新问题如何回退]
计划末尾增加回归验证模块:
### M{N}: 回归验证
**目标**:确认修复未引入新问题
**层**:跨层
**前置依赖**:所有修复模块
**子步骤**:
1. 运行全量测试套件
2. 验证原 bug 场景已修复
3. 检查关联功能的回归
**验收标准**:
- 全量测试 PASS
- 原 bug 复现步骤不再触发
- 关联功能无回归
向用户说明
根据 Phase 4 的决策,走两条路线:
创建失败测试用例
实施单一修复
涉及超时/等待场景时,参见
references/condition-based-waiting.md用条件轮询替代任意超时。
验证修复
修复验证通过后,参见
references/defense-in-depth.md考虑在多个层添加防御,防止同类问题复现。
修复未生效
3+ 次修复失败:质疑架构
架构问题的信号:
停下来质疑根本问题:
在尝试更多修复前,与用户讨论。
这不是假设失败——这是架构选错了。
→ 此时应联动 implementation-planning,将架构重构作为正式计划推进。
修复计划由 implementation-planning 生成后,调用 plan-execution skill 按模块顺序逐个实施,最后一个模块为回归验证。
修复完成后(无论 Route A 还是 Route B),将排查过程与结论记录到 workplace/1.X/troubleshooting/:
命名:YYYY-MM-DD-{问题关键词}-排查报告.md
# {问题关键词} 排查报告
## 问题描述
- 现象:[错误信息/异常行为]
- 复现步骤:[步骤]
- 影响范围:[受影响功能/用户]
## 根因分析
- 根因:[一句话]
- 证据链:[Phase 1-3 收集的关键证据]
- 排除的假设:[已验证不成立的其他假设]
## 修复内容
- 修复方式:[一句话]
- 修改文件:[列表]
- 新增测试:[测试文件路径 + 覆盖场景]
## 验证结果
- 测试执行:[命令 + 输出]
- 回归检查:[确认无破坏其他功能]
## 经验教训(可选)
- [根因类型、预防措施、对架构的启示]
填写说明:
自检:
当你发现自己在想以下任何一条,立即回到 Phase 1:
| 红灯思维 | 为什么必须停下 | |----------|---------------| | "先快速修一下,回头再查" | 第一次修复定基调,从头就做对 | | "改一下 X 试试看" | 没根因就动手 = 瞎猜 | | "把几个改动一起提交" | 无法隔离哪个有效,还会引入新 bug | | "跳过测试,我手动验证" | 没测试的修复靠不住,测试先证明问题存在 | | "大概是 X 的问题,我先改了" | 看到症状 ≠ 理解根因 | | "不完全理解但这样可能行" | 一知半解必定出 bug | | "参考文档太长,我按自己的方式来" | 完整阅读参考实现 | | "问题很简单,不需要流程" | 简单问题也有根因,流程对简单 bug 更快 | | "紧急,没时间走流程" | 系统排查比瞎猜快 | | "再试一次修复"(已失败 2+ 次) | 3+ 次失败 = 架构问题,质疑模式不要继续试(见 Phase 5 路线 A 步骤 5) | | 每次修复都在不同位置暴露新问题 | 架构选错了,联动 implementation-planning 推进重构 | | "大修就直接动手改吧" | 大修没有计划必乱,用 implementation-planning 管住范围 | | "测试全通过但功能不对,先继续修" | 测试通过≠功能正确,先排查是否有降级逻辑让错误变隐形(见 Phase 1 步骤 4) | | "加个catch处理一下这个错误" | catch掩盖错误就是降级逻辑,必须先搞清楚为什么会有这个错误 | | "这里加个fallback值保证不崩" | fallback是在掩盖根因,问题还在,只是看不见了 |
注意这些提示:
看到这些信号时:停下来,回到 Phase 1。
| 阶段 | 关键活动 | 成功标准 | |------|----------|----------| | 1. 根因调查 | 读错误、复现、查变更、收证据 | 理解"是什么"和"为什么" | | 2. 模式分析 | 找参照、对比差异 | 识别关键差异 | | 3. 假设验证 | 提出假设、最小测试 | 假设确认或提出新假设 | | 4. 规模评估 | 评估修复范围和复杂度 | 判定小修直接修 / 大修走计划 | | 5. 修复实施 | 小修:测试→修复→验证→产出报告 / 大修:按计划执行→产出报告 | bug 解决,排查报告已归档 |
如果系统调查后发现问题是环境、时序或外部因素导致的:
但注意: 95% 的"找不到根因"其实是调查不够深入。
以下技术是本 skill 的一部分,参考文档位于 references/,配套脚本位于 scripts/:
references/root-cause-tracing.md - 沿调用栈回溯追踪 bug 到原始触发点(配套脚本 scripts/find-polluter.sh)references/defense-in-depth.md - 找到根因后在多个层添加验证references/condition-based-waiting.md - 用条件轮询替代任意超时(配套实现见 scripts/condition-based-waiting-example.ts)| Skill | 关系 | |-------|------| | implementation-planning | 修复规模大时(>3 文件/跨模块/≥4h),创建结构化修复计划 | | tech-design | 大修时只读引用已有技术方案(架构/数据模型/API 等章节),不得创建新的技术方案文档 | | plan-execution | 大修修复计划创建后,按模块顺序执行开发与验证 |
development
基于已确认的需求简报创建简洁的实现契约。当需求已确认,用户要求技术方案、实现方案、API 或数据设计、代码变更契约时使用。本 skill 只设计方案,不写生产代码。
content-media
将项目想法或功能请求澄清为简洁、聚焦决策的需求简报。当用户想讨论需求、确定范围、把想法整理成开发前输入,或为 tech-design-v2 准备需求材料时使用。本 skill 只产出需求,不做技术方案或代码实现。
development
项目开发 v2 skill 套件的共享政策和交付契约。当维护、审查、分享或挂载 requirements-workshop-v2、tech-design-v2、implementation-planning-v2、plan-execution-v2 使用的公共文档时使用;当任务涉及 v2 提问策略、交付契约或禁止模拟完成策略时也使用。
development
审查项目开发 v2 流程中的需求文档、技术方案、实施计划、执行结果和跨文档一致性。当用户要求评估、审查、检查、对比、把关 requirements-workshop-v2、tech-design-v2、implementation-planning-v2、plan-execution-v2 的产物,或进入下一阶段前确认文档/执行证据是否可靠时使用。本 skill 只做审查和修订建议,不直接生成新需求、技术方案、计划或代码。