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

  1. Re-enable the plugin at that scope: `claude plugin enable <plugin-id> --scope <destination>`.
  2. Or run the recovery command from the error details: `ecc setup --mode claude-plugin --scope <destination> --move-scope --yes`.
  3. Confirm with `claude plugin list --json` that the entry now shows `enabled: true`, then re-run the migration.
  4. 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

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


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)