0.7.4:0 — bundle Station Master v0.7.4

Submodule pinned to v0.7.4 (19a6a47), `current.ts` at `0.7.4:0`, release notes
rewritten in all five locales, README.md and instructions.md updated. No new version
file and no migration: the outgoing 0.7.3:0's `up` is empty, `versions.md`'s common
case, so `current.ts` bumps in place.

Three rules corrections, all places where the code and the cards disagreed. The Yard
Office is offered rather than imposed, must be reachable in one move, and cars on the
lead collide — none of which it checked. Circus, Campaign and Military trains run
loaded where the yard can supply it, and the per-stop point is earned once per Office
Area by a fully loaded train. Red Flags becomes a directional flag on your own Limits,
spent on the train it stops, playable at the moment the engine sees a certain
collision.

GAMES IN PROGRESS MAY NOT SURVIVE THIS ONE, and the notes lead with it in every locale
— the opposite of 0.7.3 and for a different reason from 0.7.2. Nothing about the save
format changed; what changed is what the rules accept. The Red Flags intent changed
shape, a make-up that was legal may now be refused, and a Yard Office arrival asks a
question no older history has an answer for. It fails safe: the server declines a save
the rules reject, names the move, and leaves the file untouched. A game that never
meets one of the three carries on, which is why this is "may not" rather than 0.7.2's
"will not".

README.md's diagnosing note is extended: the Mainline Phase now stops to ask three
different questions of three different players, and a game sitting on one is waiting
on a person rather than stuck — it shows as active with nobody to wait for, because an
interruption is not a turn.

Verified: `npm run check` clean, prettier clean, `make x86` packs as v0.7.4:0.
NOT verified: not yet installed on a box, and none of the three rules has been played
by a human — upstream TODO.md #35 still stands for extended play too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAgJSmeV8zrMh55Mj85ESb
This commit is contained in:
Jesse
2026-08-29 08:20:30 -04:00
co-authored by Claude Opus 5
parent 74aea24d74
commit 085b88bb38
4 changed files with 164 additions and 92 deletions
+32 -20
View File
@@ -13,28 +13,40 @@ 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.7.3.** Two features, both about the end of a game (Gitea#11 and #16). A game no
longer stops dead when the timetable runs out — it enters a fourth state, `awaitingExtension`, and
asks the table whether to play one more Day; agreement is unanimous in multiplayer and one refusal
ends it. The official result is frozen at the ORIGINAL `config.days` and never rewritten, so playing
on is explicitly an exhibition; a §3.4 collision breach is not extendable and does not overwrite a
recorded result. And the end of a game now renders a full results screen in place of the raw
`outcome.reason` enum the page used to print, backed by a new event tally on the game state.
**Bundled version: 0.7.4.** Three rules corrections off the tracker (Gitea#13, #5, #19), all of them
places where the code and the cards disagreed.
**GAMES IN PROGRESS SURVIVE THIS UPDATE.** No card data changed and the engine changes are additive:
every intent in a 0.7.2 save is still legal, so the save replays intact and the game simply pauses on
the new question when its timetable runs out. This is worth stating plainly because the previous
release was the opposite — 0.7.2 took the deck from 206 cards to 121 and declined every game in
progress. That still applies to anyone updating from **0.7.1 or earlier**: `src/server/index.ts`
refuses to resume a save the rules reject, logs which move it stopped at, and **leaves the file
untouched**, so an operator who wants a particular game back can put the older version on and finish
it.
**The Yard Office is offered rather than imposed (Gitea#5).** It was implemented in a form missing
all three of its conditions: a qualifying train was teleported onto the card, so nobody was asked, no
route was walked — the card's printed "that can reach the yard office in one move" was unenforced —
and nothing was ever met on the way in. The arrival now interrupts the Mainline Phase to ask the
district's owner, reachability is the engine's own move walk, and cars on the lead collide. Where no
route exists the offer is withheld and the history says why.
**Diagnosing the new state.** A game sitting in `awaitingExtension` is waiting on its players, not
broken: it is persisted and listed as `active`, it is resumed on restart like any other live game,
and the only move the rules will accept from it is `game.extend`. If a table appears stuck at the end
of its last Day, check whether every seat has voted — `Games in Progress` will show it as active with
nobody to wait for, because a vote is not a turn.
**Some Extras must run loaded (Gitea#13).** Circus, Campaign and Military trains take a loaded car
while the Division Yard can supply one, an empty once it cannot, and may depart short. The per-stop
point is earned once per Office Area rather than once per game, and only by a fully loaded train.
Two long-standing bugs went with it: `emptiesOnly` was rendered to the player and enforced nowhere,
and a set-up out on the Mainline paid its point to player 0 whoever was playing.
**Red Flags is a different card (Gitea#19).** The old rule protected a stopped train on the Mainline
and was played 4 times in 4,212 offers across 600 games. It is now a directional flag on your own
Limits, spent on the train it stops, playable either in phase or at the moment the engine sees a
certain collision.
**GAMES IN PROGRESS MAY NOT SURVIVE THIS UPDATE.** Unlike 0.7.3, which changed no rules, each of the
three above can stop an older history replaying: the Red Flags intent changed shape, a make-up that
was legal may now be refused, and a Yard Office arrival asks a question no older history has an
answer for. It fails safe — `src/server/index.ts` refuses to resume a save the rules reject, logs
which move it stopped at, and **leaves the file untouched**, so an operator can put 0.7.3 back on to
finish a game that matters. A game that never meets one of the three carries on normally, which is
why this is "may not" rather than 0.7.2's "will not".
**Diagnosing the interruptions.** The Mainline Phase can now stop and ask three different questions,
of three different players: §8.1's clearance goes to the Superintendent, the Yard Office offer and
the Red Flag prompt to the owner of the district a train is arriving at. A game sitting on one is
waiting on a person, not stuck. `Games in Progress` shows it as active with nobody to wait for,
because an interruption is not a turn — the same reading as an extension vote.
0.7.0 remains the shape of the service: the lobby sets a game up from one of four game types
(Solitaire, Co-op, Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before