Plugin loader silently breaks when installed_plugins.json and known_marketplaces.json drift after marketplace refresh
Summary
Claude Code's plugin auto-refresh can leave installed_plugins.json (installPath) and known_marketplaces.json (installLocation) pointing at different on-disk locations. When this happens, the plugin shows as enabled in enabledPlugins but its skills/commands silently fail to load — no error surfaces in any visible log. The user only notices when a slash command they expect is missing.
I've now hit this twice with compound-engineering@EveryInc, in opposite directions:
- 2026-04-22 (rename forward): marketplace went from
marketplaces/compound-engineering-plugin/→cache/EveryInc/.known_marketplaces.jsonupdated,installed_plugins.jsondid not. - 2026-04-27 (rename reversed): a fresh clone reappeared at
marketplaces/compound-engineering-plugin/while the registry still pointed atcache/EveryInc/, which was being torn down via.orphaned_atsentinels.
So the drift can occur in either direction — registry ahead of disk, or disk ahead of registry. Both produce the same silent-load failure.
Observed state at time of failure (instance #2)
~/.claude/plugins/known_marketplaces.json:
EveryInc.installLocation = ".../cache/EveryInc" # stale — being orphaned
~/.claude/plugins/installed_plugins.json:
compound-engineering@EveryInc.installPath = ".../cache/EveryInc/plugins/compound-engineering"
On disk:
~/.claude/plugins/cache/EveryInc/ # full of .orphaned_at markers
.agents/plugins/.orphaned_at
.claude/commands/.orphaned_at
docs/brainstorms/.orphaned_at
... (17 total)
~/.claude/plugins/marketplaces/compound-engineering-plugin/ # fresh clone, no orphans
enabledPlugins.compound-engineering@EveryInc = true in ~/.claude/settings.json the entire time. No log messages. /ce-plan and 30+ other CE skills missing from autocomplete.
Expected behavior
When the refresher updates known_marketplaces.json installLocation, it should atomically update every matching installed_plugins.json installPath entry. Alternatively, the loader should fall back to installLocation when installPath points at a non-existent or orphaned directory, and log a warning.
Reproduction
I cannot reliably reproduce on demand because the trigger is upstream marketplace state changes Claude Code reacts to in the background. But the post-mortem state is unambiguous and the recovery is mechanical: edit both files to point at the freshest non-orphaned clone, restart the IDE, plugin loads.
Environment
- Claude Code VSCode extension on Windows 11
- Plugin:
compound-engineering@EveryInc(github:EveryInc/compound-engineering-plugin) - Plugin SHA
4b5f28da9746aae8f2c5dd715d7029d0ab2758a6(v3.2.0) at both incidents
Suggested fixes
- Atomic update: mutate
installed_plugins.jsonin the same transaction asknown_marketplaces.json. - Loader resilience: if
installPathis missing or orphaned, fall back to resolving viainstallLocationand log it. - Surface the failure: emit a user-visible warning when an enabled plugin fails to resolve, instead of silently dropping it.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