openai / openai/codex

Windows Desktop 26.818.8289.0: live projection drops completed assistant output present in JSONL

Open
#40,512 5 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

app app-server bug windows-os
Dominant language
Rust
Stars
125k
Forks
19.4k
PR merge metrics
PR metrics pending

Description

Summary

On the latest Codex Desktop for Windows, completed assistant output is durably present in the canonical session JSONL, but the live Desktop/thread projection reports the completed turn with zero items and no latest assistant message.

A full app restart reconstructs previously missing turns from JSONL, but every new turn after restart immediately reproduces the empty live projection. This points to a real-time event ingestion, incremental projection, cursor synchronization, or local result-index update failure rather than a model/agent execution failure.

This report is filed on behalf of a user who reproduced and reviewed the evidence below. Exact private thread/turn identifiers and sanitized JSONL slices can be supplied privately to OpenAI.

Environment

  • Windows native Codex agent / PowerShell
  • App package: OpenAI.Codex_26.818.8289.0_x64
  • ChatGPT.exe file version: 151.0.7922.170
  • Bundled command runner: codex-command-runner-0.149.0-alpha.4.3
  • Installed from Microsoft Store and confirmed up to date
  • Full app restart already attempted
  • Local Git worktree projects
  • Session transcripts under %USERPROFILE%\.codex\sessions

What issue are you seeing?

A turn starts, produces a complete assistant response, and completes successfully. Its session JSONL contains:

  1. event_msg.task_started
  2. a response_item containing the assistant output
  3. event_msg.task_complete
  4. a non-empty task_complete.last_agent_message

The live Desktop/thread projection nevertheless reports that same completed turn as:

items=[]
itemCount=0
latestAssistantMessageId=null
latestAssistantMessage=null
latestToolMarkerId=null

The completed response is therefore presented as though the agent never started or returned nothing.

Minimal reproduction

  1. Open an existing local Codex task.
  2. Send a zero-tool prompt requiring one exact short response.
  3. Wait for the turn to reach completed.
  4. Inspect the Desktop task and structured thread result.
  5. Observe itemCount=0 and no assistant message.
  6. Inspect the matching JSONL under %USERPROFILE%\.codex\sessions.
  7. Observe the complete assistant response_item and non-empty task_complete.last_agent_message.

The issue also reproduces in a newer/fresh task, so it is not limited to one old thread. Two post-restart zero-tool smoke tests produced exact 95-character and 107-character assistant responses in JSONL, while the live projection remained empty.

Restart behavior

A complete app restart caused previously missing historical turns to become visible again. Three old turns that had appeared as items=0 were rebuilt with 119, 5, and 3 items respectively.

Any new turn sent after the restart immediately reproduced the same empty live projection.

This suggests:

  • startup/history reconstruction from canonical JSONL works;
  • real-time event ingestion or incremental thread projection does not;
  • alternatively, a live cursor/result-index snapshot is not being invalidated after completion.

Additional evidence

Three earlier affected turns each produced complete assistant output in JSONL:

  • 11,887 characters; first token after 21,046 ms
  • 8,359 characters; first token after 17,385 ms
  • 8,356 characters; first token after 9,448 ms

All had valid task_complete records but were absent from the live projection before restart.

What this is not

  • Not a model no-response: complete assistant outputs exist.
  • Not a rate-limit failure.
  • Not an approval wait.
  • Not a Git/worktree failure.
  • Not caused by tools: minimal reproductions used zero tools.
  • Not specific to one old thread.
  • Not fixed by updating or fully restarting the app.

Expected behavior

When a local turn reaches completed and its canonical rollout contains a completed assistant response_item and non-empty task_complete.last_agent_message, the incremental projection should expose that same assistant item without requiring an application restart.

If incremental projection cannot advance, Desktop should surface a synchronization error and rebuild from canonical history rather than reporting a successful but empty turn.

Impact

This is operationally dangerous for agentic orchestration because a completed task looks like a no-start. It can cause:

  • duplicate retries;
  • multiple conflicting outputs for the same logical event;
  • unnecessary Worker/Leader replacement;
  • false stuck-state detection;
  • incorrect automation decisions.

Temporary workaround

Treat the session JSONL as authoritative and only classify a true no-start when both are true:

  1. no assistant response_item exists for the turn; and
  2. task_complete.last_agent_message is empty or absent.

An empty Desktop projection alone is not treated as evidence of failure. Orchestration is deduplicated by (thread_id, turn_id).

Requested diagnostics/recovery

Please consider:

  • detecting live projection/cursor divergence and automatically replaying from canonical JSONL;
  • a supported projection-only rebuild command that preserves sessions, worktrees, automations, and Git state;
  • Windows documentation for Desktop/app-server projection logs;
  • a codex doctor check comparing rollout tail, projection cursor, projected turn/item counts, and completion metadata.

Possibly related, but not duplicates

  • #40014 — completed answer visible in Desktop UI while read_thread returns items: []. Here both Desktop UI and the structured thread projection omit the answer, while JSONL contains it.
  • #38792 — desynchronized thread_history projection cursors are not repaired on resume.
  • #35746 — paginated history drops valid rollout records and advances projection state incorrectly.
  • #40151 — Windows Desktop misses a persisted transcript interval during live execution.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the completed zero-tool turn and compare the live Desktop/thread projection with the canonical JSONL under %USERPROFILE%.codex\sessions. Trace the real-time ingestion, incremental projection, cursor synchronization, and local result-index update paths, using the listed related issues for context. Done means completed assistant items and last_agent_message appear without restart, or divergence triggers a canonical-history rebuild or clear synchronization error.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.