v0.6.1 — five of six playtest bugs: one button per train, and a load that has to go somewhere

Gameplay testing on 0.4.9d returned six reports. Five are fixed; the sixth could not be
reproduced and is written up in TODO.md with the two questions that would pin it down.

TWO TRAINS AT ONE PLATFORM ANSWERED TO ONE BUTTON. `porter.board` and `porter.detrain`
carried no tray, so there was one button per platform however many trains stood at it and
the reducer filled the first empty coach on the A/D tracks. `check` and the reducer were not
even asking the same question: `check` skipped a train whose card refuses passenger work and
the reducer did not. Both intents now carry an optional `trayId`, one function resolves the
train and the coach for check/execute/reduce alike, `legal.ts` offers one candidate per train,
and the label names it.

A LOAD COULD BE MADE AND BROKEN WITHOUT GOING ANYWHERE. A Freight House could unload the
boxcar it had just loaded; a platform could detrain the passengers it had just boarded. Full
Revenue at both ends for a movement that never happened. Jesse's rule: a load made anywhere in
an Office Area may not be broken anywhere in that Office Area, ever — it has to be carried to
another district. The load carries the seat that made it (`RollingStock.origin`), stripped by
`pooled` at every yard push. Measured at -0.60 +/- 0.10 Revenue a game (t = -6.1) over 400
paired deals: 78 worse, 3 better, 319 unchanged — free Revenue coming off the board, not a nerf.

THE GROCER'S WAREHOUSE SHIPPED AND THE REFINERY RECEIVED. Both were `flow: 'both'` on the
reading that "Freight House" was a collective term for exactly those two, and therefore what
§9.3 described. The engine has dealt a Freight House CARD since before v0.4.9, so §9.3 names
it and the argument goes. The card set agrees: all three Refinery modifiers grant +1 outbound.
Refinery outbound-only, Grocer's inbound-only, Freight House the one two-way industry — which
leaves exactly the one same-district pairing the rule above refuses.

NOT REPRODUCED: cars left behind when backing up over them. Five layouts tried, including cars
spotted at an industry; every one couples the lot. Three are pinned in `apply.test.ts`. One way
to create such cars was closed anyway — `flyingSwitch` wrote its cut past `carsOn`.

Both published replays that had gone dead were re-recorded; a rules change retires a save, and
`harness.test.ts` is what catches it.

The same change ships as v0.4.9e on the 0.4.9 line, branched from the v0.4.9d commit — the engine
files these fixes touch are identical across the two lines, so the patch applied cleanly both ways.

