Tier L, and it is not the animation that makes it so. Three things in the report are not presentation: a ritual is an interaction with no command behind it and must never reach the recording; hand order is not game state and must not move the state hash; and animating another player's move needs the page to see a SEQUENCE, not a state. The obstacle named up front: the page reloads after every accepted command, which destroys the DOM, and you cannot animate across it. Letting JS mutate the DOM instead is refused — that is ADR-0007 D5's line. Rust describes the movement and the reloaded page animates into place, which keeps the server authoritative and makes the animation a rendering of facts Rust wrote, exactly like the log. The journal is already the sequence needed. The invariant that protects the rest: for the same seed and the same decisions, the recording is byte-identical in both paces. Left ready, not active: tier L requires a separate-agent adversarial review before code, and it has not been done. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8.4 KiB
| id | kind | title | status |
|---|---|---|---|
| CB-WP-0036 | product | Interactive Mode: the rituals and the movement | ready |
Purpose
structural tier L (creates a new capability port -- a pace of play that
the driver, the server and the page all take part in,
plus a class of interaction that is NOT a game
command)
chaos d8 = 7 → no override
declared tier L
Declaration 7 of chaos window 3.
Tier L requires a separate-agent adversarial review before code (InnerLoop §Loop tiers, Step 2). It has not been done, and this workplan is
ready, notactive. Ask for it before T02 opens.
The report
"Interactive-mode should include explicit rituals and visualizations inspired by real life physical gameplay. In Speed-mode the UI jumps to the result immediately skipping animations and rituals that do not have any decisions in them."
Named in the report:
| opening ritual | who shuffles, who deals, who plays first — "part of the ritual of focusing on the game" |
| closing ritual | handing the cards on, or throwing them down after a loss — before deciding whether to play again |
| drawing | explicitly drawing from the stack, or being dealt by the dealer |
| dealing to hand | cards enter from the right |
| sorting | drag-and-drop between hand slots |
| playing a card | summoned larger, on a layer above the game, next to the player's seat — "this signals which player is playing the card" — then shrinking as it travels to its target |
| discarding | drifts to the pile without shrinking, or barely |
| other players | their actions visualized, not jumped past into a log line |
What makes this tier L, and it is not the animation
Three things in the report are not presentation at all.
-
A ritual is an interaction with no command behind it. "Who deals" changes nothing a rule can see. It must therefore be a driver-level decision point that never becomes a
GroundCommand, never enters the journal, and never reaches the recording — or two players who made the same moves at different paces would produce different scenarios, andrecord.rs's round trip is the test everything else rests on. -
Hand order is not game state. Sorting your hand must not move
state_hash. If it does, sorting breaks every note's binding (ADR-0019) and every replay. But it also cannot be client-only: the page reloads after each accepted move (below), so the order would be lost every turn. It has to be held by the server and excluded from the hash — a category this project does not yet have. -
Animating another player's move requires the page to see a sequence, not a state. The page currently renders the position now. Interactive mode needs what happened since you last looked, in order.
The third is the one that decides the architecture, and the good news
is that the data already exists: the journal is exactly that sequence
(Applied { actor, command, events }), and CB-WP-0032 already reads it
per game.
The obstacle to name before anyone starts
The page reloads after every accepted command (window.location. reload()), which destroys the DOM — and you cannot animate across it.
Two ways out, and only one is allowed:
| JS mutates the DOM instead of reloading | Refused. The script would have to compute what the game now looks like, which is ADR-0007 D5's line. It says the page reports raw pointer facts and constructs nothing |
| Rust describes the movement; the new page animates into place | Rust already knows both positions. It emits transitions — what moved, from where, to where — and the reloaded page plays them before settling into the state it was served |
The second keeps the server authoritative and makes the animation a rendering of facts Rust wrote, exactly like the log.
Tasks
id: CB-WP-0036-T01
status: todo
priority: high
Decide the pace, and what it may not touch. decisions/ADR-0020-*.md.
- Name it, and not
mode.--modeis alreadyScoringMode(shared/common/coalitions). A second "mode" on the same driver is a collision waiting to be mis-read; propose--pace interactive|speed. - Speed stays the default for
sim,trials, benchmarks and bots. Animation must cost those nothing — not "be fast", cost nothing. - State the invariant that protects everything else: for the same seed and the same decisions, the recording is byte-identical in both paces. Rituals are not commands.
- State where hand order lives and that it is outside the state hash.
prefers-reduced-motionbehaves as Speed, and say so in the ADR rather than leaving it to the CSS.
id: CB-WP-0036-T02
status: todo
priority: high
Transitions, computed in Rust. The journal delta since the page last rendered, expressed as movements: what moved, from where, to where, and whether it stays.
- The page is told, never asked to work it out (ADR-0007 D5).
- A transition names an element the page can already find, by the same
data-*keys the drag code uses — inventing a second addressing scheme is how the two drift apart. - Control: the delta is exact. A page that has seen commands 0..k animates k..n and nothing else. Replaying a transition twice, or skipping one, must fail a test.
id: CB-WP-0036-T03
status: todo
priority: high
The movement itself. A layer above the game layer; card summoned larger next to the acting seat, shrinking toward its target; discards drifting without shrinking.
- A player must be able to act DURING an animation. If animation gates input, interactive mode is worse than speed mode and the pass has failed.
- Skippable, always, and skipping lands exactly where the animation would have.
- Control: a full game is completable with animations on. The table has already been made unplayable once by growing (CB-WP-0028); an overlay layer is the same hazard wearing a different hat.
id: CB-WP-0036-T04
status: todo
priority: medium
The rituals. Opening — shuffle, deal, first player. Closing — hand the cards on, or throw them down.
- Never a
GroundCommand. A ritual is a driver-level decision point. - Control: the recording is byte-identical to the same game played in Speed. This is the falsifier for the whole task.
- The closing ritual comes before the play-again decision, which is where the report puts it.
id: CB-WP-0036-T05
status: todo
priority: medium
The hand: dealt from the right, sortable by drag.
- Control: sorting does not move
state_hash. Assert it directly. Sorting that changed the hash would silently break every trial note's binding and every replay. - Order survives a reload, because the page reloads on every move.
- Drawing becomes explicit — but only where the rules have a draw to make explicit. CB-WP-0028 established there is no standalone draw command: INVESTIGATE's own text is "…reveal it. Then draw one Solution." Do not build a draw the game does not have. What is explicit here is the animation of a draw that already happens.
id: CB-WP-0036-T06
status: todo
priority: medium
Evidence. evidence/CB-EV-*.md.
- Does it make the game more legible, or only longer? The report's own claim is that ritual helps focus. That is testable only by playing, and the answer may be no — say so if it is.
- What Speed mode cost, measured, since the whole point is that it costs nothing.
- Whether the maintainer still needs the log to follow other players (their 2026-08-07 note) — that is this pass's acceptance test and it has a person attached to it.
Open questions the review should settle
- Is a ritual with no decision still a ritual? The report says interactive mode skips "animations and rituals that do not have any decisions in them" — but shuffling and dealing have no decisions either, and the report wants them. The line is not where the report puts it, and someone has to redraw it.
- How many transitions can queue before it stops feeling like play? With bots, several commands can land between two human turns.
- Does the recording need the pace recorded in it? Recording it makes scenarios pace-specific; not recording it means a replay cannot reproduce what a player actually saw.