## W2 quota watchdog evidence

**Visible difference outside the quota/watchdog behavior:** the unrelated default `server / New thread` sidebar age is **22m before / 21m after**, because the fresh databases were created at different times. Both synthetic test threads and their prompts use the same seed driver.

**Captured: 2 / 2 requested rows, each before and after. Unverified requested rows: none.**

**ACP stub harness; no live Antigravity backend.**

Scope: [#33596](https://git.cafe/pingdotgg/t3code/pull/33596) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/33596)); before [bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41), after [695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d). Both exact detached checkouts were installed with `vp install`. Each server created its own fresh database with `T3CODE_DEV_SEED=0`; all data is synthetic. Two sessions per server and both servers ran concurrently. No tracked code edits or accelerated watchdog timers.

The ACP stub accepts `session/prompt`, writes one regular SQLite `steps` row (`idx=1`, `step_type=17`, UTF-8 BLOB), and leaves the prompt unresolved. Both payloads contain `reason:QUOTA_EXHAUSTED` and `Status: RESOURCE_EXHAUSTED`. W2a contains `quotaResetTimeStamp:2026-11-10T05:05:00Z`; W2b contains only `quotaResetDelay:1h`, with no timestamp. No progress, tools, approvals or subagents are emitted. The real production **900000ms** watchdog retires each turn.

Rendering environment for all recordings: **T3 Browser preview panel, Chrome 156.0.0.0, Linux x86_64 desktop, no device emulation; 1440×900 CSS, DPR 2, visual scale 1, font scaling 100%, dark theme.** Original native recording pixels 2880×1800; uploaded videos 1440×900, continuous raw VFR, excerpts 15fps. Browser/server clocks were live during recordings. This matches W1's recording environment.

Rendering environment for all stills: **agent-browser, HeadlessChrome 148.0.7778.96, Linux x86_64 desktop, no device emulation; 1440×900 CSS, DPR 2, visual scale 1, font scaling 100%, root font 16px, dark theme, fonts loaded. Native 2880×1800; table PNGs are Lanczos downsampled to 1440×900.** This matches W1's still environment.

For stills only, browser `Date` is derived from the earliest synthetic run start read through public RPC, plus 20 minutes and rounded down to the minute: **2026-11-10T02:22:00.000Z** on both sides. The server clock and watchdog remain unchanged. No hard-coded sidebar age is awaited. Before each still, the driver waits for network idle and fonts, resets scroll to the top, blurs focus, and requires two screenshots **500ms apart to be pixel-identical**. All four passed. The same conditional generic-error-toast dismissal runs on both sides to expose the prompt: it dismisses the duplicate red toast before and leaves the historical failure row; after, every usage warning and recovery control remains. All final stills, native images, diffs and recording contact sheets were opened and visually inspected.

Diff0 uses `int32` absolute RGB differences, then `min(absdiff × 255, 255)` per channel, so a one-level change is visible without overflow. DiffT marks pixels magenta when the maximum absolute 8-bit RGB channel difference is **strictly greater than 16**.

Recordings below remove source seconds **0–30** from both the shared raw and excerpts to exclude all splash/blank-conversation startup. Shared raw keeps the continuous remainder, including the idle middle; original untrimmed files are retained privately. Excerpts keep source **30–52s**, then a **25s** window beginning eight seconds before the persisted provider retirement. Cuts are labelled in the video. Dispatch occurs in the removed startup portion; each shared recording begins with the loaded thread, visible prompt and running turn. No playback time is accelerated.

### W2a — absolute reset — 1440×900 CSS, dark

**ACP stub harness; no live Antigravity backend.**

Same scripted steps: seed the synthetic project and threads through public RPC, navigate to the row's thread, dispatch the labelled silent prompt, let the stub append the quota error, wait for real retirement, then capture the terminal state. All timestamps below are **2026-11-10 UTC**.

| Milestone | Before | After |
| --- | --- | --- |
| Run started | 02:02:57.392 | 02:02:57.666 |
| ACP `session/prompt` received | 02:02:57.791176 | 02:02:57.981118 |
| Quota step committed; prompt left unresolved | 02:02:57.795703 | 02:02:57.985478 |
| Real 900000ms watchdog logged retirement | 02:17:57.746 | 02:17:57.975 |
| Run completed | 02:17:57.840 | 02:17:58.213 |

Environment for each still and diff source: **agent-browser, HeadlessChrome 148.0.7778.96, Linux x86_64 desktop, no device emulation; 1440×900 CSS, DPR 2, visual scale 1, font scaling 100%, root font 16px, dark theme, fonts loaded. Native 2880×1800; table PNGs are Lanczos downsampled to 1440×900.**

**Volatile regions:** the historical failure row's wall-clock timestamp (before: 2:17 AM), sidebar relative ages/default seed thread, and any provider-update notice (none present in these final stills). Running elapsed timers and sidebar ages vary during the live recordings. The still display clock is the same derived 02:22:00Z on both sides.

| Before | After | Diff0 — amplified | DiffT — >16 |
| --- | --- | --- | --- |
| ![before-W2a.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/974e958e4954cf95/before-W2a.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) | ![after-W2a.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0558e699ed6fdd00/after-W2a.png)<br>[695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) | ![diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86d4d460831b158d/diff0-amplified.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) | ![diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0083a194e23be134/diff16.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) |

After: **Usage limit reached — Resets 5:05 AM**, with **Resume at reset** and **Snooze until reset**. Persisted failure class `usage_limit`, code `RESOURCE_EXHAUSTED`, `retryable: true`, `resetAt: 2026-11-10T05:05:00.000Z`. Before: generic “Antigravity sent nothing for 15 minutes…” provider failure.

Diff counts: **38,871 / 1,296,000** pixels differ at zero; **29,989** exceed threshold 16.

Recordings (same rendering environment stated above):

[before-W2a-excerpt.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/87db739093c6382c/before-W2a-excerpt.mp4)

[before-W2a-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a99a674993f7fc7a/before-W2a-raw.mp4)

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

[after-W2a-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/de3cda9e61f4bbf3/after-W2a-raw.mp4)

Excerpt retirement windows begin at original source **895.292s before / 893.658s after**; both keep 25 seconds from that point. The idle middle is removed only in excerpts.

### W2b — relative delay only — 1440×900 CSS, dark

**ACP stub harness; no live Antigravity backend.**

Same scripted steps: seed the synthetic project and threads through public RPC, navigate to the row's thread, dispatch the labelled silent prompt, let the stub append the quota error, wait for real retirement, then capture the terminal state. All timestamps below are **2026-11-10 UTC**.

| Milestone | Before | After |
| --- | --- | --- |
| Run started | 02:03:18.395 | 02:03:22.219 |
| ACP `session/prompt` received | 02:03:18.518515 | 02:03:22.430812 |
| Quota step committed; prompt left unresolved | 02:03:18.524399 | 02:03:22.440161 |
| Real 900000ms watchdog logged retirement | 02:18:18.520 | 02:18:22.430 |
| Run completed | 02:18:18.622 | 02:18:22.526 |

Environment for each still and diff source: **agent-browser, HeadlessChrome 148.0.7778.96, Linux x86_64 desktop, no device emulation; 1440×900 CSS, DPR 2, visual scale 1, font scaling 100%, root font 16px, dark theme, fonts loaded. Native 2880×1800; table PNGs are Lanczos downsampled to 1440×900.**

**Volatile regions:** the historical failure row's wall-clock timestamp (before: 2:18 AM), sidebar relative ages/default seed thread, and any provider-update notice (none present in these final stills). Running elapsed timers and sidebar ages vary during the live recordings. The still display clock is the same derived 02:22:00Z on both sides.

| Before | After | Diff0 — amplified | DiffT — >16 |
| --- | --- | --- | --- |
| ![before-W2b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/021c8e07af097af4/before-W2b.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) | ![after-W2b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9e2e8072de7d7d6a/after-W2b.png)<br>[695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) | ![diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e1ccb3baa053135d/diff0-amplified.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) | ![diff16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/34ae049285228f7e/diff16.png)<br>[bbdc7dc](https://github.com/pingdotgg/t3code/commit/bbdc7dca320ee4fbc7131498aaffef2fa1eb3d41) → [695e6ec](https://github.com/pingdotgg/t3code/commit/695e6ecd1f8c22f84d9e86fdb24672cf793b091d) |

After: **Usage limit reached — Reset time unavailable; retry manually**, with no reset time or reset scheduling controls. Persisted failure class `usage_limit`, code `RESOURCE_EXHAUSTED`, `retryable: true`, and **no `resetAt` key**. Before: generic “Antigravity sent nothing for 15 minutes…” provider failure.

Diff counts: **38,936 / 1,296,000** pixels differ at zero; **30,089** exceed threshold 16.

Recordings (same rendering environment stated above):

[before-W2b-excerpt.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4accea614d2fdc7e/before-W2b-excerpt.mp4)

[before-W2b-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/979e8453bedc0925/before-W2b-raw.mp4)

[after-W2b-excerpt.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/77f38d43e3b4d9d5/after-W2b-excerpt.mp4)

[after-W2b-raw.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1c2b1e1583bf8e4e/after-W2b-raw.mp4)

Excerpt retirement windows begin at original source **893.139s before / 892.886s after**; both keep 25 seconds from that point. The idle middle is removed only in excerpts.

### What else changed

- The unrelated default `server / New thread` age reads 22m before and 21m after.
- Both synthetic sidebar threads change from red **Failed** to amber **Limited**. The wider status text truncates the project name sooner after.
- The central red **Provider error**, its watchdog explanation and wall-clock timestamp disappear after; the existing amber usage warning appears above the composer. W2a includes its reset and two scheduling controls; W2b explicitly says the reset time is unavailable and offers no reset scheduling controls.
- The composer action changes from a muted blue up-arrow before to a brighter blue play triangle after.
- Diff0 also exposes low-level pixel differences around unchanged sidebar title edges; those do not appear at threshold 16.
- The live before recordings retain the duplicate generic red error toast, which can cover the upper prompt. Final stills dismiss that toast using the disclosed shared conditional step. The after usage warning is retained throughout.
- Live elapsed timers/sidebar ages differ because sessions start seconds apart. No further visible differences were found in the prompt text, header, harness label, right panel, composer layout or background of the settled still pairs.

### Scripts and runtime proof

Corrected drivers below implement the overflow-safe diff, run-derived frozen clock and startup-free video exports. Every seed, stub and driver written or changed for these captures is uploaded; none is committed.

[agy](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7649137e93846cd9/agy)

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

[still-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8b9303f7c7638feb/still-driver.py)

[clock-cdp-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c371fb9c9bf55405/clock-cdp-driver.mjs)

[frozen-clock.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7600caf70520d56e/frozen-clock.js)

[diff-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/905af1c9b2bf39d8/diff-driver.py)

[media-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/66d4a92a6ef1ae10/media-driver.py)

[contact-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/774bb13f8070375e/contact-driver.py)

[browser-setup.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/793a97007be27a01/browser-setup.py)

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

[transcript-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4cae70c9db79f887/transcript-driver.py)

[launch-recipe.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d21740468cd77bb8/launch-recipe.sh)

[archive-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f0386dd9d048c8b8/archive-driver.py)

Browser sequence and final cut/still procedure:

[preview-recipe.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5d1ab196f392ad71/preview-recipe.md)

Synthetic manifest, terminal results, protocol timestamps, regular-file SQLite proof and narrow watchdog logs:

[fixture-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1ebc3ba6f34b28b/fixture-manifest.json)

[beforeA-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b6c948ffbecf8dc9/beforeA-terminal.json)

[afterA-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/29fadfd9e4e9261b/afterA-terminal.json)

[beforeB-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d8736a27f74f21d/beforeB-terminal.json)

[afterB-terminal.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1f936d92c6e7368/afterB-terminal.json)

[protocol-sanitized.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f086f7216c1147ed/protocol-sanitized.jsonl)

[synthetic-log-proof.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5392dc0d00e24271/synthetic-log-proof.json)

[before-watchdog.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ab1a312c81278a2f/before-watchdog.txt)

[after-watchdog.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bdc4817f49c3e4f5/after-watchdog.txt)

Reviewed final diagnostics archive (four pairs of identical native samples, environment/clock verification, diff metrics, video source metadata, contact sheets and sanitized runtime proof; excludes rejected attempts, credentials and private original recordings):

[synthetic-w2-diagnostics.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8e8c86bffacd366/synthetic-w2-diagnostics.zip)

Native stills:

![before-W2a-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41081d9a15a83ab8/before-W2a-native.png)

![after-W2a-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ce28156a41181a16/after-W2a-native.png)

![before-W2b-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/232fca5dbda6e6ee/before-W2b-native.png)

![after-W2b-native.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf012bcd5cd34acd/after-W2b-native.png)

### Completion and friction

Unverified requested rows: **none**. Coverage is the ACP stub harness and web surface; no live Antigravity backend was exercised. No substituted tests are offered as captures. No PR body was edited.

Cleanup completed: both owned dev servers stopped; all four owned preview tabs and both agent-browser sessions closed; both detached capture worktrees removed. Evidence and private originals remain in the single capture-2 scratch directory. Lowest observed free disk remained above 5 GB.

FRICTION:

```text
tool | Two preview stills saved 1280×800 despite a reported 1440×900 viewport; used the authorized agent-browser fallback for final stills | Preview screenshots should honor the configured viewport
tool | agent-browser lacked the documented init-script command, and a CDP clock injection needed its session kept open through navigation; final dates and identical frames were verified | Supported pre-navigation clock injection
tool | One after-W2b raw export driver exited 143; re-exported successfully with bounded decoder/filter/encoder threads and inspected the final output | Reliable bounded video export lifecycle
runbook | Reused W1 tooling had overflow, fixed-time age waits and startup frames; all three were corrected for W2 and the corrected drivers are uploaded | Overflow-safe arithmetic, a run-derived display clock and post-load video trimming
```

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