0.8.0.16:0 — bundle Station Master v0.8.0.16

Three game releases at once, because the last package was 0.8.0.13:0: the
Modifier limits ruling and the coach ratchet made legible (v0.8.0.14), the
reference documents rewritten against the game as built (v0.8.0.15), and the
Quickstart published where somebody handed this box can actually reach it
(v0.8.0.16).

GAMES ALREADY RUNNING ON THIS SERVER MAY NOT RESUME. One rule changed in
v0.8.0.14 — a Modifier card may no longer be placed outside your Limits — and a
game whose saved history contains such a move stops replaying at that move. The
server names the move and leaves the save file alone, so a game worth finishing
can be finished by putting 0.8.0.13:0 back. On the game this was tested against
it stopped eleven moves from where the table had got to. README, instructions.md
and the release notes in all five locales say so rather than burying it.

The coach ratchet is NOT a rule change and is not presented as one. Coaches only
travel one way — boarding discards the emptied coach into the Classification
Yard, detraining draws a fresh empty out of the Division Yard, and Classification
returns only when the Division Yard runs bare — so over one three-Day game every
coach ended in Classification by Day 2 and nobody could board or get off
anywhere thereafter. Running out of cars is part of the game; nothing on screen
said any of it. A train made up short now reports what it wanted and why none is
coming, and the yard panel warns while the shortage lasts.

The Interchange stops advertising an action the game does not have. The card
said cars could be sorted into any new order there, which has never been
implemented, so the only thing it achieved was sending a player hunting for a
button that was not there. What it really offers is the one place on the
Mainline where an Extra may be made up and started; a consist is re-ordered at a
Small Yard, which now shows the train each option would build, laid out west to
east as the board draws it.

A QUICKSTART SHIPS WITH THE PACKAGE and is linked from the splash page, so a
tester who has never played has something to read that is not the repository.
The rules and card references beside it were rewritten against the game as built
— several had been describing a version a month old.

Packaging is the submodule pin, the version and the words: no action, route,
file model or interface changed, and the whole release is inside the bundled
game.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
This commit is contained in:
Jesse
2026-09-21 01:30:05 -04:00
co-authored by Claude Opus 5
parent 81f9d06705
commit b11f0c1fe3
4 changed files with 295 additions and 146 deletions
+37 -17
View File
@@ -13,24 +13,44 @@ Station Master is a railroad operations board game with an authoritative multipl
solitaire needs no server and is not what this package is for. This package runs that server —
the browser client, the lobby, and the intent/SSE API — as a single StartOS service.
**Bundled version: 0.8.0.13.** Nine fixes from a live playtest of 0.8.0.12, almost all of them about
what a player can see. The one that mattered moved a car: the Division Yard chips stayed clickable
while a player's board was catching up on other people's turns, so a click submitted a real intent
against a position several moves stale — they now obey the catch-up queue like every other control,
and the yard counts beside them are read from the board on screen rather than the live game. The
district picker gained a button for your own seat and is ordered west to east as the map draws it;
the Fedora passing is announced and logged; a collision names whose district it was and who loses the
5 Revenue; and a Depot that cannot take another passenger says which car it is short of instead of
the action vanishing from the menu. v0.8.0.12 before it added the **Restore a Seat** action — see
Actions below — for a player whose browser has lost the token that is their only identity.
**Bundled version: 0.8.0.16.** Six fixes from a live playtest of 0.8.0.13, plus two follow-ups. One is a rules change and
the rest are the game saying what it was already doing. The Sparrow running empty and a Depot that
could not unload its passengers turned out to be the same thing: §9.2 sends an emptied coach to the
Classification Yard and takes a fresh empty out of the Division Yard, and §2.2 returns Classification
only when the Division Yard runs bare — so coaches travel one way. Measured over one three-Day game:
sixteen coaches in the Division Yard at setup, none from Day 2 Stage 8 onward, fifteen piled in
Classification while the Division Yard sat at 46-47 freight cars and stopped draining. The rule
stands (Jesse's ruling, the same one Gitea#2 got); what changed is that a train made up short now
reports what it wanted and why none is coming, and the yard panel warns while the shortage lasts.
**Games in progress resume normally on this one**, and it was checked the narrow way rather than
assumed: `git diff v0.8.0.12..v0.8.0.13 -- src/engine/` is **two added lines** — a
`superintendentChanged` variant on the `GameEvent` union, and the `events.push` that emits it. Both
are additive. `check()`, `legal.ts` and every predicate are untouched, so no once-legal move became
illegal, and events are derived by replaying a save rather than stored in one, so widening the union
cannot invalidate anything on disk. (0.8.0.10 was the exception: it corrected a ruling and
deliberately stranded games holding one. That warning does not apply here.)
Also: a Small Yard sort shows the train each option would build, laid out west to east as the board
draws it and saying whether the result may leave the Office, and may now leave cars ahead of the
engine; making up a train names the train in the history; a switching turn keeps its first move,
industry work, the sort and a closing summary instead of a line per move; and the Freight Agent,
Porter and Laborer groups say what each role is for.
Two smaller releases ride along. **v0.8.0.15** stopped the Interchange advertising a car-sorting
action it has never had — the text reached players on the board through `mainlineDescription`, which
`view.ts` renders as a Mainline card's description, so a player could only go hunting for a button
that was not there. What the card actually offers is the one place on the Mainline an Extra may be
made up and started. That release also carries a **Quickstart for new players** and brings the four
hand-written reference documents up to the game as it runs; they live in the game's `docs/` and are
not served by the site. **v0.8.0.16** is a doc comment on the flag behind that card, which is the
most likely source of the wrong sentence in the first place.
**GAMES IN PROGRESS MAY NOT RESUME ON THIS ONE**, and it was measured rather than assumed. A Modifier
card may no longer be placed outside a player's Limits, which reverses an earlier ruling and is the
one shape of change that strands a save: a predicate in `apply.ts` changed its answer, so a move that
was legal when played is refused on replay. The Day 3 playtest save stops at intent 528 of 539 —
`card.play c55 → (-2,4)` against a sign at column 3 — eleven moves short of where the table had got
to. The file is left untouched and the server names the move it stopped at, so re-installing
0.8.0.13 finishes a game worth finishing. (0.8.0.10 was the first release to do this, for the §8.1
clearance correction.)
The rest of the engine diff strands nothing: `makeUpShort` and `switchingEnded` are new events,
`trayMoved` and `consistSorted` gained fields, and `switch.sortConsist` gained an OPTIONAL `engineAt`
whose absence means what every sort did before — so an older save replays to the same train. Events
are derived by replaying a save rather than stored in one.
The paragraphs below were written for the 0.7.9.8 bump and still describe how a bump is checked.