-- Async sort jobs: lifecycle + result for collection expansion + cold drains. -- Created 2026-05-01 (Spec B+F). -- Depends on: 01_schema.sql (touch_updated_at() function, pgcrypto extension). -- Docker initdb runs files alphabetically, so 01_ executes first; for live -- one-shot psql application against an existing DB, both prerequisites -- already exist. CREATE TABLE IF NOT EXISTS sort_jobs ( job_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), phase TEXT NOT NULL CHECK (phase IN ('expanding','queued','draining','done','failed')), phase_started_at TIMESTAMPTZ NOT NULL DEFAULT now(), created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), input_raw TEXT NOT NULL, collection_ids TEXT[] NOT NULL DEFAULT '{}', wsids TEXT[], rules_raw TEXT, result_json JSONB, failure_reason TEXT ); CREATE INDEX IF NOT EXISTS sort_jobs_phase_idx ON sort_jobs (phase); CREATE INDEX IF NOT EXISTS sort_jobs_updated_idx ON sort_jobs (updated_at); DROP TRIGGER IF EXISTS sort_jobs_touch ON sort_jobs; CREATE TRIGGER sort_jobs_touch BEFORE UPDATE ON sort_jobs FOR EACH ROW EXECUTE FUNCTION touch_updated_at();