Files
station-master/docs/mainline-deck.md
T
Jesse.MarkowitzandClaude Opus 5 b90c0413d2 v0.8.0.17 — four things the game knew and the screen did not say
All four reported from a table on Day 1 of v0.8.0.16, and all the same shape.

ABS SIGNALS COULD ONLY BE PLAYED ON ONE MAINLINE CARD, while its tooltip said
"any Mainline card". The engine was never wrong: check accepts any node whose
kind is mainline and legalActions filters by check, so all of them were legal.
The failure was the LABEL — describeIntent named i.placement and never i.node,
so every placement described itself as plain "play ABS Signals", and the action
list drops duplicate labels. All but the lowest-index node were discarded before
the menu saw them. This is the THIRD time that trap has fired and the file
documents the other two three lines apart: a turnout's two rotations, and three
Department discards. Same fix — name what distinguishes them.

The card is also called what the card face calls it. prettyKey rendered
absSignals as "Abs Signals" beside a tooltip saying ABS, an acronym no
key-splitter can recover, so the authored names now win. Three of those names
were transcribed in sentence case and were CORRECTED rather than adopted: the
repository says "Yard Office" 36 times against "Yard office" twice. A lookup
that imports its own source's typos is the drift it exists to prevent.

NOTHING ON A MAINLINE CARD SHOWED WHAT WAS STANDING ON IT. Played, ABS left no
mark and you found out by hovering — the same complaint the Heavy Grade wedge
answered, and it matters more here because ABS decides whether a second train on
that card is safe. It draws a signal mast with a lit lamp now; a signal is the
literal object and needs no room for words, which is what lets it sit clear of a
name as long as "Uncontrolled Siding" on a 152px cell. The Mainline modifiers
draw as BRK, AIR and HLP. Realignment is deliberately not among them: reduce
takes the `became` branch and changes node.card, so a realigned Trestle IS an
Uncontrolled Siding afterwards. Asserted, so the absence reads as a finding.

A FREIGHT AGENT TURN SAID A CAR MOVED WHEN NONE HAD. Three faults behind one
line. It asserted an outcome, where §6.3 requires no action and the bot declines
deliberately — unjamming a healthy box destroys a load that cost a whole action
to stock. An idle Agent was then silent, which read as a dropped turn; a new
freightAgentIdled event says so and why, reducing to nothing exactly like
switchingEnded. And the work named a coordinate rather than the industry, though
a `place` helper has existed for precisely that since the switching lines moved
to it. "Loaded a loaded boxcar INTO the green Outbound box at the Freight House",
with the direction in capitals because to-or-from was the question asked.

THE LOG AND THE ACTION MENU SPELLED THE SAME SQUARE DIFFERENTLY. view.ts wrote
(col,row) — X,Y, east/west then north/south — with a comment saying why;
narrate.ts wrote the internal storage order with no comment at all. So the menu
offered a move to "(1,-1)" and the log reported it at "(-1,1)", side by side.
Pinned by a test that renders one square through BOTH describers and compares
them to each other: a test written against either file alone would have passed.

THE DOCUMENTATION IS REACHABLE FROM A RUNNING GAME, AND ALL OF IT IS PUBLISHED.
v0.8.0.16 published the Quickstart and nothing it points at — its §8 links five
documents by relative path and every one 404'd on the package, verified against
the running container. The build publishes the full set, and the test reads the
links OUT OF the guide rather than listing them. They are linked from the This
Game card, where reference already lives, rather than the header that must not
wrap; no mode awareness is needed, because solitaire and multiplayer are the
same page on the same origin.

THE REFERENCES DROPPED THE VERSION FROM THEIR NAMES. Four described v0.8.0.16
and had since the v0.8.0.15 audit; the v0.4.5 was the prototype edition they
were first written against, kept only because 36 citations pointed at it — and
it read as documentation five minor versions stale. They are quickstart.md,
rules.md, home-deck.md, mainline-deck.md and components.md now, kept current
with each release rather than published as editions. Two errors surfaced while
checking them against this release, which is the argument for doing it:
home-deck.md filed ABS Signals under Enhancements "played into your district"
that "change what a square does" — it does neither, this release's bug written
down — and mainline-deck.md, which lists everything playable onto a Mainline
card, never mentioned it at all.

1010 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 05:53:52 -04:00

