D1 · D2 · D3 LIVE · 2026-08-02. The owner's frame, arrived at together after two sim cycles: the GM holds a「谁是卧底」app on a handheld device and hosts THROUGH it — like every real-world party app in the genre. The device deals, tracks the living, runs the ballot, buzzes the end; the human reads its screen aloud and keeps the table alive. Nobody calls that host incompetent for not counting votes in their head.
What this is aiming at. Work through the rest of the shelf and the furniture layer should stop growing — collect, compose, dice, score and a clock are the pieces still missing, and those four remaining kits between them want all five. After that a new game is a file, occasionally a file plus a three-line ending condition. The step that makes it a file ANYONE can write is D5: describe the game in ordinary words, one pass compiles it, the validator refuses anything outside the vocabulary, and the bench plays it through before a room ever sees it.
⚠ And the discipline that keeps this honest: a cartridge language expressive enough to encode any game guarantees nothing, and the guarantee is the entire reason the device exists. Games that do not fit the vocabulary are REFUSED and fall back to the persona hosting from its own memory — the third tier, which already works.
Two sim cycles (20Q closed; 卧底 at 16 sweeps) taught one asymmetry, measured over and over:
| where code executes and the mind narrates | where the mind performs the process live |
|---|---|
| the living default · close_sec · the replace law · the masks · auto-load · the draw pools — zero flaps, ever, by construction | read the tally(5f8f: 4-0 announced as「3-1」)· check the END(189c: cards at three living)· wait for the result(ad8c: a result invented BEFORE the ballot closed)· reveal at the end(c356: read「ALL IDENTICAL」and asserted the opposite) |
Every prompt-side lever was tried in escalation — the check moved to the front of the settle block, then carried the dealer's map inline, then stated the string-equality itself — and each step lowered the flap rate without ever reaching zero. A game has 5–10 critical moments; even 95% per moment compounds into a broken game every few runs. A stochastic sampler cannot be prompted into an invariant — the prop-master study said it first;「the dependent variable is not an invariant」.
One file, three layers. The prose brief stays(the persona's understanding — tone, judgment rules, the spirit of the game). A fenced flow block joins it(the device's program — validated against a closed schema whose only verbs are the eight instruments and four control forms). The dials stay declarable.
== FLOW == # the device runs this; the persona never reads it
lobby: # OWNER 2026-08-02: every cartridge gets this free
join: {ask: 这局谁玩?, min: 3, max: 9, close: 30s}
# roster ≤4 → OPT-OUT(all pre-joined, tap to sit out)· bigger rooms → opt-in taps
# under the floor → say so and fold back to chat; never deal a broken game
setup:
deal: {draw: pair, who: JOINERS, per: 1, visibility: own, dealer_sees: true, label: 谁是卧底}
board: {title: 谁是卧底, columns: 玩家|状态, counters: 轮次=1}
moment: opening # persona: rules speech, in its own voice
round:
await: spoken_by_living # order-free; completeness is counted, not judged
moment: recap # persona voices; the device supplies the verbatim list
ballot: {who: living, options: living+弃权, close: 90s, blocking: host}
on_tie: next_round # DIAL — declared, honored mechanically
eliminate: top
board: update 状态 # the row is the device's, not the persona's memory
moment: result # facts handed over: the counts, the fallen
end?:
faces_identical → end(civilians)
living <= 2 → end(spy)
else → round
end:
reveal: all # the pile publishes — always, by the device
moment: verdict # persona: who won and why, the goodbye, 再来一局?
abort: # OWNER 2026-08-02: reachable from EVERY phase
by: player→table-vote(收/继续, 30s) | founder outright | idle 10m(the device folds itself)
then: reveal all → board wraps 中止 → back to chat
# the audit law holds even here: cards were dealt, so cards are shown; winner = none.
# the door is a UI TAP on the game's card — speech never steers, the persona RELAYS
dials: # OWNER 2026-08-02: user flexibility, validated
spies: {by-players: 4-7→1 · 8-9→2} # NOT dialable — rule integrity
tie_rule: {enum: no-elimination|revote, default: no-elimination}
reveal_on_death: {enum: never|role-only|full-card, default: never} # the players' amendment
# set through TWO doors: ① chat —「这局死了要亮牌」— the PERSONA parses(a real use of
# the mind)and the setup moment returns dials as schema-forced fields; the device
# validates, out-of-range gets the default said aloud. ② UI — the lobby card shows
# declared dials as tappable settings. Undeclared = FIXED. Where nobody asks, the
# persona picks in character(the liveliness law). A variant no cartridge declares →
# v1 says so honestly; D5 lets a user FORK the cartridge(edit → revalidate → their
# own shelf copy — the persona-clone pattern). 20Q's sibling dial: questions 5..30.
The judgment moments carry the facts pre-chewed(the counts, the faces, the verbatim descriptions)— the persona reads its handheld's screen, exactly the settle-cue pattern that already works, minus every chance to act on the process.
| kind | the persona provides | the device does | example |
|---|---|---|---|
| color | free speech | nothing — hands over facts, never waits beyond the step timer | the recap · the reveal speech · banter |
| ruling | a forced choice + a free-text quip, one call | writes the row / ticks the score from the choice half | 20Q's 是/不是/说不清/不适用 · trivia's 对/错/算对 |
| compose | authored content — structured fields in its own voice and domain | routes each field where the flow declares(seal · board · public)and enforces the ORDER | trivia:「{question → public, answer → SEAL}」— the answer seals BEFORE the question posts, so a host can never retrofit the answer to the funniest submission(the seal_traced law, applied at authoring) |
Trivia is the proof case: the device ships NO question bank — Hadid's quiz asks about cantilevers, MrBeast's about view counts, and the same cartridge runs both. Content is the persona's craft; commitments are the device's honesty. Where a kit's content is the HOUSE's instead(卧底's word pairs — entropy the persona must not know how to leak), the flow says draw: pair and the device draws; the two sources are declared per slot, never mixed by accident.
# trivia(问答之夜)— the improvised-content shape
round:
moment: compose {question → public, answer → seal} # sealed first, posted second
collect: {answers: all-players, close: 60s} # the seal-collect the toolbox has
moment: ruling per player {对/错/算对 + quip} # judgment stays a mind's
score: board ++ from the ruling half
end?: rounds == N | score >= target → end
state.json beside the kit. Advanced by the events the world already emits(say/speak completeness, vote_result, deal settles, timers): no new event types.The owner's requirement, 2026-08-02: the flow is shared; the rhetoric must not be. The device's answer — it removes the parts where every host already sounded the same(the bookkeeping recitals, identical and error-prone)and returns the freed attention to the parts where they differ.
| retires on device-run games | stays everywhere |
|---|---|
| the prop master on process turns · the promise check · the standing cues(row-lag, stillness, zero, stalled-ballot, end-owed)· the settle-affordance blocks — the runner makes each of these true by construction | the split firewall · the masks(belt over suspenders)· the collection laws · the renderable-table law · the whole classic path for kit-less rooms and free-form play — dual-mode: a kit WITHOUT a flow block runs exactly as today |
The three tiers, top to bottom(owner-confirmed 2026-08-02): ① a cartridge game — the device runs process, moments carry voice. ② a kit without a flow — today's classic path whole(prop → act ∥ speech, FP, wake, every cue and mask). ③ no kit at all, or a game the shelf never heard of —「我们玩狼人杀」matches nothing, nothing auto-loads, and the persona hosts from its own memory, assembling raw instruments through the classic loop, every guardrail underneath. Improvisation is the fallback, never the ceiling: D5's compiler is the long-term door for unlisted games —「tell me your rules」→ a drafted cartridge → validated → played.
Cost: a settle moment today = prop + act + FP + cue machinery(~4 calls); on the device it is one moment call — and most turns need none. The act-call cache lever precedent says measure it, not assume it.
A user writes a rulebook in prose. A one-shot LLM call compiles it to the flow schema. The schema validator rejects anything outside the closed vocabulary; the sim harness dry-runs the cartridge; the auditor gates it. The sampling happens once, offline, where a human can review it — never on turn 47 of a live game. This is the user-generated-kits path the owner already named:「a kit is like pseudocode」— taken literally, compiled, not recited.
exam/spy_audit.py, calibrated on the owner's own room judgments): reveal-only-at-an-open-END · the spoken tally matches a real ballot · no mid-vote reveals · spontaneity · no card-less play. On the device, laws A/C/E hold by construction; the auditor proves it and watches B/D.| # | phase | content | status |
|---|---|---|---|
| D1 | the schema + the runner core | lib/gameflow.py(nine verbs · six predicates · a fixed fact list · three lints with teeth)+ the runner in run_room.py: self.game IS the machine, plain JSON so a restart resumes mid-game · direct arming through the existing appliers · moments via the wake door · a dead man on every wait · one publish path for all five entry points | SHIPPED 2026-08-02 |
| D2 | the 卧底 cartridge | the flow block in who-is-spy.md(13 steps)· exam/device_dryrun.py 93 checks green · 8 live games at N=3/4, both END doors, and a two-game rematch · spy_audit.py clean on every post-fix room · the distinctness judge tells MrBeast from Hadid on the same cartridge | SHIPPED 2026-08-02 |
| D3 | the 20Q cartridge | the seal · the LOG board · the relative tick · the RULING moment · both endgame doors — and the four places one genre had leaked into general code(§15) | SHIPPED 2026-08-02 |
| D4 | the rest of the shelf | the four remaining cartridges, cheapest-first: 真心话大冒险(the wheel · turn_line · per-player chips · the wait_more ruling · reveal:board)→ 大话骰 → quiz → 2T1F. Per game: cartridge first · bench · live · the nine-kind battery at 0 FAILED · what it found in the shared code(§17). The §12 cost measurement stays owed. + THE COLLECT PHASE(owner, 2026-08-03): the ruled window — a named validator judges every bid, the host only interprets(§17, game two act two). | IN BUILD — 真心话 · 大话骰 SHIPPED 2026-08-02 · collect 2026-08-03 |
| D5 | the compiler | prose rulebook → flow, one-shot, validated, dry-run — the Studio's user-kit door | queued |
stage: after-speech(reveal-class)wait for the moment's own speak event — or its ~10s cap — then arm. Declared per step type in the schema; no runtime judgment.The code arms everything in the flow. The runner drives the same appliers the act call uses today — same events, same cards, the GM's name on each — and the per-game LLM bill collapses to voice alone:
| per 卧底 game | today(classic path) | on the device |
|---|---|---|
| prop calls | ~12 — every turn pays the gatekeeper | ~0 — process needs no gate; off-flow requests fall through to the classic path |
| act calls | ~6–8 | 0 — the structured half of a ruling/compose moment rides the speech call itself, schema-forced |
| speech / moment calls | ~12 | ~6–8 moments, all voice |
| cues · promise checks · verify | constant machinery | retired — true by construction |
The pipeline, piece by piece: wake stays and is promoted — moments ARE wake turns with a directive and facts. prop effectively retires in device rooms. fp stays for staging(verdict-void in force; a slimming candidate, by measurement). act is gone as a phase. speech becomes the moment call — the turn split collapses back to ONE call on device rooms: the split existed because one pass could not be a form-filler and a conversationalist at once, and with process in code the only form left is a four-token choice riding along. The classic path stays whole for kit-less rooms — dual-mode, unchanged.
The design survived contact. Everything §2–§6 claims — process in code, moments for voice, dual mode — went in as written, and the two defects that got through were both the same shape: a gate placed where the game runs instead of where the cartridge sits.
| found by | the defect | the fix, and why it is that one |
|---|---|---|
| the dry run (no server, no API) | 「all living faces identical」was read as「the civilians won」. At 8 seats with two minority cards the survivors CAN be the spies — the rule named the wrong winner at a whole class of table. | the winner is read off the surviving FACE, mapped through the cartridge's sides. The predicate says when the game ends; the deal says who won. Two facts, never conflated. |
| the first live game (console stream) | The persona's deal swept the device's off the table and dealt a different pair mid-game. The split's own act call was gated — and the turn armed anyway, through the DELIBERATE second phase, whose flag was computed one breath before the cartridge booted mid-turn. | the door moved onto _act_call itself. A gate per caller is a gate you are one race away from; the one place an act is committed is where it belongs. |
| the same game | The game ended, _flow_active went False, the manual came back — and the host cheerfully hosted a SECOND 卧底 from prose: dealing over the published pile, calling a dead player alive, tripping the standing end-owed cue on furniture it had invented. | _flow_kit() beside _flow_active(). The device does not hand the room back to improvisation because a game finished. While the cartridge is on the table, this game is the device's — and the REMATCH DOOR restarts it through the same prop-SETUP verdict that started it. |
| the same game | Two rules speeches in a row — the auto-load turn's own, then the OPENING moment's. | the boot happens BEFORE the prompt is assembled, so its moment belongs to that turn. The cue is taken off the queue and folded into the turn already running. |
| the harness dial (MAD_GAME_TIME_SCALE) | TWO DEAD MEN RACING. Scaled to seconds, the RUNNER's wait for a vote result beat the BALLOT's own 90s close — so the program stepped over a live ballot carrying the previous round's tally: the round advanced, the pile published while the vote was still collecting(law C), and the ballot settled empty two minutes later into nothing. Latent at real time(90 < 420 always), and latent is what bites on turn 47. | three layers, because it bit twice. The schema lints the ordering where the author writes the number; the arm clamps it at runtime, AFTER any scaling(the first clamp sat before the scale, so the dial broke the very invariant it was written to protect); and if it fires anyway it CLOSES the ballot instead of stepping over it — the settle then advances the program the ordinary way, with a real tally. |
| the bench (that same fix) | The close-the-ballot fix deadlocked on its first run: it called gate_detach, the public door, from inside a locked block — and the room lock is a plain Lock. | detached inline. Worth recording not for the fix but for where it was caught: a second on the bench, with no room, no persona and no bill. |
| the rematch sim (the UX judge) | A host opened a free turn with「四个人都说完了」when three had spoken, and caught itself mid-sentence. The moments were right; the turns BETWEEN moments were blind. | THE DEVICE'S SCREEN on every turn, not only on moments — and the owed list LEADS it. Position is the dose: with「still owed: Owen」at the tail of the clause the host read past it; at the front, the slip stopped. |
The screen is the piece the design did not name. §2 gave the persona facts at each moment and left the rest to voice — but a host also takes ordinary turns, and on those it knew nothing. A real host holding a device never has that problem: the screen is always there. One block, facts only, above everything: what round, who is in, who still owes a line, what the device is waiting for.
The sims never found any of these, and it is worth being precise about why: a sim types instantly and never picks up a pen. Three of the four are what happens when real people take real time.
| what the owner saw | the cause | the fix |
|---|---|---|
| the game board was editable by everyone | board_state()'s legacy rule: a board_set carrying no mode key is read as a pre-v642 board and projects as「anybody writes」. The device's board carried no mode at all. | mode="owner", pass_on=false, creator = the host seat. The persona's own pen was already walled, so the board is now the device's alone — one predicate, so every door(write · clear · the pen · the counter chips)answers the same way. |
| the cards appeared before any bubble, the instant the game was named | arms-before-speech, taken literally at setup. Correct for a mid-game beat where the persona narrates a table that already moved; wrong for the FIRST beat, where the table changes with no word said. (And the trigger is neither a bare keyword nor the persona: it is a keyword match GATED by the prop master's SETUP verdict — a cheap model call that reads the moment.) | the opening moment now runs FIRST and the deal is stage: after-speech. The rules speech lands, then the cards. Its facts say the deal is coming, never that it happened. |
| a ballot card in round 2, before anybody described | the describing dead man was a TOTAL-ROUND timer at 240s. Measured: round 2 opened 02:59:26, the ballot opened 03:03:41 — the timer, exactly. Four minutes is generous for sims that type instantly and far too short for people who read the last result, laugh about it, and then think. Round 1's ballot also closed on its own 90s clock with only 3 of 4 votes in. | it measures SILENCE now — any human line re-arms it — at 300s, and the ballot gets 180s. And a round nobody played never gets a ballot at all: the device nudges once and re-arms, folding only if the table stays quiet through a second full wait. |
| the kit stayed on the table after the game ended | by design — the cartridge had to stay for the rematch door to find it. A spent rulebook pinned to a finished table reads as a round still running. | the spent cartridge comes OFF, at the tail of the reveal turn(so the closing words land on a table that still shows the game). _game_last remembers which one, so「再来一局」still reaches the rematch without anyone naming the game twice. |
| …and two more, on the second read | the cause | the fix |
|---|---|---|
| the board never reset between two games | the take-off deliberately leaves the table alone — 「a rulebook leaving is not a reason to sweep the table」, which is right for a kit and wrong for a cartridge. The finished game's rows stayed pinned to a cleared table, and the NEXT game then wrote into that same board instead of establishing a fresh one(the round chip only ever mints on the board that establishes). | the board comes down with the game that put it up. It is the device's screen, not one of the room's objects. |
| the cards were taken back before anyone could see them | the kit's prose named「take the cards away, the collect publishes the pile」as the ending, and the runner did as it was told. A take-back does satisfy the audit — the deck's composition publishes — but it publishes WHAT WAS IN THE DECK(一个词×3 · 另一个词), never WHO HELD WHICH, and it wipes the player's own card off their screen at the exact second they want to look at it. | the cards TURN OVER instead and stay: every hand, by name, beside the word it held. Same audit and strictly more of it. The owner's parity question answers itself here — a human can deal, and can turn over their OWN card, and when everyone has the deal opens by itself. Nobody needs a take-back; it is the GM's「we are done, put them away」gesture, and it was never the right ending for a reveal. |
The pattern worth keeping: every one of the six was a default that was right for the classic path and wrong for a device room — a legacy board mode, an arms-before-speech rule, a timeout tuned on a bench, a cartridge that stays. The device does not inherit defaults; it has to state its own.
exam/device_dryrun.py — a whole game per scenario against the runner with no server, no API and no persona. 93 checks: both END doors, 3/4/5/8 seats, two spies, the tie, the revote dial, the dead man(including a stale-token no-op), the two dead men racing, the owner's four, a dead player at both doors, a restart mid-game, the floor, the abort. It is where a process defect should die: here it costs a second and no tokens, while a live sim costs eight minutes and a bill. Gated in the smoketest.lib/gameflow.py -- lints the whole shelf: python lib/gameflow.py.live_sim.py spyre — the rematch: one table, two games, the second asked for in chat.live_sim.py spydiff — the distinctness check §5 demands: the same cartridge hosted by two personas, the transcripts diffed by a judge.live_sim.py spyadv — the table trying to break the device, six ways.live_sim.py spy8 · spysilent — eight seats(the two-spy band)and the four-minute dead man. The troupe grew from four seats to eight for the first.spy_audit.py learned what a device room is. Law D asked「did an urge open this ballot?」— on the device an urge CANNOT, so the question was noise. It now checks the device's OWN rule: every living player must have spoken since the last result. A stronger claim, not a waived one. Law A gained the abort as a lawful third END door. Both carry negative controls in the smoketest: a law that cannot fail is a law nobody is checking.| gate | result |
|---|---|
| the dry run(93 checks, every scenario) | green, and repeatably — the deal is random, the checks are not |
| live games(N=3 · N=4 · N=8, two spies, nine options · door A · door B · a two-game rematch · an adversarial table · a silent player) | 13 games, every one reaching its own END door unaided |
spy_audit.py — laws A–E over the whole ledger | clean on every post-fix room(13 rooms) |
the adversarial table(spyadv)— open the cards early · skip the descriptions · re-deal over a live deal · a 2–2 tie · a voted-out player who plays on · the kit pulled off mid-game | all six held. The bar is not「the host says no」— it is that the WORLD does not move; and after three refusals the round still reached its own ballot |
the dead man, live(spysilent)— one player never speaks | 176s of silence, then the ballot opened with NO request in flight; the silent player stayed ON it, and the recap named them |
| the UX judge(confusion candidates) | 「无」on every post-fix run |
| the distinctness judge(§5's FAIL condition) | 「不同的人」— MrBeast is punchy and totalising, Hadid is measured and spatial, on one flow |
| persona arms during a device game | zero through every round — with the manual off its prompt the host never reaches for the pen. ONE exception, found in the console after the runs above: at the REVEAL moment a host wrote four <reveal> tags for cards the device had already turned. Walled and scrubbed, so the game was correct and nothing rendered — and the cartridge's end moment now says plainly that every card is already face up. Re-run: none. The wall is load-bearing, not decorative. |
The owner put three questions to the build, and they are the right three — this device sits directly on the constitution's seam(code=world, minds=LLM). Answered with evidence rather than assurance; two of the three are fails.
The runner is 1,031 lines, and its vocabulary is 谁是卧底's: living(58 uses)· majority/minority/surviving_face(12)· faces-as-roles(8)· faces_identical · self_bust. Those are the ontology of ONE genre — hidden role, elimination by ballot — not of games. A trivia cartridge has no living set and no faces; a co-op has no elimination at all. The schema is a closed vocabulary, and the closed vocabulary is currently this game's. That is not fatal — D3's 20Q is exactly the exercise that will show which verbs are genre and which are general — but the design's claim that「the same cartridge runs both」is unearned until a second cartridge with a different shape runs on it.
Two things WERE outright violations, and are fixed: the runner had 「弃权」 written into its elimination arithmetic — the world knowing one game's word, in one language, for a name the cartridge already declares — and the board's 在场/出局 come from the cartridge but were the only row source it knows. The first is now read off the flow; the second is recorded as a limit.
Everything the runner decides is arithmetic or string equality: who the ballot's top is, whether the living faces are identical, whether a line contains the speaker's own word, how many are still owed a description. None of it is a judgment; all of it is the kind of bookkeeping a stochastic sampler was measurably bad at.
One thing had crossed the line. The echoes fact reported「lines that are NEAR-COPIES of each other」— and「near-copy」is a verdict, reached by a threshold I picked. Whether a line repeats another is exactly the judgment the rulebook hands the host, and handing over the conclusion is worse than handing over nothing, because a wrong one arrives pre-agreed. It now reports the OVERLAP as a number and says what it means is the host's to judge. The device measures; the mind rules.
Worth naming the shape, because it will recur: a fact and a verdict are one adjective apart. 「Owen's line contains his own word」is a fact.「Owen self-destructed」is a rule the cartridge declares and the world applies. 「These two are copies」is neither — it is a mind's call wearing a fact's clothes.
§4 claims「a human host could even play GM with the device exactly as the persona does」. Tested: a room of four humans, one of them the GM, loads the cartridge and the device booted, seated the would-be GM as a PLAYER, and died on the first deal with an IndexError. Three separate welds to a persona seat:
cast[0], and the appliers refuse a slug that is not in the cast — so with no persona the ballot cannot open at all.Fixed for now only to the honest minimum: a persona-less room is DECLINED with a reason instead of crashing halfway through a deal, and the kit still lands so the room can play it the ordinary way. Real parity is a piece of work, not a patch — it needs a host SEAT that a human can occupy(the arms stamped with whoever holds it), a joiner set that excludes them, and the moments delivered as prompts to a person rather than as turns for a model. Until that exists the §4 sentence is a promise, and it is marked as one.
The pattern under all three: the device is honest about what it computes and dishonest about how far it generalises. Its bookkeeping is clean; its vocabulary and its audience are both narrower than the design says. Both are cheap to state and expensive to fix, which is exactly why they should be stated.
Before building 二十问 I wrote down what would count as the engine holding, so the answer could not be argued into existence afterwards: 「if it works, the sequencer is untouched and 20Q needs a handful of new moves plus its own end conditions. If it failed, 20Q needs the sequencer rewritten, because it is not a game about eliminating people at all.」
| the runner, after D3 | lines | shared by | what it is |
|---|---|---|---|
| the ENGINE | 758 | every game, forever | the step sequencer, the waits and their dead men, arming through the existing appliers, moments through the wake door, the flush, the restart, the pen wall, the put-away |
| FURNITURE & MECHANISMS | 264 | any game that wants one | the board(roster or log)· the ballot · the sealed secret · the ruling moment · the counters · the end check · the reveal |
| 谁是卧底's genre | 163 | hidden-role elimination | living · faces · eliminate · which side won · 自爆 |
| 二十问's genre | 3 | — | asked>=N and ruled_win: two end predicates, three lines |
⚠ A CORRECTION TO THE FIRST WRITE-UP OF THIS, and it changes the picture. I first filed D3's 100 new lines as「二十问's own genre」, by the lazy method of「D3 added it, so it is D3's」. It is not: not one of those hundred lines says anything about twenty questions. A sealed secret is what quiz-night and 2T1F want too. A log board is any game with a running record. A relative tick is any score. And the RULING MOMENT — a closed choice the persona makes and the world executes — is the most general thing in the whole build: werewolf's night action, a trivia verdict, 真心话's adjudication, 2T1F's reveal.
So the honest result is stronger than the one I reported. 二十问 needed almost no genre at all — three lines — because what it actually needed turned out to be furniture. The second game did not grow a second branch beside the first; it filled in the trunk.
Which puts a fourth layer in the picture, between the engine and the genres: things any game may pick up. That is where a new game's work should land, and it is a good sign when it does — furniture is reused, a genre is only ever reused by its own family.
This is the part worth keeping, because it is what a second example is FOR — every one of these was one genre's assumption sitting in general code, invisible until something else ran through it:
| what leaked | how it showed | now |
|---|---|---|
| the idle fold counted「who spoke」— 卧底's set of players who had described | 二十问 folded itself two questions in: nobody ever「describes」, so the counter never reset | it asks whether the WORLD moved this round — a line heard, a ruling landed. Every cartridge fills that; only one fills 「spoken」 |
| a winner had to be majority or minority | the validator rejected 二十问's flow outright: a quiz has guessers and a house | sides are a MAP the cartridge declares; the two resolvers ask for the pair only where they need it |
| a board could only be a roster | a question-and-answer game has no roster; it has a growing log | two row sources: redrawn from a roster, or appended to |
| the abstain option was 「弃权」, hardcoded(found in the audit, before D3) | — | read off the cartridge, which already declares it beside the ballot |
Four leaks in 1,000 lines, all of them small, none of them in the sequencer. That is the shape you want from a first abstraction: the seam was roughly where it looked, and the second example moved it rather than breaking it.
二十问 turns on a question the world cannot answer:「is this true of the hidden word?」. So the device asks, with the legal answers spelled out, and executes what the answer means — the row, the counters, the ending. The persona rules; the world keeps the books. It arrives as data(<rule pick="是"/>)because a row written from prose is a row written by a parser guessing at a sentence.
The first live run got 0 rulings out of 6. The host answered every question perfectly — 「不是。它不是活的——是个死物。」— in prose, because the directive said「your answer in your own voice」and never once mentioned that the world needed it as data too. The moment now names the closed list, gives the exact line, and repeats the lesson the put-away tag taught: saying it is not doing it. Next runs: 0 missed out of 9, across two games and both endings.
That settles a design question §12 left open. The doc wondered whether a ruling needs its own schema-forced call. It does not — one call carries voice and choice together, as long as the directive says the choice is the only part that reaches the table. The cheaper shape is the right one, measured rather than assumed.
| the bench(both cartridges, every scenario) | 139 checks green |
| 二十问 live — the right guess, and the twenty spent | both doors, rows written from rulings, counters following them, the box opening at the end |
| the sealed word before the reveal | never in the host's lines, in any run |
| rulings returned as data | 9 of 9 after the directive named the line(0 of 6 before) |
Still open: the prose brief of each kit still describes the mechanical half — it has to, because deleting the flow block must leave a playable rulebook — so a host reads instructions to write the board and is refused when it tries. A note now scopes that(「when the device is running this game, the mechanical half is its work」)and it dropped the reaching by two thirds, not to zero. The clean answer is a third layer in the kit file, and it is not worth building for two cartridges.
⚠ The method this page's history produced — the boundary tests, the loop, and every law with the room number that paid for it — lives on its own page now: Building a cartridge. Read that before the next one; this page is the design record, that one is the instructions.
谁是卧底 got eleven kinds of live run. 二十问 got two, and the two happiest. That is how a brand-new mechanism gets buried under three more games before anybody stresses it — so the set stopped being「whatever I remember」and became a list: live_sim.py battery <game>, nine kinds, cheap-and-deterministic first, judgment-heavy last, one sheet at the end.
| the kind | what only it can find |
|---|---|
| every door | an ending that cannot be reached unaided |
| every size that changes the rules | 3 and 8 seats for 卧底; one lone guesser for 二十问 |
| the middle of a game | counters drifting, rows renumbering, a host that answers well three times and badly on the tenth |
| a second game on one table | state carried over — a stale board, a re-used secret, a game that never really ended |
| silence | the dead men, and what the device does with NO request in flight |
| a table under pressure | six ordinary human pushes: peek, skip, re-deal, guess wrong, claim a win |
| a table that will not behave | chatter, repeats, blurts — whether the game can steer people back |
| the voice | two personas on one cartridge; alike transcripts are a FAIL of the whole design |
| …and your own play | what none of the eight can: real people taking real time |
Nine kinds, 55 checks — and the two that mattered were not the ones the sheet flagged.
Second run: 0 failed of 55, all nine kinds clean.
The four remaining kits, ordered by MARGINAL cost and built one at a time — cartridge first, bench, live with the console captured, the nine-kind battery to 0 FAILED, and what each found in the code that was already there. The order: 真心话大冒险 → 大话骰 → 问答之夜 → 两真一假. The owner's prediction under test: the later games ride the first ones' furniture and cost almost nothing.
The least process of the four: a wheel, a wait, one closed verdict per round. New
furniture, all shared-shaped: the spin(among: living | rotation —
the uniform wheel rides the T9 roll instance whole, a sole-cast that settles at birth;
the rotation is the same concept with no theater)· the turn_line wait(the round
belongs to ONE player; everyone else's lines are table talk that re-arm the dead man)·
per-player board chips(per: "player" mints one per seat — a score,
a die count, a skip budget is a number the world keeps)· rule widening(the row's
cells are the cartridge's; a tick may target the chosen player's own chip and fire on
some answers only; wait_more answers keep a round open and re-park its
wait)· reveal:board(a game with no sealed pile still owes the audit an ending —
the record freezes into the ledger's own event). The kit's classic clock is deliberately
NOT on the cartridge: the completion ruling is the round's resolution, and a timed dare
is the host's narration.
The battery: 9 kinds, 46 checks — 1 FAILED on the first sheet, 0 on the second. The distinctness judge told MrBeast from Hadid on the same cartridge; the device counted 0 unusable verdicts across the long night after the fix below.
| what leaked | how it showed | now |
|---|---|---|
| a rematch inherits the last night's chips — the room's counter fold keeps a re-declared handle's count BY DESIGN(a classic-path rule: editing a live scoreboard must not reset the game), and the rematch door boots in place, no sweep between the nights | night two's 完成 chip arrived reading 1(the live battery's rematch kind; room f1b0)— and 卧底 and 20Q had the same latent bug: nothing ever read their rematch counters | the device's board CLEARS the standing one before it establishes — a fresh game starts from a dark screen; the classic rule is untouched |
| the rule's row was 20Q's row — number · question · answer, hardcoded in the runner | a wheel game writes rows about players, not questions | the
row's cells are the CARTRIDGE's(row: ["round","chosen","pick"]); the 20Q
shape stays the default |
| a verdict asked mid-beat gets no tag at all — the ruling fired on the chosen player's first line, the host's intent was「pose the question」, no option matched that intent, so it wrote none(twice — the D3 lesson one notch deeper) | room e62c: two rulings running lost, the game stuck on a question nobody was asked | a rule with a wait_more answer names it in the cue as THE
answer for a round still in play — beside the exact line, last |
| a lost tag's only recovery was the five-minute dead man — lawful(the world never invents a ruling)but slower than any table's patience | two noisy rooms froze mid-round on one dropped tag each(battery #2's pressure and sassy kinds) | a missed ruling RE-ASKS at once, one time per question; a second loss falls to the clock. Benefits every rule game, 20Q included |
The first cut reduced a cup to a sealed HAND whose cards are faces — riding the deal's physics whole. The arithmetic was fair(every face an independent draw)and the owner rejected it on sight, correctly: the room SAW a deck(「a sealed deck · 20 cards」), believed a fixed composition, and got no shake. A fairness the players cannot see is broken. The rework, to the owner's design: real dice — one roll card carrying every cup, per-person counts(Nora ×5 · Leo ×4, each read off its holder's chip; grammar + card UI), the shake as each player's own tap with an auto dial(自动摇: the house shakes all at arm — the deal's speed with dice physics; a straggler gets one named nudge, then the house shakes their cup: entropy is the world's to complete, a ruling never is), and the 开 as a CHALLENGE BUTTON riding the composer — one big cartridge-labelled button under the thumbs already typing bids, reusable by any game(抢答, stop, 再来一局). The owner also rejected the reveal-cascade alternative(first-open-opens-all)as a hidden reflex on a familiar control: a button does what its label says. Attrition still rides the elimination genre whole; the ladder stays table talk; the device still counts every face both ways and the host still rules who pays.
The battery: 9 kinds, 44 checks — 0 FAILED on the FIRST full run(sheet battery-dice-0802-1947). The door kind's first live round was perfect: cups sealed, one tap opened them, the host ruled a loser by name off the server's printed tally, one chip moved. Zero unusable verdicts across every kind — the reduction reused so much proven machinery that the live phase found nothing the bench had not.
| what leaked | how it showed | now |
|---|---|---|
「the game's deal」meant「the sighted deal」 — _game_deal_gate
required the dealer's eyes, because 卧底's deal has them | the cups are dealt BLIND to the host, so the reveal and the abort could not find the pile they owed the audit — bench, two scenarios at once | on a cartridge room every deal is the runner's own(the pen is walled), so the kind alone is the key |
| 「a ballot needs an eliminate」 — the validator's structural law, written from the one game that had ballots | the buzzer settles into the await that watches it; the lint refused a lawful cartridge | the general law: a ballot's settle must have a READER — an eliminate, a score, or an await vote_result |
| an empty settle advanced a program built on somebody — a first-tap ballot that dies on its clock with zero taps is「nobody challenged」, and stepping forward would open cups over a bid nobody doubted | designed out before it fired: the bench's empty-buzzer scenario | an empty buzzer NUDGES once and re-arms from its own step; a second empty clock folds the game — and even the folded game turns its cups face up |
⚠ The full record of game two's second day — the collect phase, the flash seam, the arithmetic verdict, the widgets, and every law twelve audited games paid for — is its own page: the dice specimen. The sections below are the build-day notes it grew from.
The bidding exposed the device's last blind spot in three measured steps. The host emceed every bid(「三个4——Dan,到你了」); teaching the persona restraint failed because the FLOOR PRODUCER staged a speak on every line; teaching the FP the player window worked — and then over-held: it benched the host over bids it had judged 「合法」itself, including two illegal ones, live. The staging layer cannot hold the rulebook, and the persona holds it only as prose. The owner's cut: the bidding is a COLLECTING process, and the ladder's rules belong to the WORLD.
The collect step is a ruled window with three gates, three seats:
the EXIT is the until-await it rides(dice: the 开盅 press — button, dead man
and nudge all unchanged); a VALID entry is judged by a NAMED VALIDATOR
the world runs(gameflow.VALIDATORS — a pure function beside the schema,
benchable without a room; the cartridge names it and sets dials, it never carries
logic); and the NL→strict reading is the persona's — the host reads
「三个四斋」 into <entry who count face mode/> and the world rules
it: accepted onto the ladder silently, or the exact reason handed back as a VOID
moment the host speaks in one line. Minds interpret; the world rules. Validator #1 is
the owner's own flowchart — the 大话骰 ladder with the rulings folded in: 飞 needs
only count > last count; a bid of 1s is itself 斋 and permanently locks
飞 for the round(is1Called); order is a dial and dice runs strict(an
out-of-turn bid is void). Two upgrades fell out free: the 空开 self-kill and the
verdict now read the validated record — a round of nothing-but-illegal bids is,
correctly, no bid standing, and the loser ruling carries the ladder in order with THE
STANDING BID named. Bench: the validator battery(every chart branch)+ the ruled
window end-to-end, 30 checks.
| what leaked | how it showed | now |
|---|---|---|
| the router's drop law had one hole — a reply emptied by its tags drops(a pure action needs no bubble), but the rule-tag extractor alone shipped without the line | the referee's silent pass(<rule pick="过"/>)
painted an EMPTY BUBBLE, twice per round, live — the owner's screenshot |
the drop line added; the entry extractor was born with it |
| chosen silence was illegible to the client — the no-response net (「the panel didn't respond — try sending again」)predates deliberate silence and read an empty turn as a dead panel | the warning fired on every silent pass and vanished on refresh — the owner caught it in one session | a turn whose whole answer compiled to structure is stamped quiet; the client treats it as a completed turn, and the warning keeps meaning failure |
The furniture-heavy one, as predicted: the two genuinely NEW mechanisms of D4.
Compose — the ruling's mirror: the host AUTHORS the round and it arrives as
data(<compose q opts key/>), so the card the room taps and the key
the world scores by can never drift from the speech. Score — the world compares
every tap to the key and moves the chips itself: the kit's iron rule(the ballot closes
before the answer is spoken)made structural, not asked for. Plus: ballot options
"composed" · the length as a DIAL the end predicate reads
(round>=dial:length)· top_score with
on_tie:"continue" — a tied top simply does not fire the END, which is
sudden death by construction. The key is EMPTY as a fact until the score step has run,
so no earlier moment can carry it — the leak is impossible rather than forbidden.
THE MEASUREMENT THAT MATTERED: one call could not carry voice and authorship. D3 settled that a RULING needs no schema-forced second call(9/9 on one call)— and D4 measured the same shape failing for the compose: 3 of 9 first asks lost the tag in one battery, 5 of 9 in the next, hosts saying 卡片已上 over a card that never landed while later asks(with their own tag in history as an exemplar)landed fine. Picking one option off a list is not authoring three structured fields. So the compose is TWO BEATS: a DATA-ONLY ask(a reply that is nothing but the line strips to an empty bubble, which the drain drops), then the host's own VOICE moment as the card lands, carrying the cartridge's obligations. After the split: 5/5 first-try, zero unusable rounds. The cheaper shape was tried first and measured out — in both directions.
| what leaked | how it showed | now |
|---|---|---|
| the idle fold read the HOST's pulse, not the table's — the compose take marked progress, so the host's own authorship reset the fold every round | a fully ignored quiz robotted on FOREVER: question after question over a table that never tapped once, burning a compose turn per round | progress is the TABLE's: thumbs on a settle, a line heard, a box filled. Two rounds without one fold the game |
| a staged step paced itself behind a speech that had already finished — the compose take runs in the drain's tail, and the ballot's after-speech park began inside that same tail | a 12-second dead beat on every question(the speech cap rescuing a wait for a speech already spent) | the take leaves a one-shot flag; the next staged step consumes it instead of parking |
| an exact-repeat question was the host's to notice — the never said so, and a battery host re-asked one anyway | the middle-of-a-game kind: 4 asked, one repeated | string equality is arithmetic(the self_bust precedent): the device refuses a question it has already asked and re-asks for a fresh one |
| the game-over screen's prohibitions were 卧底's — do not deal, do not vote, do not treat anybody as out; nothing about a fresh QUESTION, because the game that wrote the screen had none | a host closed the quiz and offered 第六题 in prose —「卡片已上!」over a device with nothing armed | the screen forbids the general shape: no new question, round, spin or task, and never claim a card is up |
The first game built from the specimen's loop rather than toward it: audited against the eight laws first, then fixed in benchmark order — mechanical doors before teachings. Four of the eight were already met(dual-mode · no ruled player moves to validate · the confirmations · the interpreter seam); the gaps were consent, the highlighter, and the voice split.
| the gap | what closed it | |
|---|---|---|
| the length was SPOKEN, not tapped — the host declared a number that was never the host's to pick | the RULE-CHOICE card, inherited whole from the
dice night: the dial went to the object shape(ids stay 5/8/10, the END
predicate still reads the id)and the kit grew its lexicon, so the card can ask
五题 · 八题 · 十题 and the tap SPEAKS as the tapper's own action line | |
| nothing gated the next beat — the verdict landed and the next question fired over a table still reading it | THE READY CARD(the
ready verb)— see below. Furniture, not genre: any game may gate a beat
on the table being present | |
| the closed card never said which answer was right | the roll card's intrinsic highlight, one instrument over: the device holds a key nobody saw and stamps it AT THE COUNT, so the live payload and the replayed event paint the same gold from the same field. Only for the device's own ballot, and only while its composed round still stands — a straggler settling late must not mark this round's answer on last round's card | |
| the colour line came AFTER the card and LEAKED — asked to say where a question comes from, a host that knows the answer narrows toward it | 「every element gets a letter or two, and some come from Latin names you'd never guess」— over a question whose answer was tungsten | the line moved BEFORE the card, as a lead-in, and its never-list names the leak's SHAPE rather than the word 「hint」: no clue, no era, no place, no language, no name, and nothing that would only make sense to someone who already knows |
| the host said the question the card already carried — two copies of one sentence, and the bubble adding nothing | the ballot lost its
after-speech stage, so the CARD LANDS FIRST and the host's line beside
it became colour: where the question comes from, why it is worth asking — with
the question, the options and any narrowing forbidden. The verdict gained the reason
the answer is the answer; the ending gained the line that makes the night land. The
clock went 90s → 180s, because a quiz question is READ before it is answered |
THE READY CTA is the button's opposite number. The challenge button is first-past-the-post and CLOSES a window; this is unanimous and OPENS a beat. Every living player taps once; the card shows who is in and who it is still waiting for, and its own clock releases the beat either way. A lapse PROCEEDS, it does not fold — readiness is PACING, not consent(the consent that put the kit on the table was its own tap), and what protects a dead room is the idle fold, which a ready tap feeds.
THE OWNER'S REDRAW(2026-08-04)— and the rule that came with it. The card gained a tally of circles(one per seat, ticked as each thumb lands, deliberately anonymous — it answers HOW MANY at a glance and stays legible where names would not), a hairline, and a foot that names only who is still missing. And it stopped vanishing: a tap that erases the thing it landed on leaves nothing that says it counted. It SETTLES — circles ticked, button greyed, and the foot, the one line that changes meaning and never its position, swapping「waiting for …」for「everyone's in」or 「started without mary and dan」. It is replaced by the next round's card, never removed by its own success. The same pass fixed the LENGTH at five: a dial the room had to answer before anybody had played was the game's first interaction with the table, and it bought nothing.
⚠ AND IT WAS BUILT WRONG FIRST — the most reusable lesson of the pass. The first cut made it a BALLOT wearing a different face, on the reasoning that every part it needed(a need-list, an all-in close, a countdown, a roster, a replay)already existed on the poll. The machinery did fit. What came with it was the poll's whole face: a status band, an opener head, option rows with bars and vote counts, a closed result card, and a slot in the room's instrument cap — for a thing that asks no question and counts nothing. The owner named it on sight(「the ready is a poll instead of a CTA bubble」). It is now the THIRD SELECTOR CARD beside the offer card and the rule-choice card: one shell, one coral pill, a light state slot, a tap route. Reuse the shell that matches the MEANING, not the machinery that happens to fit — and when a CTA costs a room an instrument slot, that is the tell.
And the law the third game adds to the benchmark: every consent is a tap,
and every tap is COUNTED. The offer card, the rule-choice card and the ready card
are each pinned by the smoketest at exactly one arming site, beside
load_kit's two. An invariant nobody counts is one that quietly grows a
fourth door.
| what leaked | how it showed | now |
|---|---|---|
a question could not contain a QUOTE — the compose attribute matcher
was [^"'<>], so a value ended at the first inner quote |
caught by DRIVING a real game rather than the bench: the host authored 「What chemical element has the symbol "W"?」 and the card carried 「What chemical element has the symbol」. The truncation then passed every check it had(q non-empty · three options · key in range · not a repeat)— the room was asked a sentence that stopped mid-thought and nothing said so | the closing quote is the one FOLLOWED BY another attribute or the end of the tag. Same family as the third pass's interpreter law: where the machine's own transport mangles what the mind wrote, the PLAYER pays for it |
| a wait that was not a TURN showed nothing at all — the host authoring a question is a real model call, but the turn-start signal is the only thing that raises the thinking egg | the owner tapped「I'm ready」and the room went dead for seconds — then the line and the card arrived on top of each other and read as one lump, because the eye had been given nothing to mark the time with | any wait a PERSON is waiting through raises the egg: it tracks the room's experience of waiting, not the plumbing's idea of a turn. It comes down again if the call queues nothing(the eternal-egg family). Measured after: egg at 73ms, line at 7.3s, card at 9.2s — and the card trails its bubble by ~1.9s once the eye has a beat to measure against |
a dead man re-armed on the name of ANOTHER wait — the ballot-close
backstop hardcoded vote_result | invisible until a second wait kind shared that door: the timer token pins the kind, so a 「ready」 wait re-armed as 「vote_result」 is a backstop that can only ever no-op | it re-arms on the wait it is IN |
The owner opened room bdaf and found sixteen bubbles in a row from a
persona nobody had spoken to. The room's last human line was three days old: seven
human messages in its whole life, and thirty-two model calls. It was on round ten of a
真心话大冒险 that no one was playing, and it was still spinning the wheel while the
defect was being read.
The mechanism is a two-stroke engine that runs on its own exhaust. The wheel picks somebody; nobody answers; the dead man nudges them by name(one call); nobody answers again; the dead man hands the verdict to the HOST(one call)— which is right, a silent player's fate is not the world's to invent — the host rules 跳过, and the ruling writes the row, moves the chips, spins the wheel and opens the next round(one more call). Sixteen minutes, three calls, one wheel card, forever.
idle_rounds sat at 0 through ten empty rounds. This is
exactly the law game three wrote one act earlier(「the idle fold read the HOST's
pulse, not the table's」)and the ready card states out loud in its own comment(「the idle
fold reads THIS, never the host's own authorship」)— caught at the compose door, missed
at the ruling door. Third sighting of one law is a sign the law needs to live in one
place, not three. The mark is also pure redundancy in the honest case: every genre's
human door — a turn line, a question, a described word, a press, a thumb — marks the
pulse BEFORE the ruling it leads to, so real play folds nothing. Now: two empty rounds
and the device folds, ~6 calls instead of unbounded.The second half of the fix is not the device's at all — see the call fuse and the presence gate, the brakes that were supposed to make this impossible.
The owner's next question, and the honest answer was nothing. The only exit a kit ever had was a cartridge's own game ending — which is exactly what bdaf finally did. Three kinds had no exit at all:
| the mount | why it was stuck |
|---|---|
| a CLASSIC kit(no cartridge) | nothing folds it — and 「put the
table away」, the host's own move, is gated on _flow_kit(), so even that
skipped it |
| a cartridge that DECLINED the table(wrong player count) | the kit mounts, the device is never made — so there is no game to end and nothing to sweep |
| a cartridge between games | deliberate(「a table that just finished usually wants another」)— but deliberate had no expiry |
285 inert mounts in the dev tree, 253 of them over a day old, and not one had a way off. What that costs is no longer tokens — an empty room is silent since the presence gate. It is the rulebook riding every turn, and steering: a host left primed to run a game nobody has mentioned since yesterday.
updated and an ancient last human, and the whole question is the human's. LAZY, with no timer of its own — asked on the two occasions that already exist(a room being hydrated, a turn about to run), because a kit on a table nobody opens costs nothing until somebody opens it, and that is exactly when it fires. A game still running is folded through the lawful door first, so the pile publishes and the record closes: an abandoned game still turns every card over. Dial: MAD_KIT_IDLE / setting kit_idle, 0 disables.
THE MOUNT IS A HUMAN DOOR(2026-08-22, v984, room 036a). The coldness is the
human's — and every human door advanced that clock through fuse_touch()
except the mount itself, which was never wired. A room whose only human act in a week was
「put the kit on the table」 kept a week-old stamp, so the wake the mount fired met a
213h-cold table and lifted the kit 350 ms after it landed, every time — the
host laid a full Liar's Dice opening from a rulebook already retired, and the call fuse
starved on the same stale stamp(fuse_rest). Mounting and taking off now
count as the human touching the table; nothing else changed.
shelf: off(2026-08-05)The owner took 真心话大冒险 off the shelf the same day. Deleting the file was the
wrong tool: it loses a working cartridge, breaks every room that still remembers the
slug, and takes the battery down with it. A kit may now carry shelf: off —
it keeps its file, its cartridge and its tests, and stops being reachable: not listed,
not matched, not loadable. Four doors, and the fourth is the one that matters —
the menu and the megaprompt read the shelf, the chip and the auto-load read the matcher,
but a slug travels(a stale client, a saved offer card, a rematch's memory of
the last game), so the load door refuses it by name rather than trusting that nothing
upstream still holds it. read_kit deliberately still works: a room with the
kit already mounted has to be able to name it and lift it off. And
MAD_SHELF_ALL=1 puts the whole shelf back for a harness — a withdrawal that
quietly stopped exercising the thing would rot the cartridge it exists to preserve.
The OLDEST cartridge, rebuilt against furniture that did not exist when
it was written. It was the game the device was born for — and by the time three more
games had been built it was the only one still using the pre-collect shape: a bare
await, a head count, and a host who answered every legal move.
The describing round used to be a wait: everybody types something, the device counts
heads, the ballot opens. A line that copied a neighbour, or said nothing at all,
counted exactly as much as a description — so a ballot could open over a round half
the table had not played, and the rules the kit's prose declared were rules nothing
enforced. The round is now a collect window with a named validator
(spy-desc), and the shape is the shelf's, not this game's:
| the line | what the table sees |
|---|---|
| a valid description of your own word | a reaction on your own
bubble, from the shared ACK_EMOJI jar — a tick, never a reply. The
host does not answer a legal move. |
| a copy of somebody else's · a line describing nothing · the word itself | ONE line from the host with the exact reason, in the room's own language — and the player still owes a description(a refusal is not a turn spent). |
| table talk, or a question aimed at the host | a normal reply, in the host's own voice. This is the one genre difference from the dice window, where the referee stays silent throughout. |
desc · copy · empty — and what stays the world's is everything
arithmetic: who is living, who already spoke, whether the line contains the speaker's own
dealt word, what a refusal costs, and the words it is spoken in. The cheap interpreter
only ever says「a description」or「I am not sure」: a judgment made by the cheapest
mind in the building is a void a player gets blamed for, so a doubt escalates the whole
batch to the panel — which holds the round, the rulebook, and the mouth that has to speak
the refusal anyway. And the validator fails OPEN: an unknown reading is a
description.The round closes on the LEDGER, never on the line. The exit moved out of
_game_heard(which sees raw text, before anybody has read it)and into the
accept: when every player owed has an ACCEPTED entry, the window closes itself and the
ballot opens. Three lines from one mouth and a dodge from another is not a played round,
and the head count said it was.
A silent player used to hang the round until one dead man fired, and then the ballot opened with no warning to anyone. Now the world nudges the stragglers by name, once — the shelf's own pattern(the button, the cups, the chosen player all nudge once)— and re-arms at half the window, because after being called by name the question has changed. On the second silence the world moves on: the ballot opens over the descriptions that are in. A round with NOTHING in it is the exception and gets a second call, because it can never go to a ballot whatever happens.
二十问's seal-fidelity law, owed by this instrument too: the closing line is checked against what the world actually published. The guard takes a LIST now — 卧底's ending is a PAIR, and a line naming only the civilians' word has told the room nothing it stayed for. Every distinct word on the pile must survive into the host's sentence, or the line never lands and the ending is re-asked once; the cards are already face up either way. A FOLD wears the same guard, for the same reason it wears the same reveal.
?1 × majority + ?2 × minority, so the odd card is
decided by arithmetic before a single hand can be read; the house's own placeholder binding
already says which word ?2 became. Counting is a different question that
usually shares the answer — it needs the whole pile still readable(after the reveal
there is nothing left to count), it cannot tell a minority from a majority on an even
split, and it re-derives on every reader. The draw now records its binding, the deal
records the seats, and both readers — the reveal's highlight and the WINNER — read the
record instead of tallying. That last one is the point: the side that won was being
decided by a count taken after the fact.
| found | it was | now |
|---|---|---|
| the collect window's ctx | every window got the DICE's slice —
ones_wild · modes · the table total — one game's rulebook in
the general arm | sliced per grammar; the shared part is the turn order and nothing else. The dealt WORDS ride a LIVE slice that is never persisted: a secret with two homes is a secret with two ways out |
| the drain's window gate | keyed on a_press — the dice's own
wait | keyed on the window's own declared exit(collect.until); a
gate written against one game's wait silently drops every other game's entries |
| the entry's DISPLAY | the ladder board and the record fact both rendered a bid by hand | one seam(_game_entry_disp); a new grammar teaches
the whole surface at once |
| the leak guard on the flash voice | lived inside the LEAD-IN branch — one instrument's law | every flash line carrying a forbid list is checked. 卧底's refusal speaks ABOUT a line that may have carried a dealt word, and this is what stops it repeating it |
| the screen's TABLE RULE NOW and the dial-door example | named the
dice's own dial(ones / always_wild)in general code, so every
other game's host read a door onto a dial its table does not own | the cartridge's FIRST dial — byte-identical on the dice room, and every other game finally gets one |
| the deal gate | read the FIRST deal in the room — the 2a5d law, unapplied to the one instrument that predates it(the cups and the box are both keyed) | keyed by the iid stamped at arm, with a sweep at boot: a rematch starts from a clear table |
| a full circle closing mid-batch | returned out of the entry
loop, so a batch whose circle closed on its second line never ruled its third |
continue — and the window's own exit check runs either way |
| the live harness | every 卧底 driver still expected the kit to mount off a spoken ask — stale since the MOUNT LAW(2026-08-04), so the whole battery failed at its first assertion and blamed the game | nine openers tap the OFFER CARD, and so does the rematch. A driver that cannot press the one button a human presses is not driving the product. |
二十问's ruling was 90% of the game's bill. The owner asked whether it could move to the cheap mind. Measuring it first said something better: the model was never the expensive part.
| one ruling, as it shipped | tokens | $ |
|---|---|---|
| re-reading the room | 420,992 | 0.00153 · 56% |
| new text since the last turn | 2,585 | 0.00112 · 41% |
| the answer itself | 70 | 0.00006 · 2% |
$0.0029 to say 不是, of which $0.00006 was saying 不是. The rest was handing a model the whole room in order to answer a question about a word on a card. So switching the tier alone buys 1.7×; asking it off a 300-token prompt buys 15× on the SAME model and 190× on the cheap one.
exam/q20_ruling_ab.py replays every(sealed word · question · the pro
model's own answer)triple in the play history — 187 real rulings, no live play, about
a cent. Both cheap arms were run against the shipping one:
| arm | agrees with the shipping ruling | $/ruling |
|---|---|---|
| flash, tiny prompt | 75.9% | 0.000015 |
| pro, tiny prompt (the control) | 77.0% | 0.000047 |
A rule may name a side-ask recipe(side:
"seal-question"). The cartridge supplies the words through its own lexicon
(ask.head · ask.<option> · ask.tail); the
world owns the call, the guards and the fallback. The rung comes back with an optional
five-word qualifier — the thing this game's charm lives in — which the world checks can
never contain the secret. Then a mind still says it: the flash voice with the
persona's capsule, the verdict's own recipe. Any failure queues the ordinary panel
moment, whole, so this is a fast lane and never a wall.
Measured live end to end: a four-question game's rulings cost $0.000068 in total — 1.2% of the game — and each answer lands in about a second instead of six.
With the ruling off the panel, the owner's next move was to take the BUBBLE away too: 「instead of giving an answer in a bubble, what about make a reaction on the asker's bubble?」 It is the bidding window's own law arriving in the other genre — a move that needs no conversation is confirmed ON ITS OWN BUBBLE, never in a reply — and 二十问 is where it pays most: twenty questions used to cost the room twenty host bubbles saying 「不是。下一个。」 over a board that already showed the count.
它是活的吗? ❌ 它比一辆车大吗? ✅ 它是在室内用的吗? ❌
我猜是游乐场! → 「猜对了!但别高兴太早……」
Three questions, three ticks on the askers' own bubbles, and not one host bubble
until the ending. The glyphs are the CARTRIDGE's(react.<option> in
its lexicon)because they are its words like every other word it owns, and a rung with no
glyph declared still speaks — so a partial mapping degrades to yesterday rather than
breaking. ⚠ Silence is the ANSWER's shape, never the EXPLANATION's: a rung that
came back with a reason still gets a line, and that line carries the reason alone —
repeating 「说不清」 beside a 🤔 is telling the room twice.
Four glyphs rather than the three the owner named: 说不清 and 不适用 look alike from outside and are not — one spends the question, the other costs nothing — and collapsing them would hide a rule the board is keeping.
rule.say), the recipe demands a reason for
exactly those, and if one still fails to come back the line speaks the rung anyway —
the bare shrug is the one thing that must never ship.The secrets are drawn from the shipped bank ranked against a persona's own card,
and the seam that decides WHOSE card used to answer by guessing cast[0]. Its
own docstring had already named the debt:「a game that deals a secret to a named seat
should thread that slug down rather than have this guess — the honest fix is an argument,
the day a game needs one」. It is an argument now: the drawing seat comes from whoever
armed the draw(the deal's slug, the box's holder), with cast[0] only as
the fallback for a caller that names nobody, and a slug that is not seated in this room
falling back rather than ranking against a stranger. The warm-up follows: every seat, not
only the first — a vector is one cheap call per persona ever.
Same room, same bank, two seats — the whole point, in one line each:
| the seat that armed it | what the house drew |
|---|---|
| jimmy-donaldson | 长颈鹿 · 漫画 · 蛋黄酱 · 滑梯 · 图钉 · 鸭子 |
| bob-dylan | 篝火 · 手榴弹 · 虱子 · 京剧 · 后院 · 木偶 |
⚠ The check that proves it has to arm from the SECOND seat: on a device
room the host IS cast[0], so a test that only ever plays the ordinary game
cannot tell the guess from the answer — which is exactly why the guess survived.
The fidelity guard protected names and numbers — and this note's whole
content is a WORD. The first live rulings shipped 「不是。接着问下一个。」 and the
voice returned 「行,下一个。」: the answer gone, the invitation kept, every check green,
because there was no name and no digit to drop. A caller that knows its note has one
indispensable word now declares it(keep)and the line is thrown away
without it. |
| A ruling asked off to the side owes no panel turn. The player's question IS the thing being ruled, so the ordinary turn for that message became a second host bubble between the question and its answer, saying nothing. It is the bidding window's own gate, one genre over: while the world is answering, the panel is not asked to. |
The side ask shipped in the morning; the owner played a game on it the same afternoon and came back with five things. Four of them were one day old. Every one is in the table below with the room's own log line beside it.
| what the owner saw | what the room actually did | the cause |
|---|---|---|
| 「是实物吗?还是概念?」is not a valid question, but got a tick | ruled 是 · row #2 · a question spent | The ladder had no rung to land it on. Five rungs, and every input has to become one of them — so a two-in-one is answered rather than bounced. The hand-played brief has had「if it is not answerable yes/no, ask for it rephrased」as step 1 since the kit was written; the cartridge's closed list never got it. |
| a thinking bubble lingers after the tick, as if the host were about to speak | the egg breathed until the next turn | Nothing lowers it but a reply, and a tick is not a reply. The side ask raises the egg on purpose(somebody IS waiting). The authoring call twenty lines below already solves this exact thing —「it must come down again if nothing is coming」— and the ruling path, written the same day, never got the same line. |
| Q:空调 → A:「型号和用法不同,差别就大了。」 Q:暖气 → 「…就像买公司,先搞清楚它是做什么的」 |
the side ruling answered 「说不清」(要看具体型号和用法) |
A guess was never recognised as a guess. The prompt said 玩家问 — 「the player ASKS」— and the ladder had a rung for a RIGHT guess and none for a wrong one. So a bare noun was ruled as though it asked about a property, and came back「it depends on the model」. |
| Q:壁炉吗 → A:「不是,别给我安什么"中国巴菲特"的帽子,我就是个普通人。」 | the note was 「不是。」— three characters | The voice was unguarded. Warm(t=0.6)behind 2,500 characters of the host's profile, and the fidelity check only asks whether the note SURVIVED, never whether anything was added. 不是 was in there, so every gate was green. The phrase is not even in the profile — the model was riffing on the person's fame. |
| the answer was 电暖器 and we said 暖气 / 壁炉 — give the player credit | neither was ever compared to the word at all | Downstream of the row above: 猜对了 meant「said the secret word itself」, an exact match, and nothing reached it. |
| after the kit came off, the host started 谁是卧底 from memory | THE OFFER CARD — "二十问", then deal 蓝莓×2 · 草莓 |
It did the right thing first. The host raised a proper offer card for 二十问; the prop master then judged「they want another round → lay the table」and the table-laying call invented a spy deal in the same turn. The hand-build suppressor woke only to the PROP's reasoning, and neither half of that turn said a game's name anywhere it could read. |
The owner's instruction was direct: 「the correct guess doesn't have to be a keyword
match, it should be a vector match」. So that was measured first
(exam/q20_guess_ab.py, 81 hand-labelled pairs):
| cosine | label | pair |
|---|---|---|
| 0.9768 | DIFFERENT | 橘子 ← 橙子 |
| 0.9620 | same | 电暖器 ← 电热器 |
| 0.9606 | same | electric heater ← space heater |
| 0.8867 | same | 圆珠笔 ← 原子笔 |
⚠ Position was the dose again. The rephrase rung shipped LAST in the ladder's walk-order and scored 2/6; the tail's step ②「can you just answer yes or no?」 was reaching it first and forcing an either/or onto an answer. Moved to step ① —「is the sentence answerable at all?」— it scored 5/6 with nothing else changed.
One of the nine battery runs warned:「an open question costs no row」— 「它是什么颜色 的?」 was ruled 说不清 and took a row. The rung existed, sat first, and still lost — because 说不清 is an escape route that is always open. A model that can think of any「it depends」reading will answer rather than bounce, and for an open question there is always one(「颜色取决于水体与光线」). Widening the exam's rephrase set to the four hard cases scored the shipped ladder at 6/10.
⚠ And it cost three synonyms until a contradiction was found. The first fix put
the whole test in the tail's step ①, and the synonym half fell 26/27 → 24/27 — the longer
step diluted the guess step below it(position is the dose, again). Moving the test into
ask.重问's own gloss did not recover them either, which is what exposed the
real fault: the two guess rungs contradicted each other. 猜对了 said a modifier is
fine(电冰箱 for 冰箱)while 猜错了 said a change of scope misses(墨镜 for 眼镜)— and
全自动洗衣机 · 智能手机 · 瓶装水 sit in the overlap, so which rule won was a coin toss.
Scope was never the real test. The question is whether people would buy and name it as
a separate thing: 墨镜 · 油汀 · 冰柜 yes, 电冰箱 · 全自动洗衣机 · 智能手机 no.
| ladder | synonyms | neighbours | not-a-question | ordinary |
|---|---|---|---|---|
| as shipped this morning | 26/27 | 44/44 | 6/10 | 14/14 |
| + the read-back test in the tail | 24/27 | 44/44 | 10/10 | 14/14 |
| + the test moved into the rung | 24/27 | 44/44 | 9/10 | 14/14 |
| + the contradiction resolved | 26/27 | 44/44 | 9/10 | 14/14 |
The two survivors are honest: 电暖器←电热器 is a genuinely hard synonym (and the one case the vector would catch, at .962 — but no floor admits it without also admitting 橘子←橙子 at .977), and 「你觉得这东西常见吗还是稀有」 is an either/or wearing a 吗, which is arguable in both directions.
The owner's fix for the voice, in one line: 「don't add persona colour. Just use the persona's mouth to say 不适用 or 说不清, plus the reason. If we can't force the persona to say this, just use code.」 Both halves already existed — the cold class(t=0.1, the separator duty, a hard cap)and its floor(two disciplined tries, then the note lands verbatim as the line, never the pro path, which is where the verse lives). The ruling now rides it, with two additions this room paid for:
keep: [] left that line, the one that reads
as the host talking to itself, with no fidelity guard at all.Found while verifying the row above, in a sim room: sealed word 长袜, and the
ruling's own qualifier shipped 「看具体猫和袜子尺寸。」 The leak guard is
_word_in — string equality — and 袜子 is not 长袜, so every gate was green
and the table had been handed the word. It is exactly #55 one layer down: the world
could check whether the SECRET appears, never whether its meaning does.
The owner ruled out the cheap fix on sight —「refuse any qualifier sharing a character with the secret — that's too harsh. We should refuse any qualifier that leaks the answer」— and the measurement agrees: a per-character guard also kills 「要看电压」 under a sealed 电风扇, and the reason is the very thing being protected.
⚠ The floor lives in general code(SEAL_LEAK_FLOOR), not in
the cartridge — a law stated for one instrument is owed by every instrument, and any
game that seals a word owes the room the same promise. On any outage it falls back to
the equality check, which is exactly the behaviour it replaced.
The owner's ruling: 「just be sure we never auto-start a game that is on our shelf
already」. The mount law already says a mount is always a human's tap — what ce9c
found is that a game can reach the table without ever being mounted. Two doors added to
the suppressor, both self-limiting: ① this turn's own <kit/>
tag — a turn that OFFERS a game does not also lay it — and ② an offer card raised
in the last three minutes: the room is being ASKED, and the tap is the only thing that
lays the table.
⚠ A third door was built and removed: 「a kit was just taken off」. It reads
_game_last, which is never cleared, so it re-raises the sticky flag every
turn and the 15-minute lapse can never fire — one game played would have banned every
ordinary poll and dice roll for the life of the room. The offer's own timestamp is what
makes door ② safe, and the window is three minutes rather than the offer's full fifteen
for the same reason: the defect is a table laid in the SAME BREATH as the offer.
「the persona always says that the system has drawn the word for him (which is true). But to increase vividness, we'd like him to say that he himself thought of this word.」
A host that opens a guessing game by crediting an app for the one thing the game is
about has given away the warmest moment it owns. The mechanism does not move — the
house still draws(a word nobody chose is a word nobody can leak — the reason server
entropy was built at all), the box is still keyed to the game, the reveal still publishes
what the WORLD holds. Only the performance changes, and only where a cartridge asks for
it: seal.mine.
did lines that change say BOTH things in one breath: perform it as
yours, and rule every question off the card however well you think you remember
it. The directive never lies to the host about the mechanism — a host told a falsehood
about its own instrument has nothing to anchor the discipline to.⚠ Why this is safe NOW and would not have been a week ago: since the side ask shipped, the ruling is made by a call that is handed the word. The host's belief about where the word came from cannot reach the rulings on a cartridge room at all. The fiction is decorative by construction.
The cartridge's own opening went clean immediately(3/3:「题我已经想好了,封在盒子里」). But the turn BEFORE the tap still said 「让机器来抽」·「让系统随机抽一个」— 3 of 3 — so the room heard the machinery and then, thirty seconds later, heard the host claim the word. Two lines that agree are better than one right and one wrong; this was briefly worse than doing nothing.
The source was the shelf hint, which read「on this shelf the MACHINE draws the secret」. Its constraint is real and load-bearing — it is what stops a host settling on a word before the tap(the phantom word's birthplace)— so the constraint stayed and the narration went: 「that is backstage; the game tells the room itself, after the tap」. The classic path's deliberation note carried the same push(「机器抽词,谁都没见过 — say that」)and lost the「say that」.
| opening lines crediting a machine | |
|---|---|
| before | 3 of 3 offer turns |
| after the cartridge change alone | 3 of 3 offer turns(the game moment clean) |
| after the shelf hint and the note | 0 of 12 lines |
Seal fidelity held throughout — every run: seal == reveal, the word never reached for before the box opened, rulings written from the card. That was the thing at risk, and it is the thing that was checked.