openclaw - 💡(How to fix) Fix UI Update button breaks Gateway when npm global + launchd (handoff deadlock)

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Root Cause

The UI "Update" flow triggers a managed-service-handoff after update.run completes. When already at the latest version, status=skipped is returned, but the handoff stage still attempts a package-manager-mediated restart that conflicts with the launchd-managed process lifecycle. This results in:

  1. update.run returns status=skipped (correct — already latest)
  2. Gateway receives SIGUSR1 → clean shutdown
  3. Supervisor attempts to respawn via managed-service-handoff
  4. Handoff fails because npm global + launchd combo isn't properly handled
  5. Gateway ends up in a broken state (shutdown but not restarted)

Fix Action

Workaround

Use openclaw gateway restart via CLI instead of the UI Update button.

Code Example

13:34:12 update.run completed status=skipped
13:34:14 signal SIGUSR1 received; restarting
13:34:21 shutdown completed cleanly
13:34:21 restart mode: update process respawn (supervisor restart)
13:34:25 http server listening (new process starts)
... then gets killed by handoff collision
RAW_BUFFERClick to expand / collapse

Bug Description

Clicking the "Update" button in the Control UI causes the Gateway to crash/hang when:

  • OpenClaw is installed via npm install -g openclaw (npm global)
  • Gateway is managed by launchd (ai.openclaw.gateway)
  • Already at the latest version so update is skipped

Root Cause

The UI "Update" flow triggers a managed-service-handoff after update.run completes. When already at the latest version, status=skipped is returned, but the handoff stage still attempts a package-manager-mediated restart that conflicts with the launchd-managed process lifecycle. This results in:

  1. update.run returns status=skipped (correct — already latest)
  2. Gateway receives SIGUSR1 → clean shutdown
  3. Supervisor attempts to respawn via managed-service-handoff
  4. Handoff fails because npm global + launchd combo isn't properly handled
  5. Gateway ends up in a broken state (shutdown but not restarted)

Log Timeline

13:34:12 update.run completed status=skipped
13:34:14 signal SIGUSR1 received; restarting
13:34:21 shutdown completed cleanly
13:34:21 restart mode: update process respawn (supervisor restart)
13:34:25 http server listening (new process starts)
... then gets killed by handoff collision

Environment

  • openclaw 2026.5.20
  • macOS 26.5.0 (arm64)
  • npm install -g openclaw
  • Gateway via launchd: ~/Library/LaunchAgents/ai.openclaw.gateway.plist
  • Port 30000, bind=lan

Expected Behavior

When update.run returns status=skipped (no update needed), the Gateway should NOT restart at all, OR the restart should use the standard launchd restart path instead of managed-service-handoff.

Workaround

Use openclaw gateway restart via CLI instead of the UI Update button.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix UI Update button breaks Gateway when npm global + launchd (handoff deadlock)