--- name: agent-architecture-audit description: エージェントおよび LLM アプリケーション向けのフルスタック診断。12 層のエージェントスタックにおけるラッパーリグレッション、メモリ汚染、ツール規律の失敗、隠れた修復ループ、レンダリング破損を監査します。重要度順の発見事項とコードファーストの修正を生成します。エージェントアプリケーション、自律ループ、または LLM を活用した機能を構築する開発者に必須です。 origin: oh-my-agent-check tools: Read, Write, Edit, Bash, Grep, Glob --- # エージェントアーキテクチャ監査 ラッパー層、古いメモリ、リトライループ、トランスポート・レンダリングの変異の背後に失敗を隠すエージェントシステムのための診断ワークフロー。 ## 起動タイミング **必須の場合:** - エージェントまたは LLM を活用したアプリケーションを本番リリースする前 - ツール呼び出し、メモリ、または多段階ワークフローを含む機能をリリースする前 - ラッパー層を追加した後にエージェントの動作が低下する場合 - ユーザーが「エージェントが悪化している」または「ツールが不安定」と報告する場合 - 同じモデルがプレイグラウンドでは動作するがラッパー内で壊れる場合 - 根本原因を見つけることなく 15 分以上エージェントの動作をデバッグしている場合 **特に重要な場合:** - 新しいプロンプト層、ツール定義、またはメモリシステムを追加した場合 - システム内の異なるエージェントが一貫性なく動作する場合 - 昨日は正常だったモデルが今日ハルシネーションを起こしている場合 - 応答をサイレントに変異させる隠れた修復・リトライループが疑われる場合 **使用しない場合:** - 一般的なコードデバッグ — `agent-introspection-debugging` を使用 - コードレビュー — 言語固有のレビューエージェントを使用 - セキュリティスキャン — `security-review` または `security-review/scan` を使用 - エージェントパフォーマンスのベンチマーク — `agent-eval` を使用 - 新機能の作成 — 適切なワークフロースキルを使用 ## 12 層スタック すべてのエージェントシステムはこれらの層を持ちます。いずれも回答を破壊する可能性があります: | # | 層 | 問題の内容 | |---|-------|----------------| | 1 | システムプロンプト | 矛盾する指示、指示の肥大化 | | 2 | セッション履歴 | 前のターンからの古いコンテキスト注入 | | 3 | 長期メモリ | セッション間の汚染、新しい会話に古いトピックが混入 | | 4 | 蒸留 | 圧縮されたアーティファクトが疑似事実として再投入 | | 5 | アクティブリコール | コンテキストを無駄にする冗長な再要約層 | | 6 | ツール選択 | 誤ったツールルーティング、モデルが必要なツールをスキップ | | 7 | ツール実行 | ハルシネーションによる実行 — 呼び出したと主張するが実際には呼び出していない | | 8 | ツール解釈 | ツール出力の誤読または無視 | | 9 | 回答整形 | 最終応答でのフォーマット破損 | | 10 | プラットフォームレンダリング | トランスポート層の変異(UI、API、CLI が有効な回答を変異させる) | | 11 | 隠れた修復ループ | サイレントなフォールバック・リトライエージェントが 2 回目の LLM パスを実行 | | 12 | 永続化 | 期限切れの状態またはキャッシュされたアーティファクトがライブエビデンスとして再利用 | ## 一般的な障害パターン ### 1. ラッパーリグレッション ベースモデルは正しい回答を生成するが、ラッパー層がそれを悪化させる。 **症状:** - プレイグラウンドや直接 API 呼び出しでは正常に動作するが、エージェント内で壊れる - 新しいプロンプト層を追加したら既存の動作が低下した - エージェントは自信を持っているが、自信を持って間違っている - 「最後のアップデート前は動作していた」 ### 2. メモリ汚染 履歴、メモリ検索、または蒸留を通じて古いトピックが新しい会話に漏れる。 **症状:** - エージェントが無関係な過去のトピックを持ち出す - ユーザーの修正が定着しない(古いメモリが新しいものを上書きする) - 同一セッション内のアーティファクトが疑似事実として再投入される - メモリが際限なく増加し、時間とともに応答品質が低下する ### 3. ツール規律の失敗 ツールはプロンプトで宣言されているがコードでは強制されていない。モデルがそれをスキップするか実行をハルシネーションする。 **症状:** - プロンプトに「ツール X を必ず使用する」とあるが、モデルはそれを呼び出さずに回答する - ツール結果は正しく見えるが実際には実行されていない - 異なるツールが同じ責任をめぐって競合する - モデルが使うべきでない時にツールを使う、または使うべき時にスキップする ### 4. レンダリング・トランスポート破損 エージェントの内部回答は正しいが、プラットフォーム層が配信中にそれを変異させる。 **症状:** - ログは正しい回答を示すが、ユーザーには壊れた出力が表示される - Markdown レンダリング、JSON パース、またはストリーミングフラグメントが有効な応答を破損する - 隠れたフォールバックエージェントが配信前に回答をサイレントに置き換える - 出力がターミナルと UI で異なる ### 5. 隠れたエージェント層 明示的なコントラクトなしにサイレントな修復、リトライ、要約、またはリコールエージェントが実行される。 **症状:** - 内部生成とユーザー配信の間で出力が変化する - 「自動修正」ループがユーザーの知らない 2 回目の LLM パスを実行する - 複数のエージェントが調整なしに同じ出力を修正する - 回答が不可視の層によって「滑らか」または「修正」される ## 監査ワークフロー ### フェーズ 1: スコープ 監査対象を定義する: - **対象システム** — どのエージェントアプリケーションか? - **エントリポイント** — ユーザーはどのように操作するか? - **モデルスタック** — どの LLM とプロバイダーか? - **症状** — ユーザーは何を報告しているか? - **時間ウィンドウ** — いつ始まったか? - **監査する層** — 12 層のうちどれが該当するか? ### フェーズ 2: エビデンス収集 コードベースからエビデンスを収集する: - **ソースコード** — エージェントループ、ツールルーター、メモリ受付、プロンプトアセンブリ - **ログ** — 過去のセッショントレース、ツール呼び出し記録 - **設定** — プロンプトテンプレート、ツールスキーマ、プロバイダー設定 - **メモリファイル** — SOP、ナレッジベース、セッションアーカイブ `rg` を使用してアンチパターンを検索する: ```bash # プロンプトテキストのみで表現されたツール要件(コードでなく) rg "must.*tool|必须.*工具|required.*call" --type md # バリデーションなしのツール実行 rg "tool_call|toolCall|tool_use" --type py --type ts # メインエージェントループ外の隠れた LLM 呼び出し rg "completion|chat\.create|messages\.create|llm\.invoke" # ユーザー修正優先度なしのメモリ受付 rg "memory.*admit|long.*term.*update|persist.*memory" --type py --type ts # 追加の LLM 呼び出しを実行するフォールバックループ rg "fallback|retry.*llm|repair.*prompt|re-?prompt" --type py --type ts # サイレントな出力変異 rg "mutate|rewrite.*response|transform.*output|shap" --type py --type ts ``` ### フェーズ 3: 障害マッピング 各発見事項について文書化する: - **症状** — ユーザーが見るもの - **メカニズム** — ラッパーがそれを引き起こす方法 - **ソース層** — 12 層のうちどれか - **根本原因** — 最も深い原因 - **エビデンス** — ファイル:行 またはログ:行の参照 - **信頼度** — 0.0 から 1.0 ### フェーズ 4: 修正戦略 デフォルトの修正順序(コードファースト、プロンプトファーストではない): 1. **ツール要件のコードゲート化** — プロンプトテキストだけでなくコードで強制する 2. **隠れた修復エージェントの削除または縮小** — フォールバックをコントラクトで明示的にする 3. **コンテキストの重複を削減** — プロンプト・履歴・メモリ・蒸留を通じた同一情報 4. **メモリ受付の厳格化** — ユーザーの修正 > エージェントのアサーション 5. **蒸留トリガーの厳格化** — 圧縮すべきでないものは圧縮しない 6. **レンダリング変異の削減** — パススルー、変換しない 7. **型付き JSON エンベロープへの変換** — 構造化された内部フロー、自由形式の散文ではない ## 重要度モデル | レベル | 意味 | アクション | |-------|---------|--------| | `critical` | エージェントが自信を持って誤った操作動作を生成できる | 次のリリース前に修正 | | `high` | エージェントが頻繁に正確性や安定性を低下させる | このスプリントで修正 | | `medium` | 正確性は通常維持されるが出力が脆弱または無駄 | 次のサイクルで計画 | | `low` | 主に見た目または保守性の問題 | バックログ | ## 出力フォーマット 発見事項をユーザーにこの順序で提示する: 1. **重要度順の発見事項**(最も重要なものから) 2. **アーキテクチャ診断**(どの層が何を破損させ、なぜか) 3. **優先度付き修正計画**(コードファースト、プロンプトファーストではない) お世辞や要約から始めないこと。システムが壊れている場合は直接そう述べる。 ## クイック診断質問 エージェントシステムを監査する際、以下に答える: | # | 質問 | Yes の場合 → | |---|----------|----------| | 1 | モデルが必要なツールをスキップして回答できるか? | ツールがコードゲートされていない | | 2 | 古い会話コンテンツが新しいターンに現れるか? | メモリ汚染 | | 3 | 同じ情報がシステムプロンプトとメモリと履歴にあるか? | コンテキストの重複 | | 4 | プラットフォームが配信前に 2 回目の LLM パスを実行するか? | 隠れた修復ループ | | 5 | 内部生成とユーザー配信で出力が異なるか? | レンダリング破損 | | 6 | 「ツール X を必ず使用する」ルールがプロンプトテキストのみか? | ツール規律の失敗 | | 7 | エージェント自身のモノローグが永続メモリになり得るか? | メモリポイズニング | ## 避けるべきアンチパターン - ラッパー層のリグレッションを否定する前にモデルを責めることを避ける。 - 汚染パスを示さずにメモリを責めることを避ける。 - 現在のクリーンな状態が汚れた過去の出来事を消すことを許可しない。 - Markdown の散文を信頼できる内部プロトコルとして扱わない。 - コードがそれを強制しないのにプロンプトテキストの「ツールを必ず使用する」を受け入れない。 - 発見事項を直接的に、エビデンスに基づいて、重要度順に維持する。 ## レポートスキーマ 監査はこの形状に従った構造化されたレポートを生成すべきです: ```json { "schema_version": "ecc.agent-architecture-audit.report.v1", "executive_verdict": { "overall_health": "high_risk", "primary_failure_mode": "string", "most_urgent_fix": "string" }, "scope": { "target_name": "string", "model_stack": ["string"], "layers_to_audit": ["string"] }, "findings": [ { "severity": "critical|high|medium|low", "title": "string", "mechanism": "string", "source_layer": "string", "root_cause": "string", "evidence_refs": ["file:line"], "confidence": 0.0, "recommended_fix": "string" } ], "ordered_fix_plan": [ { "order": 1, "goal": "string", "why_now": "string", "expected_effect": "string" } ] } ``` ## 関連スキル - `agent-introspection-debugging` — エージェントランタイムの失敗(ループ、タイムアウト、状態エラー)のデバッグ - `agent-eval` — エージェントパフォーマンスの対決ベンチマーク - `security-review` — コードと設定のセキュリティ監査 - `autonomous-agent-harness` — 自律エージェント操作のセットアップ - `agent-harness-construction` — エージェントハーネスをゼロから構築