[BUG] Cowork: account-scoped git marketplace "Check for updates" always fails first attempt with MARKETPLACE_ERROR:NOT_REGISTERED, recovers only via refreshMarketplaceViaRemote
Environment
- Claude Desktop (Cowork / local agent mode), macOS (Darwin 25.5.0)
- Marketplace: an account-scoped GitHub marketplace added from a private repo via the Claude GitHub App
- Reproduced across two Macs, same account.
Summary
Clicking a marketplace's ⋮ → Check for updates surfaces "plugin sync failed" on the first attempt, every time. The underlying error is MARKETPLACE_ERROR:NOT_REGISTERED, thrown by the CustomPlugins.refreshMarketplace IPC call. The update only succeeds after a retry — either an automatic one ~30s later, or a manual "leave the marketplace and reopen it from Customize → Plugins" — which routes through refreshMarketplaceViaRemote → syncAccountMarketplace → pollSyncUntilDone status=success.
Reproducibility
3 of 3 Check-for-updates invocations failed on the first attempt (100%), across two machines. Zero first-try successes.
Steps to reproduce
- Add a private GitHub repo as an account marketplace (via the Claude GitHub App), containing a plugin.
- Push a new plugin version (bumped
versionin.claude-plugin/plugin.json) to the repo's default branch. - In Customize → Plugins, open the marketplace's ⋮ → Check for updates.
Expected
The marketplace re-syncs the repo and the plugin updates to the pushed version.
Actual
The first attempt fails — UI shows "plugin sync failed"; logs show MARKETPLACE_ERROR:NOT_REGISTERED. A retry or a reopen-the-marketplace then succeeds. (The plugin-detail "Update" button also stays greyed on "On latest version" until the marketplace itself re-syncs.)
Log evidence (~/Library/Logs/Claude/main*.log, identifiers redacted)
Two update cycles, both failing first:
# Cycle 1 — 1 failure, then success
[info] [CCDMarketplacePluginManagerCLI] Refreshing marketplace: <my-marketplace>
[error] [REACT_QUERY_CLIENT] ...CustomPlugins_$_refreshMarketplace: Error: MARKETPLACE_ERROR:NOT_REGISTERED
[info] [remoteMarketplaceOps] refreshMarketplaceViaRemote backendId=<redacted>
[info] [remoteMarketplaceClient] syncAccountMarketplace id=<redacted>
[info] [remoteMarketplaceClient] pollSyncUntilDone id=<redacted> settled with status=success after 2559ms
# Cycle 2 — 2 failures, then success
[error] [REACT_QUERY_CLIENT] ...refreshMarketplace: Error: MARKETPLACE_ERROR:NOT_REGISTERED
[error] [REACT_QUERY_CLIENT] ...refreshMarketplace: Error: MARKETPLACE_ERROR:NOT_REGISTERED
[info] [remoteMarketplaceClient] syncAccountMarketplace id=<redacted>
[info] [remoteMarketplaceClient] pollSyncUntilDone id=<redacted> settled with status=success after 2981ms
Root-cause hypothesis
The account-scoped marketplace is not present in the local registry — neither ~/.claude/plugins/known_marketplaces.json nor the Cowork .../cowork_plugins/known_marketplaces.json lists it (it is account-scoped / server-side). The direct refreshMarketplace path appears to resolve the marketplace locally, finds it unregistered, and throws NOT_REGISTERED. The refreshMarketplaceViaRemote path (server-side) works, but is only reached after the first failure.
Impact
Every update requires a retry or a manual reopen. "plugin sync failed" reads as a real failure, so a user reasonably assumes the update is broken and gives up. Not data-affecting — the published release is fine; this is purely the client-side refresh leg.
Suggested fix
Have refreshMarketplace fall through to refreshMarketplaceViaRemote for account-scoped marketplaces (or register them locally at add-time), so the first Check-for-updates succeeds without a retry.
Related issues (this appears distinct from all of them)
- #73673 — Desktop: personal git-marketplace plugins never auto-update; Update button is a silent no-op. Related theme, different code path: #73673 is the CLI/
claude pluginpath where the Update button logs nothing and the marketplace is inknown_marketplaces.json. This report is the Cowork account-scoped path, where Check-for-updates does log (CCDMarketplacePluginManagerCLI Refreshing marketplace), failsNOT_REGISTERED, then recovers viarefreshMarketplaceViaRemote, and the marketplace is not inknown_marketplaces.json(server-side). - #83777 — Plugin "Update now" writes metadata without refreshing marketplace source. Same "update path doesn't refresh source" family.
- #82064 — Plugin install fails with malformed marketplace path after marketplace remove/re-add in same session. Adjacent to the "reopen the marketplace to force a sync" workaround here.
Suggested labels: bug, has repro, area:cowork, area:plugins, area:desktop, platform:macos
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