dfd9e778c5
Tests: - Registry initialization and engine requirement - Plugin registration and discovery - Load order with and without dependencies - Core plugin deactivation blocked - Deactivation blocked by active dependents - Event handler registration on activate - Event handler unregistration on deactivate - Activate → deactivate → reactivate cycle - Idempotent activate when already active - Idempotent deactivate when already inactive Phase 3 (Plugin-Lifecycle) verified: - install: idempotent, dependency checks, migrations via crm_migration - activate: idempotent, per-tenant with RLS context, event handlers - deactivate: idempotent, core protection, dependency check, handler cleanup - uninstall: deactivate first, then optional drop tables - main.py: per-tenant activation with set_tenant_context - Worker: event handlers only for active plugins (Gate 5) - Router: only in API, not in worker