Repository navigation
Windows Codex Desktop: opening/resuming historical subagent threads spawns duplicate MCP and node_repl process stacks #37453
Description
What version of the Codex App are you using (From “About Codex” dialog)?
Codex Desktop package: OpenAI.Codex_26.803.5235.0_x64
What subscription do you have?
This appears related to MCP lifecycle/refresh handling + sub agents
What platform is your computer?
No response
What issue are you seeing?
Summary
Codex Desktop on Windows creates duplicate local MCP and node_repl.exe process stacks when I open/resume historical chats that contain many completed subagents.
This occurs even when I do not send a new message or run a tool. Simply opening an old parent chat, and then opening a completed child thread in the Subagents panel, triggers thread/resume and starts another full set of local MCP processes.
The processes remain alive as children of the current codex.exe app-server instead of returning to a bounded baseline.
Environment
- OS: Windows
- Codex Desktop package:
OpenAI.Codex_26.803.5235.0_x64 - Main process:
codex.exe -c features.code_mode_host=true app-server --analytics-default-enabled - Configured local stdio MCP servers:
- MarkItDown
- brain-memory
- brain-knowledge
- Also enabled:
node_repl/ Browser / Computer Use
Reproduction
- Fully quit Codex Desktop.
- Launch Codex Desktop and do not open historical chats initially.
- Baseline is one process stack:
- 1
node_repl.exe - 1 MarkItDown MCP wrapper
- 1 brain-memory MCP wrapper
- 1 brain-knowledge MCP wrapper
- 1
- Open one historical parent chat with many old subagents. Do not send a message.
- The Subagents panel initially shows many old children as
Working. - Open one or more old child threads. Their displayed state immediately changes from
WorkingtoDone. - Observe duplicate process stacks under the current
codex.exe.
Observed result
After opening a historical parent chat and inspecting old child threads, the current codex.exe had:
- 8
node_repl.exedirect children - 8 MarkItDown MCP wrapper processes
- 8 brain-memory MCP wrapper processes
- 8 brain-knowledge MCP wrapper processes
- 32 direct helper processes total
- 48 Python processes in the Codex process tree
No new user task, subagent launch, or MCP tool call was requested.
The local app-server log shows thread/resume at the same timestamps as MCP startup / tool catalog initialization, including:
app_server.request ... otel.name="thread/resume"
MCP server ... Processing request of type ListToolsRequest
codex_mcp::connection_manager::tool_catalog
### What steps can reproduce the bug?
## Summary
Codex Desktop on Windows creates duplicate local MCP and `node_repl.exe` process stacks when I open/resume historical chats that contain many completed subagents.
This occurs even when I do not send a new message or run a tool. Simply opening an old parent chat, and then opening a completed child thread in the Subagents panel, triggers `thread/resume` and starts another full set of local MCP processes.
The processes remain alive as children of the current `codex.exe app-server` instead of returning to a bounded baseline.
## Environment
- OS: Windows
- Codex Desktop package: `OpenAI.Codex_26.803.5235.0_x64`
- Main process:
`codex.exe -c features.code_mode_host=true app-server --analytics-default-enabled`
- Configured local stdio MCP servers:
- MarkItDown
- brain-memory
- brain-knowledge
- Also enabled: `node_repl` / Browser / Computer Use
## Reproduction
1. Fully quit Codex Desktop.
2. Launch Codex Desktop and do not open historical chats initially.
3. Baseline is one process stack:
- 1 `node_repl.exe`
- 1 MarkItDown MCP wrapper
- 1 brain-memory MCP wrapper
- 1 brain-knowledge MCP wrapper
4. Open one historical parent chat with many old subagents. Do not send a message.
5. The Subagents panel initially shows many old children as `Working`.
6. Open one or more old child threads. Their displayed state immediately changes from `Working` to `Done`.
7. Observe duplicate process stacks under the current `codex.exe`.
## Observed result
After opening a historical parent chat and inspecting old child threads, the current `codex.exe` had:
- 8 `node_repl.exe` direct children
- 8 MarkItDown MCP wrapper processes
- 8 brain-memory MCP wrapper processes
- 8 brain-knowledge MCP wrapper processes
- 32 direct helper processes total
- 48 Python processes in the Codex process tree
No new user task, subagent launch, or MCP tool call was requested.
The local app-server log shows `thread/resume` at the same timestamps as MCP startup / tool catalog initialization, including:
```text
app_server.request ... otel.name="thread/resume"
MCP server ... Processing request of type ListToolsRequest
codex_mcp::connection_manager::tool_catalog
### What is the expected behavior?
_No response_
### Additional information
Additional context
This appears related to MCP lifecycle/refresh handling. PR #19753 added explicit shutdown handling for MCP refresh and session shutdown:
https://github.com/openai/codex/pull/19753
Potentially related report:
https://github.com/openai/codex/issues/26869
Activity
github-actions commentedon Aug 7, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
MarkoAvreliy commentedon Aug 7, 2026
Additional confirmed reproduction:
A clean Codex Desktop launch starts with one MCP/node_repl stack.
Opening one historical parent chat with 51 stale subagents, without sending a message, causes
thread/resumeand creates additional full MCP stacks.Opening old child threads changes their UI state from Working to Done and triggers further
thread/resumecalls.Observed after one parent-chat load and inspection of a few children:
Codex logs correlate the launches with app_server thread/resume requests and MCP tool catalog initialization.
This is reproducible without launching a new task, a new subagent, or an MCP tool call.
leadingproblemsolver commentedon Aug 7, 2026
The strongest invariant here seems to be that opening historical state is not an execution transition.
thread/resumecurrently appears to conflate two operations:Those should be separate lifecycle intents. A historical child that is terminal should be loadable with something like:
Only an explicit continuation/new-turn operation should acquire an execution generation and materialize tool resources.
That gives each thread instance a resource lease identity:
A terminal historical thread should have no active lease. Reopening it 20 times may create 20 view sessions, but must still create zero new MCP/runtime stacks.
The reported Working->Done flip on opening a child is also a useful sign that read-time reconciliation is happening. That repair should stay read-only: discovering that historical state is terminal must not activate the runtime in order to prove it.
Regression cases:
The invariant is: history hydration may reconstruct evidence and UI state; only explicit execution intent may allocate live execution resources.
MarkoAvreliy commentedon Aug 8, 2026
Follow-up: local mitigation, validation, and architectural request
This is not a UI-only annoyance in my workflow.
I reproduced the historical-hydration path where completed children can be presented as
Workingagain and local tool/runtime activity can be re-materialized without any new user message. My earlier per-child stdio MCP topology amplified the process symptom, but it was not the root cause.Investigation cost
Approximate workflow telemetry for diagnosis, reproduction, patching, and validation:
These are not exact billed API tokens or exact ChatGPT subscription-quota consumption; that cannot be reconstructed client-side. However, the incident materially affected productivity and forced a subscription-tier increase during the investigation period.
Practical comparison
I moved from Claude Code expecting comparable multi-agent capability with a more economical workflow. In my day-to-day Claude Code workflow, bounded subagent orchestration had been predictable and practical.
In Codex Desktop, the equivalent workflow became operationally unsafe: reopening historical chats could restore stale child state and create uncertainty about whether completed work had truly stopped. This is my field experience, not a universal benchmark claim, but it is a major regression for a user relying on many small workers.
Experimental local mitigation
I published a sanitized, reproducible checkpoint:
It does not disable MCP, browser control, computer use, Node tools, or subagents. Instead it keeps lifecycle boundaries intact:
Validation: 4 lifecycle tests and 3 lazy-resume MCP integration tests passed. Opening four historical parent chats with completed children produced 0 new Python, 0 new Node, and 0 new
node_replprocesses, and no history-triggered MCP, child-spawn/resume, or model-transport references.This is an experimental local mitigation, not an official OpenAI fix or distributable Codex build.
IMPORTANT FOR CODEX USERS AND MAINTAINERS
HISTORICAL CHAT VIEWING MUST BE PASSIVE. A COMPLETED CHILD MUST NOT BE RESTORED AS A RUNNABLE RUNTIME JUST BECAUSE ITS PARENT CHAT WAS OPENED.
DEFAULT CHILDREN SHOULD BE LIGHTWEIGHT AND DENY-BY-DEFAULT FOR MCP SERVERS, PLUGINS, SKILLS, AND OTHER HEAVY TOOLING.
The orchestrator can retain its full toolset. Ordinary child workers should start with a minimal profile and bounded context; a specific MCP or plugin should be enabled only for the specialized child that actually needs it.
Suggested model:
If every child inherits the parent’s full tool surface and history by default, it creates an amplification risk: unnecessary process churn, configuration conflicts, avoidable context overhead, and potentially unnecessary agent/model usage.
Codex needs first-class lifecycle isolation and a safe lightweight-child default, while preserving deliberate opt-in to specialist tools.
dingaiminGIT commentedon Aug 20, 2026
I reproduced the same restart/resume amplification on macOS. This appears to be the cross-platform counterpart of this issue, with a related live-session retention symptom tracked in #38925.
I also reviewed the experimental mitigation described above. Its passive-history invariant matches my findings. The prototype below targets complementary paths that were still visible in my macOS restart captures: restored root sessions, internal summary sessions, concurrent cold tool-catalog discovery, and safe local-stdio retirement after a real turn.
Environment
uv+ Python process pairsObserved behavior
Before the mitigation, one capture contained 96
uvand 102 Python processes, using about 5.7 GB RSS in aggregate. During restarts the ChatGPT process reached 18–26 GB and macOS displayed the system out-of-memory dialog.The configuration contained one entry per MCP server. The duplicates were descendants of the same live app-server. In a bounded restart capture, five resumed threads produced eight complete MCP generations; each configured server appeared eight times as a launcher/runtime pair.
A minimal observation sequence was:
codex ... app-serverby PPID and creation time;Before the prototype, multiple complete MCP groups appeared during step 3. After the prototype, the count remained zero until step 5.
This is not only a final app-server shutdown problem. The amplification has multiple sources:
Environmentobject identity prevents otherwise identical host-local catalogs from sharing across sessions;Prototype and validation
I built a version-matched prototype with the following behavior:
ephemeral=true,threadSource=Feature("system"), and plugins disabled; explicit subagents, HTTP MCPs, Codex Apps, and remote stdio are preserved;The prototype maps these behaviors to existing ownership points rather than to Code Mode cell teardown:
core::session::mcp_runtimeselects the startup policy from thread restore/ephemeral context and owns turn begin/finish transitions;codex_mcp::runtime::McpRuntimepublishes connection generations and performs the dormant cold swap;McpToolCatalogCachecoordinates an optional-startup owner per complete local identity;McpConnectionManager::shutdown_local_stdioretires only host-local stdio transports after old bindings drain.I initially considered shutting MCP down after each Code Mode execution cell, but source and PID tests showed that the MCP runtime is session/thread-owned. Cell-scoped shutdown would be too early and could break later MCP calls in the same turn or session.
Focused validation included:
codex-mcpunit tests;-D warningsfor the affected crates and an arm64 release build.In the post-change restart capture, the new app-server had zero local MCP/
uvprocesses until the first user turn. That turn created one MCP group for its cwd. Three internal summary sessions created no additional groups. A concurrent task in a different cwd created a second group as expected, and that group disappeared after its turn. A normal quit followed by an immediate reopen did not require waiting for Python/uvprocesses manually; the old group reached zero before the new app-server activated a group.Proposed upstream shape
I have a working prototype, but it is cumulative, version-bound, and based on an older bundled alpha. I am intentionally not posting that diff as an unsolicited PR. If this direction matches the intended ownership model, I can rebase/reimplement it on current
mainand split it into focused changes:Feature("system")check.Would maintainers be interested in this direction, and if so, which slice would you prefer as the first invited PR?
No internal server names, credentials, command arguments, or private paths need to be included in an upstream change.
PracticalSwan commentedon Sep 6, 2026
Fresh reproduction on the current Windows Desktop package confirms this is still present in
OpenAI.Codex 26.901.5280.0/ bundledcodex-cli 0.153.4.From one long-lived Desktop
codex.exe app-serverprocess, a read-only process-tree snapshot currently shows multiple helper generations still resident simultaneously:node_repl.exechildren created at different thread/runtime generations;node.exechildren;cmd.exelauncher children;The generations have distinct creation times under the same app-server process (
09:00,16:48,18:32,19:05local time on 2026-09-06), rather than replacing/releasing the prior generation.A particularly useful lifecycle data point comes from a normal V2 review child in a completed multi-agent session:
node_repl, CUA, app-tools/security MCP and configured MCP processes were still resident under the parent app-server.Separately, the app-server log at another generation boundary shows
thread/resumefollowed immediately by session initialization/tool-runtime activity, consistent with the original report.So on the current build this is not only a stale UI symptom: completed/resumed thread runtimes can leave process resources resident instead of returning toward the app-server baseline. This supports the invariant already proposed in this issue: historical hydration should be passive, and an execution generation should release its owned tool/runtime resources when the thread/child becomes terminal.
No processes were terminated for this check; this is observation-only.
PracticalSwan commentedon Sep 6, 2026
Reproduces on a newer Codex Desktop update as well.
Environment:
OpenAI.Codex 26.901.6511.0codex-cli 0.153.426.901.51231Fresh app-server start was at 23:49:59 local. At 23:57:31 the Desktop issued one
thread/resumefor a historical thread. In the following 25-second window there were 0turn/startrequests for that resumed thread, but the trace immediately entered:The OS process tree shows a corresponding runtime/MCP process wave beginning at 23:57:32. At 23:57:41 Codex logged the resumed session's MCP server tasks being cancelled, then created a separate
thread/startruntime wave. A later process-tree snapshot still contained descendants from both creation waves, including multiplenode_repland stdio MCP processes.So the updated build still violates the lifecycle invariant described here: history resume/hydration can materialize executable tool runtime before any model turn is started, and cancelling the logical MCP tasks did not return the OS process tree to a single bounded runtime baseline in this observation.
No prompts, credentials, repository contents, or private MCP configuration are included in this report.
PracticalSwan commentedon Sep 9, 2026
Current-version Windows reproduction with a completed subagent, using process creation times plus durable thread state:
26.903.8094.00.153.4The parent Desktop session created its initial local-helper cohort at about
01:21:24local time. Direct children of the app-server in that cohort currently include:blender-mcp.execmd.exenode.exenode_repl.exeuvx.exeAt
19:07:24Z(02:07:24 local), a subagent started. At that exact second, a second direct-child cohort with the same counts and executable classes was created under the same app-server.The child rollout itself is durably terminal and healthy:
0..193, no gaps/duplicates/backwards transitionstask_completeat19:15:02.070ZAt
04:28local, more than two hours after that child completed, the entire 02:07 helper cohort was still alive alongside the original 01:21 cohort. The parent turn had also become terminal earlier; no restart or cleanup was performed as part of this observation.This is stronger than a process-name-only correlation because the duplicate cohort creation timestamp matches the child-thread start timestamp to the second, while the child has a verified completed durable state. It appears consistent with the MCP/helper lifetime leak described here on a much newer Desktop/runtime build.
I did not terminate these processes because they share the current Desktop app-server and there is unrelated concurrent work on the machine. No private thread IDs, prompts, project names, local data paths, credentials, or process command arguments are included here.
PracticalSwan commentedon Sep 10, 2026
Still reproducible on Windows Desktop
26.903.9818.0Current Store build evidence shows the historical-thread hydration behavior remains present after updating from
26.903.8094.0to26.903.9818.0(Desktop-owned app-server still reports0.153.4).On a clean launch, the Desktop app-server started without duplicate thread-specific MCP cohorts. I then opened an existing historical thread only to recover/read its already-durable history; no model prompt was sent. The log sequence was:
That hydration started a full configured MCP/tool cohort (including node_repl, Browser/Computer Use runtime, CodeGraph, Blender, Playwright, Serena and other configured servers). The thread's durable latest turn is
completedand its history projection is at EOF, but the corresponding helper processes remained direct/indirect children of the same Desktop app-server more than 20 minutes later.Two additional historical threads opened read-only during the same recovery pass created additional cohorts at their respective
thread/resumetimestamps; those processes likewise remained attached to the app-server after the histories were fully materialized and terminal/latest state was known.I did not terminate any helper process because other Desktop work may be active and process age alone is not a safe ownership boundary. This is therefore observation-only current-build evidence:
thread/resumeused for historical hydration still allocates executable MCP/tool resources and those resources are not promptly released when the hydrated thread is already terminal.No account identifiers, transcript content, credentials, or absolute private paths are included.
terragridrtk commentedon Sep 10, 2026
Additional macOS evidence for this issue, with a possible bulk-rename trigger. Related: #40579.
Environment
codex-cli 0.153.4Observed incident
During a user-authorized workflow renaming existing local threads through the native
set_thread_titletool, macOS displayed “Your system has run out of application memory” and attributed 17.43 GB to ChatGPT. The user reports the same memory-exhaustion behavior during an earlier bulk-thread-management run. The rename tools stopped returning partway through the run; 58 of 83 selected threads had the new category prefix when checked read-only. Calls were awaited sequentially, not dispatched in parallel. This was an operational incident, not a controlled from-clean-start reproduction; earlier thread operations had also occurred in the app session.After the user interrupted/recovered the work, a process-tree snapshot still showed approximately 428 app-descendant processes. Repeated sets included approximately:
uvwrappers with their Python MCP childrennpm exec @playwright/mcpwrappers with Node childrennode_replchildren of the same app-serverSumming
proc_pid_rusage(pid, RUSAGE_INFO_V0).ri_phys_footprintover the app processes and all recursive descendants, including externally installed Node/Python binaries, yielded 18,848,910,240 bytes (~17.55 GiB).kern.memorystatus_vm_pressure_levelwas 2. This sum is a separate point-in-time metric, not an assertion of exact equivalence to the earlier macOS dialog value. Summing RSS only within the application bundle had substantially undercounted the problem.The local preparation scripts streamed transcript files line by line. No actual repository/database migration or restore-test database was executed in this round. We stopped further runtime-loading/native bulk actions rather than deliberately reproducing another OOM.
Bounded static observations from the installed desktop JavaScript
set_thread_titlehandler awaits the title persistence path (thread/name/set), then invokes a description-refresh path without awaiting it. That path reaches the optional native bridgethreadMetadataGeneration.generateDescription. Consequently, sequential title-tool acknowledgements do not establish completion of the resulting description-generation work.thread/unsubscribepath exists. We did not invoke private UI methods, patch the bundle, archive threads, or kill unidentified MCP processes as a workaround.Uncertainty / requested investigation
We have not established that the native description-generation bridge itself starts every observed MCP stack, nor that all these processes are permanently leaked. Its implementation was not available in the inspected JavaScript. The repeated process stacks and high memory usage are measured; the causal link from bulk rename through metadata generation to runtime retention remains a hypothesis.
Could the team check whether metadata-only title/description operations unnecessarily initialize tool-enabled sessions, whether inactive-runtime limits are enforced before the one-hour TTL, and whether all MCP descendants are reclaimed when temporary metadata work finishes? A bounded metadata-only rename path would be valuable for thread organization without loading each thread runtime.
This report intentionally omits conversation content/IDs, customer data, local project paths, credentials, full configuration, and raw logs.
Additional question about model usage: The user also reports unexpectedly rapid account-quota consumption during these workflows. We have not attributed quota usage to metadata generation or measured its billing. Please check whether title-triggered description generation performs additional inference and how that work is accounted for. MCP process count or RAM usage alone does not demonstrate token consumption.
PracticalSwan commentedon Sep 11, 2026
Latest-session lifecycle evidence on Windows Desktop 26.903.9818.0
A newer real multi-agent session reproduces the resource-retention side of this issue on the same Store build (Desktop-owned app-server still reports 0.153.4).
Before cleanup, durable state showed the parent’s latest turn completed, all ten child rollouts were structurally valid and projected to EOF, there were 0 recently updated in-progress turns, and Codex’s saved process-manager records mapped to 0 still-live tracked commands. Router activity was also idle.
Despite that terminal/quiescent state, the Desktop root still owned a 225-process subtree. Representative counts were:
node.execmd.exepython.exenode_repl.exeuvx.exeuv.exeblender-mcp.execodex.exe app-serverprocessesOne nested app-server could be traced through
node_repl -> unified-computer-use node -> Desktop app-server; its creation time matched the parent session start exactly, so it was not an unrelated global CLI process.After proving quiescence, I restarted only the exact Store-app root process. All old parent/child helper PIDs disappeared. The freshly relaunched Desktop settled to a 41-process subtree with one app-server and one normal startup tool cohort (13 node, 7 cmd, 4 python, 2 node_repl, one each of uv/uvx/Serena/Blender).
So this current build still retains completed execution/tool cohorts long after durable work is terminal, and those resources are reclaimed by an app restart rather than normal thread completion. This complements the earlier historical-hydration reproduction: the leak is visible after a real completed multi-agent execution as well, not only after read-only
thread/resumehydration.No private thread IDs, prompts, project names, credentials, absolute user-data paths, or command payloads are included.
PracticalSwan commentedon Sep 13, 2026
Fresh current-build evidence from Windows, observed 2026-09-14 local time:
26.908.4834.00.154.0-alpha.6.2(coreRuntimeInUse=false)codex.exe app-server, the retained tool/runtime population includes 8node_repl.exe, 5 Blender MCP wrappers, 5 Serena wrappers, and a second Desktop-binarycodex.exe app-server --listen stdio://nested under anode_replbranch.MCP serverlog events, including dense later bursts. The current Desktop UI log still has 0 panic/fatal/crash records.This shows that the duplicate/retained local runtime symptom still exists on 26.908.4834 / 0.154.0-alpha.6.2. I am not claiming this pass proved the exact passive-history-only trigger again: the current structured log does not contain a
thread/resumestring, and I did not deliberately reopen historical children solely to reproduce it because active work is using the process tree. No process was killed or restarted.This update contains only aggregate process/log metadata; no thread IDs, prompts, paths from task payloads, credentials, or conversation content.
PracticalSwan commentedon Sep 15, 2026
Fresh persistence evidence on Microsoft Store build
26.908.9136.0(Windows x64), after many local sessions had completed.I first verified the local thread store read-only before touching Desktop:
runninghad been updated since September 14 06:00 local time;Despite that quiescent state, the running Desktop app-server owned 33 direct child processes / 86 descendants, including 3
node_repl.exe, 2 Blender MCP processes, 3 Serena launchers, and repeated stdio MCP wrappers.I then performed an exact Desktop-only quit/relaunch, preserving four unrelated Codex app-servers (three global/tunnel-owned plus one VS Code-owned). The quit cleared all Store-app descendants.
On the fresh
26.908.9136.0relaunch, before sending any user turn, the single Desktop app-server immediately created 25 direct children including two complete tool-runtime cohorts:node_repl.exe;Read-only structured app-server logs from this fresh generation contain 0
thread/startand 0thread/resumerequests. Desktop logs show bothprimaryandavatarOverlayrenderer surfaces connecting during startup; the duplicated cohorts appear at the same startup interval. I am not claiming those renderer surfaces are proven causal, only that the duplication now reproduces without a task start/resume and survives in the current Store build.This makes the current symptom broader than leftover processes from long-running historical sessions: a clean Desktop relaunch can allocate duplicate MCP/tool stacks before execution intent. I did not modify package files, thread state, MCP configuration, or WindowsApps contents.
PracticalSwan commentedon Sep 19, 2026
Current-build lifecycle follow-up on Windows Desktop
26.915.4065.0/ Desktop-owned app-server0.155.0-alpha.9.2:thread/resumefor the previously failed parent. There were 0thread/startrecords in the fresh Desktop log.node_replprocesses, repeated Blender MCP trees, repeated CUA/app-tools/security/configured MCP launch stacks, and repeated configured-tool processes under the same app-server.thread/resume, so I am explicitly narrowing the trigger to historical/failed-thread hydration here.So the newest Store build still shows the same resume/hydration -> executable helper materialization path. In this observation cleanup eventually occurred, which is an improvement over the long-lived retained-cohort cases reported above, but one resumed failed thread still temporarily spawned multiple full runtime/MCP cohorts rather than one bounded generation.
No private thread IDs, prompts, project names, credentials, or task payloads are included.
PracticalSwan commentedon Sep 21, 2026
Current-version recurrence on Windows Codex Desktop 26.915.4065.0 / bundled app-server 0.155.0-alpha.9.2 (2026-09-21): after an exact Desktop-only restart, the bundled app-server initially settled to only its conhost child. Reopening a historical thread then appended a resume record without starting a new turn, and a new MCP/node_repl process cohort appeared under that same app-server. The rollout remained terminal and projected exactly to EOF, so this was not active work or transcript corruption. External Codex/app-server trees were separate and untouched. This confirms the resume-triggered process-retention pattern still reproduces on 26.915.4065.0.
DiscoverAlbania commentedon Sep 26, 2026
Fresh reproduction on Windows Codex Desktop 26.924.2738.0 (2026-09-26, Europe/Tirane). This is the same resume-time helper duplication pattern on a newer Store build.
After a full Desktop restart, the
codex.exe app-serverlaunched at 12:17:51. In its first 60 seconds, read-onlylogs_2.sqliteinspection foundthread/resumerecords for 10 distinct thread IDs andthread/startfor one. The helper suites appeared while Desktop restored those chats, before a user tool request. This timing is strong correlation, though it does not alone prove which Desktop call triggers each helper.At 12:33:54, the same app-server tree had 170 processes and 4,345 MiB summed private bytes. Sanitized PID/parent/start-time inventory (no command lines or credentials) showed:
node_repl.exemcp-remoteNode runtimecmd.exewrapperspowershell.exelaunchersconhost.exeNine of the retained Make PowerShell launchers started at 12:18:23–12:18:35; two more started at 12:29:11 and 12:29:46 as chats were used later. So there is both an immediate startup burst and subsequent cohort churn. Asana and Chrome DevTools MCPs had been disabled and were absent after restart, which suggests the issue is repeated initialization of enabled runtimes rather than a failure to apply those toggles.
I have locally replaced Make's stdio
powershell -> npx mcp-remotesetup with Codex's native streamable HTTP MCP configuration. A fresh ephemeral Codex CLI session successfully invoked Makeorganizations_listvia native HTTP. That removes one costly local bridge after the next Desktop restart, but should not affect the repeated computer-use, creative-production, andnode_replcohorts.Suggested regression cases: restore 10 terminal/dormant chats and confirm no full MCP/REPL suite starts until a turn needs it; exercise one active tool turn and confirm one bounded suite; switch among saved chats and complete turns without monotonic process growth; unload/replace a runtime and confirm its Windows child process tree exits. Preserve runtimes for genuinely running background work.
DiscoverAlbania commentedon Sep 26, 2026
Post-restart verification on the same Windows Desktop build (26.924.2738.0):
https://eu1.make.com/mcp,bearer_token_env_var=MAKE_MCP_AUTH_HEADER). The Make plugin and REST access remain enabled.mcp-remotebridge remained anywhere in the process list.organizations_listMCP call succeeded through native HTTP, as did a separate Make REST read and Airtable app ping.node_repl.exe. After brief read-only tool checks, it reached 129 processes / 2,247 MiB, including a nestedcodex.exe app-serverunder a tool runtime.The local transport change removed the repeated Make wrapper cost (previously 22 Make Node processes at ~1,689 MiB private plus 11 PowerShell launchers at ~671 MiB). It does not address the per-chat runtime initialization/retention tracked in this issue. The process and memory figures are summed private bytes for the main app-server descendant tree, not Task Manager's whole-system RAM percentage.
saiafgamal commentedon Oct 7, 2026
I am also observing duplicate MCP process stacks on macOS with completed chats resuming during desktop startup. I have not isolated whether the restoration path is identical to the historical-subagent path in this report, but the process-level result appears related.
Environment
Observed behavior
maybe_resume_successentries reportlatestTurnStatus=completedandmarkedStreaming=true.This is an observed reproduction in an existing installation, not a minimal clean-install reproduction. The exact reason the other completed chats become loaded has not been established.
Process and resource measurements
npm exec @playwright/mcp@latestlaunchers.Mitigations tested
npx ...@latestlaunchers for the 6 custom configurations with direct Node launchers using fixed copies of the same installed package versions. All 6 connectors still initialized and returned their tool catalogs.Expected behavior
Completed/inactive chats should not retain unbounded or unnecessary connector stacks. Please investigate whether these startups and process lifetimes are intended. On-demand startup or explicit MCP start/stop controls would help keep useful connectors configured without incurring their cost for every loaded chat.
Related reports: #50627 (repeated readiness/inventory refresh traffic on macOS) and #42242 (lazy/on-demand MCP startup).
In-app feedback submission also failed
Two attempts at 08:35:49 and 08:36:44 Europe/Istanbul returned error code
-32603:The UI displayed “Feedback upload not confirmed.” A basic HTTPS connection test from this Mac reached the service, but that does not explain or reproduce the app's failed upload requests.
Only sanitized measurements are included here. No raw logs, chat IDs/content, connector endpoints, credentials, or configuration files are attached.