# PR #22788 evidence, round 2: manifest

Capturer: Claude Opus 5.5 (Claude Code), 2026-10-22. Capture ran from 12:53 to 13:15 UTC.

## Environment

`2026-10-22 12:58–13:08 UTC | MACHINE=fs-20 | Linux 6.1.102 x86_64 | node v26.12.1 (dev servers + seed, repo-pinned via vite-plus) / v24.22.1 (Playwright driver, run from /tmp/ev-22788/driver) | vp v1.3.0 | playwright 1.60.0 + chromium-headless-shell 148.0.7778.96 | headless=yes | viewport 1440x900 DPR 1 (stills also 390x844) | locale en-US | timezoneId UTC | reducedMotion=no-preference | colorScheme light (W rows) | BEFORE=ed3f965e07 tree-clean + overlay | AFTER=c4f9d0e114 (head 9ec682fce8) tree-clean + overlay | @legendapp/list 3.3.5 (patched, same in both) | overlay sha256 ev22788-acp-mock-agent.ts 504242bde2c6789347bcba9854287a0eac60c69f3ee3be5b62d4169b89ec38b8, ev22788-timeline-follow-fixture.ts 9400062b06a1bd4fefce4d7cdcd4309439e3517fa7012d036fe6c00ff20d8cc8 | home dirs /tmp/ev-22788/homes/before, /tmp/ev-22788/homes/after (one per build, see deviations) | BEFORE server 16325 / web 8285, AFTER server 15378 / web 7338 | HOLD_MS=2500 (measured route hold 2.93–3.21 s, see below) | T3CODE_* unset (env -u for every T3CODE_* var, incl. T3CODE_HOME and OTLP URLs)`

`git status --short` in both trees shows only `?? apps/server/scripts/ev22788-acp-mock-agent.ts` and `?? apps/server/scripts/ev22788-timeline-follow-fixture.ts`. Nothing was committed, pushed, or staged.

## Scripts and overlay

| file | sha256 |
|---|---|
| [ev22788-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bfb589ac4cf643cc/ev22788-driver.mjs) | `49c57bfdf6d423c76aad464f23468c3d57a3843366f085cae04304b6405ddf43` |
| [ev22788-analyze.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b58d357316e71e8/ev22788-analyze.py) | `cfd7ee1498aacea0dfad0b655229dac7bd93c931511520aedee0627d0aa5830d` |
| [ev22788-diff.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/23c6880255f01081/ev22788-diff.py) | `d0bf62343b81042ee171db9497f5d1656dea53f9ff340b09ed5ae7bb6f612c78` |
| [ev22788-s0.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9aafbe83228694c6/ev22788-s0.py) | `7049ccb495d29729882c987fc7c2b2854bf3166e126e00f8012312f444624cd8` |
| [ev22788-verdicts.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b8b5000c6a0409d5/ev22788-verdicts.py) | `48dd0720d498efd502f8158611fdb70ef5af2b8750d1e36df3d50d36f4f6984e` |
| [ev22788-seed.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff9692cbde729441/ev22788-seed.sh) | `f1a3034b7d1cf06e34a2ae3018acb9412483048267a3624c40139eff53ddc751` |
| [ev22788-acp-mock-agent.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3ee17c91a06d33f0/ev22788-acp-mock-agent.ts) | `504242bde2c6789347bcba9854287a0eac60c69f3ee3be5b62d4169b89ec38b8` |
| [ev22788-timeline-follow-fixture.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e24df40e19e50efb/ev22788-timeline-follow-fixture.ts) | `9400062b06a1bd4fefce4d7cdcd4309439e3517fa7012d036fe6c00ff20d8cc8` |

The overlay mock is AFTER's `acp-mock-agent.ts` (main's mock plus the PR's fixture hook) with only the import renamed to `./ev22788-timeline-follow-fixture.ts`. BEFORE's committed `acp-mock-agent.ts` is byte-identical to main's. The overlay fixture follows matrix §1: phases `entry, t1-start, t1-finish, p1, t2-*, p2, t3-*, p3, resumed`; `tool_call` (new `T<n>`, in_progress) then `tool_call_update` (completed, stdout). Each paragraph is 2 lines and starts with `Pnnn.`. No chunk is over 2 paragraphs. Provider registered through `userdata/settings.json` `providerInstances.timeline_fixture` (the fixture's `provider` output); the project was added with `t3 project add`; threads were seeded with the fixture's `seed` command (`t3 thread start`).

