Stop dropping the probable starters the client already parsed - #200
Merged
Conversation
EspnClient has carried home_pitcher/away_pitcher and their season ERAs since the ERA work, but espn_games_to_rows never wrote them, so the lake's point-in-time pitcher record was dropped on the floor every night. Starting pitcher identity is the single largest known gap between team-strength ratings and market-grade MLB probability, and it cannot be backfilled - a probable exists only before first pitch - which is exactly why the wire must not stay cut another season. The write is gated on scheduled status: the same ESPN field on an in-progress or final game names who DID start, settlement fact wearing a forecast's name, and recording it as a probable would poison point-in-time ordering. Absent probables are omitted rather than nulled so non-baseball leagues do not grow four dead keys per game. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Chris-ObtuseAI
added a commit
that referenced
this pull request
Aug 12, 2026
#201) ESPN's probables entry carries both a slot label and the athlete. Its own displayName is the literal string "Probable Starting Pitcher", so reading that before the athlete meant the fallback never ran and every game resolved to the same constant. This was harmless while nothing persisted the field. #200 started persisting it, so the first live capture would have written one identical starter name onto every MLB game in the lake - with correct, varying ERAs beside it, which is exactly the shape that looks populated in a spot check. Pitcher identity is the entire point of the field: a per-pitcher rating keyed on a constant is one pooled number wearing 500 names. Caught by running the merged wire end to end against tomorrow's slate before trusting it; the rows came back with real ERAs and a constant name. The tests assert precedence rather than presence, because the label is always present - a test that merely checked for a non-empty name passes on the bug. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
EspnClienthas parsedhome_pitcher/away_pitcher+ season ERAs since the ERA work — andespn_games_to_rowsnever wrote them. The lake's point-in-time pitcher record was dropped on the floor every night. Verified against the live lake: 0 of 9,489 MLB finals carry a pitcher inextra.Why it matters: starting-pitcher identity is the single largest known gap between team-strength ratings and market-grade MLB probability (walk-forward team Elo on this lake earns only +0.004–0.005 Brier vs home-only — ObtuseFund PR #157 Part III). And probables cannot be backfilled — they exist only before first pitch — so every night the wire stays cut is a night of forecast fuel lost forever.
Point-in-time discipline: the write is gated on
scheduledstatus. The same ESPN field on an in-progress/final game names who did start — settlement fact wearing a forecast's name — and recording it as a probable would poison season ordering. Absent probables are omitted, not nulled, so non-baseball leagues don't grow dead keys.Tests: probables land in
extrapre-game with ERAs; in-progress games write nothing; absent probables omit keys. 19 lake tests green, ruff clean.🤖 Generated with Claude Code