Spy Grid is finished. It plays online and on one shared phone, its rules are tested, its card is drawn and its words are written. It is simply not on the shelf, because the game only comes alive at a big table and the groups playing today are smaller than that. This page is the whole story, written so a session months from now can resume without archaeology.
Read alongside: decisions.html (2026-09-17) carries the reasoning and what would reverse it. lan-pause.html is the same idea one level up โ a whole play mode parked the same way.
This is a product call, not a bug. Nothing about Spy Grid is broken.
Spy Grid is two teams, a spymaster each, and a room arguing about what a one-word clue meant. The arguing is the game. At its four-player floor each team is one spymaster and one guesser, so there is nobody to argue with and the round is a quiz between two people who already know the answer. Karim's ruling, 17 Sep 2026: "it is not too interesting with fewer people. Maybe when I have so many people later, I will consider adding that back."
The shelf is browsed by a group already holding a phone. A game that wants eight people, sitting on a shelf in front of four, gets picked once and remembered as the night that fell flat. It also seats up to twenty, which reads as generous and pulls exactly the small groups it cannot serve. Taking it off the shelf costs nothing, and the day the crowd is there it comes back whole.
One id, in one list. Everything else is untouched code sitting behind it.
| Flag | File | What it turns off |
|---|---|---|
PAUSED_GAME_IDS | apps/app/src/games/pausedGames.ts | Every place a player could reach the game โ see the list below |
Two readers act on that list, and between them they cover everything a player can see:
playableGames() in src/games/registry.tsEvery picker in the product already asked this one function rather than the full registry, so all of them followed at once: the home shelf on a big screen, the Games page (and the Games tab on a phone), the shelf's search and vibe chips, the same-device set-up screen, the online lobby's game list, and the LAN host's game list.
CATALOG_GAMES in src/games/catalog.tsThe public line-up is the full list filtered by the same flag, and every public page is
built from it: the export writes no /games/spy-grid page, sitemap.xml
and llms.txt carry no line for it, and the "more games" rail at the foot of every
other game page never shows it.
/games/spy-grid โ not a page on the site any more, so the host serves the
app's own not-found screen. Inside the app the route sends the visitor to /games,
which is where they were trying to get to anyway./local?game=spy-grid โ the same-device set-up screen already validated that
parameter against the games it can offer, so a parked id lands on "nothing picked yet", exactly
as if the visitor had typed /local. No error, no crash.pickableId in src/modes/setupRules.ts),
so the selection clears and START waits for a real pick.apps/app/src/games/spy-grid/ is exactly as it was โ board, team set-up, the
hold-to-peek key, the word list, rules.test.ts and words.test.ts.
Both suites still run on every gate.
It is still one of the games in src/games/pure.ts and
src/games/registry.ts, so the parity checks, the card check, the LAN guest
bundle and the Convex server registry all keep covering it.
Its catalog entry stays in place, and catalog.test.ts holds it to the game's
own meta the whole time it waits โ player counts, minutes, colour, key art and words cannot
drift while nobody is looking. Three tests assert the park itself: the id is a real shipped
game, the entry and words survive, and no public page lists it.
Its rules, words and screens are still in the bundle every player downloads. A few tens of kilobytes, and the price of a one-flip return. Deliberate.
'spy-grid' out of PAUSED_GAME_IDS
(apps/app/src/games/pausedGames.ts). If it is the last id, leave the empty list and
the file โ the next park needs it.typecheck, test, lint:copy and
i18n:check in apps/app, plus the root suite. The catalog and language
tests read the list, so they follow on their own./games/spy-grid starts
being generated again from an entry nobody has read in months โ check the sentences, the player
range and the card still say what we want to say.bun run export:lan-guest) โ a game added or restored during a pause does not exist
for browser guests until that runs.The shelf could one day say which games want a big group, and then a game like this could sit there honestly instead of being hidden. That is a shelf feature, not a Spy Grid feature โ and it only earns its place once there is more than one game that needs it. Until then, parking is the smaller, truer answer.