There's a date on your coding agent you probably haven't put in your calendar: July 23, 2026. It's a hard shutdown in OpenAI's 2026 model-deprecation notice — one of two cutoffs this year (the other lands October 23) that between them retire more than 25 legacy model IDs. The gpt-5.x-codex coding family is on the list. After a model's date, a call that names it doesn't degrade — it fails.

If you never pinned a model, you can stop reading. If you — or a teammate, or a tutorial you copied — ever wrote a model string into a Codex config or a CI job, this is a fifteen-minute audit you want to do this week, not on the 24th.

Why the exposure hides in your own API key#

Here's the wrinkle that makes this easy to miss. On the ChatGPT-authenticated side, OpenAI already pulled these models back in April: gpt-5, gpt-5.1, gpt-5.1-codex, gpt-5.1-codex-max, gpt-5.1-codex-mini, and gpt-5.2-codex. Sign in to Codex with a ChatGPT account and they simply stopped appearing months ago. That churn was visible.

What's still alive — until the hard shutdown dates — is the same lineage reached through your own API key. And that's precisely where a solo builder's automation tends to point: a background agent, a nightly job, a deploy hook, each carrying an OPENAI_API_KEY and a model string someone chose once and forgot. Those keep working right up until the 23rd, which is what makes the deadline sneaky rather than loud.

The failure can be silent#

A deprecated model in an unattended pipeline doesn't always throw a red error. It can surface as a build that exits 0 without doing the work — a green check on a job that shipped nothing.

In an interactive terminal you'll see the error immediately and fix it. In CI, migration and fallback paths can swallow it: the run completes, the exit code is zero, and the only tell is that the PR the agent was supposed to open never appeared. So do not treat a passing pipeline as proof you're safe. The honest check is a smoke test that asserts the agent produced a real model response — and you want it running before the deadline, not after.

The audit#

Grep everything that can call a model for a Codex model string:

# from your repo root — and repeat across every service and CI config
grep -rEn "gpt-5(\.[0-9])?-codex(-max|-mini|-spark)?|OPENAI_MODEL|--model" .

Check the usual homes: the Codex config.toml, any codex exec --model <name> invocation, OpenAI Agents SDK orchestrators, CI workflow YAML, Dockerfiles, and environment variables. Every hit that names a retiring model is a call with an expiry date.

The fix is un-pinning, not re-pinning#

The instinct is to swap the dead ID for a newer one. Resist the obvious swap. Re-pinning gpt-5.3-codex just resets the same clock — it's already being phased out on the ChatGPT side in favor of GPT-5.4 and GPT-5.5.

For ChatGPT-authenticated Codex, the recommended practice is to name no model at all and let Codex default to the current recommended one, now in the GPT-5.5 / GPT-5.6 generation we walked through when the tier menu reset. The default rolls forward on its own; you stop owning a deprecation calendar. If you genuinely need a frozen model — a reproducible eval, a compliance snapshot — then pin a current one deliberately and diarize its shutdown date, the same way you'd pin any dependency you have to migrate later.

That's the whole lesson, and it outlives this particular date: a hard-coded model version is a dependency with a sunset. Treat it like one — track it, prefer the provider's default where you can, and own a test that turns the next deprecation into a one-line change instead of a Monday-morning outage. This one just happens to be eleven days out.