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
This commit is contained in:
co-authored by
Claude Opus 5
parent
dc31555625
commit
b90c0413d2
@@ -1,12 +1,12 @@
|
||||
# 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.
|
||||
**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:** 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).
|
||||
[rules book](rules.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
|
||||
@@ -60,7 +60,7 @@ player-selectable source. It returns to service only when the Division Yard is e
|
||||
> 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.
|
||||
> middle of Day 2 and stayed. See [Rules](rules.md) §4.6.
|
||||
|
||||
## Crew Trays and trains
|
||||
|
||||
+11
-9
@@ -26,16 +26,18 @@ Written to be handed to somebody who is about to play, rather than to somebody b
|
||||
|
||||
| Document | What it is |
|
||||
| --- | --- |
|
||||
| [`StationMaster-Quickstart.md`](StationMaster-Quickstart.md) | **Start here if you have never played.** The point of the game, how a Stage runs, what is on screen, how you win, a first twenty minutes, and what to report. |
|
||||
| [`StationMaster-Rules-v0.4.5.md`](StationMaster-Rules-v0.4.5.md) | **The rules in full**, as the engine actually runs them, with a FAQ. |
|
||||
| [`quickstart.md`](quickstart.md) | **Start here if you have never played.** The point of the game, how a Stage runs, what is on screen, how you win, a first twenty minutes, and what to report. |
|
||||
| [`rules.md`](rules.md) | **The rules in full**, as the engine actually runs them, with a FAQ. |
|
||||
| [`rules/as-built.md`](rules/as-built.md) | **Every card, GENERATED from `src/engine/content.ts`** and checked by a test, so it cannot disagree with the game. The table of record for per-card facts. |
|
||||
| [`StationMaster-Home-Deck-v0.4.5.md`](StationMaster-Home-Deck-v0.4.5.md) | How the Home Office deck is dealt, drawn and played out. |
|
||||
| [`StationMaster-Mainline-Deck-v0.4.5.md`](StationMaster-Mainline-Deck-v0.4.5.md) | The Mainline cards, how the deck is dealt, and what a card does to a train crossing it. |
|
||||
| [`StationMaster-Components-v0.4.5.md`](StationMaster-Components-v0.4.5.md) | Rolling stock, the two yards, Crew Trays, the Fedora, the D12. |
|
||||
| [`home-deck.md`](home-deck.md) | How the Home Office deck is dealt, drawn and played out. |
|
||||
| [`mainline-deck.md`](mainline-deck.md) | The Mainline cards, how the deck is dealt, and what a card does to a train crossing it. |
|
||||
| [`components.md`](components.md) | Rolling stock, the two yards, Crew Trays, the Fedora, the D12. |
|
||||
|
||||
The `v0.4.5` in four of those filenames is the **prototype rules edition they were first written
|
||||
against**, not the version they describe — each says at the top which build it is current to. The
|
||||
names are kept because `src/`, `CHANGELOG.md` and `docs/rules/` cite them.
|
||||
**None of these carry a version in the filename**, and that is deliberate (Jesse, 2026-09-21): they
|
||||
are kept current with every release rather than published as editions, so the name is always the
|
||||
latest and each says at the top which build it describes. Four of them were stamped `v0.4.5` until
|
||||
v0.8.0.17 — the prototype rules edition they were first written against, never the version they
|
||||
described — which read as though they documented a build five minor versions old.
|
||||
|
||||
## Rules
|
||||
|
||||
@@ -66,7 +68,7 @@ must do.
|
||||
|
||||
## Current status
|
||||
|
||||
**v0.8.0.16.** Rules formalized, card faces specified, architecture documented, and the game
|
||||
**v0.8.0.17.** 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
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Station Master — Home Deck
|
||||
|
||||
**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.
|
||||
**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 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.
|
||||
@@ -42,7 +42,7 @@ three cards from one shuffled deck; `threeTrackThreeOther` deals three track and
|
||||
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](StationMaster-Rules-v0.4.5.md)
|
||||
Drawing is one of the three Local Operations options — see [Rules](rules.md)
|
||||
§4.2. Taking the option lets you draw **and** play or discard within the same turn.
|
||||
|
||||
## Track cards
|
||||
@@ -136,11 +136,15 @@ 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**, **ABS Signals** and the rest.
|
||||
`as-built.md` marks each one `live`, `dormantSolo` or `unbuilt`, which is the part only the
|
||||
implementation knows.
|
||||
(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-deck.md).
|
||||
- **Mainline modifiers** are played onto a Mainline card: the Heavy Grade helpers and Realignment.
|
||||
See [Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md).
|
||||
See [Mainline deck](mainline-deck.md).
|
||||
- **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.
|
||||
@@ -1,8 +1,8 @@
|
||||
# Station Master — Mainline Deck
|
||||
|
||||
**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.
|
||||
**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.
|
||||
@@ -104,6 +104,21 @@ Home Office cards, played onto a Mainline card during a player's Draw option.
|
||||
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,
|
||||
@@ -1,6 +1,6 @@
|
||||
# Station Master — Quickstart
|
||||
|
||||
**For a tester who has never played. Describes the game as built at v0.8.0.16** (2026-09-20).
|
||||
**For a tester who has never played. Describes the game as built at v0.8.0.17** (2026-09-21).
|
||||
|
||||
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.
|
||||
@@ -192,8 +192,8 @@ Bugs go to the tracker; anything unclear in this guide is also worth saying.
|
||||
|
||||
| For | Read |
|
||||
| --- | --- |
|
||||
| The rules in full, with the FAQ | [Rules](StationMaster-Rules-v0.4.5.md) |
|
||||
| The rules in full, with the FAQ | [Rules](rules.md) |
|
||||
| Every card, generated from the code | [`rules/as-built.md`](rules/as-built.md) |
|
||||
| How the Home Office deck is dealt and played | [Home deck](StationMaster-Home-Deck-v0.4.5.md) |
|
||||
| The Mainline cards and what they do to a train | [Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md) |
|
||||
| Rolling stock, yards, trays, the Fedora | [Components](StationMaster-Components-v0.4.5.md) |
|
||||
| How the Home Office deck is dealt and played | [Home deck](home-deck.md) |
|
||||
| The Mainline cards and what they do to a train | [Mainline deck](mainline-deck.md) |
|
||||
| Rolling stock, yards, trays, the Fedora | [Components](components.md) |
|
||||
@@ -1,15 +1,15 @@
|
||||
# Station Master — Rules
|
||||
|
||||
**Describes the game as built at v0.8.0.16** (2026-09-20). Previously stamped "v0.4.5", the
|
||||
prototype rules edition this reference was first written against; the filename keeps that stamp
|
||||
because `src/`, `CHANGELOG.md` and `docs/rules/` all cite this file by name.
|
||||
**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.
|
||||
|
||||
**Authority:** observed code paths and tests. Where a card face, a prototype document and executable
|
||||
behaviour differ, this document reports **executable behaviour** and marks unimplemented material.
|
||||
Per-card numbers are not repeated here — [`rules/as-built.md`](rules/as-built.md) is generated from
|
||||
`src/engine/content.ts` and is the table of record.
|
||||
|
||||
**New to the game? Start with the [Quickstart](StationMaster-Quickstart.md).**
|
||||
**New to the game? Start with the [Quickstart](quickstart.md).**
|
||||
|
||||
## 1. Overview and background
|
||||
|
||||
@@ -27,9 +27,9 @@ This book is divided as follows:
|
||||
6. the implemented multiplayer/engine status; and
|
||||
7. FAQs and implementation limits.
|
||||
|
||||
The companion references are the [Quickstart](StationMaster-Quickstart.md) for a new player,
|
||||
[Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md), [Home deck](StationMaster-Home-Deck-v0.4.5.md),
|
||||
[components](StationMaster-Components-v0.4.5.md), and the generated per-card table
|
||||
The companion references are the [Quickstart](quickstart.md) for a new player,
|
||||
[Mainline deck](mainline-deck.md), [Home deck](home-deck.md),
|
||||
[components](components.md), and the generated per-card table
|
||||
[`rules/as-built.md`](rules/as-built.md).
|
||||
|
||||
## 2. Definitions
|
||||
@@ -206,7 +206,7 @@ roll a tail cut into a connected Freight Facility.
|
||||
|
||||
**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.16: `card.discard` is accepted during Local Operations
|
||||
Implementation note, still true at v0.8.0.17: `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.
|
||||
|
||||
@@ -243,7 +243,7 @@ Mainline movement is automatic and processes lower train numbers first; a timeta
|
||||
|
||||
**Crossing time is the card's REGIONS**, one per Stage — not its printed mph, which is scenery, and
|
||||
not the train's Fast/Slow rating, which only **Hilly** reads. See the
|
||||
[Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md) reference for what moves a train's entry
|
||||
[Mainline deck](mainline-deck.md) reference for what moves a train's entry
|
||||
point. On a normal card, a train must check the entire next Subdivision before entering it:
|
||||
|
||||
- an opposing train normally blocks entry;
|
||||
@@ -193,9 +193,9 @@ cannot carry this column, which is the argument for generating the page rather t
|
||||
| --- | --- | --- | :---: |
|
||||
| Interlocking | runningTrackStraight | — | **live** |
|
||||
| Facing Point Locks | onCard | interlocking in the district | **dormantSolo** |
|
||||
| Yard office | secondaryTrackStraight | — | **live** |
|
||||
| Small yard | secondaryTrackStraight | — | **live** |
|
||||
| Water column | runningTrackStraight | — | **dormantSolo** |
|
||||
| Yard Office | secondaryTrackStraight | — | **live** |
|
||||
| Small Yard | secondaryTrackStraight | — | **live** |
|
||||
| Water Column | runningTrackStraight | — | **dormantSolo** |
|
||||
| Overpass | onCard | — | **unbuilt** |
|
||||
| Telegraph | runningTrackStraight | — | **live** |
|
||||
| Telephone | onCard | telegraph on the same card | **live** |
|
||||
|
||||
@@ -68,7 +68,7 @@ read "Both" for both of them, and that was the *other half* of the same mistaken
|
||||
House" named those two, §9.3 had to be describing them, so they had to be two-way. Once the Freight
|
||||
House is its own card the argument evaporates, and playtesting settled it — "Grocer's Warehouse
|
||||
should be receive only, does not ship anything out"; "Refinery: only ships out tanks, does not
|
||||
receive anything" (Jesse). `StationMaster-Home-Deck-v0.4.5.md` prints both that way, and the modifier
|
||||
receive anything" (Jesse). `home-deck.md` prints both that way, and the modifier
|
||||
set agrees: all three Refinery modifiers (Pipelines, Oil Depot, Viscosity Breakers) grant **+1
|
||||
outbound**, which would be an odd card set for a facility that receives half the time.
|
||||
<!-- TODO v0.5.0: Mine Tipple, Produce Shed and Power Plant above (3/3/4, 2/2/3, 3/3/4) were NOT
|
||||
|
||||
@@ -142,7 +142,7 @@ asked a third time:
|
||||
rising to 50% at four players. A pre-game interrupt for a rule four games in five never see.
|
||||
|
||||
The docs were the actual defect. `README.md` still listed it among three open rules questions (all
|
||||
three closed in v0.5.0) and `StationMaster-Mainline-Deck-v0.4.5.md` still said "the implementation
|
||||
three closed in v0.5.0) and `mainline-deck.md` still said "the implementation
|
||||
needs a player-selection step to match the card". Both now say settled, and why.
|
||||
|
||||
**Still not implemented**: the Action (10) and Space-use (12) cards, which are genuinely
|
||||
@@ -555,7 +555,7 @@ Hotel) are what grow them.
|
||||
now carries **2** coaches and The Sparrow **3**. The table above is left as `Trains3.pdf` prints it,
|
||||
because that is what this section is for — what the design SAYS. What the game plays is
|
||||
`src/engine/content.ts`, with the per-card table in
|
||||
[`../StationMaster-Home-Deck-v0.4.5.md`](../StationMaster-Home-Deck-v0.4.5.md).
|
||||
[`../home-deck.md`](../home-deck.md).
|
||||
|
||||
### Extras (X13–X22) — ten distinct trains, not four generic ones
|
||||
|
||||
@@ -910,7 +910,7 @@ any setting** — being a place an Extra can start is part of what upgrading buy
|
||||
- **The Mainline cards were rolled, not dealt.** `buildDivision` drew uniformly from the nine card
|
||||
TYPES **with replacement**, so a Division could be dealt two Interchanges or two Tunnels, and
|
||||
Plains — printed twice in the deck — carried the same weight as cards printed once.
|
||||
`docs/StationMaster-Mainline-Deck-v0.4.5.md` had already flagged the mismatch as needing
|
||||
`docs/mainline-deck.md` had already flagged the mismatch as needing
|
||||
correction; "an Extra may start at the Interchange if one is on the board" is what forced it, since
|
||||
that only reads as a rule if the board holds at most one. Now dealt from the printed ten-card deck
|
||||
without replacement.
|
||||
|
||||
Reference in New Issue
Block a user