Skip to content

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:

  1. 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).
  2. 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.
  3. 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 spend of wood plus the same wood as a repair's materials — 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.


  1. Sharma et al. (2023), Towards Understanding Sycophancy in Language Models, arXiv:2310.13548

  2. Park et al. (2023), Generative Agents: Interactive Simulacra of Human Behavior, arXiv:2304.03442