## Evidence — real T3 app; simulated Factory Droid ACP v1 frames

PR [#33194](https://git.cafe/pingdotgg/t3code/pull/33194), mirrored [#33194](https://github.com/pingdotgg/t3code/pull/33194). Before [4c36119](https://github.com/pingdotgg/t3code/commit/4c361199f47f6ea32a2c14835df392640d0f7c63); after [4e06d31](https://github.com/pingdotgg/t3code/commit/4e06d3193cb7a8ae8a8e4cd3e197af59a8e764a4).

**6/6 required rows captured; no required row missing.** Four new recordings cover this head and the R6 main comparison. The existing B recording remains valid and is reused unchanged. The faithful Task-to-answer gap is **3.805 s**. In both A runs, the tool-only continuation settles and the answer opens another continuation. R6 stays answerable for **29.438 s** in persisted state, accepts the UI selection, delivers the answer in the same continuation, and completes.

Environment: T3 built-in Preview, Chrome 157 on Linux x86_64; no device emulation; 1280×900 CSS pixels, DPR 2 / 2560×1800 video raster, zoom 100%, root font 16px / scaling 100%, dark, showAll, top of conversation. Fonts loaded and network idle before recording. Real checkout app, ACP registry source `factory-droid`, synthetic executable/frames and data; fresh checkout-owned databases from each side's own migrations, `T3CODE_DEV_SEED=0`; no copied userdata or real provider/account. A faithful/gated and R6 main use the earlier browser clock-freezing script; the final R6 head recording uses native Date so activity ages remain accurate. Server timestamps and timers are real throughout. Thus timestamps, sidebar ages and manual timing are not pixel matched.

| Row | Before — 4c36119 | After — 4e06d31 |
|---|---|---|
| R1 waiting / late frames dropped | [B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4) | [A-after-faithful.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87e6eb93ac2cc1eb/A-after-faithful.mp4) |
| R2 late Task / continuation / output reachable | [B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4) | [A-after-gated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c1985bbca65e4458/A-after-gated.mp4) |
| R3 tool-only quiet settlement before answer | [B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4) | [A-after-gated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c1985bbca65e4458/A-after-gated.mp4) |
| R4 usage then answer / another continuation | [B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4) | [A-after-gated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c1985bbca65e4458/A-after-gated.mp4) |
| R5 completed answer survives reload once | [B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4) | [A-after-faithful.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87e6eb93ac2cc1eb/A-after-faithful.mp4) |
| R6 unanswered question survives quiet window, UI answer, completion | [R6-before-main-35s.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8f36467f77e418e/R6-before-main-35s.mp4) | [R6-after-head.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a88068ec3e7996fb/R6-after-head.mp4) |

Recordings are the proof; no still-diff claim. Approximate timestamps below are seconds into the videos; exact frame and persisted-event timestamps are linked below.

**B main, reused:** 0 empty thread; ~3.4 Task/waiting/end_turn; ~23.4 late Task completion; ~26.9 usage; ~27.2 answer sent; work/Task expanded; through 50.9 only waiting/launch output remains. Real T3 app; simulated Factory Droid ACP v1 frames.

[B-before-main.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af071c0bd25595b1/B-before-main.mp4)

**A faithful, new head:** 0 empty thread; ~8.7 Task/waiting/end_turn; ~28.7 late Task and run 2; ~31.9 run 2 complete; ~32.2 usage; ~32.5 answer, opening run 3; ~35.7 run 3 complete. Expanded Tool detail shows completion output around 60 s. Reload around 69 s; one complete answer remains through the 91.3 s recording. Real T3 app; simulated Factory Droid ACP v1 frames.

[A-after-faithful.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87e6eb93ac2cc1eb/A-after-faithful.mp4)

**A gated extension, new head:** ~0.9 Task/waiting/end_turn; ~20.9 late Task/run 2; ~24.0 run 2 complete with answer withheld; completion output expanded before release; ~49.9 usage; ~50.1 answer opens run 3; ~53.3 run 3 complete. Reload around 75 s; one answer remains through 86.7 s. The extra gate is a fixture extension, not reporter-faithful timing. Real T3 app; simulated Factory Droid ACP v1 frames.

[A-after-gated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c1985bbca65e4458/A-after-gated.mp4)

**R6 main:** ~2.2 Task/waiting/end_turn; ~22.2 late Task; ~22.3 question request fails with ACP error -32603; ~22.6 fixture sends answer. Neither question nor answer appears through 35 s; only run 1 persists. This is a 35 s prefix of the raw recording, converted to constant frame rate to retain static periods. Real T3 app; simulated Factory Droid ACP v1 frames.

[R6-before-main-35s.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8f36467f77e418e/R6-before-main-35s.mp4)

**R6 head:** ~1.1 Task/waiting/end_turn, original Task input expanded; ~21.2 late Task opens run 2; ~21.7 question appears. It remains answerable through ~51.3 (includes an explicit 10 s on-camera hold; the full observed hold is about 30 s). Selecting **a.ts** automatically submits through the UI; ~51.6 answer frame; ~52.6 persisted answer; ~54.9 run 2 completes after a renewed quiet window. Reload around 83 s; one complete answer remains with no active badge or Stop button through 109.3 s. Real T3 app; simulated Factory Droid ACP v1 frames.

[R6-after-head.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a88068ec3e7996fb/R6-after-head.mp4)

**What else changed visibly**

- Confirmed on this head: the late update relabels **Task** to **Tool**, removes the original `subagent_type` / prompt input, and shows completion output instead. Persisted item changes from `title: "Task"` / nonempty input to `title: null` / `input: {}`.
- Continuation activity rows, final answer and active/settled composer states appear; faithful/gated have two continuation notices, R6 head one.
- Work durations, message times, sidebar ages/order/counts, thread suffixes and disclosure/cursor timing differ. A gated briefly starts with the thread-details panel open and closes it. R6 head's sidebar includes the discarded synthetic first take.
- Reload shows the real boot splash and collapses disclosures; the answer remains once. Clock freezing can leave the old sidebar activity badge stale until reload; the final R6 head take uses native Date and ends without it. No CSS or renderer change is claimed.

**Runtime proof and scripts**

[runtime-transcript.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5454e38eab7b37f9/runtime-transcript.txt)

The transcript correlates ACP frames, run admissions/completions, answer ownership, pending/resolved input, and reload observations. Each fixture run sends exactly **one** `session/prompt`; autonomous continuations send none. R6 main has no continuation or persisted runtime request; its outgoing question receives an error and its answer is dropped. Head keeps run 2 open while input is pending, resolves `question_1=option_0`, and completes about 3.8 s later.

Current-head focused validation: `vp test run apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.test.ts -t 'Factory Droid'` — **3 passed, 33 filtered/skipped**. [test-after.raw.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9c9cfbc332eec9d/test-after.raw.log)

Earlier main red result remains applicable to the unchanged merge-base: [test-before.raw.log](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f1ebdac68658ee9f/test-before.raw.log), using the [regression-test-only.patch](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9cb5418a85b8c61/regression-test-only.patch): expected one continuation offer, got zero. That red run is retained evidence, not rerun in this capture pass.

ACP frames:

[A-faithful-acp-frames.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ac321d94a5fc911/A-faithful-acp-frames.jsonl)

[A-gated-acp-frames.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3ae07dc5a1dba24b/A-gated-acp-frames.jsonl)

[R6-before-acp-frames.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b6a9c10b20a5b48a/R6-before-acp-frames.jsonl)

[R6-after-acp-frames.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9204c01fa3f0b748/R6-after-acp-frames.jsonl)

Persisted synthetic events:

[A-faithful-events.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/abc96e965ebbeade/A-faithful-events.jsonl)

[A-gated-events.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f729876b8b2bef2a/A-gated-events.jsonl)

[B-question-events.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a05a009a1d8224cd/B-question-events.jsonl)

[A-question-final-events.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bbe17ad3b8fac61d/A-question-final-events.jsonl)

Rebuild scripts (all fresh uploads; fake Droid now supports R6):

[fake-droid.cjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8ce6d8ae2bf4a185/fake-droid.cjs)

[rpc-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d9b85b846582cbd/rpc-driver.mjs)

[browser-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0a7b23659a2f00ac/browser-driver.js)

[export-runtime.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2c6a80c665d168c3/export-runtime.py)

Place downloads under one scratch root as `fake/fake-droid.cjs`, `rpc/rpc-driver.mjs`, `browser/browser-driver.js`, `export/export-runtime.py`; adapt the scripts' absolute root if necessary. `chmod +x` the fake agent. Install each checkout with `vp install`, then start with `T3CODE_DEV_SEED=0 vp run dev`. Read ports from the dev-runner line. Run RPC `registry`, then `seed`; pair and navigate to the returned route. Set root `control.json` to `{"mode":"faithful"}`, `{"mode":"gated"}`, or `{"mode":"question"}` before sending. Each invocation writes a timestamped run directory. For gated mode ensure no old `release-answer` exists; create it only after persisted run 2 completes. For question mode ensure no old `release-question` exists; on head create it immediately when run 2 becomes active, within its 3 s window. On main release it from the start; the question follows the late Task. Answer through the UI, export after completion, then reload. Use the browser driver for the earlier display-clock treatment; omit it and expand controls through the UI for native-clock R6 head. Never upload minted driver auth.

**Unverified controls**

| Rows | Status / reason |
|---|---|
| C1 | Foreground-only/error/cancel variants not reverified; outside required capture set. |
| C2–C3 | hideSuccessful/hideAll and Zen waived by the matrix; not exercised. |
| C4 | Failed late Task not reverified; nonblocking protocol variant. |
| C5–C6 | Stop/quarantine and competing-prompt races not reverified; outside this evidence rerun. |
| C7 | Local/other registry/no continuation service excluded from positive proof; registry factory-droid was used. |
| C8–C9 | Blank/usage/wrong-session and lifecycle/refusal controls not rerun; earlier matrix source-inspection only. |
| C10 | Other widths/themes, desktop/native, side-chat/guest and remote/relay/tunnel clients not exercised; requested surface was web. |
| Additional shared-finalizer branches | Approval and foreground-running-tool app recordings not captured; R6 covers the question branch. Current-head focused tests include the question/tool blocker cases. |

6/6 required rows captured; 6/16 matrix rows have app recordings when the ten nonblocking controls are counted. No required row is unverified. All four new uploaded recordings were decoded and reviewed at their transitions and terminal frames; synthetic data only, no private runtime model identifiers or credentials in uploads.

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

Cleanup: both isolated checkouts removed; all four owned server/web ports closed; owned Preview tab closed. Lead checkout and live database untouched. No code commit, push, PR edit, or PR comment. Free disk after cleanup: 107G. Evidence and private originals remain in the requested scratch directory.

FRICTION:
model | The before install began before checkout population finished; reran it after completion | Wait for worktree creation to finish before installing.
tool | Frozen client Date left a stale sidebar activity badge in the first R6 head take; retook it with native Date and reload | Use native Date for timed activity captures.
tool | A naive cut of sparse Preview frames ended early; the reviewed 35 s main prefix uses constant frame rate | Preserve static periods when trimming and inspect the output duration and last frame.
policy | Automatic command review rejected a combined shell command containing rm -f; used the brief's literal-path Python unlink fallback for the owned gate file | Keep deletion as its own literal-path command.
