-- +goose Up -- curation_proposals holds the deterministic curation proposals the producer generates from aggregated -- reviewer craft (WS8). A proposal is never auto applied and never auto rejected: a human approves it (the -- first of two steps), and only a SECOND distinct human action later verifies the staged ontology edge that -- approval creates, activating it across tenants. kind names what the proposal asks for: a substitutes_for -- edge between two skills, a reciprocity review of a clearance gap override, or recalibration evidence for -- WS4 (evidence only, never an automatic threshold change). status walks pending to approved or rejected. -- approver and approved_at record the first human step on the proposal; the verifier and verified_at live on -- the staged skill_relationships edge, not here, so the two steps are kept on distinct rows. The engine math, -- the band cuts, and the 0.62 threshold are never touched by a proposal. Global reference data: migrator -- owned, app SELECT only, outside RLS, no PII and no eeo reach. CREATE TABLE curation_proposals ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), kind text NOT NULL CHECK (kind IN ('substitutes_for_edge', 'reciprocity_review', 'recalibration_evidence')), from_skill_id uuid, to_skill_id uuid, relation text, proposed_strength numeric, evidence_observations int NOT NULL DEFAULT 0, evidence_successes int NOT NULL DEFAULT 0, model_version text NOT NULL, status text NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected')), approver uuid, approved_at timestamptz, created_at timestamptz NOT NULL DEFAULT now() ); GRANT SELECT ON curation_proposals TO missionmatch_app; -- +goose Down DROP TABLE IF EXISTS curation_proposals;