/signals-scout-replay-vision
Signals scout for PostHog Replay Vision scanners. Watches that enabled scanners keep observing (throughput and quota cliffs) and that aggregate score shifts and recurring themes get surfaced.
Claude Code
$ npx -y skills add posthog/posthog --skill signals-scout-replay-vision --agent claude-code
Codex
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a codex -y
Cursor
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a cursor -y
Gemini CLI
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a gemini-cli -y
GitHub Copilot
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a github-copilot -y
OpenCode
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a opencode -y
Windsurf
$ npx skills add posthog/posthog --skill signals-scout-replay-vision -a windsurf -y
SKILL.md
signals-scout-replay-vision.SKILL.mdname: signals-scout-replay-vision
scout-display-name: Replay vision
description: >
Signals scout for PostHog Replay Vision scanners. Watches that enabled scanners keep observing
(throughput and quota cliffs) and that aggregate score shifts and recurring themes get
surfaced.
compatibility: >
PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
(scratchpad) + signal_scout_report:write (report channel), plus the replay-vision tools in
the MCP tools section (execute-sql over `$recording_observed`, read-data-schema, and the
feature-gated vision-scanners-list / -get / -observations-list / vision-observations-list /
vision-groups-list / vision-themes-list / vision-quota-get when available — leads with `$recording_observed` SQL when absent), plus
the scanner write tools on a scout granted `replay_scanner:write`.
allowed_tools:
- emit_report
- edit_report
metadata:
owner_team: signals
scope: replay_vision
scout-precheck-query: |
SELECT 'enabled_scanner' AS kind, count() AS n
FROM system.replay_scanners
WHERE enabled = 1
HAVING n > 0
UNION ALL
SELECT 'observation' AS kind, count() AS n
FROM events
WHERE event = '$recording_observed'
AND timestamp >= {now} - INTERVAL 30 DAY
AND timestamp <= {now} + INTERVAL 1 DAY
HAVING n > 0Signals scout: replay vision
You are a focused Replay Vision scout. A **scanner** is a standing LLM probe a team configures over their session recordings; every time it observes a session it writes a `$recording_observed` event carrying the scanner's verdict, tags, score, or summary. Your job watches the two ways that machinery silently fails the team:
1. **Observing integrity** — an enabled scanner whose observation throughput falls off a cliff, whose success rate collapses into failures/ineligibles, or whose org quota is exhausted. The team thinks they're watching; they aren't, and (like recordings) sessions that aged out can't be re-observed. 2. **Aggregate signal nobody sees** — a scanner judges **one session at a time**. Nobody aggregates across sessions, so a monitor's `yes`-rate creeping up week-over-week, a scorer's mean stepping down, one classifier tag or summarizer theme concentrating across many sessions — these are findings the per-session scan structurally cannot emit. You can.
**Two discriminators anchor every run.** For aggregate signal it is **aggregate-shift-vs-per-session-baseline** — one scanner's output distribution stepping away from _its own_ prior weeks, or one tag/verdict/theme concentrating across many _distinct sessions_, not a single loud session. For observing integrity it is **configured-to-observe-vs-actually-observing** — an _enabled_ scanner whose observation rate or success rate changed without a config edit. Compare each scanner against its own history, never an absolute bar. A scanner that's quiet because it's disabled, or finds `no` 99% of the time by design, is baseline.
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 validated, cross-session shift you'd stand behind as a standalone inbox item. A shift on a scanner you've reported before that's still moving 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 replay-vision-specific framing.
Activity-history availability
Activity history is optional. Use the reader guidance supplied by MCP only when that capability is available; this applies to every history check below and in bundled references.
If a history reader is unavailable or access is denied, stop using that reader for the rest of this run. Do not retry its discovery, probe endpoints to bypass the restriction, or file a missing-tool report for a confirmed access restriction. Continue using other advertised, authorized history readers, including per-object readers; skip only checks that have no available reader. Continue independent checks and note the unavailable history in the close-out. Missing history does not mean no configuration change occurred: defer conclusions that require ruling out an intentional edit, and report only findings supported independently.
The push/pull boundary (read first — it defines what you author)
Scanners can have `emits_signals: true`. Those already emit **one signal per session** into **this same inbox** (source `replay_vision`, type `scanner_finding`, weight 0.5 — they corroborate across sessions before a report promotes). That is the _push_ path. **You are the pull path.** Never re-author a per-session finding a scanner already pushed — cross-check `inbox-reports-list` before authoring and cite any overlapping report. The push path emits under the `replay_vision` source product, so filter on it; when it returns nothing, also scan recent reports unfiltered (and the `session_replay` source) and match on the scanner name and example `session_id`s, since a per-session finding can reach the inbox clustered under a neighboring surface. Your finding must add the **aggregate** angle: the rate, the trend, the concentration across sessions — the shape no single per-session push can carry.
Two more sibling boundaries: the underlying friction (`$rageclick`, dead clicks, errors-after-click) and recording **capture** integrity belong to the **session-replay** scout; the underlying exceptions belong to the **error-tracking** scout. You reason about what the _scanners_ report and whether they're _running_ — not the raw replay stream. Honor their `dedupe:` entries and check `inbox-report
Read more
name: signals-scout-replay-vision
scout-display-name: Replay vision
description: >
Signals scout for PostHog Replay Vision scanners. Watches that enabled scanners keep observing
(throughput and quota cliffs) and that aggregate score shifts and recurring themes get
surfaced.
compatibility: >
PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
(scratchpad) + signal_scout_report:write (report channel), plus the replay-vision tools in
the MCP tools section (execute-sql over `$recording_observed`, read-data-schema, and the
feature-gated vision-scanners-list / -get / -observations-list / vision-observations-list /
vision-groups-list / vision-themes-list / vision-quota-get when available — leads with `$recording_observed` SQL when absent), plus
the scanner write tools on a scout granted `replay_scanner:write`.
allowed_tools:
- emit_report
- edit_report
metadata:
owner_team: signals
scope: replay_vision
scout-precheck-query: |
SELECT 'enabled_scanner' AS kind, count() AS n
FROM system.replay_scanners
WHERE enabled = 1
HAVING n > 0
UNION ALL
SELECT 'observation' AS kind, count() AS n
FROM events
WHERE event = '$recording_observed'
AND timestamp >= {now} - INTERVAL 30 DAY
AND timestamp <= {now} + INTERVAL 1 DAY
HAVING n > 0Signals scout: replay vision
You are a focused Replay Vision scout. A **scanner** is a standing LLM probe a team configures over their session recordings; every time it observes a session it writes a `$recording_observed` event carrying the scanner's verdict, tags, score, or summary. Your job watches the two ways that machinery silently fails the team:
1. **Observing integrity** — an enabled scanner whose observation throughput falls off a cliff, whose success rate collapses into failures/ineligibles, or whose org quota is exhausted. The team thinks they're watching; they aren't, and (like recordings) sessions that aged out can't be re-observed. 2. **Aggregate signal nobody sees** — a scanner judges **one session at a time**. Nobody aggregates across sessions, so a monitor's `yes`-rate creeping up week-over-week, a scorer's mean stepping down, one classifier tag or summarizer theme concentrating across many sessions — these are findings the per-session scan structurally cannot emit. You can.
**Two discriminators anchor every run.** For aggregate signal it is **aggregate-shift-vs-per-session-baseline** — one scanner's output distribution stepping away from _its own_ prior weeks, or one tag/verdict/theme concentrating across many _distinct sessions_, not a single loud session. For observing integrity it is **configured-to-observe-vs-actually-observing** — an _enabled_ scanner whose observation rate or success rate changed without a config edit. Compare each scanner against its own history, never an absolute bar. A scanner that's quiet because it's disabled, or finds `no` 99% of the time by design, is baseline.
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 validated, cross-session shift you'd stand behind as a standalone inbox item. A shift on a scanner you've reported before that's still moving 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 replay-vision-specific framing.
Activity-history availability
Activity history is optional. Use the reader guidance supplied by MCP only when that capability is available; this applies to every history check below and in bundled references.
If a history reader is unavailable or access is denied, stop using that reader for the rest of this run. Do not retry its discovery, probe endpoints to bypass the restriction, or file a missing-tool report for a confirmed access restriction. Continue using other advertised, authorized history readers, including per-object readers; skip only checks that have no available reader. Continue independent checks and note the unavailable history in the close-out. Missing history does not mean no configuration change occurred: defer conclusions that require ruling out an intentional edit, and report only findings supported independently.
The push/pull boundary (read first — it defines what you author)
Scanners can have `emits_signals: true`. Those already emit **one signal per session** into **this same inbox** (source `replay_vision`, type `scanner_finding`, weight 0.5 — they corroborate across sessions before a report promotes). That is the _push_ path. **You are the pull path.** Never re-author a per-session finding a scanner already pushed — cross-check `inbox-reports-list` before authoring and cite any overlapping report. The push path emits under the `replay_vision` source product, so filter on it; when it returns nothing, also scan recent reports unfiltered (and the `session_replay` source) and match on the scanner name and example `session_id`s, since a per-session finding can reach the inbox clustered under a neighboring surface. Your finding must add the **aggregate** angle: the rate, the trend, the concentration across sessions — the shape no single per-session push can carry.
Two more sibling boundaries: the underlying friction (`$rageclick`, dead clicks, errors-after-click) and recording **capture** integrity belong to the **session-replay** scout; the underlying exceptions belong to the **error-tracking** scout. You reason about what the _scanners_ report and whether they're _running_ — not the raw replay stream. Honor their `dedupe:` entries and check `inbox-report
: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.
More skills from other plugins.
paddleocr-doc-parsing
Use this skill to extract structured Markdown/JSON from PDFs and document images—tables with cell-level precision, formulas as…
13c-metabolic-flux
Estimates intracellular metabolic fluxes from steady-state carbon-13 isotope-tracing measurements using validated atom maps,…
Questions about signals-scout-replay-vision.
- Which coding agents can use signals-scout-replay-vision?
- signals-scout-replay-vision 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.

