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.
Here is the part worth writing down: nothing was broken where we looked. 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 does not fail. It interpolates.
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 →