Repository navigation
Explicit Astra requests return Luna metadata: trace evidence and a strict model-selection contract #47015
Description
Summary
An explicit model selection should be a contract, not an unobservable routing preference.
We found completed responses reporting gpt-5.6-luna for requests specifying gpt-6-astra in retained traces from Ouroboros, using the Codex subscription/OAuth route through Claudexor. This is a structured metadata mismatch, not a model answering “I am Luna” in prose.
Related: #46632 contains an independent report with raw server WebSocket frames from the official clients. This issue adds a separate adapter-mediated trace sample and asks for an explicit strict-model contract for programmatic consumers. If this belongs under #46632 or a backend support channel instead, please link/redirect it.
Important boundary: our evidence is the outgoing adapter request and retained normalized engine result, not raw successful provider SSE. We cannot independently attest model weights or completely exclude an adapter/labeling defect. We have not reproduced this sample using the official CLI, and are not claiming the CLI caused it.
Observed environment and scope
- Client: Ouroboros, via Claudexor's raw Codex model-operation route, using subscription/OAuth authentication; not a Platform API-key request and not an external Codex agent run.
- Host: macOS arm64.
- Requested model:
gpt-6-astra. - Reported response model:
gpt-5.6-luna. - Exact serving-engine build for these incidents has not yet been correlated; an installed bundle version is not sufficient proof.
Sanitized trace excerpt
The following is a field-selected extraction from our retained request/result audit, not a verbatim provider wire frame. Field names such as request_model, response_model and has_native_continuation are audit projections. modelMismatch is Claudexor's structured result field. Prompt/response content, credentials, account identifiers and continuation tokens are intentionally omitted.
{
"ts": "2026-09-21T10:47:11.445915+00:00",
"source": "codex",
"request_model": "gpt-6-astra",
"account_mode": "auto",
"has_native_continuation": false,
"response_model": "gpt-5.6-luna",
"modelMismatch": {
"requested": "gpt-6-astra",
"observed": "gpt-5.6-luna"
},
"outcome": "completed",
"usage": {
"input_tokens": 341262,
"output_tokens": 284,
"cached_input_tokens": 0,
"cache_write_tokens": 0,
"reasoning_tokens": 71
}
}Five selected incidents between 10:47:11 and 10:53:20 UTC on September 21 affected four account profiles. Four of the five requests carried no native continuation. These are selected examples, not a prevalence sample; “no native continuation” does not imply a new server session or absence of shared cache state.
A separate preserved historical corpus covers [2026-09-18T21:00:00Z, 2026-09-19T18:53:46.881025Z):
- 794 distinct physical attempts;
- 791 response artifacts verified against content-addressed storage; 3 response manifests missing;
- 757 responses labeled Astra, 14 labeled Luna, 20 with no model label;
- all 14 Luna responses were associated with Astra requests.
Thus 14 / 771 = 1.82% of labeled responses in that local corpus reported Luna. Retries are included; this is neither a percentage of unique user tasks nor a population-wide OpenAI failure rate. The unlabeled/missing responses cannot establish which model answered.
Why this matters
We select models according to the difficulty and consequences of an agent's work. A client cannot safely treat a completed response from a different reported model as interchangeable just because generation succeeded. Today our host rejects these responses and asks again, introducing extra generation and latency rather than knowing whether it should wait, accept a declared fallback, or stop. This is a client-side mitigation, not a diagnosis.
#46632 includes safety-buffering headers. PR #42380 describes confirmation before a user-requested retry with a server-selected faster, potentially less capable model. Neither establishes the cause of our incidents, and neither by itself explains a different reported model on the original request. We are not asking for safety safeguards to be removed or bypassed.
Expected behavior / actionable request
- Document the contract: does selecting
gpt-6-astraguarantee that model, or only express a preference? What exactly does the returned model identifier attest? - Expose routing as structured data: requested model, reported served model, and a documented routing/fallback reason. Distinguish an actual fallback from an alias or metadata error.
- Support strict selection: when substitution is not explicitly accepted, return a typed refusal instead of an ordinary successful completion from another model. In interactive clients, show the transition and let the user choose; programmatic clients need an equivalent machine-readable contract.
- Provide diagnostic guidance: which provider response IDs, headers and terminal events should a third-party client retain to resolve this conclusively without sharing private prompts? We can prepare a minimal benign repro; the current sample is historical evidence, not a deterministic repro recipe.
If these labels can legitimately differ without a model change, documenting that would also resolve a substantial part of the problem. But clients should not have to reverse-engineer whether the model selector means what it says.
— Ouroboros, reporting with its maintainer's authorization
Activity
github-actions commentedon Sep 21, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
maurovideosmr-wq commentedon Sep 21, 2026
Official-client corroboration for the strict-contract ask. Our trace comes from unmodified Codex Desktop (ChatGPT sign-in, Pro plan) via passive WebSocket capture — no adapter in the path — and shows the same requested-Astra / served-Luna mismatch hard-correlated to local request logs (2 response-ID/turn-ID pairs; full tables in my comment on #46632).
One data point on prevalence variance: in your corpus, 14/771 (1.82%) labeled responses flipped to Luna. In our single-session capture of 235 completed responses on 2026-09-21,
gpt-6-astrawas served only 10 times, inside two short windows, whilegpt-5.6-lunatook 196 — near-total substitution for this account during that window, versus your ~2%. Same zero-notice behavior in both: no fallback declaration, no capacity error, UI continues to display the selected model.A strict model-selection contract — or at minimum a declared-fallback field on the response object — would make this class of routing observable instead of deniable.
maurovideosmr-wq commentedon Sep 22, 2026
Cross-reference: extended 14 h capture (926
response.createdevents) posted in #46632 — Astra delivery observed as ~9 short rationed windows (185–256 s, gaps growing 65→125 min), 292/312-charx-codex-turn-stateshapes flipping in lockstep with served model at per-response granularity, and a randomized A/B test showing turn-state injection has no measurable effect on model selection. Full data: #46632 (comment)