Client or integration
Codex App
Area
Catalog / models
Summary
I observed a further state transition in the Codex Desktop + OpenCodex workflow discussed in #2813, #4076, and #4869:
After both the regular Codex allowance and the Luna Reserve allowance are exhausted, I can select another model again, but the Send button remains disabled, so I cannot submit a message.
The distinction is important: the picker is no longer the visible blocker. Model selection becomes possible again without restoring the ability to send.
| Reported state |
Model selection |
Submission |
| Regular allowance exhausted, Reserve still available |
Reserve-only picker, as discussed in the earlier reports |
Reserve continuation is the preceding workflow |
| Regular allowance and Reserve both exhausted |
Other models become selectable again |
Send remains disabled after changing the selection — the new observation |
This is a separate observed UI/integration compatibility problem, not an implementation request for #4869. It does not yet establish whether the defect is in Desktop, app-server state, or how the OpenCodex integration is represented to the client.
Expected behavior: exhausted native models should remain subject to their real limits. When the selected model is an independently authenticated OpenCodex route with valid credentials and remaining provider capacity, its submission availability should not be inferred solely from exhausted native ChatGPT/Reserve allowances. If Desktop cannot support that distinction, it should communicate the client-wide limitation and an actionable supported alternative rather than make selection appear to restore usability.
The exact replacement model ID and its independent availability still need a controlled check. This report does not claim that every selectable model is entitled or that an exhausted native account should be allowed to send.
Reproduction
Reported sequence, not an independently reproduced laboratory test:
- Use Codex Desktop with OpenCodex-connected models.
- Exhaust the ordinary Codex allowance and enter the Luna Reserve workflow.
- Continue until the Luna Reserve allowance is exhausted as well.
- Open the model picker again. Other models can now be selected.
- Select another model and attempt to send a message.
- Observe that the Send button remains disabled and the message cannot be submitted through that button.
The distinguishing boundary is step 3: Reserve available → Reserve exhausted while ordinary usage is still exhausted. Testing only ordinary-quota exhaustion misses this second failure state.
Before attributing the disabled state to quota handling, a controlled reproduction should also confirm a non-empty text-only prompt, no pending attachment validation, no active/stuck turn or approval dialog, and a connected app-server. Keyboard-submit behavior, fresh-thread behavior, restart behavior, and provider reachability have not yet been verified for this observation.
Version
The installed OpenCodex version and exact Codex Desktop/app-server build have not yet been captured for this observation.
Source-analysis references, not claims about the installed binaries:
- OpenCodex
dev resolved to 7868f5df570e5f5fb4be3a4b79b7e83526894e5f during this investigation.
- Public Codex source inspected at
b0659c53865dd48b0cd69c454368cea3980017cc.
The older e18ca246... review baseline in #4869 should not be substituted for the installed version or assumed to remain the current dev tip.
Operating system
Not yet recorded for this specific observation. No OS/build is inferred from other reports or source-analysis environments.
Provider and model
The transition involves the native gpt-reserve / Luna Reserve state. The exact model selected after the picker reopens has not yet been recorded.
Please distinguish an independently credentialed provider/model from another native model using the same exhausted ChatGPT allowance. Both the selected model slug and the effective Codex model_provider/auth mode matter; a model-label change alone does not prove that the client changed its account context.
Logs or error output
No redacted ingress capture, HTTP status, or exact client error text is attached yet. The observed failure is a disabled Send button, not a demonstrated HTTP 429 after submission.
Request arrival at OpenCodex remains unverified. A disabled button suggests a pre-dispatch block, but absence from a particular request log is not proof unless that log covers the actual HTTP/WebSocket ingress. Keyboard submission and Desktop-to-app-server submission need to be checked separately.
Screenshots and supporting files
No screenshot or recording is attached. The following source references inform the investigation; they are not substitutes for a capture from the affected Desktop build.
Source findings and their limits
-
An existing Desktop investigation provides a plausible explanation for the picker reopening. The repository's recorded analysis of Desktop 26.901.22334 / build 7746 says active Reserve requires ordinary usage to be disallowed, the gpt-reserve additional allowance to be allowed, and the relevant banner/eligibility conditions. It also records a Reserve-only picker while that state is active. Inference: if the additional Reserve allowance stops being allowed, that particular picker restriction can cease to apply even though ordinary usage has not recovered. The cited record does not establish the Send-button predicate, and it is not an inspection of my currently installed Desktop bundle.
-
Public Codex TUI code separates submission handling from model selection. In input_submission.rs, submit_user_message_with_prepared_images queues input rather than dispatching it while input_queue.rate_limit_recovery_pending is set. In rate_limits.rs, finish_rate_limit_recovery clears that hold separately and returns early while waiting for Reserve. These are TUI reference paths, not proof that Desktop uses the same fields or has the same defect. They support investigating submission/recovery state independently instead of assuming picker availability means submission readiness.
-
The effective provider/auth context is a separate integration variable. OpenCodex's buildProviderTableBlockForTarget writes requires_openai_auth = false only for the effective Desktop-authless target. A comparison with an effective independent-provider configuration may help localize the issue, but authless is a separate workflow, not a proven fix for this report.
Working hypothesis, not a confirmed root cause: the Reserve-specific picker restriction is released when Reserve is no longer available, while a separate native-quota submission guard or stale recovery state still blocks the composer. Switching the displayed model may not update the scope or invalidation of that submission guard.
Focused investigation / acceptance criteria
- Compare the last Reserve-available state with the first both-exhausted state. Record the relevant regular/Reserve permission booleans, selected model ID, effective provider/auth mode, and the actual reason the composer is disabled. Do not assume a displayed percentage alone establishes authorization.
- Trace whether selecting a routed model updates only the picker value or also the state used by submission validation. Distinguish a deliberate native-account block from stale state, a failed selection update, or another composer prerequisite.
- Verify the exact selected independent provider through a separate, minimal, explicitly authorized request using its own credentials. A successful control would distinguish provider availability from Desktop submission gating; no such successful control is claimed here.
- Trace Desktop → app-server submission and the actual OpenCodex ingress, including WebSocket traffic if used. If submission arrives, record the incoming model before normalization and local refusal/dispatch outcome. If it never arrives, proxy-side request remapping cannot affect that state.
- Compare the affected existing thread with a fresh thread and, separately, a complete client restart. An effective authless setup can be a separate control only with explicit consent for its configuration/history implications. Do not silently change the reporter's workflow during diagnosis.
- A supported resolution should let an independently authorized route submit without restoring native quota, or clearly document the specific unsupported client/build state. Verify both quota-exhaustion transitions and recovery, not only that the picker is visible.
Publish only a minimal redacted summary. Do not attach raw prompts, request bodies, credentials, cookies, account/session/thread identifiers, or unrestricted usage responses. This investigation does not call for spending reset credits, patching quota responses, disabling authorization, or silently sending conversation data to another provider.
Relationship to the existing issues
Please track the post-Reserve-exhaustion submission state separately during triage, even if it ultimately belongs upstream. A client-side diagnosis would be a useful outcome; it should not be reported as a proxy fix without evidence.
Redacted configuration
No configuration dump is attached yet. The effective model_provider, requires_openai_auth, proxy topology, selected routed model ID, and whether Desktop-authless is actually applied need to be captured without secrets.
Verification status: this is a reporter-observed symptom with AI-assisted source analysis. The state transition above is the observation; the proposed cause, request arrival, provider control test, and any workaround remain unverified. No implementation PR or successful end-to-end fix is claimed.
Checks
Client or integration
Codex App
Area
Catalog / models
Summary
I observed a further state transition in the Codex Desktop + OpenCodex workflow discussed in #2813, #4076, and #4869:
After both the regular Codex allowance and the Luna Reserve allowance are exhausted, I can select another model again, but the Send button remains disabled, so I cannot submit a message.
The distinction is important: the picker is no longer the visible blocker. Model selection becomes possible again without restoring the ability to send.
This is a separate observed UI/integration compatibility problem, not an implementation request for #4869. It does not yet establish whether the defect is in Desktop, app-server state, or how the OpenCodex integration is represented to the client.
Expected behavior: exhausted native models should remain subject to their real limits. When the selected model is an independently authenticated OpenCodex route with valid credentials and remaining provider capacity, its submission availability should not be inferred solely from exhausted native ChatGPT/Reserve allowances. If Desktop cannot support that distinction, it should communicate the client-wide limitation and an actionable supported alternative rather than make selection appear to restore usability.
The exact replacement model ID and its independent availability still need a controlled check. This report does not claim that every selectable model is entitled or that an exhausted native account should be allowed to send.
Reproduction
Reported sequence, not an independently reproduced laboratory test:
The distinguishing boundary is step 3: Reserve available → Reserve exhausted while ordinary usage is still exhausted. Testing only ordinary-quota exhaustion misses this second failure state.
Before attributing the disabled state to quota handling, a controlled reproduction should also confirm a non-empty text-only prompt, no pending attachment validation, no active/stuck turn or approval dialog, and a connected app-server. Keyboard-submit behavior, fresh-thread behavior, restart behavior, and provider reachability have not yet been verified for this observation.
Version
The installed OpenCodex version and exact Codex Desktop/app-server build have not yet been captured for this observation.
Source-analysis references, not claims about the installed binaries:
devresolved to7868f5df570e5f5fb4be3a4b79b7e83526894e5fduring this investigation.b0659c53865dd48b0cd69c454368cea3980017cc.The older
e18ca246...review baseline in #4869 should not be substituted for the installed version or assumed to remain the currentdevtip.Operating system
Not yet recorded for this specific observation. No OS/build is inferred from other reports or source-analysis environments.
Provider and model
The transition involves the native
gpt-reserve/ Luna Reserve state. The exact model selected after the picker reopens has not yet been recorded.Please distinguish an independently credentialed provider/model from another native model using the same exhausted ChatGPT allowance. Both the selected model slug and the effective Codex
model_provider/auth mode matter; a model-label change alone does not prove that the client changed its account context.Logs or error output
No redacted ingress capture, HTTP status, or exact client error text is attached yet. The observed failure is a disabled Send button, not a demonstrated HTTP 429 after submission.
Request arrival at OpenCodex remains unverified. A disabled button suggests a pre-dispatch block, but absence from a particular request log is not proof unless that log covers the actual HTTP/WebSocket ingress. Keyboard submission and Desktop-to-app-server submission need to be checked separately.
Screenshots and supporting files
No screenshot or recording is attached. The following source references inform the investigation; they are not substitutes for a capture from the affected Desktop build.
Source findings and their limits
An existing Desktop investigation provides a plausible explanation for the picker reopening. The repository's recorded analysis of Desktop
26.901.22334/ build7746says active Reserve requires ordinary usage to be disallowed, thegpt-reserveadditional allowance to be allowed, and the relevant banner/eligibility conditions. It also records a Reserve-only picker while that state is active. Inference: if the additional Reserve allowance stops being allowed, that particular picker restriction can cease to apply even though ordinary usage has not recovered. The cited record does not establish the Send-button predicate, and it is not an inspection of my currently installed Desktop bundle.Public Codex TUI code separates submission handling from model selection. In
input_submission.rs,submit_user_message_with_prepared_imagesqueues input rather than dispatching it whileinput_queue.rate_limit_recovery_pendingis set. Inrate_limits.rs,finish_rate_limit_recoveryclears that hold separately and returns early while waiting for Reserve. These are TUI reference paths, not proof that Desktop uses the same fields or has the same defect. They support investigating submission/recovery state independently instead of assuming picker availability means submission readiness.The effective provider/auth context is a separate integration variable. OpenCodex's
buildProviderTableBlockForTargetwritesrequires_openai_auth = falseonly for the effective Desktop-authless target. A comparison with an effective independent-provider configuration may help localize the issue, but authless is a separate workflow, not a proven fix for this report.Working hypothesis, not a confirmed root cause: the Reserve-specific picker restriction is released when Reserve is no longer available, while a separate native-quota submission guard or stale recovery state still blocks the composer. Switching the displayed model may not update the scope or invalidation of that submission guard.
Focused investigation / acceptance criteria
Publish only a minimal redacted summary. Do not attach raw prompts, request bodies, credentials, cookies, account/session/thread identifiers, or unrestricted usage responses. This investigation does not call for spending reset credits, patching quota responses, disabling authorization, or silently sending conversation data to another provider.
Relationship to the existing issues
gpt-reserve; the exact-match remapping assumption must not be carried over without checking.Please track the post-Reserve-exhaustion submission state separately during triage, even if it ultimately belongs upstream. A client-side diagnosis would be a useful outcome; it should not be reported as a proxy fix without evidence.
Redacted configuration
No configuration dump is attached yet. The effective
model_provider,requires_openai_auth, proxy topology, selected routed model ID, and whether Desktop-authless is actually applied need to be captured without secrets.Verification status: this is a reporter-observed symptom with AI-assisted source analysis. The state transition above is the observation; the proposed cause, request arrival, provider control test, and any workaround remain unverified. No implementation PR or successful end-to-end fix is claimed.
Checks