openclaw - 💡(How to fix) Fix openclaw update leaves plugin-runtime-deps/<version>/.../plugin-sdk in ENOTEMPTY state — every channel plugin silently fails to load [1 comments, 2 participants]

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…
GitHub stats
openclaw/openclaw#71812Fetched 2026-04-26 05:07:57
View on GitHub
Comments
1
Participants
2
Timeline
4
Reactions
0
Author
Participants
Timeline (top)
cross-referenced ×2closed ×1commented ×1

After running openclaw update from 2026.4.232026.4.24, every bundled channel plugin failed to load with ENOTEMPTY, Directory not empty: .../plugin-sdk. The gateway process stayed up and openclaw gateway status reported healthy (probe ok, admin-capable, listening on the configured port), but all messaging channels were dead, so from a user-facing perspective the agent was completely offline (no Telegram, no WhatsApp, no iMessage, no Signal, etc.).

Recovery required several invocations of openclaw doctor --non-interactive --fix and took ~10–13 minutes of downtime. There was no clear surface signal about what had failed — only gateway status (which was misleadingly green) and the JSON log file.

Error Message

  1. Garbage-collect orphan plugin-runtime-deps/openclaw-<old> trees during update, or warn when more than one exists.

Root Cause

Root cause (best guess)

Code Example

[channels] failed to load bundled channel <NAME>: ENOTEMPTY, Directory not empty:
/Users/<user>/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-da6bdffc3d96/dist/extensions/node_modules/openclaw/plugin-sdk
'/Users/<user>/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-da6bdffc3d96/dist/extensions/node_modules/openclaw/plugin-sdk'

---

~/.openclaw/plugin-runtime-deps/
├── openclaw-2026.4.24-da6bdffc3d96/   # current
└── openclaw-unknown-d9b993c1ba70/      # orphan from a prior version

---

openclaw doctor --non-interactive --fix
# (rerun several times; total recovery time ~10 minutes)
RAW_BUFFERClick to expand / collapse

openclaw update leaves plugin-runtime-deps/<version>/.../plugin-sdk in ENOTEMPTY state — every channel plugin silently fails to load

Summary

After running openclaw update from 2026.4.232026.4.24, every bundled channel plugin failed to load with ENOTEMPTY, Directory not empty: .../plugin-sdk. The gateway process stayed up and openclaw gateway status reported healthy (probe ok, admin-capable, listening on the configured port), but all messaging channels were dead, so from a user-facing perspective the agent was completely offline (no Telegram, no WhatsApp, no iMessage, no Signal, etc.).

Recovery required several invocations of openclaw doctor --non-interactive --fix and took ~10–13 minutes of downtime. There was no clear surface signal about what had failed — only gateway status (which was misleadingly green) and the JSON log file.

Environment

  • OS: macOS Darwin 25.3.0 (arm64), Apple Silicon Mac mini
  • Node: v25.6.1 (homebrew)
  • OpenClaw: upgraded 2026.4.232026.4.24 (cbcfdf6)
  • Install path: /opt/homebrew/lib/node_modules/openclaw
  • Plugin runtime deps path: ~/.openclaw/plugin-runtime-deps/

Reproduction

  1. Have a working OpenClaw install on 2026.4.23 with multiple channel plugins active (telegram, whatsapp, imessage, signal, etc.).
  2. Run openclaw update to 2026.4.24.
  3. Observe gateway start up cleanly per openclaw gateway status (running, probe ok), but no messages flow on any channel.

Symptoms

/tmp/openclaw/openclaw-2026-04-25.log showed 19 occurrences of:

[channels] failed to load bundled channel <NAME>: ENOTEMPTY, Directory not empty:
/Users/<user>/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-da6bdffc3d96/dist/extensions/node_modules/openclaw/plugin-sdk
'/Users/<user>/.openclaw/plugin-runtime-deps/openclaw-2026.4.24-da6bdffc3d96/dist/extensions/node_modules/openclaw/plugin-sdk'

…across at least these bundled channels: telegram, whatsapp, imessage, signal, line, msteams, mattermost, nextcloud-talk, qqbot, tlon, twitch, zalo, synology-chat.

