You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In-place update can leave Gateway/UI/Codex in mixed-version state and make recovery difficult
Summary
After running an OpenClaw update from the Control UI on macOS, the local install entered a mixed-version / partially restarted state. Recovery was difficult because several independent-looking failures appeared together:
update.run restart was coalesced as already in-flight, with no useful visible UI feedback.
Gateway shutdown hit a missing built asset from the global install path: ERR_MODULE_NOT_FOUND: .../dist/hook-runner-global-BaH8wNFP.js.
The browser Control UI repeatedly failed the Gateway handshake with protocol mismatch, first as vcontrol-ui, then as stale v2026.5.5.
Codex-backed sessions failed with Requested agent harness "codex" is not registered.
Telegram ingress exited during the same recovery window.
Some individual symptoms match issues that were later fixed or tracked separately, but the recovery problem was the combination: the updater left the operator with a running but inconsistent system, where UI, Gateway, installed files, and Codex plugin/runtime state did not agree.
At the same time, Codex-backed agent work failed because the codex harness was unavailable:
2026-05-15T18:18:43.634+03:00 [diagnostic] lane task error: lane=main durationMs=129 error="Error: Requested agent harness "codex" is not registered."
2026-05-15T18:18:43.642+03:00 Embedded agent failed before reply: Requested agent harness "codex" is not registered.
2026-05-15T18:18:43.660+03:00 [telegram] [default] channel exited: Telegram ingress worker exited with code 1
The Gateway also reported only Brave as discovered at first, not Codex:
2026-05-15T18:18:43.521+03:00 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: brave (/Users/.../.openclaw/npm/node_modules/@openclaw/brave-plugin/dist/index.js). Set plugins.allow to explicit trusted ids.
After later recovery, current logs show both Brave and Codex discovered:
[plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: brave (...), codex (...). Set plugins.allow to explicit trusted ids.
The missing dist/hook-runner-global-*.js error looked like a partially replaced global package or stale process importing chunks from a different build.
Because these failures appeared together, it was unclear whether the right fix was reload UI cache, restart LaunchAgent, reinstall/update OpenClaw, run doctor --fix, repair plugins, or edit config.
Expected behavior
The update path should avoid leaving the system in a mixed-version state where:
the live process imports old chunk names from a partly replaced package,
browser UI assets advertise a protocol unsupported by the running Gateway,
existing/new sessions request a harness whose owner plugin is not registered,
and the only visible update state is restart coalesced.
If an update is already in-flight or a restart is pending, the UI/CLI should provide a clear recovery instruction and health check, e.g. "restart pending; wait/reload" vs "update failed; run doctor/reinstall".
Actual behavior
The system became partially usable but not operator-recoverable from the UI:
Control UI websocket handshakes were rejected with protocol mismatch.
Codex-backed turns failed before reply.
Telegram ingress exited.
Logs contained a missing built module from the installed package path.
Manual log inspection and later repair/update were needed to get back to a clean state.
Related issues
This report is intentionally about the combined update/recovery failure mode, not a request to reopen every individual symptom:
Make the update/install step more atomic for global installs, or ensure the old process never imports newly missing hashed dist/* chunks during shutdown.
Surface restart.coalesced in Control UI as an actionable state, with a timeout/failure path.
After update, run a post-restart compatibility probe that checks:
Gateway protocol vs served UI protocol,
required harness plugins for configured/session runtime routes,
plugin package versions vs host version,
missing built artifacts referenced by the running process.
Add an explicit "update recovery" command or doctor mode that validates mixed-version state and suggests the narrowest repair.
In-place update can leave Gateway/UI/Codex in mixed-version state and make recovery difficult
Summary
After running an OpenClaw update from the Control UI on macOS, the local install entered a mixed-version / partially restarted state. Recovery was difficult because several independent-looking failures appeared together:
update.runrestart was coalesced as already in-flight, with no useful visible UI feedback.ERR_MODULE_NOT_FOUND: .../dist/hook-runner-global-BaH8wNFP.js.protocol mismatch, first asvcontrol-ui, then as stalev2026.5.5.Requested agent harness "codex" is not registered.Some individual symptoms match issues that were later fixed or tracked separately, but the recovery problem was the combination: the updater left the operator with a running but inconsistent system, where UI, Gateway, installed files, and Codex plugin/runtime state did not agree.
Environment
127.0.0.1:18789OpenClaw 2026.5.18 (50a2481)v25.9.02026-05-15 18:16-18:23 +03:00@openclaw/[email protected]@openclaw/[email protected]Timeline / evidence
The first sign was an already in-flight update restart:
During shutdown/restart, the gateway referenced a built file that was not present in the global install:
After that, the browser Control UI could not connect because the client/server protocol versions were out of sync:
At the same time, Codex-backed agent work failed because the
codexharness was unavailable:The Gateway also reported only Brave as discovered at first, not Codex:
After later recovery, current logs show both Brave and Codex discovered:
Why recovery was hard
The symptoms pointed in different directions:
update.runsaid a restart was already in-flight, but the operator UI did not clearly explain whether to wait, refresh, retry, or run a CLI repair. This overlaps with Update button silently no-ops when update.run is coalesced #78481.dist/hook-runner-global-*.jserror looked like a partially replaced global package or stale process importing chunks from a different build.doctor --fix, repair plugins, or edit config.Expected behavior
The update path should avoid leaving the system in a mixed-version state where:
restart coalesced.If an update is already in-flight or a restart is pending, the UI/CLI should provide a clear recovery instruction and health check, e.g. "restart pending; wait/reload" vs "update failed; run doctor/reinstall".
Actual behavior
The system became partially usable but not operator-recoverable from the UI:
protocol mismatch.Related issues
This report is intentionally about the combined update/recovery failure mode, not a request to reopen every individual symptom:
update.runis coalescedSuggested fixes
dist/*chunks during shutdown.restart.coalescedin Control UI as an actionable state, with a timeout/failure path.