## R0 gate (BEFORE): PASS

Listeners after the hold: timelineFollow **0**, docKeydownFollow **0**. /bounded requests held 1, framesDuringHold **75** (≥ 60), loadingSeenDuringHold **True**. Wheel-up gap **339 px = 0.40 ch** (ch 848). After `t1-start` (Δ 0, boundary only) the gap is **0**. After `t1-finish` it is **0**, and after `p1` (Δ +56) it is **0**. It snapped on the first run.

Artifacts: [video](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/920a496cde5dbfa5/ev22788-before-R0.webm), [narration](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7db5cfb6afb5688/ev22788-before-R0-narration.md), [result.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/720784b549a6d8f2/ev22788-before-R0-result.json), [sync.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ad82514d74d7414/ev22788-before-R0-sync.json)

## P-probe (no recording, both builds, hold on)

| phase | BEFORE scrollHeight | Δ | Δ/ch | gap | AFTER scrollHeight | Δ | Δ/ch | gap |
|---|---|---|---|---|---|---|---|---|
| S0 mounted | 5993 | None | None | 0 | 5993 | None | None | 0 |
| after t1-start | 5993 | 0 | 0.0 | 0 | 5993 | 0 | 0.0 | 0 |
| after t1-finish | 5993 | 0 | 0.0 | 0 | 5993 | 0 | 0.0 | 0 |
| after p1 | 6049 | 56 | 0.066 | 0 | 6049 | 56 | 0.066 | 0 |
| after t2-start | 6049 | 0 | 0.0 | 0 | 6049 | 0 | 0.0 | 0 |
| after t2-finish | 6049 | 0 | 0.0 | 0 | 6049 | 0 | 0.0 | 0 |
| after p2 | 6104 | 55 | 0.065 | 0 | 6104 | 55 | 0.065 | 0 |
| after t3-start | 6104 | 0 | 0.0 | 0 | 6104 | 0 | 0.0 | 0 |
| after t3-finish | 6104 | 0 | 0.0 | 0 | 6104 | 0 | 0.0 | 0 |
| after p3 | 6160 | 56 | 0.066 | 0 | 6160 | 56 | 0.066 | 0 |
| after resumed | 6321 | 161 | 0.19 | 0 | 6321 | 161 | 0.19 | 0 |

Every `p*` and `resumed` Δ is > 0 and < 0.5 ch, and the gap is 0 after every phase on both builds. **Tool-start and tool-finish Δ is 0 on both builds** (reported, per §1). The running tool's one-line live `Tool` row replaces the one-line working row, and the completed single tool row adds no net height; the screenshot shows only the live row while the tool runs, and the completed thread in the stills shows no tool rows between P100–P105. I did not investigate why the completed tool rows are not visible; this is unverified. Those phases are kept as boundary-only phases. R0, W1 and W2 on BEFORE still snap at them through the `dataChange` re-pin (matrix §0.3). Probe files: [probe.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d1a4e88364cd8a5/ev22788-probe.json), [BEFORE result](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d284243a651097fd/ev22788-before-probe-result.json), [AFTER result](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/167110577cb8948d/ev22788-after-probe-result.json). The first BEFORE probe ran with a glob route (`**/bounded`) that missed the `?compactTurnItems=1` query, so it held nothing; that run had listeners 4/1. It was discarded and rerun with a regex route; it is the extra thread in BEFORE's sidebar.

## Row → verdict

ch = 848 px everywhere. Hold = |ΔscrollTop| ≤ 2, same anchorId, |ΔanchorTop| ≤ 2, gap growth = ΣΔ ± 4, measured against S_up. Snap = gap ≤ 40.

