Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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-re
.claude/skills/kunanonj-cursor-plugin-posthog-investigating-replay/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -17% | 0% |
| case-08 | ✓→✗ | ▼ Worse | -3% | 0% |
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:session-recording-summarize | AI-generated summary (slow, ~5 min, optional) |
Start with the recording to get metadata and the person's distinct ID:
jsonposthog: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:
jsonposthog:persons-retrieve { "id": "<person_uuid_from_recording>" }
Get the timeline of what the user did during the session:
sqlposthog: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 timestamp ASC LIMIT 200
For sessions with many events, focus on the most informative ones:
sqlposthog: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 FROM events WHERE $session_id = '<session_id>' AND event IN ('$pageview', '$pageleave', '$autocapture', '$exception', '$rageclick') ORDER BY timestamp ASC LIMIT 100
If the recording has console errors or exceptions, find related error tracking issues:
sqlposthog: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, message ORDER BY occurrences DESC LIMIT 10
If fingerprints are found, search for the corresponding error tracking issues to provide links and status:
jsonposthog: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 session-recording-summarize. Warn that first-time summaries take ~5 minutes:
jsonposthog:session-recording-summarize { "session_ids": ["<session_id>"] }
Note this rather than suggesting something is broken.
to dig into exceptions. If it's 0, skip step 3.
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.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | pass→fail | 12,673 | 5,554 | -56% | 1 | 1 | 0% | 2,091 | 2,027 | -3% | 0 | 0 | — |
case-14 | fail→fail | 11,806 | 2,699 | -77% | 1 | 1 | 0% | 1,788 | 1,530 | -14% | 0 | 0 | — |
case-01 | fail→fail | 8,254 | 9,063 | +10% | 1 | 1 | 0% | 658 | 1,951 | +197% | 0 | 0 | — |
case-02 | fail→fail | 11,747 | 10,077 | -14% | 1 | 1 | 0% | 1,360 | 1,759 | +29% | 0 | 0 | — |
case-03 | fail→fail | 6,193 | 7,717 | +25% | 1 | 1 | 0% | 1,163 | 1,628 | +40% | 0 | 0 | — |
case-04 | pass→fail | 6,458 | 7,050 | +9% | 1 | 1 | 0% | 1,054 | 2,378 | +126% | 0 | 0 | — |
case-05 | fail→pass | 9,995 | 3,372 | -66% | 1 | 1 | 0% | 1,598 | 1,689 | +6% | 0 | 0 | — |
case-06 | pass→pass | 9,517 | 4,060 | -57% | 1 | 1 | 0% | 1,582 | 1,722 | +9% | 0 | 0 | — |
case-07 | fail→fail | 8,240 | 8,175 | -1% | 1 | 1 | 0% | 1,265 | 1,558 | +23% | 0 | 0 | — |
case-09 | pass→pass | 7,318 | 3,013 | -59% | 1 | 1 | 0% | 1,088 | 1,579 | +45% | 0 | 0 | — |
case-10 | fail→pass | 6,699 | 4,134 | -38% | 1 | 1 | 0% | 1,163 | 1,878 | +61% | 0 | 0 | — |
case-11 | pass→fail | 11,586 | 6,364 | -45% | 1 | 1 | 0% | 1,845 | 1,453 | -21% | 0 | 0 | — |
case-12 | pass→pass | 12,130 | 1,975 | -84% | 1 | 1 | 0% | 1,945 | 1,389 | -29% | 0 | 0 | — |
case-13 | fail→pass | 9,512 | 2,082 | -78% | 1 | 1 | 0% | 1,550 | 1,449 | -7% | 0 | 0 | — |
case-15 | fail→pass | 8,770 | 2,303 | -74% | 1 | 1 | 0% | 1,696 | 1,414 | -17% | 0 | 0 | — |
case-16 | pass→pass | 3,916 | 2,255 | -42% | 1 | 1 | 0% | 736 | 1,509 | +105% | 0 | 0 | — |
case-17 | pass→pass | 8,356 | 5,409 | -35% | 1 | 1 | 0% | 1,610 | 2,179 | +35% | 0 | 0 | — |
case-18 | pass→pass | 9,397 | 2,162 | -77% | 1 | 1 | 0% | 1,600 | 1,426 | -11% | 0 | 0 | — |
case-19 | pass→fail | 2,883 | 7,265 | +152% | 1 | 1 | 0% | 446 | 1,574 | +253% | 0 | 0 | — |
case-20 | pass→pass | 6,329 | 7,462 | +18% | 1 | 1 | 0% | 1,278 | 2,597 | +103% | 0 | 0 | — |
case-21 | pass→pass | 14,986 | 14,827 | -1% | 1 | 1 | 0% | 3,221 | 4,194 | +30% | 0 | 0 | — |
case-22 | pass→pass | 7,546 | 6,530 | -13% | 1 | 1 | 0% | 1,468 | 2,275 | +55% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 16 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 16 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.