Skip to content

Stop dropping the probable starters the client already parsed - #200

Merged
Chris-ObtuseAI merged 1 commit into
mainfrom
feat/probable-pitcher-lake
Aug 12, 2026
Merged

Stop dropping the probable starters the client already parsed#200
Chris-ObtuseAI merged 1 commit into
mainfrom
feat/probable-pitcher-lake

Conversation

@Chris-ObtuseAI

Copy link
Copy Markdown
Collaborator

EspnClient has parsed home_pitcher/away_pitcher + season ERAs since the ERA work — and espn_games_to_rows never 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 in extra.

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 scheduled status. 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 extra pre-game with ERAs; in-progress games write nothing; absent probables omit keys. 19 lake tests green, ruff clean.

🤖 Generated with Claude Code

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
Chris-ObtuseAI merged commit 9a9e2b7 into main Aug 12, 2026
0 of 3 checks passed
@Chris-ObtuseAI
Chris-ObtuseAI deleted the feat/probable-pitcher-lake branch August 12, 2026 06:20
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant