v0.8.0.14 — the coaches that never come back, and a district that ends at its own sign
Six reports from the Day 2-3 playtest of v0.8.0.13. GAMES IN PROGRESS DO NOT SURVIVE THIS ONE. Modifiers are now bounded by the Limits, which makes a once-legal move illegal, so a save holding one is refused at that move: whistle-6945.day3.stage10 stops at intent 528 of 539. Jesse's call, knowing it strands the game on the box. The file is untouched and v0.8.0.13 still finishes it. The Sparrow running empty and Tom unable to unload his passengers are the same shortage from opposite ends, and both are the rules working as printed. §9.2 boarding discards the emptied coach into the CLASSIFICATION yard, detraining draws a fresh empty out of the DIVISION yard, and §2.2 sends Classification back only when the Division Yard runs bare — so coaches move one way. Measured over the save: sixteen in the Division Yard at setup, zero from Day 2 Stage 8 to the end, fifteen piled in Classification, the Division Yard steady at 46-47 freight cars with no prospect of going bare. Jesse's ruling is Gitea#2's: the shortage stays and the game says so. A train made up short now reports what its card wanted and why none is coming (`makeUpShort` — `trainNeedingCars` answered null for "done" and for "cannot be done" alike, so the phase moved on in silence); the yard panel warns while the condition lasts; the Depot's blocked panel was right all along. The modifier outside the Limits was working as designed and the design was Jesse's own call, now reversed. What decided it is what the board shows — a card beyond your own sign, in territory §8.1 and §10 reason about. The case that motivated the exemption was checked on the reported move rather than argued away: the Power Plant sat at (-1,3) against a sign at column 3 and two spots inside were free, legal and adjacent. Switching filled the history with coordinates — a line per move, plus one per mandatory coupling. It is still LOGGED in full; what the panel draws is the line saying somebody switched, the first move, work at an INDUSTRY (named, not a coordinate), the Small Yard sort, and a closing summary. The suppressed lines are still WRITTEN, marked `trace`: dropping them outright was the first attempt and the step-queue suite caught it, because dwellForStep pays nothing for a step that said nothing, so the board stopped replaying switching at all. The last move rides in the closing line rather than being kept in place — nothing knows a move was the last until the turn is over, by which time the line has been streamed to every client and cannot be revised. Two things fell out of reading those lines: every move ended with a tutorial sentence the opener already gives, and the move count said "of 6" with the six hardcoded, which is wrong on a night Stage. Make-up lines name their train — they all read "the train being made up", so looking back for train 10 found nothing under that name — and "a empty tank" is now "an empty tank". The Small Yard's options read as the train they would build instead of `[1,2,3,0]`; the one Jesse wanted was the first of five and unreadable. Two of those five were junk: bringing the last car to the end is the identity and would have spent a Move, and a two-car reversal duplicated its only real option. Both are filtered by the resulting order, not by the case that made them. A Small Yard may now put cars AHEAD of the engine, which was Jesse's own open question. Two sources disagreed and the design notes won: the v0.4.5 card text says the sort puts the engine at the nose, implications.md says "any order, including cars ahead of the engine". `engineAt` is optional on the intent, so older saves replay to the same train. The menu did not multiply — the engine is a separate short list against the consist as it stands, eight options for a four-car train rather than twenty. §8.2 needed no new code: badlyMadeUp is deliberately direction-free, so a PUSHING train is fit to run and only a broken-backed one is held. The button warns by asking that predicate rather than copying it, and immediately earned itself — every one of train 10's eight options is refused, the one asked for at the table included, because that train carries a caboose and each sort moves it off the rear. That is the right answer rather than a gap: the train is already made up, so every offer would break it, and the labels say which is which. A made-up order is always on the menu for a train that needs one, because "bring car k to the tail" is enumerated for every car and the caboose is one of them. Labels read WEST TO EAST, with the engine drawn as the board's own ◀ / ▶ arrow. "Front to back" is not a direction a table can read — which end is the front depends on which way the train points — and board-svg has reversed east-facing consists since v0.8.0, so the button now describes the same train as the picture. The Freight Agent, Porter and Laborer groups now say what the role is for, where the role is chosen. Tom reached for the Freight Agent to detrain passengers, which is a Porter's action in the Cargo phase; both halves were working and neither was visible. TODO closes #107 (the nose sort) and gains #108 (the coach ratchet, with the measurement, to revisit on a second game's data). 999 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DmdqqCNoiqE7GBo6wthBnR
This commit is contained in:
co-authored by
Claude Opus 5
parent
ad277fb994
commit
a6657241de
+160
@@ -19,6 +19,166 @@ page as `v0.1.0 · <sha> · <date>`, so what is deployed can always be identifie
|
||||
|
||||
---
|
||||
|
||||
## 0.8.0.14 — 2026-09-17
|
||||
|
||||
Six reports from the Day 2-3 playtest of v0.8.0.13. Two were the same shortage seen from opposite
|
||||
ends, one was a rule working as designed that Jesse has now reversed, and three were the screen
|
||||
saying too little or too much.
|
||||
|
||||
**THIS RELEASE STRANDS GAMES IN PROGRESS, INCLUDING THE ONE ON THE BOX.** Modifiers are now bounded
|
||||
by the Limits, which makes a once-legal move illegal — so a save holding one is refused at that move.
|
||||
Measured on the playtest save: `whistle-6945.day3.stage10` stops at intent 528 of 539, eleven moves
|
||||
from the end, on `card.play c55 → (-2,4)`. The file is untouched and v0.8.0.13 still finishes it.
|
||||
|
||||
### Every coach in the game was stuck in the Classification Yard
|
||||
|
||||
Two reports, one cause. The Sparrow (trains 5/6) calls for three coaches and nothing else, and ran
|
||||
the length of the Division empty; Tom had a loaded coach standing at his Depot and could find no way
|
||||
to unload the passengers. Both are §2.2 and §9.2 acting exactly as printed, and the combination is a
|
||||
one-way ratchet: boarding discards the emptied coach into the **Classification** Yard, detraining
|
||||
draws a fresh empty **out of the Division Yard**, and Classification comes back only when the
|
||||
Division Yard runs bare.
|
||||
|
||||
Measured across the save, because the shape of it is the point: sixteen coaches in the Division Yard
|
||||
at setup, **zero from Day 2 Stage 8 onward**, fifteen piled up in Classification — while the Division
|
||||
Yard sat at 46-47 freight cars and stopped draining, so the refill was never going to fire. Every
|
||||
passenger operation in the game was over, and four of the twelve timetabled trains carry nothing but
|
||||
coaches.
|
||||
|
||||
**Jesse's ruling: the rule stands, the game says so loudly.** The same ruling Gitea#2 got, and the
|
||||
same one 0.8.0.13 gave the blocked Depot panel. Three places say it now:
|
||||
|
||||
- **A train made up short reports it** (`makeUpShort`). `trainNeedingCars` returns null both when a
|
||||
consist is full and when the yard holds nothing it will take — the same answer for "done" and
|
||||
"cannot be done" — so the phase moved on in silence, and the only trace was a MADE UP line
|
||||
promising "now taking cars" with nothing after it. It now names what the card wanted, how many are
|
||||
waiting in Classification, and how far the Division Yard is from bare.
|
||||
- **The yard panel warns while the condition lasts**, rather than only at the moment a train goes
|
||||
short.
|
||||
- **The Depot's blocked panel already said it**, and still does — it was correct all along, off to
|
||||
the side, and read by nobody who had gone looking in the wrong place.
|
||||
|
||||
### A modifier may no longer stand outside the Limits
|
||||
|
||||
Reported as a bug and it was working as designed — the design being a call of Jesse's, recorded in
|
||||
`apply.ts`: a Modifier is not track, so a Facility standing at the limit kept all nine of its spots,
|
||||
because bounding the card looked like it would make it unplayable exactly where a district ends.
|
||||
**Reversed.** What decided it is what the board shows — Transmission Lines at (-2,4) with the sign at
|
||||
column 3 reads as building outside your own territory, and §8.1 and §10 both reason about what lies
|
||||
inside a player's Limits.
|
||||
|
||||
The feared case was checked on the move that prompted the change rather than argued away: the Power
|
||||
Plant was at (-1,3) against a sign at column 3, and (-2,2) and (-2,3) were both free, legal and
|
||||
inside. Six of the nine spots survive a Facility at the limit, and the sign moves outward as the
|
||||
Running Track grows (§2.1, Gap 4a).
|
||||
|
||||
### The history panel was full of coordinates
|
||||
|
||||
"Does switching show up in history at all?" — it all did. A six-Move turn wrote a line per move,
|
||||
every one of them a pair of grid coordinates, plus one per mandatory coupling. **Switching is still
|
||||
logged in full**; what changed is what the panel DRAWS: the line saying somebody switched, the first
|
||||
move of the turn, work at an **industry**, the Small Yard sort, and a closing summary.
|
||||
|
||||
**The suppressed lines are still written, marked `trace`, and that is not a detail.** Dropping these
|
||||
events was the first attempt and the step-queue suite caught it: `dwellForStep` gives a step no dwell
|
||||
when it produced no narration, so a switching move with no line became a silent step and the board
|
||||
stopped replaying switching altogether — the exact thing v0.8.0 was built to let a table watch. The
|
||||
tone is the seam. The caption keeps its text, the panel filters the tone.
|
||||
|
||||
**The last move rides in the closing line rather than being kept in place**, and it has to: nothing
|
||||
knows a move was the last until the turn is over, and by then the line has been written and streamed
|
||||
to every client (`server/session.ts` § `linesSince`), so it cannot be revised. `switchingEnded` says
|
||||
what the turn cost and where the crew was left — "finished switching — 3 of 6 Moves used, leaving
|
||||
Train 10 at the Small Yard".
|
||||
|
||||
Places are named rather than pointed at: `at the Freight House` and `the Small Yard` instead of
|
||||
`(1,1)`. Two smaller things fell out of reading these lines properly. Every move line ended with
|
||||
"The crew chip on the grid carries the whole train with it" — six times a turn, when the opener
|
||||
already says it once, and it pushed the useful half of the line out of the caption row. And the move
|
||||
count said "of 6" with the 6 hardcoded, which is simply wrong on a Reduced-Visibility night Stage
|
||||
where a turn gets five; the turn now carries its own allowance.
|
||||
|
||||
### Making up a train says which train
|
||||
|
||||
"I did not see anything in the history about making up train 10." It was all there — a MADE UP line
|
||||
and one line per car — and every one of those lines read "the train being made up", so a player
|
||||
looking back for train 10 found nothing under that name. `carPlacedOnTrain` and `carPassed` now carry
|
||||
the number, the way `trainArrived` carries its owner. Also "a empty tank" is now "an empty tank".
|
||||
|
||||
### The Small Yard offered permutations, not trains
|
||||
|
||||
The menu read `re-order consist [1,2,3,0]` — the engine's own array indices offered to a person. The
|
||||
option Jesse wanted was the **first of the five** and he could not tell which one it was. Each option
|
||||
now reads as the train it would build: `re-order to engine · loaded hopper · empty tank · caboose ·
|
||||
loaded boxcar (front to back)`.
|
||||
|
||||
One of the five re-ordered nothing at all and would still have spent a Move — bringing the LAST car
|
||||
to the end is the identity — and a two-car train's "full reversal" duplicated its only real option.
|
||||
Both are filtered by the resulting ORDER rather than by the case that produced them, so a new
|
||||
generator cannot bring either back. No typed-order box: `check` already accepts any permutation, so
|
||||
one is buildable, and Jesse declined it as more to go wrong for a labelling problem.
|
||||
|
||||
### A Small Yard may now put cars ahead of the engine
|
||||
|
||||
Jesse's own open question, discussed and then built. **Two sources disagreed and the design notes
|
||||
won.** The v0.4.5 card text says a train there may "reorder its entire consist **and put the engine
|
||||
at the nose**", which is what `consistSorted` did unconditionally. `implications.md`, drawn from the
|
||||
design source, says a train "may sort itself into any order, **including cars ahead of the engine**"
|
||||
— and records that the Small Yard is the answer the switching puzzle was designed to have.
|
||||
|
||||
`switch.sortConsist` carries an optional `engineAt`, absent meaning the nose, so every save written
|
||||
before this replays to exactly the train it built. **The menu did not multiply.** Offering every car
|
||||
order at every engine position takes a four-car consist from four options to twenty, which is the
|
||||
unreadability that started this; instead the engine is a separate short list offered against the
|
||||
consist as it stands — four re-orders and four engine positions, eight readable options. A player
|
||||
who wants both spends two Moves, the same price the yard charges for any second sort.
|
||||
|
||||
**§8.2 needed no new code, and the reason is worth stating because the obvious guess is wrong.**
|
||||
`badlyMadeUp` is deliberately direction-free: a train with its whole consist ahead of the engine is a
|
||||
PUSHING train and fit to run. What it refuses is a broken-backed train — the engine buried among its
|
||||
own cars — and a caboose anywhere but the end away from the engine. So the hold Jesse asked for was
|
||||
already there, and the button now warns before the Move is spent by asking that same predicate rather
|
||||
than keeping a copy of it.
|
||||
|
||||
That warning immediately earned itself: **every one of the eight options on train 10 is refused by
|
||||
§8.2**, including the arrangement asked for at the table, because that train carries a caboose and
|
||||
each sort moves it off the rear. The menu says so now instead of spending a Move to find out. It is
|
||||
also the correct answer rather than a gap — that train is ALREADY made up, so every sort on offer
|
||||
would break it — and the labels distinguish the two cases outright: `MADE UP, ready to leave` or
|
||||
`HELD at the Office: <why>`.
|
||||
|
||||
**A made-up order is always on the menu for a train that needs one**, which is worth stating because
|
||||
it looks as though it might not be. A yard sort serves two errands — pulling one car out to an end to
|
||||
be spotted, and putting the train back together to leave — and the curated orders are written for the
|
||||
first. They cover the second as a by-product: "bring car k to the tail" is enumerated for EVERY car,
|
||||
so bringing the CABOOSE to the tail is always among them. An explicit "make it up to leave" option
|
||||
was written and then deleted, because it produced exactly that order and was dropped by the dedupe
|
||||
every time.
|
||||
|
||||
### West to east, the way the board draws it
|
||||
|
||||
"Front to back" is not a direction a table can read: which end is the front depends on which way the
|
||||
train is pointed, and the board has drawn the crew strip **west on the left** since v0.8.0 —
|
||||
reversing the consist for an east-facing train so its nose lands at the east end, with the engine as
|
||||
a ◀ or ▶ arrow. The sort labels now read the same way, so the button and the picture describe the
|
||||
same train and "ahead of" and "behind" the engine are read off the strip rather than asserted:
|
||||
|
||||
```
|
||||
re-order — west to east: loaded boxcar · caboose · empty tank · loaded hopper · ENGINE ▶ · HELD at the Office: the caboose must be at the rear of the train
|
||||
put the whole consist ahead of the engine — west to east: ENGINE ▶ · caboose · empty tank · loaded hopper · loaded boxcar
|
||||
```
|
||||
|
||||
`badlyMadeUp`'s "1 car(s) ahead of it" is a real plural now; it reaches a player through the held
|
||||
train's reason as well as through these labels.
|
||||
|
||||
### A role says what it is for
|
||||
|
||||
Tom reached for the Freight Agent to unload passengers, which it has never done — detraining is a
|
||||
**Porter's** action in the Cargo phase. Both halves were working and neither was visible. The
|
||||
Freight Agent, Porter and Laborer groups now carry a sentence saying what the role does, where the
|
||||
role is chosen, rather than leaving a player who picked the wrong one to discover it by finding
|
||||
nothing there.
|
||||
|
||||
## 0.8.0.13 — 2026-09-16
|
||||
|
||||
Nine reports from the Day 1–2 playtest of v0.8.0.12. One was a real bug that cost a car, one was a
|
||||
|
||||
Reference in New Issue
Block a user