[Windows Desktop 26.707.8479.0] Concurrent subagent streams flood both renderers, then silently terminate the AppX container
What version of the Codex App are you using (From “About Codex” dialog)?
26.707.8479.0
Bundled Codex CLI/app-server: 0.144.2
What subscription do you have?
Not relevant to this local Desktop process failure.
What platform is your computer?
Microsoft Windows NT 10.0.19045.0 x64 (Windows 10 Pro 22H2)
What issue are you seeing?
Summary
Codex Desktop silently terminated and relaunched its full AppX container three times during one session. The strongest reproduction occurred while six concurrent subagents from two independent parent tasks were streaming progress.
The Desktop did not register those child conversation IDs in its normal thread store, but it broadcast every child event to both renderers:
rendererWindowAppearance=primaryrendererWindowAppearance=avatarOverlay
Both renderers then emitted an error for nearly every child item transition:
Received item/started for unknown conversation conversationId=<redacted-subagent-id>
Received item/completed for unknown conversation conversationId=<redacted-subagent-id>
Conversation state not found conversationId=<redacted-subagent-id>
In the third process lifetime, the main Desktop log contained:
- 2,467 total lines in about 7 minutes
- 1,460
errorlines - 1,454 unknown-conversation/state-not-found errors across eight child IDs
- at least six IDs confirmed as live subagent rollouts
- two separate parent thread IDs
- six distinct depth-1 subagent paths
- the same child events duplicated to the primary renderer and
avatarOverlay
The six child rollout JSONL files were present, readable, and identified themselves as source.subagent.thread_spawn with valid parent thread IDs. None of the six child IDs existed as rows in the Desktop threads table. This is consistent with a routing/hydration boundary bug: child streams are globally broadcast before the Desktop renderer has registered child conversation state.
After the error storm, Windows AppModel-Runtime recorded event ID 217 destroying the complete OpenAI.Codex_26.707.8479.0_x64__2p2nqsd0c76g0 Desktop AppX container. The UI disappeared and a new main process/container was created.
This is not adequately mitigated by disabling multi_agent; concurrent subagents are an intended stable feature and should not destabilize the Desktop host.
What steps can reproduce the bug?
Observed reproduction:
- Use Codex Desktop 26.707.8479.0 with
multi_agentenabled. - Run two independent local parent tasks.
- Spawn three active depth-1 subagents from each parent task.
- Keep the main Desktop window and Pet/
avatarOverlayrenderer active. - Let the child turns stream reasoning/item start/item completion events concurrently.
- Inspect the Desktop main-process log.
- Observe that each child event is rejected as an unknown conversation by both renderers.
- The error volume grows rapidly; in this reproduction it reached 1,454 state errors.
- The full AppX container is destroyed without a normal quit marker, WER event, or Crashpad dump, and Desktop later relaunches.
The three local container exits were:
| Local time | Final Desktop log evidence | AppModel result |
|---|---|---|
| 20:31:40 | log ended at 20:31:34 after unknown-conversation errors plus thread/browser route activity; no shutdown marker | event 217 destroyed container |
| 20:35:08 | log ended at 20:35:03 after repeated unknown conversation and Conversation state not found; no shutdown marker | event 217 destroyed container |
| 20:44:49 | preceding process produced the 1,454-error subagent storm; no normal quit marker | event 217 destroyed container and a new main process was created two seconds later |
The failure is not fully deterministic yet, but the third occurrence provides a high-volume, multi-parent subagent reproduction and the same machine experienced three full-container exits in roughly 13 minutes.
What is the expected behavior?
- Subagent conversations should be registered/hydrated before their events reach renderer conversation-state handlers, or subagent-only events should be intentionally filtered from handlers that require a normal Desktop thread entry.
- The same child stream should not generate duplicate state errors in both the main renderer and
avatarOverlay. - Missing child UI state must be isolated from the parent task and must never terminate the Desktop host.
- Concurrent subagents from unrelated parent tasks must remain isolated.
- If Desktop must restart, it should persist a concrete restart reason and collect a usable diagnostic artifact.
Additional information
Package and system checks:
- Microsoft Store package status:
Ok - Package signature kind:
Store app.asarsize matchedAppxBlockMap.xml- all 3,043 SHA-256 BlockMap chunks for
app.asarverified successfully - no matching Windows Application Error event
- no matching Windows Error Reporting crash event
- no Codex/ChatGPT dump in
%LOCALAPPDATA%\CrashDumps - no Crashpad report for the incidents
- no Windows resource-exhaustion event
- no display-driver reset event
- no
GPU reason=crashedmarker in these three process logs - no
Codex app-server is not availablemarker in these three process logs - no
stop_process, normal shutdown, or package-update transition explaining these three exits
The raw logs and conversation IDs are intentionally not attached because they contain private task data. Sanitized excerpts and aggregate counts above are reproducible from the local artifacts.
Related reports:
- #32738 confirms that this exact build sends subagent events to the primary renderer and
avatarOverlayas unknown conversations, but that report did not observe a crash. - #31583 tracks silent Windows AppX container destruction/relaunch without WER or Crashpad evidence.
- #32722 documents unbounded full conversation snapshot fan-out in this exact Windows package.
This report adds a concrete bridge between those symptoms: concurrent child streams from two parent tasks produced a duplicated renderer error storm immediately within a session that ended in another silent full-container teardown.
8 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks. I reviewed all three suggested duplicates in detail.
This issue adds a separate reliability escalation: the same subagent registration/routing defect was observed at high volume immediately within a process lifetime that ended in another silent full-AppX teardown, and the machine had three such container exits in about 13 minutes. I therefore do not believe #32789 is an exact duplicate of any one suggested issue.
Local investigation conclusion
The strongest evidence points to a Desktop event-routing/hydration boundary failure, not failed subagent execution:
threadsstore.rendererWindowAppearance=primaryrendererWindowAppearance=avatarOverlayunknown conversationorConversation state not found.The same machine recorded three unexpected event-217 container destructions at 20:31:40, 20:35:08, and 20:44:49 local time. None was accompanied by a normal Desktop shutdown marker or a package-update transition.
Checks that did not support alternative explanations
For these three process lifetimes, current checks found:
%LOCALAPPDATA%\CrashDumps;GPU reason=crashedmarker in the Desktop logs;Codex app-server is not availablemarker;stop_processor normal quit marker;Okand signature kindStore;app.asarmatched its declared size, and all 3,043 SHA-256 chunks matchedAppxBlockMap.xml.This rules against package corruption, a recorded GPU/app-server failure, an OS-level OOM/driver reset, or a normal update/restart as the explanation for these three exits.
Confidence boundary
The evidence directly demonstrates the following chain:
active subagents -> child IDs absent from Desktop thread state -> global event broadcast to two renderers -> duplicated unknown-conversation/state errors -> high-volume error storm within a process lifetime that silently loses its AppX containerBecause the product did not preserve a WER/Crashpad dump or final shutdown reason, I am not claiming that the exact final
app.quit/termination instruction has been identified. The missing diagnostic artifact is itself part of the defect. However, the event-routing failure and its high-volume correlation with the full-container exit are concrete and reproducible from the preserved local artifacts.I suggest keeping #32789 open as the Windows Desktop crash/reliability escalation, while linking its registration/routing mechanism to #32737 and #32738 and its silent-container-loss behavior to #31583. If maintainers prefer consolidation, the crash-specific evidence should be carried into the selected canonical issue rather than treating this as only a Pet or VS Code visibility problem.
Update: another full AppX teardown on 26.707.9981.0 (2026-07-15)
The same machine had another unexpected Desktop exit at approximately
18:26 Europe/Lisbon. This occurrence is useful because, unlike the earlier exits reported above, Windows preserved WER events and a local dump.Confirmed timeline
18:24:33.640: the Desktop issued a burst of 40thread/backgroundTerminals/cleanrequests; 39 failed withthread not found.18:24:34: Windows recordedApplication ErrorplusMoAppCrashforChatGPT.exe(PID 25620), exception0xc06d007f.18:26:10.167: the final Desktop lines reportIAB_LIFECYCLE route window is not live.18:26:10.205: the app-server transport begins stopping.18:26:10.513: AppModel-Runtime event 217 destroys the full Desktop AppX container.18:26:36: Windows creates a replacement AppX container and process.The native exception preceded the container teardown by about 96 seconds.
State and workload evidence
Across the terminated process lifetime, the main Desktop log contains:
unknown conversation/Conversation state not founderrors;The Git telemetry stream also recorded 5,394
review_modelGit command completions, including 2,699diffcommands. Those diff records report about 555 MB of aggregate stdout, with many aborted orwaitFailedcompletions.This is strong evidence of abnormal state/workload pressure in the same process lifetime, but it does not by itself prove the final termination instruction.
Native exception boundary
A local minidump stream parse found delay-load metadata with Win32 error 127 (
ERROR_PROC_NOT_FOUND). The metadata maps to the bundled@serialport/bindings-cppnative addon under@worklouder/device-kit-oai; the exact missing exported procedure was not recoverable. WER itself reports the faulting module asunknown, so this should be treated as a diagnostic lead rather than a proven root cause.The same
0xc06d007fexception has since been recorded 12 times in the replacement process while that process remained alive. Therefore this native fault is real, but it is not sufficient on its own to explain the full application exit.Checks
There is also an independent silent-exit reproduction on the exact same Store package version in #23814, triggered there by in-app Browser navigation. The final IAB lines in this occurrence may be part of shutdown rather than the initial trigger, so I am not claiming that Browser activity alone caused this exit.
I have the same issues, can attach logs if needed!
Additional reproduction on Windows Desktop 26.715.2305.0 (2026-07-18)
I hit the same failure pattern on a newer Windows Desktop build. The app became severely laggy during a long, tool-heavy task with concurrent subagents in a large local codebase, then the Desktop app disappeared. After relaunch, I had to delete the affected task to continue working.
I have experienced the slowdown/failure mode at both normal and Ultra reasoning settings. The preserved post-relaunch diagnostics below were collected while using
gpt-5.6-solwithxhighreasoning and the priority service tier.Environment
26.715.2305.00.145.0-alpha.18Microsoft Windows NT 10.0.26200.0 x64The app has since updated to
26.715.4045.0. I have not yet reproduced the crash on that build, so I am not claiming the update fixes it.Renderer/event evidence
Within the preserved
26.715.2305.0log after relaunch:primaryand 1,112 for the hiddenavatarOverlay.Reasoning summary item completeditem IDs were delivered toprimary; the exact same 362 item IDs were also delivered toavatarOverlay.avatarOverlaythen logged:Received item/started for unknown conversationerrorsReceived item/completed for unknown conversationerrorsConversation state not founderrorsSanitized representative lines:
The app-server was also slow during the same period even though the machine had resource headroom:
thread/search: 6,065 msthread/start: 6,700 msthread/resume: 2,897 msmcpServerStatus/list: 8,177 msLocal-state pressure and mitigation result
Before cleanup, the active Codex session history contained 193 rollout files totaling about 805 MB. The three largest individual rollouts were about 154 MB, 122 MB, and 103 MB. In the local thread database, 201 of 262 rows were subagent sessions.
I archived inactive rollout history without deleting it, leaving 3 active files totaling about 29 MB, then restarted the app. The task list subsequently responded in 49 ms and the UI was materially lighter. This is an A/B mitigation result, not proof of the root cause.
Clearing Electron caches does not appear to explain the improvement: only 18.33 MB was moved, and the app immediately recreated about 13.8 MB after restart. During the earlier resource sample, Codex used about 1.37 GB private memory across 10 processes while Windows still had about 12.8 GB available. The disk was healthy and not saturated. No matching WER, local crash dump, or Crashpad report was preserved for the exit.
Why this appears related
This reproduction has the same core boundary failure described in this issue: concurrent subagent events are delivered to both the primary renderer and the avatar overlay, while the overlay lacks state for the child conversations and emits a high-volume unknown-conversation error storm. Large accumulated rollout/thread state appears to amplify startup, task-list, and resume latency.
Potential hardening points suggested by the evidence:
I can provide a more complete sanitized log excerpt if maintainers specify the preferred diagnostic bundle and upload channel.
I reproduced an app-server notification-ordering bug that appears to explain the unknown-conversation flood described here. On macOS, the same ordering failure has a lower-severity manifestation: completed subagent cards can remain active for days, then reconcile to completed immediately when opened.
Root cause
For an AgentControl-spawned child,
try_attach_thread_listenercurrently callsthread_watch_manager.upsert_thread(). That can emitthread/status/changedfor the child before the client has receivedthread/started. Attaching the listener can then replay buffered childturn/*anditem/*notifications before the child thread is known to the client.Clients that reject notifications for unknown thread IDs can therefore discard the child's lifecycle events, including
turn/completed. This matches both the unknown-conversation logs here and the stale-completion behavior in #23930 and #25179.Reproduction and proposed fix
I added an app-server integration test through the public JSON-RPC surface. It spawns a MultiAgentV2 child, observes raw notifications through child
turn/completed, and fails if any child status, turn, or item notification arrives beforethread/started.On current
main, the test fails with:The proposed fix:
Threadfrom the loaded snapshot and resolves its current status;thread/startedbefore attaching listeners that may replay buffered notifications;After the change, the new regression test and two adjacent app-server tests pass.
just fix -p codex-app-server,just fmt, andgit diff --checkalso pass.Public branch and commit:
This proves and fixes the notification-ordering violation. I have not reproduced the Windows AppX container termination itself, so I am not claiming that this patch alone resolves the process crash.
If this approach matches the intended app-server contract, would a maintainer be willing to invite a PR?
Follow-up: I found earlier independent prior art from @brainstencil in #24475 and commit https://github.com/brainstencil/codex/commit/edbde7f4803235090c94d349658e383378dd33e2. That patch identified the same listener-attachment gap and correctly scoped the child
thread/startednotification to the captured connections. Credit to @brainstencil for getting there first.I have now tightened my branch accordingly:
thread/startedis sent only to the initialized connections that are about to receive the child listener stream;thread/status/changedcannot beat registration;turn/completed, rejecting child status, turn, or item events beforethread/started.Updated branch tip: https://github.com/LKRCharon/codex/commit/33b7086958
The targeted regression test passes, as do
just fix -p codex-app-server, Rust formatting, andgit diff --check. The only unrelated repository-wide formatting blocker in this checkout is a missing localdotslashexecutable for the Bazel formatter.I also traced the separate historical-state path in the currently installed Desktop 26.803 bundle. That client now contains a descendant reconciliation flow that discovers subagent threads with reconciliation enabled and derives
donefrom each child conversation latest-turn/runtime state. This supports treating historical self-healing as a Desktop state-reconciliation concern, separate from the app-server live notification-ordering violation fixed by this branch. I have not claimed that closed-client path as part of this source patch.The maintainer-invite request for an upstream PR still stands.
I have an opt-in app-server patch ready for clients that intentionally do not render child threads. With
CODEX_APP_SERVER_SUPPRESS_SUBAGENT_NOTIFICATIONSenabled, child-thread notifications are filtered at the shared outgoing boundary while JSON-RPC requests, responses, errors, and request-resolution messages continue normally. The default behavior is unchanged, and subagents still execute normally.The patch includes coverage for configuration parsing, child-only filtering, preserved request resolution, and lifecycle cleanup. The daemon suite passes all 35 tests; the app-server suite passes 1,314 tests, with 23 unrelated integration failures caused by unavailable companion binaries or host subprocess features.
Patch: https://github.com/luca-ctx/codex/commit/71e1195de1eb73a1fbc24e612e6a20dec226ed32
The repository's invite-only contribution policy prevents opening the PR directly. If this mitigation fits the intended client model, could a maintainer invite or approve the contribution?