[macOS][Remote iOS] Desktop-created active threads are listed but fail to load due to an active-writer conflict

Open 💬 2 comments Opened Aug 25, 2026 by ZTXZ416
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

What version of Codex is running?

  • ChatGPT desktop app: 26.818.61809
  • Desktop-bundled Codex runtime: codex-cli 0.149.0-alpha.4.3
  • Persistent Remote app-server: 0.149.1

What platform are you using?

  • Host: macOS 26.5.2, Apple Silicon
  • Client: ChatGPT iOS Remote Control (exact mobile app version was not captured)

What issue are you seeing?

A thread created and actively running in the macOS desktop app is visible in the iOS Remote thread list, including its title and changed-file summary. However, opening that thread on iOS fails with “Error loading messages.”

This is not a general connectivity failure:

  • the Mac remains awake and online;
  • the Remote persistent app-server is running;
  • the control socket exists;
  • codex doctor reports the Remote WebSocket connected with HTTP 101 Switching Protocols;
  • the desktop-created thread remains visible in the iOS list;
  • threads created from iOS Remote load normally.

At the exact time the iOS client attempted to open the desktop-created thread, the persistent Remote app-server repeatedly logged:

failed to initialize thread persistence: thread-store conflict: thread <redacted> already has an active writer
Failed to create session: thread-store conflict: thread <redacted> already has an active writer

The conflict was emitted repeatedly while the desktop app-server was the active writer for the same rollout file. The rollout file continued to grow normally on disk, and the state databases passed integrity checks, so there is no evidence that the thread data is missing or corrupt.

The Remote-side thread inventory reported the thread as notLoaded: metadata was available, but its messages could not be loaded.

Steps to reproduce

  1. On macOS, enable Remote Control and keep the Mac awake and online.
  2. Create a new local thread in the ChatGPT/Codex desktop app.
  3. Start a long-running turn so the desktop app-server remains the active writer.
  4. Open ChatGPT on iOS and go to Remote.
  5. Confirm that the desktop-created thread appears in the thread list.
  6. Open that thread while the desktop turn is still running.
  7. Observe “Error loading messages” on iOS.
  8. Inspect the persistent Remote app-server log and observe the already has an active writer / Failed to create session errors.

Expected behavior

Remote should be able to display the history and live progress of a desktop-owned active thread without attempting to acquire a second writer.

If interaction requires writer ownership, Remote should either perform an explicit ownership handoff or enter a stable read-only/follower state. Merely opening an active thread for monitoring should not fail to load its messages.

This is also the behavior implied by the Remote documentation, which says existing chats on the connected host can be continued and reviewed from the phone:
https://learn.chatgpt.com/docs/remote-connections

Why this appears distinct

  • #37403 reports the opposite handoff direction: a Remote/CLI-owned thread cannot be resumed by Desktop.
  • #40167 reports an active CLI thread that cannot be displayed on iOS Remote.
  • This report confirms the Desktop-app-to-iOS direction with a desktop-bundled app-server as the active writer, while the iOS client can still list the thread metadata.

Together these reports suggest that Remote is trying to initialize writable thread persistence even when it only needs to read and display an active thread owned by another app-server.

Additional diagnostics

codex doctor also reported:

Background Server
  app-server: running (persistent mode)
  status: running
  app-server version: 0.149.1

Connectivity
  websocket: connected (HTTP 101 Switching Protocols)

There is a runtime-version difference between the desktop-bundled Codex runtime (0.149.0-alpha.4.3) and the persistent Remote app-server (0.149.1). I cannot establish whether that mismatch is causal, but it may be relevant to ownership/handoff behavior.

Privacy

The username, repository path, project name, exact thread ID, conversation contents, and raw logs are intentionally omitted. Sanitized diagnostics can be provided if maintainers need them.

View original on GitHub ↗

2 Comments

github-actions[bot] contributor · 3 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #40167

Powered by Codex Action

nos1609 · 22 hours ago

A fresh Windows Desktop -> Linux Remote SSH reproduction shows the same underlying follower/ownership failure, with additional evidence that the thread data and live writer are healthy.

Environment:

  • Codex Desktop: 26.820.9563.0 on Windows ARM64.
  • Remote Codex CLI/app-server: 0.149.1 on Linux.
  • Affected thread ID: 019ee6ac-9514-7a21-b8fe-913884f7b98d.

Observed behavior:

  1. The remote thread had a live active writer and its rollout continued to grow.
  2. A full snapshot contained about 380 MB and 98,239 valid JSONL records, with zero invalid JSON lines. The session ID matched the requested thread.
  3. The remote thread-store row and the Desktop remote-thread catalog both pointed to the existing thread and rollout. Database integrity checks passed.
  4. Desktop listed the thread as active, and first-party task APIs could read it and observe fresh progress from the active turn.
  5. Opening the same thread in Desktop first produced no rollout found for thread id .... A later navigation reported success but the renderer remained indefinitely on “Loading task…”.
  6. The current Desktop navigation did not produce a corresponding thread/read or thread/resume request in the remote app-server log.
  7. Opening the thread in the VS Code client showed “This chat is open in another application”.
  8. Historical attempts against the same live rollout did reach app-server and failed with thread-store conflict: ... already has an active writer.

This is not a missing-rollout or corrupted-JSONL case. It also is not necessarily a stale lock: the existing owner was alive and continued writing. The failure is that another first-party client cannot attach as a read-only follower, and one Desktop path can fail before it even sends a read/resume request to the remote host.

Expected behavior:

  • A client that only opens an active thread should attach as a follower without acquiring a second writer.
  • If the user starts a write from another client, Codex should perform an explicit ownership handoff or offer a clear “Take over here” action.
  • Desktop should not report no rollout found when its own catalog and task APIs can resolve the valid rollout.
  • A navigation call must either issue the remote read/resume request or return a specific failure instead of leaving the renderer on an infinite loading state.

No repository name, project title, username, hostname, address, filesystem path, prompt content, or raw log is included.