mcpField
S
systematic-debugging

systematic-debugging

github.com/pixel-process-ug開発379 回インストール33 週間前に更新
リポジトリ

systematic-debugging について

開発者向けのデバッグスキルで、段階ごとの条件を設けた4フェーズで原因を調べてからコードを変更します。再現可能な証拠と検証可能な仮説を重視し、原因が絞れない場合は設計も見直します。

主な機能

  1. 01エラー、再現手順、環境情報の収集
  2. 02正常ケースと失敗ケースの比較
  3. 03証拠に基づく仮説の個別検証
  4. 04仮説が外れた場合の設計見直し
  5. 05根本原因を把握してから修正

活用シーン

  1. 01再現可能なソフトウェア障害の調査
  2. 02問題を最小の再現例に絞り込む
  3. 03障害の背景にある環境差の確認
  4. 04仮説が続けて外れた後の設計再評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pixel-process-ug/superkit-agents --skill systematic-debugging

インストール後、Claude Code で/systematic-debuggingを入力して読み込まれたか確認します。

同梱ファイルdefense-in-depth.mdroot-cause-tracing.md

詳細

系統的なデバッグ

概要

デバッグは実験ではなく、調査です。このスキルでは、根本原因の調査、パターン分析、仮説検証、アーキテクチャの見直しという厳密な4段階のプロセスを徹底します。これにより、手当たり次第のデバッグを防ぎ、修正を適用する前にその内容を確実に理解できます。

開始時に宣言します:「この問題を調査するため、系統的なデバッグスキルを使用します。」


基本原則

┌─────────────────────────────────────────────────────────────────┐
│  HARD-GATE: NEVER GUESS. NEVER SHOTGUN DEBUG.                  │
│  NEVER CHANGE CODE WITHOUT UNDERSTANDING WHY IT IS BROKEN.     │
│                                                                 │
│  You are a detective gathering evidence, not a gambler trying   │
│  random fixes. If you are changing code without understanding   │
│  the root cause, STOP immediately.                             │
└─────────────────────────────────────────────────────────────────┘

フェーズ1:根本原因の調査

目標: 何が起きているのかを正確に把握します。何が起きていると思うかではありません。

実施項目
  1. エラーメッセージを注意深く読みます。 メッセージ全体を読みます。すべての行を確認します。スタックトレースも含みます。
  2. バグを再現します。 再現できなければ修正できません。正確な手順を見つけます。
  3. 証拠を集めます。 次の情報を収集します。
    • エラーメッセージとスタックトレースの全体
    • バグを引き起こす入力
    • 期待される動作と実際の動作
    • 環境の詳細(バージョン、設定、OS)
  4. 最近の変更を確認します。 最後に正常に動作したときから何が変わりましたか?
    • 最近のコミット(git log、git diff)
    • 依存関係の更新
    • 設定の変更
    • 環境の変更
証拠収集チェックリスト
  • エラーメッセージ全体を取得済み(途中で切れていない)
  • スタックトレースを下から上へ確認済み
  • 特定の手順でバグを安定して再現済み
  • 期待される動作と実際の動作を記録済み
  • 最近の変更を確認済み(git log --oneline -20)
  • 関連するログを確認済み
停止 — 厳格な条件:以下を満たすまでフェーズ2に進まないでください
  • バグを一貫して再現できる
  • エラーメッセージとスタックトレースの全体を確認している
  • 最近何が変わったか把握している
  • バグを正確に説明できる(曖昧ではない)

フェーズ2:パターン分析

目標: 問題がどこにあり、いつ発生するのかを絞り込みます。

実施項目
  1. 正常に動作する例を探します。 この機能は、ほかの状況や入力、環境では動作しますか?
  2. 正常なケースと壊れているケースを比較します。 動作するケースと動作しないケースには、どのような違いがありますか?
  3. 依存関係を確認します。 必要なサービス、ライブラリ、設定はすべて揃っており、正しく設定されていますか?
  4. 範囲を絞り込みます。 最小限の例で再現できますか? 不要なものをすべて取り除きます。
比較マトリクス

パターンを特定するために、次の表に記入します。

要素正常なケース問題のあるケース違いがあるか
入力データ
環境
設定
依存関係
タイミング/順序
ユーザー/権限
状態/コンテキスト
停止 — 厳格な条件:以下を満たすまでフェーズ3に進まないでください
  • 比較対象となる正常なケースを少なくとも1つ特定している
  • 正常なケースと問題のあるケースを比較し、違いを特定している
  • 再現可能な最小のケースまで範囲を絞り込んでいる
  • 依存関係(バージョン、利用可能性、設定)を確認済み

フェーズ3:仮説と検証

目標: 具体的で検証可能な仮説を1つ立て、可能な限り小さな変更で検証します。

実施項目
  1. 仮説を1つ立てます。 フェーズ1~2で得た証拠に基づき、最も可能性の高い原因は何ですか?
    • 明確に述べます:「このバグは、[具体的な原因]によって発生する」
    • 具体的に述べられない場合は、フェーズ1または2に戻ります
  2. 最小限のテストを設計します。 この仮説を検証または否定するために、どのような最小の変更が必要ですか?
    • 本番コードを変更するより、テストケースの追加を優先します
    • コード変更より、ログやアサーションを優先します
    • 新しいコードを書くより、変更を元に戻すことを優先します
  3. 変更を適用してテストします。
    • 仮説の検証に必要な変更だけを行います
    • テストスイートを実行します
    • 結果を観察します
  4. 評価します。
    • 確認できた場合:修正に進み、リグレッションテストを書きます
    • 否定された場合:学んだことを記録し、新しい仮説を立てて、手順1に戻ります
仮説ログのテンプレート
Hypothesis #1: [description]
Test: [what you did]
Result: CONFIRMED / DENIED
Learning: [what this taught you]

Hypothesis #2: ...
判断表:仮説検証のアプローチ
仮説の種類検証方法例
最近のコード変更が原因git bisect またはコミットの取り消し「コミット abc123 でバグが混入した」
データ形状の不一致ログまたはアサーションを追加「API が配列ではなく null を返す」
競合状態タイミングログを追加するか、直列化する「リクエスト A より先にリクエスト B が完了する」
設定エラー環境間で設定を比較する「本番環境では異なる DB ホストが使われている」
依存関係のバージョンの問題確実に動作するバージョンに固定する「ライブラリ 2.0 で API の仕様が変更された」
停止 — 必須条件:以下を満たさない限り、フェーズ 4 に進まないでください:
  • 少なくとも 3 つの仮説を検証し、すべて否定した
  • 各仮説が具体的で検証可能だった
  • 各テストが最小限だった(一度に変更するのは 1 つだけ)
  • 否定された各仮説から得た知見を記録した

フェーズ 4:アーキテクチャへの問いかけ

目標: 3 つ以上の仮説が失敗した場合、問題は構造的なものかもしれません。一歩下がって、前提を問い直してください。

このフェーズは、フェーズ 3 を少なくとも 3 回試しても成功しなかった場合にのみ開始します。

アクション
  1. 前提を問い直してください。 真実だと思い込んでいることのうち、そうでない可能性があるものは何ですか?
    • データの形状は、想定どおりですか?
    • 制御フローは、期待どおりですか?
    • 型は、想定どおりですか?
    • API コントラクトは、想定したとおりですか?
  2. 設計を問い直してください。 現在のアプローチに根本的な欠陥はありませんか?
    • 設計に競合状態はありませんか?
    • 状態管理に問題はありませんか?
    • 抽象化が誤っていませんか?
    • 責務の割り当てが適切ではありませんか?
  3. 再設計を検討してください。 修正ではなく、構造の見直しが必要な場合もあります。
    • バグのクラス全体をなくすよう、設計を簡素化できますか?
    • このケースをより適切に処理するパターンはありますか?
    • 修正するのではなく、置き換えるべきですか?
  4. 外部の意見を求めてください。 行き詰まった場合:
    • 他の人に問題を説明します(ラバーダックデバッグ)
    • 依存関係に既知の問題がないか検索します
    • 同様の問題に遭遇した人がいないか確認します
停止 — 必須条件:以下を満たさない限り、先に進まないでください:
  • 問い直した前提を記したリスト
  • 明確な決定:現在の設計を修正する、または再設計する
  • 再設計する場合:実装前の計画
  • 修正する場合:前提の見直しを踏まえた新しい仮説

