2026-07-31T05:48:26.015Z
Disler Claude Code フック マルチエージェント可観測性: イベント配信の証明
Disler Claude Code ダッシュボードを信頼する前に、構成、HTTP 配信、SQLite 永続性、WebSocket 鮮度、待機、および結果を監査します。
安全な答えは、到達可能なダッシュボードやゼロフック終了コードを、Disler の Claude Code フック マルチエージェント可観測性パイプラインが正常であることの証拠として扱わないことです。各境界 (構成、HTTP 配信、SQLite 永続性、WebSocket 配信、ブラウザーの鮮度) で受信を要求し、監視パスの外側での作業を検証します。 リポジトリ自体のアーキテクチャが Claude エージェント → フック スクリプト → HTTP POST → Bun サーバー → SQLite → WebSocket → Vue クライアントというチェーンであるため、この区別が重要になります。最後のボックスの明るいイベントは、1 つのイベントがチェーンを通過したことを証明します。静かなボックスは証拠がどこで停止したかを示しません。また、 Stop イベントは、要求されたファイル、テスト、デプロイメント、またはハンドオフが存在することを証明しません。 リポジトリのコミットを監査しました 8a6e5cf コンテンツのない 9 件のケースを再生しました。フック プロセスの終了コードのみをチェックする単純なルールでは、9 つすべてが緑色とマークされました。受信ルールでは、9 つすべてが予想どおりに分類されました。 1人だけ健康でした。 リポジトリを固定し、証拠コントラクトを定義する 実際に実行するコードから始めます。固定されたコミットでは、 .claude/settings.json 12 のイベント グループを構成します: SessionStart 、 SessionEnd 、 UserPromptSubmit 、 PreToolUse 、 PostToolUse 、 PostToolUseFailure 、 PermissionRequest 、 Notification 、 SubagentStart 、 SubagentStop 、 Stop 、 PreCompact 。 現在Claude Code フックのリファレンス30 のライフサイクル イベントを文書化します。この大きなセットには、 TaskCreated 、 TaskCompleted 、 TeammateIdle 、 StopFailure 、 PostToolBatch などの新しいチームと障害シグナルが含まれています。この比較は、すべてのインストールで 30 個すべてをキャプチャする必要があるという意味ではありません。これは、「すべてのフック」がバージョン管理された要求であることを意味します。操作上の決定に必要な最小限のイベントを定義し、Claude Code バージョンを固定し、構成がマニフェストと一致しなくなった場合はカバレッジ チェックに失敗します。 単一エージェントのカナリアの場合、適切な最小値は SessionStart 、 PreToolUse と PostToolUse の 1 つのペア、および Stop です。チーム実行の場合は、サブエージェントのライフサイクルと、インストールされている Claude Code バージョンが公開するタスクまたはチームメイトのシグナルを追加します。欠落したイベントは、それが予期され構成されていたことが確認された後にのみ意味を持ちます。 次の境界は送信者です。ピン留めされた send event.py 5 秒の HTTP タイムアウトを使用します。リクエストが失敗すると False を返し、stderr に書き込みますが、 main() はその結果を使用しません。コード 0 で無条件に終了するため、モニタリングは Claude Code をブロックできません。これは防御可能な可用性の選択ですが、終了コード 0 が配送受領書ではなくアクティビティ信号になります。 サーバーはより強力な受信を提供します。その POST /events path は必須フィールドを検証し、イベントを挿入し、保存されたレコードを返し、接続されている WebSocket クライアントにブロードキャストします。返されたカナリアのデータベース ID を保持します。保存された ID のない HTTP 接続は同等の証拠ではありません。 リポジトリの just health レシピも同じ解釈が必要です。 /health を要求しますが、固定されたサーバーには専用のヘルス ブランチがありません。一致しないパスは、HTTP 200 を含む一般的な Multi Agent Observability Server 応答を受け取ります。これは、プロセスが HTTP に応答したことを証明します。イベントの挿入、SQLite の可読性、WebSocket の配信、または現在のブラウザーの表示は実行されません。 明示的なコントラクトを使用します。 レシート 保管すべき証拠 証明されないこと 構成 固定されたイベント マニフェストとソース アプリの値 フックが発射されたこと 輸送 HTTP 200 プラス保存されたイベント ID ブラウザがそれを受信したこと 持続性 最近のイベントに同じ ID が表示される ビューが現在のものであること プレゼンテーション WebSocket または再接続リプレイには ID が含まれます 必要なイベントがすべて到着したこと カバレッジ 必要なイベントはすべて期限前に表示されます その仕事は成功した 結果 意図した成果物の決定的なチェック 将来のランニングが健全に保たれるように ビューを信頼する前に配信監査を再実行する プロンプト、トランスクリプト、ツール入力、ファイルパス、シークレットを使用せずに、フィクスチャ内のこれらの境界をエンコードしました。次のように実行します。 リプレイでは次のような結果が得られました。 分類子は優先順位を使用します。まず、exit zero フックが実際にサーバーに到達したかどうかを確認します。次に、永続性の受信を要求し、ブラウザの配信が最新であるかどうかを確認し、構成されたマニフェストを検証し、古い証拠を期限切れにし、期限までの正当な待機を維持してから、意図した結果が存在するかどうかを尋ねます。 治具 分類 オペレーターの判断 POST が失敗した後、送信者はゼロを終了します delivery failed hidden 送信者の標準エラー出力とサーバーの到達可能性を検査する HTTP は受け入れられましたが、ID が保存されていませんでした persistence unverified 輸送からストレージを推測しないでください SQLite にはイベントがありますが、WebSocket にはイベントがありません dashboard stale エージェントを診断する前に、再接続して再生を確認します チームイベントは必須ですが構成されていません manifest drift 固定されたマニフェストを更新または絞り込む 設定されたイベントが到着しない coverage gap マッチャー、フックプロセス、およびバージョンの互換性を検査する 権限の依存関係は期限前です waiting 決定をその所有者に伝えます。それを行き詰まっているとは言わないでください Stop が納品物の受領書なしで到着する false complete 実行をクリアする前に外部結果を検証してください 昔の出来事だけが残る stale 緑色の期限が切れ、証拠が入手できないと報告される すべての境界と結果は通過します healthy インストール全体を永久に続けるのではなく、この実行を受け入れます waiting ブランチは、一般的な誤ったアラームを防止します。権限リクエストに名前付きの所有者があり、期限が切れていない場合は、その後のツールの結果が存在しないことが予想されます。期限を過ぎた場合、または所有者が存在しない場合、同じ証拠が適用範囲または進捗上の問題になります。時間と所有権によって診断は変わります。イベント数だけでは不可能です。 false complete ブランチは、逆の間違いを防ぎます。 Claude Code の公式リファレンスでは、 Stop を応答の終わりとして定義しています。リポジトリは、そのライフサイクルの事実を忠実に表示できます。どちらのシステムも、宛先が変更されたとは主張していません。ファイルタスクには、予想されるパスとコンテンツのチェックが必要です。コードタスクには関連するテストが必要です。リモートアクションには宛先のレシートが必要です。モニタリング システムがそれ自体を認証できないように、これらのチェックはフック トランスポートの外側に置いてください。 プライバシーとのトレードオフもあります。リポジトリはオプションのチャット キャプチャをサポートし、プロンプト関連のデータを表示します。デリバリーヘルスはどちらも必要ありません。カナリアは、 source app 、 session id 、 hook event type 、タイムスタンプ、返されたイベント ID などの不透明な識別子のみを使用できます。可観測性を拡張する前にエンベロープを最小化します。 小型カナリアを運用し、実際の成果を検証する 5 つの限定されたステップで監査を導入します。 1. バージョンとスコープを固定します。 リポジトリのコミット、Claude Code バージョン、ソースアプリ識別子、および決定に必要な正確なライフサイクル イベントを記録します。いずれかのバージョンが変更された場合は、公式フックのリファレンスを確認してください。 2. 一意のカナリアを 1 つ送信します。 使い捨てのセッション ID と無害な PreToolUse ペイロードを使用します。 HTTP 200 が必要で、返された保存されたイベント ID を解析します。フック終了コードを単独で使用しないでください。 3. ストレージとプレゼンテーションを証明します。 すぐに /events/recent をクエリして、正確な ID を見つけます。 Vue クライアントまたはテスト WebSocket を /stream に再接続し、最初のリプレイまたはライブ メッセージで同じイベントを要求します。チェックは再生ウィンドウ内に留めておきます。固定されたサーバーは、WebSocket が開くと、最近の 300 行を送信します。 4. カバレッジと鮮度を確認します。 既知のライフサイクル シーケンスを実行し、監視されたイベント タイプを固定されたマニフェストと比較し、イベントごとの期限を適用します。ルート所有の許可は待機中として待機します。古い証拠をそのままにしておくのではなく、期限切れにします。 5. ユーザーの結果を個別に検証します。 期待されるファイル、テスト結果、タスクの状態、または外部効果をアサートします。その受信なしでライフサイクルが終了すると、モニターは false complete を報告する必要があります。 このプロセスには限界があります。固定されたリポジトリを介して構成された配信をテストします。すべてのペイロードの意味上の正確性を確立するわけではありません。利用可能なフックをすべて追加すると、遅延、ストレージ、機密データの漏洩が増加する可能性があります。通常、最小限のバージョン管理されたマニフェストは、無差別に収集するよりも安全です。 9 つのケースの結果は、運用環境における障害の蔓延ではなく、決定ルールを示しています。 Sidewisp は、別の Claude Code ランタイムやリポジトリの代替としてではなく、ヘルス レイヤーとしてこの境界に適合します。 Sidewisp は現在プライベートプレビュー段階です。 公開サイトとインタラクティブなデモンストレーションはライブですが、本番環境の Claude Code モニタリング アダプター、ライブ ヘルス コレクター、および自動リカバリ エグゼキューターは同梱されていません。回復は依然として計画的であり、承認が必要な機能です。現時点での正直な次のステップは、この受け取りモデルがエージェントの運用方法と一致する場合、プライベート プレビューの待機リストに参加することです。 このリポジトリでは、ルールをコンパクトに保ちます。ダッシュボード イベントは、観察されたアクティビティの証拠です。必要なイベント マニフェストが最新であり、カナリアにトランスポート、永続性、およびプレゼンテーションの受信があり、待機に所有者と期限があり、意図した結果が独自の確定的チェックに合格する場合にのみ、正常な実行を宣言します。