Also carries the two "Queued 2026-08-22, from playing on StartOS" TODO items that were staged
before this work started (Games in Progress readability, and getting back into a game after
losing a browser). They are notes, and items 9-12 below them are numbered against them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011nbvwWMef8CuEP6t5cgkTv
This commit is contained in:
Jesse.Markowitz
2026-08-21 23:54:24 -04:00
co-authored by Claude Opus 5
parent 40f07b0710
commit 83a5450866
25 changed files with 2853 additions and 1811 deletions
+21 -11
View File
@@ -42,14 +42,14 @@ Operational Rail wheel icon, an industry track of the stated length, Laborer ico
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
| Mine Tipple | Hopper | Outbound only | 3 | 3 | — | 4 | 2 |
| Produce Shed | Reefer | Outbound only | 2 | 2 | — | 3 | 2 |
| Grocer's Warehouse | Boxcar | Both | 1 | 1 | 1 | 3 | 3 |
| Oil Refinery | Tank car | Both | 1 | 1 | 1 | 4 | 3 |
| Power Plant | Hopper | Inbound only | 3 | — | 3 | 4 | 2 |
| Grocer's Warehouse | Boxcar or reefer | Inbound only | 1 | — | 1 | 3 | 3 |
| Oil Refinery | Tank car | Outbound only | 1 | 1 | — | 4 | 3 |
| Power Plant | Hopper or tank car | Inbound only | 3 | — | 3 | 4 | 2 |
| Freight House | Boxcar | Both | 1 | 1 | 1 | — | 6 |
Directions follow the commodity: coal originates at a Mine Tipple and is consumed at a Power Plant;
produce ships out; a warehouse and a refinery do both. This gives §9 all three of its cases —
outbound-only, inbound-only, and both.
produce ships out; a warehouse receives. This gives §9 all three of its cases — outbound-only,
inbound-only, and both — with the **Freight House the one card that does both**.
**"Freight House" IS a card** (corrected v0.5.0) — a sixth industry, dealt 6 copies, one Laborer and
one slot each direction. An earlier pass here read §9.3/Appendix A's "Passenger Facilities and
@@ -57,6 +57,15 @@ Freight Houses permit cars to move each direction" as meaning "Freight House" wa
*collective term* for the Grocer's Warehouse and the Oil Refinery, never a card of its own — that
reading was wrong; the engine deals it as a real sixth industry (`content.ts`'s `freightHouse`
profile) and this table follows the engine.
**The Grocer's Warehouse and the Oil Refinery are ONE-WAY** (corrected v0.4.9e). The Direction column
read "Both" for both of them, and that was the *other half* of the same mistaken reading: if "Freight
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
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
re-verified against the engine in this pass — only Grocer's Warehouse, Oil Refinery and Freight
House were. `mineTipple` and `powerPlant` in `content.ts` are also base 1/1/1, same as the three
@@ -91,9 +100,10 @@ deliberately slower industries, unable to quite keep up with a dedicated player.
That is why Laborer counts track Outbound capacity: Mine Tipple 3/3, Power Plant 3/3, Produce Shed
2/2, Grocer's Warehouse 2/2. The numbers are derived from the action budget, not chosen freely.
The Oil Refinery is the exception at 3 Laborers against 2+2 capacity, and deliberately so: it serves
two flows through one three-box pipeline, so its pipeline stays fuller than a one-way facility's and
the third Laborer is earning its keep.
<!-- The paragraph that stood here explained the Oil Refinery's third Laborer as the price of serving
two flows through one pipeline. It serves one flow (v0.4.9e), so the explanation is gone with the
premise; whether the Laborer count is still right is part of the same unverified block flagged
above and in TODO.md. -->
Even so, Laborers are rarely what limits a player — spotting the empty car and hauling the loaded one
away both cost switching actions from the same budget. See §7.
@@ -269,12 +279,12 @@ with all boxes full:
| Car | Facility demand | Supply | Headroom |
| --- | ---: | ---: | --- |
| Hopper | Mine Tipple 3×2 + Power Plant 3×2 = 12 | 12 | exactly met |
| Tank | Oil Refinery (2+2)×2 = 8 | 8 | exactly met |
| Boxcar | Grocer's (2+2)×2 = 8 | 12 | 4 spare |
| Tank | Oil Refinery 2×2 = 4 | 8 | 4 spare (was "exactly met" while the Refinery was two-way) |
| Boxcar | Grocer's 2×2 = 4 | 12 | 8 spare (same correction) |
| Reefer | Produce Shed 2×2 = 4 | 8 | 4 spare |
| Coach | Terminal 4+4, per Office | 16 | scales with Office count |
Hoppers and tank cars are exactly met in the theoretical worst case, which cannot occur in practice —
Hoppers are exactly met in the theoretical worst case, which cannot occur in practice —
only 10 freight facility cards exist across a 52-card deck shared by all players, and the §2.2
Classification Yard recycle returns stock to the Division Yard whenever it empties. Both are worth
watching in playtesting.
+1 -1
View File
@@ -25,7 +25,7 @@ Every defined term, alphabetized for lookup. The core comes from the Definitions
| **Extra Train** | A one-and-done train; its card returns to the Salvage Yard on completion. Head-on card image, so the drawing player picks its direction. Numbered with an "X" prefix; the following number gives its seniority, and it yields to the Timetabled train of that number. | §2.3, §8 |
| **Facility** | A business which loads/unloads cargo and freight. | §2.5 |
| **Freight Facility** | Mine Tipples, Produce Sheds, Grocer's Warehouses, Oil Refineries, Power Plants, Freight Houses. Some allow only outbound, some only inbound, some both. Per-card values in §12.5. | §9, §12.5 |
| **Freight House** | A sixth Freight Facility card (corrected v0.5.0 — an earlier pass here read it as a collective term for the Grocer's Warehouse and the Oil Refinery rather than a card of its own; it is dealt like any other industry). Permits both directions, the same as a Grocer's Warehouse or Oil Refinery. | §9.3, §12.5 |
| **Freight House** | A sixth Freight Facility card (corrected v0.5.0 — an earlier pass here read it as a collective term for the Grocer's Warehouse and the Oil Refinery rather than a card of its own; it is dealt like any other industry). **The only industry that permits both directions** — the Grocer's Warehouse receives and the Oil Refinery ships, one way each (v0.4.9e). | §9.3, §12.5 |
| **Highball** | When a train holding at an Office automatically departs. | §2.4 |
| **Home Office** | The primary face-down deck cards are drawn from. 52 cards. | §2.6, §12.1 |
| **Hopper** | Coal rolling stock (brown = loaded, white = empty). | §2.2 |
+7 -2
View File
@@ -670,10 +670,15 @@ balance work was possible.
| --- | --- | --- | ---: | ---: | ---: | ---: |
| Mine Tipple | Hopper | Outbound | 3 | 3 | — | 4 |
| Produce Shed | Reefer | Outbound | 2 | 2 | — | 3 |
| Grocer's Warehouse | Boxcar | Both | 2 | 2 | 2 | 3 |
| Oil Refinery | Tank | Both | 3 | 2 | 2 | 4 |
| Grocer's Warehouse | Boxcar | Inbound | 2 | — | 2 | 3 |
| Oil Refinery | Tank | Outbound | 3 | 2 | — | 4 |
| Power Plant | Hopper | Inbound | 3 | — | 3 | 4 |
*Amended v0.4.9e.* The warehouse and the refinery were briefly "Both", on the reading that "Freight
House" was a collective term for exactly those two and therefore what §9.3's "permit cars to move
each direction" described. The Freight House turned out to be a card of its own (v0.5.0), and
playtesting confirmed the one-way reading the sheet always printed.
*Rationale.* Directions follow the commodity and give §9 all three of its stated cases. Bulk
industries get more Laborers and a 4-car track so the types feel distinct when choosing what to
build — but the counts stay moderate because Laborers are **not** the binding constraint (see 10e),
+6 -4
View File
@@ -736,8 +736,8 @@ Modifier effects, and track geometries — is catalogued in
| --- | --- | --- | ---: | ---: | ---: | ---: |
| Mine Tipple | Hopper | Outbound | 3 | 3 | — | 4 |
| Produce Shed | Reefer | Outbound | 2 | 2 | — | 3 |
| Grocer's Warehouse | Boxcar | Both | 2 | 2 | 2 | 3 |
| Oil Refinery | Tank | Both | 3 | 2 | 2 | 4 |
| Grocer's Warehouse | Boxcar | Inbound | 2 | — | 2 | 3 |
| Oil Refinery | Tank | Outbound | 3 | 2 | — | 4 |
| Power Plant | Hopper | Inbound | 3 | — | 3 | 4 |
| Office | Porters | Green slots | Red slots |
@@ -755,8 +755,10 @@ Modifier effects, and track geometries — is catalogued in
| Section Gang | +1 Laborer or +1 Porter |
**"Freight House"** (§9.3, Appendix A) is a Freight Facility card (corrected v0.5.0 — previously
read as not a card, only a collective term for a facility that both loads and unloads). It permits
both directions, the same as the Grocer's Warehouse and the Oil Refinery.
read as not a card, only a collective term for a facility that both loads and unloads). It is the
**only** industry that permits both directions: the Grocer's Warehouse receives and the Oil Refinery
ships, one way each (corrected v0.4.9e from playtesting — the "Both" reading was the other half of
the same mistake about what "Freight House" meant).
---