mcpField
S
systematic-debugging

systematic-debugging

github.com/zenobi-us開発6847 回インストール今日更新
リポジトリ

systematic-debugging について

systematic-debuggingは、開発者やコーディングエージェント向けの技術問題の調査スキルです。修正前の根本原因調査を原則とし、証拠収集、仮説検証、実装、確認を4段階で進めます。

主な機能

  1. 014段階のデバッグ手順
  2. 02修正前の根本原因調査
  3. 03複数コンポーネント間の証拠収集
  4. 04仮説を一つずつ検証
  5. 05根本原因に対する修正のテストと確認

活用シーン

  1. 01テストやビルドの失敗調査
  2. 02本番のバグや予期しない動作の追跡
  3. 03性能や連携の問題の診断

インストール

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

$npx skills add https://github.com/zenobi-us/dotfiles --skill systematic-debugging

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

CREATION-LOG.md
test-academic.md
test-pressure-1.md
test-pressure-2.md
test-pressure-3.md

詳細

Systematic Debugging

概要

ランダムな修正は時間を無駄にし、新たなバグを生みます。応急処置では根本的な問題が覆い隠されます。

基本原則: 修正を試みる前に、必ず根本原因を見つけてください。症状への対処は失敗です。

このプロセスを文字どおりに守らないことは、デバッグの精神に反することです。

鉄則

NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST

フェーズ 1 を完了していない場合、修正を提案することはできません。

使用する場面

あらゆる技術的な問題で使用してください:

  • テストの失敗
  • 本番環境のバグ
  • 予期しない動作
  • パフォーマンスの問題
  • ビルドの失敗
  • 統合に関する問題

特に次の場合に使用してください:

  • 時間に追われているとき(緊急時は推測に頼りたくなります)
  • 「ちょっとした修正ですぐ直せる」と思えるとき
  • すでに複数の修正を試したとき
  • 以前の修正が機能しなかったとき
  • 問題を十分に理解していないとき

次の場合も省略しないでください:

  • 問題が単純に見えるとき(単純なバグにも根本原因はあります)
  • 急いでいるとき(急ぐと必ず手戻りが発生します)
  • マネージャーが「今すぐ」修正するよう求めているとき(場当たり的に対処するより、体系的に進めるほうが速いです)

4 つのフェーズ

次のフェーズに進む前に、各フェーズを必ず完了してください。

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

修正を試みる前に、必ず次を行ってください:

  1. エラーメッセージを注意深く読む

    • エラーや警告を読み飛ばさない
    • 正確な解決策が含まれていることがよくあります
    • スタックトレースを最後まで読む
    • 行番号、ファイルパス、エラーコードを記録する
  2. 一貫して再現させる

    • 確実に発生させられますか?
    • 正確な手順は何ですか?
    • 毎回発生しますか?
    • 再現できない場合 → 推測せず、さらにデータを集める
  3. 最近の変更を確認する

    • これを引き起こした可能性のある変更は何ですか?
    • Git の差分、最近のコミット
    • 新しい依存関係、設定の変更
    • 環境の違い
  4. 複数コンポーネントからなるシステムで証拠を集める

    システムが複数のコンポーネントで構成されている場合(CI → build → signing、API → service → database など):

    修正を提案する前に、診断用の計測を追加してください:

    For EACH component boundary:
      - Log what data enters component
      - Log what data exits component
      - Verify environment/config propagation
      - Check state at each layer
    
    Run once to gather evidence showing WHERE it breaks
    THEN analyze evidence to identify failing component
    THEN investigate that specific component
    

    例(多層システム):

    # Layer 1: Workflow
    echo "=== Secrets available in workflow: ==="
    echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
    
    # Layer 2: Build script
    echo "=== Env vars in build script: ==="
    env | grep IDENTITY || echo "IDENTITY not in environment"
    
    # Layer 3: Signing script
    echo "=== Keychain state: ==="
    security list-keychains
    security find-identity -v
    
    # Layer 4: Actual signing
    codesign --sign "$IDENTITY" --verbose=4 "$APP"
    

    これにより、どの層で失敗しているかがわかります(secrets → workflow ✓、workflow → build ✗)。

  5. データフローを追跡する

    エラーがコールスタックの深い位置にある場合:

    必須のサブスキル: 逆方向に追跡する手法には superpowers:root-cause-tracing を使用してください

    簡易版:

    • 不正な値はどこから来ていますか?
    • どの処理が不正な値を渡してこれを呼び出しましたか?
    • 発生源が見つかるまで上流へ追跡を続ける
    • 症状ではなく、発生源を修正する