| row | BEFORE (ed3f965e07) measured | AFTER (c4f9d0e114) measured | expected | verdict |
|---|---|---|---|---|
| H1 hydration hold (in W1) | hold 3200 ms, frames 72, loading seen True, listeners **0/0** | hold 3045 ms, frames 79, loading seen True, listeners **4/1** (scroll, wheel, touchmove, pointerdown + keydown), every add after release: True | 0/0 vs 4/1 | PASS |
| W1 wheel + tool boundaries | S_up 339 (0.40 ch) pill=False; t1-start gap 0; t1-finish gap 0; p1 gap 0; t2-start gap 0; t2-finish gap 0; p2 gap 0; pill never shown | S_up 339 (0.40 ch) pill=True; scrollTop Δ 0, anchor P084 ΔanchorTop 0.0 at every phase; t1-start gap 339; t1-finish gap 339; p1 gap 395; t2-start gap 395; t2-finish gap 395; p2 gap 450 (ΣΔ 56+55 = 111); pill shown | BEFORE snap, AFTER hold | PASS (BEFORE snap_all True, AFTER hold_all True) |
| W4 resume (W1 clip) | pill absent, so the wheel path (+2 ch): gap 0, later t3-start 0, t3-finish 0, p3 0, resumed 0 | pill click: gap 0, pill False, later t3-start 0, t3-finish 0, p3 0, resumed 0 | BEFORE follows; AFTER re-follows | PASS |
| W2 keydown on body | click P100 then blur: activeElement body True, control follow after t1-start True; ArrowUp ×9 (focus ['BODY'], no PageUp) → 360 (0.42 ch) pill=False; t1-finish gap 0; p1 gap 0 | same setup: body True, control True; 360 (0.42 ch) pill=True; scrollTop Δ 0, P084 ΔanchorTop 0.0; t1-finish gap 360; p1 gap 416 | BEFORE snap, AFTER hold | PASS |
| W3 never-scroll control | gap 0 after all 10 phases; pill never shown | gap 0 after all 10 phases; pill never shown | both follow | PASS |
| W5 fast hydration (no hold) | listeners **4/1** (valid), mount 394 frames from first rAF; 339 (0.40 ch) pill=True; hold at all 6 phases (scrollTop Δ 0, P084, t1-start gap 339; t1-finish gap 339; p1 gap 395; t2-start gap 395; t2-finish gap 395; p2 gap 450) | listeners 4/1; same hold, t1-start gap 339; t1-finish gap 339; p1 gap 395; t2-start gap 395; t2-finish gap 395; p2 gap 450 | both hold | PASS |
| S0 barrier transcript | see transcript | see transcript | no .done without an earlier .release | PASS ([s0-transcript.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b88d35c96f9a4d59/ev22788-s0-transcript.md)) |
| R-opt anchoring | not captured | not captured | optional | SKIPPED (not attempted) |
| ST 1440x900-light | [B.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c359f6e0214ebe0f/ev22788-still-before-1440x900-light.png) | [A.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3c577f26dd44e0f7/ev22788-still-after-1440x900-light.png) | [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77b0463282e076be/ev22788-still-diff0-1440x900-light.png) (7946 px), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5232561a7ac432fb/ev22788-still-diffT-1440x900-light.png) (7308 px) | DiffT 0 in the main/timeline region (x ≥ 256: Diff0 0, DiffT 0). Every non-zero pixel is in the sidebar thread list, bbox [18, 364, 236, 858]. Explained below. |
| ST 1440x900-dark | [B.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/37ded05d5d156001/ev22788-still-before-1440x900-dark.png) | [A.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3c0f8a613c6be589/ev22788-still-after-1440x900-dark.png) | [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/977fb9d997d23a79/ev22788-still-diff0-1440x900-dark.png) (7877 px), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cb804b6b5ecd7099/ev22788-still-diffT-1440x900-dark.png) (7263 px) | DiffT 0 in the main/timeline region (x ≥ 256: Diff0 0, DiffT 0). Every non-zero pixel is in the sidebar thread list, bbox [18, 364, 236, 858]. Explained below. |
| ST 390x844-light | [B.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12934945e96e0521/ev22788-still-before-390x844-light.png) | [A.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d8555c85f1945d5e/ev22788-still-after-390x844-light.png) | [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/034f076d64ee820d/ev22788-still-diff0-390x844-light.png) (0 px), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/57562c7e74fb28e0/ev22788-still-diffT-390x844-light.png) (0 px) | Diff0 0, DiffT 0 (pixel-identical) |
| ST 390x844-dark | [B.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bec95eb5c1ae6295/ev22788-still-before-390x844-dark.png) | [A.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e41b1bbb02e25d9/ev22788-still-after-390x844-dark.png) | [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9053885c5a45164b/ev22788-still-diff0-390x844-dark.png) (0 px), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/61f8458eed94b977/ev22788-still-diffT-390x844-dark.png) (0 px) | Diff0 0, DiffT 0 (pixel-identical) |

