AI Portfolio Lab Tools Games Blog Feedback
All Posts

The Hints Were Correct. They Were Also the Answer.

I built a hint system for a word game and ran a batch simulation. Eight bad hints became six more, then seven more. Three hundred overrides and counting, and I understand why language games require human curation.

2 min read
gamesword-gamessimulationweb-development

The belief I started with: generating hints for a word game is mostly an algorithm problem. Give me a word, I’ll give you three clues. Accurate, varied, not a repeat of the word itself. That’s the contract.

Impostr is a party game where everyone gets the same word and has to clue it without saying it. One person gets ”???” and has to fake their way through the round. Good hints mean good gameplay. Bad hints either give too little or, worse, give too much.

The first version of the hint system looked clean. Words mapped to hints. The hints weren’t the word. Shipped.

I got suspicious and built a batch simulation: run all twenty words per category through the hint generator, score each output, flag anything above a certain root-overlap threshold. Eight came back wrong on the first pass. Not “misleading” wrong. “The hint contains the root of the secret word” wrong. The word was “tropical” and a hint said “tropic-inspired.” The word was “copper” and a hint said “copper-hued.” Technically accurate. Also the answer.

Fixed those eight. Ran the batch again. Six more. Fixed those. Third pass. Seven more. At some point you stop calling it a bug fix and start calling it a curation pass.

The HINT_OVERRIDES map is at 302 entries now. Every entry is a word-hint pair where the algorithm produced something valid but broken in practice: a hint that surfaces the word root, two of three clues that are redundant and narrow it down immediately, a hint that fits one category but bleeds into another.

The core engine isn’t bad. It gets it right most of the time. But “most of the time” is doing a lot of work in a party game where the tension is that one player is guessing while everyone else knows. The imposter has to be plausible. If the hints make the word too easy to deduce, nobody needs an imposter.

Here’s the part nobody warns you about with language games: hints aren’t definitions. Definitions are complete. Hints are deliberately incomplete. The window between “too vague to help” and “too specific to be a clue” is narrow, and English makes it narrower. Words share roots, carry connotations, sit inside semantic neighborhoods that are crowded. “Plumber” points at pipes. Pipes points at smoking, music, things adjacent to plumbing but not plumbing. You’re not generating clues, you’re navigating association graphs, manually.

I added a penalty (currently 0.25) that scores down any hint where the root overlaps with the secret word. That catches future generations. It doesn’t retroactively fix the library, which is why the override map exists and keeps growing.

Here’s what younger me had backwards: the words are easy. Getting two hundred of them into categories takes a weekend. The hints cost you. Three hundred overrides and counting, and that’s before the next batch simulation surfaces the next eight.