-- "admin" ist eine fünfte app_user-Rolle: Betreiber-Personal (Netcell-IT), -- nicht an einen Mandanten-Geschäftszweck (creator/agentur/marke/kanzlei) -- gebunden, sondern zuständig für die Plattform selbst (Accounts, -- Kanzlei-Verzeichnis, Audit-Log). Bewusst KEIN eigenes account_role-Feld -- getrennt von app_user.role — ein Admin-Login ist genauso ein app_user -- wie jeder andere, nur mit einer anderen Rolle. Es gibt bewusst keine -- Selbstregistrierung für "admin" über /register (siehe internal/web) — -- der erste Admin wird per SQL angelegt (siehe CLAUDE.md). ALTER TABLE app_user DROP CONSTRAINT app_user_role_check; ALTER TABLE app_user ADD CONSTRAINT app_user_role_check CHECK (role IN ('creator', 'agentur', 'marke', 'kanzlei', 'admin')); -- verified markiert eine Kanzlei-Account als für das öffentliche, -- kostenlose Kanzlei-Verzeichnis freigegeben (siehe CLAUDE.md, § 49b -- Abs. 3 BRAO: keine Sachvorteile, kein Routing — das Verzeichnis ist -- eine reine Auflistung, keine Vermittlung). Nur für Accounts mit -- mindestens einem Nutzer der Rolle "kanzlei" sinnvoll; das erzwingt die -- Anwendungsschicht, nicht die Datenbank. ALTER TABLE account ADD COLUMN verified BOOLEAN NOT NULL DEFAULT false; -- Audit-Log für Admin-Aktionen: append-only aus demselben Grund wie -- finding/extraction/evidence_package — ein Protokoll, das man ändern -- kann, ist kein Nachweis mehr. CREATE TABLE audit_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), actor_user_id UUID NOT NULL REFERENCES app_user (id), action TEXT NOT NULL, target_type TEXT NOT NULL, target_id TEXT NOT NULL, details TEXT NOT NULL DEFAULT '', created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TRIGGER audit_log_append_only BEFORE UPDATE OR DELETE ON audit_log FOR EACH ROW EXECUTE FUNCTION forbid_update_delete();