v0.7.9.7 — a device that said it was available all day after it was gone

The last item off 0.7.9.6's sweep, parked there as the one genuine maybe.
It had a second half worth more than the first.

#101 — Telegraph (+4), Telephone (+8) and Radio (+12) are "once a day,
when dispatching facing trains, add +N to the other train's number".
`enhancementText(key)` takes only the KEY, so the tooltip could not vary
with anything: a spent Radio read "Once a day, add +12..." for the rest
of the Day, advertising a bonus that was not there. That is `trainRules`
before #100, in another corner of the same view.

THE HALF THAT ACTUALLY SURPRISES. `spendDispatchBonus` reads
`areaOf(s, s.clock.superintendent)` — the SUPERINTENDENT's own devices,
not the train owner's — and the Fedora moves every STAGES_PER_SHIFT (3)
Stages, four times a Day. So a player's Radio does nothing at all for
three-quarters of the Day, and is spent automatically, without its owner
being asked, during the quarter it is theirs. Neither half was anywhere
on the board.

The card now reads as one of three states — available and dispatching,
unspent but idle while somebody else holds the Fedora, or spent until the
next Day — and names the shift length, because "not now" without "for how
long" is half an answer. A spent device is struck through on the board.
Shown on EVERY district, not only the viewer's (Jesse's call): it is
public, and a rival's spent Radio is what you want to know before forcing
a meet.

What counts as a device is `enhancementRule(key)?.dispatchBonus` rather
than three keys written out in the view — the ladder lives in
ENHANCEMENT_RULES and a fourth rung would otherwise be silently exempt.

A STALE COMMENT CORRECTED, AND PINNED. `advance.ts` warned that indexing
a SEAT-keyed area with the PLAYER holding the Fedora "is right only while
seating is the identity map". It read as a live Employee Rotation bug and
was not one: `areaOf(s, p)` IS `areaAtSeat(s, seatOf(s, p))`. A comment
that sends the next reader chasing a bug that does not exist costs about
what the bug would. Rewritten, and the claim is now a test — seating set
to a real permutation, and the Superintendent's own district rather than
the seat with the same index is the one that reads as dispatching.

TWO THINGS MUTATION CAUGHT THAT PASSING DID NOT. A test asserted the
ABSENCE of /spent|Fedora/ with the Fedora held, and a mutant with the
`dispatchBonus` guard deleted PASSED it — the leaked text in that case
says "Available today, and this district is dispatching", which contains
neither word. A test that something was left alone has to compare it
against what it should be, so it asserts equality with `enhancementText`
now, in both Fedora states. And the replay wire format needed the field:
cells pack positionally, so the flag is index 9 and reads `?? []`, the
same tolerance `standingWest` uses — older recordings report no device
spent, which is what they drew at the time, so every published replay is
unchanged.

943 tests pass, up from 934.

NOT VERIFIED AT A TABLE, like 0.7.9.6. #39 and #35 still stand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y5boPxP6JHRYMm8adXaF5R
This commit is contained in:
Jesse.Markowitz
2026-09-07 21:54:18 -04:00
co-authored by Claude Opus 5
parent 7f4e027258
commit 88a42ae9e2
8 changed files with 332 additions and 11 deletions
+50 -2
View File
@@ -1880,8 +1880,8 @@ the numbers stay so cross-references above and below still resolve.
**A field is not a display gap merely because nothing renders it**, and saying so is what keeps
the sweep honest. `freightWorked`, `drawnThisTurn`, `freightAgentUsed`, `switchedSince` and
`movesUsed` were all ruled out: their EFFECT is already visible as legality, or as a complement
already on the Frame (`movesRemaining`). `dispatchUsedToday` — a once-a-Day bonus already spent,
discoverable only by the action being refused — is the one genuine maybe left, and is not done.
already on the Frame (`movesRemaining`). `dispatchUsedToday` was left as the one genuine maybe,
and was then **done as #101** — it turned out to have a second half worth more than the first.
The verification mattered twice. The blocked panel returning `[]` for the two queues is only
evidence alongside the positive control — the same state with a timetabled train due, which
@@ -1922,6 +1922,54 @@ the numbers stay so cross-references above and below still resolve.
borrows `isExpedited` from `advance.ts` rather than restating the test: a card describing a rule
the engine does not apply is the failure this sits inside.
101. ~~**A dispatch device never said it had been spent — or that it was somebody else's to
spend.**~~ — done 2026-09-07 in v0.7.9.7, the last item off #98's sweep and the only one that
had been parked rather than fixed.
Telegraph (+4), Telephone (+8) and Radio (+12) are "once a day, when dispatching facing trains,
add +N to the other train's number". `enhancementText(key)` takes only the KEY, so the tooltip
could not vary with anything: a spent Radio read "Once a day, add +12…" for the rest of the Day,
advertising a bonus that was not there. That is `trainRules` before #100, in another corner of
the same view.
**THE SECOND HALF IS WORTH MORE THAN THE FIRST, and is why this stopped being a small item.**
`spendDispatchBonus` reads `areaOf(s, s.clock.superintendent)` — the SUPERINTENDENT's own
devices, not the train owner's — and the Fedora moves every `STAGES_PER_SHIFT` (3) Stages, four
times a Day. So a player's Radio does nothing at all for three-quarters of the Day, and is spent
automatically, without its owner being asked, during the quarter it is theirs. Neither half was
anywhere on the board. The card now says which of the three states it is in, and names the shift
length, because "not now" without "for how long" is half an answer.
**Shown on EVERY district** (Jesse, 2026-09-07), not only the viewer's: it is public, and a
rival's spent Radio is what you want to know before forcing a meet. One change covers both, as
`projectDistrict` serves the player's own cells and the common board's `districts` alike — note
that a player's Frame carries only their own district, so in practice "every district" is the
common board, which is pre-existing and not touched here.
What counts as a device is `enhancementRule(key)?.dispatchBonus`, not a list of three keys
written out in the view: the ladder lives in `ENHANCEMENT_RULES`, and a fourth rung added there
would otherwise be silently exempt from the whole of this.
**A stale comment corrected, and pinned.** `advance.ts` warned that indexing a SEAT-keyed area
with the PLAYER holding the Fedora "is right only while seating is the identity map". It read as
a live Employee Rotation bug and was not one — `areaOf(s, p)` IS `areaAtSeat(s, seatOf(s, p))`.
A comment that sends the next reader chasing a bug that does not exist costs about as much as
the bug would, so it is rewritten, and the claim is now a test: seating set to a real
permutation, and the Superintendent's own district — not the seat with the same index — is the
one that reads as dispatching.
**And a test that passed for the wrong reason, caught by mutation.** "Leaves a non-dispatch
enhancement alone" originally asserted the ABSENCE of /spent|Fedora/ with the Fedora held —
and a mutant with the `dispatchBonus` guard deleted passed it, because the leaked text in that
case says "Available today, and this district is dispatching", which contains neither word. A
test that something was left alone has to compare it against what it should be; it asserts
equality with `enhancementText` now, in both Fedora states.
**The replay wire format needed the field too.** Cells are packed positionally, so the new flag
is index 9 and reads `?? []` — the same tolerance `standingWest` uses. Recordings made before
it existed report no device spent, which is exactly what they drew at the time, so every
published replay is unchanged.
32. ~~**Tell the 0.4.9 playtesters their saves are dead, before they find out.**~~ — done
2026-09-07. `PLAYTEST-0.7.4.md` was written for exactly this and did its job; Jesse, 2026-09-07:
"a temporary document to help some of the playtesters out on making the big jump, but that is no