A link checker asks whether a URL answers. That question misses every failure where the server responds correctly and the player still gets nothing: a blank canvas, a bot challenge that never clears, a page that renders an error in its own words.
The only reliable witness is somebody trying to play. We already recorded how long each game was open, so we tried to use it.
The first attempt was wrong
The obvious rule is that a broken game gets abandoned quickly, so flag games with a low median session. We set the threshold at five seconds and it flagged 39 of 105 games, including several we knew were fine.
The reason is specific to this kind of site: the median session across the whole catalogue is about six seconds, because pressing shuffle repeatedly is what the product is for. A player sampling ten games in a minute is not encountering ten broken games.
The distribution has the answer in its tail
Measured per game, the 90th percentile of session length was far more discriminating than the median:
- Across games, p90 sits at roughly 14 seconds at the 5th percentile, 51 seconds at the 25th, and 101 seconds at the median.
- A working game therefore has a long tail. Most people bounce; some people stay for minutes.
- A broken game has no tail at all. Nobody stays, because there is nothing to stay for.
The rule we settled on is p90 at or below fifteen seconds over at least eight sessions. It is not a claim that the game is broken. It is a claim that it is worth looking at.
What it found
On the first run it surfaced games whose HTTP status was fine. Loading each in a real browser settled them:
- A game whose host showed a bot-protection interstitial that never resolved, even after 35 seconds.
- A game returning 200 with a completely blank page and three network requests.
- A host that accepted the connection and then timed out.
- A URL returning 410 with the body text blocked domain.
- A page that displayed an ordinary 404, behind a bot challenge that had to be waited out first.
That last one is the one that justifies the whole exercise. Its status code was 403, which our policy correctly classes as a bot filter and refuses to auto-retire, because real visitors clear those routinely. The policy was right. What was missing was anything that ever went and looked.
Suspect means a human should check. It does not mean assume it is fine.
Two things to get right
First, this is a review queue, not an action. Dwell is noisy, and a genuinely dull game also gets abandoned quickly. Retirement should still be a decision made after loading the thing.
Second, calibrate against your own distribution before shipping a threshold. Ours flagged 37 percent of the catalogue on the first guess. The number that looked reasonable in the abstract was useless in context.