NaN went to press
Our daily chess paper printed “NaN contain no blunder at all, NaN%” on its front page. Nothing in the database was wrong. That is what made it interesting.

Eloist publishes a daily paper built from half a million analysed chess games. On August 20th its lead statistic read: “Of 431,646 analysed games across 220 players, NaN contain no blunder at all, NaN%.” It sat on the front page for a day, went to every email subscriber, and settled into the back issues, which are immutable by design.
Nothing was broken where we looked, and that is the uncomfortable part. The finding behind the sentence was correct in the database the whole time. 20.4% of a typical player's games contain no blunder, verified, with its sample size attached. Every test was green. The bug lived in the seam between two healthy systems.
A renamed key interpolates instead of failing
Two days earlier we had rewritten our statistics to be player-weighted. One prolific account held a sixth of the corpus and was quietly speaking for everyone, so every figure became a median across players instead of a pool across games. The rewrite renamed the fields the numbers travel in. The page that composes the paper still asked for the old names. In JavaScript, reading a missing field does not throw. It hands you undefined, arithmetic turns it into NaN, and a template happily prints it in a nice serif.
So the paper lied in public while every system that fed it was healthy, and no check we ran could have caught it: the writing side refused to file a broken number, but printing is a separate act of composition, and composition manufactured a broken number out of two correct inputs.
The fix is a gate, not a patch
We repaired the frozen edition in place, replacing the sentence with the verified claim. Then the durable half: the paper now refuses to go to press at all if any reader-facing string or number in the composed edition is NaN, undefined, or a non-finite float. It fails loudly, names the exact path of the broken field, and leaves yesterday’s issue standing. The same behaviour it already had for a too-thin story supply. An edition missing a story is a smaller lie than a number nobody can explain.
We tested the gate by replaying the actual broken edition through it: two hits, both paths named, refused. One deliberate omission: the gate does not match the word ‘Infinity’ in prose, because a chess club could be called that, and a guard that can spike a good issue over a proper noun is a guard someone eventually switches off. The non-finite number itself is still caught one step earlier, before it can become a word.
Read today's issue. The one the gate let through →