signals-scout-ai-observability について
チーム向けに LLM の利用状況を監視し、検証済みの変化を調査する AI 可観測性スキルです。履歴ベースライン、ディメンション分析、トレースのサンプルを組み合わせ、重複アラートを避けてレポートを作成・編集します。
主な機能
- 01コスト、レイテンシ、エラー、量の監視
- 02評価性能と設定の追跡
- 03クラスターとツール利用の変化分析
- 04異常の特定とトレースの抽出
- 05ベースライン、ノイズ、レポートの記憶
活用シーン
- 01モデル単位のコストやレイテンシ回帰の発見
- 02評価合格率の最近の低下の検出
- 03ツール呼び出しやエラー率の変化の特定
- 04既報の継続中の問題への証拠追加
MCP 対応
MCP が提供する読み取り機能でプロジェクトデータ、トレース、履歴、レポートを調査し、レポートチャネルで所見を作成・更新します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posthog/ skills --skill signals-scout-ai-observabilityインストール後、Claude Code で/signals-scout-ai-observabilityを入力して読み込まれたか確認します。
同梱ファイルreferences/lenses.md
詳細
Signals scout:AI オブザーバビリティ
このチームの LLM 利用状況における重要な変化(コスト、レイテンシ、エラー、ボリューム、評価パフォーマンス、評価/エンリッチメントの設定、クラスター、ツールの利用状況)を見つける、AI オブザーバビリティに特化したスカウトです。変化が信頼度の基準を満たした場合にのみ、レポートを提出してください。実行結果が空であることも正当な結果です。既知の問題を再報告するくらいなら、何も報告しないほうがよいです。
レポートはレポートチャネル(scout-emit-report/scout-edit-report)を通じて直接作成します。調査はすでに完了しているため、弱いシグナルをパイプラインに送ってクラスタリングさせるのではなく、各レポートを最初から最後まで一貫して担当します。その分、基準は高くなります。人が受信トレイで見て対応する、単独で成立する項目として自信を持てる、局所的で検証済みのリグレッションに限り、レポートを提出してください。現在も進行中の(または一度回復して再発した)リグレッションが、すでに受信トレイで扱われている場合は、新しいレポートではなく編集してください。ハーネスのプロンプトには、レポートチャネルの契約(フィールド、ステータスマッピング、レビュアーへの割り当て、重複排除、編集ルール)の全容が記載されています。この本文では、AI オブザーバビリティ固有の指針のみを追加します。
アクティビティ履歴の利用可否
アクティビティ履歴は任意です。この機能が利用可能な場合に限り、MCP が提供するリーダーのガイダンスを使用してください。以下のすべての履歴確認と、まとめて参照する情報に適用されます。
履歴リーダーが利用できない場合、またはアクセスを拒否された場合は、この実行の残りの間、そのリーダーの使用を中止してください。リーダーを再検出したり、制限を回避するためにエンドポイントを調べたり、アクセス制限が確認済みなのに不足ツールのレポートを提出したりしないでください。オブジェクト単位のリーダーを含め、利用可能で認可されたほかの履歴リーダーは引き続き使用し、利用可能なリーダーがない確認だけをスキップしてください。独立した確認は続行し、終了時のまとめに利用できなかった履歴を記載してください。履歴がないからといって、設定変更がなかったことにはなりません。意図的な編集ではないと確認する必要がある結論は保留し、独立した根拠で裏付けられる調査結果のみを報告してください。
簡易終了確認:AI オブザーバビリティは実際に使われているか?
スケジュール実行は、<precheck_result>ブロックから開始される場合があります。各行は過去 7 日間に到着した AI イベント 1 件を表すため、AI オブザーバビリティは使用中です。このブロックがある場合、この確認はスキップしてください。
プロファイルの surfaces["signals-scout-ai-observability"] エントリが in_use: false(過去 7 日間に $ai_* イベントがない)と示し、かつ get-llm-total-costs-for-project の支出がほぼゼロの場合、このチームは AI オブザーバビリティを使用していません。top_events に表示されないことは、その証拠にはなりません。top_events はボリューム上位のイベントのみを保持するためです。エントリが in_use: null の場合は、execute-sql を使って過去 7 日間の $ai_* イベント数を数えてください。スクラッチパッドに次のエントリを 1 つ書き込みます。
- キー:
not-in-use:llm_analytics:team{team_id} - 内容:簡潔なメモ(「{timestamp}に確認。過去 7 日間の LLM イベントなし、コスト $0」)
何も報告せずに終了します。今後の AI オブザーバビリティ実行では、このエントリを読み込んで数秒で処理を終了できます。同じキーで再実行するとタイムスタンプが冪等に更新されます。AI オブザーバビリティが実際に検出されるまではエントリが残り、その時点で次の実行がエントリを書き換えるか削除します。
実行の進め方
これらの手順を繰り返しながら進めてください。有用でないものはスキップし、有用なものは再確認してください。
状況を把握する
実行をコールドスタートする際は、次の3つを手早く確認します。
scout-scratchpad-search(text=llmまたはtext=ai_) — 過去の LLM に焦点を当てた実行から引き継がれる、チームの永続的な指針です。pattern:、noise:、addressed:、dedupe:、report:、reviewer:で始まるキーのエントリーには、通常の状態、すでに見つかっている事象、除外する項目、回帰を扱うレポート、担当者が記されています。これには、過去の実行で把握したベースライン、注目すべき切り口、評価ごと・モデルごとの範囲も含まれます。scout-runs-list(直近7日間) — 過去の AI オブザーバビリティスカウトが発見したこと、問題なしと判断したことを確認します。概要に目を通し、検討中のトピックに言及がある場合に限り、scout-runs-retrieveで詳細を取得します。scout-project-profile-get— LLM イベントの到達範囲と最近のバースト指標はtop_eventsで、すでに受信トレイにあるレポートはexisting_inbox_reportsで確認します。inbox-reports-list(search=モデル名/製品名/評価名、ordering=-updated_at) — すでに受信トレイにあるレポートを確認します。独自のレポートチャネルのレポートは、根拠となるシグナルをsource_product=signals_scout(llm_analyticsではありません)のもとに保存するため、source_product=llm_analyticsでは絞り込まないでください。自分が作成したレポートがすべて見つからなくなります。フィルターを省略するか、signals_scoutを指定してください。以前に報告したスライスで回帰が見つかった場合は、新規レポートではなく編集します。レポートを作成する前に、inbox-reports-retrieveで最も近いレポートを取得してください。
調査する:レンズ
以下のレンズは、注目すべき観点です。毎回すべてを実行しないでください。オリエンテーションの読み取り結果で興味深いと示されたもの、またはメモリ内で最も長く確認されていないものを選び、ローテーションさせてください。そうすることで、毎時間同じ指標を再調査するのではなく、時間をかけて全体像を把握できます。各レンズでの手順は、傾向 → 急増 → 局所化 → サンプリングです。最新の完全なバケットは、チーム独自のベースラインから外れているでしょうか(単なる日内の季節性ではなく)。ディメンションで分割して原因を局所化し、証拠として代表的なトレースを取得します。
| レンズ | 注目する点 | 詳細調査用スキル |
|---|---|---|
| コスト | 総支出がベースラインの約2倍以上で持続している、または特定のディメンションが上昇している | exploring-llm-costs |
| レイテンシ | $ai_latency の p50/p90/p99 の変化や急増、モデルごと | exploring-llm-traces |
| エラー | $ai_is_error/$ai_http_status の発生率または構成の変化 | exploring-llm-traces |
| ボリューム | 生成/トレース数やユニークユーザー数の急減または急増、暴走ループの形 | exploring-llm-traces |
| 評価パフォーマンス | 特定の評価の合格率/1日あたりの失敗数に最近変化がある | exploring-llm-evaluations |
| 評価/エンリッチメント設定 | 評価/タグ付け器/スコアラーが気づかれないまま壊れている、または設定ミスがある | exploring-llm-evaluations |
| クラスター | 新規のクラスター、増加中のクラスター、エラーの多いクラスター、または高コストのクラスター | exploring-llm-clusters |
| ツールの使用状況 | 呼び出されるツールの構成が変化している、トレースあたりのツール呼び出し数が増加している | exploring-llm-traces |
推測せず、チームのディメンションを特定してください。 組み込みのもの($ai_model、$ai_provider、ai_product、distinct_id、$ai_span_name、$ai_http_status、$ai_tools_called)に加えて、チームはカスタムプロパティ(feature、tenant_id、workflow_name)を追加しています。どのプロパティが存在するかを read-data-schema で確認し、有用な分割に使えるものを pattern:llm_analytics:dimensions として覚えておきます。
references/lenses.md はレンズごとのプレイブックです。各レンズのシグナル、分割するディメンション、確認すべき詳細調査用スキルとワークフロー、そして該当しない条件を読むために参照してください。詳細調査用スキル(exploring-llm-costs/-traces/-evaluations/-clusters と、HogQL 用の querying-posthog-data)はサンドボックスに組み込まれており、実際にメンテナンスされているクエリが含まれています。レンズを深掘りするときは、SQL を作り直すのではなく、該当するスキルを読んでください。
深掘りする
レンズが何かを示したら、トップラインの数値を報告するだけではなく、局所化してサンプリングしてください。
- 局所化します。 寄与している
$ai_generation/$ai_traceイベントをディメンション(モデル、$ai_span_name、ツール、ユーザー、ai_product、カスタムディメンション)で分割し、変化を引き起こしたスライスを示します。これにより、「コストが上がっている」というだけの報告と、報告に値する所見との違いが生まれます。 - サンプリングします。
query-llm-traceを使って代表的なトレースを1件または2件取得します(または、生の$ai_evaluation行からサンプリングした失敗した生成を取得します)。証拠として、具体的なトレース/生成/評価 ID を挙げてください。引用するトレースは/ai-observability/traces/<trace_id>にリンクします。クエリ結果の_posthogUrlを使ってください。生 SQL から ID しか取得できない場合は、その ID と該当する日付範囲を指定してquery-llm-traceを呼び出し、返された_posthogUrlを使ってください。トレースを取得できない場合は、ID のみを記載してください。トレースクエリをシリアライズして/insights/new#q=…にリンクを作成してはいけません。TraceQueryはインサイトのソースではないため、空のインサイトが開いてしまいます。 - 傾向が多くのトレースにまたがる場合は、パターンとしてまとめます。 行を列挙するのではなく、共通する特徴(同じモデルとスパン、同じツールエラー、同じプロンプトバージョン)を説明します。
進めながらメモリを保存する
メモリは継続的な作業であり、実行の最後にまとめるものではありません。今後の AI オブザーバビリティ実行で役立つ情報に気づいたら、その都度スクラッチパッドに記録してください。キーのプレフィックスに「カテゴリ」を含めると、今後の実行で text= 検索を1回行うだけで見つけられます。
- キー
pattern:llm_analytics:generation-baseline— 「$ai_generationは1日あたり約800k、ユーザー約6kがベースラインです。カウントとユーザー数の比率は、複数ステップのエージェントでは正常です。」 - キー
pattern:llm_analytics:dimensions— 「このチームで有用な切り分け項目:ai_product(posthog_ai / code / mcp / wizard)、model、feature。tenant_id は設定されていません。」 - キー
pattern:llm_analytics:latency-bands— 「モデルごとの p90:nano は約2秒、sonnet は約19秒、o3/preview は構造的に高く約40秒以上です。モデルごとに帯域を設定し、決して集計しないでください。」 - キー
noise:llm_analytics:o3-400-class— 「o3 の HTTP 400 は、無害な再発クラスです。2時間に100件を超えるか、日次発生率が0.05%を超えた場合に限り、再調査してください。」 - キー
addressed:llm_analytics:model-swap-2026-04-28— 「Sonnet → Opus は2026-04-28に切り替え済み。コストはベースラインの約2.1倍と予想されます。」 - キー
report:llm_analytics:<entity>— このスライス(モデル、ai_product、eval、クラスター)に関する回帰レポートで、あなたが作成したレポートのreport_id。次回の実行では重複作成せず、これを編集(新しい期間のデータを指定してappend_evidence)します。 - キー
reviewer:llm_analytics:<area>— 製品 / モデル / eval 領域の担当者(小文字の GitHub ログイン名のみ)。レポートをより迅速に担当者へ振り分けられます。
5回目の実行までには、チームの健全なベースライン、有用な切り分け項目、繰り返し発生するスパイク、比重を増減すべき eval、各領域の担当者が分かるようになります。
判断する
レポートを作成する前に、このスライスに既存のレポートがあるか確認してください。report:llm_analytics:<entity> のスクラッチパッドポインターが確実な方法です。report_id が保存されているため、そこから直接 inbox-reports-retrieve を実行できます。ポインターがない場合に限り、inbox-reports-list で検索(ordering=-updated_at)し、スライスに固有の語句(モデル、ai_product、eval 名、クラスター ID)で検索してください。latency のような広い語句では、利用頻度の高いプロジェクトで無関係なレポートが何百件も返され、自分のレポートが埋もれてしまいます。次に、候補ごとに以下を行います。
- 編集:受信トレイですでに該当範囲をカバーしている場合は、
scout-edit-reportを使って既存のレポートを編集します。リグレッションがまったく新しいケースであることはまれです。たとえば、コストが上昇したまま、レイテンシの範囲が回復していない、評価の失敗がまだ増えている、といったケースです。新しい期間の数値にはappend_evidenceを使います(または、自分が作成したレポートのタイトル/概要を書き換えます)。一致するレポートがあり、受信トレイで引き続き有効な場合は、これをデフォルトにします。ほぼ重複するレポートを新たに作成しないでください。**リグレッションが継続している場合、実行ごとにレポートは1つです。**新しい完全な期間で問題の継続が確認された場合、それは 再エスカレーション です。append_evidenceで新しい期間の情報をレポートに追加し、dedupe:ゲートを進めます。実行ごとに新しいレポートを作成してはいけません。****ただし、まず一致したレポートのステータスを確認してください。edit-reportではステータスを変更できないため、resolved/suppressed/failedのレポート(表示されないレポート)に追記すると、実際の再発がクローズ済みの項目に埋もれてしまいます。以前のレポートが有効でなくなっている場合は、再発について新しいレポートを作成し、report:llm_analytics:<entity>を新しい ID に付け替えます。 - 作成:受信トレイに該当範囲をカバーする有効な項目がない場合に限り、
scout-emit-reportで新しいレポートを作成します。既存のレポートが追跡しているリグレッションの新しい証拠は、新規レポートではなく編集です。emit-reportは、実際に未カバーの範囲(または「編集」の箇条書きに記したとおり、以前のレポートが有効でなくなっている再発)に使います。ここでの強い発見とは、証拠から疑いの余地なく結論が出ており、変化が集計上の見かけではなく特定の範囲に局在し、具体的なトレース/生成/評価/クラスタ ID とクエリ結果がevidenceに含まれているものです。コスト/レイテンシ/評価のリグレッションはグラフで表せます。chartsで該当範囲の日次系列を添付し、レポート上で固有のベースラインとの差が見えるようにします。コスト/レイテンシ/評価のリグレッションには、プロンプト、モデルの選択、再試行やフォールバックの経路など、その背後にコード上の変更箇所があります。証拠からそのいずれかが特定できる場合は、actionability=immediately_actionableを設定し、priorityを指定して、呼び出し元を所有するrepositoryを指定します(どのリポジトリか判断できない場合は、選択で特定できるようにフィールドを省略します)。まだ特定できていない根本原因を調べることが調査の目的であり、人間からの入力が必要な理由ではありません。次の一手が、人間にしか決められない判断(コストをかけるかどうかのトレードオフ、モデルの切り替え、プロバイダー側の変更)であるリグレッションには、actionability=requires_human_inputを使い、その場合は**priorityとrepositoryを未設定のままにします**。これらは PR の自動開始に使うフィールドであり、repositoryを指定せずにpriorityとsuggested_reviewersを指定すると、PR の意図を示したことになり、リポジトリ選択用サンドボックスが起動して何もせず終了します(自動開始にはimmediately_actionableが必要です)。いずれの場合も、必ずsuggested_reviewersを設定してください。scout-members-listで担当者を特定し、解決済みのgithub_login(または{user_uuid})をオブジェクトとして渡します。suggested_reviewersは文字列のリストではなく、オブジェクトのリストです(ログイン名はreviewer:llm_analytics:<area>キーにキャッシュします)。これによりレポートが担当者に届きます。空のままにすると担当者が割り当てられず、見落とされる可能性があります。作成後は、report_idを含むreport:llm_analytics:<entity>のスクラッチパッドエントリーを記録し、次回の実行で重複作成せずに編集できるようにします。 - 記録:基準には達しないものの今後も追跡する価値がある場合や、除外した内容とその理由を残す場合は、記録します。
- スキップ:
noise:/addressed:/dedupe:のプレフィックスを持つキーのスクラッチパッドエントリー、または既存の受信トレイレポートがすでに該当内容をカバーしている場合は、最終サマリーに1行のメモを残してスキップします。
以前の実行ですでに該当トピックを扱っている場合は、ほぼ重複するレポートを作成するのではなく、編集またはスキップし、メモリを更新することをデフォルトにします。同じ事実が受信トレイに2回載ると、1回の実行で1件の発見を見逃すよりも、シグナル対ノイズ比が低下します。
締めくくり
実行内容を要約する — 1 段落で、どのレンズを確認したか、どのレポートを作成または編集したか、何を記憶したか、何をどのような理由で対象外としたかを記述してください。ハーネスはこの要約を検索可能な文章として実行行に書き込みます。今後の実行では、scout-runs-list を使ってこの要約を参照します。別途「実行メタデータ」のスクラッチパッド項目は書かないでください。実行の要約がすでにその役割を果たしており、実行ごとの重複したスクラッチパッド項目は、永続的に保持される情報を煩雑にします。
除外条件(スキップする項目)
- Anthropic / OpenAI のレート制限エラー — エラートラッキングのレンズにも表示されます。スクラッチパッドにこれらの
noise:項目があればスキップし、なければ 1 件残してください。 - 開発者 1 人によるローカルテスト —
properties.environment ∈ {dev, local}または内部ユーザーに該当する場合です。評価する前にフィルタリングしてください。 - CI / 評価実行 — CI パイプラインからの大量の
$ai_evaluationはユーザー向けのトラフィックではありません。リグレッションとして扱う前に、呼び出し元のユーザー/ソースを確認してください。 - スケジュールされたバッチジョブ中のコスト急増 — 夜間に定期実行されるベンチマークは、コスト急増として表示されます。その実行頻度をメモリに記録してください。
- HITL による中断/キャンセル — 生の
$ai_is_errorの件数が増えるため、エラーの傾向を評価する前にフィルタリングしてください。 - 評価合格率だけの低下 — 有効になっている
llm_analytics:evaluationシグナルソースを通じて、自動的に受信トレイに流れ込みます。自動処理では特定できない原因を突き止めた場合にのみ、レポートを作成してください。 - プロバイダー側のインシデント — 既知の上流障害中に発生した 429/5xx の急増は、PostHog 側のバグではありません。まず発生時刻がステータス情報と一致するか確認してください。
判断に迷った場合は、レポートを提出するのではなく、メモリエントリを記録してください。コスト/評価のシグナルは財務チームや ML チームに大きな懸念をもたらすため、誤検知はすぐに信頼を損ないます。
MCP ツール
テレメトリとコスト:
query-llm-traces-list— 最近のトレースを取得します。ユーザー/モデル/コスト/エラー/ツールで絞り込めます。query-llm-trace— 単一のトレースを詳しく調べます(リクエスト/レスポンス全体、ツール呼び出し、スパン)。get-llm-total-costs-for-project— コストの概要を確認します。query-trends— 集計で必要な計算を維持できる場合に、$ai_*イベントのネイティブな傾向、内訳、比較を取得します。execute-sql—$ai_*イベントの傾向や内訳を調べる主力ツールです(HogQL の適切な使い方についてはposthog:querying-posthog-dataを参照してください)。
評価とエンリッチメントの設定:
llma-evaluation-list— 評価の設定のみを取得します(名前、タイプ、有効/無効)。合格率はここにはありません。execute-sqlを使って$ai_evaluationイベントから傾向を確認してください(これが信頼できる方法です)。llma-evaluation-report-list/-run-list— 評価に設定された定期 AI レポートと、過去の実行内容を確認します(詳細調査用であり、主要な情報源ではありません)。llma-evaluation-get/-test-hogと組み合わせてください。llma-tagger-list/llma-score-definition-list— エンリッチメントの設定を確認します(自動タグ付けとスコアリング。気づかないうちに壊れる可能性がある LLM/Hog ジョブです)。llma-clustering-job-list/-get— トレース/生成内容に対するセマンティッククラスタを確認します。llma-prompt-list/-get— 変更とその原因を関連付けるために、プロンプトのバージョンを確認します。
スキーマ:
read-data-schema— イベント、プロパティ、チーム独自のディメンションを確認してから、それらを使って絞り込みやグループ化を行います。
受信トレイとレビュアーの割り当て:
inbox-reports-list/inbox-reports-retrieve— 受信トレイにある既存のレポートを確認します。新規作成の前に調べ、重複させずに編集してください(ordering=-updated_at)。inbox-report-artefacts-list— 比較対象となるレポートのアーティファクトログを確認します。割り当てられたsuggested_reviewersはここにあり、レポートレコードからは取得できません。過去のレビュアー選定の参考になります。scout-members-list— このプロジェクトのメンバーと、そのuser_uuidおよび解決済みのgithub_loginを確認します。どちらの値でもオーナーを割り当てられます。github_loginが null の場合はuser_uuidを使用してください。組織スコープのリゾルバーツールは Scout の実行時には使用できません。
ハーネスレベル:
scout-project-profile-get— 初期状況を把握するためのスナップショットです。scout-scratchpad-search/scout-scratchpad-remember— 実行をまたいで指針を保持します。scout-runs-list/scout-runs-retrieve— 過去の実行で判明したことを確認します。scout-emit-report/scout-edit-report— レポートを作成/既存のレポートを編集します(レポートチャネルの契約はハーネスプロンプトに記載されています)。scout-members-list—suggested_reviewersの割り当てに使用する、このプロジェクトのメンバーと解決済みのgithub_loginを確認します。
詳細調査用スキル(サンドボックスに組み込まれています。詳細調査を行う際は、クエリを一から作り直さず、該当するスキルを参照してください):posthog:exploring-llm-costs、posthog:exploring-llm-traces、posthog:exploring-llm-evaluations、posthog:exploring-llm-clusters、posthog:querying-posthog-data。各スキルがどのレンズに対応するかは references/lenses.md を参照してください。
終了するタイミング
- スクラッチパッド、最近の実行、プロフィールに特筆事項がない場合は、成果なしとして終了します。
- 候補が
noise:/addressed:/dedupe:のキー接頭辞を持つスクラッチパッドのエントリー、または既存の受信トレイレポートと一致する場合は、1 行のメモを添えて編集するか、対応を見送ります。 - 仮説をいくつか検証し、確度の高い内容についてレポートを提出したら、さらに調査できることが残っていても終了します。レポートは少数精鋭を心がけます。
「調べたものの、有意義なものは見つからなかった」ことも正当な結果であり、失敗ではありません。