Signals Scout Insight Alerts

作者 PostHog469d1773e9cb無授權條款收錄於 2026年10月8日更新於 2026年10月8日

Signals scout over the project's configured insight alerts. Reads each alert's recent firing history and surfaces the firings a human likely missed.

僅含說明Data & Analytics
AI 產生的概覽

對專案已設定的洞察警示觸發歷史進行分診,並回報人類可能漏掉的近期觸發。

功能
這個技能是一套針對專案自身已設定洞察警示的每日巡查流程。它會讀取每個警示的近期觸發歷史,濾除抖動、已暫停以及已通知且已恢復的觸發等雜訊,再依人類漏掉的可能性、越界嚴重程度與持續程度排序其餘觸發。接著它會為最嚴重的少數觸發撰寫或編輯收件匣報告,附上相關洞察圖表,並寫入暫存記憶,避免後續執行重複處理。
適用情境
適用於專案已在洞察上設定閾值或異常偵測警示,且需要每日彙整一般通知路徑未送達的觸發。它適合分診靜默、被抑制或仍處於開啟狀態的越界,以及對已停止評估的警示做低嚴重度提示。它不用於建立新警示,也不用於評估未綁定警示的洞察。
執行需求
以 PostHog Signals 代理身分在 Claude 沙箱中執行,需要唯讀分析權限,以及暫存區與報告通道的寫入權限。它需要警示工具(alerts-list、alert-get)、insight-get,以及收件匣與成員名冊工具,還需要框架層的暫存區、執行記錄與報告工具。這個技能不附帶指令碼,只有指示內容。

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.
  • 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 retained 14 days). Read across the returned checks:

Shape in the checksWhat it usually means
One or more Firing checks, latest still Firing, no notification_sent_atSilent open breach — top priority. Fired, nobody was told, still going.
Firing checks then back to Not firing, all within minutes/one intervalA flap — usually a badly-tuned threshold, not an incident. Hygiene, not a P1.
Firing with notification_sent_at set + subscribed usersThe team was told. Lower value; surface only if material and still open/unacted.
notification_suppressed_by_agent=trueInvestigation agent judged it a false positive — verify before trusting; possible false negative.
Repeated error across consecutive checks (state=Errored)Alert is broken (bad query, deleted insight, missing series) — a silent blind spot.

When in doubt about whether a breach is real, read the alert's condition/threshold bounds and compare them against the firing check's calculated_value, and pull the insight with insight-get to understand what the metric is.

Save memory as you go

Write a scratchpad entry whenever a future run should change behavior. Encode the category in the key prefix; key per-alert entries on the alert id (stable across firings).

  • pattern:insight_alerts:baseline — "~{N} enabled alerts, ~{X} firing/day, mostly hourly; many owners. {timestamp}"
  • dedupe:insight_alerts:{alert_id} — "Surfaced firing of '{name}' (alert {alert_id}, insight {short_id}) on {date}, value {v} vs bound {b}, silent. If still Firing next run, edit the report; if resolved + notified, treat as covered."
  • noise:insight_alerts:{alert_id} — "flaps every few hours on a too-tight bound; the firing itself isn't signal. Only surface as a one-off tuning hygiene finding, never per-flap."
  • addressed:insight_alerts:{alert_id} / allowlist:insight_alerts:{alert_id} — team fixed / acked it, or owner deliberately keeps it low-priority — skip.
  • report:insight_alerts:{alert_id} — the report_id of a report you filed for a firing on this alert, so the next run edits it (append_evidence with the fresh firing) instead of duplicating.
  • reviewer:insight_alerts:{alert_id} — a resolved owner (bare lowercase GitHub login) for an alert or its insight, so reports route to a human faster.

Decide

The generic report mechanics — search the inbox first (via the report:insight_alerts:{alert_id} pointer, else an inbox-reports-list search on the specific alert / insight name, not a broad word like alert), edit-vs-author, the status rules, reviewer routing, non-idempotent dedup, and the priority / repository fields — live in the harness prompt and in authoring-scouts → references/report-contract.md. Do not re-derive them here. Classify each candidate firing against prior runs and the scratchpad (net-new / material-update / already-covered / addressed-or-noise), then apply only the insight-alerts judgment:

  • Edit when a still-live report already tracks the alert — a firing you surfaced that's still open, or a recurrence on the same alert. A persistent breach is one report across runs: add the fresh firing with append_evidence (calculated_value vs bound, the new fired-at, current notification status), not a fresh report per day.
  • Author when nothing live covers the firing. A report-worthy finding is an enabled, un-snoozed alert with a material firing (well past its bound or a high anomaly score) inside the window that was under-notified (silent / suppressed) or is still open and unacted, with the alert id, insight short_id, the firing calculated_value vs the threshold bound, the fired-at time, and the notification status in the evidence. This is a triage callout, not a code fix → actionability=requires_human_input. Priority: a material, silent firing on a clearly important metric is P1; a material firing that was notified but is still open/unacted is P2; Errored-alert blind spots and flapping-threshold hygiene are P3. Attach the firing insight as a report chart — a SavedInsightNode by its short_id only when its saved range is absolute and contains the firing (a relative range scrolls past it as days pass), else an ad-hoc node with pinned dates covering it — so the breach is visible next to the threshold numbers.
  • Cap and rank. File at most ~5 reports per run, worst-first by the discriminator. If more cleared the bar, say how many you dropped in the close-out — never silently truncate. One digest-style report that bundles several minor firings is fine when none individually warrants its own entry; bundle the flapping/Errored hygiene items this way rather than one report each.
  • Remember if it's suggestive but below the bar (a marginal breach, a single flap), or to refresh the baseline / record what you ruled out.
  • Skip if a noise: / addressed: / allowlist: / dedupe: entry, or an existing inbox report, already covers it.

