-- 049 — CONTRACT: retire the event-agnostic retention conflict identity. -- -- APPLY THIS ONLY AFTER FLEET CONVERGENCE IS PROVEN. -- -- While model_snapshots_cycle_prop_uniq exists it keeps rejecting rows the -- event-aware identity considers distinct: measured through the real -- supabase-js -> PostgREST -> Postgres path, an event-aware write of a real -- doubleheader chunk fails 23505 naming this index and the whole chunk rolls -- back. The retention writer bridges that by retrying on the legacy target, so -- there is no outage — but while the bridge fires, doubleheader rows are still -- lost. Dropping this index is what actually ends the loss. -- -- CONVERSELY, a writer that still names these five columns fails 42P10 ("there -- is no unique or exclusion constraint matching the ON CONFLICT specification") -- the moment this index is gone. That is why convergence must be PROVEN by -- sampling the runtime probe, not assumed from a fast rollout: a single probe -- response during a rolling deploy was measured returning the OLD build. -- -- ROLLBACK. Re-create it with: -- create unique index model_snapshots_cycle_prop_uniq -- on public.model_snapshots (snapshot_id, player_key, stat, line, side); -- It is safe to re-create only while no doubleheader cohort has been retained -- under the event-aware identity; after that, two legitimately distinct rows -- exist and the five-column uniqueness no longer holds. drop index if exists public.model_snapshots_cycle_prop_uniq;