Error Tracking · Error…
Feature Flags · Feature…
Omnibus
200 chapters · 643 min
Omnibus
Chapter 53 of 200
Investigates a session recording by gathering metadata, person profile, same-session events, and linked error tracking issues in one pass.
3 minutes · 664 words · 10 sections
When a user asks “what happened in this session?” or provides a recording/session ID to investigate, gather all relevant context in parallel rather than making them ask for each piece.
| Tool | Purpose |
|---|---|
posthog:session-recording-get | Recording metadata (duration, counts, status) |
posthog:persons-retrieve | Person profile (properties, distinct IDs) |
posthog:execute-sql | Query events, errors, and page views in session |
posthog:query-error-tracking-issues-list | Find error tracking issues linked to the session |
posthog:vision-observations-list | Check for an existing Replay Vision AI summary |
posthog:vision-scanners-list | Find summarizer scanners (scanner_type=summarizer) |
posthog:vision-scanners-scan-session | Run a summarizer scanner on the session (slow, optional) |
posthog:vision-scanners-create | Create a temporary summarizer scanner (ask first) |
posthog:vision-scanners-delete | Delete a temporary scanner after summarizing |
Start with the recording to get metadata and the person’s distinct ID:
posthog:session-recording-get
{
"id": "<recording_id>"
}The response includes distinct_id, person, duration, interaction counts,
console error counts, and viewing status. Use the distinct_id to fetch
the full person profile:
posthog:persons-retrieve
{
"id": "<person_uuid_from_recording>"
}Get the timeline of what the user did during the session:
posthog:execute-sql
SELECT
timestamp,
event,
properties.$current_url AS url,
properties.$browser AS browser,
properties.$os AS os,
properties.$device_type AS device_type,
properties.$screen_width AS screen_width
FROM events
WHERE $session_id = '<session_id>'
ORDER BY
For sessions with many events, focus on the most informative ones:
posthog:execute-sql
SELECT
timestamp,
event,
properties.$current_url AS url,
if(event = '$exception', properties.$exception_message, null) AS exception_message,
if(event = '$exception', properties.$exception_type, null) AS exception_type
If the recording has console errors or exceptions, find related error tracking issues:
posthog:execute-sql
SELECT DISTINCT
properties.$exception_fingerprint AS fingerprint,
properties.$exception_type AS type,
properties.$exception_message AS message,
count() AS occurrences
FROM events
WHERE $session_id = '<session_id>'
AND event = '$exception'
GROUP BY fingerprint, type
If fingerprints are found, search for the corresponding error tracking issues to provide links and status:
posthog:query-error-tracking-issues-list
{
"searchQuery": "<exception_type or message>"
}Present the findings as a coherent narrative:
If the user wants a deeper analysis without reading through events manually, offer a Replay Vision summary. Follow “check-then-scan” — don’t scan blindly, a scanner can only observe a given session once.
Check for an existing summary. A scheduled scanner may already have one:
posthog:vision-observations-list
{
"session_id": "<session_id>"
}Look for an observation where scanner_snapshot.scanner_type is summarizer
and status is succeeded. If found, read scanner_result.model_output
(title, summary, intent, outcome, friction_points, keywords) — done,
no new scan needed.
Find a summarizer scanner if none exists yet:
posthog:vision-scanners-list
{
"scanner_type": "summarizer"
}Scan the session with the chosen scanner. Warn this is async and takes several minutes (rasterize + LLM):
If the project has no summarizer scanner, you can still produce a one-off summary with a throwaway scanner — but ask the user’s permission before creating anything.
Ask permission to create a temporary summarizer scanner just to summarize this one session.
Create it disabled so it never sweeps on a schedule — a disabled scanner only runs when you trigger it on demand, so it won’t touch other sessions or burn quota in the background:
posthog:vision-scanners-create
{
"name": "Temporary on-demand summary",
"scanner_type": "summarizer",
"scanner_config": {
"prompt": "Summarize what the user was trying to do, whether they succeeded, and any friction they hit."
},
"query": { "kind": "RecordingsQuery" },
"model": "gemini-3-flash-preview"
start_url from the recording tells you where the user’s journey began —
use this to frame the narrative.person is null on the recording, the user was anonymous.
Person properties won’t be available, but events still are.Install this repository
npx skills add PostHog/skills/plugin marketplace add PostHog/skillsSkills install per repository, not per chapter — the CLI has no documented per-skill form, so we do not print one.
Investigates a session recording by gathering metadata, person profile, same-session events, and linked error tracking issues in one pass. Use when a user provides a recording or session ID and wants to understand what happened — who the user was, what they did, what errors occurred, and whether there are related error tracking issues. Replaces the manual chain of session-recording-get, persons-retrieve, execute-sql, and query-error-tracking-issues-list.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 9 August 2026.SKILL.md, not by matching a directory convention. 5 distinct layouts observed: skills/omnibus/*/SKILL.md, skills/posthog/all/skills/*/SKILL.md, skills/posthog/error-tracking/skills/*/SKILL.md, skills/posthog/feature-flags/skills/*/SKILL.md, skills/posthog/integration/skills/*/SKILL.md.h1 and no skipped levels:Retrieve the result by polling vision-observations-list (step 1) until
the new observation reaches succeeded.
Scan this session on demand with the new scanner, then poll for the result:
posthog:vision-scanners-scan-session
{
"id": "<new_scanner_id>",
"session_id": "<session_id>"
}Poll vision-observations-list until the observation reaches succeeded and
read scanner_result.model_output.
Ask whether to keep or delete the scanner. Once you have the observation,
ask the user if they want to keep the temporary scanner or delete it with
vision-scanners-delete. Deleting is safe: the summary you just read is also
emitted as an event that persists after the scanner is gone, so cleaning up the
temporary scanner does not lose the result.
.claude-plugin/marketplace.json by PostHog, declaring 5 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./PostHog/skills.md, and each chapter at its own .md URL.