iOS/macOS Remote Control broken after desktop update: host online, mobile 403/offline/stale Plan state

Open 💬 14 comments Opened May 15, 2026 by jjoanna2-debug

What version of the Codex App are you using?

Originally observed on host Codex App 26.513.20950 (bundle 2816).

Still present after updating the host app to 26.513.31313 (bundle 2867) on 2026-05-17.

Current bundled/local CLI observed on the host: codex-cli 0.131.0-alpha.9.

Authoritative release check on 2026-05-17:

  • Latest stable openai/codex GitHub release: rust-v0.130.0, published 2026-05-08.
  • Newest openai/codex alpha release visible in GitHub releases: rust-v0.131.0-alpha.22, published 2026-05-15.
  • Installed host app currently reports 26.513.31313 / 2867.

This report does not claim the mobile path was tested against 0.131.0-alpha.22; it claims the failure remains after updating the installed Codex desktop app available on this host.

What subscription do you have?

ChatGPT Plus

What platform is your computer?

Host: MacBook Pro, Apple M3 Pro, Darwin 25.5.0 arm64 arm

Mobile: ChatGPT iOS app on iPhone 17 Pro Max, iOS 26.5

What issue are you seeing?

ChatGPT iOS Remote Control is not acting like a live control surface for the connected macOS Codex App host.

The host app is online and usable, but iOS shows stale, contradictory, or failed state:

  • iOS can fail to hydrate a thread with Error loading messages: There is a problem with your request. (403, ...).
  • The Codex iOS home screen can show the same host with a red/offline dot.
  • The iOS Connections sheet can show the same Codex Desktop host enabled with the toggle on.
  • The iOS thread list can show a spinner beside the host and pinned-thread placeholders instead of usable content.
  • The desktop Codex app can be open and responsive at the same time, proving the host is not simply down.
  • Push notifications for approval/completion arrive extremely late or not at all.
  • Mobile state lags behind the host session instead of tracking the real session.
  • Context compaction can show Compacting context and still surface Implement this plan?, even though Plan mode was not being used.
  • Plan prompts can stay visible after execution has already started.
  • Plan/approval UI is too faint and oversized to use confidently.
  • Skill picker text is washed out while typing because the overlay is too transparent.

This is not UI polish. Remote Control depends on three things being correct: attention delivery, current session state, and approval routing. If the phone is late, stale, offline while the host is online, or showing the wrong prompt, it cannot supervise long-running Codex work.

Current corroboration

This issue now has multiple independent reports in the comments:

  • Android/app-server: ordinary ChatGPT push works, but app-server/remote-control Codex turns can complete locally without mobile push; the mobile app only catches up after manual reload.
  • ChatGPT mobile + Codex desktop: desktop updates at an acceptable speed while the mobile Codex surface lags far behind.
  • Linux/app-server Plan signal: TUI Plan Mode emits a real TurnItem::Plan, while ChatGPT iOS was reported to send a different implementation phrase and record the mobile-created plan as a normal assistant message. That points to Plan/app-server state-machine divergence, not just a slow UI.

What steps can reproduce the bug?

  1. Open the Codex desktop app on macOS and keep the host online.
  2. Open ChatGPT on iOS.
  3. Connect to the macOS Codex App host.
  4. Start or continue a Codex thread from iOS.
  5. Open existing/pinned threads and observe whether messages hydrate.
  6. Open the iOS Connections sheet and compare the connection toggle/state against the main Codex screen.
  7. Compact an existing chat/context from iOS and observe whether an unexpected Implement this plan? prompt appears.
  8. Trigger an approval or Plan-style prompt and observe readability/staleness.
  9. Start a new thread and type/search until skill suggestions appear.
  10. Leave the phone/host running long enough to observe delayed completion or approval push timing.

What is the expected behavior?

  • If the macOS host is online, signed in, and running Codex App, iOS should not show the same host as offline or stuck loading without an actionable error.
  • Message hydration should either load the thread or show a stable, actionable failure state; it should not leave the phone with a 403 and no recovery path.
  • The main Codex screen, Connections sheet, thread list, and approval UI should agree on host/session state.
  • Push notifications for completion, approval, failure, disconnection, or required input should arrive promptly enough to act on them.
  • Mobile state should track the host session closely enough to use the phone as the control surface.
  • Context compaction should stay in the compaction flow and should not surface a Plan-mode implementation prompt unless the user explicitly asked for Plan mode.
  • Once a plan is accepted and execution starts, the stale Implement this plan? prompt should be consumed.
  • Approval controls and skill results should be readable without guessing.

Related issues checked

Same defect family / supports amending this issue:

  • #22705: iOS opens thread metadata but message hydration fails. The new 403 screenshot is the same class of failure.
  • #22693: iOS reports a run failed after the host-side turn completed.
  • #22800: Android mobile loses active threads after force quit while the host still has them.
  • #22898: mobile shows a running desktop as offline and Reconnect silently does nothing.
  • #23066: stale Implement this plan? prompt blocks steering after execution has already started. It was marked duplicate of this issue.
  • #20930: notifications do not work for remote connections.
  • #11820: earlier request for Codex permission/completion notifications in the ChatGPT phone app.
  • #23134, #22700, #22701, #22714: stale or unremovable mobile connection rows and pairing state divergence.
  • #22715, #22733, #22750, #22851: setup/startup failures where mobile waits for desktop or cannot reach an available host.

Related but narrower / should not be merged into this issue as the main claim:

  • #22864: skill picker can become unreachable behind the iOS keyboard when the composer is long.
  • #23111: Git commit prompt/config does not take effect through iOS Remote Control.
  • #22950: mobile shows only one macOS host and overwrites it with the last active host.
  • #23102: SSH bootstrap/proxy assumptions are fragile on Linux.
  • #23122: Android QR setup opens an unhandled link on ColorOS.

The split is important: this issue is the live-supervision/state-propagation failure across iOS/macOS Remote Control. The other issues are narrower setup, config, keyboard, multi-host, or SSH-bootstrap defects.

Implementation signal

The team marked Remote Control available in preview in #9224 and asked users to file bugs. This is one of those bugs.

A concrete benchmark is Emanuele-web04/remodex: https://github.com/Emanuele-web04/remodex

Remodex is a third-party local-first Codex remote-control app, not an OpenAI replacement. It is useful evidence for feasibility: the public repo currently has about 3k GitHub stars, 342 forks, an Apache-2.0 codebase, an npm bridge (remodex), an App Store iPhone app, and an inspectable architecture where Codex stays on the Mac while the phone connects through a paired bridge.

Its documented feature set includes live streaming to iPhone, trusted reconnect, in-app notifications for turns needing attention, queueing follow-up prompts while a turn is running, git actions from the phone, photo attachments, subagents, Plan mode, access controls, shared thread history, and a /compact flow.

The App Store listing reports Remodex as free to download, about 81.4 MB, with version 1.5 released on 2026-05-05. Its release notes explicitly call out Smoother streaming and scrolling, More reliable reconnect, Cleaner Plan Mode timeline, Sharper skill and file autocomplete, and fixes for Plan Mode, padding, lag.

That comparison is not a demand for feature parity. It is a feasibility check. A third-party bridge should not be ahead of the official ChatGPT iOS Remote Control preview on the core loop of seeing a live run, receiving attention events, reconnecting, and approving or steering safely.

Additional information

Official docs checked on 2026-05-17:

The docs describe ChatGPT mobile as a supported Remote Control surface for starting, steering, approving, reviewing, getting notified about Codex work, switching connected hosts/threads, and controlling a macOS Codex App host. I understand the feature is a preview. Preview status does not make the core control loop optional.

Redacted / metadata-stripped screenshots:

!Plan mode approval prompt on iOS

!Skill picker readability while typing on iOS

!Context compaction showing an unexpected Plan-mode implementation prompt

!iOS 403 while loading messages

!iOS main screen showing the host with a red/offline dot

!iOS Connections sheet showing the same Codex Desktop host enabled

!iOS thread list showing spinner and pinned placeholders

!macOS Codex App online and responsive while iOS is failing

View original on GitHub ↗

14 Comments

zorkary · 2 months ago

Additional Android/app-server signal here.

Environment:

  • Codex desktop: 26.513.20950, bundle 2816
  • Codex CLI: 0.131.0-alpha.9
  • Mobile: ChatGPT Android / Codex mobile surface

Observed behavior:

  • Normal ChatGPT mobile notifications work for ordinary assistant replies.
  • App-server / remote-control-originated Codex turns can complete locally and appear in the desktop/local transcript.
  • If the thread was created on mobile first, an app-server follow-up can show on Android after manually reloading the thread.
  • That app-server-originated follow-up did not trigger a mobile push notification.
  • Separately, remote connection state can drop/stale out without a useful mobile notification.

Why this matters:
Remote control needs attention semantics, not just eventual sync. Mobile should reliably surface events like:

  • turn completed
  • approval/input required
  • turn failed
  • remote connection dropped/stale
  • host disconnected/reconnected

This feels related to #22754, but the underlying need seems broader than SSH specifically. Whether the host is local app-server, remote control, or SSH-backed, mobile supervision needs a live session/attention channel: streaming state when available, plus reliable push/attention events when the user is not watching the app.

This also overlaps with #20930 and #11820, but the app-server/remote-control angle is slightly different: the mobile app can sometimes observe the resulting thread state after reload, but it does not seem to behave like a live supervision surface with push/attention signals.

thughy · 2 months ago

Additional user report that seems to match the stale/slow mobile supervision part of this issue.

Observed behavior, from a Codex user testing the new ChatGPT mobile app + Codex desktop collaboration flow:

  • The Codex desktop app / computer-side view loads and updates at an acceptable speed.
  • The Codex entry inside the ChatGPT mobile app syncs much more slowly.
  • Mobile appears to lag behind the desktop session state instead of behaving like a live control surface.
  • The user specifically reports that information visible on the computer can take a long time to appear on mobile.
  • This is affecting the main value of mobile remote control: monitoring and steering long-running Codex work away from the computer.

Local desktop context available from the reporter's machine, read-only:

  • macOS 15.6.1, build 24G90
  • arm64
  • Codex App CFBundleShortVersionString: 26.422.21459
  • Codex App CFBundleVersion: 2049
  • Mobile ChatGPT app version / iOS or Android version: not captured yet

This may also overlap with:

  • #22705, where mobile opens thread metadata but message hydration fails or lags.
  • #22800, where Android-started active threads disappear after force quit and mobile permission/session state diverges.
  • #22898, where mobile shows a running desktop as offline and Reconnect provides no visible feedback.
  • #20930, where notifications do not work for remote connections.
  • #21211, where large histories and eager hydration make mobile/desktop thread loading slow.

One important product expectation: if the desktop app version is too old for reliable mobile Remote Control, the mobile/desktop UI should surface that clearly. Otherwise this presents as a sync/relay reliability bug rather than an upgrade requirement.

Requested investigation: please check the mobile Remote Control state propagation path for delayed/stale hydration, especially when the desktop app updates faster than ChatGPT mobile. The current user-visible behavior feels like an eventually refreshed replica, not a live supervision surface.

92645417d9e5c763259dbebc306e3e · 2 months ago

Additional Linux/app-server signal:

On my setup, the TUI and ChatGPT iOS Remote Control appear to use different Plan execution paths.

Observed in a single rollout:

  • TUI Plan Mode turn records collaboration_mode_kind: "plan" and emits a real TurnItem::Plan.
  • Accepting the plan from TUI sends Implement the plan. upstream by default.
  • ChatGPT iOS, after showing/accepting a proposed plan, sends Implement the proposed plan. instead.
  • That iOS-created “plan” appears as a normal assistant message in a default turn, not as a TurnItem::Plan.

So this looks broader than UI lag: the mobile Remote Control surface may not be using the same Plan Mode/app-server state machine as the local TUI. This can make plan prompts, execution routing, and transcript state diverge between mobile and local frontends.

jjoanna2-debug · 2 months ago

Additional post-local-repair reproduction from 2026-05-17 around 22:47-22:50 WEST.

After repairing the local managed standalone path required by codex remote-control, the Mac host is registered online in the backend, but Codex mobile/iOS still reports the same host/thread as offline and fails message hydration with 403.

Local host state now verified:

~/.codex/packages/standalone/current/codex -> /Applications/Codex.app/Contents/Resources/codex
remote-control daemon: running
app-server-control socket: present
backend /codex/remote/control/environments?limit=100:
  count: 1
  host_name: JCs-M3-MacBook-Pro.local
  online: true
  busy: false
  app_server_version: 0.131.0-alpha.9
  client_type: CODEX_DESKTOP_APP
  originator: Codex Desktop
  last_seen_at: 2026-05-17T21:50:03Z

Mobile/iOS state at the same time:

Thread: Fix iOS remote issue
Host label: JCs-M3-MacBook-Pro.local
Banner: Error loading messages: There is a problem with your request. (403, d6398ca7-8d6b-4382-9cbf-31ea411736b7)
Composer footer: JCs-M3-MacBook-Pro.local is offline

This separates two issues:

  1. The local missing managed standalone path can prevent the remote-control daemon from bootstrapping.
  2. After that local path is repaired and the backend sees the Mac as online, Codex mobile/iOS can still show the host as offline and return a 403 when loading messages.

So the current failure is not that the Mac is unavailable to the backend. It is mobile/backend authorization or state hydration diverging from the backend host-online state.

jjoanna2-debug · 2 months ago

Follow-up local boundary check from 2026-05-17 23:21 WEST after the prior managed-standalone repair.

Local host prerequisites still pass:

Codex app: 26.513.31313
Bundled CLI: codex-cli 0.131.0-alpha.9
Managed standalone path: ~/.codex/packages/standalone/current/codex -> /Applications/Codex.app/Contents/Resources/codex
remote-control daemon: running with --enable remote_control app-server --listen unix://
app-server-control socket: present
remote-control backend connection: ESTABLISHED
backend /codex/remote/control/environments?limit=100:
  count: 1
  host_name: JCs-M3-MacBook-Pro.local
  online: true
  busy: true
  app_server_version: 0.131.0-alpha.9
  client_type: CODEX_DESKTOP_APP
  originator: Codex Desktop
  last_seen_at: 2026-05-17T22:21:25Z

I also removed a local orphan remote_control_enrollments row with an empty app_server_client_name after backing up ~/.codex/state_5.sqlite and ~/.codex/.codex-global-state.json; the only remaining local enrollment now matches the backend-visible environment env_e_6a063a4bc16083329570847fa86c0286.

This keeps the failure boundary the same as the previous report: the Mac host is registered online and locally clean enough, so the remaining broken behavior is not a missing daemon/standalone path/proxy issue. It is mobile/backend authorization or state hydration diverging from the backend host-online state.

KachurPro · 2 months ago

I can reproduce the same class of issue today (2026-05-19) while controlling a Codex session from the ChatGPT/Codex mobile UI.

Environment:

  • Mobile: iPhone / cellular connection; Codex mobile surface in the ChatGPT app.
  • Host: remote SSH Codex session; the agent process and workspace are running on the SSH server, not on the phone.
  • Exact app version: not captured from the About dialog at the time.

Observed:

  • During a running task, the mobile screen keeps a sticky bottom card:
  • Implement this plan?
  • Yes, implement this plan
  • No, describe changes
  • Skip
  • The task is already executing / thinking in the transcript, but this plan card remains stuck at the bottom.
  • From mobile I cannot reliably close, expand, or dismiss the card.
  • Because this bottom sheet stays in that stale state, I cannot manage the plan from the phone. If Codex asks a clarification/question in the plan flow, the mobile UI is effectively blocked.
  • This is especially bad for SSH remote workflows because the phone is the primary control surface for supervising the remote session.

