Skip to content
Data
Skill

/signals-scout-health-checks

Signals scout over PostHog's own health checks. Reads the project's active health issues, bundles them by kind, weights by blast radius, and files the ones genuinely worth acting on as reports in the inbox.

From plugin
posthog
38k156 skills11 agents1 command2 MCP
Install
$ npx -y skills add posthog/posthog --skill signals-scout-health-checks --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-health-checks

Context preview

The summary Claude sees to decide when to auto-load this skill.

Signals scout over PostHog's own health checks. Reads the project's active health issues, bundles them by kind, weights by blast radius, and files the ones genuinely worth acting on as reports in the inbox.

SKILL.md

signals-scout-health-checks.SKILL.md
name: signals-scout-health-checks
description: >
  Signals scout over PostHog's own health checks. Reads the project's active health issues,
  bundles them by kind, weights by blast radius, and files the ones genuinely worth acting on
  as reports in the inbox.
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 (dogfooded on a real high-volume project).** A live project with ~180 active issues collapsed to ~4 findings under this logic. Most of a ~95-issue `external_data_failure` set reduced to a few shared causes — one invalidated replication slot behind many syncs, a date-partitioned source regenerating the same "table not found" failure daily — and much of an ~80-issue `materialized_view_failure` set was 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,

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.