Files
vyndr/supabase/migrations/018_engine2_learning.sql
T

76 lines
3.2 KiB
SQL

-- ---------------------------------------------------------------
-- 018 — Engine 2 + learning loop tables (Session 6c).
--
-- grade_history retrofit : Engine 2 analysis columns
-- engine1_weights : versioned factor weights for Engine 1
-- accuracy_tracking : per-grade-tier hit rates with baseline lock
--
-- All three are service-role-only. The Ledger surface reads grade_history
-- directly (it already had RLS configured in earlier migrations); the new
-- engine2_* columns inherit that policy.
-- ---------------------------------------------------------------
ALTER TABLE public.grade_history
ADD COLUMN IF NOT EXISTS engine2_grade text,
ADD COLUMN IF NOT EXISTS engine2_confidence numeric,
ADD COLUMN IF NOT EXISTS engine2_narrative text,
ADD COLUMN IF NOT EXISTS engine2_agrees boolean,
ADD COLUMN IF NOT EXISTS engine2_key_factor text,
ADD COLUMN IF NOT EXISTS engine2_trap_concern text,
ADD COLUMN IF NOT EXISTS engine2_model text,
ADD COLUMN IF NOT EXISTS engine2_latency_ms integer,
ADD COLUMN IF NOT EXISTS engine2_analyzed_at timestamptz;
CREATE INDEX IF NOT EXISTS idx_grade_history_engine2_pending
ON public.grade_history (id) WHERE engine2_analyzed_at IS NULL;
-- Session 7a additions: store Engine 1 factors (for the learning loop's
-- weight adjuster) and the quantile-based P(Over) (for the UI + Engine 2).
ALTER TABLE public.grade_history
ADD COLUMN IF NOT EXISTS factors jsonb,
ADD COLUMN IF NOT EXISTS p_over numeric;
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.engine1_weights (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
sport text NOT NULL,
stat_type text NOT NULL,
factor_name text NOT NULL,
weight numeric NOT NULL,
previous_weight numeric,
adjustment_reason text,
resolved_grade_id uuid,
version integer NOT NULL DEFAULT 1,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_weights_sport_stat
ON public.engine1_weights (sport, stat_type);
CREATE INDEX IF NOT EXISTS idx_weights_version
ON public.engine1_weights (sport, stat_type, factor_name, version DESC);
ALTER TABLE public.engine1_weights ENABLE ROW LEVEL SECURITY;
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS public.accuracy_tracking (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
sport text NOT NULL,
grade text NOT NULL,
period text NOT NULL DEFAULT 'all_time',
total_graded integer NOT NULL DEFAULT 0,
total_hit integer NOT NULL DEFAULT 0,
total_miss integer NOT NULL DEFAULT 0,
total_push integer NOT NULL DEFAULT 0,
total_void integer NOT NULL DEFAULT 0,
hit_rate numeric,
baseline_hit_rate numeric,
baseline_locked boolean NOT NULL DEFAULT false,
clv_avg numeric,
engine2_agree_rate numeric,
last_updated timestamptz NOT NULL DEFAULT now(),
UNIQUE (sport, grade, period)
);
ALTER TABLE public.accuracy_tracking ENABLE ROW LEVEL SECURITY;