Our daily puzzle left out words for 347 days

A player swipes a word that is plainly there on the wheel, the game says no, and something breaks between you. We had been doing that on almost every day of the year.

· The Wordmere team · 5 min read

The message said the daily was awful, that loads of common words were not part of it. That is the kind of complaint that is easy to wave off, because every word game gets it constantly and it is usually wrong. People swipe words that are not words.

This time there was a screen recording, and on it the rack does not move. The player swipes PLAY. Nothing. PRAY. Nothing. RELY. Nothing. Three ordinary words, all spellable from the letters on screen, all rejected.

Twenty-one words, twelve kept

The daily is built from a wheel of letters. A generator works out which words that wheel can spell, and the rack — the row of blanks you are filling in — is the list it decides to ask for.

That generator was taking the twelve commonest words and stopping. The day in the recording had a wheel spelling twenty-one perfectly ordinary four-to-six-letter words. Nine of them were simply not asked for, and swiping any of the nine got you a rejection.

From the player's side there is no way to tell that apart from a broken game. The dictionary looks wrong. In a sense it was.

A floor that cut the wrong words

Two of the missing words had a second, separate problem. The generator also applied a frequency floor, dropping anything below a commonness threshold, and PAYER and REPAY both fell under it.

A frequency floor is a reasonable idea. It is there to stop the puzzle demanding words nobody says. But commonness scores are built from written corpora, and they are unreliable in exactly the band a word game lives in — ordinary, short, slightly dull words that people use constantly and write down rarely. The floor was tuned to keep obscurity out and was quietly taking everyday words with it.

A word you omit is not a gap in a list. It is a swipe the player makes, and a rejection they get back, and a reason to stop believing the game.

How often: nearly always

Having found it on one day, the obvious question was how many days. We had a year of generated puzzles sitting in the repository, so this was a script rather than an investigation.

Three hundred and forty-seven days out of three hundred and sixty-five left off at least one obvious word. Two hundred and seventy-nine left off three or more.

I had assumed we would find a bad week. It was the whole year, and it had been shipping daily the entire time.

Nobody caught it because each individual day looks fine. You open the puzzle, you solve the twelve words it asks for, and you never learn about the nine it did not. The failure is only visible to a player who tries a word that should work — which is to say, the more fluent the player, the worse the game looked.

The rule we replaced it with

The new rule has no quota in it at all. The rack is exactly the set of obvious words the wheel spells, in the length range the daily uses. Not the top twelve of them. All of them.

That inverts which thing gets rejected. Previously, if a wheel spelled too many good words, we trimmed the words. Now, if a wheel spells a set we cannot ask for in full, we throw away the wheel and pick a different one. There are plenty of wheels; there is only one first impression of a daily puzzle.

Concretely: a wheel is usable only if its obvious set lands between nine and twelve words with at least two long ones. Everything else is discarded at generation time. The whole year was rebuilt against the new rule — about a hundred wheels, with the puzzle identifiers kept stable so nobody's streak broke — and an audit script now has to report zero omissions before the content can be regenerated at all. There is a test pinning it.

Why this is the opposite of our last dictionary problem

We wrote earlier about a dictionary that accepted nonsense — our own tool confidently recommending a word that is not a word. This is the mirror image, and it is the more damaging of the two.

Accepting a junk word costs a player a moment of confusion and a small amount of trust in the word list. Rejecting a real word costs you the player's belief that the game is working, and they are not wrong to lose it. One failure makes the game look generous and sloppy. The other makes it look broken.

If you are building the same thing and have to choose which way to err, err towards accepting. It is the cheaper mistake by a wide margin.

What the rule costs us

Throwing away wheels that spell too much means the pool of usable wheels is a lot smaller than it was, and it will eventually bind — a year is fine, several years of unique dailies is a different problem that we have not solved.

The rule also does nothing about a separate category of complaint. Our word bank tiers some genuinely odd words as "obvious" — a handful of archaic or technical entries that our frequency data rates far higher than any person would. Those now get included, correctly by the rule and wrongly by any human standard, and the daily asks for them. That is a problem in the word bank's tiering, not in this rule, and fixing it there is the right place rather than adding a second exception list here.

And the daily still refuses three-letter words by design. A player swiping LAY gets a rejection, exactly like the one that started all this. The difference is that it now says so explicitly rather than failing silently, which is the least we can do while the rule stands.

Count the words you did not ask for

The generalisable bit is a one-line audit, and I would run it against any generated puzzle content.

For every puzzle you ship, compute the set of valid answers the player can plausibly find, subtract the set you actually ask for, and look at the size of the difference. If it is not zero, those are rejections waiting to happen, and your players will find them long before your dashboards do.