- evaluate_card() docstring: "Override for PlayerSeasonStats" →
"Override for BattingSeasonStats/PitchingSeasonStats"
- New test_decision_only_pitcher: exercises the edge case where a pitcher
has a Decision row but no StratPlay rows, verifying _get_player_pairs()
correctly includes them via the Decision table scan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- fn.COUNT(fn.DISTINCT(expr)) → fn.COUNT(expr.distinct()) for correct
COUNT(DISTINCT ...) SQL on PostgreSQL
- _get_player_pairs() now also scans Decision table to include pitchers
who have a Decision row but no StratPlay rows (rare edge case)
- Updated stale docstring references to PlayerSeasonStats and r.k
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The previous approach accumulated per-game deltas into season stats rows,
which was fragile — partial processing corrupted stats, upsert bugs
compounded, and there was no self-healing mechanism.
Now update_season_stats() recomputes full season totals from all StratPlay
rows for each affected player whenever a game is processed. The result
replaces whatever was stored, eliminating double-counting and enabling
self-healing via force=True.
Also fixes:
- evolution_evaluator.py: broken PlayerSeasonStats import → queries
BattingSeasonStats or PitchingSeasonStats based on card_type
- evolution_evaluator.py: r.k → r.strikeouts
- test_evolution_models.py, test_postgame_evolution.py: PlayerSeasonStats
→ BattingSeasonStats (model never existed)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>