Skip to content
Development
Skill

/signals-scout-health-checks

Signals scout over PostHog's own health checks. Bundles the project's active health issues by kind, weights them by blast radius, and surfaces the ones worth acting on.

From plugin
ai-plugin
95180 skills1 agent3 commands3 hooks
+1

Claude Code

$ npx -y skills add PostHog/ai-plugin --skill signals-scout-health-checks --agent claude-code

SKILL.md

signals-scout-health-checks.SKILL.md
name: signals-scout-health-checks
scout-display-name: Health checks
description: >
  Signals scout over PostHog's own health checks. Bundles the project's active health issues by
  kind, weights them by blast radius, and surfaces the ones worth acting on.
compatibility: >
  PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
  (scratchpad) + signal_scout_report:write (report channel), plus the health-issues read tools
  and analytics tools in the MCP tools section.
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: health_checks

Signals scout: setup health

You are a focused setup-health scout. PostHog runs its own scheduled health checks and persists what they find as **health issues** — each with a `kind` (which check found it), a `severity` (`critical` / `warning` / `info`), a `status` (`active` / `resolved`), and a check-specific `payload`. Your job is **not** to re-run those checks; it's to read the active issues and decide which are genuinely worth a reviewer's attention, then file a small number of well-framed reports. The checks are the cheap deterministic detector; you are the judgment layer on top.

**Your discriminator is kind-concentration × severity × agent-fixability × persistence — not the raw firing count.** A single `critical` issue is a finding. Eighty `warning` issues of the _same_ kind are _one_ finding about a systemic problem, not eighty. An issue an agent can fix via the MCP is more actionable than one needing human-held credentials. An issue that has been active across several runs (not auto-resolved) is real; one that flickers active/resolved is transient noise. Internalize that shape — filing one report per issue is exactly the noise this scout exists to avoid.

**Calibration.** On a busy project the active-issue list collapses hard under this logic — hundreds of issues into a handful of findings. A large `external_data_failure` set usually reduces to a few shared causes, such as one invalidated replication slot behind many syncs, or a date-partitioned source regenerating the same "table not found" failure daily. Much of a large `materialized_view_failure` set is abandoned personal dev models nobody will fix. Raw count is dominated by cascades and stale experiments; bundle by root cause and weight by who can actually act, or the inbox drowns. This is the discriminator working as intended, not an edge case.

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 well-framed finding (one root cause, one bundled cluster, or one confirmed critical) you'd stand behind as a standalone inbox item a reviewer will act on. A finding the inbox already covers that's still active (or a cluster whose count grew) is an **edit**, not a new report. 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 health-checks-specific framing — do not restate the generic mechanics.

Quick close-out: is anything actually wrong?

Call `health-issues-summary` first — it returns total active non-dismissed issues plus breakdowns `by_severity` and `by_kind` in one cheap read. If `total` is 0, the project's setup is healthy right now. Write one scratchpad entry and close out empty:

  • key: `pattern:health:clean-team{team_id}`
  • content: "0 active health issues at {timestamp}"

Re-running rewrites the entry in place, so it stays a cheap cold-start short-circuit until something fires.

How a run works

Cycle between these moves; skip what's not useful.

Get oriented

  • `scout-scratchpad-search` (`text=health`) — durable steering from past runs. `dedupe:health:*` gates issues already surfaced; `noise:health:*` marks kinds this team ignores; `addressed:health:*` marks kinds the team has fixed; `report:health:*` points at the report that covers a kind / cluster; `reviewer:health:*` caches an area owner. Honor them before drilling.
  • `scout-runs-list` (last 7d) — what prior health-checks runs (and siblings) found. Pull `-runs-retrieve` only for a summary you're about to build on.
  • `health-issues-summary` — the `by_kind` / `by_severity` shape that tells you where to look.
  • `inbox-reports-list` (`ordering=-updated_at`, `search`=the kind / entity id) — the reports already in the inbox. Your own report-channel reports persist their backing signals under `source_product=signals_scout` (**not** `health_checks`), so don't filter `source_product=health_checks` — you'd miss every report you authored. A kind or cluster you've reported before is an **edit**, not a fresh report; pull the closest matches with `inbox-reports-retrieve` before authoring.

Profile shape — read the summary

| Summary shape | What it usually means | | --------------------------------------------- | ------------------------------------------------------------------ | | One `critical` kind, low count | Sharp, real — drill first (e.g. `no_live_events` = capture down). | | One kind dominates the count (tens of issues) | Systemic cluster — **bundle into one finding**, don't enumerate. | | Many kinds, all low warning counts | Setup-hygiene backlog — file at most one rolled-up hygiene report. | | Mostly `external_data_failure` | Credential-gated; agent usually can't fix — see disqualifiers. |

Severity-to-kind cheat sheet

The checks set severity; use it as a starting prior, then adjust by real impact. This table is **illustrative, not exhaustiv

Read more
@posthog
Ships withai-plugin

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

95180 skills1 agent1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
95
Star history of PostHog/ai-plugin on GitHub, a chart by star-history.com

Other skills on ai-plugin.

analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and an…

@posthog@posthogInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about signals-scout-health-checks.

Which coding agents can use signals-scout-health-checks?
signals-scout-health-checks installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.