# Codex slow startup reproduction

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

Environment: Linux web dev server; Chromium; 1440 × 1000 CSS pixels; dark theme; real Codex CLI 0.167.1 with API-key authentication. Each commit has its own fresh T3 home, with development seeding disabled. No real agent turn is sent.

1. Install dependencies with `vp i` in each checkout. With the server stopped, run `seed.py` using a dedicated scratch root and the authenticated real Codex executable. It creates a wrapper that sleeps before forwarding every original argument to the real binary, selected through Settings → Providers → Codex → Binary path (equivalent to resolving the wrapper first on PATH).
2. Start each checkout with `T3CODE_DEV_SEED=0 vp run dev`, pair its web client, and add the synthetic project using the command printed by the seed script.
3. At a delay of 25 seconds, open Settings → Providers → Codex. Base: Unavailable with the provider-status timeout and initially zero models. Head: Authenticated · OpenAI API Key and nine discovered models.
4. Create a new draft in Startup-demo, keep Codex selected, and type `$startup` in the composer. Base finishes without a matching skill. Head lists `startup-proof` as a Repo Skill. No message is sent.
5. Set the scratch `delay` file to `15`, refresh provider status, and wait for completion. Both commits authenticate and discover nine models. After waiting for provider authentication, opening a fresh copy of the synthetic project also lists the repo skill on both commits. A first control attempt while machine health still reported the preceding timeout left the base skill result empty; refreshing health and opening a fresh project resolved it.
6. Restore `25` and record the same Refresh provider status interaction on both sides. Base becomes Unavailable; head stays authenticated. The base retains its previously cached model catalog after the successful control, so use the initial cold-start observation for the zero-model result.
7. Set `delay` to `90` and refresh. Both probes return the provider-status timeout before the wrapper executes the real binary; the head remains bounded at about 60 seconds.

Public captures are cropped to the affected UI to exclude machine names, paths, and private model identifiers. Cropping does not alter the status, skill result, or refresh animation. The original recordings run at real speed.
