The no-machine¶
The arc: why an LLM game dies of generosity, the contract that forces the model to say no, and the first live playtest where a refusal felt earned.
The failure mode, first¶
Put a language model in charge of a game world and the default outcome is a world that agrees with you. Models are trained toward helpfulness and assent — the literature calls the conversational form sycophancy (Sharma et al. 20231) — and in a game it manifests as yes-and to everything: every improvised plan succeeds, every resource is conjured on request. The lab's vision names this the core failure: "'Yes, and' to everything = no game." Constraints are where fun lives; a world that cannot refuse cannot be won.
The prototype hunker exists to test one emotional sentence against this
(the spec's fun-test):
"The world handed me a specific problem, I improvised a solution from the exact stuff on my screen, and it judged me fairly — it said no when it should have."
Note the asymmetry: the sentence's proof burden is the no. Anything can say yes.
The design it forces¶
You cannot prompt your way out of sycophancy alone; the refusals must be load-bearing. So the architecture splits authority (ADR: llm-proposes-engine-rolls):
player_text + state_json → LLM → { narration, deltas, difficulty }
The engine owns all truth (integer resources, meters, breach integrity) and all randomness; the model only proposes. Three consequences do the real work:
- A closed delta vocabulary. Five ops (
spend,gain,meter,repair,set_flag) are the only sentences the model can speak that touch the world. Anything else bounces, with the reason shown to the player (hunker/adjudicator.py). - Validation against live stock. Every delta is checked against a working copy in order — you cannot spend wood you lack, overfill a meter, or brace a door past sound. The dividing line between what the prompt governs and what the engine enforces is its own concept: prompt-gates-vs-engine-gates.
- The engine rolls. The model returns a difficulty \(d \in [0,1]\); the engine rolls once per attempt, succeeding with probability \(1-d\), all-or-nothing. The model sets stakes; it never narrates its own success.
Fairness needed its own accounting — attempts cost daylight, refusals are free, and the model's malformed output never bills the player: free-no-costly-yes.
What happened when we built it¶
The fake-provider test suite (18 cases — see Loaded dice) proved the machinery; the first live playtest probed the feel (ledger entry, 2026-07-08). The headline result: the seam works. "Smoke a fish" was refused because the wood stock was actually zero — a no grounded in the exact state on the player's screen, which is the fun-test's precise demand.
Two failures, both instructive:
- Double-billing. The model paid one cost twice — a
spendof wood plus the same wood as a repair'smaterials— burning the stock and bouncing the repair. The vocabulary had offered two encodings for one cost, and a mid-size model eventually used both. Mechanism and fix: double-billing. - The wrong kind of no. "Melt snow for water" was refused as "snow too clean to melt." A nonsense refusal is the mirror image of yes-and — the judge being arbitrary rather than lenient — and it damages the fun-test just as much.
Amendment (2026-07-08)
We first believed the adjudicator's failure modes would be permissiveness — that the work would be making it say no. The playtest falsified the direction: with the contract in place, a 14B model's failures were bookkeeping (double-billing) and arbitrariness (nonsense refusals), not generosity. The residual risk tracks model quality, so the fun-test verdict is deferred to a Haiku-class adjudicator rather than judged on the weakest model available.
Where the arc goes next¶
The Director (dawn-teller) reuses the same contract for world authorship —
{weather, environment_deltas, framing_narration, threat_plan}, engine-
applied — betting that "propose, never mutate" scales from adjudicating one
player action to pacing an entire day. Generative-agent work (Park et al.
20232) explores the neighboring bet — LLM-driven world simulation —
without the hard-truth engine; hunker's wager is that the engine is what
makes it a game.
-
Sharma et al. (2023), Towards Understanding Sycophancy in Language Models, arXiv:2310.13548. ↩
-
Park et al. (2023), Generative Agents: Interactive Simulacra of Human Behavior, arXiv:2304.03442. ↩