Concurrent secondary noise (likely cascading from the failed plugin loads):

  • 16 occurrences of Unhandled promise rejection: CIAO ANNOUNCEMENT CANCELLED (Bonjour/CIAO mDNS advertiser).
  • Bonjour repeatedly: bonjour: restarting advertiser (service stuck in announcing for ~Xms ...).
  • 15 stability bundles written to ~/.openclaw/logs/stability/openclaw-stability-2026-04-25T22-...-unhandled_rejection.json between 15:43 and 15:50 PDT.
  • WebSocket handshake timeouts: cause=handshake-timeout handshake=failed durationMs=15761.
  • During reconnects: chat.history unavailable during gateway startup.

Root cause (best guess)

openclaw update extracted plugin-runtime-deps/openclaw-2026.4.24-da6bdffc3d96/dist/extensions/node_modules/openclaw/plugin-sdk non-atomically. The plugin-sdk directory contained ~308 files of partial/leftover content (likely hardlinks from npm/pnpm sharing with the previous version's tree or from the older openclaw-unknown-d9b993c1ba70 tree that still lives in the same parent dir). On plugin load, the channel plugin loader tried to clean/relink that directory and got ENOTEMPTY.

The system on this machine had two plugin-runtime-deps trees side by side:

~/.openclaw/plugin-runtime-deps/
├── openclaw-2026.4.24-da6bdffc3d96/   # current
└── openclaw-unknown-d9b993c1ba70/      # orphan from a prior version

It's possible the orphan tree contributed shared hardlinks that confused the cleanup step.

Fix that worked

openclaw doctor --non-interactive --fix
# (rerun several times; total recovery time ~10 minutes)

After enough retries, doctor --fix was able to remove the offending plugin-sdk directory and let the new tree extract cleanly. All channels then loaded and the gateway accepted traffic again.

Suggested fixes / improvements

  1. Atomic extraction of plugin-runtime-deps/<version>/. Extract into a sibling temp dir and rename(2) into place, so no consumer ever observes a partial plugin-sdk directory.
  2. openclaw update should run the equivalent of doctor --fix automatically on completion, or at minimum verify that all bundled channels load before declaring the update successful.
  3. Surface plugin-load failures in openclaw gateway status. Today, status reports running / probe ok / admin-capable even when every channel plugin has failed to load. A "channels: N healthy / M failed" line (or a non-zero exit code on degraded state) would have made this trivially diagnosable.
  4. Garbage-collect orphan plugin-runtime-deps/openclaw-<old> trees during update, or warn when more than one exists.
  5. Make the CIAO/Bonjour Unhandled promise rejection: CIAO ANNOUNCEMENT CANCELLED a logged warning, not an unhandled rejection. Each one writes a stability bundle (15 in 7 minutes here), inflating the stability dir and noise.

Logs / evidence

Available on request from the affected machine (paths shown for reference):

  • /tmp/openclaw/openclaw-2026-04-25.log
  • ~/.openclaw/logs/stability/openclaw-stability-2026-04-25T22-*-unhandled_rejection.json (15 files)
  • ls ~/.openclaw/plugin-runtime-deps/ showing both openclaw-2026.4.24-da6bdffc3d96 and openclaw-unknown-d9b993c1ba70.

Happy to share scrubbed log excerpts if helpful.

extent analysis

TL;DR

The most likely fix for the issue is to modify the openclaw update process to extract plugin-runtime-deps/<version>/ atomically and run the equivalent of doctor --fix automatically on completion.

Guidance

  • Verify that the plugin-runtime-deps directory is properly cleaned up during the update process to prevent leftover files from causing issues.
  • Consider implementing a check in openclaw gateway status to report plugin-load failures and provide a more accurate status.
  • Run openclaw doctor --non-interactive --fix multiple times to recover from the issue, as it was able to remove the offending plugin-sdk directory and allow the new tree to extract cleanly.
  • Investigate garbage-collecting orphan plugin-runtime-deps/openclaw-<old> trees during update to prevent similar issues in the future.

Example

No code snippet is provided as the issue is related to the openclaw tool and its update process, and the fix involves modifying the tool's behavior rather than writing custom code.

Notes

The issue is specific to the openclaw tool and its update process, and the fix may require modifications to the tool itself. The provided guidance is based on the information provided in the issue and may not be applicable to other scenarios.

Recommendation

Apply the workaround of running openclaw doctor --non-interactive --fix multiple times to recover from the issue, and consider modifying the openclaw update process to extract plugin-runtime-deps/<version>/ atomically and run the equivalent of doctor --fix automatically on completion to prevent similar issues in the future.

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 openclaw update leaves plugin-runtime-deps/<version>/.../plugin-sdk in ENOTEMPTY state — every channel plugin silently fails to load [1 comments, 2 participants]