← All findingssource · memory/project_mlb_pricing_fix_and_prereg_arms.md
Root cause of "grading never prices MLB" (priced=0 on 8,561 rows) — ONE config absence, no code bug.
odds-service prod ODDS_ACTIVE_LEAGUES was nba,wnba,worldcup (MLB never in the pregame
fetch loop) while ODDS_LEAGUE_PREGAME_INTERVALS=mlb:1440 sat there throttling a league that
never ran. MLB's only quotes came from live-service's in-game trigger →
fetch_single_game_live, which stamps is_live=true CORRECTLY (it rejects pregame calls).
Grading's shared matcher (internal/formulas/odds_match.go) correctly refuses live quotes →
every MLB pick emitted with BetOddsAmerican=0. So "is_live always true" and "never priced"
were the same absence, and neither service had a bug.
Why MLB now: WNBA gave mostly NEGATIVE findings (no arm clears same-price random after
multiplicity — see project_arm_promotion_bar_corrected). What ports is the HARNESS, not
an edge. MLB = ~15 games/day, so a sample WNBA needs half a season for lands in ~2 weeks.
MLB CANNOT test the basketball picker: MLB snapshots have no prop_diagnostic, so
line_edges doesn't exist there and model_matrix (whose universe is enumerated by
line_edges) emits nothing. Don't read MLB results as NBA/NCAAB evidence.
Pre-registered pair (grading-service afdbd4a + c293356, pushed 2026-08-28 21:02Z):
mlb_always_under— hypothesis: under on every batter prop (hits/runs/rbis/walks/ home_runs/stolen_bases/total_bases; pitchers excluded) at the MODAL pregame line.mlb_coinflip— control: identical universe/lines/pricing, side = FNV-1a hash of (game, player, prop, line) so fanout re-passes dedupe instead of re-rolling.- Shared walker
internal/formulas/mlb_universe.go; both self-gateleague == mlb. - Rules bound to the commit in
grading-service/docs/mlb-prereg-2026-08-28.md: primary cut = 0.5 lines ≥1.70; target 1,500 settled priced rows or 21 days; ALIVE only if CLV CI lower bound > coinflip CLV point AND units-lift-vs-control CI lower bound > 0; DEAD if CLV CI upper ≤ control; one 3,000-row extension max; no formula edits inside the window (version bump = new bucket); no added arms sharing the universe (raises the multiplicity bar). - The coinflip's CLV IS the MLB construction bias — read it before believing any MLB CLV.
VERIFIED 2026-08-28 22:03Z — first priced MLB rows ever. 22:00 fanout emitted both arms
across 9 games: always_under 86% priced (median 1.455 decimal, 31% clear 1.70); coinflip 93%
priced, 484 over / 516 under (balanced), median 2.000, 59% clear 1.70. Universe 78% 0.5-lines.
Coinflip raw units will be NOISY (it takes +2200 stolen-base overs); only the cell-matched
(line, price-bucket) comparison in the prereg doc is a valid read. scout_ml emitted 0 that day.
Next milestone: settle + close-capture on 8/29 — check clv_cents populates for both arms.
Open: scout_ml MLB rows are sporadic (8/16, 8/17, 8/19, 8/23, nothing after) — the
scout MLB batch is flaky; not part of the test. A coinflip control for WNBA/NBA is the
obvious follow-up for the arms bar there.
Related: project_mlb_under_is_base_rate, feedback_verify_before_extend, project_service_landscape_openapi.