iOS Codex Mobile permanently renders only the streamed tail (~20-30 lines) of a long assistant message; head never hydrates, desktop hydrates fine

Open 💬 0 comments Opened Jul 3, 2026 by fortytwode

What version of Codex CLI is running?

codex-cli 0.142.5 (standalone install, running as codex app-server --remote-control)

ChatGPT iOS app version: current App Store build as of 2026-07-03 (exact build not inspected).

What platform is your computer?

macOS 26.3.1 (build 25D2128), Darwin 25.3.0 arm64

What issue are you seeing?

The ChatGPT iOS Codex mobile control surface permanently renders only the streamed tail (~20-30 lines) of a single long assistant message. Everything above that window is missing, with no truncation indicator - the message simply begins mid-content, so the loss is invisible unless you know what the beginning should have been.

This looks like a message-scale sibling of #22705 (thread-scale: metadata renders, message hydration fails with CodexClientError error 11). Here the thread hydrates and the message partially renders - but only the final streaming window; the head of the message is never backfilled.

Desktop behaves differently and correctly: Codex Desktop shows the same clipped tail while the turn is streaming, then swaps in the full message once the turn completes. The iOS app never performs that swap - it stays on the streamed tail forever.

Evidence that the payload is complete and this is purely an iOS render/hydration defect:

  1. Asked the agent (from the iOS remote-control surface) to print the numbers 1-100, one per line, as a single assistant message. iOS displayed only rows ~78-100 (~22 lines).
  2. The session rollout JSONL on the Mac contains the complete assistant message (all 100 lines verified).
  3. Speaking JSON-RPC directly to a local codex app-server instance and calling thread/read with includeTurns: true for that same thread returns the complete 100-line message text at the hydration boundary the clients consume.
  4. So: model output complete, rollout storage complete, app-server response complete - only the iOS render path drops the head of the message.

Reproduction

  1. Pair ChatGPT iOS Codex remote control with a Mac running codex app-server --remote-control (codex-cli 0.142.5).
  2. From the iOS surface, send: "Print the numbers 1 to 100, one per line."
  3. Watch the reply stream on iOS: the visible window tails the stream.
  4. When the turn completes, observe the message shows only roughly rows 78-100. Scrolling up shows the message starts mid-content.
  5. Force-quit the iOS app and reopen the conversation: the message still renders only the tail (so this is not just a missed final stream update; the stored-message render path is also affected).
  6. Open the same thread on Codex Desktop: the full 100-line message renders after load.

Expected behavior

After a turn completes, the iOS client should hydrate the full assistant message (as desktop does), or at minimum indicate that content above the rendered window exists and is loadable.

Actual behavior

iOS permanently shows only the last ~20-30 lines of the message with no indication anything is missing. Force-close/reopen does not recover. The same message is complete on desktop and at every boundary on the host Mac.

Additional context

  • Workaround we now use: instruct the agent to emit long exact output as multiple ~20-line assistant messages (forcing separate message items with a trivial exec between them); small messages render fully on iOS.
  • Related: #22705 (large-thread hydration failure on iOS/iPadOS while the same threads load on multiple Macs). This report differs: hydration "succeeds" but renders only the streamed tail of one large message item.

View original on GitHub ↗