
Codex Compaction Failures: Stuck Turns and Lost Queue Input
A closed background-compaction channel could leave a Codex app-server turn stuck in progress; learn the reported recovery steps and the fix associated with PR 55581, whose release availability is still unclear. We also cover an open report of queued input disappearing when pre-turn compaction is interrupted, plus notes on CLI voice disconnects, installer download-host selection, and GPT 5.5 retirement.
Chapter 1
When compaction fails inside the app server
Ethan Park
Morning, everyone. Thanks to Jellypod for helping make this daily show a reality. Today we're staying on one topic: what happens to your turn when context compaction goes wrong in the Codex app server. Two reports from the last week point at the same corner of the system, and one of them has a fix.
Maya
Start with the fixed one. It's issue 54897, reproduced on the 0.164.0 alpha 3 macOS arm64 binary against a loopback Responses backend. The symptom is a turn that stays inProgress with error null, forever. The reporter waited 30 seconds and saw no terminal event.
Ethan Park
The mechanism is small. Codex can compact context in the background. There's a function called take_ready that polls a one shot channel for the background result. It called try_recv and then dot ok with a question mark. If the channel was Closed, meaning the background task had already failed, it returned early without clearing the stored receiver. Later, when foreground compaction needed to wait, it polled that already completed receiver and panicked with "called after complete."
Maya
And the process doesn't die, which is the nasty part. The panic kills the task, not the server. So your client sees a turn that never finishes. The reporter also found that sending another turn/start returned the same turn ID without making a model request. So retrying doesn't help.
Ethan Park
The reproduction is worth knowing because it tells you when you'd hit this. Async compaction enabled, context window set to 100,000, auto compaction limit at 90,000. A response reports 70,000 tokens, which crosses the default 65 percent threshold and starts background compaction. Then that background stream closes before response.completed. The reporter says it also reproduces with an HTTP 400 or with missing compaction output. Next, a response reports 91,000 tokens, foreground compaction is required, and the panic fires. Those counts are synthetic, but the app server code was unmodified.
Maya
The recovery is concrete. Call turn/interrupt on the stuck turn, then start a new turn, and the thread works again. Other threads were unaffected the whole time. The issue closed on October 20, and the reporter wrote that it was fixed by pull request 55581. The source I have doesn't say which release carries it, so check your version rather than assuming. The stable npm tag was still 0.163.0 at last look, with 0.164.0 alphas shipping nearly every few hours.
Ethan Park
Now the open one, issue 54822, and this one matters if you build on thread/queue/add. The reporter shows that an input accepted by that call can vanish from both the queue and persisted history when pre turn compaction is interrupted. They tested 0.163.0 and 0.164.0 alpha 3, and saw the same on 0.162.1.
Maya
Walk through the sequence, because it's precise. Seed message goes in through thread/queue/add and completes. A second message is queued with a unique clientUserMessageId. The client waits for an item/started event of type contextCompaction, then calls turn/interrupt on that turn. After the turn completes as interrupted, and even after restarting the app server, the follow up is gone. The queue holds zero entries, there are zero matching user messages, and the raw rollout doesn't contain the client ID or the text. The seed message survives.
Ethan Park
Two caveats from the report itself, and they matter. First, the reporter forced the boundary by setting model_auto_compact_token_limit to 1 and project_doc_max_bytes to 0, so this doesn't establish how often it happens at default settings. Second, it ran on Windows through a Responses compatible gateway, not direct OpenAI authentication, and the reporter says a direct run hasn't been done. They also say the exact Rust cancellation path isn't instrumented, so no root cause is proven.
Maya
So what do you do today? This part is my interpretation, not from the issue. If your integration interrupts during a contextCompaction item, don't assume an accepted queue add is durable. Before resubmitting, page through thread/turns/list and look for your clientUserMessageId. The issue's expected behavior says recovery shouldn't force a client to blindly resend work that may have executed, so checking first is the cautious path.
Ethan Park
One more detail: a related fix, 53932, preserves history when compaction fails. The alpha tested already included it and still lost the input. So that fix protects the history, but not this window.
Chapter 2
Smaller things worth a look
Maya
A few smaller items. First, if /voice in the CLI disconnects almost immediately, issue 55531 has a detailed write up on macOS. The CLI shows "voice audio session stopped unexpectedly" or transport_closed. The reporter captured the underlying error on the WebRTC data channel, usage_check_failed, which the native helper ignores. It reproduced across 0.162.1, 0.163.0 and 0.164.0 alpha 6.
Ethan Park
And be careful with what it proves. The reporter's strongest guess is a service side usage or entitlement check, but they say the internal reason and affected scope are unknown. Ordinary usage showed as allowed in the same account. Text mode keeps working, and it's the only fallback found so far. Downgrading, TCP only and IPv4 only didn't help.
Maya
Second, the standalone installers. Per the 0.163.0 package readme, they download from releases.openai.com by default and fall back to GitHub Releases if metadata or an asset download fails. To force GitHub, set CODEX_INSTALLER_USE_RELEASES_OPENAI_COM to false. Zero and no are also accepted. On Mac or Linux, put it in front of the shell in the curl pipe. On Windows, set it in PowerShell before running the install script. That's useful if your network allows one host and not the other.
Ethan Park
Third, a date to check against your configs. The changelog says GPT 5.5 retired from Codex on October 14, at noon Pacific, for users signed in with ChatGPT. API key sessions and the OpenAI API aren't affected. The suggested replacement is GPT 6.1 Sol, when available to your plan and client. So search workspace defaults, managed configurations, custom agents, scheduled tasks and scripts for any leftover 5.5 selection.
Maya
That's the roundup. Interrupt a stuck turn before you retry it, and verify queued input before you resend it.