# Reproduction and evidence

Both sides are independent git worktrees, installed with `vp i`, running the real web development client with `T3CODE_DEV_SEED=0 vp run dev`. Each server created its own fresh database. No live database was copied. Both use the same empty synthetic project directory, prompts, launch settings, browser viewport (1440 x 900 CSS, DPR 2), and light theme. All agent turns are real provider turns, including the native Codex child. No transcript replay or injected usage fixtures were used.

## Main reproduction

1. Start each server with `T3CODE_DEV_SEED=0 T3CODE_CODEX_LAUNCH_ARGS='-c model_auto_compact_token_limit=100000 -c features.token_budget=false' vp run dev`.
2. Pair a browser with each server's startup pairing link. Create the same empty synthetic project via `node apps/server/src/bin.ts project add PROJECT --title 'Context evidence' --base-dir .t3`.
3. Start a fresh root Codex thread with `node apps/server/src/bin.ts thread start --base-dir .t3 --provider codex --model "$EVIDENCE_CODEX_MODEL" --title 'Configured context limit' --json PROJECT 'Reply with OK.'`. Use the installed provider's supported local model selection; the observed model context capacity was 258,400 tokens on both sides.
4. Enable Context window in the thread-details context menu. For privacy, hide Environment and worktree, Open in editor, Project scripts, Git actions, Lineage, and Side chats on both sides. The context row uses the real persisted usage.
5. Close and reopen thread details, then hover Context. The main recordings capture this same interaction. Each still follows two pixel-identical full screenshots taken at least 500 ms apart, with focus moved off the editor first.

Observed: both root turns used 19,587 tokens. Base shows 8% and `20k / 258k` without a threshold message. Head shows 20% toward auto-compaction and `20k / 100k`, a 100,000-token threshold message, and a separate 258,400-token capacity. Neither Codex capture has a tick: head deliberately replaces the tick with progress toward the effective threshold.

## Guard and Claude runs

Stop the servers before `python3 driver.py configure --checkout CHECKOUT --output OUTPUT --project PROJECT`. Restart with `T3CODE_DEV_SEED=0 vp run dev`, without the global Codex launch-arguments override. Then run `python3 driver.py launch --checkout CHECKOUT --output OUTPUT --project PROJECT` with `EVIDENCE_CODEX_MODEL` set to the locally supported selection. Run the same commands on both sides. The script creates provider instances with the exact per-case CLI flags and uses the same project and prompts. Native child agents are requested with Codex's own spawn tool. Zero and negative limits immediately compact; stop those two turns in the UI rather than allowing compaction to continue.

The guard captures show token_budget=true, body_after_prefix scope, no limit, zero (after interruption), limits of 258,400 and 300,000, a near-capacity limit of 240,000, and the native child agent. All retain full-window progress on head. The native child's parent retains the known 100,000 threshold on head.

For Claude, run the ordinary default instance once with its canonical locally supported model id, then run `python3 driver.py claude-launch --checkout CHECKOUT --output OUTPUT --project PROJECT` with `EVIDENCE_CLAUDE_MODEL` set to that canonical id. The configured instance uses autoCompactWindow=150000. The provider reports a one-million-token model capacity and T3 reports a 117,000-token effective threshold on both revisions. Base shows `31k / 1m`, 3%, and a tick; head shows `31k / 117k`, 27%, no tick, and capacity separately. The default Claude instance stays `31k / 1m`, 3%, on both. An initial alias-based probe completed but had unknown capacity; those probes are excluded from the claimed Claude comparison.

`browser-driver.js` is an executable function body for T3 Code's preview-tool orchestration: construct it with `new Function(source)()` and pass the tools object plus `{tabId,environmentId,threads:[{case,threadId}],output,side,record:true}`. Its thread map comes from each launch's JSON response; the native child id comes from the real server's thread list. It drives ordinary router navigation and mouse interaction, waits for a context row, captures matching screenshot pairs, and returns capture paths plus a recording. It never changes usage or rendering data.

The all-cases recordings follow this order: known, budget, body, absent, zero, capacity, above, clamped, child parent, child agent, Claude default, Claude configured. Case and environment labels were added below the unchanged UI crop. The contact sheets contain the same stills in that order, left to right and top to bottom. Every public image/video uses the same top-right crop (640 x 250 CSS pixels); the editor model selector and host identity are outside it.

`export-runtime.py BASE HEAD OUTPUT` reads only these isolated databases and exports case/status/numeric usage. `make-assets.py INDEX OUTPUT` builds contact sheets and labeled recordings from the browser driver's private path index. Public artifacts contain synthetic data and no credentials, runtime model identifiers, or machine names. No tests are used as proof.

Limitations: zero/negative runs were interrupted; separate negative-limit stills and recordings show their final full-window meter. Malformed/non-finite settings, config-read failures/timeouts, protocol-log redaction, transcript-replay compatibility, the legacy composer meter, desktop, and mobile were not exercised.

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