144 lines
7.6 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 — Mainline Deck
**Describes the game as built at v0.8.0.17** (2026-09-21). 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 tarot-sized Mainline cards placed between Offices — how the deck is dealt, what a
card does to a train crossing it, and the Home Deck cards played onto one.
> **Per-card numbers live in [`rules/as-built.md`](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. This document explains how the deck is used; that one is the table of record. Where the
> two ever differ, as-built is right.
## How Mainline cards work
At setup the game lays one Mainline card between each neighbouring pair of Offices and one beyond
each end Office, between it and a Division Point — so a game with *N* players uses **N + 1** cards.
They are **dealt from a finite deck without replacement** (since v0.6.2), so no Division can hold
two of a card printed once. The two Division Points are the fixed ends of the Division and are not
in the deck: `buildDivision` lays them itself.
A card does not belong to either neighbouring Office. It is shared Division.
### Crossing time is REGIONS, not mph
A card is divided into **regions**, and a train advances **one region per Stage**. Crossing time is
therefore `regions − startRegion`, and nothing else. **The printed mph is scenery.**
This is the part most likely to be remembered wrong, because it used to work the other way: mph set
the cost and a Slow train added a Stage to *every* card. It does not. Four things move a train's
start region and nothing else does:
1. **The card's own back region.** The Uncontrolled Siding and the Interchange print a back region
that is not part of the road, so a train running through begins past it.
2. **A card that prints a Fast and a Slow start — and only Hilly does.** A fast train starts one
region along and crosses in 1 Stage; a slow one takes 2. **No other card reads a train's
Fast/Slow rating at all.**
3. **The permanent Heavy Grade modifiers**, each moving a train one region up the hill.
4. **Occupancy**: arriving to find the card occupied can put a train in the siding, a region behind.
No crossing ever takes less than one Stage.
### Traffic
Only **Double Track** lets two trains stand on one card, so a following train is not held behind a
slower one. Every other card holds one train at a time. The **Uncontrolled Siding** is not a passing
card: arriving to find a train already there puts you in the siding a region behind it — you do not
run into it, and it costs you the extra Stage instead.
Whether a following train may enter an occupied card at all is the Superintendent's ruling (§8.1,
Rules §4.5). Getting it wrong is what causes collisions.
## The deck
Ten drawable cards — Plains twice, the other eight once each — plus the two Division Point cards,
which are not drawn.
| Card | Copies |
| --- | ---: |
| Plains | 2 |
| Curves | 1 |
| Hilly | 1 |
| Heavy Grade | 1 |
| Double Track | 1 |
| Uncontrolled Siding | 1 |
| Tunnel | 1 |
| Trestle | 1 |
| Interchange | 1 |
| East / West Division Point | 1 each, not dealt |
The PDF art labels the Interchange "Yard". This reference uses **Interchange** throughout, to keep
it apart from the Division Yard, the Classification Yard, the Yard Office and the Small Yard — five
different things.
**Region counts and entry points per card are in [`rules/as-built.md`](rules/as-built.md).**
## The Interchange, and what it does NOT do
The Interchange prints a car-sorting capability. **It is not implemented, and never has been.** The
one thing the card's `sortsCars` flag actually gates is that an **Extra Train may be made up and
started here** — it is the Mainline card with a yard, which is why §7 allows it (v0.6.2). An Extra
starting here begins in the back region and takes the extra Stage.
Re-ordering a consist is done at a **Small Yard** in an Office Area, for one switching Move. See
Rules §4.3.
> **Corrected 2026-09-20.** Until this pass the card said "Cars may be sorted into any new order
> here" — on the board, in the tooltip a player reads, and in the generated reference. A card
> advertising an action the game will not offer sends a player hunting for a button that does not
> exist. The description now says what the card does.
## Heavy Grade modifiers
Home Office cards, played onto a Mainline card during a player's Draw option.
| Card | Placement and effect |
| --- | --- |
| Brakeman | Heavy Grade only. A **downhill** train starts one region further on. |
| Airbrakes | Heavy Grade only, and **Brakeman must already be on that card**. A downhill train starts one region further again. |
| Helpers | Heavy Grade only. An **uphill** train starts one region further on. |
| Realignment | Only onto an **unoccupied** Mainline card. Plains → Double Track, Curves → Plains, Uncontrolled Siding → Double Track, Trestle → Uncontrolled Siding. No other card may be realigned. |
A Heavy Grade is 3 regions, so it is 3 Stages to climb and 3 to run down before help. Modifiers
never reduce a crossing below one Stage.
### ABS Signals — an Enhancement, but it lives out here
**ABS Signals is dealt from the Home Office deck as an Enhancement, and it is the one Enhancement
that is not played into a district.** It goes onto a **Mainline card — any of them**, not only a
grade — and takes no square in anybody's Office Area.
What it does: trains on that card **will not rear-end each other**. A following train is held short
of the one ahead instead of running into it, so the Superintendent has no §8.1 judgment to make and
no collision is scored. It is the only thing besides a Red Flag that prevents a rear-end collision
out on the Mainline, and unlike a Red Flag it stays on the card for the rest of the game.
On the board a card carrying it draws a **signal mast with a lit lamp** at its top-right corner; the
three grade helpers draw as **BRK**, **AIR** and **HLP** beside the card's name. Realignment draws
nothing, because a realigned card simply becomes the card it was converted into.
## Heavy Grade orientation is settled, not missing
Heavy Grade orientation is **rolled from the seed**, not chosen by a player. **This is a decision,
not a gap.**
The card prints "(Up)" and "Player sets orientation", which assumes the card has an owner. This one
does not: the Division is laid `DP · Mainline · Office · Mainline · … · DP`, so a Heavy Grade always
sits **between two districts**, or beyond an end Division Point beside one — never inside a single
player's district.
Orientation is not cosmetic. Brakeman and Airbrakes help a train running **downhill**, Helpers helps
one running **uphill**, and odd-numbered trains run west while even run east. Turning the card
around decides which modifiers are worth anything and which direction of traffic is favoured, for
the whole game. Handing that to one of two neighbours advantages them over the other, and neither
has a fair claim to it.
**Re-opened and closed again on 2026-08-23**, when giving the choice to the Superintendent was
considered and rejected. Jesse's call: v0.5.0's ruling stands. Rolling from the seed is
deterministic, roughly even (51/49 east/west over 400 games), identical in solitaire and
multiplayer, and keeps setup non-interactive — the game has no setup phase, so the question would
have to interrupt play before the first Local Operations, in the minority of games that deal the
card at all (20% at one player, rising to 50% at four).