Bug type
Regression (worked before, now fails)
Beta release blocker
No
Summary
After the 2026-06-05 runtime migration (nvm node + nvm-installed openclaw → Homebrew node@22 + brew-prefix openclaw, third-party plugin relocated to the projects/<hash>/ self-contained layout), the gateway only loads the 8 bundled stock plugins and never loads any externally-installed npm plugin.
A third-party channel plugin @tencent-weixin/[email protected] (plugin id openclaw-weixin) that loaded fine before the migration stopped loading. The WeChat client shows "暂无法链接openclaw" because the channel never starts; openclaw channels login --channel openclaw-weixin succeeds on the WeChat side ("✅ already connected") but ends with invalid channels.start channel.
This reproduces on 2026.5.28, 2026.6.1, and 2026.6.6 (latest), and survives a complete clean reinstall — so it is not the #90007 migration bug alone (that sqlite migration is fixed in 2026.6.6; this is a separate, deeper defect).
Expected
Gateway loads bundled plugins plus enabled externally-installed plugins from the installed-plugin index, e.g. http server listening (9 plugins: ..., openclaw-weixin, ...) (as it did on 2026-05-26).
Actual
[gateway] http server listening (8 plugins: bonjour, browser, canvas, device-pair,
file-transfer, memory-core, phone-control, talk-voice; 0.9s)
openclaw-weixin never appears. openclaw channels list → "no configured chat channels".
Environment
- OS: macOS 15.6 (arm64)
- Node: Homebrew
node@22 v22.22.3 (/opt/homebrew/opt/node@22/bin/node)
- OpenClaw:
npm install -g into /opt/homebrew prefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6
- Gateway: LaunchAgent
ai.openclaw.gateway, gateway.mode = local, port 18789
- Home:
~/.openclaw
Key evidence: index is correct, but the load stage never runs
After a clean install, ~/.openclaw/state/openclaw.sqlite table installed_plugin_index has 1 row that correctly contains the plugin:
host_contract_version = 2026.6.6 (matches running host)
compat_registry_version matches resolveCompatRegistryVersion()
install_records_json includes openclaw-weixin
plugins_json (96 entries) includes a full openclaw-weixin entry (origin: "global", enabled: true, correct source/rootDir/manifestPath)
Yet at OPENCLAW_LOG_LEVEL=trace the gateway logs only the 8 dist/extensions/ bundled loads then loaded 8 plugin(s) (8 attempted). There is not a single log line about projects / installed / discovered / external plugins. The code path that reads installed_plugin_index (loadInstalledPluginIndexInstallRecordsSync) and turns its records into load candidates is never reached.
The plugin module itself is healthy: node --input-type=module -e "import('.../openclaw-weixin/dist/index.js')" → OK; peerDependency openclaw (>=2026.3.22) is satisfied and symlinked to the brew install.
Reproduction
- Pre-migration (2026.5.x, plugin in flat
~/.openclaw/npm/node_modules): gateway loads N+1 plugins including the external one.
- Migrate runtime to brew node@22 + brew openclaw; plugin ends up in
~/.openclaw/npm/projects/<hash>/.
- Gateway now loads only the N bundled plugins.
- Confirm
installed_plugin_index contains the external plugin with matching host_contract/compat versions.
OPENCLAW_LOG_LEVEL=trace shows the installed-plugin load stage never executes.
Independence from version / layout / state (ruled out)
- Versions: 2026.5.28, 2026.6.1, 2026.6.6 → all 8 plugins.
- Layouts:
projects/<hash>/, flat ~/.openclaw/npm/node_modules/@scope/name, symlink into dist/extensions/<name> → all 8 plugins.
- plugins.allow: unset → 8;
["openclaw-weixin"] → 0 (bundled also dropped); ["<8 bundled ids>","openclaw-weixin"] → 8 (weixin still never attempted).
- Config:
openclaw.json has no plugins.allow/plugins.deny/disable flags — only plugins.entries.{openclaw-weixin,xiaomi}.enabled=true.
Full clean rebuild — still fails
- Stop gateway;
DELETE FROM installed_plugin_index / plugin_state_entries / plugin_blob_entries / plugin_binding_approvals.
rm -rf ~/.openclaw/npm ~/.openclaw/plugins.
npm rm -g openclaw (removed 285 pkgs) → npm install -g [email protected].
openclaw plugins install @tencent-weixin/[email protected]; enable; daemon install --force; start.
→ gateway still 8 plugins; index re-populated correctly with weixin; trace still shows the installed-plugin load stage never runs.
Workarounds tried — all ineffective
plugins registry --refresh (does not persist a usable installs.json), reinstall plugin, daemon install --force, doctor --repair/--fix, plugins.allow (all combinations), manually writing a valid current-host installs.json, restoring *.migrated files to original names (re-archived on every boot), placing the plugin in all three layouts, full clean reinstall.
Suspected root cause
A gating condition in the gateway plugin loader (this env: macOS arm64 + Homebrew node@22 + ~/.openclaw home) causes the installed-plugin discovery → candidate stage to be skipped entirely, so installed_plugin_index entries are never converted into load candidates. plugins.allow only filters the bundled-extension candidate set; non-bundled plugins are never added to it under any configuration.
Steps to reproduce
- Pre-migration (2026.5.x, plugin in flat
~/.openclaw/npm/node_modules): gateway loads N+1 plugins including the external one.
- Migrate runtime to brew node@22 + brew openclaw; plugin ends up in
~/.openclaw/npm/projects/<hash>/.
- Gateway now loads only the N bundled plugins.
- Confirm
installed_plugin_index contains the external plugin with matching host_contract/compat versions.
OPENCLAW_LOG_LEVEL=trace shows the installed-plugin load stage never executes.
Expected behavior
Gateway loads bundled plugins plus enabled externally-installed plugins from the installed-plugin index, e.g. http server listening (9 plugins: ..., openclaw-weixin, ...) (as it did on 2026-05-26).
Actual behavior
[gateway] http server listening (8 plugins: bonjour, browser, canvas, device-pair,
file-transfer, memory-core, phone-control, talk-voice; 0.9s)
openclaw-weixin never appears. openclaw channels list → "no configured chat channels".
OpenClaw version
OpenClaw: npm install -g into /opt/homebrew prefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6
Operating system
OS: macOS 15.6 (arm64)
Install method
Node: Homebrew node@22 v22.22.3 (/opt/homebrew/opt/node@22/bin/node)
Model
Gateway: LaunchAgent ai.openclaw.gateway, gateway.mode = local, port 18789
Provider / routing chain
openclaw->local->gpt
Additional provider/model setup details
- OS: macOS 15.6 (arm64)
- Node: Homebrew
node@22 v22.22.3 (/opt/homebrew/opt/node@22/bin/node)
- OpenClaw:
npm install -g into /opt/homebrew prefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6
- Gateway: LaunchAgent
ai.openclaw.gateway, gateway.mode = local, port 18789
- Home:
~/.openclaw
Logs, screenshots, and evidence
After a clean install, `~/.openclaw/state/openclaw.sqlite` table `installed_plugin_index` has 1 row that correctly contains the plugin:
- `host_contract_version = 2026.6.6` (matches running host)
- `compat_registry_version` matches `resolveCompatRegistryVersion()`
- `install_records_json` includes `openclaw-weixin`
- `plugins_json` (96 entries) includes a full `openclaw-weixin` entry (`origin: "global"`, `enabled: true`, correct `source`/`rootDir`/`manifestPath`)
Yet at `OPENCLAW_LOG_LEVEL=trace` the gateway logs **only** the 8 `dist/extensions/` bundled loads then `loaded 8 plugin(s) (8 attempted)`. **There is not a single log line about projects / installed / discovered / external plugins.** The code path that reads `installed_plugin_index` (`loadInstalledPluginIndexInstallRecordsSync`) and turns its records into load candidates is never reached.
The plugin module itself is healthy: `node --input-type=module -e "import('.../openclaw-weixin/dist/index.js')"` → OK; peerDependency `openclaw` (`>=2026.3.22`) is satisfied and symlinked to the brew install.
Impact and severity
No response
Additional information
No response
Bug type
Regression (worked before, now fails)
Beta release blocker
No
Summary
After the 2026-06-05 runtime migration (nvm node + nvm-installed openclaw → Homebrew node@22 + brew-prefix openclaw, third-party plugin relocated to the
projects/<hash>/self-contained layout), the gateway only loads the 8 bundled stock plugins and never loads any externally-installed npm plugin.A third-party channel plugin
@tencent-weixin/[email protected](plugin idopenclaw-weixin) that loaded fine before the migration stopped loading. The WeChat client shows "暂无法链接openclaw" because the channel never starts;openclaw channels login --channel openclaw-weixinsucceeds on the WeChat side ("✅ already connected") but ends withinvalid channels.start channel.This reproduces on 2026.5.28, 2026.6.1, and 2026.6.6 (latest), and survives a complete clean reinstall — so it is not the #90007 migration bug alone (that sqlite migration is fixed in 2026.6.6; this is a separate, deeper defect).
Expected
Gateway loads bundled plugins plus enabled externally-installed plugins from the installed-plugin index, e.g.
http server listening (9 plugins: ..., openclaw-weixin, ...)(as it did on 2026-05-26).Actual
openclaw-weixinnever appears.openclaw channels list→ "no configured chat channels".Environment
node@22v22.22.3 (/opt/homebrew/opt/node@22/bin/node)npm install -ginto/opt/homebrewprefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6ai.openclaw.gateway,gateway.mode = local, port 18789~/.openclawKey evidence: index is correct, but the load stage never runs
After a clean install,
~/.openclaw/state/openclaw.sqlitetableinstalled_plugin_indexhas 1 row that correctly contains the plugin:host_contract_version = 2026.6.6(matches running host)compat_registry_versionmatchesresolveCompatRegistryVersion()install_records_jsonincludesopenclaw-weixinplugins_json(96 entries) includes a fullopenclaw-weixinentry (origin: "global",enabled: true, correctsource/rootDir/manifestPath)Yet at
OPENCLAW_LOG_LEVEL=tracethe gateway logs only the 8dist/extensions/bundled loads thenloaded 8 plugin(s) (8 attempted). There is not a single log line about projects / installed / discovered / external plugins. The code path that readsinstalled_plugin_index(loadInstalledPluginIndexInstallRecordsSync) and turns its records into load candidates is never reached.The plugin module itself is healthy:
node --input-type=module -e "import('.../openclaw-weixin/dist/index.js')"→ OK; peerDependencyopenclaw(>=2026.3.22) is satisfied and symlinked to the brew install.Reproduction
~/.openclaw/npm/node_modules): gateway loads N+1 plugins including the external one.~/.openclaw/npm/projects/<hash>/.installed_plugin_indexcontains the external plugin with matching host_contract/compat versions.OPENCLAW_LOG_LEVEL=traceshows the installed-plugin load stage never executes.Independence from version / layout / state (ruled out)
projects/<hash>/, flat~/.openclaw/npm/node_modules/@scope/name, symlink intodist/extensions/<name>→ all 8 plugins.["openclaw-weixin"]→ 0 (bundled also dropped);["<8 bundled ids>","openclaw-weixin"]→ 8 (weixin still never attempted).openclaw.jsonhas noplugins.allow/plugins.deny/disable flags — onlyplugins.entries.{openclaw-weixin,xiaomi}.enabled=true.Full clean rebuild — still fails
DELETE FROM installed_plugin_index / plugin_state_entries / plugin_blob_entries / plugin_binding_approvals.rm -rf ~/.openclaw/npm ~/.openclaw/plugins.npm rm -g openclaw(removed 285 pkgs) →npm install -g [email protected].openclaw plugins install @tencent-weixin/[email protected]; enable;daemon install --force; start.→ gateway still
8 plugins; index re-populated correctly with weixin; trace still shows the installed-plugin load stage never runs.Workarounds tried — all ineffective
plugins registry --refresh(does not persist a usableinstalls.json), reinstall plugin,daemon install --force,doctor --repair/--fix,plugins.allow(all combinations), manually writing a valid current-hostinstalls.json, restoring*.migratedfiles to original names (re-archived on every boot), placing the plugin in all three layouts, full clean reinstall.Suspected root cause
A gating condition in the gateway plugin loader (this env: macOS arm64 + Homebrew node@22 +
~/.openclawhome) causes the installed-plugin discovery → candidate stage to be skipped entirely, soinstalled_plugin_indexentries are never converted into load candidates.plugins.allowonly filters the bundled-extension candidate set; non-bundled plugins are never added to it under any configuration.Steps to reproduce
~/.openclaw/npm/node_modules): gateway loads N+1 plugins including the external one.~/.openclaw/npm/projects/<hash>/.installed_plugin_indexcontains the external plugin with matching host_contract/compat versions.OPENCLAW_LOG_LEVEL=traceshows the installed-plugin load stage never executes.Expected behavior
Gateway loads bundled plugins plus enabled externally-installed plugins from the installed-plugin index, e.g.
http server listening (9 plugins: ..., openclaw-weixin, ...)(as it did on 2026-05-26).Actual behavior
openclaw-weixinnever appears.openclaw channels list→ "no configured chat channels".OpenClaw version
OpenClaw:
npm install -ginto/opt/homebrewprefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6Operating system
OS: macOS 15.6 (arm64)
Install method
Node: Homebrew
node@22v22.22.3 (/opt/homebrew/opt/node@22/bin/node)Model
Gateway: LaunchAgent
ai.openclaw.gateway,gateway.mode = local, port 18789Provider / routing chain
openclaw->local->gpt
Additional provider/model setup details
node@22v22.22.3 (/opt/homebrew/opt/node@22/bin/node)npm install -ginto/opt/homebrewprefix; reproduced on 2026.5.28 / 2026.6.1 / 2026.6.6ai.openclaw.gateway,gateway.mode = local, port 18789~/.openclawLogs, screenshots, and evidence
Impact and severity
No response
Additional information
No response