# Evidence index — queued edit persistence

PR [#23990](https://github.com/pingdotgg/t3code/pull/23990), issue [#23960](https://github.com/pingdotgg/t3code/issues/23960).

BEFORE [27e0c684](https://github.com/pingdotgg/t3code/commit/27e0c684c585f955252d65f06206dd11a143bff5), current main. AFTER [7231fb35](https://github.com/pingdotgg/t3code/commit/7231fb35535d0ea3a14cd52b1079027f4153d777), integrated final head. Old807319c baseline was discarded; no artifact here uses it.

## Coverage and limits

2/7 rows have core recordings in all four variants: 8/28 AFTER cells recorded, plus5BEFORE recordings (R1all4 andR2W-L). This is partial matrix evidence, not28/28 completion. R1 recordings prove navigation+actual reload retention, UI save, ordinary draft restoration, and immediate reopening of saved Q1. The extra post-save away/back substep remains UNVERIFIED in the final four R1 clips. R2 recordings prove blank/no-chip retention, disabled submit, cancel restoration and original Q1 reopening. Caret visibility was suppressed for stable stills and is UNVERIFIED.

| Row | W-L1440×900 | W-D1440×900 | N-L390×844 | N-D390×844 |
|---|---|---|---|---|
| R1 | core captured; post-save extra trip unverified | same | same | same |
| R2 | captured | captured | captured | captured |
| R3 attachment-only keyboard save | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget |
| R4 per-run isolation/latest binding | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget |
| R5 save failure/retry | UNVERIFIED not induced | UNVERIFIED not induced | UNVERIFIED not induced | UNVERIFIED not induced |
| R6 queue exit/empty ordinary draft | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget |
| R7 queue exit/occupied ordinary draft | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget | UNVERIFIED budget |

Windows/Electron shell, native React Native, remote/relay/tunnel and other providers UNVERIFIED. Responsive390 is web. No new implementation tests run in this evidence task; lead reported78passing tests independently. Four diff0 sheets captured after primary recordings; all four initial cropped BEFORE/AFTER comparisons are pixel-identical (absolute RGB difference empty). Each of eight initial stills has an identical second crop500ms later. These are fresh reset/original states, not frames extracted from recordings. Four diffT sheets compare settled post-navigation BEFORE with post-navigation+reload AFTER.

## Real runtime and fixture

Linux x86_64 Chrome154.0.0.0, T3 preview browser, default profile, owned separate tabs. CSS1440×900 or390×844, devicePixelRatio2, light/dark explicit. Wide snapshot tool scales to1280×800; narrow snapshot780×1688. Fonts loaded; stills disable transitions/animations/caret. Server AFTER8228/16268 belongs to lead; BEFORE7905/15945 is own isolated --no-seed runtime. No implementation edits or shared checkout changes.

All queue state was seeded through real command RPC and real attachment upload POST; no projection fixture/mocked command. Q1/Q2 are genuine server queued runs, held so no provider executes. Deferred hold was cancelled on restart; this differs from lead’s earlier live Codex sleep300 reproduction, which is not included here. The actual UI save mutates queued Q1; server-proof.json records same run/message IDs, queue positions1/2, UpdatedQ1 with onlykeep.png and unchangedQ2. Thus backend mutation proof covers UI update of real queued content, not provider execution or lifecycle recovery.

Fixture: Original Q1 + keep.png + remove.pdf; Original Q2; ordinary Separate draft D. Innocuous synthetic assets. AFTER has extra EvidenceA2 and lead stopped thread in sidebar; BEFORE uses renamed startup project. Full frames consequently differ in sidebar and relative clocks. Crop comparisons exclude those differences; no full-frame pixel-match claim. Clock was not frozen; no timestamps appear in accepted crop. Identical500ms-apart crop frames verified for19still pairs (11post-navigation,8initial). AFTERW-L full screenshot had1px-wide sidebar-edge drift; full frame rejected as stable, crop accepted. R2W-L is video only.

## Timing / narration

Each video starts with original queue, opens Q1, edits text/removes attachment(s), switches projectB thenA, and reopens. AFTER then performs real location.reload and reopens. R1 ends with save, D, reopening savedQ1; R2 ends with cancel, D, reopening originalQ1. Reload splash is transient continuity; final accepted frames are settled. `navigationAt` and `finalAt` are elapsed seconds from recording start; createdAt is capture completion UTC from native tool.

| Clip | Completion UTC | Navigation s | Settled proof s | Duration s |
|---|---|---:|---:|---:|
| before-R1-W-L | 2026-10-24T11:01:10.019Z | 9.168 | 11.083 | 13.322 |
| after-R1-W-L | 2026-10-24T11:00:54.397Z | 9.529 | 18.563 | 24.445 |
| after-R2-W-L | 2026-10-24T10:55:08.307Z | manual clip | manual clip | see video |
| before-R1-W-D | 2026-10-24T10:59:53.912Z | 9.006 | 10.851 | 13.109 |
| after-R1-W-D | 2026-10-24T10:59:38.079Z | 9.271 | 18.371 | 23.766 |
| after-R2-W-D | 2026-10-24T11:00:27.641Z | 12.147 | 22.283 | 27.47 |
| before-R1-N-L | 2026-10-24T10:57:16.434Z | 12.168 | 13.726 | 15.939 |
| after-R1-N-L | 2026-10-24T10:56:58.085Z | 13.172 | 22.585 | 27.52 |
| after-R2-N-L | 2026-10-24T10:57:51.022Z | 14.349 | 24.219 | 28.903 |
| before-R1-N-D | 2026-10-24T10:58:38.269Z | 11.762 | 13.354 | 15.571 |
| after-R1-N-D | 2026-10-24T10:58:20.508Z | 11.855 | 21.341 | 27.247 |
| after-R2-N-D | 2026-10-24T10:59:11.248Z | 14.192 | 23.382 | 28.043 |
| before-R2-W-L | 2026-10-24T10:54:44.420Z | manual clip | manual clip | see video |

## Changed paths

- apps/web/src/components/chat/queuedMessageEdit.ts
- apps/web/src/components/chat/useQueuedRunEdit.ts
- apps/web/src/components/chat/useQueuedRunEdit.browser.test.tsx
- apps/web/src/composerDraftStore.ts

No server/contracts/provider/markup changes in final range. Shared web state is the relevant surface; no native equivalence claim.

## FRICTION / rejected takes

Initial empty preview_type did not erase contenteditable; rejected and repeated with Control+A/Backspace. Narrow reload collapses composer; driver explicitly expands. Early final holds too short; replaced clips with2sec settled hold. Pairing cookie needed per-origin setup; secrets excluded. Auto migration seed had failed before task, so used own safe synthetic real-server fixture. No save-failure reconstruction consumed capture budget. Every final recording contact sheet and every accepted crop/diff was opened visually; black unused contact-sheet tiles are sheet padding, not app frames.

## Artifacts

See reproduce.md, seed.js, driver.json, manifest.json and server-proof.json. Raw full screenshots remain working material; accepted cropped proof and contact sheets are listed below. Upload URLs follow.

[after-R1-N-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08266f43d77708d2/after-R1-N-D.mp4)
[after-R1-N-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/994e43ad1dfe1e01/after-R1-N-L.mp4)
[after-R1-W-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d3fe4f383efbaf5d/after-R1-W-D.mp4)
[after-R1-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b60104e04e761bac/after-R1-W-L.mp4)
[after-R2-N-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/339191d680fceca9/after-R2-N-D.mp4)
[after-R2-N-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2f1455ce17a9e7ab/after-R2-N-L.mp4)
[after-R2-W-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/84dfd80d081ba74a/after-R2-W-D.mp4)
[after-R2-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff921396696f5a45/after-R2-W-L.mp4)
[before-R1-N-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7605bc1d1acb7e08/before-R1-N-D.mp4)
[before-R1-N-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62b92eb44f83e134/before-R1-N-L.mp4)
[before-R1-W-D.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0bcc9425241f2d5/before-R1-W-D.mp4)
[before-R1-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1f4758e3c750f20d/before-R1-W-L.mp4)
[before-R2-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/348395d3ff11e2f8/before-R2-W-L.mp4)
![after-R1-N-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03027f2fe1dd0e80/after-R1-N-D-cropT.png)
![after-R1-N-L-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/efb2742f37d99d04/after-R1-N-L-cropT.png)
![after-R1-W-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f24ace18865f3d11/after-R1-W-D-cropT.png)
![after-R1-W-L-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec7905dc9c48b511/after-R1-W-L-cropT.png)
![after-R2-N-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a40eddd7236664a7/after-R2-N-D-cropT.png)
![after-R2-N-L-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0214e1f289ac11ee/after-R2-N-L-cropT.png)
![after-R2-W-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/044008d80e01f1e0/after-R2-W-D-cropT.png)
![before-R1-N-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/894b13f9e58acb27/before-R1-N-D-cropT.png)
![before-R1-N-L-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/952b329194d2c023/before-R1-N-L-cropT.png)
![before-R1-W-D-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f47a851bf01b5cb0/before-R1-W-D-cropT.png)
![before-R1-W-L-cropT.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9e375254375156f/before-R1-W-L-cropT.png)
![diffT-N-D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2a4590753387a08/diffT-N-D.png)
![diffT-N-L.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/80f29b7695c5be8b/diffT-N-L.png)
![diffT-W-D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/069e0568db44871d/diffT-W-D.png)
![diffT-W-L.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0fba40f56a07e126/diffT-W-L.png)
![after-R1-N-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fd114825e5ddb4a2/after-R1-N-D-review.png)
![after-R1-N-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/daef7489cb564223/after-R1-N-L-review.png)
![after-R1-W-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15886446505b8fa9/after-R1-W-D-review.png)
![after-R1-W-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ab71f716f124917/after-R1-W-L-review.png)
![after-R2-N-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77cace5b97600f15/after-R2-N-D-review.png)
![after-R2-N-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1c01e2054ba6fc8/after-R2-N-L-review.png)
![after-R2-W-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c93dbfa44f5326c2/after-R2-W-D-review.png)
![after-R2-W-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8c960d7a4a9d689/after-R2-W-L-review.png)
![before-R1-N-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3100bea4292efef/before-R1-N-D-review.png)
![before-R1-N-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4bc474814d2b8e51/before-R1-N-L-review.png)
![before-R1-W-D-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ed65816c14da555/before-R1-W-D-review.png)
![before-R1-W-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7209d027b6f95b26/before-R1-W-L-review.png)
![before-R2-W-L-review.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3bfb1b9979d0e65f/before-R2-W-L-review.png)

[seed.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1d70c80c1089049/seed.js)
[server-proof.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/871e9db59f2de054/server-proof.json)

[before-R1-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/98ace90e9e9272d9/before-R1-W-L.mp4)
[after-R1-W-L.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/89f3c99e1bb2efdb/after-R1-W-L.mp4)
[driver.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fd9db6d52b9061c4/driver.json)
[manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/36bdeaf86bad8a46/manifest.json)

## Final matched initial captures

![diff0-N-D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9393b660520bede9/diff0-N-D.png)
![diff0-N-L.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f54b2de4ffcd7e44/diff0-N-L.png)
![diff0-W-D.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2d86e5c3d7c76522/diff0-W-D.png)
![diff0-W-L.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e6103acda1e6f28/diff0-W-L.png)
![after-initial-N-D-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d3c76b0d01a8c52/after-initial-N-D-crop0.png)
![after-initial-N-L-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e1ac03b1ccd24a7d/after-initial-N-L-crop0.png)
![after-initial-W-D-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c64f383299bfd176/after-initial-W-D-crop0.png)
![after-initial-W-L-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e93085aa6b3d435d/after-initial-W-L-crop0.png)
![before-initial-N-D-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/70e2940d3aca82c1/before-initial-N-D-crop0.png)
![before-initial-N-L-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d6db7dba27e90433/before-initial-N-L-crop0.png)
![before-initial-W-D-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/01f20d5fe6996451/before-initial-W-D-crop0.png)
![before-initial-W-L-crop0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b249de145cfd149a/before-initial-W-L-crop0.png)

[driver-v2.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f3e0cbe889dc556b/driver-v2.json)
[initial-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86819f9045e48793/initial-manifest.json)

Initial capture driver is in driver-v2.json as captureInitial; it uses the same reset/setup as captureCore, opens original Q1, settles, and takes2frames500ms apart without recording. Crop coordinates and ImageChops method are in reproduce.md. Matrix remains8/28AFTER cells; no additional interaction coverage is inferred from stills.

## Cleanup

2026-10-24T11:07:53Z: own fixture projects evidence-project-a/b deleted through real project commands; own AFTER/BEFORE tabs closed; own retained BEFORE process session71212 stopped with Ctrl-C. Lead runtime8228/16268 untouched. Own temporary BEFORE worktree and scratch removed after successful final uploads. Public artifacts and app-owned recording storage remain; no live T3 files were deleted. No repo edits, commits, pushes, PR comments or merges.
