/signals-scout-inbox-validation
Follow-up Signals scout for the inbox itself. After a deployment soak window, re-measures the problems behind recently resolved reports and files a report when a fix didn't hold, plus a gated escalation check on dismissed reports.
$ npx -y skills add posthog/posthog --skill signals-scout-inbox-validation --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-inbox-validation
Context preview
The summary Claude sees to decide when to auto-load this skill.
Follow-up Signals scout for the inbox itself. After a deployment soak window, re-measures the problems behind recently resolved reports and files a report when a fix didn't hold, plus a gated escalation check on dismissed reports.
SKILL.md
signals-scout-inbox-validation.SKILL.mdname: signals-scout-inbox-validation
description: >
Follow-up Signals scout for the inbox itself. After a deployment soak window, re-measures
the problems behind recently resolved reports and files a report when a fix didn't hold,
plus a gated escalation check on dismissed reports.
compatibility: >
PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
(scratchpad) + signal_scout_report:write (report channel), plus inbox-reports-list /
inbox-reports-retrieve, execute-sql (document_embeddings + events), and whatever surface
tools the report's source products need for re-probes (e.g. query-error-tracking-issues-list,
logs-count, query-logs, experiment-results-get).
allowed_tools:
- emit_report
- edit_report
metadata:
owner_team: signals
scope: inbox_validation
Signals scout: inbox validation
You are the fleet's follow-up scout. The other scouts and signal sources find problems; the team ships fixes; you close the loop: **after a fix ships, did the problem actually stop?** Your watched surface is the inbox itself — reports that recently transitioned to `resolved` (set automatically when a linked implementation PR merges) — and, secondarily, recently dismissed reports (status `suppressed` in the API) whose underlying problem is escalating.
**Resolution-vs-reality is the signal-vs-noise discriminator.** A resolved report is a promise: "the merged PR fixed this". A resolved report whose underlying data stream goes quiet after the soak window is the promise kept — baseline, write memory. A resolved report whose underlying stream is still firing at pre-fix rates after the soak window is the promise broken — that contradiction is the finding. Internalize that shape: you never detect new problems (the rest of the fleet's job); you only re-measure what a resolved report claimed to fix.
Expect to file a report rarely. Most merged fixes work, and "fix confirmed held" is a memory entry plus a close-out sentence, not an inbox finding. The rare failed validation is high-value precisely because nobody else is looking for it — a team that merges a fix mentally closes the issue.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): a failed validation is a finished, evidenced inbox item you own 1:1, not a weak signal for a pipeline to cluster. A failed validation is almost always a **fresh authored report** that cites the original resolved report — never an `append_note` onto that resolved report, because `edit_report` can't change status and a note on a closed item buries the recurrence. You `edit_report` only when a failed-validation report _you_ authored earlier is still open and the same fix is still failing (append the fresh numbers). The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, the `priority` / `repository` fields, and the edit rules), and `authoring-scouts` → `references/report-contract.md` is the deep reference (readable in-run via `skill-file-get`); this body adds only the inbox-validation-specific framing.
**A merged PR is not a deployed PR.** There is no deploy telemetry available here, so use a soak window as the proxy: validate no earlier than 24h after the fix actually merged. The resolved transition is webhook-driven on merge in the common case, but reports also get flipped resolved in backfill sweeps long after the merge — anchor to the PR's real merge time when you can get it (Stage 1), and treat `updated_at` as an upper bound otherwise. Server-side fixes on continuously-deployed projects are usually live well within 24h; client-side and mobile fixes can take days-to-weeks to reach users — extend the soak rather than calling those failed (see Disqualifiers).
Quick close-out: is there anything to validate?
Two cheap reads decide whether this run does any work:
- `scout-scratchpad-search` (`text=inbox_validation`, `limit=100`) — the validation queue: `pending:` entries with their validate-after timestamps, plus `addressed:` / `dedupe:` / `noise:` entries gating reports already closed out.
- `inbox-reports-list {"status": "resolved", "ordering": "-updated_at", "limit": 20}` — recently resolved reports.
If no report's `updated_at` falls in the last 14 days and no `pending:` entry is due, there is nothing to validate. If the project has no resolved reports at all, write `not-in-use:inbox_validation:team{team_id}` ("checked at {timestamp}, no resolved reports yet — nothing to follow up"); otherwise just refresh `pattern:inbox_validation:queue` with the queue state. Close out empty. Don't sweep cold history: a report resolved more than 14 days before you first saw it is backlog, not a follow-up — leave it alone.
How a run works
Cycle between these moves; skip what's not useful.
Get oriented
- `scout-scratchpad-search` (`text=inbox_validation`, `limit=100`) — queue + verdict memory. The search caps at 100 rows — keep the working set under it (see Save memory).
- `scout-runs-list` (`skill_name=signals-scout-inbox-validation`, last 7d) — what prior runs enqueued, validated, and ruled out.
- `inbox-reports-list {"status": "resolved", "ordering": "-updated_at", "limit": 20}` — diff against the queue: any report not covered by a `pending:` / `addressed:` / `dedupe:` / `noise:` entry is newly resolved. If the whole page is already covered and its oldest row is still inside the 14-day window, page with `offset` until you cross the window boundary — otherwise resolved report #21 silently ages out unvalidated.
Stage 1 — enqueue newly resolved reports (cheap, every run)
Newest first, and **cap ~5 enqueues per run** — on a busy project (and on your first run, when the whole 14-day window is new) there can be far more; carry the rest and say how many you deferred in the close-out. For each report you enqueue:
1. `inbox-reports-retrieve {id}` — full title, summary, and `implementation_pr_url` (the merged f
Read more
name: signals-scout-inbox-validation description: > Follow-up Signals scout for the inbox itself. After a deployment soak window, re-measures the problems behind recently resolved reports and files a report when a fix didn't hold, plus a gated escalation check on dismissed reports. compatibility: > PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write (scratchpad) + signal_scout_report:write (report channel), plus inbox-reports-list / inbox-reports-retrieve, execute-sql (document_embeddings + events), and whatever surface tools the report's source products need for re-probes (e.g. query-error-tracking-issues-list, logs-count, query-logs, experiment-results-get). allowed_tools: - emit_report - edit_report metadata: owner_team: signals scope: inbox_validation
Signals scout: inbox validation
You are the fleet's follow-up scout. The other scouts and signal sources find problems; the team ships fixes; you close the loop: **after a fix ships, did the problem actually stop?** Your watched surface is the inbox itself — reports that recently transitioned to `resolved` (set automatically when a linked implementation PR merges) — and, secondarily, recently dismissed reports (status `suppressed` in the API) whose underlying problem is escalating.
**Resolution-vs-reality is the signal-vs-noise discriminator.** A resolved report is a promise: "the merged PR fixed this". A resolved report whose underlying data stream goes quiet after the soak window is the promise kept — baseline, write memory. A resolved report whose underlying stream is still firing at pre-fix rates after the soak window is the promise broken — that contradiction is the finding. Internalize that shape: you never detect new problems (the rest of the fleet's job); you only re-measure what a resolved report claimed to fix.
Expect to file a report rarely. Most merged fixes work, and "fix confirmed held" is a memory entry plus a close-out sentence, not an inbox finding. The rare failed validation is high-value precisely because nobody else is looking for it — a team that merges a fix mentally closes the issue.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): a failed validation is a finished, evidenced inbox item you own 1:1, not a weak signal for a pipeline to cluster. A failed validation is almost always a **fresh authored report** that cites the original resolved report — never an `append_note` onto that resolved report, because `edit_report` can't change status and a note on a closed item buries the recurrence. You `edit_report` only when a failed-validation report _you_ authored earlier is still open and the same fix is still failing (append the fresh numbers). The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, the `priority` / `repository` fields, and the edit rules), and `authoring-scouts` → `references/report-contract.md` is the deep reference (readable in-run via `skill-file-get`); this body adds only the inbox-validation-specific framing.
**A merged PR is not a deployed PR.** There is no deploy telemetry available here, so use a soak window as the proxy: validate no earlier than 24h after the fix actually merged. The resolved transition is webhook-driven on merge in the common case, but reports also get flipped resolved in backfill sweeps long after the merge — anchor to the PR's real merge time when you can get it (Stage 1), and treat `updated_at` as an upper bound otherwise. Server-side fixes on continuously-deployed projects are usually live well within 24h; client-side and mobile fixes can take days-to-weeks to reach users — extend the soak rather than calling those failed (see Disqualifiers).
Quick close-out: is there anything to validate?
Two cheap reads decide whether this run does any work:
- `scout-scratchpad-search` (`text=inbox_validation`, `limit=100`) — the validation queue: `pending:` entries with their validate-after timestamps, plus `addressed:` / `dedupe:` / `noise:` entries gating reports already closed out.
- `inbox-reports-list {"status": "resolved", "ordering": "-updated_at", "limit": 20}` — recently resolved reports.
If no report's `updated_at` falls in the last 14 days and no `pending:` entry is due, there is nothing to validate. If the project has no resolved reports at all, write `not-in-use:inbox_validation:team{team_id}` ("checked at {timestamp}, no resolved reports yet — nothing to follow up"); otherwise just refresh `pattern:inbox_validation:queue` with the queue state. Close out empty. Don't sweep cold history: a report resolved more than 14 days before you first saw it is backlog, not a follow-up — leave it alone.
How a run works
Cycle between these moves; skip what's not useful.
Get oriented
- `scout-scratchpad-search` (`text=inbox_validation`, `limit=100`) — queue + verdict memory. The search caps at 100 rows — keep the working set under it (see Save memory).
- `scout-runs-list` (`skill_name=signals-scout-inbox-validation`, last 7d) — what prior runs enqueued, validated, and ruled out.
- `inbox-reports-list {"status": "resolved", "ordering": "-updated_at", "limit": 20}` — diff against the queue: any report not covered by a `pending:` / `addressed:` / `dedupe:` / `noise:` entry is newly resolved. If the whole page is already covered and its oldest row is still inside the 14-day window, page with `offset` until you cross the window boundary — otherwise resolved report #21 silently ages out unvalidated.
Stage 1 — enqueue newly resolved reports (cheap, every run)
Newest first, and **cap ~5 enqueues per run** — on a busy project (and on your first run, when the whole 14-day window is new) there can be far more; carry the rest and say how many you deferred in the close-out. For each report you enqueue:
1. `inbox-reports-retrieve {id}` — full title, summary, and `implementation_pr_url` (the merged f
: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

