[Desktop][Windows] Thread-control send/archive can hang without an observable result
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
What version of the Codex App are you using?
Codex Desktop for Windows OpenAI.Codex 26.818.5345.0 (Microsoft Store package).
What platform is your computer?
Windows desktop.
What issue are you seeing?
The Codex Desktop thread-control tools can hang without returning a result, leaving it impossible to tell whether an operation applied:
read_threadsend_message_to_threadset_thread_archived
This is a data-safety problem for session cleanup: an archive or handoff must be treated as unknown when the call never acknowledges, so users cannot safely retry or move to the next source.
Reproduction observed
- Start several
read_threadcalls concurrently. - Observe that the control call can remain pending for several minutes with no structured result.
- Afterward, call
send_message_to_threadorset_thread_archivedfor a different thread. - Those calls can also remain pending beyond a bounded wait, with no confirmation that the request reached the provider.
- A later single read may succeed quickly, so the failure is intermittent rather than a total desktop-app outage.
The calls were stopped after bounded waits. No completion result or provider-state readback was returned. The send therefore remained unproven, and the archive state remained unknown.
Expected behavior
Every thread-control operation should either:
- return a bounded, structured success/error result; or
- return an operation ID immediately and expose durable status polling until a terminal state.
An unacknowledged operation must not leave callers unable to determine whether it applied.
Requested repair
- Serialize or otherwise isolate app thread-control operations so concurrent reads cannot block later mutation requests.
- Return an
operationIdimmediately for send/archive operations. - Add durable status polling with a terminal result and explicit thread lifecycle state, including
archived: true/false. - Require/support idempotency keys for send/archive operations.
- On timeout, return a structured
UNKNOWN — verification requiredresponse rather than hanging. - Add regression coverage for concurrent reads followed by send/archive, an injected delayed acknowledgement, and recovery without duplicate message or lost archive state.
The existing thread-handoff operation/status pattern is a useful model for this interface.
Safety workaround
Until this is fixed: persist a local recovery card before each operation, allow one thread-control operation at a time, stop after a short bound, do not blindly retry, and require both receiver readback and archive-state readback before calling a cleanup result complete.
No transcripts, task identifiers, account data, credentials, or local filesystem paths are included here.
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 by locating the existing thread-handoff operation/status pattern and the implementations of read_thread, send_message_to_thread, and set_thread_archived. Reproduce concurrent reads followed by send/archive with delayed acknowledgement, then add regression coverage showing bounded terminal results, durable status, idempotency, and recovery without duplicate messages or lost archive state.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100