バグの原因を特定するための詳細分析を実施する
Analyzes bugs by systematically investigating, tracing execution flows, identifying root causes, and generating comprehensive reports.
/plugin marketplace add classmethod/tsumiki/plugin install tsumiki@tsumikiバグの概要(任意)dcs/バグの発生経緯や症状から原因を特定し、修正方針を提示します。ソースコードを詳細に分析し、段階的に原因を絞り込みます。
出力ディレクトリ=".dcs" カレントディレクトリ={{プロジェクトルート}} 分析ファイルリスト=[] 調査段階=1
AskUserQuestion ツールを使って、以下の質問を順番に実施する:
contextとして以下を保持する:
_index.md - インデックス(全体概要とファイル一覧)_initial_investigation.md - 初期調査結果_flow_analysis.md - 処理フロー分析_root_cause_analysis.md - 詳細原因分析_final_report.md - 最終レポート.dcs/20251025143022_order_total_bug/index.md.dcs/20251025143022_order_total_bug/initial_investigation.md.dcs/20251025143022_order_total_bug/flow_analysis.md.dcs/20251025143022_order_total_bug/root_cause_analysis.md.dcs/20251025143022_order_total_bug/final_report.md/Users/makotan/projects/ensemble-si/src/utils/helper.tssrc/utils/helper.ts###統合バグ
<initial_investigation_template> あなたはバグ原因特定のエキスパートです。以下の情報に基づいて、バグの初期調査を実施し、関連するコード箇所を特定してください。
バグの概要: {{バグの概要}} バグの種類: {{バグの種類}} 発生状況: {{発生状況}} エラー情報: {{エラー情報の有無と内容}} 再現手順: {{再現手順の有無と内容}} その他の情報: {{その他のバグ詳細情報}}
出力ファイル名: {{ベースディレクトリ}}/initial_investigation.md カレントディレクトリ: {{カレントディレクトリ}}
すべてのファイルパスは、カレントディレクトリを基準とした相対パスで記載してください。 絶対パス(/Users/... や C:\... など)は使用しないでください。 このファイルは500行以内を目標としてください。
バグの種類({{バグの種類}})に基づいて、適切な検索アプローチを決定する:
{{エラー情報の有無と内容}}がある場合:
以下の形式で結果をファイルに出力してください。Write ツールを使用して保存してください。
# バグ初期調査結果
**実施日時**: {{実施日時}}
**分析者**: Claude Code
[← インデックスに戻る](./index.md)
---
## バグの基本情報
### 概要
{{バグの概要}}
### バグの種類
{{バグの種類}}
### 発生状況
{{発生状況}}
### エラー情報
{{エラー情報の詳細}}
### 再現手順
{{再現手順の詳細}}
---
## 関連コンポーネント・ファイル
### 主要な関連ファイル
#### [相対パス](相対パス)
- **役割**: {{このファイルの役割}}
- **関連度**: 高/中/低
- **理由**: {{なぜこのファイルが関連するのか}}
- **重要なコード箇所**:
- 行番号: {{行番号}}
- 内容: {{コードの概要}}
#### [相対パス](相対パス)
(同様の形式で複数記載)
### 補助的な関連ファイル
#### [相対パス](相対パス)
- **役割**: {{このファイルの役割}}
- **関連度**: 中/低
- **理由**: {{なぜこのファイルが関連するのか}}
---
## 検索キーワードと結果
### 使用したキーワード
1. `{{キーワード1}}` - XX件ヒット
2. `{{キーワード2}}` - XX件ヒット
3. `{{キーワード3}}` - XX件ヒット
### 検索結果のサマリー
{{検索結果の総括}}
---
## コードベース構造の理解
### アーキテクチャ上の位置づけ
{{このバグに関連するコンポーネントがアーキテクチャ上どこに位置するか}}
### データフローの概要
{{データがどのように流れるか}}
{{データフロー図(テキスト形式)}} 例: Frontend Component ↓ (API呼び出し) Next.js API Route (BFF) ↓ (HTTP Request) Backend API ↓ (DLL呼び出し) Prismatix Factory ↓ (SQL) PostgreSQL
---
## 初期仮説
### 可能性の高い原因候補
#### 候補1: {{原因の概要}}
- **確度**: 高/中/低
- **理由**: {{なぜこの可能性が高いのか}}
- **該当箇所**: [相対パス:行番号](相対パス#L行番号)
- **検証方法**: {{どのように検証すべきか}}
#### 候補2: {{原因の概要}}
(同様の形式で複数記載)
### 可能性の低い候補
{{可能性は低いが念のため記載する候補}}
---
## 次段階の調査方針
### 処理フロー分析で確認すべき点
1. {{確認ポイント1}}
2. {{確認ポイント2}}
3. {{確認ポイント3}}
### 追加で確認すべき情報
{{ユーザに確認したい情報があれば記載}}
---
## 制限事項
### 検出できなかった可能性のある箇所
- {{制限事項1}}
- {{制限事項2}}
---
*この初期調査結果は自動生成されたものです。次段階の処理フロー分析でさらに詳細を確認します。*
最後に、インデックスファイル({{ベースディレクトリ}}/index.md)も作成してください。インデックスファイルには以下の内容を含めてください:
# バグ原因分析 - インデックス
**実施日時**: {{実施日時}}
**分析者**: Claude Code
---
## バグ情報
### 概要
{{バグの概要}}
### 種類
{{バグの種類}}
---
## 分析結果ファイル一覧
### 調査段階
- [初期調査](./initial_investigation.md) - 関連コンポーネントの特定
- [処理フロー分析](./flow_analysis.md) - ※まだ実行されていません
- [詳細原因分析](./root_cause_analysis.md) - ※まだ実行されていません
- [最終レポート](./final_report.md) - ※まだ実行されていません
---
## クイックサマリー
### 初期仮説
1. {{仮説1}}
2. {{仮説2}}
3. {{仮説3}}
### 次のアクション
{{次に実施すべきこと}}
---
*分析は段階的に実施されます。各段階の詳細は上記リンクから参照してください。*
</initial_investigation_template>
<flow_analysis_template> あなたはバグ原因特定のエキスパートです。初期調査結果に基づいて、バグが発生するまでの処理フローを詳細に分析してください。
バグの概要: {{バグの概要}} バグの種類: {{バグの種類}} 初期調査結果ファイル: {{ベースディレクトリ}}/initial_investigation.md 出力ファイル名: {{ベースディレクトリ}}/flow_analysis.md カレントディレクトリ: {{カレントディレクトリ}}
すべてのファイルパスは、カレントディレクトリを基準とした相対パスで記載してください。 絶対パス(/Users/... や C:\... など)は使用しないでください。 このファイルは500行以内を目標としてください。500行を超える場合は複数ファイルに分割してください。
各処理ステップについて以下を記録する:
以下の形式で結果をファイルに出力してください。Write ツールを使用して保存してください。
# バグ処理フロー分析
**実施日時**: {{実施日時}}
**分析者**: Claude Code
[← インデックスに戻る](./index.md) | [初期調査](./initial_investigation.md)
---
## 分析対象
### バグの概要
{{バグの概要}}
### 分析の焦点
{{初期調査で特定された主要な関連箇所}}
---
## エントリーポイント
### [相対パス:行番号](相対パス#L行番号)
**役割**: {{エントリーポイントの役割}}
**コードスニペット**:
```{{language}}
{{関連するコードの抜粋(10行程度)}}
トリガー: {{このエントリーポイントが呼ばれる条件}}
ファイル: 相対パス:行番号
処理内容: {{この処理で何が行われるか}}
入力:
{{変数名}}: {{型}} - {{説明}}{{変数名}}: {{型}} - {{説明}}出力:
{{変数名}}: {{型}} - {{説明}}副作用:
コードスニペット:
{{関連するコードの抜粋}}
注目点: {{バグに関連する可能性のあるポイント}}
(同様の形式で各ステップを記載)
(処理フローの最終ステップ)
{{データの変換フロー(テキスト形式)}}
例:
初期データ: { orderId: "123", items: [...] }
↓ (ステップ1: データ取得)
APIレスポンス: { order: {...}, total: 1000 }
↓ (ステップ2: データ整形)
整形済みデータ: { id: "123", amount: 1000, ... }
↓ (ステップ3: 状態更新)
最終状態: OrderState = { ... }
| ステップ | 状態変数 | 変更前の値 | 変更後の値 | 変更箇所 |
|---|---|---|---|---|
| ステップ1 | {{変数名}} | {{値}} | {{値}} | 相対パス:行番号 |
| ステップ2 | {{変数名}} | {{値}} | {{値}} | 相対パス:行番号 |
位置: 相対パス:行番号
条件式:
{{条件式のコード}}
分岐パターン:
バグ発生時の条件: {{バグが発生する場合の条件式の評価結果}}
注目点: {{バグに関連する可能性}}
位置: 相対パス:行番号
対象エラー: {{どのようなエラーを捕捉するか}}
処理内容:
{{エラーハンドリングのコード}}
問題点: {{不十分な点、改善すべき点}}
位置: 相対パス:行番号
検証項目: {{何を検証しているか}}
実装の有無: ✅ 実装済み / ❌ 未実装
問題点: {{不十分な点、改善すべき点}}
{{非同期処理のシーケンス(テキスト形式)}}
例:
1. ユーザー操作
↓
2. API呼び出し開始(非同期)
↓ (await)
3. APIレスポンス受信
↓
4. 状態更新(同期)
↓
5. 再レンダリング
位置: 相対パス:行番号
問題の詳細: {{レースコンディション、順序の問題など}}
発生条件: {{どのような条件で問題が発生するか}}
影響: {{バグへの影響}}
(同様の形式で複数記載)
{{調査ポイント1}}
{{調査ポイント2}} (同様の形式で記載)
この処理フロー分析結果に基づいて、次段階で詳細な原因分析を実施します。
# 分析の注意点
- 処理フローは時系列順に記載する
- 各ステップのコードスニペットは簡潔に(10行程度)
- データと状態の変化を明確に追跡する
- バグに関連する可能性のあるポイントを強調する
- **すべてのファイルパスは相対パスで記載する(絶対パスは使用しない)**
- **ファイルは500行以内を目標とする。超える場合は分割する**
分析が完了したら、インデックスファイル({{ベースディレクトリ}}/index.md)を更新して、処理フロー分析へのリンクを有効化してください。
</flow_analysis_template>
<root_cause_analysis_template>
あなたはバグ原因特定のエキスパートです。これまでの分析結果に基づいて、バグの根本原因を特定し、詳細な検証を実施してください。
# 分析対象の情報
バグの概要: {{バグの概要}}
バグの種類: {{バグの種類}}
初期調査結果ファイル: {{ベースディレクトリ}}/initial_investigation.md
処理フロー分析ファイル: {{ベースディレクトリ}}/flow_analysis.md
出力ファイル名: {{ベースディレクトリ}}/root_cause_analysis.md
カレントディレクトリ: {{カレントディレクトリ}}
# 重要な注意事項
**すべてのファイルパスは、カレントディレクトリを基準とした相対パスで記載してください。**
**絶対パス(/Users/... や C:\\... など)は使用しないでください。**
**このファイルは500行以内を目標としてください。500行を超える場合は複数ファイルに分割してください。**
# 詳細原因分析の手順
## 1. これまでの分析結果の統合
- {{ベースディレクトリ}}/initial_investigation.md を Read で読み込む
- {{ベースディレクトリ}}/flow_analysis.md を Read で読み込む
- 初期仮説と処理フロー分析から得られた所見を統合する
- 最も可能性の高い原因候補を特定する
## 2. 原因候補の絞り込み
### よくある原因パターンとの照合
#### 未初期化変数
- 変数が使用される前に初期化されているか
- デフォルト値が適切か
- 条件付き初期化の漏れはないか
#### nullポインタ/undefined参照
- null/undefinedチェックが適切か
- オプショナルチェイニングの使用
- デフォルト値の設定
#### 配列の範囲外アクセス
- インデックスの範囲チェック
- 空配列の処理
- 境界値での動作
#### 型の不一致
- 型変換の適切性
- TypeScript/型定義の整合性
- 暗黙の型変換による問題
#### 非同期処理の問題
- awaitの漏れ
- Promise.allの適切な使用
- レースコンディション
- 状態更新のタイミング
#### ロジックの誤り
- 条件式の誤り
- 計算式の誤り
- ループの終了条件
- エッジケースの処理漏れ
#### メモリ関連
- メモリリークの可能性
- 循環参照
- イベントリスナーの解除漏れ
#### エラーハンドリングの不備
- try-catchの範囲
- エラーの伝播
- エラーメッセージの不適切さ
### バグの種類別のチェックポイント
#### UI/表示バグ
- データバインディングの誤り
- 条件付きレンダリングのロジック
- スタイルの優先順位
- useEffectの依存配列
- 再レンダリングのタイミング
#### ロジックバグ
- ビジネスルールの実装誤り
- 計算ロジックの誤り
- 条件分岐の不備
- エッジケースの考慮漏れ
#### データバグ
- データ変換の誤り
- API契約の不一致
- 状態の整合性
- キャッシュの問題
#### 統合バグ
- インターフェースの不一致
- データの受け渡しミス
- イベントの伝播問題
- トランザクション境界
#### パフォーマンスバグ
- N+1問題
- 不要な再計算
- 大量データの非効率な処理
- メモ化の不足
## 3. 詳細コード検証
### 該当箇所の徹底調査
- コードの詳細な読解
- 変数のスコープ確認
- 関数の入出力検証
- 副作用の特定
### 境界値での動作確認
- 最小値での動作
- 最大値での動作
- 空データでの動作
- null/undefinedでの動作
### エッジケースの検証
- 想定外の入力
- 極端なデータサイズ
- 並行実行
- エラー発生時の動作
## 4. 関連コードの確認
### 呼び出し元の確認
- どのような引数で呼ばれるか
- 呼び出しタイミング
- 複数回呼び出される可能性
### 呼び出し先の確認
- 依存する関数の動作
- 外部APIの仕様
- ライブラリの使用方法
### テストコードの確認
- 既存のテストケース
- テストでカバーされていない範囲
- テストが失敗していないか
## 5. 根本原因の特定
### 根本原因の定義
- 技術的な原因
- ビジネスロジックの問題
- 設計上の問題
- 実装の誤り
### 原因の検証
- コードから明らかな問題
- ドキュメントとの照合
- 仕様との整合性
## 6. 詳細原因分析結果のまとめ
以下の形式で結果をファイルに出力してください。Write ツールを使用して保存してください。
```markdown
# バグ詳細原因分析
**実施日時**: {{実施日時}}
**分析者**: Claude Code
[← インデックスに戻る](./index.md) | [初期調査](./initial_investigation.md) | [処理フロー](./flow_analysis.md)
---
## 分析サマリー
### バグの概要
{{バグの概要}}
### これまでの分析経緯
{{初期調査と処理フロー分析で判明したこと}}
---
## 原因候補の評価
### 候補1: {{原因の概要}}
**確度**: ⭐⭐⭐⭐⭐ (5段階評価)
**位置**: [相対パス:行番号](相対パス#L行番号)
**問題の詳細**:
{{技術的な問題の詳細説明}}
**該当コード**:
```{{language}}
{{問題のあるコードスニペット(20行程度)}}
問題点の指摘:
// ❌ 問題のあるコード
{{問題のある部分を抽出}}
// ✅ 期待される動作
{{本来どうあるべきか}}
なぜこれが問題か: {{この問題がバグを引き起こす理由を詳しく説明}}
バグとの関連性: {{報告されているバグ症状とどう結びつくか}}
検証内容:
検証結果: {{検証から得られた確証}}
(候補1と同様の形式で記載)
(確度が低い場合も含めて記載)
結論: {{根本原因の結論}}
原因の分類:
技術的な説明: {{技術的な観点からの原因説明}}
発生メカニズム:
{{バグが発生するまでのステップバイステップの説明}}
例:
1. ユーザーが特定の操作を実行
↓
2. {{ファイル名}}の{{関数名}}が呼ばれる
↓
3. 変数{{変数名}}が未初期化のまま参照される
↓
4. undefinedに対して{{操作}}を実行
↓
5. エラーが発生またはバグが顕在化
なぜ今まで発見されなかったか: {{このバグが今まで見逃されていた理由}}
コード全体:
{{問題のある関数・メソッド全体(必要に応じて40行程度)}}
問題のある部分:
{{特に問題のある5-10行を抽出}}
詳細な説明: {{行ごとの詳細な分析}}
変数の状態:
| 変数名 | この時点での値 | 期待される値 | 問題 |
|---|---|---|---|
{{変数名}} | {{実際の値}} | {{期待値}} | {{問題点}} |
実行フロー:
{{この箇所での実行フローの詳細}}
エッジケースでの動作:
{{影響1}}
{{影響2}} (同様の形式で記載)
{{根本原因が設計に起因する場合}}
カバレッジ状況:
このバグを検出できなかった理由: {{なぜ既存テストで検出できなかったか}}
// テストの疑似コード
test('{{テスト名}}', () => {
// Given: {{前提条件}}
// When: {{実行内容}}
// Then: {{期待結果}}
})
目的: {{このテストで何を検証するか}}
変更箇所: 相対パス:行番号
修正前:
{{現在のコード}}
修正後:
{{修正後のコード案}}
修正の説明: {{なぜこの修正が適切か}}
メリット:
デメリット:
影響範囲: {{この修正による影響}}
テスト方針: {{どのようにテストすべきか}}
(修正案1と同様の形式で記載)
{{すぐに実施できる対策}}
{{根本的な解決策}}
{{設計の見直しが必要な場合}}
この詳細原因分析の結果は、最終レポートで総括されます。
# 分析の注意点
- 根本原因の特定には確実な根拠が必要
- 推測と確実な事実を明確に区別する
- 複数の原因候補がある場合は確度を評価する
- 修正案は具体的なコード例を示す
- **すべてのファイルパスは相対パスで記載する(絶対パスは使用しない)**
- **ファイルは500行以内を目標とする。超える場合は分割する**
分析が完了したら、インデックスファイル({{ベースディレクトリ}}/index.md)を更新して、詳細原因分析へのリンクを有効化してください。
</root_cause_analysis_template>
<final_report_template>
あなたはバグ原因特定のエキスパートです。これまでのすべての分析結果を統合し、包括的な最終レポートを作成してください。
# レポート作成対象の情報
バグの概要: {{バグの概要}}
分析ファイルリスト: {{分析ファイルリスト}}
最終レポートファイル名: {{ベースディレクトリ}}/final_report.md
カレントディレクトリ: {{カレントディレクトリ}}
# 重要な注意事項
**すべてのファイルパスは、カレントディレクトリを基準とした相対パスで記載してください。**
**絶対パス(/Users/... や C:\\... など)は使用しないでください。**
**このファイルは500行以内を目標としてください。**
# 最終レポート作成手順
## 1. 全分析結果の読み込み
- {{ベースディレクトリ}}/initial_investigation.md を Read で読み込む
- {{ベースディレクトリ}}/flow_analysis.md を Read で読み込む
- {{ベースディレクトリ}}/root_cause_analysis.md を Read で読み込む
- 各ファイルの内容を把握し、重要なポイントを抽出する
## 2. 情報の統合とサマリー作成
- バグの根本原因を明確にする
- 分析プロセスで得られた重要な発見をまとめる
- 修正方針と優先順位を決定する
- テスト戦略を策定する
## 3. エグゼクティブサマリーの作成
- 非技術者にも理解できる概要
- 技術的な詳細は別セクションで説明
- 結論を先に、詳細は後で
## 4. 最終レポートの出力
以下の形式で結果をファイルに出力してください。Write ツールを使用して保存してください。
```markdown
# バグ原因分析 - 最終レポート
**実施日時**: {{実施日時}}
**分析者**: Claude Code
---
## ナビゲーション
- [インデックス](./{filename}_index.md)
- [初期調査](./initial_investigation.md)
- [処理フロー分析](./flow_analysis.md)
- [詳細原因分析](./root_cause_analysis.md)
---
## エグゼクティブサマリー
### バグの概要
{{バグの簡潔な説明}}
### 根本原因
{{根本原因を1-2文で簡潔に}}
### 影響度
**深刻度**: 🔴 高 / 🟡 中 / 🟢 低
**影響範囲**: {{どの機能に影響するか}}
### 推奨される対応
**優先度**: 🔴 即座に対応 / 🟡 早急に対応 / 🟢 計画的に対応
**修正工数**: {{概算時間}}
**リリースへの影響**: {{リリースを遅らせるべきか}}
---
## バグの詳細情報
### 発生条件
{{どのような条件でバグが発生するか}}
### 症状
{{ユーザーから見えるバグの症状}}
### エラー情報
{{エラーメッセージやスタックトレース(ある場合)}}
### 再現手順
1. {{ステップ1}}
2. {{ステップ2}}
3. {{ステップ3}}
4. {{バグが発生}}
---
## 分析結果のサマリー
### 分析プロセス
1. **初期調査**: {{何を調査したか}}
2. **処理フロー分析**: {{何を分析したか}}
3. **詳細原因分析**: {{何を特定したか}}
### 主要な発見事項
#### 発見1: {{発見内容}}
- **重要度**: 高/中/低
- **詳細**: {{詳しい説明}}
- **参照**: [詳細](./{filename}_{{section}}.md)
#### 発見2: {{発見内容}}
(同様の形式で記載)
---
## 根本原因の詳細
### 技術的な原因
**分類**: {{原因のカテゴリ}}(例: null/undefined参照、ロジックの誤り、非同期処理の問題など)
**問題箇所**: [相対パス:行番号](相対パス#L行番号)
**問題のコード**:
```{{language}}
{{問題のあるコードスニペット(10-20行)}}
何が問題か: {{技術的な観点からの詳細な説明}}
なぜバグが発生するか:
{{バグ発生のメカニズムをステップバイステップで説明}}
1. {{ステップ1}}
↓
2. {{ステップ2}}
↓
3. {{バグ発生}}
{{ビジネスロジックに関連する問題がある場合}}
{{設計レベルの問題がある場合}}
概要: {{修正の概要を1-2文で}}
変更箇所: 相対パス:行番号
修正前:
{{現在のコード}}
修正後:
{{修正後のコード}}
修正の説明: {{なぜこの修正が適切か}}
変更の影響範囲:
破壊的変更: ✅ あり / ❌ なし
{{他の修正方法がある場合}}
{{ステップ1}}
{{ステップ2}} (同様の形式で記載)
{{テストケース1}}
{{テストケース2}} (同様の形式で記載)
追加すべきユニットテスト:
// テストの疑似コード
test('{{テスト名}}', () => {
// Given: {{前提条件}}
// When: {{実行内容}}
// Then: {{期待結果}}
})
追加すべき統合テスト: {{統合テストの内容}}
E2Eテスト: {{E2Eテストの内容}}
{{既存機能への影響を確認するテスト}}
{{対策1}}
{{対策2}} (同様の形式で記載)
// ESLint/TSConfig などの設定例
{{設定の追加内容}}
{{TypeScriptの型定義を厳格にするなど}}
{{カバレッジ目標と計画}}
{{設計レベルの改善が必要な場合}}
| フェーズ | 作業内容 | 担当 | 期間 | 状態 |
|---|---|---|---|---|
| 1 | {{作業1}} | {{担当者}} | {{期間}} | ⏳ 未着手 |
| 2 | {{作業2}} | {{担当者}} | {{期間}} | ⏳ 未着手 |
| 3 | {{作業3}} | {{担当者}} | {{期間}} | ⏳ 未着手 |
| 4 | {{作業4}} | {{担当者}} | {{期間}} | ⏳ 未着手 |
総所要時間: {{合計時間}}
(同様の形式で記載)
{{課題1}}
{{課題2}} (同様の形式で記載)
{{分析全体の結論を2-3段落でまとめる}}
分析完了日: {{日付}} 分析者: Claude Code レビュー状況: ⏳ レビュー待ち
このレポートは自動生成されたものです。内容についてはチームでレビューしてください。
# レポート作成の注意点
- エグゼクティブサマリーは簡潔に(1ページ以内)
- 技術的な詳細は適切なセクションに配置
- 具体的で実行可能な推奨事項を提示
- タイムラインは現実的な見積もりを
- **すべてのファイルパスは相対パスで記載する(絶対パスは使用しない)**
- **ファイルは500行以内を目標とする**
レポート作成が完了したら、インデックスファイル({{ベースディレクトリ}}/index.md)を最終更新して、すべての分析へのリンクを有効化し、クイックサマリーを更新してください。
</final_report_template>