フェーズ 2:パターン分析

修正する前に、パターンを見つけてください:

  1. 正常に動作する例を探す

    • 同じコードベース内で、類似した正常動作のコードを見つける
    • 壊れている箇所と似ていて、正常に動作するものは何ですか?
  2. リファレンスと比較する

    • パターンを実装する場合は、リファレンス実装を最後まで読む
    • ざっと読まず、すべての行を読む
    • 適用する前に、パターンを十分に理解する
  3. 違いを特定する

    • 正常に動作するものと壊れているものの違いは何ですか?
    • どんなに小さな違いでも、すべて列挙する
    • 「関係ないはず」と決めつけない
  4. 依存関係を理解する

    • ほかにどのコンポーネントが必要ですか?
    • 必要な設定、コンフィグ、環境は何ですか?
    • どのような前提で動作しますか?
フェーズ 3:仮説と検証

科学的手法:

  1. 仮説を 1 つ立てる

    • 「Y であるため、X が根本原因だと考えます」と明確に述べる
    • 書き留める
    • 曖昧にせず、具体的にする
  2. 最小限のテストを行う

    • 仮説を検証するため、可能な限り最小の変更を加える
    • 一度に変更する変数は 1 つだけにする
    • 一度に複数の問題を修正しない
  3. 続行する前に検証する

    • うまくいきましたか? はい → フェーズ 4
    • うまくいきませんでしたか? 新しい仮説を立てる
    • さらに修正を重ねない
  4. わからないとき

    • 「X が理解できません」と伝える
    • わかったふりをしない
    • 助けを求める
    • さらに調査する
フェーズ 4:実装

症状ではなく、根本原因を修正してください:

  1. 失敗するテストケースを作成する

    • できる限りシンプルに再現する
    • 可能であれば自動テストを作成する
    • テストフレームワークがなければ、単発のテストスクリプトを作成する
    • 修正前に必ず実施する
    • 必須のサブスキル: 適切な失敗テストを作成するには、superpowers:test-driven-development を使用してください
  2. 修正を 1 つ実装する

    • 特定した根本原因に対処する
    • 一度に変更するのは 1 つだけ
    • 「ついでに」改善しない
    • リファクタリングをまとめて行わない
  3. 修正を検証する

    • テストは通るようになったか?
    • ほかのテストに問題はないか?
    • 問題は実際に解決したか?
  4. 修正がうまくいかない場合

    • 停止する
    • 試した修正の数を数える
    • 3 回未満の場合:フェーズ 1 に戻り、新しい情報をもとに再分析する
    • 3 回以上の場合:停止して、アーキテクチャに疑問を持つ(以下のステップ 5)
    • アーキテクチャについて話し合わずに、修正 #4 を試みない
  5. 修正に 3 回以上失敗した場合:アーキテクチャに疑問を持つ

    アーキテクチャ上の問題を示すパターン:

    • 修正するたびに、別の場所で新たな共有状態、結合、問題が見つかる
    • 修正を実装するために「大規模なリファクタリング」が必要になる
    • 修正するたびに、ほかの場所で新たな症状が発生する

    停止して、根本的な前提に疑問を持つ:

    • このパターンは根本的に妥当か?
    • 「ただ惰性で続けている」のではないか?
    • 症状の修正を続けるのではなく、アーキテクチャをリファクタリングすべきではないか?

    さらに修正を試みる前に、人間のパートナーと話し合ってください。

    これは仮説が間違っていたのではありません。アーキテクチャが間違っています。

危険信号 — 停止してプロセスに従う

次のように考えていることに気づいたら:

  • 「とりあえず応急処置をして、調査は後で」
  • 「X を変えて、うまくいくか試してみよう」
  • 「複数の変更を加えて、テストを実行しよう」
  • 「テストは省略して、手動で確認しよう」
  • 「おそらく X だろう。修正してみよう」
  • 「完全には理解していないけれど、これでうまくいくかもしれない」
  • 「パターンでは X となっているが、違う方法に適用しよう」
  • 「主な問題はこれです:[調査せずに修正を列挙する]」
  • データフローを追跡する前に解決策を提案する
  • 「もう 1 回修正を試そう」(すでに 2 回以上試している場合)
  • 修正するたびに、別の場所で新たな問題が見つかる

これらに当てはまる場合はすべて、停止してフェーズ 1 に戻ってください。

修正に 3 回以上失敗した場合: アーキテクチャに疑問を持ってください(フェーズ 4.5 を参照)。

人間のパートナーが示す「うまくできていない」サイン

次のような方向修正の言葉に注意してください:

  • 「それは起きていないのでは?」 — 検証せずに決めつけています
  • 「それで……が分かるの?」 — 証拠を集めるべきでした
  • 「推測はやめて」 — 理解せずに修正を提案しています
  • 「徹底的に考えて」 — 症状だけでなく、根本的な前提に疑問を持ってください
  • 「行き詰まっているの?」(苛立った様子) — そのアプローチはうまくいっていません

こうしたサインが見られたら: 停止してフェーズ 1 に戻ってください。

よくある自己正当化

言い訳実態
「問題は単純だから、プロセスは必要ない」単純な問題にも根本原因はあります。単純なバグなら、プロセスを踏んでも迅速に解決できます。
「緊急事態だから、プロセスにかける時間がない」系統立てたデバッグは、当てずっぽうを繰り返すより速く進みます。
「まずこれを試してから調査しよう」最初の修正が、その後の進め方の基準になります。最初から正しく進めてください。
「修正がうまくいったことを確認してから、テストを書こう」テストしていない修正は定着しません。先にテストすれば、修正の効果を確認できます。
「一度に複数の修正をすれば時間を節約できる」何が効果を上げたのか切り分けられず、新たなバグの原因にもなります。
「参考資料が長すぎるから、パターンを応用しよう」不完全な理解は、必ずバグにつながります。最後まで読んでください。
「問題が分かったから、修正しよう」症状が見えたことと、根本原因を理解したことは別です。
「もう 1 回修正を試そう」(2 回以上失敗した後)3 回以上の失敗は、アーキテクチャ上の問題を示しています。パターンに疑問を持ち、再度の修正は避けてください。

クイックリファレンス

フェーズ主な作業成功基準
1. 根本原因エラーを読む、再現する、変更を確認する、証拠を集める何が、なぜ起きているかを理解する
2. パターン動作する例を探し、比較する違いを特定する
3. 仮説理論を立て、最小限のテストを行う仮説を確認するか、新しい仮説を立てる
4. 実装テストを作成し、修正して検証するバグが解決し、テストが通る

プロセスを尽くしても「根本原因が見つからない」場合

体系的に調査した結果、問題が本当に環境依存、タイミング依存、または外部要因によるものだと判明した場合:

  1. プロセスを完了しています
  2. 調査した内容を記録します
  3. 適切な対処を実装します(再試行、タイムアウト、エラーメッセージ)
  4. 今後の調査に備えて、監視やログ記録を追加します

ただし:「根本原因が見つからない」ケースの95%は、調査が不十分です。

他のスキルとの連携

このスキルでは、以下の使用が必須です:

  • root-cause-tracing - エラーがコールスタックの深い位置にある場合は必須です(フェーズ1、ステップ5を参照)
  • test-driven-development - 失敗するテストケースの作成に必須です(フェーズ4、ステップ1を参照)

補完的なスキル:

  • defense-in-depth - 根本原因を特定した後、複数のレイヤーに検証を追加します
  • condition-based-waiting - フェーズ2で特定した任意のタイムアウトを置き換えます
  • verification-before-completion - 成功を宣言する前に、修正が機能したことを確認します

実際の効果

デバッグセッションでの結果:

  • 体系的なアプローチ:修正まで15~30分
  • 場当たり的な修正:2~3時間の試行錯誤
  • 初回での修正率:95%に対して40%
  • 新たに発生するバグ:ほぼゼロに対して頻繁

コメント