The owner's brief, 2026-08-01: 「Primary: improve our world to a level that every game on the shelf can be played by human users without obvious bugs. Secondary: make sure our harness is sound… and we are using the most cost-effective LLMs for each role. Greatly improve the kits first: search the web for authoritative rules → internalize → write the kit for the GM — the GM is the reader. Then simulate with 1..N LLM users, analyze from the user's POV and the transcripts, fix, loop until no more issues. One game at a time, starting with 20Q.」 This page is the plan, for review before execution, and will become the scoreboard as cycles run.
| defect | evidence | layer · the designed fix |
|---|---|---|
| The silent board (ledger 41, OPEN) | reproduced in sim-20Q (0 rows over 6 questions) AND sim-卧底 (board unmoved after an elimination) — a kit law cannot carry a silent omission; the promise check needs words | world · THE ROW-LAG CUE: the world holds both timestamps (counters/eliminations moved N times since the board's text last changed) and states the disagreement at the wake door. Mechanical, any tally game, no content sniffing |
| The deal-family speech door | room 8f01: a speech-written <roll away/> tore up a live deal (the firewall's walled families never included deals) | world · the firewall walls deal arms + aways from speech; the act call stays the lawful door. Gates: the legacy deal pins run bracketed, exp cells, controls |
| Setup-deal reliability | 1 of 3 sim setups armed no deal in the first beat (the others dealt cleanly) | measure first — raise N before judging; may be the same silent-omission family |
The 20Q cycle will meet the first of these immediately — the loop's first fix stage is expected to build the row-lag cue against a reproducing sim, which is the right order: the defect reproduces on demand before the fix is written, and the same sim proves the fix.
| role | model today | cost share (gameroom audit) | candidate move | gate |
|---|---|---|---|---|
| panel speech | pro | ~42% | stays — the voice is the product | — |
| act call (hands) | pro (cache lever −38%) | ~45% | stays — flash measured worse on composition (drift, bare-letter options, public run sheets) | re-open only on a new flash generation |
| verify tail | pro | ~10% of act spend | flash — a mechanical does-the-table-match check | A/B on the verify's fix-rate + false-fix rate |
| floor producer | pro (v1p) | ~12% | flash (the recorded v1f re-test) + the cache-shape pass | hold/stage accuracy + controls |
| prop master | flash-0731 | ~2% | done | — |
| sim brains + UX judge | flash | (harness side) | done | — |
| promise confirm | flash | <1% | done | — |
Each cycle's report prints the room's per-role spend and wall time, so the economy is measured continuously rather than audited occasionally. The FP/prop cache-shape pass (the proven −38% playbook applied to the two remaining volatile-prefix calls) rides whichever cycle first touches those prompts.
| # | game | status | cycles | notes |
|---|---|---|---|---|
| 1 | 二十问 (20Q) | PLAYABLE — cycle 1 closed 2026-08-01(classic)· cycle 2 closed 2026-08-05(cartridge) | 2 | cycle 1: every door a human can walk through exercised live: invoke · play at N=4 and N=1 · wrong guess(box stays sealed)· RIGHT guess(box opens on the spot)· 20-question exhaustion(run twice)— all clean under the full referee; 31 rooms, ~10 world fixes. Cycle 2(§8)took it onto the device and answered the owner's seal-vs-reveal report: the house draws before the rules speech, every exit opens the box, and an ending line that names a word the box never held never reaches the room |
| 2 | 谁是卧底 | RUNNING — auto-started per the owner's directive | — | the full-game referee drives BOTH mechanical END doors(A: the spy falls, faces same · B: two left, cards open)at N=4 + door A at N=3, with every check 20Q earned; exit = two consecutive clean sweeps |
| 3 | 问答之夜 (quiz) | queued | — | the frozen-tally residual lives here |
| 4 | 大话骰 | queued | — | per-player cups + the rename-and-land law get their workout |
| 5 | 两真一假 | queued | — | round-2 parity's remaining seam (the swapped teller's box) |
| 6 | 真心话大冒险 | queued | — | the least instrumented; mostly social — the UX lens leads |
Sixteen sim runs. Exit first claimed on rooms 0d12–48fa — then the owner found wildcard artifacts in three of those「clean」rooms, the exit reopened, and three more defects fell(including a real spoken leak the widened referee caught on its first look). Exit re-met on rooms ba10 · 113d · c98b · fe80: two consecutive clean pairs at N=4 and N=1 under the full referee — rows in both table dialects, zero tagged artifacts, the sealed word nowhere public before the reveal, judges clean, zero harness exceptions. Every fix was reproduced by a sim before it was written and proven by a sim after — except the one a human had to find first. What went wrong, in plain words:
| what went wrong(symptom) | root cause | the fix |
|---|---|---|
| The host answered six questions and the counters moved — but the whiteboard stayed empty. By the end she was miming writing the board in prose. | Under the turn split, speech may move a counter but may not write the board. The one speaker who knows the Q&A had no legal way to put the row down. | A row is now a small operation, like a counter tick: <board append>新行</board> adds a line from speech. Full rewrites still go through the hands. |
| When the server nudged「the rows are owed」, the hands once opened the sealed answer mid-game, and once ticked the counter again instead of writing rows. | The act call doesn't hold the Q&A history — woken to write content it never saw, it guessed, and guessed wrong. | Defanged by the fix above: rows travel with speech now, the debt never builds, the nudge stays quiet. Watched, not patched. |
| Rows appeared, then vanished(7 → 4 in one move). | The act call sometimes rewrote the whole board from its short memory window — wiping rows it had never seen. | While the rows are current, the act call is told plainly: do not rewrite the board this turn. |
| The same row printed twice on the board. | The model sometimes repeats itself, and each repeat landed. | A line already on the board is never added again; a write that adds nothing new is ignored entirely. |
| The harness cried「row law broke」over a correctly-played game. | The test expected one row per scripted question — but a 不适用 answer writes no row and costs no question, by rule. | Harness fix: compare rows against the room's own 已问 counter — the law itself — not the script. |
| 已问 ran to 13 after five questions. The host's spoken count stayed right; the card drifted, and she hand-corrected it mid-game. | One tag in the model's output could be read by two or three different collectors(the reply text · the raw-text salvage · the hands echoing the speech), each landing it again. | Each tag counts once — a duplicate seen by a second collector is dropped. This likely ends the long-standing intermittent count drift, in every game. |
| Caught by the owner, not the referee: document bubbles full of raw tag code appeared in three rooms scored CLEAN — and inside two, a run-sheet showed the sealed answer in plain text, six bubbles deep in one room. | The de-duplication fix above skipped those bubbles instead of deleting them, so they rendered unstripped — and the referee never read the document channel at all: 「clean」meant「clean where it looked」. | A tag-source bubble is deleted outright, never rendered; a run-sheet inside a bubble routes to the host's private pad. And the referee now FAILS any run where a bubble carries tag code or the secret appears anywhere public before the reveal. |
| The widened referee's first look then caught a real slip: the host ruled「不适用。滑梯不会飞」— speaking the sealed answer mid-game. | Explaining WHY a question doesn't apply pulls the word out of the model's mouth — the known hard-leak shape, now on camera in a live room. | THE SEAL MASK: the sealed text cannot leave its creator's mouth while the box is closed — the room record shows ▢▢ and the host is told. A guesser saying the word is a guess and renders; the reveal turn renders whole. Plus one kit line: say 「它」, never the answer. |
| The referee cried 0/6 over two rooms whose boards were perfect. | The model writes its table in two dialects(「| 1 | q | a |」and the bare-pipe「1 | q | a」); the referee only read one. | Harness fix: both dialects count — which was the wrong call; see the next row. |
| The ship-readiness probe(the owner's question): the two endgame doors — a RIGHT guess and the 20-question exhaustion — had never been exercised by any sim. Both failed on first contact. | Right guess: the box opened but the victory line rendered「就是▢▢」— the seal mask's reveal-skip only knew one of the two reveal doors. Exhaustion: 剩余 hit 0 and the room just sat — a chip reaching its floor was a world event nobody cued. | The mask unveils BOTH reveal doors(content form + act-op). THE ZERO CUE: a dec landing a counter at 0 wakes the room with the fact, once per handle — the kit's rules say what zero means. |
| One exhaustion run went totally silent: 30 answered questions, zero ticks, zero rows — and no cue ever fired. | The row-lag cue measures a DISAGREEMENT between chips and rows; when both stand still it reads as consistency. | THE STILLNESS CUE, its blind-spot companion: N guest turns with nothing moved on the table, stated once per streak as a fact —「your own run sheet knows whether that is right」. |
| A finished-but-unrenderable board hid one more way: piped lines with no |---| separator printed literally(the owner's second screenshot). | Markdown needs header + separator to see a table; the normalizer fixed edge pipes but never guaranteed the separator. | A multi-line piped block missing its separator gets one inserted after the header; the referee requires pipes AND separator. |
| The owner's screenshot: the board rendered as literal text on the phone — pipes and dashes on screen — in four rooms, two of them scored clean. | The bare-pipe dialect isn't a dialect to a markdown renderer: without leading/trailing pipes the table doesn't parse. Accepting it in the referee verified the intent, not what a user sees. | The server keeps its panel renderable: every table-shaped line normalizes to proper piped form at write time(separator rebuilt, columns reconciled); non-table boards untouched. The referee now fails any board that would render broken. |
Where the fixes live: everything above is a world or harness fix — every board game inherits them(the spy scoreboard's stale-board failure is row one of this table, pre-healed). The 20Q kit needed no edits after the cycle-0 rewrite, and nothing was fixed in a persona. Deep write-ups: defect ledger rows 41–44.
| run | room | rows kept pace | what it taught |
|---|---|---|---|
| 1 · N=4 | f0cd | 0/6 | the row-lag cue fired and produced the first mid-game backfill — and exposed the structural half: counter ops pass from speech, board writes wall as arms. The woken hands, lacking the Q&A history, revealed the sealed answer at Q7 |
| 2 · N=4 | 0169 | 6/6 | THE ROW DOOR(<board append> = rows are ops, the tick's sibling)works live; wrong guess correctly refused with board-based reasoning |
| 3 · N=1 | 6d4e | 6/6 | the act call's full rewrites CLOBBER appends(rows 7→4 in one arm); the repeat wobble lands a row twice → the CURRENT clause + append dedup |
| 4 · N=4 | e0a1 | 4/6* | *harness false-FAIL: two legitimate 不适用 answers write no row BY RULE — the referee now reads the LAW(rows vs 已问), not the script index |
| 5–6 | 3217 · a84a | counts ×2 | the law-referee exposed the double collection: three collectors could walk one span(artifact-slice · healer-absorbed tail · hands echo)— 已问 hit 13 by Q5 while the model wrote one clean pair per turn. Two merge laws close it: ONE SPAN ONE COLLECTION · ONE INTENT ONE EXECUTION |
| 7–8 · exit ① | 0d12 · 2e0c | 6/6* | scored clean at the time — the owner then found wildcard artifacts in 2e0c(and in 9–10): raw-tag document bubbles, one series showing the sealed answer inside a run-sheet. The referee had never read the document channel. Exit REOPENED |
| 9–10 · exit ② | d889 · 48fa | 6/6* | same — both carried wildcard artifacts; d889's showed 谜底:章鱼 six bubbles deep. The three-defect unpack: the artifact drop law, the widened referee(artifact cleanliness + the secret nowhere public pre-reveal), and then— |
| 11–12 | cf28 · 7019 | 0/6* · leak | *referee dialect false-FAIL(both boards were perfect — the bare-pipe table)— and the widened referee's FIRST LOOK caught a real slip: 7019's host spoke the sealed word(滑梯)inside a ruling → THE SEAL MASK built |
| 13–14 · exit ① | ba10 · 113d | 6/6 · 6/6 | clean pair under the FULL widened referee: rows both dialects · zero tagged artifacts · the word nowhere public · boxes sealed on wrong guesses |
| 15–16 · exit ② | c98b · fe80 | 6/6 · 6/6 | second consecutive clean pair, judges 无 on both. EXIT RE-MET, 2026-08-01 |
| 17–18 | eadc · 72d8 | 6/6 · 6/6 | the renderable-table verification(the owner's screenshot had shown boards rendering as literal text): bare-pipe lines 0 in both rooms, every other check green — the normalizer proven live |
| 19–26 · the endgame probe | a58d · c0a6 · 3d02 · b942 · ae27 · 5abf · cf28* · 7019* | both doors failed first | the ship-readiness question: the RIGHT-guess and EXHAUSTION doors, never sim-exercised, both failed on first contact(the veiled victory line · the unclosed zero)→ the unveiled doors + THE ZERO CUE + THE STILLNESS CUE + the separator law, each proven by its re-run(*two mid-probe rooms also carried the separator miss) |
| 27–31 · THE CLOSING SWEEP | 6138 · 47e9 · cb6a · 51d4 · 925d | all clean | all four doors on the final build — N=4 · N=1 · right guess · exhaustion(run twice, the thrice-broken door)— every check green. In 51d4 the judge's one lead was the machinery visibly working: the host caught its own missed row and backfilled unprompted. 20Q CLOSED ON EVIDENCE, 2026-08-01 |
Cycle 1 closed 二十问 on the classic path — the persona hosting by hand. The game then became a cartridge: the server deals, counts and opens, and the host is asked only for moments. This cycle is the first hard look at 20Q on the device, opened by an owner report with a very short description and a very long shadow: 「the persona seals one word and reveals a DIFFERENT word at the end, spoken from its running memory」.
| what went wrong(symptom) | root cause | the fix |
|---|---|---|
| The host's whole game answered a word the house never drew. Twenty perfectly consistent rulings, then a reveal that matched the rulings and not the card. | The category was invented before the word existed. The seal step rode stage=after-speech, so the opening moment asked the host to name the word's broad kind「read off your own card once it lands」— off a card that had not landed. It invented one, and every ruling after it was anchored to the word it had imagined. | The house draws FIRST. Setup is now seal → board → the rules speech. The host reads a real card before it says one word about it. Live proof: the same run that used to say「让我想一个东西——写下来,封好」now says「让系统自己抽一个秘密词,连我都不知道是什么」. |
| A table that walked away ended with the box still shut. Whatever the host said the answer was, stood. | The fold never opened the box. _game_abort published the pile and the cups — the audit law, whose own docstring says it has no exceptions — and left the envelope sealed. The exam's seal_traced then read「nothing was opened this run」and passed. | Every exit opens the box. _game_sweep_seals is the cups' sweep, one instrument later: the clean end, the fold, and the cartridge's own reveal step — pinned at three call sites in the smoketest, because the failure mode is subtractive. The fold's own directive now carries the word as a FACT. |
| Nothing anywhere compared what the host said at the end against what the world held. | Three prose prohibitions would have lost, the way every prohibition in this codebase has lost: a directive can shape how something is said; it cannot stop something being said. | THE ENDING'S FIDELITY GUARD — the seal mask's twin and its opposite. The mask stops the word leaving the box early; this stops a different word standing at the end. A closing line that does not name what the box held never reaches the room: void, one retry of the same moment, and the open card is the record either way. |
| Sibling: the box was resolved as「the first seal in the room」. | Exactly the cups' 2a5d defect, one instrument later — a stale envelope at the front of the list gets the device stamp, the read and the opening. | The box is KEYED by iid at arm, like the cups. And the secret fact is never shipped empty: a fact-shaped hole is precisely what a mind fills from the round. |
| Sibling: the host reached for the real word inside a qualifier — twice in one live room(the seal mask veiled both, so the table read ▢▢). | The moment ruling FROM the card became real, the leak shape came back with it: explaining why an answer is 说不清 pulls the noun out of the model's mouth. | One clause, in the ruling's last position: in a qualifier it is 它. Measured before/after on the same live scenario: 2 veiled lines → 0. |
| the beat | who owns it | proof |
|---|---|---|
| Invoked → the house seals the word | the world(server entropy, before any speech) | bench: the house sealed BEFORE anyone spoke — there is a card to read |
| The host explains the rules and asks for the FIRST question, one bubble | the persona's voice, the cartridge's must-list | live: 「…这东西属于物品…准备好了吗?第一问,来吧!」 |
| The user asks → the host ANSWERS AND INVITES THE NEXT QUESTION IN ONE BUBBLE | one moment carries both — a second message to invite is in the never-list | live: 「不是。它不会呼吸也不会动…还剩十九次,继续。」 |
| The board updates — one row per question, the count the world's | the world(the row and the ticks are the ruling's own consequence) | bench: 20 rows · 已问 20 · 剩余 0 at the ceiling |
| A grand ending: guessed right · twenty spent · a fold | the world's END check, or the fold door | bench: all three, each opening the box |
| The reveal, from the seal | the card opens; the record is the world's | bench: what it published IS what the house sealed · live: card 薯条, line 薯条 |
The seam prepared above(Room._word_source, the only line in the runner that knows where secrets come from)now serves the persona's own well: the same shipped pool, ranked against the seat's card by a cached embedding(the word pool). Nothing above it moved — same CSPRNG, same apply time, same replace rule, same binding, same reveal. Live, on the same three personas the pool page ranks:
| the seat | twelve draws through the seam |
|---|---|
| MrBeast stunts · spectacle | 大锤 · 沙滩球 · 长袜 · 游乐园 · 沙堡 · 宝座 · 胶带座 · 毒液 · 大剪刀 · 红薯 · 水印 · 运动裤 |
| Dieter Rams industrial design | 凹痕 · 凳子 · 烘干机 · 沙发 · 吧凳 · 保温杯 · 床头柜 · 调料瓶 · 注射器 · 脚凳 · 黑莓 · 台灯 |
| Anthony Bourdain English room | booze · spareribs · parmesan · steak · chicken · pepperoni · kebab · meatloaf · carcass · jambalaya · burger · skillet |
pick() is deterministic: its top item is the same for every game in every room a persona ever sits in, and anyone can derive it from that persona's public card. Taking it would give away the exact property the draw exists to protect — the transcript never holds the secret, so it cannot leak it — by making the secret readable off the SEAT instead. So the seam takes a shortlist(the top 60 of ~2000, this seat's own world)and the CSPRNG still picks inside it, through the same wordpools.draw_from the generic bank uses. One draw, two sources: the entropy, the avoid filter and the without-replacement rule are the parts that carry the security property, and there is exactly one copy of them.WHOSE WELL — the design call, and it is the ANSWERER's(_word_seat → the host — threaded down from whoever armed the draw, with cast[0] only the fallback). Three readings were open and the host wins on three grounds, the first deciding it: ① what is being bought is the persona talking ABOUT the word, and in 二十问 exactly one seat does that for the whole game — a word from a guesser's world is a word the only speaker has nothing to say about; ② merging the cast walks back toward the centre — the build spends a whole stage subtracting the generic component because centre-words rank for everybody and are about nobody(家园 ×75 of 105 personas), and averaging N vectors moves the query straight back there; ③ 「whoever is speaking」 does not exist when it matters — the seal is drawn once, at setup, before anyone has spoken, and must not move afterwards.
Fall back, never fail. No embedding key, no card, no pool, an unknown pool name — every one lands on the house's generic pool, pinned four ways in the smoketest. ⚠ And the fallback is keyed on the vector, not on an empty shortlist: pick degrades to the pool's own FILE ORDER when it cannot embed, which is non-empty and would sail past an is-it-empty test while being the same arbitrary sixty words for every room in the product. A degraded ranking is not a ranking.
Latency is paid off the critical path: the one embedding(~1s, ~$0.00001, cached on disk forever)is warmed in a daemon thread at ROOM OPEN — before the resumed-room return, because a kit mounts on a resumed room far more often than a fresh one, and the mount is the beat the second would have shown in. A cold mount still works; it pays the second inline.
Where the tests live. Fast loop first: python exam/device_dryrun.py — the bench gained a seal-finish door it never had(so every 20Q scenario had been running against a table where the reveal published nothing — the same blindness as the auditor's)plus two scenarios, q20fold and q20drift. The exam's seal_traced now fails a box that was armed and never opened, which is the shape it used to score green. And the live harness learned the MOUNT LAW: it had never tapped the offer card, so since 2026-08-04 every 二十问 run had been failing at the first assertion and blaming the game.
exam/spy_audit.py)now judges whole ledgers, and the architecture answer is THE GAME DEVICE: process becomes a server-run flow, the persona keeps the voice · siblings: world-events · play-kits · the defect ledger · the exam