Bug Report
Environment
- OpenClaw version: 2026.4.25
- Node.js: v24.14.1
- OS: Ubuntu 24.04 LTS
- Installed plugins: 112 (19 enabled, 93 disabled)
Problem
openclaw status in text mode takes 20-30 seconds to produce output, appearing to hang. JSON mode (--json) completes in ~8 seconds. The process writes 0 bytes to stdout for the entire duration.
Evidence
- strace shows 48K
statx filesystem calls in 3 seconds — the CLI scans all 112 plugin directories
- V8 profiler shows 15%+ CPU in
json5.parse():
json5/lib/parse.js:13 — 977 ticks (4.4%)
json5/lib/parse.js:133 — 906 ticks (4.1%)
json5/lib/parse.js:570 — 664 ticks (3.0%)
- 112 plugin manifests found at
dist/extensions/*/openclaw.plugin.json
- Text mode eventually completes after ~20-30s (not an infinite hang)
Root Cause
The root cause is not JSON5 parsing speed per se — it's that the manifest registry cache is hardcoded disabled.
The Smoking Gun
File: dist/manifest-registry-installed-BaIMBgdv.js:64
return loadPluginManifestRegistry({
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
cache: false, // ← THIS IS THE BUG
candidates,
diagnostics: [...diagnostics],
installRecords: extractPluginInstallRecordsFromInstalledPluginIndex(params.index)
});
The cache is hardcoded to false. The existing cache infrastructure (1-second TTL, mtime-based invalidation) at dist/manifest-registry-BeaRFaM3.js:113 is completely bypassed.
Full Call Chain (Text Mode)
openclaw status (text)
→ dist/status-faD5DC8z.js:runDaemonStatus()
→ dist/status-faD5DC8z.js:printDaemonStatus() [opts.json = false]
→ (text formatter path loads)
→ dist/status-BW3nLVAj.js:buildPluginRegistrySnapshotReport():174
→ dist/manifest-registry-installed-BaIMBgdv.js:loadPluginManifestRegistryForInstalledIndex()
→ dist/manifest-registry-BeaRFaM3.js:loadPluginManifestRegistry({ cache: false }):317
→ discoverOpenClawPlugins() in dist/discovery-IHhcAvkF.js:695
→ For each of 112 plugins:
→ loadPluginManifest() in dist/manifest-C0Wa8IEc.js:1013
→ JSON5.parse() in dist/manifest-C0Wa8IEc.js:1036
Why JSON Mode Is Fast
// dist/status-faD5DC8z.js:printDaemonStatus()
if (opts.json) {
const sanitized = sanitizeDaemonStatusForJson(status);
defaultRuntime.writeJson(sanitized);
return; // ← Early return, text formatter NEVER loaded
}
JSON mode never loads status-BW3nLVAj.js, so it never calls buildPluginRegistrySnapshotReport(), so it never triggers manifest parsing.
Cache Infrastructure Already Exists
// dist/manifest-registry-BeaRFaM3.js:113
const DEFAULT_MANIFEST_CACHE_MS = 1e3; // 1 second TTL
// dist/manifest-registry-BeaRFaM3.js:317-324
const cacheEnabled = params.cache !== false && !params.installRecords && shouldUseManifestCache(env);
if (cacheEnabled) {
const cached = registryCache.get(cacheKey);
if (cached && cached.expiresAt > Date.now()) return cached.registry;
}
The cache works. It's just never enabled because cache: false is passed.
Reproduction
# Text mode — ~20-30s, 0 bytes output for most of it
$ time openclaw status
# JSON mode — ~8s
$ time openclaw status --json --timeout 3000
# channels status — ~2s (skips plugin diagnostics)
$ time openclaw channels status
# usage — ~2s (skips plugin diagnostics)
$ time openclaw status --usage
Suggested Fix
Option A (one-line): Change cache: false to cache: true in manifest-registry-installed-BaIMBgdv.js:64.
Option B (slightly better): Add cache parameter to loadPluginManifestRegistryForInstalledIndex() so callers can opt-in, and have status pass cache: true.
Option A is probably sufficient — the cache TTL is only 1 second, so stale data is minimal.
Workaround
Use openclaw status --json --timeout 3000 or openclaw channels status for quick checks.
Bug Report
Environment
Problem
openclaw statusin text mode takes 20-30 seconds to produce output, appearing to hang. JSON mode (--json) completes in ~8 seconds. The process writes 0 bytes to stdout for the entire duration.Evidence
statxfilesystem calls in 3 seconds — the CLI scans all 112 plugin directoriesjson5.parse():json5/lib/parse.js:13— 977 ticks (4.4%)json5/lib/parse.js:133— 906 ticks (4.1%)json5/lib/parse.js:570— 664 ticks (3.0%)dist/extensions/*/openclaw.plugin.jsonRoot Cause
The root cause is not JSON5 parsing speed per se — it's that the manifest registry cache is hardcoded disabled.
The Smoking Gun
File:
dist/manifest-registry-installed-BaIMBgdv.js:64The cache is hardcoded to
false. The existing cache infrastructure (1-second TTL, mtime-based invalidation) atdist/manifest-registry-BeaRFaM3.js:113is completely bypassed.Full Call Chain (Text Mode)
Why JSON Mode Is Fast
JSON mode never loads
status-BW3nLVAj.js, so it never callsbuildPluginRegistrySnapshotReport(), so it never triggers manifest parsing.Cache Infrastructure Already Exists
The cache works. It's just never enabled because
cache: falseis passed.Reproduction
Suggested Fix
Option A (one-line): Change
cache: falsetocache: trueinmanifest-registry-installed-BaIMBgdv.js:64.Option B (slightly better): Add
cacheparameter toloadPluginManifestRegistryForInstalledIndex()so callers can opt-in, and havestatuspasscache: true.Option A is probably sufficient — the cache TTL is only 1 second, so stale data is minimal.
Workaround
Use
openclaw status --json --timeout 3000oropenclaw channels statusfor quick checks.