Skip to content
Data
Skill

/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.

From plugin
posthog
38k156 skills11 agents1 command2 MCP
Install
$ npx -y skills add posthog/posthog --skill signals-scout-inbox-validation --agent claude-code

How 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.md
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

Read more
Ships withposthog

: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.

Get the whole plugin

Other skills on posthog.