← SubtextCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Subtext
Snapshot Sep 30, 2026 · 22:58 UTC · version 1.0.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "subtext-session",
"description": "Session replay tools for analyzing Fullstory session recordings. Sparse API catalog — tools are self-describing.",
"included_files": [],
"skill_md_contents": "---\nname: subtext-session\ndescription: Session replay tools for analyzing Fullstory session recordings. Sparse API catalog — tools are self-describing.\n---\n\n# Session Replay\n\n> **PREREQUISITE:** Read `subtext-shared` for MCP conventions.\n\nAPI catalog for the session replay tools (all prefixed `review-`). One gesture — **zoom** — over two data sets: the **signal stream** (temporal) and the **snapshot** (spatial). Opening a session hands back a **map**: an always-on orientation header, never a zoom level.\n\n## MCP Tools\n\n| Tool | Description |\n|------|-------------|\n| `review-list-sessions` | Find reviewable sessions — numbered URLs + timestamps. |\n| `review-open` | Open a session for analysis. Returns a handle (`client_id`) plus the **map** and a digest rollup. |\n| `review-summary` | Static \"what happened\" — the default zoom (all kinds @ `standard`), frozen. No map, no handle. Stateless, cheapest call. Use for a quick read before deciding whether to `open`. |\n| `review-zoom` | The live lens. Pass a `resolution` map and/or a `t0_ms`/`t1_ms` time window — returns the matching signal slice. |\n| `review-snapshot` | The screen at a moment — screenshot + component tree + boxes, rooted at an optional `component_id`. |\n| `review-close` | Close the session and free resources; records a short usage summary. |\n\n## Discovering Parameters\n\nParameter schemas are visible in the tool definition at call time.\n\n## Session Input\n\n`review-open` accepts six mutually-exclusive identifiers. Pick the one that matches what you have on hand — they're all first-class:\n\n- `session_url` — a full Fullstory session URL. The most common form — a customer-shared link, a Slack paste, or a session from the app UI.\n- `trace_id` — the 12-char base62 id from a prior `review-open` response.\n- `trace_url` — a full trace URL copied from the browser or returned by a live tool.\n- `device_id` + `session_id` — both required together. Use when you have the raw ids but no URL.\n- `email_address` / `user_uid` — looks up the user's most recent session.\n\nAll six paths return the same handle. Capture the `client_id` from the response so follow-on `review-zoom`/`review-snapshot`/`review-close` calls don't need to re-resolve the session.\n\n## The map\n\n`review-open`'s response includes a map — a cheap counting fold over the signal layer, never a body dump:\n\n```\n## Map · 114 signals · 0.0s–353s · 2 pages\nflow: /ui ▸ /settings/overview ▸ /subtext/sessions ▸ /subtext/session/asr\nkinds: navigation 18 · interaction 36 · network 58 (2 err) · console 2 (2 err)\ntags: error:4\n```\n\nThe map is **whole** — rendered once, over the entire session. Zooming into `{navigation: \"standard\"}` later doesn't touch it: `error:4` stays in the map's counts regardless of what you go on to zoom into. Read the map first; it tells you what exists before you pay for a zoom.\n\n## The resolution contract\n\n`review-zoom` takes:\n\n```\nresolution?: { [scope | kind | tag]: \"digest\" | \"standard\" | \"machine\" | \"detail\" }\nt0_ms?: number // narrow the zoom to a time window\nt1_ms?: number\n```\n\nGrain ladder, coarse → fine:\n\n| grain | what you see |\n|-------|--------------|\n| `digest` | one rollup line per (section × kind) — `network ×19 (1 err)` |\n| `standard` *(default)* | the readable transcript — bursty/repeated signals merged into one line |\n| `machine` | every signal, nothing merged |\n| `detail` | every signal plus its payload — headers, bodies, stack traces |\n\n- **Omit `resolution`** → everything at `standard`.\n- **Provide it** → an explicit allow-list. Unlisted kinds are excluded from the slice (never from the map).\n- **Overlap → finest-wins.** A signal matching more than one key takes the finest grain among them — order-independent, and it can only ever show *more*, never hide something.\n\nKeys are scopes (`navigation`, `interaction`, `network`, `console`, …), kinds (`click`, `network`, `exception`, …), or tags (`error`, `exception` — the only tags today) — they resolve the same way.\n\n### Zoom recipes\n\n```\n// what went wrong, anywhere\nreview-zoom resolution={ error: \"standard\" }\n\n// what happened in this session\nreview-zoom resolution={ navigation: \"standard\", interaction: \"standard\" }\n\n// devtool-level detail\nreview-zoom resolution={ network: \"machine\", console: \"machine\" }\n\n// network readable, but every error deep — finest-wins, no override needed\nreview-zoom resolution={ network: \"standard\", error: \"detail\" }\n```\n\n## Snapshot\n\n`review-snapshot` takes `client_id` + `timestamp`, plus:\n\n- `component_id` — optional; roots **both** the image clip and the tree subtree, so \"focus here\" means one thing.\n- `lens` — `visible` (default), `interactive`, or `full`. Governs which elements populate the tree/boxes, not the pixels.\n- `include` — any of `image`, `tree`, `boxes`.\n- `expand_pct` — grows the `component_id` clip outward by this percent (0–100) for surrounding context.\n- `upload` — store the screenshot and return a shareable signed URL.\n\nNo network/console excerpts are stapled onto a snapshot — signals only come from `review-zoom`. Want the requests or logs around a moment? Zoom that window.\n\n## Tips\n\n- Read the map before you zoom. It's free and tells you whether there's anything worth looking at.\n- Start every zoom at `standard` (or omit `resolution` entirely) unless you already have a hypothesis about which kind matters.\n- `error` as a resolution key is a floor, not a special case — it only ever raises detail wherever it applies.\n- Use `review-snapshot` for \"what did the screen look like,\" not for signals — it's a different data set.\n- Always close sessions when done to free server resources.\n\n## See Also\n\n- `subtext-shared` — MCP conventions\n"
}SHA-256: 6a3b5d91fecaaedd773b08607e4ea2bf239dd58efcd3f33d3856724bfc002a89