[Windows][Mobile Remote Control] Sending a message can create an unmaterialized ghost thread that cannot be resumed or archived
Summary
When sending a message from ChatGPT mobile Remote Control to Codex Desktop, an intermittent failure can leave a task placeholder in the desktop sidebar without a corresponding thread record or rollout. The task then cannot be resumed or archived, and it remains visible after restarting the computer.
Environment
- Codex Desktop: 26.814.5167.0
- Bundled Codex CLI: 0.148.0-alpha.15
- Windows: 10.0.26200.9168
- Local projects hosted in WSL
Steps to reproduce
- Run Codex Desktop on Windows with a local WSL-backed project.
- From ChatGPT mobile Remote Control, open/control the desktop Codex task.
- Send a message. The issue is intermittent.
- A new task placeholder appears in the Codex Desktop sidebar.
- Open or resume that task.
- Try to archive it.
Observed behavior
- Opening/resuming fails with:
````
no rollout found for thread id <thread-id>
- Archiving fails with the same missing-rollout condition, so the task remains in the sidebar.
- Restarting Codex Desktop or rebooting the computer does not remove it.
- This has occurred three times across two local projects.
- Local inspection showed:
- no matching row in the thread state database;
- no matching rollout JSONL;
- logs for
method=thread/resumewith error code-32600andfailureReason=rollout_not_found.
This appears to be a partially created/unmaterialized task: the sidebar entry becomes visible even though the backing thread and rollout were never committed.
Expected behavior
- A message sent through mobile Remote Control should atomically create/materialize the thread and rollout before the task is exposed in the desktop sidebar.
- If creation fails, the incomplete sidebar placeholder should be discarded automatically.
- Archive/delete should be able to clean up a placeholder whose rollout is missing.
Workaround
I was able to remove each ghost task only by manually synthesizing a minimal placeholder rollout and database entry, then archiving it through Codex Desktop. This should not be necessary and risks local state corruption if attempted by users.
Related issues
- #33120
- #37058
Privacy note
No conversation transcripts, complete thread IDs, local project paths, or full log files are included in this report.
4 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Hi @WangLufei233, your report looks related to a local session discovery/inventory gap rather than necessarily a lost rollout. I've released Codex Rescue Alpha5, a local read-only diagnostic tool that performs filesystem-first discovery across active and archived rollouts and cross-references SQLite/index metadata without modifying any state.
If you still have the affected local Codex directory, you can inspect it via:
No raw files or databases are needed. If you choose to share output, please review and sanitize any private repository paths or names first.
if I pair both devices using method in this thread, it seems like I can use it without creating a ghost thread anymore.
Second partial-creation shape: state row and shell snapshot committed, but rollout never materialized
I observed a related ghost task from Windows Desktop against an SSH-backed Linux app-server. This variant is useful because it captures a different transaction boundary from the original report.
Environment
26.825.4187.0codex-cli 0.150.0-alpha.12.2codex-cli 0.150.1thread/startlog identified the Desktop client as26.825.32147vscodepaginatedImmediate post-failure evidence
The UI created/opened a task placeholder, but no message could be submitted. Read-only inspection immediately after the failure found:
threadsstate row for the generated task ID;rollout_pathstored in that row;has_user_event = 0;tokens_used = 0;thread_turns = 0;thread_items = 0;thread_realtime_items = 0;thread_history_projection_state = 0.The app-server log contains the beginning of
thread/start, including successful configuration resolution and successful creation of a shell snapshot. It contains no later completion, error, or usable thread response for that request.The shell snapshot was approximately
630 KB. Therefore, creation progressed far enough to persist both task metadata and an auxiliary artifact, but stopped before writing the rollout's initialsession_meta.The first native read reported an invalid paginated lineage with a missing source rollout. A later read-only check, after runtime cleanup, found that the state row and shell snapshot had been removed and the task became completely unresolvable. No persisted user content was present at any stage.
Why this differs from the original report
The original report found a visible placeholder with no matching thread-state row. In this reproduction, the state row and shell snapshot were briefly committed, while the canonical rollout was absent. Both shapes point to non-atomic task creation, but this one narrows the failure window to after metadata/snapshot persistence and before rollout materialization or successful
thread/startcompletion.Expected behavior
thread/startshould be atomic from the client perspective:session_meta;If any step fails or the client disconnects, Codex should roll back the provisional row and artifacts before exposing the task. The client should receive a terminal creation error and retain the unsent composer text.
Actual behavior
Desktop can expose a task whose state row points to a nonexistent rollout. The task cannot accept input, read operations fail with lineage/missing-rollout errors, and later cleanup can make the same task ID disappear entirely.
A regression test should inject cancellation between shell-snapshot creation and rollout creation, then assert that no externally visible task, catalog entry, state row, snapshot, or client binding survives unless the rollout has been materialized.