Codex Desktop remote loading disconnects when thread/read exceeds remote-control envelope limit
Summary
Opening a large task through a Codex Desktop remote connection causes the app-server to disconnect/reconnect instead of paging the task history. This makes the remote host briefly unavailable and the client can show Conversation state not found.
Related transport/backpressure discussion: #27592
Related long-thread performance report: #21134
Environment
- Host and client: macOS
- Codex Desktop / ChatGPT unified app
- Bundled app-server observed:
0.146.0-alpha.9.2 - Remote-control connection to an always-on Mac mini
Reproduction
- Use a task whose rollout JSONL has grown large.
- Connect to the Mac host from another Mac using Remote.
- Open that task from the sidebar.
- With a roughly 615 MiB rollout containing 4,735 items, loading fails and the remote host briefly becomes unavailable.
Sanitized evidence
- Tiny task:
thread/readsucceeded in 1.42 seconds. - 92 MiB task:
thread/readsucceeded in 3.97 seconds with 11,542 items. - 615 MiB task: after 7.74 seconds, the app-server became unavailable.
- The host log sequence included:
Resumed rollout with 4735 itemsdropping remote-control server envelope that exceeds reassembled size limit- remote connection reinitialization
Conversation state not found- Local SQLite/list queries were fast and an ordinary warm remote list was about 2 seconds, so this does not appear to be a network or SQLite bottleneck.
- The app-server exposes paginated
thread/turns/listandthread/items/listAPIs, but remote opening appears to hydrate through a fullthread/read.
Expected behavior
The remote client should load the newest turns/items first and page older history without exceeding the transport envelope. Oversized tasks should remain openable in a partial-history mode.
Actual behavior
A full read exceeds the remote-control envelope limit, disconnecting the app-server/remote host and leaving the UI with Conversation state not found.
Workaround
Create a fresh successor task with a concise handoff, archive the old task, and avoid forking because a fork copies the oversized history.