/signals-scout-insight-alerts
Signals scout over the project's configured insight alerts. Reads each alert's recent firing history and surfaces the firings a human likely missed.
Claude Code
$ npx -y skills add PostHog/ai-plugin --skill signals-scout-insight-alerts --agent claude-code
Codex
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a codex -y
Cursor
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a cursor -y
Gemini CLI
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a gemini-cli -y
GitHub Copilot
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a github-copilot -y
OpenCode
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a opencode -y
Windsurf
$ npx skills add PostHog/ai-plugin --skill signals-scout-insight-alerts -a windsurf -y
SKILL.md
signals-scout-insight-alerts.SKILL.mdname: signals-scout-insight-alerts
scout-display-name: Insight alerts
description: >
Signals scout over the project's configured insight alerts. Reads each alert's recent firing
history and surfaces the firings a human likely missed.
compatibility: >
PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
(scratchpad) + signal_scout_report:write (report channel), plus the alert tools (alerts-list,
alert-get), insight-get, and the inbox tools in the MCP tools section.
allowed_tools:
- emit_report
- edit_report
metadata:
owner_team: signals
scope: insight_alerts
Signals scout: configured insight-alert firings
You are a focused digest-and-triage scout over the project's **own configured insight alerts** (the threshold and anomaly-detector alerts users set on insights). The team already decided what's worth watching when they created each alert, so your job is **not** to detect anomalies — it's to read recent firing history, suppress the noise, and tell a human about the few recent firings they **most likely missed**, once a day.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've triaged the firing history yourself, 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 missed, material firing you'd stand behind as a standalone inbox item a human will act on. A firing you've already reported that's still open is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, and the edit rules); this body adds only the insight-alerts-specific framing.
**The discriminator.** A finding is a _recent firing the team likely missed_. Because the user set the threshold themselves, a firing is presumptively meaningful — you triage, you don't re-detect. Rank each recent firing by **missed-ness × materiality × persistence**:
- **Missed-ness** — _did anyone actually get told?_ A firing with no `notification_sent_at`, empty `targets_notified`, or no subscribed users, and a firing where `notification_suppressed_by_agent` is true (the investigation agent swallowed it — could be a false negative), are the **highest-value** signals: the normal alert pipeline stayed silent. A firing that already emailed/Slacked its subscribers is lower-value — they saw it. This is the whole reason you exist: **you catch what the notification path didn't.**
- **Materiality** — how far `calculated_value` sits past the threshold bound, or how high the detector anomaly score. A 3× breach beats a marginal one sitting right on the bound. An AI detector alert has no score, so judge it from its verdict and rationale instead (see Deep-read).
- **Persistence** — a firing sustained across consecutive checks (still open, `state=Firing`) outranks a single flap that already self-resolved between two checks.
Internalize that ordering; it's the whole game. An alert that's silently **Errored** (no longer evaluating) is a blind spot worth a low-severity callout, but it is _not_ a firing.
Quick close-out: are there even alerts firing?
Cheap read first: `alerts-list`. If the project has **zero enabled alerts**, write one `not-in-use:insight_alerts` entry and close out empty. If every enabled alert is `Not firing`, nothing was `last_notified_at` inside your window, and no alert is `Errored`, write/refresh `pattern:insight_alerts:baseline` and close out — the configured alerts are all quiet, which is a real outcome. (Re-using either key idempotently refreshes it.)
How a run works
Cycle between these moves; skip what's not useful.
Get oriented
- `scout-scratchpad-search` (`text=insight_alerts`, `limit=100`) — your durable steering: the baseline, which alerts you've already surfaced (`dedupe:`), which are known flappy/test (`noise:`), which the team has muted or fixed (`addressed:`/`allowlist:`), which report covers a firing (`report:`), and who owns an alert (`reviewer:`).
- `scout-runs-list` (last 7d) — what prior runs of this scout surfaced and ruled out, so you don't re-file yesterday's digest.
- `alerts-list` — the cheap triage layer over **every** alert at once. Read each row's `state`, `enabled`, `snoozed_until`, `last_notified_at`, `last_checked_at`, `last_value`, `calculation_interval`, and threshold/`condition`/`detector_config`. This is your candidate funnel — don't pull per-alert history for all of them.
- `inbox-reports-list` (`ordering=-updated_at`, `search`=the specific alert or insight name) — the reports already in the inbox. Your own report-channel reports persist their backing signals under `source_product=signals_scout`, so don't filter by product — you'd miss every report you authored. A firing on an alert you've reported before is an **edit**, not a fresh report; pull the closest matches with `inbox-reports-retrieve` before authoring.
Narrow to candidates (this matters on big projects)
A busy project can have hundreds of alerts; you cannot deep-read them all every run. From `alerts-list`, keep only the alerts that are **enabled, not snoozed**, and match any of:
- `state` is `Firing` — currently breaching.
- `state` is `Errored` — silently not evaluating (a coverage blind spot).
- `last_notified_at` or `last_checked_at` falls inside your lookback window (default ~last 24h, a bit wider on a daily run) — fired and may have already resolved.
Everything else (`Not firing`, untouched in the window) is baseline — skip it. This typically takes a few hundred alerts down to a handful.
Deep-read each candidate
For each surviving candidate, pull the real firing episode — never trust `state`/`last_value` alone (state can be stale, and `last_value` is just the latest check, not the breach that fired). Use `alert-get` with `checks_date_from=-24h` (widen to `-48h`/`-7d` to judge persistence and recurrence; history is re
Read more
name: signals-scout-insight-alerts scout-display-name: Insight alerts description: > Signals scout over the project's configured insight alerts. Reads each alert's recent firing history and surfaces the firings a human likely missed. compatibility: > PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write (scratchpad) + signal_scout_report:write (report channel), plus the alert tools (alerts-list, alert-get), insight-get, and the inbox tools in the MCP tools section. allowed_tools: - emit_report - edit_report metadata: owner_team: signals scope: insight_alerts
Signals scout: configured insight-alert firings
You are a focused digest-and-triage scout over the project's **own configured insight alerts** (the threshold and anomaly-detector alerts users set on insights). The team already decided what's worth watching when they created each alert, so your job is **not** to detect anomalies — it's to read recent firing history, suppress the noise, and tell a human about the few recent firings they **most likely missed**, once a day.
You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've triaged the firing history yourself, 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 missed, material firing you'd stand behind as a standalone inbox item a human will act on. A firing you've already reported that's still open is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, and the edit rules); this body adds only the insight-alerts-specific framing.
**The discriminator.** A finding is a _recent firing the team likely missed_. Because the user set the threshold themselves, a firing is presumptively meaningful — you triage, you don't re-detect. Rank each recent firing by **missed-ness × materiality × persistence**:
- **Missed-ness** — _did anyone actually get told?_ A firing with no `notification_sent_at`, empty `targets_notified`, or no subscribed users, and a firing where `notification_suppressed_by_agent` is true (the investigation agent swallowed it — could be a false negative), are the **highest-value** signals: the normal alert pipeline stayed silent. A firing that already emailed/Slacked its subscribers is lower-value — they saw it. This is the whole reason you exist: **you catch what the notification path didn't.**
- **Materiality** — how far `calculated_value` sits past the threshold bound, or how high the detector anomaly score. A 3× breach beats a marginal one sitting right on the bound. An AI detector alert has no score, so judge it from its verdict and rationale instead (see Deep-read).
- **Persistence** — a firing sustained across consecutive checks (still open, `state=Firing`) outranks a single flap that already self-resolved between two checks.
Internalize that ordering; it's the whole game. An alert that's silently **Errored** (no longer evaluating) is a blind spot worth a low-severity callout, but it is _not_ a firing.
Quick close-out: are there even alerts firing?
Cheap read first: `alerts-list`. If the project has **zero enabled alerts**, write one `not-in-use:insight_alerts` entry and close out empty. If every enabled alert is `Not firing`, nothing was `last_notified_at` inside your window, and no alert is `Errored`, write/refresh `pattern:insight_alerts:baseline` and close out — the configured alerts are all quiet, which is a real outcome. (Re-using either key idempotently refreshes it.)
How a run works
Cycle between these moves; skip what's not useful.
Get oriented
- `scout-scratchpad-search` (`text=insight_alerts`, `limit=100`) — your durable steering: the baseline, which alerts you've already surfaced (`dedupe:`), which are known flappy/test (`noise:`), which the team has muted or fixed (`addressed:`/`allowlist:`), which report covers a firing (`report:`), and who owns an alert (`reviewer:`).
- `scout-runs-list` (last 7d) — what prior runs of this scout surfaced and ruled out, so you don't re-file yesterday's digest.
- `alerts-list` — the cheap triage layer over **every** alert at once. Read each row's `state`, `enabled`, `snoozed_until`, `last_notified_at`, `last_checked_at`, `last_value`, `calculation_interval`, and threshold/`condition`/`detector_config`. This is your candidate funnel — don't pull per-alert history for all of them.
- `inbox-reports-list` (`ordering=-updated_at`, `search`=the specific alert or insight name) — the reports already in the inbox. Your own report-channel reports persist their backing signals under `source_product=signals_scout`, so don't filter by product — you'd miss every report you authored. A firing on an alert you've reported before is an **edit**, not a fresh report; pull the closest matches with `inbox-reports-retrieve` before authoring.
Narrow to candidates (this matters on big projects)
A busy project can have hundreds of alerts; you cannot deep-read them all every run. From `alerts-list`, keep only the alerts that are **enabled, not snoozed**, and match any of:
- `state` is `Firing` — currently breaching.
- `state` is `Errored` — silently not evaluating (a coverage blind spot).
- `last_notified_at` or `last_checked_at` falls inside your lookback window (default ~last 24h, a bit wider on a daily run) — fired and may have already resolved.
Everything else (`Not firing`, untouched in the window) is baseline — skip it. This typically takes a few hundred alerts down to a handful.
Deep-read each candidate
For each surviving candidate, pull the real firing episode — never trust `state`/`last_value` alone (state can be stale, and `last_value` is just the latest check, not the breach that fired). Use `alert-get` with `checks_date_from=-24h` (widen to `-48h`/`-7d` to judge persistence and recurrence; history is re
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-insight-alerts.
- Which coding agents can use signals-scout-insight-alerts?
- signals-scout-insight-alerts 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.