Verdict data: [verdicts.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/55473325b341dcb4/ev22788-verdicts.json); pixel diffs: [pixel-diffs.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b8f005c7e6684171/ev22788-still-pixel-diffs.json).

## Recordings

t=0 in each narration is the first video frame showing the overlay box (grey, `loading thread…`). Each driver step changes the 24 px box's colour and the overlay text. Narration times are the first 25 fps frame showing that colour. The wall-clock prediction agreed to ≤ 0.053 s for 7 of 9 videos. BEFORE W3 (`release t2-finish`, 0.28 s) and AFTER W5 (`release p2`, 0.25 s) each have one mark that landed late in the video (a recorder frame stall), so the observed frame time is used. Three frames per video (first, middle, last mark) were extracted and are uploaded as `verify-NN.png`.

| clip | video | narration | result | sync | verify frames |
|---|---|---|---|---|---|
| before-R0 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/920a496cde5dbfa5/ev22788-before-R0.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7db5cfb6afb5688/ev22788-before-R0-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/720784b549a6d8f2/ev22788-before-R0-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ad82514d74d7414/ev22788-before-R0-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abc9c1cabac2ed63/ev22788-before-R0-verify-00.png), [03.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3e7012ef6900bc05/ev22788-before-R0-verify-03.png), [06.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72ebbe4a5b3b03cd/ev22788-before-R0-verify-06.png) |
| before-W1 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7eec9900171dc90/ev22788-before-W1.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/85d101862ea99060/ev22788-before-W1-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b87047e3a338ea41/ev22788-before-W1-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d0d5011b81f4f396/ev22788-before-W1-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3719b384e270d4eb/ev22788-before-W1-verify-00.png), [07.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79649ff43f78b04a/ev22788-before-W1-verify-07.png), [14.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8e1331452562ab6b/ev22788-before-W1-verify-14.png) |
| after-W1 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d389ece88f400fc/ev22788-after-W1.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06fb35d74f054094/ev22788-after-W1-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c2a3c4ab98dcca4/ev22788-after-W1-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e42da6c39c00d4c/ev22788-after-W1-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d566c6a4b865d2f3/ev22788-after-W1-verify-00.png), [07.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a7a081713c15984/ev22788-after-W1-verify-07.png), [14.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dee706cb2d21d949/ev22788-after-W1-verify-14.png) |
| before-W2 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9eaeca83d6d585b9/ev22788-before-W2.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9fa19ce97e2fc782/ev22788-before-W2-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c9dc057f48256cf2/ev22788-before-W2-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a404b12313d55f5/ev22788-before-W2-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/78d9c44e4068b852/ev22788-before-W2-verify-00.png), [04.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e395c6e739eb2540/ev22788-before-W2-verify-04.png), [07.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1ce1b652699efda/ev22788-before-W2-verify-07.png) |
| after-W2 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf59e5665b883d5d/ev22788-after-W2.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/20e1eb2dc5dc3fa1/ev22788-after-W2-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30916702f2c82119/ev22788-after-W2-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/263ddcc4545f7359/ev22788-after-W2-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a860a7b8ec3927a0/ev22788-after-W2-verify-00.png), [04.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e9fa6d17549da84/ev22788-after-W2-verify-04.png), [07.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/83e3c4e7bd29dfe5/ev22788-after-W2-verify-07.png) |
| before-W3 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9cd89d3be0b93cf3/ev22788-before-W3.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/54f0899cacb93b0e/ev22788-before-W3-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15cb78e86c844c59/ev22788-before-W3-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f79ebb51abffda5/ev22788-before-W3-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/943051ef62dd695b/ev22788-before-W3-verify-00.png), [06.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5cb1e7bccc710e68/ev22788-before-W3-verify-06.png), [11.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b242ff02181dccc7/ev22788-before-W3-verify-11.png) |
| after-W3 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/67e6af06709d9fb0/ev22788-after-W3.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2100cc815ffdb1fb/ev22788-after-W3-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/18cf9f634d6320b2/ev22788-after-W3-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f0ccf492ae42be2f/ev22788-after-W3-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/df5aa8432af8a987/ev22788-after-W3-verify-00.png), [06.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72d0443c70433ef5/ev22788-after-W3-verify-06.png), [11.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b5af7f9f93fd6ae/ev22788-after-W3-verify-11.png) |
| before-W5 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8699219504bacf64/ev22788-before-W5.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6fa991be3bb51baf/ev22788-before-W5-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/299aa8906993a7c7/ev22788-before-W5-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8dacd03086f7418d/ev22788-before-W5-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/81dce801b8ff75c0/ev22788-before-W5-verify-00.png), [05.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/863457889f4b4859/ev22788-before-W5-verify-05.png), [09.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e97317787c5595b5/ev22788-before-W5-verify-09.png) |
| after-W5 | [webm](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/409fb965bbba4868/ev22788-after-W5.webm) | [md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e3ba618b75980d40/ev22788-after-W5-narration.md) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/529240de045b5ab6/ev22788-after-W5-result.json) | [json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/47a4e9a98dd210b5/ev22788-after-W5-sync.json) | [00.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5539b0f7fb054fdc/ev22788-after-W5-verify-00.png), [05.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f71dc60a1abeb47b/ev22788-after-W5-verify-05.png), [09.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/741e2136f5d7f26c/ev22788-after-W5-verify-09.png) |

