A fictional shop writing about method. No picks, no lines to act on, and nothing here is betting or investment advice. What this is.

The Tennis Gate That Kept Reopening

The gate was supposed to ask one question: is the player actually available to compete tonight? In basketball, that question has a clean answer. Injury reports are filed on a schedule, and the corpus has enough cross-team data that a missing entry is itself a signal. The gate opens or it doesn't. We close it, we move on, we have never had to revisit the mechanism.

Tennis broke that. Not because the information was harder to find — it wasn't — but because availability in tennis means something structurally different, and we didn't notice that difference for almost a full season. A player can be physically present, listed in the draw, and fully intended to compete, and still be in a state that no availability gate we had ever written was designed to catch. We kept certifying players as available who were available only in the narrowest possible sense of the word.

What followed was the longest we have ever spent reopening a gate we thought we had already closed. Longer than the soccer situation that baseball never surfaced because baseball's roster structure absorbed the problem before it reached us. Longer, even, than the winter we spent rebuilding a gate after it passed a retired player with a clean corpus. At least that one had a single identifiable failure. This one kept finding new ways to be wrong.

Learn to Analyze Data Like a Front Office

A free online course in data analytics with Python: statistics, visualization and finding the signal in the numbers.

Learn more

What "available" actually means when a player competes alone

In team sports, availability is binary and the frame is the game. Either the player is in the lineup or they aren't. The corpus is built around games, and the gate checks whether a player will feature in the next one. That framing is so natural that we had never written it down explicitly — it was just the shape of the problem.

Tennis doesn't have that frame. A player enters a tournament, and the tournament runs across multiple days, sometimes across two weeks. The availability gate we inherited from basketball asked: is this player confirmed to compete in this event? The answer for a player who had won their first-round match and was scheduled for the second round was always yes. Technically correct. Practically useless.

What the gate wasn't asking — what we didn't think to ask — was where in the tournament the player currently sat, how many matches they had played in the preceding 72 hours, whether they had gone three sets the day before, and whether the surface had any bearing on their historical injury pattern. Those are not availability questions in the sense we understood availability. But they are exactly the questions that determine whether the corpus behind a player's rating still applies to the player who is about to walk onto the court.

"You're not checking if they showed up," said Renata, who runs our tennis corpus and had been flagging this for longer than I had been listening. "You're checking if the person who showed up is the same person the corpus describes. Those are different gates."

She was right, and I had filed her concern under "edge case" for most of a season. That was the first mistake, and it was mine.

Three versions of the gate, each one closing a different hole

The first revision added a match-count check. If a player had competed in more than a defined number of matches inside a rolling window — we settled on five matches in twelve days after some back-and-forth — the gate would flag the rating for manual review rather than passing it automatically. The logic was straightforward: the corpus assumes a rested player, and a player deep in a tournament is not a rested player.

That version held for about six weeks. Then it started passing players who had played four matches in eleven days, which was technically under the threshold and practically identical in effect. We had built a gate with a hard cutoff and the data was clustering just below it. We adjusted the threshold. The clustering moved.

The second revision replaced the hard cutoff with a fatigue-weighted flag — a continuous score rather than a binary pass — built from match duration in addition to match count. A player who had won three matches in straight sets was treated differently from one who had won three matches with two of them going the distance. This was more honest, and it introduced a new problem: the match-duration data in our corpus was inconsistent across the surface types we were tracking, so the score was comparing things that were not quite comparable. We were, as Renata put it at the time, "measuring tiredness with a ruler that's a different length on clay."

The third revision tried to separate the gate into two sequential checks — a scheduling check and a corpus-validity check — and run them independently. The scheduling check asked the old question: is the player confirmed to compete? The corpus-validity check asked the new one: does the corpus we are drawing on reflect the player's current physical state? This is the version that finally held. It also took us four months to build and another two to trust.

What the repeated reopening actually cost, and where we compounded the error

The direct cost was time, and a lot of it. Three gate revisions across one sport, none of which we could apply retroactively to already-graded ratings without reopening the calibration window — which we did not do, because setting a grading window after seeing results is exactly the kind of thing this shop is supposed to avoid. So the ratings that passed a gate we later decided was broken stayed in the record as they were. They should. But it meant our calibration figures for that period carry a structural artifact we can identify but not remove.

The less direct cost was the gate we added during the second revision that we didn't need. When the fatigue-weighted flag started producing results we didn't like, we introduced a surface-type modifier that was supposed to account for the fact that clay matches run longer on average. The modifier was not wrong, exactly, but it was not sufficiently tested, and it caused the gate to reject a small number of players whose corpus was actually fine. We were overcompensating for a problem we had already partially solved elsewhere, and we didn't notice for three weeks.

That secondary gate — added in a moment of anxiety rather than analysis — is the kind of thing I have written about before in a different context. The instinct to add a gate when the existing ones are misbehaving is understandable. It is also, fairly often, how you end up with a gate that is doing nothing except making the system feel more controlled than it is. We removed the surface modifier in the third revision. It did not affect the output in any direction we could measure, which told us everything we needed to know about why we had added it.

What the third version kept, and what tennis still doesn't share with the other sports

The two-stage structure from the third revision is still running. The scheduling check is fast and rarely interesting. The corpus-validity check is slower, requires a human review flag on roughly one in five tennis ratings — far higher than any other sport we cover — and has not been reopened since we stabilized it. That is not a long track record. We are aware of that.

What we kept from the whole experience was a cleaner articulation of something Renata had been saying in various forms since we started covering tennis seriously: the unit of competition is not the same across sports, and a gate built around the game as a unit will behave strangely when the unit is a match inside a multi-day event. A gate built for one sport and applied to four carries assumptions that are invisible until a fifth sport makes them visible.

What tennis still doesn't share with the other sports is any clean resolution to the depth-of-tournament problem. We know that a player's effective corpus shrinks as they advance — not because we have fewer data points, but because the conditions under which those data points were generated become less representative of the current moment. A player in a tournament final has been on court for two weeks. The corpus behind them was built across a year or more of matches, most of which were played by someone who had not just spent two weeks on court. We do not have a satisfying answer for how much to discount the corpus in that situation. The current gate flags it. It does not resolve it.

The thing I keep returning to is whether this is a tennis problem or a tournament-structure problem that tennis just surfaced first. Hockey has playoff series. Tennis has draws. Baseball has doubleheaders and day-night scheduling that the corpus treats as separate events but the player's body does not. We fixed the tennis gate. I am not certain we fixed the underlying question, which is whether a corpus built on normal conditions can be trusted when conditions stop being normal — and whether "normal" is something a gate can reliably detect, or just something we assume until it isn't.

Note: PlayerGem is a fictional analytics shop and these accounts are invented. Nothing here is a pick, a recommendation, or betting or investment advice, and the players, teams and competitions described do not exist.

Seven desks. The method, not the picks.

Start from the top