Files
station-master/docs/StationMaster-Components-v0.4.5.md
T
Jesse.MarkowitzandClaude Opus 5 dc31555625 v0.8.0.16 — the guide a tester can reach, and a flag that named the card instead of the gate
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
2026-09-21 01:28:51 -04:00

94 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](StationMaster-Rules-v0.4.5.md).
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](StationMaster-Rules-v0.4.5.md) §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.