debugging-protocol について
修正前の根本原因調査を求め、四段階の手順で結果を検証するデバッグ用エージェントスキルです。推測による修正を避け、仮説が続けて失敗した場合に問題を再評価したい開発者向けです。
主な機能
- 01修正前にエラーと再現情報を収集
- 02動作する例と比較して差異を特定
- 03明確な仮説を一度に一つ検証
- 04テストで根本原因への修正を検証
- 05三回失敗したら修正を止めてエスカレーション
活用シーン
- 01再現可能なソフトウェアの不具合を調査
- 02未検証の症状への対処を回避
- 03修正仮説が複数回失敗した後に問題を再検討
- 04TDD 中の予期しないテスト失敗を分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jwilger/ agent-skills --skill debugging-protocolインストール後、Claude Code で/debugging-protocolを入力して読み込まれたか確認します。
詳細
デバッグプロトコル
価値: フィードバック――体系的な調査が理解をもたらします。 理解が正しい修正を生みます。正しい修正が再発を防ぎます。 調査を省略すると、バグを隠す症状への対処になってしまいます。
目的
修正を試みる前に根本原因の分析を徹底する、規律ある4段階のデバッグプロセスを指導します。問題が存在する理由を理解せずに修正へ飛びつくという、最もよくあるデバッグの失敗を防ぎます。
実践
鉄則:調査なしに修正しない
根本原因の調査を完了するまでは、バグを修正するためにコードを変更してはいけません。エラーを見てすぐに修正方法が分かったと思ったときこそ、間違っている可能性が最も高いタイミングです。まず調査してください。
実施すること:
- ほかのことをする前に、エラーメッセージとスタックトレースをすべて読む
- 調査の前に、バグを一貫して再現する
- 何が壊れているかだけでなく、なぜ壊れているかを理解する
実施しないこと:
- null ポインターエラーを見て、ヌルチェックを追加する(症状への対処)
- うまくいくものが見つかるまで「あれこれ試す」(行き当たりばったりのデバッグ)
- 「簡単な問題だから」と調査を省略する
フェーズ1:失敗を理解する
事実を集めます。まだ解釈はしません。
- エラーメッセージ全体を読む――最初の1行だけでなく、すべての行を読む
- 失敗が発生する正確なファイルと行を特定する
- 失敗を一貫して再現する(再現しない場合は、それも重要な情報です)
- 最近の変更を確認する:
git log --oneline -10とgit diff - データフローを記録する:問題の値はどこから来るのか?
成果物: 何が、どこで、いつから起きているのかを明確に説明した記述。
フェーズ2:正常に動作する例を見つける
壊れているものと動作しているものを比較します。その違いがバグです。
- 正しく動作している類似のコードを見つける
- セットアップ、入力、状態、設定を比較する
- 正常なケースと失敗するケースの違いを特定する
- 依存関係を確認する:ライブラリが更新されたか?環境が変わったか?
成果物: 正常なケースと失敗するケースの具体的な違い。
フェーズ3:仮説を1つ検証する
明確で具体的な仮説を1つ立てます。変更を1つ加えて検証し、その結果から学びます。
- 仮説を述べる:「[証拠]から、バグの原因は[X]だと考えます」
- 検証のために変更を1つ加える
- 結果を観察する
- 仮説が間違っていた場合は、変更を完全に元に戻す
- 学んだことを踏まえて、新たな仮説を立てる
複数のことを同時に変更しないでください。インポート、型、ロジックを同時に変更すると、どの変更が影響したのか分からなくなります。
成果物: 証拠によって確認または否定された仮説。
フェーズ4:修正して検証する
根本原因を理解しているため、確信を持って修正します。
- バグを再現する失敗テストを書く(まだ存在しない場合)
- フェーズ3で特定した根本原因を対象に修正を実装する
- 検証する:新しいテストが成功し、既存のテストもすべて成功する
- 症状ではなく、原因を修正したことを確認する
成果物: テストによって裏付けられ、すべてのテストが成功する修正。
エスカレーション:3回失敗したら停止する
修正を3回試してもうまくいかなければ、停止してください。問題はあなたが考えているものとは異なります。
3回目の失敗後:
- 修正を試みるのを完全に停止する
- 試したことと、それぞれの試みが失敗した理由を記録する
- 自分の前提を疑う:抽象化が間違っているのか?ドメインモデルが間違っているのか?問題そのものを取り違えているのか?
- より広い視点を求める――アーキテクチャレビュー、ドメインの専門家、またはユーザーへのエスカレーション
修正が3回失敗するのは、ほぼ常にコードの問題ではなく、設計上の問題を示しています。コードをさらに修正しても解決にはなりません。
例:
Attempt 1: Add caching (hypothesis: slow queries) -> Still slow
Attempt 2: Add index (hypothesis: missing index) -> Still slow
Attempt 3: Eager loading (hypothesis: N+1) -> Still slow
STOP. Profile the system.
Result: 90% of time in external API call. Not a database problem at all.
適用に関する注記
- スタンドアロンモード:推奨事項です。鉄則の遵守は各自に委ねられます。
- パイプラインモード:ゲートとして機能します。TDDゲートを通過して修正コミットを受け入れるには、デバッグの証拠が必要です。
厳守事項:
- 鉄則(修正前に調査する):
[H] - 3回失敗した場合のエスカレーション:
[RP]
制約
- 鉄則:調査を省きたいという誘惑は、修正方法が明白に思えるときに最も強くなります。だからこそ、そのようなときに調査が最も重要です。間違った「明白な」修正は、調査にかかったはずの時間以上に時間を無駄にするからです。このバグは調査不要な例外だと考えているなら、鉄則に反しています。
- 3回まで:仮説が3回続けて失敗したなら、問題はあなたが考えているものとは異なります。「止める」とは、修正を止めて調査に戻ることです。作業全体を止めるという意味ではありません。前提を見直し、調査範囲を広げ、関連するシステムを確認してください。それでも根本原因を特定できない場合は、エスカレーションしてください。
- 失敗した仮説を元に戻す:「完全に元に戻す」とは、仮説を検証する前の状態にコードベースを正確に戻すことです。「ほぼ元に戻したが、いくつかの改善は残した」ではありません。「メインファイルは元に戻したが、デバッグログは残した」でもありません。失敗した仮説に基づく変更は、すべて元に戻してください。
検証
このスキルに沿ってデバッグした後、以下を確認してください。
- コードを変更する前に、フェーズ1の調査を完了した
- エラーメッセージ全体を読んだ(最初の行だけではない)
- バグを一貫して再現できた
- 比較対象となる、正常に動作する例を見つけた
- 修正を試みる前に、明確な仮説を示した
- 仮説の検証ごとに、変更を1つだけ加えた
- 新たな仮説を試す前に、失敗した仮説の変更を元に戻した
- 修正を実装する前に、失敗するテストを書いた、またはそのテストがあることを確認した
- 修正後にすべてのテストがパスすることを確認した
- エスカレーションせずに、修正の試行を3回以上行わなかった
いずれかの基準を満たしていない場合は、該当するフェーズを再確認してください。
依存関係
このスキルは単独で動作し、必須の依存関係はありません。以下と連携します。
- tdd: TDD中にテストが予期せず失敗した場合、このスキルに従ってコードを変更する前に調査します
- user-input-protocol: デバッグ中に判断が曖昧な場面に達した場合、推測せずに一時停止してユーザーに尋ねます
- domain-modeling: 3回修正に失敗した場合、根本原因はドメインモデリングの問題である可能性があります。ドメインレビューにエスカレーションしてください
依存関係が不足していますか?次のコマンドでインストールしてください。
npx skills add jwilger/agent-skills --skill tdd