GPT-6 Astra and the Daybreak cyber models are now first-class, so asking for one runs it instead of quietly running GPT-5.5. Five defects found while wiring that up are fixed too. Nothing to migrate, install and go.
npm i -g codex-multi-authA GPT-6 id ran GPT-5.5 without saying so.
OpenAI shipped GPT-6 Astra on 2026-09-03 with two slugs in Codex: gpt-6-astra, the flagship, and gpt-6-astra-aeon, a long-horizon variant built for runs measured in days. The general GPT-5 resolver matches on a gpt + 5 token pair, so a GPT-6 id matched nothing at all and fell through to DEFAULT_MODEL. For a frontier model that is not a degraded response. It is a different model than you asked for, billed and rate-limited under a different family, with nothing in the output to say so.
This is the same failure v2.5.0 had to fix for GPT-5.6, one major version down, so the fix mirrors that one rather than inventing a new shape.
The Daybreak cyber models had the same outcome for a different reason.
gpt-daybreak-blue-latest and gpt-daybreak-red-latest sit in the upstream Codex catalog marked supported_in_api, but their slugs carry neither a codex nor a gpt 5 token, so every resolver declined them. Asking for the cyber-permissive model ran GPT-5.5.
Prototype member names were mistaken for model ids.
Model strings reach several lookup tables raw from the caller: createUsageLedgerRow only trims input.model, the proxy copies body.model verbatim, and models --model <x> passes the flag through. So constructor, __proto__ and toString indexed those plain objects and came back as Object.prototype members, which are truthy, so every "did we find one?" guard passed them along.
GPT-6 Astra resolves to itself, and so does anything shaped like it. Both models carry the GPT-5.6 frontier effort ladder: low through max plus ultra, no none or minimal (those coerce up to low), and ultra rewritten to max before the wire exactly as upstream Codex does. Bare gpt-6, gpt6, astra and astra-aeon are aliases.
A dedicated GPT-6 resolver then claims every id the alias table does not name, so an unrecognised one can never fall back to GPT-5.5:
| You ask for | You get |
|---|---|
gpt-6-astra, gpt-6, astra |
gpt-6-astra |
gpt-6-astra-aeon, astra-aeon |
gpt-6-astra-aeon |
gpt-6-astra-pro, gpt-6-astra-2026-09-03, Astra Pro |
gpt-6-astra |
gpt-4-astra-x |
not GPT-6, the astra branch is anchored to a GPT-6 version token |
gpt-6-codex |
left to the codex resolver, unchanged |
aeon keeps its own id rather than collapsing into the flagship, because it is a behaviourally different model rather than a rename.
The Daybreak models resolve too. gpt-daybreak-blue-latest and gpt-daybreak-red-latest, with daybreak-blue and daybreak-red as shorthands. An unrecognised Daybreak id resolves to blue, the defensive variant, so a typo cannot silently upgrade you into the cyber-permissive one. They stay out of the picker templates, matching their visibility: hide upstream.
Cost is priced where OpenAI published a rate and reported unknown where it did not. gpt-6-astra is $10 per 1M input and $50 per 1M output on the standard tier. No cached-input rate was published, so cached tokens bill at the full input rate: that over-states cost, which is the safe direction, because a maxCostUsd budget then trips early rather than late.
gpt-6-astra-aeon and both Daybreak models have no published rate and are listed in UNPRICED_ROUTABLE_MODELS rather than guessed at, so a cost budget fails closed while they are in the window instead of reading unknown spend as free.
Two limits worth knowing. OpenAI's Fast service tier is 2x standard, and no row in this table has ever carried a service-tier dimension, so a session billed at that tier is under-counted by half for Astra exactly as it already is for gpt-5.6-sol. Nothing in this package selects that tier. Separately, all four new models are listed in UNESTIMATED_ROUTABLE_MODELS: OpenAI published two different context windows on launch day, 1.05M for the API surface and 272K for Codex, and this wrapper talks to the Codex backend. Set contextBudgetGuardModelWindowOverrides once you know your real ceiling.
An account without Astra entitlement steps down instead of failing. Astra rolls out org by org, so an unentitled account gets a real unsupported-model response. gpt-6-astra steps to gpt-5.6-sol, gpt-5.6-sol steps to gpt-5.5, and gpt-6-astra-aeon steps to the flagship first.
The two paths gate this differently, which is easy to get wrong. In the plugin-host runtime it applies only when fallbackOnUnsupportedCodexModel is on, and that defaults to false. The codex-multi-auth-codex wrapper has always retried unconditionally on an unsupported-model response, printing the swap to stderr.
Depth is not free: every hop spends one of the shared per-request outbound attempts, and a single-account balanced session has a budget of 5. The longest Astra walk uses exactly 5, so a session that also spends an attempt on a retry or stream failover ends in an attempt-budget-exhausted 503 rather than reaching the last hop. That needs an account entitled to none of aeon, Astra, Sol or 5.5. A test pins the arithmetic so deepening a chain row fails loudly.
Prototype member names no longer index the lookup tables. estimateUsageCostUsd returns null instead of NaN, which matters because evaluateBudgetGuard fails closed on null while NaN >= limit is false, so a NaN silently made a maxCostUsd cap unenforceable. The fallback chain no longer throws TypeError: targets is not iterable inside the request path, and the chains are now null-prototype objects, which also stops an unsupportedCodexFallbackChain key of __proto__ reassigning the object's prototype. models --model constructor no longer emits a row whose fields are all undefined.
Three of these were wrapper-versus-library drift, which this repo has hit before. scripts/codex.js re-implements the model map because it runs before the TypeScript build, and it also keeps its own fallback chain. Both now carry the GPT-6 rows, and a model-by-effort parity matrix plus a chain parity test pin them against the library so the two cannot diverge again. That matrix is what caught a fourth defect: the wrapper's codex resolver ended on an exact model === "codex" check where the library tests the codex substring, so ids like gpt-6-codex resolved to nothing in the wrapper while the library resolved them.
resolveModelFamilyForStatus also never stripped the provider prefix. Every branch is a startsWith, so openai/gpt-6 matched none and status routing fell back to activeIndex instead of the family index. That was never GPT-6 specific and affected openai/gpt-5.6-sol and openai/gpt-5.1 the same way, so the prefix is now stripped once for all branches.
No migration is required. Install the package and confirm the version:
npm i -g codex-multi-auth
codex-multi-auth --versionThe command should report 2.11.0.
Model routing defaults are unchanged: DEFAULT_MODEL stays gpt-5.5 and diagnostic probes still lead with gpt-5.6-sol. Astra is opt-in by naming it. The probe deliberately does not lead with Astra while it is still rolling out org by org, because a probe only needs a response's quota headers and leading with an unentitled model would spend a failed request per probe.