You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Windows][Mobile Remote Control] Sending a message can create an unmaterialized ghost thread that cannot be resumed or archived #39182
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/resume with error code -32600 and failureReason=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.
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:
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.
The thread/start log identified the Desktop client as 26.825.32147
Task source recorded as vscode
Requested history mode: paginated
Immediate post-failure evidence
The UI created/opened a task placeholder, but no message could be submitted. Read-only inspection immediately after the failure found:
one threads state row for the generated task ID;
a non-empty rollout_path stored in that row;
has_user_event = 0;
tokens_used = 0;
no model or reasoning value;
no first-user-message or preview text;
the referenced rollout file did not exist;
no matching rollout existed anywhere in active or archived session storage;
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 initial session_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/start completion.
Expected behavior
thread/start should be atomic from the client perspective:
create the initial rollout with session_meta;
commit history/state metadata that references it;
return/expose the task only after those writes succeed.
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.
Activity
github-actions commentedon Aug 18, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
boombx403-byte commentedon Aug 18, 2026
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.
weathon commentedon Aug 26, 2026
if I pair both devices using method in this thread, it seems like I can use it without creating a ghost thread anymore.
nos1609 commentedon Aug 28, 2026
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.