Skip to content
Development
Skill

/signals-scout-inbox-validation

Follow-up Signals scout for the inbox itself. Re-measures the problems behind recently resolved reports after a soak window and reports when a fix didn't hold, plus a gated escalation check on dismissed reports.

From plugin
posthog
84164 skills1 agent3 commands2 hooks
+1
Install
$ npx -y skills add PostHog/ai-plugin --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. Re-measures the problems behind recently resolved reports after a soak window and reports 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. Re-measures the problems behind recently
  resolved reports after a soak window and reports 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 fix; occasionally nu

Read more
Ships withposthog

Official PostHog plugin for AI clients. Access PostHog products directly from your AI coding tool.

Get the whole plugin

Other skills on posthog.