ContactSep 25, 2026Engine v1486 slates · 13,529 graded starters

Contact from balls in play only

Almost half of what the engine counted as a hitter's contact was foul balls. Dropping them fixes about 40% of the gap between our hitter projections and what actually happened.

Plain English

The engine describes each hitter’s contact (how hard, at what angle, which way) and uses it to decide how his balls in play turn into singles, doubles, triples and outs. It was building that description from every pitch with a measured exit velocity, and about half of those were foul balls: weak, at extreme angles.

Counted as contact, fouls made every hitter look like he hits the ball about 5 mph softer than he does. Across the league, average exit velocity in the profile went from 82.5 mph with fouls to 88.0 mph without them. That is why the engine priced doubles and 2+ total bases low.

The test

The test and its pass rule were written down before any result was read.

  • Two windows of games the calibration curves never saw: July 13 to August 16, and August 17 to September 10.
  • The served numbers were rebuilt exactly the way the site serves them, including the calibration curves.
  • Pass rule: not worse on log loss or Brier in either window, calibration no worse, strikeouts unchanged.

Results

Market Engine’s own number before After What actually happened
2+ total bases 30.3% 31.5% 34.6%
1+ hit 57.9% 59.5% 60.4%
  • Passed. Served numbers are not worse in either window, and 2+ total bases is measurably better in the second window.
  • The number you see moves much less than the engine’s own number, because the calibration curve was already pulling it to the right level. The gain is that it now leans far less on that curve, so a new engine version is less likely to start cold.
  • Home runs and strikeouts don’t move: the batted-ball layer never prices them.

What is left

The raw 2+ total bases number still runs about 3 points under reality. Closing that gap is open work, and until it is closed the calibration curve keeps doing the rest.