v0.8.0.15 wrote a Quickstart for a tester who has never played and then left it in docs/, where a tester does not look — reachable only by somebody who already has the repository. Nobody handed the box had it. build-web.ts now copies it to dist/quickstart.md and the splash page offers it under the three doors, as a line rather than a fourth door: reading the guide is not a way to play, and giving it equal weight in that grid would say it is. COPIED, NEVER RE-WRITTEN. The Markdown document stays the one copy. A hand-written HTML twin drifts from it on the first edit, which is the failure #15a was raised about and precisely what the v0.8.0.15 pass spent itself undoing. It is served as PLAIN TEXT, which is honest rather than good — tables render as pipes and the links do not click. Rendering it into a styled page wants a small Markdown converter and is filed as TODO #109; build-web.ts's comment names that number rather than gesturing at "the next step", so the file and the worklist cannot drift the way the references just did. Two things had to be true and tsc checks neither, so both are tests. The href on the splash page and the filename the build writes are two strings with nothing connecting them: rename the document and the build quietly publishes nothing while the page keeps offering a link that 404s. And a .md file must not arrive as a download — the server's MIME fallback is application/octet-stream, which a browser saves instead of displaying, so the link would have handed a tester a file to save rather than a page to read. '.md' is in http.ts's table now, and the test reads that table out of the source rather than asserting on a copy of it, which would pass while the real one was wrong. VERIFIED AGAINST A RUNNING SERVER, not only compiled: 200, text/plain; charset=utf-8, the guide's own first lines, and the splash link resolving. THE sortsCars COMMENT. Asked after v0.8.0.15 whether everything now agreed, and the audit turned up one place that did not — the field's own doc comment named the card's printed text as though it were the flag's meaning. Nothing reads it to permit a sort; its two readers, resolveExtraStart in apply.ts and the enumeration in legal.ts, both ask whether this is the one Mainline card with a Yard Limit and therefore the one an Extra may be made up and started on. Comment only, and worth the bump because of where it is: it is what a developer reads before using the flag, and it is the likeliest source of the sentence v0.8.0.15 had to correct off the board. The name is kept for its link to the card face and the comment now says outright that the name is not the meaning. The five references and docs/design.md read v0.8.0.16. They describe this build because the audit re-checked them against it, not because the number was swept forward — a stamp bumped without a reading is worth less than none. 1001 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
5.3 KiB
Station Master — Components and Markers
Describes the game as built at v0.8.0.16 (2026-09-20). Previously stamped "v0.4.5", the
prototype rules edition these references were first written against; the filename keeps that stamp
because src/, CHANGELOG.md and docs/rules/ all cite this file by name.
Scope: non-card physical components and supplies. Card-created facilities, workers, deck piles, hand state, timetable state and other markers are documented with their cards or in the rules book.
The figures below are checked against ROLLING_STOCK_SUPPLY and the supply constants in
src/engine/content.ts. They are physical inventory rather than deck tuning, which is why they are
printed here at all — per-category CARD counts are deliberately not published anywhere (TODO #15a).
Rolling stock
Rolling stock has a type and a load state. In the interface, coloured cars are loaded and white cars are empty. The Division Yard starts with the following supply.
| Type | Loaded | Empty | Total | Use |
|---|---|---|---|---|
| Coach | 8 | 8 | 16 | Passenger work. |
| Boxcar | 10 | 10 | 20 | Freight House outbound/inbound; Grocer’s Warehouse inbound. |
| Hopper | 8 | 8 | 16 | Mine Tipple outbound; Power Plant inbound. |
| Reefer | 5 | 5 | 10 | Packing Sheds outbound; Grocer’s Warehouse inbound. |
| Tank car | 6 | 6 | 12 | Refinery outbound; Power Plant inbound. |
| Caboose | 6 | 0 | 6 | Required or permitted at the rear of the applicable train cards. |
| Total | 43 | 35 | 78 |
The engine is not rolling stock and does not count against the four-car Crew Tray limit.
Other supplies
| Component | Count | Note |
|---|---|---|
| Crew Trays | players + 3 | Engine and tray are one combined resource; there is no "engine without a tray". |
| Whistle Post cards | 4 | Every player starts on one; it is not drawn from the deck. |
| Limits signs | 8 | "2N + spares", so relocating one is never a supply question. |
The two yards
Division Yard
The Division Yard is the active supply. It provides:
- loaded cars to a Freight Agent stocking a green outbound box;
- empty cars for building up trains;
- an empty coach when passengers detrain; and
- an empty matching freight car when a loaded freight car begins unloading.
When a train completes a run or is destroyed, its caboose returns to the Division Yard. When a car is taken from the Division Yard and that yard has become entirely empty, every car from the Classification Yard moves back into the Division Yard immediately.
Classification Yard
The Classification Yard collects used rolling stock: cars displaced by boarding passengers, cars cleared from inbound red boxes, cars removed by unjamming a facility, ordinary cars from completed or destroyed trains, and empty cars replaced by a completed outbound freight load. It is not a player-selectable source. It returns to service only when the Division Yard is empty.
This is a one-way ratchet for COACHES, and it decides games. Boarding sends an emptied coach here; detraining takes a fresh empty out of the Division Yard. Nothing returns a coach to the Division Yard except the bare-yard refill — and a yard kept topped up with freight cars returning from industries may never run bare. Measured over one three-Day game, every coach was here by the middle of Day 2 and stayed. See Rules §4.6.
Crew Trays and trains
Crew Trays represent an engine and its coupled consist. The game creates players + 3 free trays at setup. A tray is scarce: a due train without a free tray is held for that Stage, and Extras wait until one becomes free.
Within a tray, the engine can pull, push, or be between cars while switching. To depart an Office for the Mainline, it must be made up with the engine at an outer end; if it has a caboose, the caboose must be at the opposite outer end. A train may have at most four cars. A scheduled train can run under-strength but never with more than its card allows.
Fedora
The Fedora is the physical marker for the Superintendent. The player with it resolves following-train clearance decisions, takes the Yard Office and Red Flag questions, and is the player every round round the table starts with. A Mainline collision is their fault by §10, and costs 5 Revenue. The initial holder is the first player tied for the highest Superintendent setup D12 roll.
It passes at the end of Stages 3, 6, 9 and 12 — every third Stage, at the Supervisor Shift. Since v0.8.0.13 the handover is announced on screen and written into the history: it is the one thing in the game that changes hands on the clock rather than because somebody did something, so nobody is watching for it. Note that the Supervisor Shift refreshes every Laborer and Porter every Stage while the Fedora moves only every third.
D12 and seeded randomness
The D12 is used by the engine for:
- the initial seating roll in a multi-player engine game;
- the initial Superintendent roll;
- a timetabled train’s timetable slot; and
- all shuffled deck order and automatic setup selection through the same seeded random stream.
The rules engine uses a deterministic 32-bit seeded random generator. The same numeric seed, player configuration, house rules, and accepted intent sequence reconstruct the same game. A seed by itself is not enough when house rules differ.