What your agent actually receives
Stopping a recording produces one ZIP. Inside it is a markdown handoff you can paste straight into an agent, plus the evidence behind every claim in it: screenshots, voice notes, network bodies, the interaction timeline and (optionally) the full screen recording.
1. The package
session-package.zip
│
├── handoff.md the file you paste into an agent
├── manifest.json index of everything below, so an agent can jump
│ straight to the evidence for a given finding
├── playwright-repro.spec.ts generated repro, TypeScript
├── playwright-repro.py generated repro, Python (sync API)
│
├── markers/ one folder per flagged moment
│ ├── marker-01/
│ │ ├── screen-at-marker.png the screen when the marker fired
│ │ └── voice.wav the tester's voice note
│ └── marker-02/
│ ├── screen-at-marker.png
│ ├── before-01.png rolling buffer: the seconds leading up to it
│ ├── before-02.png
│ ├── highlight-01.png region the tester drew on screen
│ └── voice.wav
│
├── screenshots/ auto-captured on errors and interactions
│
├── network/ full request and response bodies
│
└── session-video.webm the full screen recording Every artifact is indexed in the manifest, so an agent jumps straight to the evidence behind a given finding instead of guessing at filenames. That index is also what the MCP bridge reads when it lists and opens packages for you.
Two export profiles share this layout. Session Report includes the screen recording for humans to watch in the viewer. Agent Session Export omits the video, since agents cannot watch it and it dominates the file size. Network request and response bodies appear only when deep diagnostics were enabled for the session.
2. The handoff markdown
This is the file you paste into Claude Code, Cursor, Codex or anything else. It is tiered on purpose: Tier 0 is the summary an agent reads first, and the deeper tiers hold the full timelines so a long session does not flood the context window.
# Coding Agent Session Handoff Bundle
## Tier 0: Quick Summary
| Field | Value |
|-------|-------|
| URL | https://app.example.com/checkout |
| Duration | 02:14 |
| Markers | 2 (2 manual, 0 auto) |
| Errors | 2 console, 1 network |
| Date | 2026-08-14 |
Session triage: one manual marker flags a functional defect at 01:12, corroborated by a
500 from POST /api/checkout/apply-discount 0.8s earlier. Highest-signal starting point:
Marker 2.
## Tester Intent Summary
### Specifications (what should work)
- Applying a valid discount code should reduce the order total before payment.
### Issues Found (what's broken)
- Marker 2 (01:12): code accepted in the field, total never updates, no error shown.
## Webapp Testing Reproduction
### Server Setup
# Inferred from session URL: https://app.example.com/checkout
### Reproduction Scripts
- TypeScript: playwright-repro.spec.ts
- Python: playwright-repro.py
### Verification Points
1. Order total decreases after applying code SAVE20.
2. No 5xx response from /api/checkout/apply-discount.
### Errors to Watch For
- POST /api/checkout/apply-discount -> 500
- TypeError: Cannot read properties of undefined (reading 'total')
### Key Selectors (from recording)
- [data-testid="discount-input"]
- [data-testid="apply-discount"]
- [data-testid="order-total"]
## Agent Guidance
1. Start at Marker 2. It is the manual marker and carries the tester's own description.
2. The 500 precedes the visible symptom; treat the API failure as the likely root cause.
3. Reproduce with the generated Playwright script before changing code.
4. Tier 2 and Tier 3 carry the full timelines if this summary is not enough.
## Session Context Note
Recorded within the first 30 seconds. Treat as starting state (who is logged in, what data
is set up, what will be tested), not a bug report.
- Recorded at: 00:06
- Has voice: yes
- Transcript: "Logged in as a test customer, one item in the cart, about to try the SAVE20 code."
## Tier 1: Findings
## Notable Anomalies
### Network Errors
- 01:11.4 POST https://app.example.com/api/checkout/apply-discount -> 500 (412ms) authorization: <redacted>
### Console/Error Events
- 01:11.6 error TypeError: Cannot read properties of undefined (reading 'total') at applyDiscount (checkout.js:214)
- 01:11.7 warn Discount state left pending; retry scheduled
## Marker Timeline
### Marker 2 (01:12)
- Type: manual
- Has voice: yes
- Transcript: "I typed SAVE20 and hit apply. It says applied but the total is still forty
euros. I expected it to drop to thirty-two."
- Evidence: markers/marker-02/ (screen at marker, 2 before-shots, 1 highlight, voice)
- Nearest interaction: click [data-testid="apply-discount"]
## Tier 2: Full Context
## User Interaction Timeline (Outside Marker Windows)
- 00:31.2 click [data-testid="cart-icon"]
- 00:44.9 click [data-testid="checkout-button"]
- 01:09.2 fill [data-testid="discount-input"] "SAVE20"
## Session Environment
- Viewport: 1512x850
- User agent: Chrome/141 macOS
- Scroll position at Marker 2: 320px
## Package Files
- markers/marker-01/ (2 files)
- markers/marker-02/ (5 files)
- screenshots/ (2 auto-captured)
- network/ (request and response bodies)
- session-video.webm
## Tier 3: Deep Diagnostics
## Full Session Network Timeline (Compressed)
- 01:09.4 POST /api/cart/validate 200 (88ms)
- 01:11.4 POST /api/checkout/apply-discount 500 (412ms)
- 01:11.9 GET /api/checkout/summary 200 (61ms) Redacted before it leaves
Note the <redacted> in the network line. Tokens, keys, passwords and card
numbers are stripped on your machine, before export, including inside the captured request
and response bodies. It is pattern-based, so treat it as a safety net rather than a
guarantee, and note that screenshots, video and voice cannot be scrubbed at all.
Nothing is uploaded
The ZIP lands in your Downloads folder. You decide who gets it. The MCP bridge reads it from disk on the developer's own machine, with no account and no cloud round-trip.
Illustrative sample. Filenames are simplified for readability and the bug, URLs and transcripts are invented for this page. Install the extension and export a session to see the real thing.