Expected:

  • Once execution has started, the stale plan prompt should be consumed/removed.
  • If the prompt is still actionable, all actions should be usable from mobile and the card should be dismissible.
  • Mobile should reflect the current run state and let the user steer the remote SSH session.

This looks closely related to #23066, but that issue is closed; the behavior is still occurring for a remote SSH workflow.

jjoanna2-debug · 2 months ago

@etraut-openai Hi there, any updates on this issue?

Audacity88 · 2 months ago

Same failure on macOS + iOS.

Mobile:

  • Host appears as MacBook-Air-6.local
  • Thread list loads
  • Message hydration fails:

Error loading messages: There is a problem with your request. (403, 16be3094-0504-4c5b-a174-61d560007732)

  • Composer says MacBook-Air-6.local is offline

Local host:

  • Codex Desktop 26.513.31313
  • bundled codex-cli / app-server 0.131.0-alpha.9
  • Managed standalone path was missing and was restored:

~/.codex/packages/standalone/current/codex -> /Applications/Codex.app/Contents/Resources/codex

  • codex remote-control now reports running/started
  • ~/.codex/app-server-control/app-server-control.sock is present
  • Remote-control process has an ESTABLISHED TCP connection to 104.18.32.47:443
  • Local remote_control_enrollments has both a Codex Desktop row and a freshly recreated empty app_server_client_name row:
'' | env_e_6a0caf8793ec8327b964bd6894903adf | MacBook-Air-6.local
'Codex Desktop' | env_e_6a0caccff2548327bbb66ba7c8595200 | MacBook-Air-6.local

Even after daemon repair and restart, iOS still shows the host offline and returns 403.

Snailflyer · 2 months ago

The benchmark in this issue is the right one: mobile Remote Control has to behave like a live supervision/control surface, not just a secondary UI that sometimes hydrates stale thread state.

One design distinction that keeps showing up in these reports is whether the mobile surface is attached to the actual host-side process, or to an app/server representation that can drift from it. If the phone says "offline" while the host process is clearly alive, or shows a stale Plan/approval state, users cannot trust it for long-running work.

I built Faryo as a narrow open-source comparison point for the host-process-first model: Codex/Claude/shell stay alive inside tmux on the owner machine, and phone/browser only provides compact output, short input, approve/interrupt, and handoff against that same live process. It is not a fix for Codex mobile or app-server state, but it is a useful fallback when the priority is "control the same live local session" rather than a richer official mobile UI: https://github.com/Snailflyer/faryo

For this issue, is the critical requirement same host/process liveness, or specifically preserving the official Codex mobile thread/project UI while doing that?

byteword · 1 month ago

Adding another report that may be related to the mobile Remote Control lag described here.

Environment

  • Host: Windows PC (CBW-NEO)
  • Mobile client: ChatGPT iOS app, iPhone13,3, iOS 26.5, ChatGPT 1.2026.139
  • Security software on host: Norton 360 Premium
  • Codex App version: not captured yet

Symptom

When connected to Codex through ChatGPT mobile Remote Control, assistant responses are displayed with a word/character-level streaming animation that can become extremely slow, even when the actual response is short.

This does not look like a general network problem: other network activity is fine, and the phone itself is responsive. The slowdown appears specific to the Codex remote surface / live session rendering.

Why this looks like a bug

If the session/thread becomes large and that makes the remote response display slower, the client may be reprocessing too much historical session state while rendering a new response. At minimum, already-rendered/previous responses should not significantly affect the latency of displaying a new short response. Ideally the remote UI should request/render the current response incrementally or virtualize historical items rather than allowing session size to slow down each new turn.

Observations from the Windows host

During the slowdown, Task Manager showed CPU activity roughly in this order:

  1. ChatGPT
  2. WMI Provider Host
  3. Norton Software Analyzer
  4. Codex / Desktop Window Manager / Network Setup Service and others

