Skip to content

Android Remote message queue can stay stuck after host turn completes; recovery may lose or delay messages #41708

Open

Description

@ESKehler

Summary

Android Remote can accept user-authored messages into its visible queue without delivering them to the Windows Codex host. The mobile client can remain stuck showing an active Stop control even after the authoritative host turn has completed.

Two outcomes were captured with synchronized Android and Windows evidence:

  1. Force-stop recovery: six queued messages never reached the host. Force-stopping and reopening ChatGPT cleared the stale state but silently discarded the queue.
  2. Thread-switch recovery: two queued messages remained pending for roughly 38–41 minutes, then finally reached the host after I switched to another task, successfully sent messages there, and returned to the affected task.

The common theme is that Android displays input as queued, but the intended Codex task does not receive it promptly or durably.

Environment

  • ChatGPT Android: 1.2026.230 (versionCode=2623032)
  • Codex for Windows: 26.825.5331.0
  • Windows 10 Home 22H2 x64, build 19045.7663
  • Official Android Remote surface connected to the Windows host
  • Observed August 29, 2026

Raw artifacts are retained locally. The excerpts below remove account/device/task IDs, local paths, host names, PIDs, UIDs, and private message contents.

Reproduction A: continuous 21:07–21:18 capture ends in stale Stop state and six-message loss

This failure did not begin at force-stop. The captured sequence starts with an image-steering failure, continues through repeated Android composing/attachment activity, host turn completion, six visible queue entries that never reach the host, three screenshots of the stuck state, and finally destructive recovery.

Full cross-device timeline (PDT)

  • 21:07:27.823: the Windows rollout receives a text-only message reporting that the photo failed to steer. No image item accompanies it.
  • 21:07:31–21:07:40: Android logs ChatGPT composer/IME activity: the keyboard is shown, then hidden.
  • 21:08:24: an Android screenshot captures the active Remote failure state.
  • 21:08:26.509: the Windows rollout receives the next text-only follow-up.
  • 21:09:07: Android shows the ChatGPT IME/composer becoming active again.
  • The first live Android log file ends at 21:09:23. A retained-buffer capture resumes before the stale-queue screenshots; the gap is disclosed rather than inferred over.
  • 21:12:22.048: Android WindowManager returns focus to ChatGPT.
  • 21:12:29.425: the Windows rollout finally receives the request to pause and accept the backlogged photos.
  • 21:12:51.567: the authoritative Windows rollout records task_complete.
  • 21:12:52.321 and 21:13:00.211: Android refreshes the ongoing codex_remote_session notification.
  • Starting just afterward, Android accepts six additional user-authored messages into visible queue chips.
  • 21:13:14–21:13:16: ChatGPT opens the system Photo Picker and returns to the thread.
  • 21:15:29–21:15:33: Android SmartCapture takes the first retained screenshot, then returns focus to ChatGPT.
  • 21:15:44–21:15:47: ChatGPT opens the Photo Picker again and returns to the thread.
  • 21:15–21:16: the screenshots show all six messages still pending with ellipsis menus while the composer incorrectly continues to show the square Stop control. Later messages do not dispatch.
  • 21:16:28–21:16:31: Android takes another screenshot and returns focus to ChatGPT.
  • 21:16:48–21:16:49: Android takes the third screenshot and returns focus to ChatGPT.
  • Across this interval, the Windows rollout contains zero corresponding user_message records for the six queue chips.
  • 21:16:51.248: Android leaves ChatGPT for the launcher/recents path.
  • 21:16:57.865: Android Settings force-stops ChatGPT.
  • 21:16:57.869: Android kills the old ChatGPT process.
  • 21:16:57.935: the ongoing codex_remote_session notification is removed.
  • 21:17:03.626 and 21:17:04.128: initial ChatGPT relaunch attempts fail.
  • 21:17:10.870: Android starts a new ChatGPT process.
  • 21:17:12.662: the Codex Remote foreground service restarts.
  • After reopening, the stale Stop state is gone—but all six queued messages are also gone.
  • 21:18:37.728: the next host-visible user input is a newly submitted three-photo bundle after restart, not any of the six queued messages.

Sanitized Android log excerpt: interaction, queue wedge observation, and recovery

