proj-v1: absolute matchup projection challenger (distribution + full ladder)
A THIRD challenger (after arch-v1, contact-v1), MLB batting v1. Champion is market-relative P(stat>LINE); proj-v1 is ABSOLUTE — what the hitter will DO — emitted as a full distribution from which the WHOLE LADDER (P≥1,P≥2,P≥3) derives. Champion untouched; nothing claimed; the ledger decides per rung, per stat. - projection/distribution.js — Bayesian Gamma-Poisson → negative-binomial predictive. Admits over-dispersion; under-dispersion → Poisson approx (conservative, documented). Uncertainty scales with sample by construction (r=α): thin → WIDE (real mass on P≥1, honestly thin P≥3), thick → tight. NEVER abstains — width carries the honesty. - projection/matchupRead.js — the input the book doesn't use. HONEST FIDELITY: pitcher repertoire is rich (97% pitch-mix) but hitters have NO pitch-type performance, so TRUE repertoire-vs-profile is impossible today. This is the COARSE version (arsenal buckets fastball/sinker/breaking + whiff/hard-hit tendency × hitter whiff/chase/gb-fb/hard-hit) — beats generic L/R, derived + documented + TESTED two-sided. A hitter pitch-type feed unlocks the true form. - projectionChallenger.js — park RELATIVE to the player's own log exposure (isHome→own park, away→opp park; Phase B's raw-multiply bug solved), recency- weighted fit, per-factor breakdown (form/park/weather/platoon/matchup — show your work), full rung set + book-implied per rung. Combined non-form multiplier bounded. - Wired after contact-v1, own try, flag PROJ_V1_ENABLED, reusing arch-v1's already-computed park/weather/platoon (no duplicate env I/O). Own ledger columns (migration 032, applied to prod): distribution, ladder, point, line, our-P, book-implied, factor breakdown — measurable per rung/stat after settle. Phase 0 (prod-verified): venue join via isHome; NB family; uncertainty-as-width; coarse matchup honest fidelity; no lineup-slot (per-game rate, volume implicit). Sanity: thin-hot → wide (credible low rung, thin high rung); .300 hitter ≠ 3.0; matchup two-sided; champion byte-identical. proj-v1 suites 23/23; snapshot/ ledger/siblings 74 green. Forward-only, version-stamped, PROJ_V1_ENABLED kill. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCNgGSt5qvcLxaeQqa7Zpj
This commit is contained in:
@@ -263,6 +263,17 @@ function rowsFromSnapshot(sport, grades, oddsProps, nowIso) {
|
||||
contact_delta: numOrNull(g.contact_delta),
|
||||
contact_adjustments: g.contact_adjustments || null,
|
||||
contact_version: g.contact_version || null,
|
||||
// proj-v1 — the ABSOLUTE matchup projection challenger. Own columns so the
|
||||
// full rung set + per-factor breakdown + book-implied comparison are
|
||||
// independently measurable, per rung, per stat, after settle.
|
||||
proj_version: g.proj_version || null,
|
||||
proj_point: numOrNull(g.proj_point),
|
||||
proj_line: numOrNull(g.proj_line),
|
||||
proj_p_over_line: numOrNull(g.proj_p_over_line),
|
||||
proj_book_implied: numOrNull(g.proj_book_implied),
|
||||
proj_distribution: g.proj_distribution || null,
|
||||
proj_ladder: g.proj_ladder || null,
|
||||
proj_factors: g.proj_factors || null,
|
||||
// Session 75 — the ENVIRONMENT that drove this projection. The FORECAST,
|
||||
// not the actual: this is what we knew when we projected, and it is what
|
||||
// the instrument measures. The actual lands in game_context and is never
|
||||
|
||||
Reference in New Issue
Block a user