v0.8.0.5 — the Home Office deck, and lighting the pile a move touched

"Many operations still occurred too fast for me to see", at 10x — where an action
already holds the screen for seven seconds. So it was never duration: a bot drawing
a card changes one number in a panel nobody is watching, and the board sits
unchanged. Raising the dwell was the wrong lever and it had been pulled three
times.

f.deck has carried the face-down count since the Frame existed and nothing drew it
— the display gap test/display-gaps.test.ts sweeps for, surviving in the one panel
that draws every other pile. It is a tile now, first in the row, face down, because
that is the order a card travels and not knowing what is on top is the point.

And the piles a move touched are lit for as long as that move is on screen. Derived
from the frames either side of a step rather than sent, so nothing joins the
protocol and the 0.8.1 board gets it free. What lights follows what is public, and
was measured across four seeds rather than reasoned about: a Home Office draw
lights the deck and never names the card; a Department draw lights that pile, and
the deck too when it refills; a discard lights the Department it lands on; a played
card lights the Salvage Yard. Switching and new trains light nothing here — they
move the board, which the district panel already follows.

A state rather than a flash: the timetable's fixed 1.5s animation would be over
long before a seven-second pause. Not for your own moves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X6cF1iYvJ1kNmzYBzu4QX6
This commit is contained in:
Jesse.Markowitz
2026-09-10 04:35:59 -04:00
co-authored by Claude Opus 5
parent fc40fc39ed
commit 3fca325699
8 changed files with 301 additions and 8 deletions
+47
View File
@@ -19,6 +19,53 @@ page as `v0.1.0 · <sha> · <date>`, so what is deployed can always be identifie
---
## 0.8.0.5 — 2026-09-10
**Somewhere to look.** Jesse, playing v0.8.0.4 at 10×: *"many operations still occurred too fast for
me to see."* At 10× an action holds the screen for seven seconds, so this was never about duration —
it was that a bot drawing a card changes one number in a panel nobody is watching, and the board sits
unchanged for those seven seconds. **Raising the dwell was the wrong lever, and it had been pulled
three times.** His diagnosis was the right one: mark WHERE, not longer.
### The Home Office deck was never drawn
`f.deck` has carried the face-down count since the Frame existed and **nothing in `src/web/` read
it** — the exact display gap `test/display-gaps.test.ts` was written to sweep for, surviving in the
one panel that draws every other pile. It is a tile now, first in the row, because that is the order
a card travels: out of the deck, into a hand, then onto a Department or the Salvage Yard. Face down,
so its card slot says so rather than naming one — not knowing what is on top is the point of the
pile.
### What lights, and why that is exactly what is public
The piles a move touched are now lit for as long as that move is on screen. **Derived, never sent**:
the client already holds the frame before a step and the frame after it, so `changedPiles()` is a
diff. Nothing is added to the protocol, nothing can drift out of step with the projection, and the
0.8.1 seatless board gets it for free.
Measured across four seeds rather than reasoned about, and pinned by a test that requires each case
to have actually occurred rather than passing on whichever the bot happened to play:
| action | lights | why that is public |
| --- | --- | --- |
| `draw.fromHomeOffice` | the deck | the count, never the card — a blind draw stays the drawer's |
| `draw.fromDepartment` | that Department, and the deck when it refills | the pile is face up, so the card taken is public |
| `card.discard` | that Department | face up, and which pile it went on is the point |
| `card.play` | the Salvage Yard | where a played card that did not stay on the board lands |
| switching, new trains | nothing here | they move the board, which the district panel already follows |
| `*.end`, `localOps.choose` | nothing | no card moved |
**It is a state, not a flash**, and that distinction is the whole reason it works. The timetable's
existing `.tt-slot.fresh` animates for a fixed 1.5s — right for a die roll nobody is waiting on, and
wrong here, because a step can hold for seven seconds and the animation would be long over before
the pause it belongs to. A brief flash-in marks the moment; the lit border and background stay for
exactly as long as the step is up.
**Not for your own moves.** You drew that card — the same rule that already gives your own steps no
dwell.
---
## 0.8.0.4 — 2026-09-09
**Housekeeping: the test server's name is out of the ten places this session put it.**