# Updated evidence · recapture round

**Visible changes include finishing controls, toasts, and consequential Send/title/sidebar changes as well as preserved text. The two keyboard failures below predate this PR.**

PR [#33210](https://git.cafe/pingdotgg/t3code/pull/33210). Before [4c361199f4][b]; recaptured after [a1d7a2f67a][a]; carried after [099303beac][c]. No source edits, commits, pushes or PR edits.

**Real app, synthetic audio, stubbed speech backend.** Built-in Browser panel; Linux x86_64; headless Chromium 157; no device emulation; DPR 2; 16px root font and default font scaling. Stills: 1440×1000 and 390×844 CSS px, each light/dark (2880×2000 and 780×1688 physical). Recordings: 1440×1000 light; F02 additionally 390×844 dark. Each comparison uses the same synthetic seed, viewport, theme, scroll position and client clock frozen at 2026-11-10 12:00 UTC. Server-generated durations/relative times remain real.

Fresh isolated `T3CODE_DEV_SEED=0` databases; synthetic oscillator MediaStream; only voice status/batch transcription/cleanup results are stubbed. Replay (dev) handles Send. A shared synthetic git checkout named `evidence-fixture` neutralizes checkout labels identically. Recording fixture threads and new drafts start with the thread-details card preference closed before navigation, avoiding an unrelated default-card flash. Source code was not edited. The Browser tool has no reduced-motion override: the harness disables CSS transitions/animations and hides carets for both stills and recordings. Still-only matrix runs hold toast expiry; recordings keep normal toast lifetime. Each still waits for fonts and non-speech fetch idle, then requires two identical frames 500ms apart (AE=0). Intentionally held speech and the persistent WebSocket are excluded from network idle. Every full capture/diff panel and sampled recording sheet was visually opened before upload. Video samples are every 0.5s plus action-adjacent frames. Action timestamps reflect the capture tool and controlled gates, not latency benchmarks.

[All checkpoints and recording timelines](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/70afa56837aefb6c/checkpoints.md) · [Verbatim asset/script inventory](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9f91b13b28c8166c/asset-inventory.md). Diff0 amplifies any nonzero max RGB-channel delta; Diff8 uses >8/255. 72 new paired checkpoints, 20 new recordings, and the valid original rows below.

The [a1d7a2f67a][a] diff only adds consent-change cancellation and does not touch the carried rows’ render paths; audit pass 2 confirmed their stable-grant applicability. Original recordings use normal motion; original stills pause infinite animations. Carried rows remain labelled [099303beac][c].

## F01 · 1440×1000 light · B-info

Record A=`Fix`, switch to B, edit B, attempt the mic and Control+Shift+D with Escape in B, release the source response, revisit A, then start/cancel a fresh B recording. Only after adds the transcript to A; B stays editable. The first frames also support F00 idle. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.74s open B; 4.04s type unrelated draft; 4.14s mic; 4.88s press Escape; 7.67s Control+Shift+D; 7.86s press Escape; 8.03s release transcription; 8.14s open A; 12.01s open B; 13.05s mic; 15.30s Cancel; 16.20s fresh B mic usable. **After steps:** 0.09s F01 start; 0.57s mic; 4.06s open B; 5.52s type unrelated draft; 5.62s mic; 6.29s press Escape; 9.17s Control+Shift+D; 9.28s press Escape; 9.40s release transcription; 9.51s open A; 13.20s open B; 14.31s mic; 16.61s Cancel; 17.72s fresh B mic usable. Before: [F01-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b9a14ca9b46f2167/F01-1440-light-before.mp4) | After: [F01-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/38d54bd0028d5448/F01-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F01-B-info-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e56b844c260ddd67/F01-B-info-1440-light-Before.png)<br>[4c361199f4][b] | ![F01-B-info-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0e3931502247254a/F01-B-info-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F01-B-info-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1c76073ebb984a64/F01-B-info-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F01-B-info-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/10be9f086ade5fd0/F01-B-info-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F02 · 1440×1000 light · A-send-waiting

Record empty A, switch to B and back, click button Send while the response is held, then release it. After waits and submits exactly one transcript message; before has discarded the recording and sends nothing. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 7.98s open B; 9.30s open A; 13.01s focus composer; 13.65s Send; 16.79s release transcription. **After steps:** 0.48s mic; 2.82s open B; 4.21s open A; 7.92s focus composer; 8.59s Send; 11.77s release transcription. Before: [F02-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86f16411da27f7c6/F02-1440-light-before.mp4) | After: [F02-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7a240e3f2ea391c0/F02-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F02-A-send-waiting-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba03712cb7f7de72/F02-A-send-waiting-1440-light-Before.png)<br>[4c361199f4][b] | ![F02-A-send-waiting-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d239fc37db6becdf/F02-A-send-waiting-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F02-A-send-waiting-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cb405dabace68d00/F02-A-send-waiting-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F02-A-send-waiting-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b93bc6ae7617d74c/F02-A-send-waiting-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

**Before steps (390×844 dark):** 0.51s expand composer; 1.08s mic; 3.44s open sidebar; 4.18s open B; 5.17s expand composer; 6.10s open sidebar; 6.77s open A; 7.65s expand composer; 10.43s expand composer; 11.00s focus composer; 11.61s Send; 13.90s release transcription. **After steps (390×844 dark):** 0.51s expand composer; 1.10s mic; 3.37s open sidebar; 4.11s open B; 5.11s expand composer; 6.09s open sidebar; 6.76s open A; 7.81s expand composer; 10.45s focus composer; 11.02s Send; 13.32s release transcription.

Before: [F02-390-dark-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ba0123def667b67a/F02-390-dark-before.mp4) | After: [F02-390-dark-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29fb6adc95e8597d/F02-390-dark-after.mp4)

## F04a · 1440×1000 light · A-result

Finish A explicitly, hold cleanup, switch away and return, Skip cleanup, then release the late cleanup response. After keeps the raw transcript. Final frames have neutral hover/focus. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.52s mic; 2.75s Finish; 3.50s release raw transcript; 3.65s open B; 4.95s open A; 11.55s release late cleanup. **After steps:** 0.49s mic; 2.71s Finish; 3.39s release raw transcript; 3.56s open B; 4.84s open A; 12.94s click button:has-text("Skip"); 16.12s release late cleanup. Before: [F04a-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/db1cd0737be79f6f/F04a-1440-light-before.mp4) | After: [F04a-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/455d266715f5929f/F04a-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F04a-A-result-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b7669709a92ea542/F04a-A-result-1440-light-Before.png)<br>[4c361199f4][b] | ![F04a-A-result-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2b00dce46fbdda4/F04a-A-result-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F04a-A-result-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae0112a9e2f987f0/F04a-A-result-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F04a-A-result-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79567cbcd1c3fb2f/F04a-A-result-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F06a · 1440×1000 light · result

Record server A, unmount through a new local draft B, attempt B mic/Escape, release, and return to A. After preserves the source transcript and blocks the other draft while finishing. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.49s mic; 2.74s new draft; 3.87s type unrelated draft; 4.34s mic; 5.07s press Escape; 8.02s release while detached; 8.14s open A. **After steps:** 0.49s mic; 2.79s new draft; 3.94s type unrelated draft; 4.45s mic; 5.06s press Escape; 7.98s release while detached; 8.12s open A. Before: [F06a-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d63e10319334bcfe/F06a-1440-light-before.mp4) | After: [F06a-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e01947465cfc09b/F06a-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F06a-result-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/feb8c897851b331b/F06a-result-1440-light-Before.png)<br>[4c361199f4][b] | ![F06a-result-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c60979799acbf74/F06a-result-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F06a-result-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3955aa4cc34b5cea/F06a-result-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F06a-result-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f8e79cde8f2c9fbf/F06a-result-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F06b · 1440×1000 light · result

Record local draft A, navigate to server B, release, and use Back to return. After inserts into the original local draft. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.76s open B; 4.18s release while detached. **After steps:** 0.47s mic; 2.75s open B; 4.24s release while detached. Before: [F06b-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74719175ee18ee23/F06b-1440-light-before.mp4) | After: [F06b-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86a520efee464124/F06b-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F06b-result-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d40055bbe63f6245/F06b-result-1440-light-Before.png)<br>[4c361199f4][b] | ![F06b-result-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/04388b47a83577a7/F06b-result-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F06b-result-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ee11ed64b6cb730/F06b-result-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F06b-result-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06a6cee974be2bf2/F06b-result-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F06c / F06d · 1440×1000 light · returned-finishing

Record local draft A, unmount through a second local draft, attempt its mic/Escape, Back while finishing, queue Send, then release. After sends prefix+transcript once; before sends the prefix alone. This is the F06d finishing/mic/Send proof. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.76s new draft; 3.97s type unrelated draft; 4.42s mic; 5.21s press Escape; 8.03s Back to A while finishing; 11.11s Send; 17.60s release transcription. **After steps:** 0.49s mic; 2.89s new draft; 4.31s type unrelated draft; 4.80s mic; 5.38s press Escape; 8.33s Back to A while finishing; 11.40s Send; 14.61s release transcription. Before: [F06c-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/45091f7f9f13c4d4/F06c-1440-light-before.mp4) | After: [F06c-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/45f25d7965c1ee31/F06c-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F06c-returned-finishing-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41a4215f54e2dab1/F06c-returned-finishing-1440-light-Before.png)<br>[4c361199f4][b] | ![F06c-returned-finishing-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b23a7c9aa2708b59/F06c-returned-finishing-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F06c-returned-finishing-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08bfb70dd94b6d3d/F06c-returned-finishing-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F06c-returned-finishing-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/afe1ce462c1d4c4e/F06c-returned-finishing-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F09 · 1440×1000 light · B-error

Record A, leave for B, release HTTP failure, then start and cancel a new recording in B before returning to A. After shows the detached error and the fresh recording proves the slot is free. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.77s open B; 4.06s release transcription error; 6.70s mic; 11.76s Cancel; 12.45s open A. **After steps:** 0.47s mic; 2.73s open B; 4.07s release transcription error; 6.74s mic; 11.94s Cancel; 12.62s open A. Before: [F09-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4eb69e329d08ab93/F09-1440-light-before.mp4) | After: [F09-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3aafc378a80708d7/F09-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F09-B-error-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/714b4dafc128ccd5/F09-B-error-1440-light-Before.png)<br>[4c361199f4][b] | ![F09-B-error-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/217fc4096a434990/F09-B-error-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F09-B-error-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5bd6e3c687937713/F09-B-error-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F09-B-error-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/58cab6917932fd0f/F09-B-error-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F11 · 1440×1000 light · B-error

Record A, leave for B, change A to `Fix it now`, release the old transcript, then revisit A. After reports the stale draft and preserves the changed text. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.83s open B; 4.28s release stale transcript; 7.03s open A. **After steps:** 0.49s mic; 2.87s open B; 4.32s release stale transcript; 7.22s open A. Before: [F11-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/30dbbbf7b7ca8acb/F11-1440-light-before.mp4) | After: [F11-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82f3091cbd225d4e/F11-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F11-B-error-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b1f6c716f9ee7c75/F11-B-error-1440-light-Before.png)<br>[4c361199f4][b] | ![F11-B-error-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f06f02d80388ec57/F11-B-error-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F11-B-error-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a9d8b797dd1a71e/F11-B-error-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F11-B-error-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/003947464c262486/F11-B-error-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F13 · 1440×1000 light · consent-error-held

Record A, unmount via a new local draft, open Settings → Voice, choose Off while the source response is held, restore the destination, close Settings and start a fresh recording before releasing the old response. The after request aborts and the toast appears on Off; the slot is free, and the late response writes nothing. Before discards on the first switch and never issues the source request. All four viewport/theme variants and additional checkpoints are in the sheet. **Before steps:** 0.48s mic; 2.82s new draft; 4.20s type unrelated draft; 4.73s Settings; 5.63s open Voice settings; 5.93s destination picker; 6.88s Off; 7.81s Off; source already discarded; 10.63s destination picker; 11.39s restore destination; 12.49s destination restored; no source response on main; 12.53s close Settings; 13.37s mic; 21.20s Cancel; 21.90s release attempt (no source request on main); 22.01s open A. **After steps:** 0.48s mic; 2.85s new draft; 4.16s type unrelated draft; 4.67s Settings; 5.54s open Voice settings; 5.83s destination picker; 7.03s Off; 8.02s voice Off; old response still held; 10.79s destination picker; 11.50s restore destination; 12.72s voice destination restored with old response held; 12.75s close Settings; 13.53s mic; 21.41s Cancel; 22.10s release old response only now; 22.20s open A. Before: [F13-1440-light-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/427babd1e077ad57/F13-1440-light-before.mp4) | After: [F13-1440-light-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e8710d83ad456191/F13-1440-light-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F13-consent-error-held-1440-light-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2f5554e1a229d93d/F13-consent-error-held-1440-light-Before.png)<br>[4c361199f4][b] | ![F13-consent-error-held-1440-light-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/631d9ab5fc2dddc6/F13-consent-error-held-1440-light-After.png)<br>[a1d7a2f67a][a] | ![F13-consent-error-held-1440-light-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03f5700464fc68da/F13-consent-error-held-1440-light-Diff0.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] | ![F13-consent-error-held-1440-light-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d039cdf73eb41a55/F13-consent-error-held-1440-light-Diff8.png)<br>[4c361199f4][b] → [a1d7a2f67a][a] |

## F03-finish-first · 1440×1000 light · carried [099303beac][c]

**Before steps:** 0.55s mic; 2.33s Finish; 2.69s sidebar B; 3.38s release explicitly finished transcription; 3.45s sidebar A. **After steps:** 0.55s mic; 2.40s Finish; 2.77s sidebar B; 3.68s release explicitly finished transcription; 3.74s sidebar A. **Before:** [F03-finish-first-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/74846449b938c79a/F03-finish-first-before.mp4)   **After:** [F03-finish-first-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6507adc1136eb4ff/F03-finish-first-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F03-finish-first-A-result-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4845bd99587192c/F03-finish-first-A-result-Before.png)<br>[4c361199f4][b] | ![F03-finish-first-A-result-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4fa11bb9eae5729f/F03-finish-first-A-result-After.png)<br>[099303beac][c] | ![F03-finish-first-A-result-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9649c2c2138cb56/F03-finish-first-A-result-Diff0.png)<br>[4c361199f4][b] → [099303beac][c] | ![F03-finish-first-A-result-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f157fc25c0e718cd/F03-finish-first-A-result-Diff8.png)<br>[4c361199f4][b] → [099303beac][c] |

## F05-cleanup-failure · 1440×1000 light · carried [099303beac][c]

**Before steps:** 0.54s mic; 2.32s Finish; 2.64s release raw transcript for cleanup; 2.78s sidebar B; 3.29s fail cleanup while detached; 5.58s sidebar A. **After steps:** 0.55s mic; 2.37s Finish; 2.67s release raw transcript for cleanup; 2.77s sidebar B; 3.23s fail cleanup while detached; 5.52s sidebar A. **Before:** [F05-cleanup-failure-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/527d3ba44d3ec9c0/F05-cleanup-failure-before.mp4)   **After:** [F05-cleanup-failure-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0be12790a7ee8648/F05-cleanup-failure-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F05-cleanup-failure-B-warning-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d2bab383e8b404ca/F05-cleanup-failure-B-warning-Before.png)<br>[4c361199f4][b] | ![F05-cleanup-failure-B-warning-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/215054d314252051/F05-cleanup-failure-B-warning-After.png)<br>[099303beac][c] | ![F05-cleanup-failure-B-warning-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/63d5041ca5f230cf/F05-cleanup-failure-B-warning-Diff0.png)<br>[4c361199f4][b] → [099303beac][c] | ![F05-cleanup-failure-B-warning-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5bff0f78280383c3/F05-cleanup-failure-B-warning-Diff8.png)<br>[4c361199f4][b] → [099303beac][c] |

## F12-no-speech · 1440×1000 light · carried [099303beac][c]

**Before steps:** 0.59s mic; 2.42s sidebar B; 2.88s release result while detached; 5.48s sidebar A. **After steps:** 0.54s mic; 2.33s sidebar B; 2.83s release result while detached; 5.50s sidebar A. **Before:** [F12-no-speech-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1abef290535402ad/F12-no-speech-before.mp4)   **After:** [F12-no-speech-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b7a8d962abef72c7/F12-no-speech-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F12-no-speech-B-error-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6e83cc871cf1da71/F12-no-speech-B-error-Before.png)<br>[4c361199f4][b] | ![F12-no-speech-B-error-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7f0fb9eab37ea3c/F12-no-speech-B-error-After.png)<br>[099303beac][c] | ![F12-no-speech-B-error-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c74d89c248333480/F12-no-speech-B-error-Diff0.png)<br>[4c361199f4][b] → [099303beac][c] | ![F12-no-speech-B-error-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b2ec059e1135f760/F12-no-speech-B-error-Diff8.png)<br>[4c361199f4][b] → [099303beac][c] |

## F14-cleanup-off · 1440×1000 light · carried [099303beac][c]

**Before steps:** 0.59s mic; 2.50s New thread; 3.19s type fixture text; 3.32s keyed remount to new local draft; 3.34s revoke F14 consent after keyed unmount; 3.41s release old transcription; 6.13s sidebar A. **After steps:** 0.56s mic; 2.45s New thread; 3.16s type fixture text; 3.39s keyed remount to new local draft; 3.46s revoke F14 consent after keyed unmount; 3.55s release old transcription; 6.09s sidebar A. **Before:** [F14-cleanup-off-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eba5cc15afe838b8/F14-cleanup-off-before.mp4)   **After:** [F14-cleanup-off-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b3108a7cf36be4b9/F14-cleanup-off-after.mp4)

| Before | After | Diff0 | Diff8 |
|---|---|---|---|
| ![F14-cleanup-off-result-Before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/355af40a061235d4/F14-cleanup-off-result-Before.png)<br>[4c361199f4][b] | ![F14-cleanup-off-result-After.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7f9f554489047fa3/F14-cleanup-off-result-After.png)<br>[099303beac][c] | ![F14-cleanup-off-result-Diff0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cac092ebf33e6064/F14-cleanup-off-result-Diff0.png)<br>[4c361199f4][b] → [099303beac][c] | ![F14-cleanup-off-result-Diff8.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1d1fe35776ec197/F14-cleanup-off-result-Diff8.png)<br>[4c361199f4][b] → [099303beac][c] |

## F02 / F06d · existing keyboard behavior

Typing into the finishing editor is a pre-existing composer bug on main, shown here; not changed by this PR. The focused-region Enter failure is also pre-existing. Both apply to F02 and F06d; this round does not recapture them. [Keyboard comparison report](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/39afd6ae88bc050d/report.md); [before typing](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8b95718a32f0ba6e/before-x.mp4), [after typing](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b3a4261602623915/after-x.mp4), [before Enter](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87a8bee48471ef6a/before-Enter.mp4), [after Enter](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07f18f51fa25fa37/after-Enter.mp4).

## What else changed

- F01: info notice in B; source transcript in A; B edit remains intact. The wide-light final A pair also has three sub-threshold mic raster pixels; the other three variants differ only in transcript pixels. Mic/shortcut attempts and Escape run in B, then its fresh mic starts after completion.
- F02/F06d: finishing/Cancel/Send controls; after Send waits. Completed Send changes the user bubble, Replay completion, empty-state content, header/sidebar title and corresponding wrapping/geometry. F06c before sends the prefix; after sends prefix+transcript. Replay completion durations and the frozen-clock “Working for…” label use real server event times and may differ. At 390px the finishing toolbar compresses model/permission labels into compact ellipsis controls.
- F04a: Post-processing/Skip returns after navigation; Skip commits raw text and ignores late cleanup. The wide-light final pair has 1,509 transcript pixels plus three sub-threshold mic raster pixels; each other variant has 1,509 transcript pixels.
- F06a/b/c: local-draft sidebar titles change when their own prompt receives the transcript or promotes on Send. Fixture checkout labels now match on both sides.
- F09/F11/F13: the after error toast adds its reason, icon, close/copy controls, shadow and underlying occlusion. F09/F13 then show a fresh recording while A remains unchanged. The exact idle-A zero/nonzero counts are in the checkpoint sheet.
- Retained F03/F05/F12/F14 preserve their delivered observations. F05 has the already disclosed three low-channel-delta mic pixels; F14 commits raw transcription without cleanup or a fatal consent toast. These older rows use the original `server` fixture rather than the new `Voice evidence` project, within matched pairs.

## Scripts

Rebuild order: `setup.sh` per side; pair an owned Browser tab; evaluate `driver.js`; run `seed-runner.js` once; evaluate `rpc-seed.js`, then `prepare.js`; call `runner.js` with `{tabId,side,row}` for wide recordings, F02 `{width:390,height:844,theme:"dark"}`, or `{matrix:true,record:false}` for all four still variants. The runner reseeds A/B on each run. Python needs Pillow/numpy; measurement also uses ImageMagick and ffmpeg.

[driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ae517d6778ef5faa/driver.js) · [prepare.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/496d7f48c26a382b/prepare.js) · [runner.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/425f6064e492d327/runner.js) · [seed-runner.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/45a9a7637cfb2976/seed-runner.js) · [rpc-seed.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d67c7b3dbb0469c6/rpc-seed.js) · [setup.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ee0ca1ad4311693d/setup.sh) · [build.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/18af3d084e1f47e5/build.py) · [rebuild-videos.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7b771582d2f6dacb/rebuild-videos.py) · [upload.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d804ccbf98dd08e/upload.py) · [write-pages.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5c1854a6e7e695a/write-pages.py) · [manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b1fd4ad2bd216745/manifest.json) · 

Original seed/driver links for carried rows are in the checkpoint sheet and preserved [first index](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6eeb9b6e5716257f/evidence.md).

## Uncaptured rows and limits

| Row / gap | Reason and exact source coverage (source inspected; no fresh test run claimed) |
|---|---|
| F00 | Idle A is in the first F01 frames; no standalone baseline still/diff table. |
| F03/F05/F12/F14 themes | Preserved as delivered at 1440×1000 light; additional variants were not requested for these valid rows. |
| F04b | No two-environment runtime. Hook test “cleans a detached transcript on its own draft's environment”. Benign connection/cloud-model changes were not exercised here. |
| F07 | No detached-promotion runtime. Store test “marks a draft promoting when its reserved thread arrives, then finalizes into it”. |
| F08 | No multiline attachment/busy layout fixture. Controller test “replaces the recorded UTF-16 selection around emoji and composer tokens” covers selection only. |
| F10 | No detach/return/error/Retry runtime. Hook test “retries a failed transcription on the same chosen environment” covers ordinary retry. |
| F15 | No disabled-owner or separate live-settings sequence. Hook tests “still abandons a detachable recording when the destination changes”, “abandons an in-progress recording when consent is %s”, “does not fall back to another environment when the chosen one %s”. F13 adds detached Settings Off proof only. |
| F16 | Question opt-out UI not captured; no exact direct question test located in the hook file. |
| F17 | Other editors/Electron annotations not captured. Controller “queues the next recording after %s until transcription and audio cleanup settle” is not a real-editor integration proof. |
| F18 | No Preparing/navigation runtime. Controller “does not start the microphone for an owner that changed during preparation”. |
| F19 | Idle navigation is in F01; no attached-error owner-switch runtime. Controller “clears %s errors when switching to another draft”. |
| F20 | Null draft access is a hook-only edge, not captured or substituted by F11. |
| F21 | Batch fixture does not exercise streaming/live preview; no exact integration substitute claimed. |
| F22/F23 | No Electron/native mobile/remote relay/tunnel or physical microphone permission proof. |

Hook tests named above are in [useEnvironmentSpeechInput.browser.test.tsx](https://git.cafe/pingdotgg/t3code/blob/a1d7a2f67a6f984d8dbc35196774c7f45535c2d8/apps/web/src/speech/useEnvironmentSpeechInput.browser.test.tsx). F13’s exact new test is “cancels a detached transcription at once when the voice destination changes after the editor %s” (unmount/move). No test suite or PR check/review status was assessed in this capture round.

Owned servers and Browser tabs are stopped; the temporary before checkout is removed. Scratch is retained for the lead. AI-assisted; verified with the tests and tools listed above.

[b]: https://git.cafe/pingdotgg/t3code/commit/4c361199f47f6ea32a2c14835df392640d0f7c63
[a]: https://git.cafe/pingdotgg/t3code/commit/a1d7a2f67a6f984d8dbc35196774c7f45535c2d8
[c]: https://git.cafe/pingdotgg/t3code/commit/099303beac5367bc7244f7d223e268904b05cc61
