Browser / computer-use fails intermittently with “transport closed” and “kernel exited unexpectedly”
What version of the Codex App are you using (From “About Codex” dialog)?
Codex 26.527.60818
What subscription do you have?
PRO
What platform is your computer?
Microsoft Windows NT 10.0.26200.0 x64
What issue are you seeing?
<img width="774" height="281" alt="Image" src="https://github.com/user-attachments/assets/5493dc80-f1a3-4b9e-9d8e-7640286c3786" />
Whenever I try to use the browser or computer-use feature in the Codex App, it intermittently fails with errors such as “transport closed” and “kernel exited unexpectedly.”
The issue is inconsistent: sometimes the browser/computer-use feature works, but other times it fails with the same error. I have tried troubleshooting/restarting, and it may temporarily work again, but the problem keeps coming back.
This blocks browser-based debugging and computer-use workflows inside Codex.
What steps can reproduce the bug?
- Open the Codex App.
- Start a new Codex thread.
- Ask Codex to use the browser or computer-use feature.
- Wait for the browser/computer-use environment to start.
- The tool sometimes fails with an error similar to:
- “transport closed”
- “kernel exited unexpectedly”
Feedback ID: 019e6759-843e-7cb2-864e-e12de4b1487f
What is the expected behavior?
The browser/computer-use feature should start reliably and remain available during the Codex session. It should not randomly fail with “transport closed” or “kernel exited unexpectedly.”
Additional information
The issue appears intermittent. Restarting or retrying may temporarily help, but the error eventually returns.
Please let me know if there are specific logs, diagnostics, or debug files I should attach.
5 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Additional macOS reproduction and recovery evidence from Codex Desktop:
mcp__node_repl__js/ Computer Use handle returned a hardTransport closed.SkyComputerUseServicewas still alive, so this was not a complete service failure.SkyComputerUseClient event-stream mcpprocesses and 18cua_node/bin/node_replprocesses, plus one service.Recovery that worked without restarting Codex or WhatsApp:
mcp__node_repl__js_reset.setupComputerUseRuntime({ globals: globalThis }).get_app_statesmoke test.get_app_statesmoke test.Both Finder and WhatsApp returned their accessibility trees immediately after the reset. No helper processes, apps, or the main Computer Use service had to be killed or restarted.
This suggests at least one failure mode is an already-loaded MCP/kernel transport becoming wedged while the underlying Computer Use service remains healthy. A useful product-side recovery would be to detect
Transport closed, discard/recreate the loaded node_repl transport automatically, and retry a read-only probe once. The large unreaped helper/client fan-out may be related and is worth checking as a recurrence contributor.Current-build recurrence boundary and healthy Chrome control from macOS on 2026-07-12:
26.707.51957(build5175)0.144.0-alpha.4; global CLI0.144.126.5.2(25F84)26.707.519571.0.1000387The machine currently has dozens of paired
SkyComputerUseClient event-stream mcpandcua_node/bin/node_replhelpers, with some pairs several hours old while new pairs continue to appear. Desktop logs from the same day also show repeated 30-second app-server initialize handshake timeouts across reconnect attempts (for example attempts 37, 44, 54, and 162). I am treating those handshake timeouts as adjacent lifecycle evidence, not as proof of a Chrome-extension root cause.Most useful control: in a fresh task/runtime on the same installed build, the Chrome extension backend initialized successfully and
browser.user.openTabs()returned three live Chrome tabs immediately. This rules out a globally broken Chrome extension/native-host installation for the current incident. It fits the failure pattern already described here: an older task-local Browser/Computer Use transport can wedge or close while a fresh runtime on the same machine and build remains healthy.The product ask is automatic containment and recovery at the task boundary:
node_repltransport.That distinction would prevent misleading reinstall guidance when Chrome itself is connected and a fresh task can prove it.
Independent Windows reproduction on the current Store build
This is the same intermittent
transport closed/kernel exited unexpectedlyfailure family, reproduced on a substantially newer build with a more precise failure boundary.Environment
OpenAI.Codex 26.730.8199.0(x64)26.730.61639Status: Ok; Store signature validDeterministic failure boundary
A durable stage log from one affected task showed:
browser-client.mjsimport succeeded.setupBrowserRuntime()succeeded.agent.browsers.get("chrome")succeeded.chrome.user.openTabs()succeeded and returned 17 tabs.BrowserUserTabInfoobject was selected.chrome.user.claimTab(tabObject)before the promise returned.The tool reported:
No recoverable JavaScript/browser API exception was returned.
A separate bounded retest in a fresh task produced the broader lifecycle symptoms:
stdout_eof.openTabs()probe succeeded and returned 15 tabs.claimTab()) again terminated the worker withstdout_eof.Ruled-out causes
The following were checked and did not resolve or explain the failure:
session_id === thread_id.Suggested runtime fix
setupBrowserRuntime()idempotent: reuse a healthy runtime after a cheap health check instead of disposing/recreating it (closely related to #27128).claimTab(),tabs.new(), and setup/bridge operations as bounded promise rejections with actionable stage/error metadata; never terminate the Node worker.nodeRepl.write("alive")probe.Regression tests
Please test this sequence on Windows:
openTabs().openTabs()once toclaimTab(), then finalize it as a handoff.Safe containment already implemented locally
Until a signed runtime fix is available, the local protocol now:
setupBrowserRuntime()or resets,stdout_eof,Detailed stage logs, timestamps, process IDs, app-log excerpts, and the sanitized reproduction transcript can be provided privately if a maintainer requests them.
Reward / recognition question
Because this report adds a current-build reproduction, isolates the exact worker boundary, rules out several common causes, supplies a containment protocol, and proposes concrete regression tests, please let us know whether OpenAI has any bug-reward, researcher-recognition, or account-credit program applicable to non-security reliability defects, and whether this report may qualify.
Current macOS reproduction: helper accumulation leads to Browser policy-read failure, then
Transport closedThis appears to connect the Browser/Computer Use transport symptom in this issue with the temporary MCP lifecycle leak discussed in #35485 and #38171.
Environment
26.810.41047(build6570)codex-cli 0.148.0-alpha.926.810.4104725.5.0, arm64Reproduction and failure boundary
``
text
``Browser Use could not complete this action because a browser security check was unavailable.
Reason: The admin-enforced policy could not be verified.
node_replhelper to force a clean rebind, later calls in the same Codex thread return a hard:``
text
``Transport closed
The next user turn still routes to that closed transport, so the app-server/desktop registry retains the dead binding rather than creating a healthy replacement.
This was reproduced across unrelated origins and both Browser surfaces. The Browser service, browser tabs, ordinary network access, device attestation, and UI-level
config/read/configRequirements/readremained healthy. No managed Browser deny rule was present.Process and timing evidence
cua_node/bin/node_replprocesses, all direct children of the single desktop app-server.mcpServerStatus/listtaking 301,100 ms.Source-level analysis
The bundled
browser-client.mjspolicy check callsconfig.readRequirements()andconfig.readAll()inPromise.all. A catch-all converts any exception from either read into the single"unavailable"result, which is then surfaced ascodex-network-policy-unavailable/ “admin-enforced policy could not be verified.” An actual policy deny uses a different result (codex-network-policy). This explains why a local config-capability transport failure is presented as an enterprise policy problem.Current public
openai/codexmain (86b1123ff6b5d089a146be4e603a324cf454223a) also still has the temporary status-manager lifecycle gap:mcpServerStatus/listis detached withtokio::spawn.collect_mcp_server_status_snapshot_with_detaileagerly creates a freshMcpConnectionSet, collects inventory, calls onlycancel_token.cancel(), and returns without awaitingmcp_connection_manager.shutdown()(lines 463-473).McpConnectionSet::shutdown()is explicitly documented to terminate owned stdio server processes.AsyncManagedClient::shutdown()performs both cancellation and the transport shutdown; cancellation alone is not the same cleanup path.PR #20447 (“Fix MCP status/list lifecycle leak”) proposed the narrow matching fix: await the RPC work and explicitly call
shutdown()on temporary MCP managers. It was closed by the stale bot without being merged, while current main still shows the same lifecycle pattern.Suggested fix and regression coverage
mcpServerStatus/listinside the tracked/serialized request future;McpConnectionSet::shutdown()before a temporary status snapshot returns, including cancellation/error paths.mcpServerStatus/listcalls must leave the helper-process count at baseline after each response.node_repltransport reportsTransport closed, invalidate the registry entry and recreate it once instead of routing later turns to the dead handle.The source gap alone may not explain every transport failure in this issue, but it directly matches the observed helper growth, the 301-second status call, restart-only temporary recovery, and the subsequent Browser config-capability failure on this current macOS build.