21:07:31.820  ChatGPT/IME     request show keyboard in com.openai.chatgpt.MainActivity
21:07:40.351  ChatGPT/IME     request hide keyboard in com.openai.chatgpt.MainActivity
21:09:07.319  ChatGPT/IME     keyboard visible in com.openai.chatgpt.MainActivity

               [live log file ends 21:09:23; retained-buffer capture resumes]

21:12:22.048  WindowManager  focus NotificationShade -> com.openai.chatgpt.MainActivity
21:12:52.321  ChatGPT        notify channel=codex_remote_session
21:13:00.211  ChatGPT        notify channel=codex_remote_session
21:13:12.784  WindowManager  focus -> com.openai.chatgpt.MainActivity
21:13:14.873  WindowManager  focus ChatGPT -> system Photo Picker
21:13:16.822  WindowManager  focus Photo Picker -> ChatGPT
21:13:48.879  WindowManager  focus ChatGPT -> NotificationShade
21:13:49.981  WindowManager  focus NotificationShade -> ChatGPT
21:14:00.246  WindowManager  focus NotificationShade -> ChatGPT
21:15:29.937  WindowManager  focus ChatGPT -> SmartCapture
21:15:33.822  WindowManager  focus SmartCapture -> ChatGPT
21:15:44.595  WindowManager  focus ChatGPT -> system Photo Picker
21:15:47.195  WindowManager  focus Photo Picker -> ChatGPT
21:16:28.864  WindowManager  focus ChatGPT -> SmartCapture
21:16:31.867  WindowManager  focus SmartCapture -> ChatGPT
21:16:48.434  WindowManager  focus ChatGPT -> SmartCapture
21:16:49.749  WindowManager  focus SmartCapture -> ChatGPT
21:16:51.248  WindowManager  focus ChatGPT -> launcher/recents
21:16:57.865  ActivityManager Force stopping com.openai.chatgpt
21:16:57.869  ActivityManager Killing <OLD_CHATGPT_PID>:com.openai.chatgpt
21:16:57.935  SystemUI       remove notification package=com.openai.chatgpt channel=codex_remote_session
21:17:03.626  ActivityManager Activity could not be started: com.openai.chatgpt/.MainActivity
21:17:04.128  ActivityManager Activity could not be started: com.openai.chatgpt/.MainActivity
21:17:10.870  ActivityManager Start proc <NEW_CHATGPT_PID>:com.openai.chatgpt
21:17:12.662  ActivityManager start FGS com.openai.feature.codexremote...CodexRemoteSessionForegroundService

The release Android build does not log queue item contents or explicit local queue mutations. The six queue chips and stale Stop control are therefore proven by the three screenshots; the log proves the surrounding ChatGPT focus, composer, Photo Picker, screenshot, force-stop, process, notification, and Remote-service lifecycle.

Sanitized Windows rollout excerpt: early text succeeds, then the six-chip queue never arrives

21:07:27.823  event_msg      user_message  message=<PHOTO_STEER_FAILED_TEXT>; images=[]
21:08:26.509  event_msg      user_message  message=<TEXT_FOLLOW_UP>; images=[]
21:12:29.425  event_msg      user_message  message=<PAUSE_FOR_BACKLOGGED_PHOTOS>; images=[]
21:12:51.409  agent_message  phase=final_answer
21:12:51.567  event_msg      task_complete

                 [zero user_message / image records corresponding to
                  the six Android queue chips]

21:18:37.728  response_item  user message with three newly submitted local images

This A/B boundary matters: the host successfully receives earlier text from the same Android session, then receives the pause request and completes the turn, but receives none of the six queue entries displayed afterward. The failure is not simply “Android had no connection.”

Reproduction B: switching away and back correlated with a 38–41 minute delayed queue drain

Timeline (PDT)

  • The host turn completed at 23:05:16.030.
  • Android interaction logs show two best-evidence send attempts at 23:05:33.538 and 23:05:36.752.
  • Each attempt is immediately followed by a ChatGPT Remote foreground-service queue/status update and an app-UID keystore operation.
  • A photo taken at 23:42 still shows both messages as queued ellipsis chips and the stale square Stop control.
  • I switched to another task, successfully sent messages there, then returned.
  • 23:42:54.226: host task settings were applied.
  • 23:42:54.292: the affected host task reactivated.
  • 23:43:53.623: context compaction completed.
  • 23:43:54.613: queued message 1 reached the Windows rollout—about 38m 21s after the probable send tap.
  • 23:46:44.588: queued message 2 reached the Windows rollout—about 41m 08s after the probable send tap.
  • Neither message was ultimately lost in this reproduction.

