Ryan Weiss Was Not Actually Projected for 540 Strikeouts
The homepage “Extraordinary Projections” widget had a tell, folks: about 30 different pitchers, all projected at exactly 350 strikeouts, or exactly 25 wins. Real projections don’t cluster on round numbers like that. Those are ceiling values, PROJECTION_CAPS.strikeoutsP and PROJECTION_CAPS.wins, and something upstream was slamming into them constantly.

The someone was projectionMultiplier, which scales a player’s partial-season stat line up to a full 162-game pace using 162 / gamesPlayedByTheirTeam. For a player whose team has actually played, say, 80 games, that’s a sane 2x multiplier. But when getGamesPlayedForTeam can’t resolve a player’s teamId, because they’re currently optioned to a minor-league affiliate with no rows in our MLB Game table, it fell back to the player’s own games-played count instead of the team’s. Ryan Weiss, sent down to the Sugar Land Space Cowboys, had 9 games logged from an earlier MLB stint. 162 / 9 ≈ 18. His real, honest partial-season line, 30 strikeouts in 26 innings, got multiplied by 18x into a projected 540-plus strikeouts, which the cap then quietly clamped to 350, and 350 he stayed, alongside every other optioned pitcher hitting the exact same failure.
Fix: when the DB fallback finds zero real MLB games for a player’s team, anchor to getLeagueSeasonGamesPlayed() for a reference franchise (Yankees, teamId 147) instead of the player’s own count. Every MLB team plays the same number of games on the same days, so any real franchise’s count is a fine proxy for season progress. A demoted player’s own tiny sample never was.
Weiss’s projection now reads 116 games of season progress instead of 9, IP down from a fantastical 468 to a plausible 36.3, strikeouts from clamped-at-350 to a real 40. No round numbers in sight, which is exactly the point.