Expand game engine, replay, tests, and documentation

This commit is contained in:
Jesse
2026-07-31 08:10:54 -04:00
parent e7bc07df85
commit 401b879140
30 changed files with 2253 additions and 552 deletions
+490
View File
@@ -0,0 +1,490 @@
# Implications of the four recovered design files
Four files were added to `docs/` on 2026-07-30 that were part of the original design but never made
it into this workspace:
| File | What it is |
| --- | --- |
| `Deck cards2.xlsx` | The **complete card list** — every card, its count, where it may be placed, what it does |
| `Mainline Cards.pdf` | The **Mainline card types** — Plains, Curves, Hilly, Heavy Grade, Double Track, Uncontrolled Siding, Tunnel, Trestle, Yard, and both Division Points |
| `Trains3.pdf` | The **train cards** — all 22, with names, speed class, consist and individual operating rules |
| `tracks.png` | **Card art** for track and industry cards |
This document records what they imply and proposes what to do. **§1a below records what has since been
implemented**; everything else is still a proposal.
---
## 1. The headline: the game is roughly 3× what we built
| | Built | Recovered design | Change |
| --- | ---: | ---: | --- |
| Home Office deck | 52 | **115** | 2.2× |
| Track cards | in the deck (12) | **104**, a per-player supply of 26 | moved out of the deck entirely |
| Start cards | ad-hoc | **12** (4 Whistle Posts, 8 Limits) | formalised |
| **Total components** | ~52 | **231** | |
| Train cards | 16 | **22** | 12 timetabled + 10 Extras |
| Distinct card categories | 6 | **10** | four categories are entirely new |
The sheet's own totals (115 / 104 / 12 / 231) reconcile exactly with the line items, so these
numbers are the design's, not an inference.
**Most of my invented numbers are now superseded, and that is a good outcome.** Everything in
`card-reference.md` was explicitly provisional — placeholders standing in for exactly this document.
---
## 1b. Implementation status after the answers (2026-07-31)
All nine answers are implemented, **170 tests passing**:
| Answer | Implemented as |
| --- | --- |
| Q1 crossing time | `crossingStages()` — a 60 card takes 1 Stage, a 30 takes 2. Mainline nodes now carry a **terrain type** dealt at setup, and trains count down Stages instead of stepping through regions. The `Region` model is gone. |
| Q2 Fast/Slow | Slow adds one Stage to every card. Hilly reads the consist (any coach = passenger). |
| Q3 Expedite | An expedited train departs the Stage it arrives — it gets a second `moveTrain` in the same Mainline Phase, still subject to §8.1 clearance. |
| Q4 Lockouts | `isLockedOut()` rejects the placement with `FACILITY_LOCKED`. |
| Q5 Run-around | Nothing to do — reachability is geometric, so a built bypass already works. |
| Q6 Space-use | **Solitaire decks omit all 22 opponent-directed cards**: `buildDeck('solitaire')` returns **93**, competitive returns 115. |
| Q7 Downward-only | Office cards have a stub **below only**; turnout and curve legs always diverge south; placement and modifier candidates above the Running Track are rejected. §9's "nine nearby spots" is really **six**. |
| Q8 Crew Tray cap | Already correct. |
| Q9 Second Section | `newTrain.secondSection` plays on a train due out; an identical train is made up behind it next New Train Phase. The **Sister trains optional rule is removed** from Appendix B. |
**Still not implemented**, and now the largest remaining block: the behaviour of the Enhancement
(18), Mainline-modifier (7) and Maneuver (7) cards, plus the Action (10) and Space-use (12) cards in
multiplayer. All are in the deck; playing them is rejected with `NOT_IMPLEMENTED`.
### Measurement after the answers
100 solitaire Standard games: mean revenue **1.3**, trains scheduled **2.8**, cards played **11.3**.
Still no wins, and still **not a verdict** — roughly a third of the deck does nothing yet, and the
Small Yard enhancement (which is what makes the switching puzzle solvable) is among the unimplemented
cards. Gap 12 stays invalidated until the enhancements are in.
---
## 1a. What has been done so far (2026-07-31)
**Transcribed and in code**, with 169 tests passing:
- The full **115-card deck**`deckComposition()` reconciles exactly with the sheet's own total.
- **Track removed from the deck** and modelled as a per-player supply of **26** pieces
(`TRACK_SUPPLY`), with printed handedness and a **move cost** field (2 for sharp curves).
- **Curves** added to the track graph; the invented run-around card removed.
- All **22 trains** with names, Fast/Slow speed class, category-based consists and per-card
operating rules.
- **Industries retuned to 1-out / 1-loader**, with the real six kinds and their lockout lists.
- All **23 modifiers**, each tied to its specific hosts, with their effects applied on placement.
- **Office slots corrected** to equal porter count; deck copies corrected to Depot 4 / Station 2 /
Terminal 1.
- The **ten Mainline card types** with speeds and named entry points, as data.
- The four new categories (space-use, enhancements, mainline modifiers, maneuver, action) are in
the deck. **Playing them is rejected with `NOT_IMPLEMENTED`** rather than silently doing nothing —
the failure mode that left Modifiers as dead weight for weeks.
**Not done, pending the questions in §10**: the speed model, Expedite, lockout enforcement,
space-use semantics, and everything the four new categories actually do.
### First measurement on the real catalogue
100 solitaire Standard games, same bot: mean revenue **1.9**, trains scheduled **2.3** (was 4.8),
cards played **10.5** (was 16.3).
Development has slowed sharply, and the reason is visible in the composition: **industries are now
9 cards in 115 (7.8%), where the placeholder had 10 in 52 (19%)**. Their density more than halved,
and trains fell from 16-in-52 to 22-in-115. The deck is much more diluted, which is exactly what the
enhancements, maneuver and action cards are there to fill — and none of those do anything yet.
**Read no balance conclusions from this number.** It measures a half-implemented ruleset.
---
## 2. Deck composition
### What the design says — 115 cards
| Category | Cards | Notes |
| --- | ---: | --- |
| Offices (Depot 4, Station 2, Terminal 1) | 7 | *We had 9 (4/3/2)* |
| Passenger modifiers (Waiting area 3, Restaurant 2, Hotel 1) | 6 | each adds 1 passenger-out + 1 porter |
| Industries (Freight House 2, Mine Tipple 2, Refinery 1, Power Plant 2, Packing Sheds 1, Grocer's Warehouse 1) | 9 | *We had 10 in a different mix* |
| Industry modifiers | 17 | each tied to a **specific** industry |
| Trains (12 timetabled + 10 Extras) | 22 | *We had 16* |
| **Space-use cards** | 12 | **entirely new** — cards that burn table space |
| **Enhancements** | 18 | **entirely new** |
| **Mainline modifiers** | 7 | **entirely new** |
| **Maneuver cards** | 7 | Red Flags ×5, Flying Switch, Poling |
| **Action cards ("screw you")** | 10 | **entirely new** — played *at other players* |
| **Total** | **115** | |
### Proposal
- Replace `content.ts` wholesale with this catalogue. It is data, so this is transcription rather
than design.
- **Gap 4a (52-card deck) is superseded.** Record it as such rather than deleting the reasoning —
the deck was a stand-in and it did its job.
- **Gap 13 (deck scaling by player count) largely dissolves.** Track is now per-player by
construction, which was the real pressure I measured. The 115-card deck is shared. Re-measure
before concluding anything further.
---
## 3. Track — the biggest structural change
### What the design says
Track is **not in the deck**. Each player gets a fixed personal supply of **26 pieces**:
| Piece | Per player | Total (4p) | Notes |
| --- | ---: | ---: | --- |
| Straight | 8 | 32 | |
| Curved left | 4 | 16 | **we have no curves at all** |
| Curved right | 4 | 16 | |
| Sharp curved left | 1 | 4 | **any move across is doubled — two Moves** |
| Sharp curved right | 1 | 4 | |
| Turnout left | 4 | 16 | |
| Turnout right | 4 | 16 | |
Column J ("Train can stop here") is set for straights and curves, blank for turnouts — which matches
what we built: a turnout is not Operational Rail.
### What this changes
1. **Curves exist and we have none.** Our geometry is straight / turnout / run-around. The design has
straight / curved / sharp-curved / turnout, each in left and right hands. Run-around is not a card
at all — it is presumably *built* from a turnout pair.
2. **Handedness is printed, not chosen.** Left and right are distinct physical cards.
**Gap 11's decision — "orientation is chosen on placement" — is therefore superseded.** The
measurement behind it stands (a fixed default made vertical growth impossible), but the design's
answer is different and better: give the player a supply containing both hands.
3. **Sharp curves cost two Moves.** A per-card movement cost, which our Move model does not have.
4. **Track no longer competes for deck slots**, so the draw is entirely about industry, trains and
enhancements. This materially changes the economy I measured.
### Proposal
- Rework `track.ts` around a per-player supply with printed handedness; drop the variant machinery.
- Add a **move cost** per card (1 normally, 2 for sharp curves) and charge it against the six Moves.
- Confirm with the designer whether run-around is a built pattern rather than a card — see §10.
---
## 4. Industries and modifiers — much smaller, much more specific
### What the design says
Each industry is **one car out and one loader**, not the 23 capacity and 23 Laborers I invented:
| Industry | In deck | Car | Direction | Base capacity |
| --- | ---: | --- | --- | --- |
| Freight House | 2 | Box | BOTH | 1 boxcar out, 1 loader; boxcars in |
| Mine Tipple | 2 | Hopper | OUT | 1 hopper out, 1 loader |
| Refinery | 1 | Tank | OUT | 1 tank out, 1 loader |
| Power Plant | 2 | Hopper, Tank | IN | 1 loader |
| Packing Sheds | 1 | Reefer | OUT | 1 reefer out, 1 loader |
| Grocer's Warehouse | 1 | Box, Reefer | IN | — |
Capacity is then grown by **industry-specific modifiers**, each adding "+1 out, +1 loader":
- Mine Tipple → Prep Plant, Coal Piles, Conveyor Belts
- Refinery → Pipelines, Oil Depot, Viscosity breakers
- Power Plant → Transmission lines, Rotary Dumps, Steam Turbines
- Packing Sheds / Grocer's → Ice House, Local small groceries
- Freight House / Packing Sheds / Grocer's → Truck dock, Forklifts, Railroad Express Agency
**Column E is a lockout list** — a concept we do not have at all. Freight House locks out Grocer's
Warehouse; Mine Tipple locks out Power Plant; Refinery locks out Power Plant; Packing Sheds locks out
Grocer's Warehouse. Presumably a player may not build both of a locked-out pair.
### Passenger side — our guesses were right
| Office | Design | What we built |
| --- | --- | --- |
| Depot | 1 psgr out, 1 in, 1 porter, **2 A/D** | 1 porter, 2 green, 2 red, 2 A/D |
| Station | 2 / 2 / 2 porters, **3 A/D** | 2 porters, 3 green, 3 red, 3 A/D |
| Terminal | 3 / 3 / 3 porters, **4 A/D** | 3 porters, 4 green, 4 red, 4 A/D |
| Whistle Post | 1 A/D, not in deck, 4 copies | 1 A/D ✓ |
Porters and A/D tracks match exactly. **Our slot capacities are one too generous at every tier**
the design gives slots equal to porters, not one more. Passenger modifiers (Waiting area, Restaurant,
Hotel) are what grow them.
### Proposal
- Retune every industry to **1 out / 1 loader** and rebuild capacity growth around the 17 modifiers.
This makes Gap 10a's "moderate, varied by industry" profile obsolete.
- Correct passenger slots to equal porter count.
- Implement **lockouts** — a new placement constraint.
- **This changes the economy substantially**: a base industry is far weaker than what we modelled, so
Gap 12's balance measurements must be re-run from scratch rather than adjusted.
---
## 5. Trains — names, speed classes, and per-train rules
### Timetabled (112)
| # | Name | Speed | Consist | Rule |
| --- | --- | --- | --- | --- |
| 1/2 | Crack Limited | Fast | 3 coaches | Stop at Terminals only. No switching. Expedite. |
| 3/4 | Express | Fast | 2 freight | May drop or pick up one freight car at every location. Expedite. |
| 5/6 | The Sparrow | Fast | 2 coaches | No switching. Expedite. |
| 7/8 | Local | Slow | 1 freight + 1 coach | Coach must remain on station track if switching. |
| 9/10 | Heavy Freight | Slow | 3 freight + caboose | |
| 11/12 | Drag Freight | Slow | 2 freight + caboose | |
### Extras (X13X22) — ten distinct trains, not four generic ones
Appleseed Extra (MT freight only, may drop but not pick up), Fruit Growers Express (reefers only),
Yard Xfer, Light Engine Move (no cars at all), Campaign Train (one turn at station for speeches),
Circus Train (**one turn stopped anywhere earns 1 point**), Military Train, Director's Private Car,
Freight Extra, Pee-Dee (per-diem, may only pick up empties). Plus a **Second Section** card that
duplicates the next scheduled train's seniority, rules and consist.
### What this changes
1. **Consists are by CATEGORY** — "Freight (2)" means any two freight cars, not two hoppers. Our
`allowedTypes` model is too narrow.
2. **Fast / Slow is a train property** that pairs with the Mainline cards' 60/30 speeds (§6). We have
no speed model at all.
3. **"Expedite"** is a keyword appearing on seven trains, meaning is not yet defined for us.
4. **Per-train operating rules** — "no switching", "stop at Terminals only", "may drop or pick up one
freight car at every location". We have none of these.
5. **Extras are X13X22**, all junior to every timetabled train. **Gap 5 (Extra vs Timetabled ties)
becomes unreachable** — the tie it resolves cannot occur. The decision is harmless but moot.
6. **The Circus Train earns a point for standing still** — the first revenue source that is not a
load/unload operation. Our scoring model assumes only §9 operations and collisions.
7. **Second Section** makes the "Sister trains" optional rule concrete.
### Proposal
- Rewrite the train catalogue from `Trains3.pdf`.
- Add `speed: fast | slow` and a `rules` field per train; implement the operating rules as checks in
`apply.ts`.
- Define "Expedite" with the designer before implementing it — see §10.
---
## 6. Mainline cards — a whole system we reduced to a constant
We modelled a Mainline card as **2 regions, uniform**. The design has **ten distinct card types**:
| Card | Speed | Notes |
| --- | --- | --- |
| Plains | 60 | |
| Curves | 30 | |
| Hilly | **P60 / F30** | different speeds for passenger and freight |
| Heavy Grade (Up) | **G** | player sets orientation; Brakeman/Airbrakes/Helpers unlock better start positions |
| Double Track | 60 | **trains may pass** |
| Uncontrolled Siding | 60 | trains may pass; separate "no pass" and "passing" starts |
| Tunnel | 30 | |
| Trestle | 60 | |
| Yard | 60 | **sort cars into any new order**; has a Yard Limit |
| East / West Division Point | — | the ends |
Each card shows **Start positions** — where a train enters depending on direction, train type, and
which modifier cards are in play. The Heavy Grade card has five distinct starts (plain, brakemen,
airbrakes, plain, helpers), so playing Brakeman literally moves your entry point further along.
`Realignment` can convert one Mainline card type into another (Plains→Double Track, Curves→Plains,
Uncontrolled Siding→Double Track, Trestle→Uncontrolled Siding).
### What this changes
**This is the single largest mechanical gap.** Our Mainline Phase moves every train one region per
Stage, unconditionally. The design has speed classes, per-train-type speeds, passing, grades that
modifier cards ameliorate, and yards that re-sort consists.
It also bears directly on **Gap 12**. I measured "a train stands at the Office only 18% of Stages"
and treated it as a possible balance problem. With Double Track, passing sidings, and 60-speed
cards, traffic density is a *designed variable* — the measurement was taken against a placeholder.
### Proposal
- Model Mainline cards as typed, with a speed and a set of named entry points.
- Implement Fast/Slow × card-speed to derive how far a train moves per Stage.
- **Re-run every Gap 12 measurement afterwards.** The current numbers describe a game that does not
exist.
---
## 7. Four entirely new card categories
### Space-use cards (12)
Bean House, Flop House, Watertower, Hobo Jungle, Section House, City Blocks ×4, Engine Shops,
Tenderloin District, Engineer Cemetery. All "burn tablespace" — they occupy a grid cell and do
nothing for you. Presumably played at opponents, or a cost of drawing.
### Enhancements (18)
- **Interlocking** (+ Facing Point Locks): may stop an inbound train on the Limit track.
- **Yard Office**: an inbound train with no coaches may arrive at the yard instead of the Train Order
Office.
- **Small Yard**: a train spending one Move in the yard **may sort itself into any order, including
cars ahead of the engine**.
- **Water Column**: lets you remove a Watertower.
- **Overpass**: removes restrictions on a Railroad Crossing.
- **Telegraph / Telephone / Radio**: once a day, when dispatching facing trains, add **+4 / +8 / +12**
to the other train's number. A genuine dispatching-technology progression.
- **ABS Signals**: trains on this Mainline card will not rear-end each other; they stop short.
**Small Yard deserves special note.** It solves precisely the problem my bot cannot handle: §A.3
forces cars off in seated order, so spotting a specific car needs the consist re-ordered. A Small
Yard makes that possible. The switching puzzle was *designed* to have this answer, and we did not
have the card.
**ABS Signals directly touches Gap 2.** We made collisions unconditional; this card makes them
avoidable on a given card.
### Mainline modifiers (7)
Brakeman, Airbrakes (requires Brakeman), Helpers, Realignment ×2, Facing Point Locks ×2.
### Action cards — played at other players (10)
Derail, Broken Coupler, Railroad Crossing, Per Diem Inventory, Demurrage Charge, Customer
Complaints, Vandalism, Hotbox, Outlawed.
**We have no player-interaction mechanic whatsoever.** Several of these cause *point losses* based on
board state — "lose one point per 2 empty cars on Secondary Tracks" — which is a scoring channel our
model does not have. In a Competitive game these are presumably a large part of the tension.
### Proposal
Treat these as four separate work packages, in this order: **Enhancements** (they change core
movement and switching), **Mainline modifiers**, **Action cards** (needed for multiplayer to mean
anything), **Space-use** (lowest mechanical weight).
---
## 8. What this does to the decided gaps
| Gap | Status now | Why |
| --- | --- | --- |
| 1 Phase order | **stands** | nothing in the new files contradicts it |
| 2 Collisions automatic | **amended** | ABS Signals makes them avoidable on a card |
| 3 Office upgrades | **stands**, counts confirmed | A/D and porters match exactly |
| 4a Deck composition | **superseded** | 52 → 115, track removed from deck |
| 4b Piece counts | **needs re-derivation** | Mainline speeds change train turnaround entirely |
| 4c Consist criteria | **superseded** | consists are by category, with per-train rules |
| 5 Extra/Timetabled ties | **moot** | Extras are X13X22; the tie cannot occur |
| 6 Victory conditions | **needs re-derivation** | new revenue sources and point losses |
| 7 Terminology | **stands** | |
| 8 Office junction stubs | **needs checking against the art** | `tracks.png` shows the through-line at the card's top edge, not the middle |
| 9 Make-up round repeats | **stands** | |
| 10 Card faces | **superseded** | this is the real card list |
| 11 Track orientation | **superseded** | handedness is printed; both hands are supplied |
| 12 Balance targets | **invalidated, re-measure** | measured against a placeholder ruleset |
| 13 Deck scaling | **largely dissolves** | track is per-player by construction |
Superseded decisions should be **marked, not deleted** — the reasoning that produced them is how we
know what questions the design answers.
---
## 9. Code impact
| Component | Impact | Notes |
| --- | --- | --- |
| 1 Card catalogue | **Rewrite** | pure data; largest single edit but lowest risk |
| 2 State model | **Major** | new card kinds, per-player track supply, typed Mainline cards, train speed/rules |
| 3 Track graph | **Major** | curves, printed handedness, per-card move cost |
| 4 apply | **Major** | per-train operating rules, enhancements, action cards played at opponents |
| 5 Phase driver | **Major** | speed model, passing, grades, yard sorting |
| 6 legalActions | Moderate | follows from 4; the discipline of delegating to `check` protects it |
| 7 RNG | None | |
| 17 Bot | **Rewrite** | Small Yard changes the switching problem fundamentally |
| 18 Harness | Minor | re-run everything |
| 16 Replay | Moderate | new card types and mechanics to narrate |
| 19 Tests | **Substantial** | most rules assertions need revisiting |
**The engine's architecture holds.** Nothing here breaks the `check`/`execute`/`reduce` split, the
event log, or the pure-engine boundary. This is a large content and rules expansion inside a
structure that was built to take it — which is the main thing worth saying about it.
---
## 9a. Answers from the designer
Recorded as they are given, so nothing is lost between sessions.
| # | Question | Answer |
| --- | --- | --- |
| 1 | What do Mainline 60 / 30 mean? | **Miles per hour, expressed as crossing time.** A 60 card takes **one Stage** to cross; a 30 card takes **two**. The printed cells are decoration. Realignment (Curves→Plains) therefore has real value, and 30-cards are genuine chokepoints. |
| 2 | How does Fast/Slow affect crossing? | **Slow adds one Stage to every card.** Fast 60→1, 30→2; Slow 60→2, 30→3. The label therefore matters on every card. Consequence to watch: Slow trains occupy a Crew Tray roughly twice as long, so tray scarcity (§7) bites considerably harder than the placeholder measured. |
| 3 | What does "Expedite" mean? | **The train departs the same Stage it arrives** — it does not spend a Stage standing at the Office. Still subject to the normal §8.1 clearance rules, so it can be held. Fits X17's "one turn at station *then* expedite", and partly offsets the Slow-train transit cost below. |
| 4 | What does a lockout prevent? | **Building both in your district.** If you hold a Mine Tipple, a Power Plant card is unplayable in your Office Area, and vice versa. Each locked pair is a producer and the consumer of the same commodity, so this forces traffic to flow *between* districts — a deliberate multiplayer-interdependence mechanic. In solitaire it simply narrows the build options. |
| 5 | Is a run-around a card? | **No — a pattern built from the track supply.** Opposite-hand turnouts joined by straights. Nothing to implement: reachability is computed from geometry, so a valid bypass already works. This explains the 8 turnouts per player, and makes §A.5's facing-point move a building achievement rather than a lucky draw. |
| 6 | How are Space-use cards played? | **At another player's district**, consuming a grid cell they wanted. This explains Water Column ("remove any Watertower in *your* district" — one an opponent gave you) and Vandalism (exploits a Hobo Jungle you were saddled with). A second, milder attack channel alongside the Action cards. **In solitaire they have no target** — see the note below. |
| 7 | Does a district grow both ways? | **Downward only** — the through-track sits at the card's top edge and everything diverges beneath it, matching `tracks.png`. A district is a Running Track with all Secondary Track hanging below. **Supersedes Gap 8's north-and-south stubs.** Consequences: buildable area halves; districts become long and shallow; §9's nine-spot Modifier neighbourhood needs rewording, since three of the nine spots are above the track and no longer exist. |
| 8 | Any cap on trains in play? | **No — Crew Trays are the only limit.** All 12 timetabled trains may end up scheduled; Extras run on top ad hoc; a due train with no free crew is held (§7). Already implemented. This makes the Crew Tray count (`players + 3`) the single most important balance dial, and "held" a common visible state. |
| 9 | What is the Second Section card? | **A card played on a train that is due out.** A second identical train runs immediately behind it — same number, rules and consist — and needs its own Crew Tray. It deliberately creates the following-train situation §8.1 makes the Superintendent rule on, so a player can force the game's central decision onto the table. Explains the green flags on the artwork. **Supersedes the "Sister trains" optional rule**, which should be removed from Appendix B. |
### Solitaire consequence of Q6
If Space-use cards are played at opponents, then in the **solitaire MVP they have no legal target**
12 of 115 cards (10.4%) become dead draws. Combined with the 10 Action cards, which are also
opponent-directed, **22 of 115 cards (19%) do nothing in a one-player game.**
That is a real finding for the MVP, and there are only a few honest ways to handle it: remove them
from a solitaire deck, allow them to be discarded freely, or accept that solitaire draws are a fifth
dead. Worth deciding explicitly rather than by default. Not blocking — flagged for after the
remaining questions.
### Consequence noted at the time of answering
Under Q1 + Q2, on a 3-player Division (4 Mainline cards, mixed terrain):
| | Mainline Stages | + Office stops | End-to-end |
| --- | ---: | ---: | ---: |
| Fast train | 6 | 3 | **9 Stages** |
| Slow train | 10 | 3 | **13 Stages** |
A Day is 12 Stages, so **every Slow train is still on the road when the next Day begins**, holding
its Crew Tray. With `players + 3` trays this will throttle freight hard. Expedite (Q3) relieves it
somewhat for the trains that carry it — but none of the Slow freight trains do. Worth re-measuring
once the speed model is implemented; the Crew Tray count is the obvious dial.
---
## 10. Questions only the designer can answer
1. **"Expedite"** — appears on seven trains and is never defined. Priority? No stopping? Extra speed?
2. **Speed numbers.** Do 60 and 30 mean "cells per Stage", "Stages to cross", or literal mph against
a 2-hour Stage? A Mainline card is "roughly a hundred miles" (§2.1), so 60 mph × 2 h ≈ one card
per Stage and 30 ≈ two — but this should be confirmed, not inferred.
3. **Fast vs Slow trains** — how do they interact with a card's speed? Does a Slow train take double
on every card, or only where the card distinguishes (Hilly's P60/F30)?
4. **Lockouts** (spreadsheet column E) — does one card prevent *building* the other, or prevent both
*operating*?
5. **Run-around** — we treat it as a card; it is not in the supply. Is it a pattern built from two
turnouts?
6. **Space-use cards** — played at yourself as a cost of drawing, or at opponents?
7. **Where the Office's junction stubs are.** `tracks.png` draws the through-line along the top edge
with curves diverging downward. Gap 8 assumed stubs above *and* below a centred track.
8. **Are all 22 trains in play at once**, or is the timetable still 12 slots with Extras run on top?
9. **Second Section** — is it a card played on a scheduled train, or its own train?
---
## 11. Recommended sequencing
The temptation is to rebuild everything at once. I would not.
1. **Transcribe the catalogue first** (`content.ts` from the spreadsheet and `Trains3.pdf`). Pure
data, no rules risk, and it makes the true scope concrete.
2. **Answer §10's questions**, particularly speed and Expedite — several later decisions hang on
them.
3. **Mainline card types and the speed model.** The largest mechanical gap and the one that
invalidates the current balance numbers.
4. **Track supply and curves**, including the sharp-curve double Move cost.
5. **Industry retune to 1-out/1-loader plus the modifier system**, then re-run the harness. Expect
very different numbers.
6. **Enhancements**, starting with Small Yard and ABS Signals — both change core loops.
7. **Action cards**, which is when multiplayer becomes a real game rather than parallel solitaire.
8. **Space-use cards** last.
**Do not retune anything against current measurements.** Gap 12's numbers describe a placeholder
ruleset. Re-measure after step 5 and treat everything before that as void.