Sanitized Android log excerpt: enqueue attempts and thread-switch recovery

23:05:33.538  system          PowerManagerService: userActivity touch
23:05:33.749  system          notification_enqueue package=com.openai.chatgpt channel=codex_remote_session
23:05:33.797  ChatGPT         NotificationManager: notify channel=codex_remote_session
23:05:35.322  keystore        create_operation success uid=<CHATGPT_UID>
23:05:36.752  system          PowerManagerService: userActivity touch
23:05:37.247  keystore        create_operation success uid=<CHATGPT_UID>
23:05:37.434  system          notification_enqueue package=com.openai.chatgpt channel=codex_remote_session
23:05:37.485  ChatGPT         NotificationManager: notify channel=codex_remote_session

                         [both messages remain visibly queued for more than 37 minutes]

23:42:22.582  WindowManager   move ChatGPT task to front
23:42:22.595  ActivityManager set resumed activity com.openai.chatgpt/.MainActivity
23:42:22.597  ActivityManager resume com.openai.chatgpt/.MainActivity
23:42:35–48    input           repeated touch interaction in ChatGPT
23:42:49.220  WindowManager   focus ChatGPT -> SmartCapture
23:42:52.450  WindowManager   focus SmartCapture -> ChatGPT
23:42:52.457  input_focus     focus request com.openai.chatgpt.MainActivity
23:42:54.809  ActivityManager start CodexRemoteSessionForegroundService
23:42:54.816  system          notification_enqueue package=com.openai.chatgpt channel=codex_remote_session
23:42:54.868  ChatGPT         NotificationManager: notify channel=codex_remote_session

The release Android build does not log message contents or explicit queue mutation records. The two touch → Remote-status/crypto sequences are the best-evidence original enqueue attempts. The later task-to-front/resume, SmartCapture, focus-return, Remote-service, and notification events independently corroborate the user’s switch-away/return sequence immediately before host delivery resumed.

Sanitized Windows rollout excerpt

23:05:16.030  event_msg  task_complete
                 [no affected-task events for approximately 37m 38s]
23:42:54.226  event_msg  thread_settings_applied
23:42:54.292  event_msg  task_started
23:43:53.623  compacted
23:43:54.613  event_msg  user_message  message=<QUEUED_MESSAGE_1>
23:46:44.588  event_msg  user_message  message=<QUEUED_MESSAGE_2>

Expected behavior

  • Once Android displays a message as queued, it should be durably represented with a stable client ID and explicit state: local pending, server accepted, delivered, failed, or canceled.
  • Mobile active-turn state should reconcile immediately when the host emits task_complete.
  • The square Stop control should disappear when no host turn is active.
  • Force-stopping/restarting the app should not silently discard user-authored queue entries.
  • Switching tasks should not be required to trigger queue delivery.
  • A stale queued item should be inspectable, retryable, and cancelable.
  • A message that later drains must not remain eligible for duplicate delivery.

Actual behavior

  • Android can retain a stale running-turn state after the host is finished.
  • New messages remain client-side and are absent from the host rollout.
  • Force-stop clears the state by discarding the pending queue.
  • Alternatively, reopening/reactivating the task may flush messages tens of minutes late.
  • The UI provides no reliable accepted/delivered/failed distinction.

Likely boundary

The paired evidence is consistent with a mobile queue/subscription reconciliation failure across the Android Remote client, relay/session state, and host task lifecycle. It is not consistent with ordinary loss of Internet connectivity: the host remained online, other tasks accepted messages, and the affected messages could later drain.

That is an inference, not a confirmed root cause.

Workarounds observed

  • Destructive workaround: force-stop and reopen ChatGPT. This restores the composer/state but can discard every queued message.
  • Non-destructive workaround that sometimes helps: switch to another task, successfully send there, then reopen the affected task. In one capture this correlated with the delayed queue finally draining, but it is not proven reliable.

Related reports

Closest Android/mobile Remote reports

Same stale completed-turn / local-queue state on other surfaces

Queue ownership / lifecycle adjacency

