# Background continuation evidence

[#33194](https://git.cafe/pingdotgg/t3code/pull/33194) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/33194)). Before [bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9); after [61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13).

Beyond Task-card preservation, this evidence also shows request-only and approval-only wakes, approval resolution without subsequent output, and a foreground tool keeping a continuation open. Incidental rendering differences are listed below.

**Captured: 6 / 6 in-scope rows, 12 recordings, 4 Task-card crops. G1 remains unverified.**

**Environment (all recordings and crops):** T3 Preview browser, Chrome 157 / Linux x86_64, no device emulation; 1280 × 900 CSS px, DPR 2 (2560 × 1800 video), root font 16 px, visual viewport scale 1, dark theme, side panels hidden, top of thread. Synthetic ACP fixture through the real app/server; isolated per-checkout databases, T3CODE_DEV_SEED=0; no live-user database seed.

The fixture installs a browser Date hook for 2026-11-10 11:30 UTC after the initial run and again on reload. Server-authored message times and measured run durations are not frozen and differ between sides. Initial data and synthetic prompts are equivalent; each side uses its own migration-compatible database. This is web evidence for a server change; desktop and mobile were not separately captured here.

Each pair exercises the same synthetic protocol sequence. On the before side, absent requests cannot be answered or approved; that is the failure demonstrated. Times below are seconds from each video's start, and are review checkpoints rather than a voice track. The original final R7-after timestamp extended slightly beyond the recording; the usable frame is at 25.18 s.

## R2 — Sparse Task completion after settle

Before: 1.97 s expand original Task/input; 8.46 s late completion has been sent and the quiet window passed, but launch output remains; 9.28 s collapse (label Task); reload, then 21.78–22.09 s expand, original input remains and late result is absent. After: 1.95 s original Task/input; 8.43 s late result is visible; 9.19 s collapsed label remains Task; reload, then 19.25–19.57 s expanded input and new result persist.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R2-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77c487e2264888d9/R2-before.mp4) | [R2-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3e1f499898db8547/R2-after.mp4) |
| Original Task/input survive; result stays “Task launched in background”. | Task and original input survive; result becomes “inspection complete, exited with code 0.” and survives reload. |

Expanded Task card(s) after reload, cropped from the selected videos:

| Before | After |
| --- | --- |
| ![R2 before: expanded Task input and stale launch result after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72b1fcdb481fa123/R2-before-task-crop.png) | ![R2 after: expanded Task input and completed result after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/baed249741b5ee10/R2-after-task-crop.png) |

Before crop: 20.838 s; decoded crop pixels match the frame 500 ms earlier exactly. After crop: 18.325 s; decoded crop pixels match the frame 500 ms earlier exactly. 

## R7 — Two Tasks, completion in separate continuation runs

Before: 1.98 s two original Tasks/own inputs; 8.40 s task-1 completion sent; 14.81 s task-2 completion sent after the first quiet gap; 15.57 s both collapsed labels are Task; reload, then 25.12–25.39 s both original inputs remain, late results absent. After: 1.94 s two original Tasks/own inputs; 8.37 s task-1 result complete and task-2 launch retained; 14.80 s task-2 complete; 15.55 s both collapsed labels Task; reload, then 25.18 s both own inputs and completed results persist. Persisted synthetic events also show runs 2 and 3 complete separately, with run 2 completed before run 3 starts.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R7-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a55e850df83ea7a2/R7-before.mp4) | [R7-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/943ad6e5d8cb8ded/R7-after.mp4) |
| Two Task cards retain original inputs and stale launch outputs. | Each Task retains its own input and receives its own completion result across runs 2 and 3; both persist after reload. |

Expanded Task card(s) after reload, cropped from the selected videos:

| Before | After |
| --- | --- |
| ![R7 before: expanded Task input and stale launch result after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/760ce6e6e30e4d06/R7-before-task-crop.png) | ![R7 after: expanded Task input and completed result after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6174adb0797b271b/R7-after-task-crop.png) |

Before crop: 24.135 s; decoded crop pixels match the frame 500 ms earlier exactly. After crop: 23.929 s; decoded crop pixels match the frame 500 ms earlier exactly. 

## R9 — Request-only wake

Before: 0.10 s initial run settled; question-only wake is sent immediately afterward; 4.96–5.62 s no question or continuation appears. After: 0.10 s initial run settled; within the first second a question-only wake opens the continuation (no prior wake text); 5.26–5.46 s question remains answerable with Stop visible after more than 3 s; at about 15.9 s submit the selected a.ts answer; 20.08–20.54 s answer is recorded, composer is available and Stop is gone. The fake agent sends no subsequent ACP output after the answer.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R9-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8eb6951042f03125/R9-before.mp4) | [R9-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6362bc5eed431964/R9-after.mp4) |
| Question-only wake is dropped; no answerable question. | Question remains answerable beyond 3 s; answering alone lets the continuation settle. |

## R10 — Approval during an active continuation

Before: 0.10 s initial run settled in approval-required mode; wake text followed by permission request is sent; 4.89–5.12 s both are absent. After: 0.10 s initial run settled; wake text opens a continuation, then an execute permission request follows; 20.03–20.23 s approval remains visible, held much longer than 3 s with Stop visible; at about 31.2 s click Approve; 35.60–36.14 s approval has resolved, Stop is gone and run is settled. No subsequent ACP output is sent.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R10-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/de1cbeee69d82df2/R10-before.mp4) | [R10-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77fd15a74d3904e5/R10-after.mp4) |
| Wake text and approval are dropped. | Approval stays actionable during the continuation and approval alone allows settlement. |

## R11 — Approval-only wake

Before: 0.10 s initial run settled; execute permission request is the next provider frame; 4.98–5.48 s no continuation or approval appears. After: 0.10 s initial run settled; execute permission request alone opens a continuation; 5.28–5.48 s approval is still visible and Stop remains; at about 5.5 s click Approve after the hold; 9.96–10.66 s approval has cleared, Stop is gone and the run is settled without later output.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R11-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ba4a8de662eb7a4/R11-before.mp4) | [R11-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fefafb43efda3bee/R11-after.mp4) |
| Approval-only wake is dropped. | Approval-only wake opens a continuation, offers approval and settles after approval. |

## R12 — Foreground Execute remains in progress beyond quiet window

Before: 0.10 s initial run settled; wake text and Execute in_progress are sent; 4.90–5.10 s continuation is absent; 9.53–9.79 s Execute completion has been sent but there is still no continuation. After: 0.10 s initial run settled; wake text and Execute in_progress follow; 8.60–8.80 s Running echo and Stop remain after more than 5 s; at about 9.4 s release the completion gate; 16.10–16.79 s completed command is visible and Stop is gone.

Environment: same as above.

| Before ([bcee0f5](https://github.com/pingdotgg/t3code/commit/bcee0f5d2872ba193c66ed9ba979bbe424f89ff9)) | After ([61184e5](https://github.com/pingdotgg/t3code/commit/61184e56fef2c92ec8c06f02a2e8cbe5f0081b13)) |
| --- | --- |
| [R12-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5639a192a50dc46f/R12-before.mp4) | [R12-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/198e2f728fc39a4b/R12-after.mp4) |
| Wake and foreground tool are dropped. | Foreground tool keeps the continuation open beyond the quiet window; completion allows settlement. |

## What else changed

- After captures add “Background activity updated”: once for R2 and R9–R12, twice for R7. Before captures keep only the original reply.
- R7's “Used 2 tools” group heading is present before and absent after the late updates; Task cards sit directly under the run afterward, shifting content upward. Both Task titles remain.
- “Worked for” durations change as continuation work is accounted for; transient “Working for 0s” becomes a completed duration. Server message times also differ between recordings, despite the browser Date hook.
- In R9–R11, the synthetic selector reads “Fixture” before and the synthetic placeholder “fixture-safe” after. This is fixture metadata, not a real runtime model identifier. R2, R7 and R12 show “Fixture” on both sides.
- R9 adds the input-request card and question form, then an answered-question row displaying “option_0” after choosing a.ts. Composer placeholder and Submit/Stop controls change while the request is pending.
- R10 and R11 add command approval controls and the redirect placeholder while approval is pending, then restore the normal composer. R10 also retains the wake-text reply. Approval controls disappear once resolved.
- R12 adds the foreground Running echo tool, which changes to the completed echo synthetic-done command. In the after recording, expanding the run also exposes the original Task card; before it stays collapsed with the original run.
- The videos have different lengths because the before side has no question or approval to interact with. Expansion, collapse, reload, syntax-highlight settling and pointer movements occur within the recordings; these are capture interactions, not additional product changes.

## Selection, privacy and limits

All twelve selected videos were opened via ffmpeg-extracted frames and visually reviewed at the narrated checkpoints and final states. The latest complete R2 and R7 attempts were selected; older attempts containing “Syncing messages...” at the reload claim were excluded. No selected claim frame has a loading skeleton, stale dialog or clipped claim text. In-progress indicators in R9–R12 show the state under test, and disappear on settlement.

The four stills are crops from existing recordings, not new browser screenshots. Each crop was compared with a decoded frame 500 ms earlier and was pixel-identical. The original browser driver awaits fonts. A network-idle trace was not retained, so network-idle cannot be independently attested from this handoff; the selected crop regions are visually settled.

Scripts were read and checked before publication: synthetic task names, paths, prompts, requests and outputs only; no embedded credential values, live-user data or private runtime model identifiers. Auth scripts issue local ephemeral sessions at execution time; token values and runtime logs are not uploaded. The placeholder fixture-safe is synthetic. Recordings show only the synthetic fixture threads.

G1 is **unverified**: covered by GrokAdapter/AcpAdapterV2 tests; no deterministic Grok fixture recording. The handed-off G1-after attempt directory contains no media or metadata. Grok fixture scripts are included for reproducibility but do not constitute verified visual evidence. No Grok claim is made from this attempt.

## Scripts

- [rpc-grok-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8ce22a636780ac5a/rpc-grok-driver.mjs)
- [fake-droid.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1a6f4cdd8fd1f8d1/fake-droid.cjs)
- [export-runtime.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6cd98576cbf716a9/export-runtime.py)
- [review-videos.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8cabfe8bfd04058c/review-videos.py)
- [rpc-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2bd5c1692cf8f716/rpc-driver.mjs)
- [browser-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab90e04614169cb1/browser-driver.js)
- [preview-reload.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/33cb6b06f048c7e8/preview-reload.js)
- [preview-task-flow.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8427803318f83faa/preview-task-flow.js)
- [fake-grok.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4a526935f868ebbb/fake-grok.cjs)
- [preview-capture-helpers.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a8d96525155e2893/preview-capture-helpers.js)
- [preview-expand.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4030d324f98b82c2/preview-expand.js)
- [review-selected.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8381519019518161/review-selected.py)

- [write-sheet.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7cdb7b675a8ee2f4/write-sheet.py)

## Cleanup

The before worktree was removed. No listener with cwd under /home/user/wt/pr-33194* remained in ss -H -ltnp; the unrelated server on port 3773 (cwd /home/user) was left untouched. This finish step started no servers or browser tabs. Evidence remains in private scratch after upload; no tracked application files were edited.

AI-assisted; verified with the tests and tools listed above.
