The tool setup sheet, for muscle memory: someone who has set up a poll once should manage a sealed deal without reading anything. All four sheets below are live and generated from ONE template — if they ever diverge, the config diverged, not the layout.
Switch the top row on any sheet and watch the sections below it react. Scroll sideways to compare. 掷骰 · 投票 · 密存 · 发牌.
A choice that removes the meaning of a later choice must remove the choice itself. Greying it out would still ask the question; hiding it says there was never a question.
| Where | What goes | Why |
|---|---|---|
| 明掷 / 明转 dice · wheel | 揭晓触发 collapses to a fixed 「截止即揭晓」 | An open roll is public the instant it lands. There is no held content, so there is nothing a reveal trigger could govern. |
| 明发牌 deal | 揭晓触发 gone entirely | A face-up deal posts every hand at the shuffle. Nothing is ever hidden, so no phase exists to open. |
| 发牌 — always | 截止触发 gone entirely | Ruling ⑥: a deal has no collecting phase. Every hand is committed the moment the deck is shuffled — the card is born closed. There is no door to shut, so the whole section is meaningless and is not drawn. This is the owner's case, and it is the sharpest one. |
| 投票 — always | 揭晓触发 collapses to a fixed 「截止即揭晓」 | A ballot's standings open to you the moment you vote and never before — the pay-to-see gate is built into the tool(ruling ⑦). A deferred reveal is a different instrument: use 密存. |
| 密存 | nothing | The deposit is the one tool where every phase is genuinely yours to set. It is the reference sheet — the others are it, minus what they cannot mean. |
.pk-hint under the box, Start greyed with the reason in the commit row; a name already on the table says so instead). Compared per canon kind, so a 转盘 never blocks a 骰子 — and a Coin counts as a 转盘, which is why changing the dice preset re-asks. ⚠ The sheet asks; the SERVER decides(one predicate, both doors, name needed / name taken back to the sheet)— a card opened by somebody else while this sheet was up must land on the same refusal. 封存笔记 is the one carve-out: it has no 标题 field and only its writer opens it.poker52 · poker54 · tarot)plus a typed list; 每人几张 is the field whose absence once dealt one card apiece when three were asked for. dealer 看牌 — whether the dealer is shown the map — sits here rather than in 高级, because in a werewolf game it is the most consequential choice on the sheet.<input> brings the OS's own border, radius, font and focus ring, and beside these surfaces it reads as a foreign object. The mockup uses contenteditable for the short in-line values(the deck name, the option rows, the stepper numbers, the deck code); a restyled <input> or <textarea> is equally acceptable provided it sets appearance:none, font:inherit, its own focus treatment and a ::placeholder colour — which is exactly the route 白板内容 and 记事内容 take, because a standalone multi-line field is the case contenteditable is worst at. The contract is the look, not the element. Full rule + the traps of each route: lib/PRESENTATION.md § Text fields.#sheetScrim)whose body is generated from SHEETS[key] in lib/room-ui.html; the phase hues read --plum from theme.css, not from a page. Every control arms a real instrument through the existing doors — user_roll_open · user_vote · user_seal_open · user_deal — and three dials the human path did not previously reach were added to those doors rather than beside them: 截止触发条件(close_trigger, all four rungs)· 副数(a named deck's ×N shoe)· 各自点开 on a sealed roll, which is genuinely new machinery(_roll_row_reveal + a roll_reveal record — dice had no per-row reveal until now, so「我先开」opens YOUR face while every other stays down). Persona parity is linted: smoketest's form↔grammar section now covers the ballot's and the collect's attributes too, and every dial on all five sheets round-trips form → tag → parser or the build fails.close_hands ∈ none · creator · any, orthogonal to close_trigger and to the clock; the card never draws a「Close now」the server would refuse, and the smoketest carries the regression test that a hand permission does not move the all-in close.contenteditable under a B / I / S / • / 1. / ▦ toolbar. That is superseded: the field is a plain <textarea> holding markdown source, no toolbar and no WYSIWYG. Three reasons, in the order they matter. ① The expected author of a board is often a persona, and a persona writes markdown natively into <board>…</board> — a room that wants a whiteboard kept will seat a secretary to keep it. A toolbar would be a second way to express what that channel already expresses, and two ways to say one thing is how they drift. ② Liberal in what it accepts, one renderer: type **bold** and you get bold; type plain lines and they render exactly as typed, so nobody has to know markdown to use the board. ③ A formatting bar over a five-line panel is more chrome than content. What DID land as drawn: 谁能改(仅创建者 default · 所有人)and 传笔(关 default, and only drawn under 仅创建者 — with 所有人 there is no marker to lend, so per ruling ⑥'s treatment the row is not drawn rather than greyed), plus 撤下 in the foot. A non-creator opening this sheet sees THE WHOLE BODY GREYED with a banner that says why(「Ben has the pen — you cannot write on this board.」), no 撤下 at all, and a dead 更新 — v643, the owner's read: a dialog whose commit is dead but whose fields look normal makes a person type a paragraph before finding out. ⚠ 传笔 GREYS RATHER THAN HIDING under 所有人(v643, superseding this page's own ruling-⑥ reading)— and that fixed a real bug: [hidden]'s display:none is a UA rule and .pk-seg{display:flex} outranks it, so the buttons had been staying while their LABEL vanished, taking its gap with it and leaving an impossible 所有人+开 pair on screen. Setting hidden on a node your own CSS gives a display to does nothing. And 白板内容 is EIGHT line-boxes(v643), derived from one --lh as the pad's is.The pad(toolbox §13, shipped v636)gets a sheet too, and it is the shortest in the set. It is worth recording here precisely because what it lacks is the specification: five of the skeleton's six regions do not apply, and the reason is the same each time — the pad has no audience, so it has nothing to configure about an audience.
| the skeleton's region | on the pad | why |
|---|---|---|
| the mode row(明 · 暗 · 盲) | gone | there is no second way to be private. A visibility ladder needs somebody to be above or below you on it. |
| 参与者 — who takes part | gone | one owner, always, and it is whoever opened the sheet. A picker here could only ever pick you. |
| 设计 — the payload editor | this IS the sheet | ONE field: the text.(It was two until v641; the title went the way of everything else here — a label exists so somebody looking for the thing can find it, and nobody else will ever look for this.) The dictate mic is not a second field, it is a second way to fill the one. If a build ever adds a real second, something has been misunderstood about the tool. |
| 收集 / 截止 | gone | nothing is collected, so there is no input door to shut. Ruling ⑥'s treatment applies: a phase a tool cannot have is not drawn, never greyed. |
| 揭晓 | gone | nothing opens. A reveal is a promise to an audience and there is none. |
| 高级(blocking · place · unique) | gone | the presence properties describe how a card behaves on the room's screen. The pad is on no screen but yours. |
.curate-wrap)— so the mic sits on its own row at the bottom right rather than over the text: this is the second place in the app you speak a paragraph into, and it should not need a second visual idea. It is the same micTap, the same body.stt-on gate, and the same button rule as the situation box's. The count(n/2000, amber from 1 600)exists because a write over the cap is refused rather than trimmed — a cap you only discover by being rejected is a cap that eats a page of writing, so it has to be visible on the way there. And「撕掉」asks for confirmation where the board's「撤下」does not: a board can be pinned again from memory, a torn-up pad cannot.<input type="number"> became the rung ladder + ± stepper above — the same control the 定时 triggers use, extracted so there is one implementation(durLabel/durNudge/durPaint/durWire)rather than two that agree by luck. Rungs are 30s · 1 · 5 · 10 · 30 · 1时 · 3时; ± moves one unit of what is shown(10 min → 11 min · 1小时 → 2小时). ⚠ The top rung forced a SERVER change: CLOCK_MAX_SEC was 2 hours, so 「3时」 would have quietly set a two-hour clock — the cap moved to meet the control, because a rung that clamps to a different number is a rung that lies. Its take-off moved to the foot(it opened the body)and its verb is 停掉. The pad lost its 标题 and its field is confirmed plain text, no toolbar — formatting is something you do for readers. Neither sheet has 高级, and neither ever did. Pads that had already stored a title are not orphaned: _pads_drop_human_titles() folds it into the first line at load.mirrorCommit("pkCommit","pkSend")). ⚠ One trap paid for in the build: the English 「Write it」 was already the Seen writer's key and translates as「开写」. Two dialogs sharing one English string is how a verb ends up wrong in one of them; the pad carries its own「Write it down」. The i18n audit does not catch a duplicate key — it json-parses the dict, so the later entry silently wins.SHEETS[key], because a template whose whole job is the three lifecycle sections has nothing to generate for a tool with none; it is the board's dialog with everything audience-shaped removed.