Additional evidence from October 15, 2026 identifies one concrete cause of the long 429 retry wait described here. This covers the retry-wait portion of this issue. It does not reproduce the separate systemError recovery problem.
A live Codex 0.162.1 turn used a Responses-compatible CLIProxy route. The proxy retained saved quota cooldowns after upstream quota had recovered. It returned HTTP 429 with error.code: "model_cooldown", no error.type, and Retry-After: 384882. Codex reported Reconnecting... 1/5 with willRetry: true. The turn remained open until it was interrupted manually, about 12 minutes after it started.
The important distinction is that T3's running state matched the provider's reported state. Codex had announced another attempt and had not emitted a terminal result. The observed error notification contained no retry deadline. This evidence does not establish an incorrect T3 state transition, although making a prolonged provider wait understandable and recoverable remains relevant to this issue.
We reproduced the HTTP error behavior outside T3 with the installed Codex 0.162.1 binary and a loopback HTTP fixture server. No upstream model request or quota exhaustion was needed.
- Point a custom Codex Responses provider at the fixture server's loopback
/v1endpoint. The replay usedwire_api = "responses",request_max_retries = 0, andstream_max_retries = 5. - For its
POST /v1/responses, return the response below. The body and headers were exported from the proxy's actual Go error implementation. - Run
codex execwith a trivial prompt and modelgpt-6-astra. Count requests and start the observation timer when the fixture receives the first request. - Repeat with the same body and HTTP status, removing only
Retry-After.
| 1 | HTTP/1.1 429 Too Many Requests |
| 2 | Content-Type: application/json |
| 3 | Retry-After: 384882 |
| 4 | |
| 5 | { |
| 6 | "error": { |
| 7 | "code": "model_cooldown", |
| 8 | "message": "All credentials for model gpt-6-astra are cooling down via provider codex", |
| 9 | "model": "gpt-6-astra", |
| 10 | "provider": "codex", |
| 11 | "reset_seconds": 384882, |
| 12 | "reset_time": "106h54m42s" |
| 13 | } |
| 14 | } |
The replay produced these results:
| Response | Requests received | Observed result |
|---|---|---|
With Retry-After: 384882 | 1 | Printed Reconnecting... 1/5 and was still waiting after 10 seconds. The test then terminated its own process. |
Same response without Retry-After | 1 | Exited naturally with code 1 before the 10-second deadline and reported exceeded retry limit, last status: 429 Too Many Requests. |
The multi-day duration is supported by source inspection, not by leaving the test running for days. In the pinned Codex 0.162.1 source:
- The 429 classifier recognizes
error.type: "usage_limit_reached"as a terminal usage limit. This untypedmodel_cooldownbody instead becomesRetryLimit. - RetryLimit uses the server's retry advice.
- The Responses retry loop emits the reconnect notice and sleeps until the supplied deadline, without capping it to the local backoff.
Cross-reference #16288 for the separate problem of classifying a terminal HTTP 429 retry-exhaustion error and exposing Limited/Resume. This incident stalled before reaching that terminal stage. It does not verify or invalidate the fix for #16288, and it does not establish the cause of every silent retry described in this issue.
The stale cooldown state belongs to the proxy. Clearing only cooldowns contradicted by current upstream quota, then interrupting and resuming the original T3 turn, restored progress and produced a completed turn with tool results. A local proxy change that omits long automatic retry hints was tested, but it has not been deployed and does not prevent stale cooldowns from recurring.
The human reporter requested this follow-up. GPT-6 Astra through Codex performed the investigation and replay; Claude Opus 5.5 through the Claude agent route provided diagnosis and independent code review. Account identities, credentials, hostnames, private paths, thread IDs, and task content are omitted.