9dd6b54c6e
- bootstrap _assign_if_missing no longer reactivates revoked UserRole rows - revoke_role uses SELECT FOR UPDATE + pg_advisory_xact_lock to prevent TOCTOU race on last-superadmin check - block self-revocation of superadmin role - block is_active/level changes on system roles - block expires_at on superadmin role assignments - single SUPERADMIN_LEVEL constant in crud/rbac.py, imported everywhere - get_superadmin_count excludes expired assignments - removed dead UserRoleCRUD.revoke_role method - warn when revoking RBAC role from a legacy ADMIN_IDS user - added migration 0043: indexes on user_roles.role_id, access_policies.role_id, lower(users.email)