/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.
Claude Code
$ npx -y skills add PostHog/ai-plugin --skill signals-scout-health-checks --agent claude-code
Codex
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a codex -y
Cursor
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a cursor -y
Gemini CLI
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a gemini-cli -y
GitHub Copilot
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a github-copilot -y
OpenCode
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a opencode -y
Windsurf
$ npx skills add PostHog/ai-plugin --skill signals-scout-health-checks -a windsurf -y
SKILL.md
signals-scout-health-checks.SKILL.mdname: 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
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
Official PostHog plugin for AI clients. Access PostHog products directly from your AI coding tool.
Other skills on ai-plugin.
More skills from other plugins.
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
ask-matt
Ask which skill or flow fits your situation. A router over the skills in this repo.
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.