Sibling courtesy: observability-gaps recommends creating alerts and anomaly-detection scores the insights the team views (whether or not they're alerted) — you own the firings of alerts that already exist. Honor their dedupe: entries; your unique angle is the missed-firing triage frame.

Close out

One paragraph: how many alerts you triaged, which reports you authored or edited (and why those), what you ruled out (flaps, snoozed, already-notified-and-resolved), and how many cleared the bar but were dropped for the per-run cap. The harness saves this as the run summary. "Triaged the candidates, everything firing was already notified and acted on" is a real outcome — do not write a separate run-metadata scratchpad entry.

Disqualifiers (skip these)

  • Snoozed or disabled alerts — snoozed_until in the future, or enabled=false. The owner explicitly muted these; a firing on a snoozed alert is not a miss.
  • Flapping alerts — fire→resolve→fire within an interval with no sustained breach. That's a tuning problem, not an incident. At most one hygiene finding (P3) suggesting the bound be retuned; record noise: and stop surfacing the individual flaps.
  • Already-notified-and-resolved — fired, the subscribed users were emailed/Slacked (notification_sent_at set), and it's back to Not firing. The team saw it and it's over; skip unless it's materially recurring across days.
  • Marginal breaches on low-count/noisy series — calculated_value sitting right on the bound, or a tiny absolute count. Below the materiality floor; remember, don't report.
  • Dev / test / internal-only alerts — alerts on insights whose $environment/service is dev/local/test, or a single owner's sandbox alert. Not user-facing.
  • Transient single-check errors — an alert that errored once and recovered. Only flag persistent Errored state across consecutive checks.

When in doubt, refresh memory instead of filing a report.

MCP tools

Direct (read-only):

  • alerts-list — the cheap triage layer over every alert (state, enabled, snoozed, last_notified/checked, last_value, threshold/detector). Your candidate funnel.
  • alert-get (id, checks_date_from, checks_date_to, checks_limit) — the real firing history for one candidate: per-check state, calculated_value, targets_notified, notification_sent_at, notification_suppressed_by_agent, error, anomaly scores.
  • insight-get — what the alerted metric actually is (read when judging materiality).

Inbox & reviewer routing (mechanics in authoring-scouts → references/report-contract.md):

  • inbox-reports-list / inbox-reports-retrieve — the reports already in the inbox; check before authoring so you edit instead of duplicating.
  • inbox-report-artefacts-list — a comparable report's artefact log; reviewer precedent.
  • scout-members-list — the in-run roster for routing suggested_reviewers to an alert / insight owner.

Harness-level: scout-project-profile-get, scout-scratchpad-search, scout-runs-list, scout-runs-retrieve (orientation + dedupe); scout-emit-report / scout-edit-report (author / edit a report — the report-channel contract is in the harness prompt); scout-scratchpad-remember, scout-scratchpad-forget (memory).

When to stop

  • No enabled alerts, or everything quiet → quick close-out.
  • You've triaged the candidates and surfaced the worst few → close out, even if minor firings remain; the per-run cap is deliberate.
  • A candidate matches a noise: / addressed: / allowlist: / dedupe: entry → skip.

Fewer, well-calibrated findings that genuinely catch missed firings beat a daily re-list of every alert that happened to breach.

來源與署名

來源:PostHog/ai-plugin位於skills/signals-scout-insight-alerts提交469d177

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架

更多來自 PostHog/ai-plugin 的技能

Writing Simplified Technical English

PostHog

套用 ASD-STE100 簡化技術英語規則,讓代理撰寫的文字語意明確、方便執行。

Writing & Content2026年10月8日

Working With Task Comments

PostHog

透過 PostHog MCP exec 調度器讀取並解讀 PostHog 任務、成品和畫布上的留言。

Productivity & Workflow2026年10月8日

Working With Skills

PostHog

指導代理使用 PostHog 的 skill-* MCP 工具來探索、讀取、建立、更新與重構技能。

AI & Agents2026年10月8日

Working With Scouts

PostHog

說明如何把監看工作委派給 PostHog Signals 偵察代理、處理其回報,並長期調校整個代理團隊的操作手冊。

AI & Agents2026年10月8日

Validating And Publishing Canvases

PostHog

Validate and publish a canvas source project safely: the source-project shape, declared capabilities, reading the current version pointer, iterating on validation diagnostics, guarded publishing with expected_current_version_id, staging a draft build and promoting it, waiting out the queued build, and recovering from a 409 version_conflict or a 429 capacity limit without overwriting concurrent work. Use whenever a canvas edit is ready to save, a draft build is wanted, a canvas publish or build returns diagnostics or a conflict, or a task needs to understand canvas version history.

待分類2026年10月8日

Understanding Billing Usage

PostHog

Explains PostHog billing usage and spend from the customer's visible Billing MCP tools. Use when the user asks why usage or spend is high, which product or project is driving usage, what a usage type means, how to reduce usage, what changed over time, why they got a usage change alert, or whether a spike/drop alert was real or noisy. Also use before product-specific analytics skills when the user names a billable PostHog product metric such as events, recordings, feature flag requests, exceptions, survey responses, synced rows, logs, AI events, AI credits, or Inbox credits. Starts from Billing usage/spend tools, then routes to customer-visible product MCP surfaces for deeper investigation.

待分類2026年10月8日