76 lines
3.2 KiB
SQL
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;
|