diagnosing-bugs
针对疑难 bug 和性能回退的诊断循环。当用户说 "diagnose"/"debug this",或报告某处坏了/抛错/失败/变慢时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
针对疑难 bug 和性能回退的诊断循环。当用户说 "diagnose"/"debug this",或报告某处坏了/抛错/失败/变慢时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
使用并行子代理为一个模块生成多个截然不同的接口设计。当用户想设计 API、探索接口方案、对比模块形态,或提到 "design it twice" 时使用。
交互式 QA 会话,用户以对话方式报告 bug 或问题,代理负责提交 GitHub issue。会在后台探索代码库以获取上下文和领域语言。当用户想报告 bug、做 QA、以对话方式提交 issue,或提到 "QA session" 时使用。
通过用户访谈创建一份带有微小提交(tiny commits)的详细重构计划,然后将其作为 GitHub issue 提交。当用户想规划一次重构、创建重构 RFC,或将一次重构拆分为安全的增量步骤时使用。
从当前对话中提炼出一份 DDD 风格的通用语言(ubiquitous language)术语表,标记歧义并提出规范术语。保存到 UBIQUITOUS_LANGUAGE.md。当用户想定义领域术语、构建术语表、固化用词、创建通用语言,或提到 "domain model" 或 "DDD" 时使用。
询问哪个技能或流程适合你当前的处境。它是本仓库中各技能的路由器。
从两个轴向审查某个固定点(commit、branch、tag 或 merge-base)以来的变更——Standards(代码是否遵循本仓库记录的编码规范?)和 Spec(代码是否符合源起的 issue/PRD 的要求?)。在并行子智能体中运行两项审查,并把它们并排报告。当用户想审查一个分支、一个 PR、进行中的变更,或要求 "review since X" 时使用。
| name | diagnosing-bugs |
| description | 针对疑难 bug 和性能回退的诊断循环。当用户说 "diagnose"/"debug this",或报告某处坏了/抛错/失败/变慢时使用。 |
一套应对疑难 bug 的纪律。只有在有明确理由时才跳过某个阶段。
在探索代码库时,阅读 CONTEXT.md(如果存在),以对相关模块建立清晰的心智模型,并检查你所触及区域的 ADR。
这才是本技能的核心。 其他一切都是机械性的。如果你拥有一个紧凑的、针对 bug 的通过/失败信号——一个会在_这个_ bug 上变红的信号——你就能找到病因;二分查找、假设检验和插桩都只是在消费这个信号。如果没有它,再怎么盯着代码看也救不了你。
在这里投入不成比例的精力。要激进。要有创意。拒绝放弃。
git bisect run 跑它。scripts/hitl-loop.template.sh 来驱动_他们_,让回路仍然是结构化的。捕获的输出会反馈给你。构建对了反馈回路,bug 就已经解决了 90%。
把回路当作一个产品来对待。一旦你有了_一个_回路,就收紧它:
一个 30 秒且不稳定的回路,比没有回路强不了多少;一个 2 秒且确定的回路才叫紧凑——这是调试的超能力。
目标不是干净的复现,而是更高的复现率。把触发器循环 100×、并行化、加压、缩小时间窗口、注入 sleep。50% 复现率的 bug 是可调试的;1% 则不行——不断提高复现率,直到它可调试。
停下来并明确说明。列出你尝试过的一切。向用户请求:(a) 能复现问题的环境的访问权限,(b) 一份捕获的产物(HAR 文件、日志转储、core dump、带时间戳的屏幕录制),或 (c) 添加临时生产环境插桩的许可。在没有回路的情况下,不要继续提出假设。
当回路既紧凑又能变红时,阶段 1 才算完成:你能说出一条命令——一个脚本路径、一次测试调用、一个 curl——它是你已经至少运行过一次的(把调用和它的输出贴出来),并且它是:
scripts/hitl-loop.template.sh 才会有人介入回路。如果你发现自己在这条命令存在之前就在读代码建立理论,停下——直接跳到假设正是本技能要防止的失败。 没有能变红的命令,就没有阶段 2。
运行回路。看着它变红——bug 出现了。
确认:
一旦它变红,就把复现收缩到仍会变红的最小场景。一次一个地裁掉输入、调用方、配置、数据和步骤,每裁一次就重新运行回路——只保留对失败起承重作用的部分。
为什么值得费这个功夫:最小复现缩小了阶段 3 的假设空间(剩下要怀疑的活动部件更少),并成为阶段 5 中干净的回归测试。
当每一个剩下的元素都起承重作用时即完成——移除其中任何一个都会让回路变绿。
在你完成复现且最小化之前,不要继续。
在测试任何假设之前,先生成3–5 个排序的假设。单一假设的生成会把你锚定在第一个看似合理的想法上。
每个假设都必须是可证伪的:陈述它所做出的预测。
格式:「如果 是原因,那么 <改变 Y> 会让 bug 消失 / <改变 Z> 会让它更严重。」
如果你说不出这个预测,那这个假设就只是一种感觉——丢弃它或把它磨锐利。
在测试前把排序好的清单展示给用户。 他们往往有能瞬间重新排序的领域知识(「我们刚给 #3 部署了一个改动」),或者知道他们已经排除的假设。廉价的检查点,节省大量时间。别为此阻塞——如果用户不在(AFK),就按你的排序继续。
每个探针都必须对应阶段 3 中的一个具体预测。一次只改变一个变量。
工具偏好:
给每条调试日志打上标签,用一个唯一前缀,例如 [DEBUG-a4f2]。这样最后的清理就变成一次 grep。没打标签的日志会残留;打了标签的日志会被清除。
性能分支。 对于性能回退,日志通常是错误的做法。相反:先建立一个基线测量(计时脚手架、performance.now()、性能分析器、查询计划),然后二分。先测量,后修复。
在修复之前先写回归测试——但仅当存在一个正确的接缝时。
正确的接缝是指测试在调用点上触发真实 bug 模式的那种接缝。如果唯一可用的接缝太浅(当 bug 需要多个调用方时却只有单调用方的测试,或者无法复现触发 bug 的调用链的单元测试),那里的回归测试会给出虚假的信心。
如果不存在正确的接缝,这本身就是一个发现。 记下它。代码库架构正在阻止 bug 被锁定。把这一点标记出来交给下一阶段。
如果存在正确的接缝:
在宣布完成之前必须做到:
[DEBUG-...] 插桩都已移除(grep 那个前缀)然后问:什么本可以预防这个 bug? 如果答案涉及架构变更(没有好的测试接缝、调用方纠缠、隐藏的耦合),就带着具体细节交给 /improve-codebase-architecture 技能。这个建议要在修复到位之后给出,而不是之前——你现在掌握的信息比开始时多。