These reports span Android, iOS/macOS Remote, Windows Desktop, SSH Remote, and VS Code. They suggest that the underlying queue/lifecycle problem is broader than this specific Windows + Samsung reproduction, while #41708 contributes synchronized Android and Windows evidence for both destructive and non-destructive recovery paths.

Evidence retained

  • android-steer-20260829-210726.log: Android ChatGPT process log, approximately 21:07:27–21:09:23
  • android-steer-failure-20260829-210824.png: screenshot captured during the initial image-steering failure
  • android-stale-stop-full-2111-2119.log: full retained Android system/app window covering the stale Stop/queue state through force-stop and relaunch
  • Three Android screenshots showing six pending queue chips and the stale Stop control
  • One Android screenshot showing the two delayed queue chips shortly before non-destructive recovery
  • Full Android logcat window for the delayed-drain reproduction
  • Matching Windows rollout slices from 21:07–21:19 and 23:05–23:47
  • Exact cross-device timestamps used above

The raw files are intentionally not attached because they include unrelated app activity, private message text, local paths, and task/host identifiers. The expanded sanitized excerpts preserve the relevant interaction, focus, picker, screenshot, notification, process, Remote-service, host-receipt, and non-receipt sequence.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    connectivityIssues involving networking or endpoint connectivity problems (disconnections)
    sessionIssues involving session (thread) management, resuming, forking, naming, archiving
    on Aug 30, 2026
  2. github-actions commented on Aug 30, 2026

    @github-actions
    Contributor

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

    Powered by Codex Action

  3. 84dnnvbdvp-debug commented on Aug 30, 2026

    @84dnnvbdvp-debug

    A current-source trace suggests a second, narrower durability boundary worth testing in addition to the Android/relay acceptance problem reported here.

    At openai/codex commit 94cbbddafc1776d5e377bca1b05932c697e82238, QueuedItemService::start and dispatch_if_idle delete the durable QueueStore item as soon as Core returns StartIfIdleSubmission::Started. But Core's turn-input module explicitly documents that its reply is made after the start/steer/reject decision and does not wait for user-prompt hooks, in-memory context update, rollout persistence, or sampling. The queued input is handed to a spawned RegularTask; only later does run_turn call run_hooks_and_record_inputs(..., PersistContext::TurnStart).

    That leaves a source-visible crash window: the SQLite queue record can be deleted after in-memory task admission but before the user message is durably recoverable from the rollout. This does not explain the six Android items that never reached the host queue, and it is not proof that this timing caused either reproduction. It is a separate queue-to-turn handoff invariant.

    A focused regression could add a failpoint after Started/before input recording, restart the thread, and assert that the stable clientUserMessageId is recoverable exactly once—either the queue item remains, or the rollout already contains the user message. The repair boundary is the usual transactional handoff: retain the queue item until durable turn-input acknowledgement, or atomically transfer queue ownership into a recoverable turn record, with identity-based deduplication for retries.

  4. DXtR1337 commented on Sep 5, 2026

    @DXtR1337

    Additional user report, 2026-09-05: Android Remote connected to a Windows host becomes unusable for steering an ongoing Codex task.

    The user reports that follow-up instructions submitted from the phone stop being delivered. A screenshot supplied by the user shows a long stack of message/queue pills with ellipsis menus extending down almost the entire viewport, while the remote host header still shows a green status dot and a loading indicator is visible at the top. The screenshot clock reads 09:32. The user describes this as a sudden regression from previously working remote control.

    Impact: the user cannot reliably steer the coding task from the phone or determine which pending instructions were received. The accumulated pills also obscure much of the conversation.

    Evidence boundaries: the screenshot confirms the visible accumulated queue state; non-delivery is the user's report. We have not captured synchronized Android/host transport logs or established whether the host turn had completed at that exact moment. App versions and exact onset are not available. No restart/recovery experiment was performed, and permanent message loss is not confirmed.

    Expected: queued instructions should be delivered, or show a clear recoverable failure state. Mobile queue state should reconcile with the host, with pending text preserved and retry/cancel available.

    The screenshot is retained locally because it includes private conversation text and host/project names. This comment was submitted by Codex at the affected user's explicit request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbugSomething isn't workingconnectivityIssues involving networking or endpoint connectivity problems (disconnections)remotesessionIssues involving session (thread) management, resuming, forking, naming, archiving

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions