Skip to main content
skill CX Codex

finding-replay-for-issue — Claude Code skill: best replay for an error

Picks the session recording that actually shows what the user did before an error, instead of guessing among hundreds of linked sessions.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add PostHog/skills --skill finding-replay-for-issue -a claude-code
Open on GitHub

What finding-replay-for-issue does

The skill takes an error tracking issue ID and queries exception events for sessions carrying the same fingerprint. Crash-only fragments under 10 seconds and recordings over an hour get dropped. What remains is ranked by duration in the 2–15 minute range, active time ratio, activity score and recency.

It runs on PostHog MCP tools: query-error-tracking-issue for issue details, execute-sql to pull session IDs from $exception events, query-session-recordings-list for candidate metadata, session-recording-get for the chosen recording. The output is a link to the replay, a short note on why this one won, and the pre-error context — pages visited and how often the error fired in that session.

Want a written summary instead of watching? There is a Replay Vision path: check for an existing observation, find a summarizer scanner, then scan. Scanning is async and takes several minutes. One catch: Replay Vision has no per-call focus parameter, so the scanner's own prompt decides what gets summarized. For error work you want a scanner whose prompt targets exception context. If $session_id is null on many exception events, session replay is not enabled for those users — worth checking your capture setup.

What it helps with

  • pick the one recording that shows the path to an error
  • filter out sessions that crash the page instantly
  • see which pages a user visited before the exception
  • get a text summary of a session without watching it
  • count how often the error repeated in one session

Example prompts for the agent

  • show me a replay for this error
  • find a recording for issue <issue_id>
  • summarize the best replay for this error

How to install finding-replay-for-issue

1Skills CLI (Vercel)

npx skills add PostHog/skills --skill finding-replay-for-issue -a claude-code

2Manually: put the files in place

~/.claude/skills/finding-replay-for-issue/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/finding-replay-for-issue/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about finding-replay-for-issue

How do I install finding-replay-for-issue in Claude?

Run npx skills add PostHog/skills --skill finding-replay-for-issue -a claude-code. The skill lands in ~/.claude/skills/finding-replay-for-issue/SKILL.md.

What does finding-replay-for-issue do?

Given an error tracking issue ID, it finds linked sessions, ranks them by duration, activity and recency, and surfaces the most informative replay with pre-error context.

What do I need for it to work?

Access to the PostHog MCP tools, plus session replay enabled for your users — otherwise exception events carry no $session_id.

Source text

SKILL.md · MIT
---
name: finding-replay-for-issue
description: >
  Finds the most informative session recording linked to an error tracking issue.
  Use when a user has an error tracking issue ID and wants to watch a replay showing
  what the user was doing when the error occurred. Ranks linked sessions by recency,
  activity score, and journey completeness, then summarizes the pre-error context.
  Replaces blind session picking from potentially hundreds of linked recordings.
---

# Finding the best replay for an error tracking issue

When a user says "show me a replay for this error" or "find a recording for issue X",
the goal isn't just any linked session — it's the one that best shows what led to the error.
Popular issues can have hundreds of linked sessions, and most are crash-only fragments
or duplicate occurrences. This skill picks the most useful one.

## Available tools

| Tool                                    | Purpose                                                    |
| --------------------------------------- | ---------------------------------------------------------- |
| `posthog:query-error-tracking-issue`    | Get issue details (fingerprint, status, volume)            |
| `posthog:execute-sql`                   | Query exception events to find linked sessions             |
| `posthog:query-session-recordings-list` | Fetch recording metadata for candidate sessions            |
| `posthog:session-recording-get`         | Get full details for the selected recording                |
| `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 recording (optional, slow) |

## Workflow

### Step 1 — Get the issue details

Fetch the error tracking issue to understand what you're looking for:

```json
posthog:query-error-tracking-issue
{
  "issueId": "<issue_id>"
}
```

Note the issue's `fingerprint`, `name`, and `description` — you'll need the fingerprint
to find linked sessions.

### Step 2 — Find sessions with this error

Query exception events to get session IDs where this error occurred.
Order by recency and include basic context:

```sql
posthog:execute-sql
SELECT
    $session_id AS session_id,
    count() AS occurrences,
    min(timestamp) AS first_seen,
    max(timestamp) AS last_seen,
    any(properties.$current_url) AS url
FROM events
WHERE event = '$exception'
    AND properties.$exception_fingerprint = '<fingerprint>'
    AND $session_id IS NOT NULL
    AND timestamp > now() - INTERVAL 30 DAY
GROUP BY session_id
ORDER BY last_seen DESC
LIMIT 20
```

This gives you up to 20 candidate sessions. More candidates means better selection.

### Step 3 — Rank the candidates

Fetch recording metadata for the candidate sessions to rank them:

```json
posthog:query-session-recordings-list
{
  "session_ids": ["<id1>", "<id2>", "<id3>", ...],
  "date_from": "-30d"
}
```

Pick the best recording by filtering out bad candidates, then ranking what's left:

**Filter out:**

- Sessions under 10 seconds (crash-only fragments, no pre-error context)
- Sessions over 1 hour (too much data to load, error is a needle in a haystack)

**Rank by:**

1. **Sweet-spot duration** — 2-15 minutes is ideal. Long enough to show the user's
   journey before the error, short enough to be practical to watch or summarize.
2. **Active time ratio** — compare `active_seconds` to `recording_duration`. A 20-minute
   recording with 10 seconds of activity is mostly idle tabs — the user walked away.
   Prefer sessions where `active_seconds / recording_duration` is above 0.3 (30%).
3. **Activity score** — higher `activity_score` means the user was actively interacting,
   not idle. More interesting to watch.
4. **Recency** — more recent sessions reflect current app behavior.

### Step 4 — Present the finding

Fetch full details for the selected recording:

```json
posthog:session-recording-get
{
  "id": "<best_recording_id>"
}
```

Present to the user:

- **The recording** with a link to watch it
- **Why this one** — briefly explain the selection ("longest session with the error,
  user was browsing 3 pages before hitting it")
- **Pre-error context** — what pages the user visited and key actions before the exception,
  derived from the events query in step 2 (the `url` and `first_seen` columns)
- **Error frequency** — how many times the error occurred in this session

### Optional: AI summary via Replay Vision

If the user wants a narrative summary without watching, use Replay Vision —
"check-then-scan", since a scanner can only observe a given session once.

1. **Check for an existing summary** on the selected recording:

   ```json
   posthog:vision-observations-list
   {
     "session_id": "<best_recording_id>"
   }
   ```

   If an observation has `scanner_snapshot.scanner_type` `summarizer` and
   `status` `succeeded`, read `scanner_result.model_output` (`title`, `summary`,
   `intent`, `outcome`, `friction_points`, `keywords`) — done.

2. **Find a summarizer scanner** if none exists:

   ```json
   posthog:vision-scanners-list
   {
     "scanner_type": "summarizer"
   }
   ```

   One → use it. More than one → ask the user which (show name + prompt). None →
   offer to create one via the `creating-replay-vision-scanners` skill.

3. **Scan the recording** with the chosen scanner (async, several minutes):

   ```json
   posthog:vision-scanners-scan-session
   {
     "id": "<scanner_id>",
     "session_id": "<best_recording_id>"
   }
   ```

4. **Retrieve** by polling `vision-observations-list` until `succeeded`.

## Tips

- If all candidate sessions are very short (<10 seconds), the error likely crashes
  the page immediately. Note this — it's useful context even without a long replay.
- When the issue has very few linked sessions (<3), skip the ranking and just present
  what's available with a note about the small sample.
- If `$session_id` is null on many exception events, session replay may not be enabled
  for the affected users. Mention this as a possible gap.
- Replay Vision has no per-call focus parameter — a summarizer scanner's focus
  comes from its own prompt. For error-focused summaries, prefer (or create) a
  summarizer scanner whose prompt targets error/exception context rather than the
  whole session.

## Related skills

- **`investigating-error-issue`** — the quantitative side: volume, breakdowns, and stack traces for the same issue
- **`investigating-replay`** — deep-dive one of the linked sessions
- **`diagnosing-missing-recordings`** — when exception events have no $session_id or the linked recordings are gone

© PostHog · MIT · PostHog/skills

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set21

exploring-llm-costs The skill investigates LLM spend in PostHog: total cost, breakdowns by model, user and trace, plus token and cache economics. CX Codex +1 385installs feature-usage-feed Builds an LLM-judge eval that pulls canonical use cases for a PostHog feature and streams them to Slack. Useful when trace volume is too high to read by hand. CX Codex +1 381installs managing-experiment-lifecycle A PostHog skill that walks an experiment through its states: launch, pause, freeze exposure, end, archive, and migration of a legacy experiment to the new engine. CX Codex +1 379installs exploring-live-traffic A skill that teaches the agent to read PostHog's Live tab: who is on the site right now, which bots are crawling, and where visitors go. CX Codex +1 378installs suggesting-data-imports Spots which data PostHog doesn't collect and points you to the right warehouse source. Handy when a query fails on a missing table. CX Codex +1 372installs inbox-exploration A skill for PostHog Inbox: lists signal reports, drills into them, and turns a report into a task or PR. CX Codex +1 370installs authoring-log-alerts Walks an agent through picking services, baselining them over a week and drafting thresholds that fire 0–3 times per week in a PostHog project. CX Codex +1 356installs formatting-insight-axes Picks the right y-axis unit when you create or update a PostHog insight: seconds, milliseconds, percentages, currency. Stops the agent from adding formulas just to convert units. CX Codex +1 353installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor