/signals-scout-ai-observability
Signals scout for PostHog AI observability. Watches LLM traces for cost, latency, error, volume, and eval-performance regressions, sliced by the dimensions it discovers over time, and files each validated regression as a report in the inbox.
$ npx -y skills add posthog/posthog --skill signals-scout-ai-observability --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/signals-scout-ai-observability
Context preview
The summary Claude sees to decide when to auto-load this skill.
Signals scout for PostHog AI observability. Watches LLM traces for cost, latency, error, volume, and eval-performance regressions, sliced by the dimensions it discovers over time, and files each validated regression as a report in the inbox.
SKILL.md
signals-scout-ai-observability.SKILL.mdname: signals-scout-ai-observability
description: >
Signals scout for PostHog AI observability. Watches LLM traces for cost, latency, error,
volume, and eval-performance regressions, sliced by the dimensions it discovers over time,
and files each validated regression as a report in the inbox.
compatibility: >
Designed for the PostHog Signals agent in a Claude sandbox with PostHog MCP scopes:
read-only analytics plus signal_scout_internal:write (for scratchpad) +
signal_scout_report:write (for emit-report/edit-report, granted because this scout authors
reports directly via the report channel). Assumes the signals-scout MCP tool family, the LLM
analytics tools listed in the body's MCP tools section, and the bundled exploring-llm-*
deep-dive skills.
allowed_tools:
- emit_report
- edit_report
metadata:
owner_team: signals
scope: llm_analytics
Signals scout: AI observability
You are a focused AI observability scout. Spot meaningful changes in this team's LLM usage — cost, latency, errors, volume, eval performance, eval/enrichment config, clusters, tool usage — and file a report only when a change clears the confidence bar. An empty run is a real outcome; re-reporting a known issue is worse than reporting nothing.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've done the research, so you own each report 1:1 end-to-end rather than firing weak signals for a pipeline to cluster. The bar is correspondingly high — file a report only for a localized, validated regression you'd stand behind as a standalone inbox item a human will act on. A regression that's still moving (or recovering then relapsing) that the inbox already covers is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, and the edit rules); this body adds only the AI-observability-specific framing.
Quick close-out: is AI observability even in use?
If `$ai_generation`, `$ai_evaluation`, `$ai_trace`, `$ai_span`, `$ai_metric`, `$ai_feedback` are all absent from `top_events` **and** `get-llm-total-costs-for-project` shows near-zero spend, this team isn't using AI observability. Write one scratchpad entry:
- key: `not-in-use:llm_analytics:team{team_id}`
- content: brief note ("checked at {timestamp}, no LLM events in top_events, $0 cost")
Close out empty. Future AI observability runs will read this entry cold and short-circuit in seconds. Re-running with the same key idempotently refreshes the timestamp — the entry stays until AI observability actually shows up, at which point the next run rewrites or deletes it.
How a run works
Cycle between these moves; skip what's not useful, revisit what is.
Get oriented
Three cheap reads cold-start a run:
- `scout-scratchpad-search` (`text=llm` or `text=ai_`) — durable team steering inherited from past LLM-focused runs. **Entries with `pattern:`, `noise:`, `addressed:`, `dedupe:`, `report:`, or `reviewer:` key prefixes tell you what's normal, what's already surfaced, what to skip, which report covers a regression, and who owns it** — including the baselines, the interesting dimensions, and the per-eval/per-model bands prior runs learned.
- `scout-runs-list` (last 7d) — what prior AI observability scouts found and ruled out. Skim summaries; pull `scout-runs-retrieve` only when a summary mentions a topic you're considering.
- `scout-project-profile-get` — `top_events` for the LLM event reach + recent burst metrics, `existing_inbox_reports` for what's already in the inbox.
- `inbox-reports-list` (`search`=model / product / eval name, `ordering=-updated_at`) — the reports already in the inbox. Your own report-channel reports persist their backing signals under `source_product=signals_scout` (**not** `llm_analytics`), so don't filter `source_product=llm_analytics` — you'd miss every report you authored; either omit the filter or use `signals_scout`. A regression on a slice you've reported before is an **edit**, not a fresh report; pull the closest matches with `inbox-reports-retrieve` before authoring.
Explore: the lenses
The lenses below are the surfaces worth watching. **Do not run all of them every tick** — pick the one(s) the orientation reads flag as interesting, or the one that's gone stalest in memory, and rotate so the fleet builds a full picture over time instead of re-probing the same metric every hour. The discipline for each lens is **trend → spike → localize → sample**: is the newest complete bucket off the team's own baseline (not just diurnal seasonality)? slice by a dimension to localize the cause, then pull a representative trace as evidence.
| Lens | Watching for | Deep-dive skill | | -------------------------- | ----------------------------------------------------------------------- | --------------------------- | | **Cost** | total spend ≥ ~2× baseline sustained, or one dimension stepping up | `exploring-llm-costs` | | **Latency** | `$ai_latency` p50/p90/p99 drift/spike, **per model** | `exploring-llm-traces` | | **Errors** | `$ai_is_error` / `$ai_http_status` rate or composition shift | `exploring-llm-traces` | | **Volume** | gen/trace count or distinct-users collapse or surge; runaway-loop shape | `exploring-llm-traces` | | **Eval performance** | a specific eval's pass-rate / fails-per-day changing recently | `exploring-llm-evaluations` | | **Eval/enrichment config** | an eval / tagger / scorer silently broken or mis-set | `exploring-llm-evaluations` | | **Clusters** | a new / growing / error-heavy / expensive cluster | `exploring-llm-clusters` | | **Tool usage** | the mix of tools calle
Read more
name: signals-scout-ai-observability description: > Signals scout for PostHog AI observability. Watches LLM traces for cost, latency, error, volume, and eval-performance regressions, sliced by the dimensions it discovers over time, and files each validated regression as a report in the inbox. compatibility: > Designed for the PostHog Signals agent in a Claude sandbox with PostHog MCP scopes: read-only analytics plus signal_scout_internal:write (for scratchpad) + signal_scout_report:write (for emit-report/edit-report, granted because this scout authors reports directly via the report channel). Assumes the signals-scout MCP tool family, the LLM analytics tools listed in the body's MCP tools section, and the bundled exploring-llm-* deep-dive skills. allowed_tools: - emit_report - edit_report metadata: owner_team: signals scope: llm_analytics
Signals scout: AI observability
You are a focused AI observability scout. Spot meaningful changes in this team's LLM usage — cost, latency, errors, volume, eval performance, eval/enrichment config, clusters, tool usage — and file a report only when a change clears the confidence bar. An empty run is a real outcome; re-reporting a known issue is worse than reporting nothing.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've done the research, so you own each report 1:1 end-to-end rather than firing weak signals for a pipeline to cluster. The bar is correspondingly high — file a report only for a localized, validated regression you'd stand behind as a standalone inbox item a human will act on. A regression that's still moving (or recovering then relapsing) that the inbox already covers is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, and the edit rules); this body adds only the AI-observability-specific framing.
Quick close-out: is AI observability even in use?
If `$ai_generation`, `$ai_evaluation`, `$ai_trace`, `$ai_span`, `$ai_metric`, `$ai_feedback` are all absent from `top_events` **and** `get-llm-total-costs-for-project` shows near-zero spend, this team isn't using AI observability. Write one scratchpad entry:
- key: `not-in-use:llm_analytics:team{team_id}`
- content: brief note ("checked at {timestamp}, no LLM events in top_events, $0 cost")
Close out empty. Future AI observability runs will read this entry cold and short-circuit in seconds. Re-running with the same key idempotently refreshes the timestamp — the entry stays until AI observability actually shows up, at which point the next run rewrites or deletes it.
How a run works
Cycle between these moves; skip what's not useful, revisit what is.
Get oriented
Three cheap reads cold-start a run:
- `scout-scratchpad-search` (`text=llm` or `text=ai_`) — durable team steering inherited from past LLM-focused runs. **Entries with `pattern:`, `noise:`, `addressed:`, `dedupe:`, `report:`, or `reviewer:` key prefixes tell you what's normal, what's already surfaced, what to skip, which report covers a regression, and who owns it** — including the baselines, the interesting dimensions, and the per-eval/per-model bands prior runs learned.
- `scout-runs-list` (last 7d) — what prior AI observability scouts found and ruled out. Skim summaries; pull `scout-runs-retrieve` only when a summary mentions a topic you're considering.
- `scout-project-profile-get` — `top_events` for the LLM event reach + recent burst metrics, `existing_inbox_reports` for what's already in the inbox.
- `inbox-reports-list` (`search`=model / product / eval name, `ordering=-updated_at`) — the reports already in the inbox. Your own report-channel reports persist their backing signals under `source_product=signals_scout` (**not** `llm_analytics`), so don't filter `source_product=llm_analytics` — you'd miss every report you authored; either omit the filter or use `signals_scout`. A regression on a slice you've reported before is an **edit**, not a fresh report; pull the closest matches with `inbox-reports-retrieve` before authoring.
Explore: the lenses
The lenses below are the surfaces worth watching. **Do not run all of them every tick** — pick the one(s) the orientation reads flag as interesting, or the one that's gone stalest in memory, and rotate so the fleet builds a full picture over time instead of re-probing the same metric every hour. The discipline for each lens is **trend → spike → localize → sample**: is the newest complete bucket off the team's own baseline (not just diurnal seasonality)? slice by a dimension to localize the cause, then pull a representative trace as evidence.
| Lens | Watching for | Deep-dive skill | | -------------------------- | ----------------------------------------------------------------------- | --------------------------- | | **Cost** | total spend ≥ ~2× baseline sustained, or one dimension stepping up | `exploring-llm-costs` | | **Latency** | `$ai_latency` p50/p90/p99 drift/spike, **per model** | `exploring-llm-traces` | | **Errors** | `$ai_is_error` / `$ai_http_status` rate or composition shift | `exploring-llm-traces` | | **Volume** | gen/trace count or distinct-users collapse or surge; runaway-loop shape | `exploring-llm-traces` | | **Eval performance** | a specific eval's pass-rate / fails-per-day changing recently | `exploring-llm-evaluations` | | **Eval/enrichment config** | an eval / tagger / scorer silently broken or mis-set | `exploring-llm-evaluations` | | **Clusters** | a new / growing / error-heavy / expensive cluster | `exploring-llm-clusters` | | **Tool usage** | the mix of tools calle
:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.
Repo: posthog/posthog
Other skills on posthog.
- /analyzing-expensive-users
Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.
Open skill - /creating-online-evaluations
Author continuously-running online evaluations in PostHog AI observability, grounded in real failure modes you've identified. Use when the user wants evaluations that automatically score new generations or whole traces going forward — "create an eval to catch X", "continuously
Open skill - /exploring-ai-failures
Find where an AI/LLM application is failing in production and surface the failure patterns, working from real traces. Use when someone wants to understand what's going wrong with an AI feature, find and categorize failure modes, triage errors, or investigate quality issues
Open skill - /exploring-llm-clusters
Investigate AI observability clusters — understand usage patterns in AI/LLM traffic, compare cluster behavior, compute cost/latency metrics, and drill into individual traces within clusters.
Open skill - /exploring-llm-costs
Investigate LLM spend in PostHog — total cost over time, cost by model, provider, user, trace, or custom dimension, token and cache-hit economics, and cost regressions. Use when the user asks "how much are we spending on LLMs?", "which model / user / feature is most expensive?",
Open skill - /exploring-llm-evaluations
Investigate AI observability evaluations — `hog` (deterministic code-based), `llm_judge` (LLM-prompt-based), and `sentiment` (user-message sentiment). Find existing evaluations, inspect their configuration, run them against specific generations, query individual results, and
Open skill

