affaan-m/ECC · error
DESTINATION_VERIFICATION_FAILED
DESTINATION_VERIFICATION_FAILED
Error message
${CURRENT_PLUGIN_ID} exists at ${destinationScope} scope but is not enabled. What it means
ClaudeSetupError with code DESTINATION_VERIFICATION_FAILED thrown by assertMigrationInventory in scripts/lib/claude-scope-migration.js:92. When the only ECC plugin installation is already at the requested destination scope, the migrator verifies it is actually enabled. If Claude reports `enabled !== true` (disabled plugin), the 'already migrated' conclusion cannot be trusted, so the tool fails with phase 'destination-verification' and recovery commands to re-enable/reinstall at the destination.
Solutions
- Re-enable the plugin at that scope: `claude plugin enable <plugin-id> --scope <destination>`.
- Or run the recovery command from the error details: `ecc setup --mode claude-plugin --scope <destination> --move-scope --yes`.
- Confirm with `claude plugin list --json` that the entry now shows `enabled: true`, then re-run the migration.
- If enable keeps failing, uninstall and reinstall at the destination: `claude plugin uninstall <id> --scope <destination> --keep-data` then `ecc setup --mode claude-plugin --scope <destination> --yes`.
Example fix
// before: plugin installed at project scope but disabled // after // claude plugin enable everything-claude-code --scope project // ecc migrate-scope --scope project # now recognizes already-migrated state
Defensive patterns
Strategy: validation
Validate before calling
const plugins = parsePluginList(run(['plugin', 'list', '--json'], { cwd }).stdout)
.filter(p => p.id === CURRENT_PLUGIN_ID);
if (plugins.length === 1 && plugins[0].scope === destinationScope && plugins[0].enabled !== true) {
console.error(`Plugin disabled at ${destinationScope}; run: claude plugin enable ${CURRENT_PLUGIN_ID} --scope ${destinationScope}`);
process.exit(1);
} Type guard
function isEnabledAtDestination(plugin, dest) { return plugin.scope === dest && plugin.enabled === true; } Try / catch
try { await migrateScope({ scope }) }
catch (e) {
if (e.code === 'DESTINATION_VERIFICATION_FAILED') {
console.log('Enable it first:', e.details.recovery.join(' && '));
} else throw e;
} Prevention
- Re-enable the plugin after any troubleshooting session that disabled it.
- Before migrating, check the `enabled` field in `claude plugin list --json`.
- Avoid `claude plugin disable` without a follow-up re-enable plan.
- Treat enabled=false at the destination as 'not migrated' in automation.
When it happens
Trigger: Running a scope migration whose single detected installation is already at the destination scope, but its `enabled` field in `claude plugin list --json` is false or missing — i.e., the plugin was installed at that scope but disabled via `claude plugin disable` or a settings change.
Common situations: A user disabled the ECC plugin (e.g. to troubleshoot hooks) and later ran the migration expecting a no-op; a failed prior setup left the plugin registered but disabled; Claude's list output omits `enabled` for plugins installed but never activated.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- AMBIGUOUS_PLUGIN_SCOPES
- PLUGIN_NOT_INSTALLED
- SOURCE_UNINSTALL_FAILED
- FINAL_VERIFICATION_FAILED
- INVALID_SCOPE
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/5c342a7725114ad9.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/lib/claude-scope-migration.js:92
}
if (
installed.length > 2
|| uniqueScopes.size !== installed.length
|| (
installed.length === 2
&& !uniqueScopes.has(destinationScope)
)
) {
throw migrationError(
'AMBIGUOUS_PLUGIN_SCOPES',
`Cannot safely migrate ${CURRENT_PLUGIN_ID} from ambiguous scopes: ${observedScopes.join(', ')}.`,
{ observedScopes }
);
}
if (installed.length === 1 && installed[0].scope === destinationScope) {
if (installed[0].enabled !== true) {
throw migrationError(
'DESTINATION_VERIFICATION_FAILED',
`${CURRENT_PLUGIN_ID} exists at ${destinationScope} scope but is not enabled.`,
{
phase: 'destination-verification',
observedScopes,
recovery: recoveryCommands(null, destinationScope),
}
);
}
return {
destination: installed[0],
mode: 'already-migrated',
observedScopes,
sourceScope: null,
};
}
if (installed.length === 1) {
return {View on GitHub (pinned to 8321021c54)