GPU usage did not spike, so this does not appear to be a GPU rendering bottleneck.

A WMI-Activity log entry around the issue showed repeated process performance enumeration:

ClientMachine = CBW-NEO
User = CBW-NEO\bytew
ClientProcessId = 11284
Operation = Start IWbemServices::CreateInstanceEnum - root\cimv2 : Win32_PerfFormattedData_PerfProc_Process
ResultCode = 0x800706BA
PossibleCause = Could not send status to client

This suggests the remote/live status path may be causing frequent process/performance-state queries, or triggering a third-party analyzer to do so.

Workarounds / tests already tried

  • [tui] animations = false in Codex config: does not appear to affect ChatGPT mobile Remote Control streaming animation.
  • Turning off the Codex semi-transparent sidebar fixed a separate Windows transparency issue, but not this remote response streaming lag.
  • Codex workspace folder has already been excluded from Norton scanning.
  • GPU usage remains low while the slowdown happens.

Expected behavior

A short new response in mobile Remote Control should render quickly regardless of thread/session length, and there should be an option to disable word/character-level streaming animation for remote responses if it causes performance issues.

Audacity88 · 1 month ago
Same failure on macOS + iOS. Mobile: Host appears as MacBook-Air-6.local Thread list loads Message hydration fails: Error loading messages: There is a problem with your request. (403, 16be3094-0504-4c5b-a174-61d560007732) Composer says MacBook-Air-6.local is offline Local host: Codex Desktop 26.513.31313 bundled codex-cli / app-server 0.131.0-alpha.9 Managed standalone path was missing and was restored: ~/.codex/packages/standalone/current/codex -> /Applications/Codex.app/Contents/Resources/codex codex remote-control now reports running/started ~/.codex/app-server-control/app-server-control.sock is present Remote-control process has an ESTABLISHED TCP connection to 104.18.32.47:443 * Local remote_control_enrollments has both a Codex Desktop row and a freshly recreated empty app_server_client_name row: `` '' | env_e_6a0caf8793ec8327b964bd6894903adf | MacBook-Air-6.local 'Codex Desktop' | env_e_6a0caccff2548327bbb66ba7c8595200 | MacBook-Air-6.local `` Even after daemon repair and restart, iOS still shows the host offline and returns 403.

Follow-up from the MacBook-Air-6.local repro I posted above: this now appears resolved for my setup as of 2026-06-03.

I am sending messages from the iPhone into an existing Codex Desktop thread, and both the iPhone and Mac sides are updating in real time. The previous failure mode I saw is no longer reproducing:

  • thread list/message hydration now works
  • no 403 while loading messages
  • the host no longer appears stuck offline from mobile while the Mac is active
  • messages sent from iPhone and Mac both propagate live

I don't know which app/server-side change fixed it, but wanted to confirm that my macOS + iOS repro case is currently healthy. Thanks for the fix.

2batsloverandomartifactromps-dotcom · 6 days ago

Adding a current Windows host data point for the slow/stale Remote Control state-propagation part of this issue.

Environment:

  • Windows 11 Home 64-bit, build 26200
  • Codex Desktop builds observed during the affected period: 26.707.3748.0 through current 26.707.9981.0
  • Remote/account/conversation/request identifiers redacted

The user-visible problem is that Remote Control can lag badly or fail to converge on the real state of in-progress and completed Codex tasks. This matters because in-progress work continues on the host while the remote surface is stale, so the user cannot reliably supervise, steer, or tell whether a task is still active.

The desktop logs show a large, persistent state-ownership divergence: live turn/item events continue arriving, but the desktop event handler repeatedly rejects them because the conversation is not present in its current registry/model.

Representative sanitized shape:

error [electron-message-handler] Received turn/started for unknown conversation
error [electron-message-handler] Received item/started for unknown conversation
error [electron-message-handler] Received item/completed for unknown conversation
error [electron-message-handler] Received turn/completed for unknown conversation

This is not an occasional startup warning. In one continuous July 11 Desktop log, there were:

