## Evidence

**W1 captured: 1/1 required rows, 1/21 matrix rows.** [#33596](https://git.cafe/pingdotgg/t3code/pull/33596) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/33596)). [Fixture matrix](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e0b1eed589e1380a/fixture-matrix.md).

**ACP stub harness; no live Antigravity backend.** Real T3 client/server, synthetic data only. The stub supplies a fixture model name; it is not a live model claim. AI-assisted; verified with the tests and tools listed above.

**What else changed:** No unrelated differences in the final still pair. Recordings have capture-only initial-loading and running-timer timing differences (about one second), and the existing error banner wraps differently because its error message changes. These are disclosed recording differences, not additional feature changes.

### Scripted interaction and timestamps (UTC, 2026-11-10)

Both exact commits ran from separate checkouts against fresh databases created by their own server with `T3CODE_DEV_SEED=0`. No source edits, accelerated timeout, live-state seed, or forged terminal events. The same driver configured the isolated Antigravity provider's `binaryPath` to the uploaded `agy`, created the same synthetic project/thread, navigated to the thread, then sent the labelled W1 prompt through the public orchestration RPC. No further user action occurred until after retirement.

| Milestone | Before [bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) | After [570bc59](https://github.com/pingdotgg/t3code/commit/570bc594f52f19c8367694de4eaadb5405455e36) |
|---|---|---|
| Public message dispatch | 00:41:45.379 | 00:41:45.154 |
| Stub receives `session/prompt` | 00:41:46.135745 | 00:41:46.095823 |
| Type-17 SQLite step committed after dispatch | 00:41:46.139931 | 00:41:46.102751 |
| Watchdog retirement logged, timeout 900000 ms | 00:56:46.145 | 00:56:46.065 |
| Provider turn completedAt | 00:56:46.137 | 00:56:46.064 |
| Run completedAt | 00:56:46.376 | 00:56:46.219 |
| Observed terminal row | Generic inactivity message | Bad Gateway: Failed to connect to backend API |

The stub leaves `session/prompt` unresolved and sends no progress or blocker updates. Its regular, owned, unlinked managed SQLite file is `$GEMINI_HOME/antigravity-acp/conversations/fixture-session-1.db`, table `steps(idx INTEGER PRIMARY KEY, step_type INTEGER, step_payload BLOB)`. The new row is idx 1, type 17, UTF-8 BLOB: `Error 502, Message: Bad Gateway: Failed to connect to backend API, Status: 502 Bad Gateway, Details: []` followed by `The model is currently unreachable.` Read-only proof and timestamped sanitized protocol are linked below.

### Recordings

The real 15-minute silence is intact in the raw recordings. The 52-second excerpts retain the first 22 seconds and final 30 seconds; the idle middle is removed, explicitly labelled throughout. There is no speed-up or timeout injection. Before raw duration 922.858 s (removed source interval 22.000–892.858 s, 870.858 s of idle middle); after raw duration 923.084 s (removed source interval 22.000–893.084 s, 871.084 s). The final excerpts display the harness label and recording-relative time cut. The raw recordings carry the same harness label in the actual prompt once dispatched; their initial navigation/loading frames precede that prompt.

Before excerpt: [before-excerpt.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6536b9151a59bf29/before-excerpt.mp4)

After excerpt: [after-excerpt.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/541d123b8f979b8f/after-excerpt.mp4)

Before full raw: [before-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7f0a629827d1c5e9/before-raw.mp4)

After full raw: [after-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5a46a98437bfefe2/after-raw.mp4)

**Recording environment:** T3 Browser preview panel, Chrome 156 on Linux x86_64, desktop with no device emulation, CSS viewport 1440×900, DPR 2, visual scale 1, font scaling 100%, dark theme. Native raw pixels 2880×1800; excerpts downsampled to 1440×900 at 15 fps. Recording clocks were not frozen.

### Settled stills and diffs

After retirement, dismiss the existing error banner with its keyboard action on both sides, scroll to the same top position, freeze browser Date at 2026-11-10T01:00:00Z, wait for the shared sidebar age, network idle and loaded fonts, invalidate stale compositor paint, then take two native screenshots 500 ms apart. Both sides are pixel-identical within their own pair. The browser-only clock freeze occurs after real watchdog completion and does not affect the server timeout. Final stills have no banner, transient overload toast, ghost paint, spinner, clipped text, or loading skeleton.

**Still environment:** agent-browser with HeadlessChrome 148.0.7778.96 on Linux x86_64, desktop with no device emulation, CSS viewport 1440×900, DPR 2, visual scale 1, font scaling 100%, root font 16 px, fonts loaded, dark theme. Native captures 2880×1800 retained below; table PNGs downsampled with Lanczos to 1440×900. The preview screenshot tool returned 1280×800 images despite reporting the requested viewport, so the final stills use the fallback browser.

| Row | Before | After | Diff0 | DiffT |
|---|---|---|---|---|
| W1 — 1440×900 CSS, dark; ACP stub harness; no live Antigravity backend. | ![before.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6aef5b20d877ab9f/before.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) | ![after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f5a6e825ae612492/after.png)<br>[570bc59](https://github.com/pingdotgg/t3code/commit/570bc594f52f19c8367694de4eaadb5405455e36) | ![diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0e9d7dd9254d6aa1/diff0-amplified.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [570bc59](https://github.com/pingdotgg/t3code/commit/570bc594f52f19c8367694de4eaadb5405455e36) | ![diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1f67c9d23f712237/diff16.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [570bc59](https://github.com/pingdotgg/t3code/commit/570bc594f52f19c8367694de4eaadb5405455e36) |

Diff0: absolute RGB difference at threshold 0, multiplied by 255 and clipped so a one-level change is visible; 7,329 changed pixels of 1,296,000. DiffT: maximum absolute 8-bit RGB channel difference strictly greater than 16, highlighted magenta; 4,630 pixels. All changes are inside the error-body bounding box x=408–1075, y=256–298. Every other pixel is identical.

**Every visible difference in the final pair:**

- Generic two-line inactivity message becomes the one-line gateway message.
- The second line disappears because the new text is shorter. Row heading, icon, time, sidebar, composer, project panel, prompt, positioning and background are otherwise pixel-identical.

All primary stills, native stills, diffs, and recording contact sheets were opened and visually inspected. Rejected stills with stale overload toasts or earlier banners are retained only in the clearly labelled diagnostic archive, not used as W1 proof.

### Runtime proof and native captures

After contains exactly one failed turn with `class: provider_error`, `message: Bad Gateway: Failed to connect to backend API`, `code: 502 Bad Gateway`, `retryable: true`. Before contains exactly one failed turn with the generic 15-minute inactivity text and no gateway code/retryable flag. Watchdog and final persisted event/projection transcripts establish the genuine server path. No automated tests were added or substituted for the capture.

[before-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fdffc1d4ee710366/before-terminal.json)
[after-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5305c0945938eaa/after-terminal.json)
[protocol-sanitized.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/367cfbdbebd538b2/protocol-sanitized.jsonl)
[before-watchdog.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/22e0a113fd80a530/before-watchdog.txt)
[after-watchdog.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d2071864360ab790/after-watchdog.txt)
[synthetic-log-proof.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac5c3a605e58f567/synthetic-log-proof.json)
[fixture-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7dc2e591dc253167/fixture-manifest.json)
![before-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7048ca622b005a6a/before-native.png)
![after-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/707634c5e906e46a/after-native.png)

### Uploaded seed, stub and driver scripts

The seed is the same `driver.js` public RPC flow on fresh databases; there is no copied database. These scripts contain only fixture data and local paths, no reusable credentials or private runtime model identifiers. `clock-cdp-driver.mjs` records an unsuccessful diagnostic approach; the final still driver uses direct client-side evaluation instead.

[agy](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f8c6f4100de4dbcd/agy)
[driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ef2583036c63a7a2/driver.js)
[still-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2ad89159859c2b52/still-driver.py)
[media-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9f17bb91b3d4739/media-driver.py)
[diff-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d2aa1f06308c7bb3/diff-driver.py)
[contact-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a315142bedcef15/contact-driver.py)
[transcript-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b950336bc437bf2e/transcript-driver.py)
[log-proof-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f62c49cc7c96ba03/log-proof-driver.py)
[browser-setup.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8786b31bc49b1a68/browser-setup.py)
[terminal-driver.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15652c2407b286c6/terminal-driver.js)
[frozen-clock.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2ed20355fb90675a/frozen-clock.js)
[clock-cdp-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/679040f39fd9ade1/clock-cdp-driver.mjs)
[launch-recipe.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/073999b65b55d524/launch-recipe.sh)

[synthetic-capture-diagnostics.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/312b8041a23ff09b/synthetic-capture-diagnostics.zip)
[package-diagnostics.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/721ab8cf2011f9a4/package-diagnostics.py)

The synthetic diagnostic archive contains all captured PNGs, native stability samples, contact sheets, diff metrics, environment/verification files, and every recording export (including the two interrupted setup attempts and two abandoned incomplete initial ffmpeg excerpts (about 22 seconds each; retirement missing)). Final segment files are also included; the primary final recordings linked above are the review artifacts. It deliberately retains rejected attempts for audit; they are not additional verified rows. Raw server logs and pairing/session secrets remain private and are not uploaded. The first attempt was interrupted when the shared after checkout changed; the final required run uses the pinned exact commit above.

### Matrix accounting: unverified rows

| Row | Status and reason |
|---|---|
| P1 | Unverified; optional immediate-completion fixture outside the required W1 recording. |
| P2 | Unverified as its independent immediate-completion fixture; its gateway payload is exercised through W1. |
| P3 | Unverified; optional HTTP/invalid-argument compatibility fixtures were not captured. |
| P4 | Unverified; optional malformed/bounded payload variants were not captured. |
| Q1 | Unverified; optional future-reset quota recording not attempted after W1/tooling work. |
| Q2 | Unverified; optional future-reset rate-limit recording not attempted. |
| Q3 | Unverified; optional quota without reset recording not attempted. |
| Q4 | Unverified; optional reset-equivalence variants not captured. |
| Q5 | Unverified; optional expired-reset/recovery-disabled interaction not captured. |
| W1 | Captured before and after at the requested SHAs, with real 15-minute deadline, recordings and settled stills. |
| W2 | Unverified; optional silent quota variant not captured. |
| W3 | Unverified; optional no-evidence variants not captured. The W1-before generic result is not claimed as all W3 variants. |
| W4 | Unverified/excluded; exact missing-hook branch requires adapter injection and is not selectable through normal app configuration. |
| W5 | Unverified/excluded; exact checker-defect branch requires adapter injection; corrupt SQLite is not equivalent. |
| W6 | Unverified; optional progress-rearm controls not captured. |
| W7 | Unverified; optional blocked/waiting pause controls not captured. |
| W8 | Unverified; optional completion/Stop/stale-callback race controls not captured. |
| W9 | Unverified; no second-message recovery recording was made. |
| I1 | Unverified; optional quota recovery controls not captured. |
| I2 | Unverified as its full interaction/surface matrix; W1 stills dismiss the existing web banner only. No separate mobile capture. |
| L1 | Unverified/unavailable; no live Antigravity backend exists on this VM. Stub evidence does not claim vendor validation. |

Required coverage is complete. Twenty optional/excluded rows remain unverified; no additional client/theme/viewport captures are claimed.

### Friction

- runbook | The shared after checkout changed during the initial attempt, causing watcher restarts. | Pin evidence in a detached checkout before starting.
- tool | Preview screenshot output was 1280×800; the fallback browser also required compositor invalidation to clear a stale toast. | A full-resolution preview screenshot path with fresh paint would avoid retakes.
- infra | Initial concurrent video concat exports buffered large frames, exhausting memory/swap and freezing the VM. | Independently decode short segments with bounded threads before concatenating.

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

### Cleanup

All servers and browser sessions started for this capture were stopped, both preview tabs were closed, and the detached before and pinned-after capture checkouts were removed. Their tracked files were clean before removal. The lead-owned after checkout was retained. Disk available after cleanup: 10 GB. Private scratch logs and original evidence remain in the capture directory. No PR body or tracked source was modified.
