v0.8.1.0 — the car comes back empty, and the lobby lets you leave
A second-digit bump, deliberately. 0.8.1 had been reserved for the seatless display table; that work is getting more thought, and this table pass over v0.8.0.17 earned the number on its own. Six reports: one was a rules question, one a wording complaint with a real bug underneath, four straightforward. A CAR CLEARED FROM A RED INBOUND BOX CAME BACK STILL LOADED. Reported as wording — "technically accurate but doesn't make any sense" — and the wording was the visible half. `inboundCleared` pushed `pooled(e.stock)` under a comment reading "a car back in a yard is back in the common supply, carrying nothing", and `pooled` does not do that: it strips the load's origin stamp and keeps `loaded` ON PURPOSE, because a train can retire at a Division Point with freight aboard. So the comment described an intention the call never carried out, and every car the Freight Agent cleared reached the Classification Yard carrying a load already delivered and already paid for. It bites hardest on coaches: `passengersDetrained` takes `coach && !loaded` out of the Division Yard and §2.2 refills that yard from Classification, so a cleared coach came back as stock that could never unload another passenger. Measured over five three-Day solitaire games: 18 loaded coaches in Classification against 6 empty. The red box is where a journey ENDS; clearing it sends the passengers out of the station, or the delivered load into the industry, and returns the CAR, empty. The option says that now instead of describing the counter that moves. SCOPED TO THE RED BOX ON PURPOSE. `retireTrain` also returns loaded cars and is left alone: that is what `pooled`'s own documentation describes, and a loaded car in a yard is pre-loaded cargo rather than dead stock — it can be made up and delivered, and a loaded coach can still detrain. Only the red box's contents had already finished their journey. GAMES IN PROGRESS DO RESUME, MEASURED RATHER THAN ARGUED. Yard contents change, so the worry was real. All twelve saves on the test server were pulled and replayed through `tryResumeSession` — the server's own boot check — against this build. Six resume, six refuse, and the six refusals are the SAME six, at the same moves, with the same codes, that 0.8.0.17 already logged. Nothing new was stranded. That pre-install replay is a better check than reading the next boot log, because it answers before the install rather than after. THE HISTORY SAID "Mainline card 7" and left the reader to remember what card 7 was — with two Plains dealt, which is why the slot is kept beside the name rather than replaced by it. A second fault sat one word to its left and nobody reported it: the name was built as `e.key.replace(/([A-Z])/g, ' $1')`, so `absSignals` printed as "abs Signals" while the action list directly above said "ABS Signals". `narrate` takes `mainlineAt` and `enhancementName` beside the `facilityAt` it already had, and `simpleCardName` is exported so the log reads the same table the buttons do. `mainlineModified` had both faults and is fixed with it. LEAVING A RUNNING GAME WAS A DEAD END. `enterSeating` hides the choice section and only the lobby's own two leave paths put it back; leaving a running game is a third route, so the lobby came back holding nothing but "Games you are in" with both doors on the page at display:none and no control able to reveal them. Reset in `runLobby`, which is the one function every route onto that screen goes through — which is exactly why the two paths that did it themselves missed a third. THE LOBBY'S ACTION BUTTONS CARRY THE BOARD'S AMBER. A list of the actions rather than `#lobby button`: the settings form under Create is a field of inputs, and amber on all of it would say everything is a move and so say nothing. A disabled Start game drops back to chrome. THE DEPARTMENT REFILL IS A RULE AND IS NOW WRITTEN DOWN. §6.2 — "if any of the Department decks is empty, draw a Home Office card and place it in the empty spot" — firing only when the draw actually empties the pile. Kept as implemented (Jesse's ruling) and stated in rules.md and home-deck.md, neither of which had ever mentioned it. A rule implemented from the prototype and never written down is a rule that surprises the table. 1016 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
This commit is contained in:
co-authored by
Claude Opus 5
parent
b90c0413d2
commit
517238a727
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Station Master — Components and Markers
|
||||
|
||||
**Describes the game as built at v0.8.0.17** (2026-09-21). These references are kept current with
|
||||
**Describes the game as built at v0.8.1.0** (2026-09-22). These references are kept current with
|
||||
every release rather than versioned as editions, so there is no version in the filename: this file
|
||||
is always the latest, and the build it describes is stated here.
|
||||
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ must do.
|
||||
|
||||
## Current status
|
||||
|
||||
**v0.8.0.17.** Rules formalized, card faces specified, architecture documented, and the game
|
||||
**v0.8.1.0.** Rules formalized, card faces specified, architecture documented, and the game
|
||||
playable **solitaire and multiplayer** in a browser against an authoritative server. See
|
||||
[`../CHANGELOG.md`](../CHANGELOG.md) for what each version changed and [`../TODO.md`](../TODO.md) for
|
||||
what is open; this section is the shape of the project, not a running tally, because a
|
||||
|
||||
+4
-2
@@ -1,6 +1,6 @@
|
||||
# Station Master — Home Deck
|
||||
|
||||
**Describes the game as built at v0.8.0.17** (2026-09-21). These references are kept current with
|
||||
**Describes the game as built at v0.8.1.0** (2026-09-22). These references are kept current with
|
||||
every release rather than versioned as editions, so there is no version in the filename: this file
|
||||
is always the latest, and the build it describes is stated here.
|
||||
|
||||
@@ -22,7 +22,9 @@ rules are for playing each kind of card out of it.
|
||||
|
||||
- **Home Office deck** — face down. The pile a Draw comes from.
|
||||
- **Three Departments** — face-up discard piles. A discard goes onto one, which is precisely so a
|
||||
rival may take it; a Draw may take the top card of a Department instead of the deck.
|
||||
rival may take it; a Draw may take the top card of a Department instead of the deck. **Taking the
|
||||
last card off a Department refills it immediately** from the Home Office deck (§6.2), so there
|
||||
are always three piles to choose from; see the Rules.
|
||||
- **Salvage Yard** — where a played-out card ends up. An Extra's card goes here after its run.
|
||||
|
||||
When the Home Office deck runs out it is rebuilt from the Salvage Yard and **all three Departments
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Station Master — Mainline Deck
|
||||
|
||||
**Describes the game as built at v0.8.0.17** (2026-09-21). These references are kept current with
|
||||
**Describes the game as built at v0.8.1.0** (2026-09-22). These references are kept current with
|
||||
every release rather than versioned as editions, so there is no version in the filename: this file
|
||||
is always the latest, and the build it describes is stated here.
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Station Master — Quickstart
|
||||
|
||||
**For a tester who has never played. Describes the game as built at v0.8.0.17** (2026-09-21).
|
||||
**For a tester who has never played. Describes the game as built at v0.8.1.0** (2026-09-22).
|
||||
|
||||
Read this once before you sit down. It is about twenty minutes of reading and will save you an hour
|
||||
of confusion. The deeper references are listed at the end.
|
||||
|
||||
+18
-2
@@ -1,6 +1,6 @@
|
||||
# Station Master — Rules
|
||||
|
||||
**Describes the game as built at v0.8.0.17** (2026-09-21). These references are kept current with
|
||||
**Describes the game as built at v0.8.1.0** (2026-09-22). These references are kept current with
|
||||
every release rather than versioned as editions, so there is no version in the filename: this file
|
||||
is always the latest, and the build it describes is stated here.
|
||||
|
||||
@@ -204,9 +204,25 @@ roll a tail cut into a connected Freight Facility.
|
||||
|
||||
**Draw.** Take one card from the face-down Home Office or the exposed top of one Department pile. During this option, play eligible cards and/or discard cards to Department piles, then finish at the hand limit. Track, facilities, offices, modifiers, enhancements, and train cards have the placement or scheduling rules in the deck references. Mainline modifiers are played from this option as well.
|
||||
|
||||
> **A Department that is emptied is refilled at once.** §6.2: *"If any of the Department decks is
|
||||
> empty, draw a Home Office card and place it in the empty spot."* So taking the last card off a
|
||||
> pile does not leave a gap — a fresh card is turned face up from the Home Office deck to replace
|
||||
> it, and there are always three Departments to draw from. The refill happens **only** when the
|
||||
> draw actually empties the pile; a pile with cards buried under the one taken is not refilled, or
|
||||
> the Departments would grow without limit and drain the deck into themselves.
|
||||
>
|
||||
> This surprised a player at the table (2026-09-22), which is why it is written down here: the rule
|
||||
> was implemented from the prototype rules and had never reached this document.
|
||||
|
||||
**Freight Agent.** Make one of these operations, then the turn ends: stock one green outbound box from a matching loaded Division Yard car; clear one red inbound box to the Classification Yard; unjam one outbound, inbound, or MEN | AT | WORK load to the Classification Yard; or explicitly end without acting. Freight can be stocked only when an unclaimed empty matching car is already spotted at that industry. Passengers may wait in a green Office box without a train present.
|
||||
|
||||
Implementation note, still true at v0.8.0.17: `card.discard` is accepted during Local Operations
|
||||
> **A car cleared from a red Inbound box comes back empty.** Whatever was in it has arrived — the
|
||||
> passengers are out of the station, or the load is in the industry — and the Revenue for it was
|
||||
> paid on arrival, not on clearing. What returns to the Classification Yard is the *car*, in the
|
||||
> common supply and carrying nothing. Before v0.8.1.0 it returned still marked loaded, which put
|
||||
> coaches into the yards that could never be used to unload another passenger.
|
||||
|
||||
Implementation note, still true at v0.8.1.0: `card.discard` is accepted during Local Operations
|
||||
without checking that the Draw option was chosen — unlike `card.play`, which does check. This is an
|
||||
implementation quirk rather than a fourth published turn option.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user