13,933 unknown-conversation turn/item events
33 distinct conversations
first: 2026-07-11T01:20:58Z
last:  2026-07-11T23:59:58Z

The pattern persisted across later app instances and builds. Examples of per-log counts:

2026-07-12: 9,343 events in one log; 7,609 in another
2026-07-13: 11,150 events in one log; 10,950 in another
2026-07-14: 12,306 events in one log; 4,609 in another

These counts are from the exact pattern Received (turn|item)/... for unknown conversation; they do not include unrelated warnings.

The host logs alone do not prove whether the initial loss is in the mobile relay, desktop renderer hydration, or both. They do prove that the event stream and the client-visible conversation registry can remain divergent for hours while tasks are active. That is consistent with Remote Control behaving like a stale replica instead of a live control surface.

Related technical reports may describe adjacent parts of this failure:

  • #27592: Remote Control transport queue coupling/backpressure can add latency.
  • #24263: renderer reload/rehydration can leave live turn state out of sync.

Requested behavior:

  • attach sequence/cursor/generation information to remote task state so the client can detect gaps;
  • on an event for an unknown conversation, buffer it briefly and trigger a bounded thread/read/snapshot rehydrate instead of dropping thousands of events;
  • make rehydration idempotent and replay missed events after reconnect/backgrounding;
  • expose “last host event”, “last mobile-applied event”, queue depth, ACK latency, and current sync lag;
  • if convergence fails, show an explicit stale/out-of-sync state and a resync action instead of silently showing obsolete progress.

I can provide sanitized per-window excerpts and counts if maintainers need them.

2batsloverandomartifactromps-dotcom · 5 days ago

Follow-up with a tightly bounded cold-start window from the current Windows build 26.707.9981.0 (identifiers redacted).

The initial desktop thread/list took 31,461 ms. A prior start took 13,484 ms; later list calls were only 4–31 ms. While that initial registry/model was not ready, app-server events continued to arrive and the renderer dropped or could not apply them.

From 04:06:34Z through 04:15:02Z on 2026-07-15, one current-process log contained 1,075 affected state events across 13 conversations:

turn/started                         13
turn/completed                        3
item/started                        428
item/completed                      425
Conversation state not found        206
total                              1,075

This is a concrete rehydration race, not merely slow visual streaming: live events are flowing before the conversation registry is authoritative, and the projection never fully catches up. It explains why Remote Control can show obsolete progress or appear frozen even when host work continues.

Suggested convergence contract:

  1. Do not apply/drop live turn/item events until the initial thread snapshot and subscriptions share an explicit generation/cursor.
  2. Buffer bounded pre-hydration events and replay them after the snapshot.
  3. On an unknown conversation or cursor gap, request an authoritative thread/read/snapshot instead of logging and dropping indefinitely.
  4. Track and expose host cursor, last mobile-applied cursor, replay backlog age/count, and an explicit stale state.
  5. Coalesce replaceable streaming deltas, but reserve delivery capacity for completion/control/ACK events.
  6. Key segmented-message state by both client and stream; a local proof patch for (ClientId, StreamId) reassembly now passes all 3 focused interleaving/invalidation tests.

This sync defect is separate from the host WebSocket/token-recovery failure documented in #31973, but the two compound: a reconnect can succeed while the client-visible projection remains permanently stale.

Antony-Jia · 3 days ago

Additional Windows reproduction (Codex Desktop 26.715.3651.0):

  • Start or continue a Codex thread from the ChatGPT mobile Remote Control surface.
  • Send a prompt from mobile and wait until the assistant finishes replying.
  • The desktop Codex app remains open, but the conversation view/history does not refresh and does not show the new mobile turn/reply.
  • Reopening/restarting the Codex desktop app makes the missing conversation record appear.
  • The issue reproduces repeatedly; Ctrl+G is not available as a workaround because this Windows build does not bind that shortcut to Search Chats.

Expected: the desktop conversation should update automatically, or provide an explicit resync action without restarting the app.