Files
station-master/docs/home-deck.md
T
Jesse.MarkowitzandClaude Opus 5 517238a727 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
2026-09-22 21:20:52 -04:00

9.3 KiB
Raw Permalink Blame History

Station Master — Home Deck

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.

Scope: the Home Office deck — how it is dealt, drawn, discarded and reshuffled, and what the rules are for playing each kind of card out of it.

Per-card facts live in rules/as-built.md, which is GENERATED from src/engine/content.ts and checked by test/card-reference.test.ts, so it cannot disagree with the game. Read it for every card's name, effect, placement and whether its printed effect actually resolves yet. This document is how the deck WORKS; that one is what is in it.

No card counts appear here, deliberately (TODO #15a, Jesse's call 2026-08-22): counts move with play balance, so a document printing them is answering a question that has a different answer after the next retune. Where a count matters it is rendered as a yes/no — whether the deck deals the card at all — which is a fact about the design. This page used to print a full counts table and it was wrong for a month before anyone noticed.

The piles

  • 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. 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 in full, reshuffled from the seeded stream. A spent timetabled train is not collected — its number is on the timetable and it cannot run twice — but a discarded train was never played and is still runnable, so it comes back.

Hand and turn

The hand limit is three, or four while you hold a Red Flag. You may not end a turn over the limit: play a card or discard one to a Department. Some cards cannot be discarded at all — an Extra never can, and a timetabled train cannot when the discardTimetabled house rule is off — so a hand of nothing but those has exactly one way forward, which is to play one.

The opening deal is a house-rule choice made when the game is dealt. The default (threeRandom) is three cards from one shuffled deck; threeTrackThreeOther deals three track and three others from two separately shuffled piles, deliberately over the hand limit, so the first turn is spent choosing which district you can afford to build.

Drawing is one of the three Local Operations options — see Rules §4.2. Taking the option lets you draw and play or discard within the same turn.

Track cards

Track cards are ordinary Home Office cards, not a separate personal supply.

  • A placed card must connect to existing rail: at least one neighbour must join it.
  • The Running Track is the row from Limit to Limit. A card placed there must carry an east–west through route, or it breaks the main.
  • Placing track on a Limit sign extends the Running Track and moves that sign outward. The sign is a physical card, so it moves rather than being left stranded mid-track.
  • Nothing may be placed outside your Limits — track, industries and, since v0.8.0.14, Modifiers too. Your district ends at its sign.
  • Curves and turnouts are printed left- or right-handed. A card may be turned 180° but never flipped over, so its 45° leg never changes diagonal.
  • A turnout may upgrade an existing straight, or a curve whose arc is exactly the turnout's diverging arc. Not if the card holds standing cars or an enhancement. Every other occupied square is unavailable.
  • A turnout may be run through but not stopped on: it is not Operational Rail, so a Move may not end there.

Office cards

Every player begins at a Whistle Post, which is not drawn from the deck: one A/D track, no Porters, no passenger slots, and not a Control Point.

Office cards are upgrades in strict sequence — Whistle Post → Depot → Station → Terminal — and each upgrades the Office in place rather than replacing its card or its attached track. Modifiers already beside it are preserved. Each tier adds an A/D track, a Porter, and an outbound and inbound passenger slot; a Depot and above is a Control Point and a Passenger Facility.

An upgrade takes no placement: the Office is where it already is.

Freight facilities

An industry is placed on a connected straight stub off the Running Track — never on the Running Track itself, and never outside the Limits. A Facility carries its own rails, so placing one places track.

Each begins with one Laborer and a three-box MEN | AT | WORK pipeline. No Office Area may hold a duplicate industry, or both ends of a lockout pair — a producer and the consumer of the same commodity cannot be built in one district.

An industry track holds four cars, like any other card. It is not sized by the industry's box count. That distinction was a real bug: box count is how much WORK an industry can hold, not how much RAIL it has, and conflating the two invented a printed siding no industry card carries.

Facility modifiers

A Modifier sits on an empty square among the nine spots around its host Facility — and, since v0.8.0.14, inside your Limits, like everything else. It may not stand in the Running Track row. One of each kind per Office Area.

A Modifier adds a BOX, never room for a car. A Truck Dock beside a Grocer's Warehouse gives it a second red box — somewhere for one more arriving load to be cleared to — and changes nothing about how many cars may be spotted there.

A grant the host cannot use does nothing, and the game says so rather than pretending. An outbound bonus beside an inbound-only facility, or the Truck Dock's inbound bonus beside the outbound-only Packing Sheds, is discarded — the latter leaving that card with no effect at all. Passenger modifiers beside a Whistle Post add Porters but create no outbound slot until the Office becomes a Passenger Facility; the panel reports that as DORMANT rather than claiming the facility "only receives", which was wrong in both directions.

Train cards

Playing a timetabled train rolls the seeded D12 and puts its number in the first open timetable slot at or after the result, wrapping around the 12-slot chart. It then runs at that Stage every Day.

Playing an Extra queues it; it is made up when a Crew Tray comes free, and the player who played the card chooses where it starts and loads it as they choose (§7). Where it may start is a house rule — divisionPointsOnly, ownOffice, or anyOffice (the default) — and the Interchange is also available, because it is the one Mainline card with a yard. An Extra runs once and its card goes to the Salvage Yard.

The v0.4.5 behaviour of launching every Extra eastbound from the Western Division Point was replaced in v0.6.2. The number no longer decides an Extra's direction; the start does.

The listed consist is a maximum, not a minimum. A train may depart with fewer cars, but not with more, not of the wrong category, not with a car behind the caboose, and not with the engine buried among its own cars. A Crew Tray holds four pieces, and a caboose counts toward the four.

A train made up short of what its card calls for is reported as such, with what it wanted and why the yard could not supply it — see Rules §4.4.

Per-train consists and printed rules: rules/as-built.md § Trains. It carries the empties only, reefers only, drop only and pick up empties only restrictions, every one of which the engine enforces.

Enhancements, Mainline modifiers and Maneuvers

  • Enhancements are played into your district and change what a square does — the Small Yard (re-order a consist for one Move), Interlocking, Yard Office and the rest. as-built.md marks each one live, dormantSolo or unbuilt, which is the part only the implementation knows.
    • ABS Signals is the exception, and it matters. It is dealt as an Enhancement but is not played into your district: it goes onto a Mainline card — any one of them — and stops trains there rear-ending each other. It takes no square and is not part of anybody's Office Area. See Mainline deck.
  • Mainline modifiers are played onto a Mainline card: the Heavy Grade helpers and Realignment. See Mainline deck.
  • Maneuvers are held and spent: Red Flags and Flying Switch have their own actions. Poling is catalogued but its effect is recorded as "TBD in the source", so there is nothing to implement.

Opponent-directed cards — not dealt

The Action and Space-use categories are opponent-directed and are excluded from every dealt deck, because their play rules are not implemented. They are catalogued in as-built.md so the composition is on record, and check refuses to play one. This is deliberate: silently accepting them would make a card look playable while doing nothing.