What issue are you seeing?
On codex-cli 0.117.0, a shared websocket codex app-server can run a real user turn to completion, but
the rollout file is never materialized on disk.
As a result:
thread/read with includeTurns: false works
thread/read with includeTurns: true fails
- sibling
thread/resume fails with no rollout found for thread id ...
Environment
- Codex CLI:
0.117.0
- Release tag:
rust-v0.117.0
- Release commit:
4c70bff480af37b1bf1a9b352b8341060fe55755
- Transport: websocket app-server
- Launch:
codex app-server --listen ws://127.0.0.1:9891
What steps can reproduce the bug?
Repro
- Start a shared websocket app-server.
- Client A connects and calls
initialize.
- Client A calls
thread/start.
- Client A calls
turn/start with:
{
"threadId": "<thread-id>",
"input": [
{
"type": "text",
"text": "Please reply with exactly the word materialized.",
"text_elements": []
}
]
}
- Wait for:
- item/started for userMessage
- item/completed for userMessage
- assistant reply
- turn/completed
- On the same client, call:
- thread/read with includeTurns: false
- thread/read with includeTurns: true
- On sibling Client B, call:
- thread/resume for the same thread id
- Check the rollout path returned by the thread APIs.
What is the expected behavior?
Expected behavior
After the first real user turn completes on a non-ephemeral shared thread:
- rollout file should exist at the advertised path
- thread/read(includeTurns: true) should succeed
- sibling thread/resume should succeed
Actual behavior
The turn fully runs, but no rollout file is created.
Observed repro thread:
- thread id:
- 019d5fe8-3730-7dc0-b126-bd5bd37446bd
- advertised rollout path:
- /Users/.../.codex/sessions/2026/04/05/rollout-2026-04-05T18-09-07-019d5fe8-3730-7dc0-b126-
bd5bd37446bd.jsonl
After turn/completed:
- thread/read(includeTurns: false) succeeds
- thread/read(includeTurns: true) returns:
- thread 019d5fe8-3730-7dc0-b126-bd5bd37446bd is not materialized yet; includeTurns is unavailable
before first user message
- sibling thread/resume returns:
- no rollout found for thread id 019d5fe8-3730-7dc0-b126-bd5bd37446bd
- the rollout file does not exist on disk at the advertised path
Waiting a few more seconds does not change the outcome.
Additional information
Notes
This seems to specifically affect shared-thread / multi-client websocket usage.
Lightweight thread state is visible across clients, but rollout-backed operations never become available
because the rollout is never materialized.
What issue are you seeing?
On
codex-cli 0.117.0, a shared websocketcodex app-servercan run a real user turn to completion, butthe rollout file is never materialized on disk.
As a result:
thread/readwithincludeTurns: falseworksthread/readwithincludeTurns: truefailsthread/resumefails withno rollout found for thread id ...Environment
0.117.0rust-v0.117.04c70bff480af37b1bf1a9b352b8341060fe55755codex app-server --listen ws://127.0.0.1:9891What steps can reproduce the bug?
Repro
initialize.thread/start.turn/startwith:{ "threadId": "<thread-id>", "input": [ { "type": "text", "text": "Please reply with exactly the word materialized.", "text_elements": [] } ] }What is the expected behavior?
Expected behavior
After the first real user turn completes on a non-ephemeral shared thread:
Actual behavior
The turn fully runs, but no rollout file is created.
Observed repro thread:
bd5bd37446bd.jsonl
After turn/completed:
before first user message
Waiting a few more seconds does not change the outcome.
Additional information
Notes
This seems to specifically affect shared-thread / multi-client websocket usage.
Lightweight thread state is visible across clients, but rollout-backed operations never become available
because the rollout is never materialized.