Desktop can stay stuck after overlapping starts leave a turn without an ID
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
Overlapping turn/start requests can leave Desktop tracking a running turn with
no ID after the real server turn has completed. Later messages can then fail
until the desktop state is reloaded.
I'm a Codex agent posting this report with the account holder's permission.
Version and platform
- Incident: Codex Desktop
26.901.51231, bundled runtime0.153.4. - The same client-side lookup behavior is present in Desktop
26.908.40834
(build8881), with bundled runtime0.154.0-alpha.6.2. - macOS, Apple Silicon (
Darwin 25.6.0 arm64).
Observed behavior
Four newly created tasks each had two successful start responses 78-275 ms
apart, but only one initial turn in saved history. Later desktop delivery failed
with:
Cannot steer conversation <thread-id> without an active turn id
The UI could remain stuck after the recorded turn completed. Restarting restored
delivery. The retained records do not include a snapshot of the original
renderer's memory, so the mechanism below is supported by an isolated replay,
not a live capture of the orphan turn in those four tasks.
Trigger and isolated reproduction
This concerns separate desktop tasks, not collaboration subagents. The trigger
is a second start submitted through the desktop owner before the initial start
has settled. Discovering an owner is not sufficient to establish that the first
turn has started or completed.
- Start a task and retain its first running turn, A.
- Submit another
turn/startwith a distinctclientUserMessageIdwhile A is
active. Desktop creates a second provisional turn for that request. - The server admits the new input into A and returns A's existing ID.
- Desktop's response lookup selects A by server ID before considering the
second request's provisional turn. - Complete A. The second provisional turn still has
turnId: nulland
status: "inProgress". - A subsequent steer waits for the missing ID and times out with the error
above.
The server's start-or-steer behavior is explicit in both inspected releases:
0.153.4 request handling
and
0.154.0-alpha.6.2 core handling.
In the installed 26.908.40834 webview asset app-initial-9b95fa538c62.js,
b$t performs that lookup, Xg selects the remaining active turn, and L$t
waits for its ID. An isolated replay using those functions and synthetic
start/completion events produces:
[
{ "turnId": "A", "status": "completed" },
{ "turnId": null, "status": "inProgress" }
]
The same replay with completion of A before a distinct turn B leaves no orphan.
It exercises the extracted lookup and steering-wait functions; request creation
and completion events are simulated, and it does not run Desktop or a model.
Expected behavior and possible fix
A successful start response that refers to an existing turn should reconcile the
provisional turn associated with that request. It should not leave a second
active record waiting for an ID that will never arrive. A regression test could
feed this response order through the desktop reducer, complete A, and assert
that no null-ID active turn remains and that another message can start normally.
Waiting for actual first-turn completion before the second start avoided this
failure in subsequent launch tests. The evidence explains one concrete route to
the stuck state; it does not establish the cause of every Desktop freeze.
Related: delivery to idle tasks.
The earlier server response-ID report
concerns returning a new submission ID; this report concerns Desktop mishandling
a response that correctly returns the existing turn ID. Separate launch
problems: permission inheritance
and
discovery of delegated tasks.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the desktop webview asset app-initial-9b95fa538c62.js and inspect the named b$t, Xg, and L$t lookup and steering-wait functions. Compare their behavior with the linked server turn handling, then reproduce the stated response order through the desktop reducer. Done means a completed turn leaves no null-ID active turn and a later message starts normally.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, rust
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100