## What else changed between captures

- **Sidebar contents differ between builds.** Each build has one home; every row seeds a fresh thread there, not a fresh home per row. BEFORE has 2 more `Timeline fixture long` threads than AFTER: the discarded unheld probe and R0. Relative times also differ, and R0, W1, W2 and W5 runs were left mid-run, so some show `Working`. That accounts for all of the 1440 still DiffT (x 18–236). The 390 stills hide the sidebar and are pixel-identical.
- Stills load the completed W3 thread of each build by direct URL with `page.clock.setFixedTime(2026-10-22T14:00Z)`, so they show no driver overlay. At 390 the thread was opened by direct URL, not through the sidebar's thread switcher.
- Thread IDs and barrier directories differ per run (`mcp:<uuid>`, `<mock pid>-1`). The environment IDs differ per build.
- The measured route hold is 2.93–3.21 s, not 2.5 s. The handler calls `page.evaluate` three times (frame counter and loading probe) around the 2,500 ms sleep. framesDuringHold is 62–88, and the hold covered the full load on every held row (loading placeholder present 50 ms before release).
- Time to mount from navigation is about 11–16 s in dev mode (cold Vite chunks) on both builds. W5 mounted without a hold and still attached 4/1 on BEFORE, so W5 is valid.
- The dev servers for both builds ran at the same time on distinct ports; rows ran one at a time.
- The composer switches to its compact layout when the timeline is not at the end. This happens on both builds and appears in the videos.

## Deviations from the matrix

- One home per build (`/tmp/ev-22788/homes/<build>`) instead of `<build>-<row>`. Each row uses a freshly seeded thread, a fresh barrier directory, and a fresh browser context (with the paired storageState).
- The P-probe ran with the H(2500) hold on (the matrix says no hold). This doesn't affect Δ; it also confirmed 0/0 vs 4/1 before any recording.
- The tool-start and tool-finish phases add 0 px. Section 1 asked for 0 < Δ for `*-finish`, and this is reported rather than worked around (expanding tool groups is forbidden).
- R-opt was not captured.
