Report for the audit + fix already committed. Records the two things worth
carrying forward:
1. The environment axis has NOT yet been observed writing to the ledger,
and I am not claiming it has. recordPipelineGrades upserts with
ignoreDuplicates and dedupes on (user_id, player_key, stat, line, side,
game_id) -- correctly, so a re-run never overwrites the original lock.
Today's 429 rows predate the fix, so the axis cannot backfill onto them;
first ledger observation is tomorrow's slate. What IS directly verified
is the resolver (105/120) and the join key (416/416) -- the two things
that were actually broken.
2. Matchup is not fixed and is not claimed as fixed. It needs the opposing
starter and BOTH hands, and the audit shows three separate absences:
oppPitcherByTeam 0, handById 0, bats 0/120. Fixing the pitcher feed
without the hands, or the hands without the feed, still produces an axis
that fires on zero rows.
Also noted: the S59 slate JOIN INVARIANT keys off the same null `team`
field, so it is currently inert too.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc