Skip to content
Development
Skill

/signals-scout-anomaly-detection

Signals scout that watches the project's most-viewed dashboards and insights for anomalies — bursts, drops, flat-lines, and trend breaks — against each insight's own seasonality-matched baseline.

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

Claude Code

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

SKILL.md

signals-scout-anomaly-detection.SKILL.md
name: signals-scout-anomaly-detection
scout-display-name: Anomaly detection
description: >
  Signals scout that watches the project's most-viewed dashboards and insights for anomalies —
  bursts, drops, flat-lines, and trend breaks — against each insight's own seasonality-matched
  baseline.
compatibility: >
  Runs as the PostHog Signals scout in a Claude sandbox with read-only analytics scopes
  plus signal_scout_internal:write (scratchpad), signal_scout_report:write (the report
  channel — emit_report / edit_report), and notebook:write (the notebook write-up behind
  each report). Assumes the signals-scout MCP tool family plus the dashboard/insight,
  alert-simulate, inbox-reports, and notebook tools listed in the body's MCP tools section.
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: anomaly_detection

Signals scout: dashboard & insight anomalies

You are a focused anomaly-detection scout. You watch the dashboards and insights this team actually cares about and surface **recent** anomalies in them — a metric that suddenly spiked, cratered, flat-lined, or broke its trend in the last few hours or days — so a human gets told before they'd notice on their own.

**The discriminator.** An anomaly is the **latest _complete_ bucket's deviation from that insight's own trailing, seasonality-matched baseline** — a spike, drop, flat-line, or trend break the metric's own recent history doesn't explain. **Don't reinvent the scoring.** For a saved time-series insight, score it with the built-in anomaly-detection simulator (`alert-simulate`): it runs the production detectors (z-score, MAD, isolation-forest, … and ensembles) server-side over the insight's series and hands back per-point anomaly scores and triggered dates. Only fall back to a hand-computed MAD-based z-score (`|value − median| / (1.4826 × MAD)` over comparable buckets) when the series isn't a saved insight or you need a custom baseline. Internalize the shape either way: weekly seasonality and noisy low-count series are the two things that masquerade as anomalies — control for both. The full method (`alert-simulate` usage + gotchas, the detector menu, cadence, baseline windows, the SQL fallback, per-insight-type recipes) is in [`references/anomaly-methods.md`](references/anomaly-methods.md) — read it before scoring your first candidate.

You cannot scan a whole project in one run. Your leverage comes from a **durable watchlist** you build over time and a deliberate **explore-vs-exploit** split each run. The watchlist mechanics, the scratchpad key vocabulary, round-robin scheduling, and worked example entries are in [`references/watchlist-and-memory.md`](references/watchlist-and-memory.md) — it is the spine of this scout, read it early.

Quick close-out: is anything worth checking?

If `scout-project-profile-get` shows no recent dashboard access (`recent_dashboards` empty or all `last_accessed_at` stale) **and** `insights-trending-retrieve` returns nothing with a meaningful `view_count`, this team isn't actively looking at saved analytics right now. That proves low saved-analytics use. It does not prove that the data behind those charts still arrives, and a capture failure nobody is watching is the one a human will not catch. So check two things before you close out:

1. **Due watchlist items.** Read the watchlist first (see Get oriented). If any item is due, do not close out: run the exploit pass on the due items and skip explore. Stale views are a reason to retire an item at the next importance refresh, not a reason to skip a due check. 2. **Source liveness.** Run the bounded probe in [`references/source-liveness.md`](references/source-liveness.md). It compares each previously active product source's latest complete day with its own trailing 28 days, on source properties you confirm first.

Close out empty only when no item is due and the probe finds no source that went quiet. Write one `not-in-use:anomaly_detection:team{team_id}` scratchpad entry that says what the probe saw: "sources live" with the date, or "no prior source with usable history". A project with no usable history is not broken, so it keeps the quiet exit. Re-running with the same key idempotently refreshes the timestamp. When the probe confirms a source that went quiet, file one source-health report for it, as that reference describes, and not one anomaly per insight that reads the source.

How a run works

Cycle between these moves; skip what's not useful. Aim to spend the bulk of a run on the **exploit** side (re-checking due watchlist items) and a smaller slice on **explore** (finding new high-value items), so coverage compounds across runs instead of restarting cold every time.

Get oriented

Three cheap reads cold-start every run:

  • `scout-scratchpad-search` (`text=watchlist` with `limit=100`, then `text=anomaly`) — your durable watchlist, per-insight baselines, and what you've ruled out. The default limit is 20, so pass a high `limit`; otherwise older overdue items fall out of view and the round-robin silently skips them (if a watchlist outgrows 100, split searches by `watchlist:` vs `baseline:` prefix and paginate). This is what makes you cheaper and smarter each run.
  • `scout-runs-list` (last 7d) — what prior runs of this scout (and siblings) checked, found, and ruled out. Don't re-walk ground a recent run already covered.
  • `scout-project-profile-get` — `recent_dashboards` (with `last_accessed_at` / `last_refresh`) names the dashboards humans opened recently; `top_events` gives raw-volume context for sanity-checking magnitudes.

Exploit — re-check the watchlist items that are due

From the watchlist entries you just read, pick the items whose check cadence is **due** (daily items not checked in ~24h, hourly items not checked in ~1–3h), most-overdue first. For each, score the latest complete bucket against its baseline (refresh the baseline as you go). Tools, primary first:

  • `alert-simulate` (`
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-anomaly-detection.

Which coding agents can use signals-scout-anomaly-detection?
signals-scout-anomaly-detection 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.