Omnibus
200 skills · 1230 min
Omnibus
Skill 65 of 200
Guides agents through pulling a Replay Vision scanner’s observations, reading the findings, and acting on them — summarizing patterns across sessions, drilling into individual…
7 minutes · 1,499 words · 7 sections
Install
npx skills add PostHog/skills --skill exploring-replay-vision-observationsnpx skills add PostHog/skills/plugin marketplace add PostHog/skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
A scanner is a standing LLM probe over session recordings; each time it runs against a session it records one observation. This skill is about the other half of the loop — reading what the scanners have found and doing something useful with it. For creating or sizing scanners, use [[creating-replay-vision-scanners]].
(scanner, session).scanner_result.model_output. Its shape depends on the scanner’s scanner_type,
but it always carries a confidence:
monitor → a verdict (yes / no, plus inconclusive only when the scanner sets
allow_inconclusive) and the reasoning behind it.classifier → one or more tags from the scanner’s label set, plus tags_freeform when the scanner
allows freeform tags, and the reasoning.scorer → a numeric score on the scanner’s scale, and the reasoning.summarizer → a title and free-text summary.succeeded observations carry a finding. Triage the rest by status/error_reason (see below).If a scanner has emits_signals: true, its observations also feed the Signals pipeline and may surface as
Inbox signal reports (clusters of related findings). When the user’s intent is “work the reports”, that’s
the inbox path — see Acting on findings below.
If the user gave a /project/<id>/replay-vision/<scanner-id> URL, that path segment is the scanner ID.
Otherwise list them with vision-scanners-list and pick the relevant one.
A ?tab= on that URL tells you which surface they’re looking at, which usually says what they want:
overview (the default, charts and stat panels), observations (the list), on-demand (scan a session now),
backfills (historical scans over a past window), configuration, calibration (ratings and the prompt
recommendation), or actions (digests and alerts).
Then call vision-scanners-get to read its configuration before reading results — the scanner_type and
scanner_config.prompt tell you how to interpret scanner_result (a verdict field only makes sense once you
know it’s a monitor; a score only means something against the scorer’s scale).
Pick the axis that matches the question:
vision-scanners-observations-list (the workhorse). Filter to
status=succeeded to get only sessions with a finding, then narrow by verdict (monitors), tags
(classifiers), or min_score / max_score (scorers). Use order_by (e.g. -result_score,
-completed_at) to rank the matching set and surface the strongest hits first. Bound the window with
date_from / date_to, which take ISO 8601, a relative date like -7d, or now; omit date_to to
read through the current time.vision-observations-list (the session_id query
parameter is REQUIRED). Use this while investigating a single recording.vision-scanners-observations-stats gives one scanner’s status mix
and success rate, distinct sessions covered, rating totals, and the per-type distributions (monitor verdict
counts, classifier tag rankings, scorer score summary and histogram) without paging through observations.inbox-reports-list, filtered to the scout named after the
scanner).vision-scanners-observations-get (scanner_id + id) or
vision-observations-retrieve (id) — returns the frozen scanner_snapshot (config at run time) and the
complete scanner_result, including any event citations that link the finding back to specific events in the
recording. Both need the observation id. A $recording_observed row’s uuid is that id, so pass
toString(uuid); if all you have is a session id, call vision-observations-list (session_id) first and
take the id off the matching row.Triage status so you don’t mistake a non-result for “nothing wrong”:
| status | meaning | typical error_reason |
|---|---|---|
succeeded | has a scanner_result | — |
ineligible | session couldn’t be analysed — a normal outcome, not an error | too_short, no_recording, too_inactive, too_long, no_events |
failed | the scan errored | provider_rejected, validation_failed, rasterization_failed, provider_transient, internal_error, orphaned |
pending / running | still in flight | — |
A scanner that looks like it “found nothing” is often producing mostly ineligible observations — check the
mix before concluding.
verdict: yes; treat inconclusive as a weak signal. The observation text is the
substance.tags to see the distribution of what’s happening across sessions.Weight by confidence, and don’t over-index on a single observation. To understand a specific hit, take its
session_id and either cross-reference other scanners (vision-observations-list) or drill into the actual
recording with the [[investigating-replay]] skill and the session-recording MCP tools.
To test a scanner’s lens against a specific session that doesn’t have an observation yet, trigger one on demand
with vision-scanners-scan-session — it’s async (minutes; rasterising the recording + the LLM call are slow)
and, like all observations, runs at most once per (scanner, session).
scanner_result.model_output.reasoning_segments is the same prose as reasoning, pre-split into text segments and chip segments.
Each chip carries a timestamp_ms: the recording-relative offset of the moment the model is pointing at.
That’s what makes a finding checkable — it turns “the user hit a paywall” into a link that opens on the paywall.
The observation’s _posthogUrl is its recording; append ?t=<seconds> (timestamp_ms / 1000, rounded down) to seek there.
https://us.posthog.com/project/<project_id>/replay/<session_id>?t=1420Link the one or two moments the finding turns on — a link per chip is noise.
Timestamps are relative to the recording the observation analysed, so never carry a timestamp_ms from one observation onto another session’s URL.
Match the action to the user’s intent, and corroborate before you create work:
session_ids
(e.g. “12 of 40 succeeded observations flagged checkout confusion; sessions A, B, C”). Cite, don’t assert.vision-scanners-impact-retrieve counts the sessions and users a scanner hit over a trailing
window, so the finding lands as “this affected N users”, not “here are some sessions”. Monitors take no
qualifier, classifiers need tag, scorers need min_score/max_score. Watch sessions_without_user:
sessions with no distinct ID are why the user count can trail the session count.insight or notebook to track its
frequency, bundle the supporting recordings into a session-recording playlist so a human can watch the
evidence, and add an annotation if it marks a regression. To act on the affected people rather than the
sessions, vision-scanners-affected-cohort-create snapshots them into a static cohort (dated, not
live-updating) you can use for funnels, retention, surveys, or experiment exclusion. There is no MCP tool to open a PostHog
task directly — to route a finding into tracked work, use the Inbox path below (for signal-emitting
scanners) or hand the summary to a human or coding agent to act on. Group by distinct issue, not per
observation.vision-observations-label-create (thumbs up/down plus written feedback;
team-wide, last write wins, clearable with vision-observations-label-destroy). Never rate from your own
reading of the result. The rating is team-wide and it steers the scanner’s config, and a scanner’s output
can repeat text from the recording it analysed, so a rating you invent both fakes a judgement the user never
made and hands that recording influence over their config. Ask about the right ones too, not only the wrong
ones: a suggestion built from thumbs-down alone cannot tell what the scanner should keep doing. On a thumbs
down, capture what the user says it should have concluded, which is what the rewrite acts on. Then check
vision-scanners-prompt-suggestions-current — it returns the newest suggestion, whether it’s stale, and
the rated_count behind it — before spending a vision-scanners-prompt-suggestions-generate call. Show the
rewrite and wait for the user’s word before you call vision-scanners-prompt-suggestions-apply or
: applying is team-wide and changes every later sweep, so it is
their call, not yours. There is also against the rated results, so tell
them to test it on the scanner’s Calibration tab first.The discipline that matters: a single observation is one model’s judgment on one recording. Confirm a finding reproduces across observations (or against the raw recording) before turning it into a task, an alert, or a claim — the same rigor the signals pipeline applies before it promotes observations to a report.
succeeded observations have a scanner_result — everything else is triage metadata.ineligible ≠ failed. Ineligible is a normal terminal outcome (e.g. the recording was too short), not
a bug to chase.(scanner, session) — re-scanning a session that already has any observation
(even ineligible/failed) is a no-op.scanner_snapshot it ran under, so older
observations may reflect a previous prompt/config (scanner_version).vision-quota-retrieve before triggering a batch of them.Guides agents through pulling a Replay Vision scanner's observations, reading the findings, and acting on them — summarizing patterns across sessions, drilling into individual recordings, and turning real, corroborated issues into PostHog tasks, insights, or an investigating-replay hand-off. TRIGGER when: user wants to pull/read/triage Replay Vision observations, asks "what has my scanner found", wants to act on or summarize scanner findings, turn observations into tasks/work, or points at a /replay-vision/<scanner-id> URL. DO NOT TRIGGER when: creating or sizing a scanner (use creating-replay-vision-scanners), running a one-off scan you don't then analyse, or authoring a signals scout.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 24 September 2026.SKILL.md, not by matching a directory convention. 2 distinct layouts observed: skills/omnibus/*/SKILL.md, skills/posthog/all/skills/*/SKILL.md.h1 and no skipped levels:vision-scanners-prompt-suggestions-dismissinbox-reports-list + inbox-report-artefacts-list (the report’s work log is the
evidence). See the [[inbox-exploration]] skill; that path also records your work against the report..claude-plugin/marketplace.json by PostHog, declaring 6 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./PostHog/skills.md, and each skill at its own .md URL.