materialization-aware-refresh-escalation
React to marketplace materialization diffs by refreshing plugins when new installs land and escalating to needsRefresh when updates or refresh failures occur.
What it does
SKILL: Materialization-Aware Refresh Escalation
Domain: extensions-mcp
Trigger: When background plugin installation reconcilers detect that declared marketplaces differ from what is materialized, use the diff to decide whether to auto-refresh plugins or escalate to a manual refresh prompt.
Source Pattern: Distilled from reviewed extension lifecycle and source-reconciliation patterns.
Core Method
- Before reconciling, read the declared marketplaces (
getDeclaredMarketplaces()), the previously materialized config (loadKnownMarketplacesConfig()), and computediffMarketplaces()so you know which names are missing or changed. - Build
pendingNamesfromdiff.missingplusdiff.sourceChangedso the UI reports exactly which marketplaces are still being processed; return early when that array is empty so no work runs unless there is material change. - Call
reconcileMarketplaces({ onProgress }), map theinstalling/installed/failedevents to AppState, track metrics for installed/updated/failed/up-to-date counts, and log them vialogEventand diagnostics helpers. - After reconciliation, inspect the result:
- When
result.installed.length > 0, clear the marketplace cache, log the auto-refresh path, and awaitrefreshActivePlugins(setAppState)inside a try/catch so MCP caches are rebuilt. On refresh failure, log the error, clear the plugin cache, and setplugins.needsRefreshvia AppState only if it was previously false. - When there are no fresh installs but
result.updated.length > 0, clear both marketplace and plugin caches and set theneedsRefreshflag so the UI invites/reload-pluginswhile avoiding an automatic refresh. - When there are neither installs nor updates, skip cache invalidation and refresh so the reconciliation stays lightweight.
- When
Key Rules
- Only auto-refresh when brand-new marketplaces were installed; updates-only reconciliations should not trigger the refresh path.
- Clear both marketplace and plugin caches before touching
refreshActivePluginsor settingneedsRefreshso stale artifacts cannot leak into the new plugin state. - Always wrap
refreshActivePluginsin a try/catch, log failures (logError,logForDebugging), and fall back toneedsRefreshrather than silently suppressing the error. - Guard the
needsRefreshsetter so it only flips once per failure path and never reassigns while the flag is already true.
Example Application
Installing a curated marketplace during background startup on a fresh homespace uses this path so the new tools become available without forcing the user to manually run /reload-plugins.
Anti-Patterns (What NOT to do)
- Do not refresh plugin state when
result.installed.length === 0; the caches were already populated and redundant refreshes slow startup. - Do not swallow refresh failures; the fallback
needsRefreshflag exists so the UI can surface/reload-pluginsonce the auto-path fails. - Do not clear caches only after calling
refreshActivePlugins; stale cache entries must be removed before the refresh attempt or the refresh may still resolve to old code.
Capabilities
Install
Quality
deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 34 github stars · SKILL.md body (3,136 chars)