BEGIN; -- Workers normally transition queued/running jobs to succeeded, but recovery -- and import paths may insert an already-succeeded job or attach history_id -- after the provider result was committed. Every server-owned completion edge -- must enqueue the same immutable event exactly once. CREATE OR REPLACE FUNCTION public.enqueue_processing_job_push() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path = '' AS $$ BEGIN IF NEW.kind <> 'transcription' OR NEW.status <> 'succeeded' OR NEW.history_id IS NULL THEN RETURN NEW; END IF; IF TG_OP = 'UPDATE' AND OLD.status IS NOT DISTINCT FROM 'succeeded' AND OLD.history_id IS NOT DISTINCT FROM NEW.history_id THEN RETURN NEW; END IF; IF EXISTS ( SELECT 1 FROM public.history WHERE id = NEW.history_id AND user_id = NEW.user_id AND status = 'completed' ) THEN PERFORM public.enqueue_immutable_push_event( 'transcription.completed', NEW.history_id ); END IF; RETURN NEW; END; $$; DROP TRIGGER enqueue_processing_job_push_after_success ON public.processing_jobs; CREATE TRIGGER enqueue_processing_job_push_after_success AFTER INSERT OR UPDATE OF status, history_id ON public.processing_jobs FOR EACH ROW EXECUTE FUNCTION public.enqueue_processing_job_push(); REVOKE ALL ON FUNCTION public.enqueue_processing_job_push() FROM PUBLIC, anon, authenticated; COMMIT;