Codex Desktop: completed child turn visible in UI but read_thread returns items: []
Summary
On Codex Desktop for Windows, a completed child turn can be fully visible in the Desktop conversation UI while both the supervising Work task's immediate delegation result and a later exact codex_app.read_thread of that same completed turn expose no assistant message items.
The affected turn is not missing from the task: read_thread can locate the exact completed turn record and completion metadata, but returns items: []. The Desktop UI simultaneously shows the complete assistant answer.
This has happened intermittently across multiple child turns. Older turns in the same child thread remain readable through read_thread, so this is not a wrong-thread/project lookup or a permanently broken read_thread tool.
Environment
- OS: Windows 11 Pro 25H2
- Windows build:
26200.9168 - Installed package:
OpenAI.Codex - AppX/MSIX version:
26.818.4152.0 - ChatGPT/Codex About version:
26.818.32112 - About release date shown by the app: 21 Aug 2026
- Host type: local Codex Desktop project/thread
- The workflow uses a supervising Work thread delegating implementation to a visible local Codex child via the
codex_appthread tools.
The exact private thread/turn IDs and screenshots can be provided to OpenAI privately if useful.
What issue are you seeing?
A typical failure sequence is:
- The supervising Work task sends a prompt to an existing local Codex child.
- The child executes normally and the turn reaches
completed. - The answer is visibly present in the Codex Desktop UI.
- The immediate Work-side completion/result path returns zero visible items.
- A later
codex_app.read_threadagainst the exact same child, using fresh pagination to the exact completed turn, finds the turn record but returns:
items: []
codex_app.wait_threadsreports the turn as completed but exposes no latest assistant message.- Re-listing/re-resolving the exact child, reading with and without outputs, omitting/including the local host id, loading the task in the UI, waiting briefly, and rereading do not restore the structured message items.
- The answer remains visibly readable in the Desktop UI throughout.
The contradiction is therefore:
Desktop UI: full assistant answer visible
read_thread: same completed turn exists, but items: []
Strong evidence from one recent occurrence
Three consecutive turns in the same child showed the problem:
| Request | Turn state | Immediate result | Exact retained read_thread |
| --- | --- | --- | --- |
| substantive correction | completed | zero items | exact turn found, items: [] |
| substantive handoff | completed | zero items | exact turn found, items: [] |
| one-line no-tools marker | completed | zero items | exact turn found, items: [] |
The third request intentionally asked for exactly one short line and no tools. The UI displayed the exact one-line answer, but the immediate result and later read_thread both still exposed zero items. This rules out answer length, Markdown complexity, tool use, and long execution time as necessary causes.
In earlier occurrences, the same class of symptom survived loading the exact task and even an app/computer restart while the persisted answer later became readable.
Intermittent behavior
This is not a persistent configuration failure:
- earlier child turns returned normally;
- later turns in the same child can fail;
- normal turns can occur again afterward;
- older turns in the same affected child remain readable with
read_thread; - the same saved project, local host, source Work thread relationship, and child identity are used in both working and failing cases.
The earliest related symptom I observed was a completed child turn where progress was visible but the final report was omitted from the supervising task result. Later occurrences became stronger all-items-empty failures.
Checks already performed
The following were verified during the failure:
- exact child/thread identity is correct;
- exact completed-turn identity is correct;
- source Work-thread relationship is correct;
- saved project/workspace binding is correct;
- host is
local; - there is no replacement-child or stale-task mismatch;
- fresh
read_threadpagination locates the exact target turn; - old cursors are not being reused;
- reading with/without included outputs makes no difference;
- including/omitting
hostIdmakes no difference; - re-listing/re-resolving the child makes no difference;
- loading/navigating to the exact task and rereading makes no difference;
- the task is completed/idle, not still running;
- no repository, Git, or test-execution state correlates with the retrieval failure.
The same read_thread + pagination mechanism successfully reads older turns in the exact same child.
Expected behavior
When a local child turn reaches completed and the Desktop UI can display its assistant answer, codex_app.read_thread should return that same persisted visible assistant message for the completed turn.
At minimum, these surfaces should agree on whether the completed answer exists:
- Desktop conversation UI
- immediate supervising-thread completion/result
codex_app.wait_threadslatest-assistant statecodex_app.read_threadretained turn items
A completed answer should not be visible in one surface while represented as an empty completed turn in another.
Impact
This is particularly disruptive for agentic Work -> Codex orchestration:
- the supervising Work task cannot independently review the child's exact answer even though the user can see it;
- the workflow may unnecessarily resend prompts, consuming request allowance and potentially duplicating work;
- automated transcript/archive maintenance sees an apparent message gap despite the answer being visible in the UI;
- the only recovery in the strongest cases is manual user relay of the visible answer from the UI.
A short-term safe workflow is to avoid resending immediately, try an exact retained-thread read first, and ask for manual relay only if the exact completed turn still exposes no assistant items.
Possibly related issues
Possibly related, but not duplicates:
- #24287 — Desktop/backend turn-state desynchronization and invisible/misleading turn state.
- #37620 — durable thread history and another model-visible/read surface diverging.
- #30385 / #26634 — different Desktop thread-index/read-surface inconsistencies.
This report is distinct because the Desktop UI has the completed answer while an exact read_thread of the same completed turn returns an empty item list.
Additional context
The app received several visible updates around the observation window. The Aug 20 update notes included thread-related features such as shared thread snapshots and unified pinned threads. I do not know whether those changes are related and am not claiming causation.
A second Work/Codex Desktop instance was also active in a separate VM on the same account during one recent occurrence. The two instances used separate local filesystems/projects. This is noted only as an environmental variable; the symptom had occurred earlier as well, so concurrent VM activity is not established as necessary or causal.
If useful, I can provide privately:
- exact child/turn IDs;
- screenshots showing the answer visible in the Desktop UI;
- sanitized
read_thread/wait_threadsresults for the same turn; - a chronology of working vs failing turns within the same child.
11 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I reviewed the two suggested duplicates. They appear related, but I believe this report is distinct.
completed, and the complete assistant answer remains visibly present in the Codex Desktop UI at the same time that an exactread_threadof that completed turn returnsitems: [].Timeline clarification: I had been using this supervising Work -> visible Codex child-thread workflow regularly for several weeks without seeing this failure at all. The Development run in which I first observed it began around midnight local time on August 21, 2026, and I then saw the problem recur multiple times during the same day. So on my setup this appears to be a very recent/intermittent regression rather than a long-standing limitation of the workflow.
I’m leaving this open unless maintainers determine that it shares the same underlying bug as one of the suggested issues.
codex is broke n un useable atm
I traced this against public
openai/codexmain at343074d4207d572809bd8cea15f4be1d09d98e0b. The public source suggests a useful four-way diagnostic rather than treating every emptyitemsresult as the same failure.turn/completednotification includes the last non-empty agent message asitemsView: "summary"(#34777).thread/items/listandthread/turns/list; summary turns depend on the stored final-agent item reference (#39514).thread/read(includeTurns: true)has an additional persist/full-hydration path (#36993).codex_app.read_threadandcodex_app.wait_threadsare not implemented in this public repository, so their Work/snapshot projection should be tested separately from raw app-server behavior.For one affected turn, the strongest private capture would compare: (1) raw
turn/completed(itemsView, agent item ID), (2) rollout ordering/presence ofItemCompleted(agentMessage)andTurnComplete, and (3) raw results fromthread/items/list(turnId),thread/turns/listwith bothfullandsummary, andthread/read(includeTurns: true).That separates the likely boundaries:
codex_app.read_threadempty: app connector/Work snapshot projection;On current evidence this remains distinct from #39885 (durable answer rehydrated as interrupted after restart) and #38972 (terminal wake while the rollout is still running). They may share a broader reconciliation class, but neither currently establishes this completed-turn/item-projection contradiction.
This is another projection-layer symptom in the same family: the UI can show a completed child while a connector/read path returns no items. A useful repair diagnostic is to compare raw rollout, thread/items/list, thread/turns/list, thread/read(includeTurns), and thread_history parity rather than trusting one projection.
Additional reproducible evidence from another Windows Codex Desktop user (2026-08-24):
Reproduction pattern
I have two long-lived local Codex task threads that reproduce this consistently. The cross-task reader being used is
codex_app__read_thread/codex_app.read_thread— notwait_agent, mailbox, or a consumed completion notification.read_threadon one affected target thread.userMessageandagentMessage.read_threadresolves the same thread/turn and reportsstatus=completed, but returns:Controls / recovery attempts already tested
read_threadreturns empty, which indicates the answer is durably present somewhere locally rather than actually lost.Why this seems important
The especially distinctive signal is cold restart -> one successful full read -> later/new completed turns project as empty until the next restart. That behavior looks more like a warm/incremental projection, hydration, or runtime synchronization problem between durable session data and
codex_app.read_thread, rather than authentication failure, permanent thread corruption, or one-shot notification consumption.The UI/raw-session/read-thread contradiction is therefore:
If useful, I can provide sanitized screenshots and exact private thread/turn IDs to OpenAI privately.
Additional sanitized reproduction from a Remote SSH-backed Codex task:
Private thread/turn IDs and sanitized read_thread results can be provided to OpenAI privately if useful.
Additional sanitised reproduction from Windows 25H2 narrows this beyond a stale or incomplete SQLite projection.
Environment
26.818.8289.00.149.0-alpha.4.310.0.26200.9168, x64gpt-5.6-soltaskProjection parity from one affected completed turn
The canonical rollout contains:
event_msg/item_completedeventstask_completeat ordinal 1721The matching local
thread_history_1.sqliteprojection also contains all 208 expected item rows and the correctfinal_agent_item_id.The materialisation cursor is fully caught up, not stale:
Despite that parity, an exact supported
read_threadstill reports the completed turn withitems: [].Cross-provider and date-boundary control
In the affected task, a completed pre-midnight turn returns its full items, while two completed turns after UTC midnight return
items: [].A separate
gpt-5.6-soltask shows the same boundary: its pre-midnight turn is readable, while its completed post-midnight turns returnitems: []. This clears the Cursor provider and local proxy as necessary causes.The strongest current correlation is therefore a turn completed after UTC midnight inside a rollout created and stored under the previous date. That may point to a date-partition or rollover filter in the history read/serialisation path.
This evidence places the failure downstream of both canonical rollout persistence and SQLite materialisation. It is therefore distinct from #38792-style cases where the projection cursor itself is desynchronised.
No raw rollout, prompt, local path, account data or private thread identifier is attached.
Additional sanitized Remote SSH reproduction with canonical persistence evidence.
Environment:
codex-cli 0.147.0Observed:
completed, but an exact freshread_threadreturneditems: []for both;wait_threadsreported a completed duration of 113,640 ms whilelatestAssistantMessageandlatestToolMarkerIdwere both null.A read-only parse of the canonical remote JSONL for that exact latest turn found:
response_itemrecords;task_completeevent.No rollout or database state was modified during this check.
This rules out an actually empty model turn. The assistant output and completion are durable, while both structured task projections discard every item for the completed turn. It is the Remote SSH-backed form of the UI/raw-session/read-thread contradiction described in this issue.
No task IDs, turn IDs, hostnames, addresses, repository names, paths, prompts, credentials, or account data are included.
For information, workaround that restored my workflow: the parent still tries the native cross-thread result/read path first. If that fails with the empty-item behavior described in this issue, it falls back to a transcript written by the child itself.
The child writes its prompt/result transcript to an expected location in the shared filesystem before completing. The parent can then read that file directly and continue the workflow without requiring manual copy/paste.
This is only a workaround for the failed structured read path, not a solution to the underlying issue.
Additional reproduction from 2026-08-27 (Windows Codex Desktop supervising a Remote SSH-backed task):
read_threadreturned the target thread metadata and completed turn records, but the latest completed turns haditems: [].includeOutputs: truedid not restore any assistant message items.This matches the UI-visible / read_thread-empty contradiction described here, including the Remote SSH-backed variant. No credentials, private keys, or raw task contents are included.