[app][macOS][26.810.41047] Realtime voice leaves an orphan thread that cannot be opened, archived, or deleted
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.5k
- PR merge metrics
- PR metrics pending
Description
App version
ChatGPT/Codex Desktop 26.810.41047 (build 6570)
Subscription
ChatGPT Pro
Platform
macOS 26.4.1 (25E253), Apple Silicon arm64
Issue
A realtime voice conversation left a visible orphan entry in the Codex task sidebar. The entry cannot be opened, archived, or deleted.
Opening it shows:
Failed to resume conversation
failed to resolve rollout path `<CODEX_HOME>/sessions/2026/08/14/rollout-...jsonl`: file does not exist
Local inspection confirms an inconsistent state:
- no matching rollout exists under
sessions/orarchived_sessions/; - no matching row exists in
state_5.sqlite.threads; - the app's global UI state still contains the thread ID in the projectless-thread list, permission state, thread-reference capability, and output-directory map;
- the desktop logs repeatedly report
failureReason=rollout_not_foundandthread not loaded; - removing those stale UI references while the app is running does not work because the app writes them back.
Steps to reproduce
- Start a new realtime voice conversation in Codex Desktop.
- End or leave the voice conversation.
- Observe that the voice-created task remains in the sidebar.
- Try to open, archive, or delete the task.
The exact creation condition may be intermittent. Multiple realtime voice conversations have shown similar cleanup problems.
Actual behavior
The sidebar retains a task whose backing rollout and database record do not exist. Selecting it repeatedly attempts hydration and shows a recovery error. Because the thread cannot be loaded, normal archive/delete controls cannot clean it up.
Expected behavior
Realtime voice startup and shutdown should be transactional:
- materialize the thread, database row, and rollout before exposing it as a normal task; or
- if creation or shutdown fails, remove all provisional UI/index state;
- when hydration detects
rollout_not_found, offer a safe "Remove stale entry" action rather than leaving an undeletable sidebar item.
Related issue
This appears related to #35252, which reports failed cleanup of an unmaterialized provisional realtime voice thread on Windows. This report covers a macOS variant where the provisional entry survives as an orphan after both the rollout and database row are absent.
Privacy
The public report intentionally omits the account ID, full local username/path, conversation contents, exact thread ID, and contact email. These can be provided privately to OpenAI Support if required.
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 reproducing the intermittent realtime voice lifecycle and tracing how the thread is written to global UI state, state_5.sqlite.threads, and the sessions or archived_sessions paths. Compare the macOS behavior with related issue #35252 and inspect handling of rollout_not_found; done means failed voice creation or shutdown cannot leave an undeletable sidebar entry and stale entries can be safely removed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, rust
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100