デバッグの判断フローチャート

Error encountered
    |
    v
Can you reproduce it?
    |
    +-- NO --> Gather more information (logs, user reports, monitoring)
    |          Try different inputs, environments, timing
    |          Do NOT proceed until reproducible
    |
    +-- YES -> Read the FULL error message and stack trace
               |
               v
         Is the cause obvious from the error?
               |
               +-- YES -> Form hypothesis, test it (Phase 3)
               |          Still write a regression test
               |
               +-- NO --> Complete Phase 1 evidence gathering
                          |
                          v
                    Find working case for comparison (Phase 2)
                          |
                          v
                    Identify differences
                          |
                          v
                    Form and test hypotheses (Phase 3)
                          |
                          +-- Fixed --> Write regression test, verify
                          |
                          +-- 3+ failed hypotheses --> Phase 4

危険信号の表

危険信号意味対処
バグを理解せずにコードを変更する手当たり次第のデバッグフェーズ 1 に戻る
修正できたが理由がわからない偶然の修正で、再発する可能性が高い理解できるまで調査する
同じバグが繰り返し発生する根本原因に対処できていないフェーズ 4 に進み、設計を問い直す
修正によって別の場所に新たなバグが発生する想定外の結合先に進む前に依存関係を図示する
「自分のマシンでは動く」環境の違いフェーズ 2 に進み、比較マトリックスを確認する
修正に 20 行を超えるコードが必要設計上の問題かもしれないフェーズ 4 に進む
デバッグが 30 分以上続いている視野狭窄休憩し、フェーズ 1 の証拠を読み直す
同じコードを何度も読み返している根本的な何かを見落としている新しい視点を得て、声に出して説明する
複数の原因が同じ程度にありそうに思える調査が不十分フェーズ 1 に戻り、さらに証拠を集める

反パターン/よくある間違い

反パターンなぜ間違っているのか正しいアプローチ
バグが解消するか確かめるために、手当たり次第に変更する時間を浪費し、新たなバグを引き起こしますまず仮説を立てます
エラーを抑えるために try/catch を追加する根本的な問題を隠してしまいます根本原因を修正します
機能を一から書き直す最終手段が必要になることはほとんどありません問題を特定して修正します
証拠もなくフレームワーク/ライブラリのせいにする通常はコードに問題があります最小限の再現コードで、フレームワークのバグを証明します
修正後に回帰テストを省略するバグが再発します必ずテストを書きます
根本原因ではなく症状を修正するパッチが積み重なり、システムが劣化します実際の原因を突き止めます
一度立ち止まらずに45分以上デバッグを続ける視野が狭まり、効果が下がります休憩を取り、フェーズ1の証拠を読み直します
エラーメッセージやスタックトレースを無視する解決の手がかりは、多くの場合エラーにありますエラーのすべての行を読みます

統合ポイント

スキル関係
test-driven-developmentすべてのバグ修正には、必ず回帰テストを含めます(RED-GREEN サイクル)
verification-before-completionバグを修正した後、新たな証拠を使って検証します
resilient-executionタスクの実行中にデバッグする場合は、タスクを一時停止し、デバッグを完了してから再開します
code-review修正の完全性と副作用をレビューします
self-learning新たなデバッグパターンを learned-patterns.md に記録します
acceptance-testing修正によって受け入れ基準が損なわれないことを検証します

クイックリファレンス:してはいけないこと

  1. してはいけません:バグが解消するか確かめるために、手当たり次第に変更する
  2. してはいけません:エラーを抑えるために try/catch を追加する
  3. してはいけません:最初の手段として機能を一から書き直す
  4. してはいけません:証拠もなくフレームワーク/ライブラリのせいにする
  5. してはいけません:修正後に回帰テストを書くことを省略する
  6. してはいけません:根本原因ではなく症状を修正する
  7. してはいけません:一度立ち止まらずに45分を超えてデバッグを続ける
  8. してはいけません:エラーメッセージやスタックトレースを無視する

スキルの種類

RIGID — 4フェーズのプロセスは必須であり、順番どおりに実行する必要があります。次に進む前に、各フェーズのハードゲートを満たさなければなりません。なぜ壊れているのかを理解せずに、コードを変更してはいけません。

コメント