CREATE TABLE audit_log ( id bigserial PRIMARY KEY, actor_kind text NOT NULL CHECK (actor_kind IN ('user','agent','cron','worker','system')), actor_id uuid, entity_type text NOT NULL, entity_id uuid, action text NOT NULL CHECK (action IN ('create','update','delete','suggest','approve','reject')), diff jsonb, occurred_at timestamptz NOT NULL DEFAULT now() ); CREATE TABLE pending_changes ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), agent_id uuid NOT NULL REFERENCES agents(id) ON DELETE CASCADE, entity_type text NOT NULL, entity_id uuid, action text NOT NULL CHECK (action IN ('create','update','delete')), payload jsonb NOT NULL, reason text, status text NOT NULL DEFAULT 'pending' CHECK (status IN ('pending','approved','rejected')), resolved_at timestamptz, resolved_by text, created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX idx_audit_entity ON audit_log(entity_type, entity_id, occurred_at); CREATE INDEX idx_audit_actor ON audit_log(actor_kind, actor_id, occurred_at); CREATE INDEX idx_pending_status ON pending_changes(status, created_at) WHERE status='pending';