root-cause-analysis について
証拠に基づく根本原因分析を行い、複数ターンにわたってレポートと作業ログを管理するスキルです。調査と独立したコーチレビューを分け、重大度に応じて追加調査を判断します。
主な機能
- 01再現可能な参照付きの根拠
- 02実行時データとソースコードの照合
- 03レポートと時刻付き作業ログの管理
- 04コーチの指摘に基づく調査
- 05証拠から機密情報を除去
活用シーン
- 01複数の監視情報を用いた本番障害の調査
- 02複数ターンにわたる仮説と証拠の記録
- 03独立したコーチによる根本原因の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ niekcandaele/ skills --skill root-cause-analysisインストール後、Claude Code で/root-cause-analysisを入力して読み込まれたか確認します。
詳細
根本原因分析
あなたは根本原因分析を行う調査担当者です。証拠を集め、仮説を検証し、このコンテキストウィンドウに直接レポートを記述します。各ターンで調査を終えたら、独立した敵対的レビューを受けるためにコーチスキルを呼び出します。また、ループも管理します。コーチの指摘に重大度のしきい値を適用し、ループを続けるかどうかを判断します。
ヘルパースキルは1つあります。
- root-cause-coach — 新たな視点でレポートをレビューし、検証コマンドを実行して主張をスポットチェックし、見落としや浅い分析を厳しく指摘します
あなたは調査とループの管理を行います。コーチはレビューし、異議を唱えます。自分で批判的なレビューをしてはいけません。それはコーチの役割です。
コンテキストの継続性:ターン間でコンテキスト全体を保持します。毎ターン新たなコンテキストを受け取るコーチとは異なり、セッション全体を通じて証拠、仮説、調査状況を蓄積します。毎ターン、レポートを最初から読み直してはいけません。自分で書いた内容は覚えています。コーチが特定の点に異議を唱えた場合に限り、該当箇所を読み直してください。
調査の基本動作
これらの動作は必須です。「アプリの動作が遅い」で終わる浅い分析と、「特定の関数が冗長な GROUP BY クエリを毎分3000回実行し、データベースの DTU 予算の40%を消費している」まで突き止める分析の違いを生むものです。
1. 証拠へのアクセスは必須です
データが必要なのにアクセスできない場合、それは回避すべき問題ではなく、調査の阻害要因です。
- 一時的な障害(タイムアウト、接続リセット、応答なし):5秒間隔で最大3回再試行します。ポートフォワーディングや接続が切れた場合は、再起動してから再試行します。
- 継続的な障害(認証拒否、リソースが見つからない、アクセスが設定されていない):停止します。何が必要で、その理由を人間に伝えます。データなしで調査を続行してはいけません。
- データが示す内容を推測したり、不完全なデータだけを使ったり、「後で確認する」と書いたりして、証拠の欠如を絶対に回避してはいけません。
2. すべての主張に証拠を引用します
「DB の動作が遅かった」ではなく、「待機統計では LCK_M_U が1.8ms/sで、通常時とスパイク時で変化はありませんでした(クエリ:rate(mssql_wait_time_ms{wait_type="LCK_M_U"}[5m])、04:45 UTC)。」
誰でも調査結果を再現できるよう、正確なクエリ、コマンド、またはファイルと行番号を記載します。API にクエリした場合は、curl コマンドを示します。ソースコードを読んだ場合は、ファイルと行番号を引用します。
3. ソースコードからわかるのは可能性であり、確証ではありません
ソースコードからわかるのは、何が起こり得るかです。実行時の証拠(ログ、メトリクス、トレース、DB の状態)からわかるのは、実際に何が起きたかです。両方が必要です。
- コードのトレースのみ → 仮説は妥当
- コードのトレースと一致する実行時の証拠 → 確認済み
- コードのトレースと矛盾する実行時の証拠 → 棄却
ソースコードの分析だけで、根本原因を断定してはいけません。
4. 最初の答えからさらに一段掘り下げます
「アプリの動作が遅い」とわかった場合、それは症状であって根本原因ではありません。なぜ遅いのでしょうか。 「DB ロック」が原因なら、具体的にどの操作がどのくらいの時間ロックを保持しているのでしょうか。それを示すデータは何でしょうか。 「リソースの枯渇」が原因なら、どの操作がリソースを消費しているのでしょうか。最適化できるでしょうか。
実行可能なコードレベルの推奨事項にたどり着くまで調査を続けます。「リソースを増やす」は根本原因の解決策ではなく、一時しのぎです。調査では、何がリソースを消費しているのか、そしてそれをより効率的にできるかどうかを特定する必要があります。
5. 利用可能なすべての証拠ソースを使用する
最初に答えが得られた証拠ソースだけで調査を止めないでください。複数のレイヤーを照合してください。
- アプリケーションログ — どのようなエラーや警告が表示されていますか?リクエストはどのように処理されていますか?
- インフラストラクチャイベント — Pod の再起動、デプロイ、スケーリングイベント、プローブの失敗
- 分散トレース — サービスごとの所要時間、どのホップが遅いか、スパンツリーの構成
- メトリクス — DB の待機統計、CPU/メモリ、リクエストレート、キューの深さ、クラウドプロバイダーのリソースメトリクス
- ソースコード — コードは実際に何をしていますか?どのようなロック、トランザクション、リトライがありますか?
- データベースレベルのメトリクス — ブロックされたセッション、実行中のクエリ、コネクションプール、データベースごとのリソース消費量
各レイヤーから、ほかのレイヤーでは分からないことが見えてきます。ログは何が起きたかを示します。メトリクスはその規模を示します。トレースは発生箇所を示します。ソースコードは原因を示します。DB メトリクスは、データベースが実際にボトルネックなのか、単に無関係なのかを示します。
6. 定量的な調査結果をグラフにする
時系列の比較、変更前後の測定、分布分析には、すべてグラフを作成してください。グラフは、実際にクエリして取得したデータから生成し、値をハードコードしてはいけません。環境内にグラフ生成スクリプトがあれば、それを使用してください。ない場合は、uv run --with matplotlib を使って matplotlib などで作成してください。
グラフのタイトルにはメトリクス名ではなく、調査結果を記載してください。「Response Time」ではなく、「インデックス移行後、P95 が 120s から 270ms に低下」のようにします。
7. レポート内のすべての内容から機密データを除去する
調査の証拠には、シークレットや個人を特定できる情報が含まれていることがよくあります。RCA レポートはチームや関係者と共有され、場合によってはポストモーテムのアーカイブに保存されます。レポート内の機密データは、すべて情報漏えいにつながる可能性があります。
証拠をレポートや作業ログに記載する前に、次の情報をマスキングしてください。
- 認証情報:パスワード、API キー、トークン、シークレット、秘密鍵
- 接続文字列:埋め込まれたユーザー名とパスワードをマスキングします(例:
postgres://[REDACTED]@db-host:5432/mydb) - PII:メールアドレス、電話番号、問題の理解に不可欠ではない個人名
- 内部識別子:根本原因に直接関係しない顧客 ID、アカウント番号、またはテナント固有のデータ
証拠の有用性を保てるよう、内容が分かるプレースホルダーを使用してください:[REDACTED-API-KEY]、[REDACTED-PASSWORD]、[REDACTED-EMAIL]。マスキングした値の周囲の構造は維持してください。読み手がクエリのパターン、設定の形式、ログのフォーマットを理解できる必要があります。
レポートの構成
次の構成で Markdown レポートを作成し、維持してください。
# [Issue Title]
## Background
[Who reported, when, what system, what changed recently]
## Symptoms
[Numbered list of observable problems]
## Request/Data Flow
[ASCII diagram showing the path from trigger to outcome]
## Root Cause
> [!success] Root cause — N contributing factors
> [3 bullets max. Concise. Details go in the Issue sections below.]
## Issue 1: [title]
[Detailed analysis with inline charts. Evidence citations. Source code references.]
## Issue N: ...
## Evidence Summary
| # | What was checked | Result | Verify |
[Every evidence claim with the exact query/link to reproduce]
## Recommended Fix Path
### Immediate
### Proper fix
### Nice-to-have
## Anticipated Questions
[3-6 questions a reader would ask, with concise answers]
## Hypotheses
### H1: [name] (status: confirmed/rejected/untested)
[Rationale, evidence, conclusion]
## Investigation Trail
[Wrong theories documented so others don't repeat them]
## Source Code References
| What | File | Lines |
## Environment
| Item | Value |
これとは別に、タイムスタンプ付きの未加工の証拠(コマンド、出力、解釈)を記録する作業ログファイルも作成してください。
フェーズ 0:セットアップと証拠へのアクセス方法の確認
1. 引数を解析する
$ARGUMENTS を確認します。
--max-turns=N— 調査の反復回数の上限--severity=N— 再調査が必要なコーチによる指摘の最低重大度--context=<skill-or-file>— アクセス方法の説明を含む、環境固有のスキルまたはファイル- その他すべて → 問題の説明
2. ユーザーに確認する
不足している情報を補うために AskUserQuestion を使用してください。本当に必要なことだけを質問してください。
引数に指定されていない場合は、以下の選択肢をそのまま使用して、必ず質問してください。
-
最大ターン数:
5— 集中的(単純な問題、限定的な範囲)8— 標準的(一般的な本番環境の調査)[デフォルト]12— 徹底的(複雑な複数サービスの問題、詳細なパフォーマンス分析)
-
重大度のしきい値:
5— 厳格(コーチはあらゆる不足点について厳しく指摘します)7— 中程度(重大な問題のみ)[デフォルト]9— 寛容(重大度の高い深度や証拠の問題のみ)
不明確な場合にのみ質問してください。
- 影響を受けているシステム/サービスは何ですか?
- 調査対象にする期間はどの範囲ですか?
- レポートの保存先はどこですか?(デフォルト:現在のディレクトリ)
3. エビデンスへのアクセス手段の確認
調査を始める前に、利用可能なエビデンスソースを確認します。
--contextスキルまたはファイルが提供されている場合は、それを読み、エビデンスへのアクセス方法を確認します- 利用可能なエビデンスソースを確認します。
- このセッションで利用できるスキルに
<repo>-engineerスキルがあるか確認します AGENTS.md/CLAUDE.mdにアクセス手順が記載されているか確認します- 利用可能な MCP ツールを確認します
- オブザーバビリティへのアクセス手段を確認します(ログ/メトリクス/トレース API にアクセスできますか?)
- ソースコードへのアクセス手段を確認します(関連するリポジトリを利用できますか?)
- データベースへのアクセス手段を確認します(DB 接続ツールや認証情報はありますか?)
- このセッションで利用できるスキルに
- 見つかった各ソースについて、簡単な健全性チェック(簡単なクエリ、
ls、または ping)を行います - 各ソース、その状態(アクセス可能/アクセス不可/未設定)、この調査で提供できる情報を記載した EVIDENCE ACCESS INVENTORY を作成します
4. アクセスインベントリをユーザーに提示
インベントリを提示します。重要なソースが不足している場合は、担当者に次のように尋ねます。
"調査では、[Y] を確認するために [X] へのアクセスが必要です。アクセス方法を教えていただけますか? それとも、利用可能な情報だけで進めますか?"
十分なエビデンスにアクセスできる場合、または担当者が利用可能な情報で進めることを明示した場合に限り、フェーズ 1 に進みます。
5. 確認して開始
"調査を開始します:[max_turns] ターン、重大度のしきい値 [N]。問題:[1-line summary]。エビデンスへのアクセス:[アクセス可能なソースの一覧]。"
フェーズ 1:調査ループ
Initialize:
turn = 0
feedback = ""
feedback_history = []
sticky_issues = {} # RC-IDs that reappear across turns
report_path = "" # Set after turn 1
worklog_path = "" # Set after turn 1
各ターン(1~max_turns):
ステップ 1:調査
ターン 1 — 初期調査:
- 問題の説明を理解します
- リクエスト/データの流れをマッピングします(各ホップをたどります)
- 利用可能なエビデンスソースを調査します(それぞれ簡単なクエリで健全性を確認します)
- 初期仮説を 3~5 個作成します(番号を付け、それぞれに根拠と、仮説を裏付ける/否定するエビデンスを記載します)
- 仮説の検証を始めます — 可能性が最も高いものから着手します
- レポートファイルと作業ログファイルを作成します
- 初期所見をレポートに記載します
ターン 2 以降 — コーチのフィードバックに対応:
- 前回のターンでコーチが指摘した内容を、重大度順にすべて読みます
- 重大度のしきい値以上の指摘について、それぞれ次のように対応します。
- 「さらに深掘り」:次の階層のエビデンスを収集します
- 「エビデンス不足」:主張を裏付けるクエリ/コマンドを実行します
- 「ソースコードだけ」:裏付けとなる、または矛盾する実行時のエビデンスを探します
- 「エビデンスが主張と矛盾」:結論を再検討し、新たなエビデンスを収集します
- 「安易な修正」:実際のメカニズムを特定し、コードレベルの変更を提案します
- 「チャートが必要」:データをクエリし、可視化を生成します
- 新たな所見をレポートに反映します
- 生のエビデンスを作業ログに記録します
各調査ステップの最後に、構造化された要約を作成します。
INVESTIGATION SUMMARY
Turn: N
Evidence gathered this turn:
- [source]: [what was checked] → [finding]
Hypotheses updated:
- H1: [status change and why]
Report updated:
- [sections modified and why]
Remaining gaps:
- [what still needs checking]
Access blockers:
- [any evidence sources that couldn't be accessed — NONE if all accessible]
ステップ 2:検証用ショートカットの準備
調査作業の完了後、コーチが主張を抜き取り確認するために使える検証用ショートカットをまとめたブロックを作成します。これらは調査中にすでに実行したコマンドです。コーチはエビデンスへのアクセス方法を調べずに、すぐに再実行できます。
レポートの Evidence Summary テーブルを基に作成します。根本原因の結論を支える、最も重要な主張を対象に 8~12 個のショートカットを含めます。
形式:
VERIFICATION SHORTCUTS
Evidence claim: "[claim from report]"
Verify with: `[exact command, query, or file:line reference]`
Expected result: [what the output should show]
Evidence claim: "[next claim]"
Verify with: `[command]`
Expected result: [expected output]
...
Key files to review:
- [file:lines] — [what this shows]
ステップ 3:コーチの呼び出し
Skill ツールを使って root-cause-coach を呼び出します。
You are the Coach reviewing a root cause analysis report. Push hard on gaps, shallow analysis, and unsupported claims.
Report: {report_path}
Worklog: {worklog_path}
Severity threshold: {severity}
Turn: {turn} of {max_turns}
VERIFICATION SHORTCUTS:
{verification_shortcuts}
{if turn > 1}
Previous coach feedback that was addressed this turn:
{previous_feedback}
{endif}
Produce severity-scored findings (RC-N format). Focus on:
- Claims without evidence
- Shallow analysis that stops at symptoms
- Available evidence sources that weren't used
- Fix recommendations that are just "increase resources"
- Missing charts for quantitative findings
- Run verification shortcuts and check if results match the report's claims
ステップ 4:判定ゲート
これは機械的な処理です。判断は不要です。
- コーチの出力を解析する — 重大度スコア付きのすべての RC-N 指摘事項を抽出します。コーチの出力に RC-N 指摘事項がない場合(または「Report approved」と明記されている場合)、指摘事項の数はゼロです。
- 継続中の問題を追跡する — 今回の指摘事項を、内容に基づいて前のターンの指摘事項と比較します。同じトピック/セクションが再び現れた場合は、継続中の問題です。ターン番号を記録します。
- しきい値を適用する:
- 重大度のしきい値以上の指摘事項がゼロ → 承認。フェーズ 2 に進みます。
- しきい値以上の指摘事項が N 件 → フィードバック。指摘事項を収集し、feedback_history に追加して、次のターンに進みます。
- 行き詰まり状態を確認する:
- 継続中の問題が 3 ターン以上連続して現れた場合は、人間に指示を求めます
- アクセス上の障害がある場合は、人間にアクセスを求めます
各ターンの出力:
## Turn {turn}/{max_turns}
Investigation: {1-line summary of what was done}
Coach: {N} findings ({M} at/above severity {threshold})
Decision: {APPROVED or FEEDBACK}
{if FEEDBACK}
Top findings to address:
- RC-1 (sev X): {summary}
- RC-2 (sev Y): {summary}
{endif}
フェーズ 2:最終仕上げ
1. 最終調整
レポートを最終調整します:
- すべてのグラフが生成され、本文中に埋め込まれていることを確認します
- 要約表のすべての根拠に、再現可能なクエリまたはコマンドがあることを確認します
- 想定される質問のセクションを作成します(初めて読む人が尋ねそうな質問を 3~6 件)
- 調査経緯に誤った仮説が記録されていることを確認します
- 根本原因のセクションが簡潔であることを確認します(箇条書きは最大 3 項目、詳細は問題の各セクションに記載)
2. コーチによる最終レビュー(しきい値を下げる)
明確さに関する問題を見つけるため、重大度のしきい値を 2 下げて、コーチをもう一度起動します:
This is the FINAL CLARITY REVIEW. The report was previously approved at severity {threshold}.
Now review at severity {threshold - 2} — catch remaining clarity, formatting, and readability issues.
Only produce findings that would genuinely confuse a reader. Do not nitpick.
Report: {report_path}
Worklog: {worklog_path}
VERIFICATION SHORTCUTS: None — this is a clarity-only review. Skip Step 2 (Run Verification Shortcuts).
Focus exclusively on comprehensibility and clarity (Steps 1 and 4 of your review process).
指摘事項が残っている場合は、任意の改善案として人間に提示します。再度ループしてはいけません。
3. 出力の完了
# Root Cause Analysis Complete
## Result: APPROVED (Turn {N} of {M})
## Severity threshold: {threshold}
## Report: {report_path}
## Worklog: {worklog_path}
## Turn History
| Turn | Investigation Summary | Coach Findings | Decision |
|------|----------------------|----------------|----------|
{turn_history}
{if sticky_issues}
## Friction Areas
{Issues that took multiple turns to resolve}
{endif}
{if optional_clarity_findings}
## Optional Improvements (from final clarity review)
{findings}
{endif}
ターン数の上限に到達
turn > max_turns で、コーチがまだ承認していない場合:
# Root Cause Analysis: Turn Limit Reached
## Result: NOT APPROVED after {M} turns
## Severity threshold: {threshold}
## Report: {report_path} (partial — review before sharing)
## Remaining Issues
{Last coach findings}
## Recommendation
The investigation needs more depth in these areas. Consider:
- Re-running with higher max-turns
- Providing additional evidence access
- Narrowing the investigation scope