Files
station-master-startos/startos/versions/current.ts
T
JesseandClaude Opus 5 410803c478 0.8.0.17:0 — bundle Station Master v0.8.0.17
Four fixes from a live playtest of 0.8.0.16, every one of them the same shape:
the game knew something and the screen did not say it.

GAMES IN PROGRESS RESUME NORMALLY, and unlike 0.8.0.16 that needs no measuring:
no predicate in apply.ts, legal.ts or advance.ts changed its answer, because no
rule changed. The release is a label, three drawn marks, a log line and a set of
published documents.

ABS SIGNALS COULD BE PLAYED ON ONLY ONE MAINLINE CARD while its own tooltip said
"any Mainline card". The engine had always allowed all of them; every placement
simply described itself with the same words, and the action list drops duplicate
labels, so all but the lowest-index card were discarded before the menu saw
them. The third time that trap has fired in this codebase, after a turnout's two
rotations and the three Department discards.

NOTHING ON A MAINLINE CARD SHOWED WHAT WAS STANDING ON IT. A card carrying ABS
now draws a signal mast with a lit lamp, and the Heavy Grade modifiers draw as
BRK, AIR and HLP. Until now the only way to learn a card was protected — which
decides whether a second train on it is safe — was to hover it.

THE FREIGHT AGENT CLAIMED A CAR MOVED WHEN NONE HAD. §6.3 requires no action and
the bot declines deliberately rather than unjam a healthy box and destroy a
stocked load. It says what it may do now, says when it idled and why, and names
the industry rather than a grid coordinate.

THE LOG AND THE ACTION LIST SPELLED THE SAME SQUARE DIFFERENTLY, one in map
order and one in storage order. Fixed in favour of the map.

THE WHOLE GUIDE IS NOW SERVED BY THIS PACKAGE AND REACHABLE FROM A RUNNING GAME,
under the This Game card: quickstart.md, rules.md, home-deck.md,
mainline-deck.md, components.md and the generated rules/as-built.md. 0.8.0.16
published the Quickstart alone, and the five links in its own "Where to read
more" table all 404'd on the box — verified by fetching each path inside the
running container. The references also dropped the v0.4.5 from their filenames:
they described v0.8.0.16 and had since the v0.8.0.15 audit, so the stamp read as
documentation five minor versions stale. They are served as text/plain, so their
tables render as rows of pipes; a styled page is filed upstream as TODO #109.

Packaging is the submodule pin, the version and the words. No action, route,
file model or interface changed, and the whole release is inside the bundled
game. README, instructions.md and the release notes in all five locales say that
games in progress are unaffected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
2026-09-21 06:20:11 -04:00

319 lines
27 KiB
TypeScript

import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk'
export const current = VersionInfo.of({
// `<upstream>:<downstream>` — the upstream half tracks the bundled Station Master tag exactly
// (`versions.md`'s consistency checklist), so bumping the submodule pin and bumping this are one
// action. The downstream half moves only for packaging-only changes, and RESETS to `:0` when the
// upstream half moves.
//
// FOUR COMPONENTS IS FINE. ExVer's upstream half is an arbitrary-length dotted number, not semver
// — checked against the SDK's own parser rather than assumed, since every example in `versions.md`
// has three: `0.7.9.8:0` parses to upstream `[0,7,9,8]`, which sorts above `[0,7,9]`, so a box on
// 0.7.9:0 sees this as an update rather than refusing it as a downgrade.
version: '0.8.0.17:0',
releaseNotes: {
en_US:
'Bundles Station Master v0.8.0.17 — four fixes from a live playtest, every one of them the game ' +
'knowing something the screen did not say. **Games already running on this server resume ' +
'normally**: no rule changed. **ABS Signals could be played on only one Mainline card**, although ' +
'the card says any of them. Nothing was wrong with the rule — the game described every one of ' +
'those placements with the same words, and the action list hides duplicates, so all but one ' +
'disappeared before you saw them. **You can now see what is standing on a Mainline card.** One ' +
'carrying ABS Signals draws a signal mast with a lit lamp at its corner, and the Heavy Grade ' +
'modifiers draw as BRK, AIR and HLP beside the card\'s name. None of them marked the board at all ' +
'before: the only way to find out a card was protected — which is what decides whether a second ' +
'train on it is safe — was to hover it and read the tooltip. **The Freight Agent says what it ' +
'actually did.** The line read "one car moved to or from a facility" even when nothing had moved, ' +
'and then said nothing more. Doing nothing is a legitimate choice — the rules ask for no action, ' +
'and a bot declines rather than break open a working box to look busy — so it now says when it ' +
'has, and why; and when work does happen it names the car, the industry by name instead of a grid ' +
'coordinate, and which way the car went. **The whole guide is reachable from inside a game**, in ' +
'the This Game card: the Quickstart, the Rules in full, every card, both deck references and the ' +
'Components list, each opening in a new tab so reading one mid-turn does not lose your game. The ' +
'previous release published the Quickstart alone and the links at its foot all led nowhere. They ' +
'are served as plain text for now, so their tables come out as rows of pipes. **Smaller:** the ' +
'action list and the history log had been printing the same square in two different orders, and ' +
'now agree.',
es_ES:
'Incluye Station Master v0.8.0.17 — cuatro correcciones de una partida de prueba, todas del mismo ' +
'tipo: el juego sabía algo que la pantalla no decía. **Las partidas ya en curso en este servidor ' +
'se reanudan con normalidad**: no ha cambiado ninguna regla. **Las Señales ABS solo podían ' +
'jugarse en una carta de Línea Principal**, aunque la carta dice que en cualquiera. La regla ' +
'nunca estuvo mal: el juego describía todas esas jugadas con las mismas palabras, y la lista de ' +
'acciones oculta los duplicados, así que todas menos una desaparecían antes de que las vieras. ' +
'**Ahora se ve qué hay sobre una carta de Línea Principal.** La que lleva Señales ABS dibuja un ' +
'mástil de señal con una luz encendida en su esquina, y los modificadores de Pendiente Fuerte ' +
'aparecen como BRK, AIR y HLP junto al nombre de la carta. Antes ninguno marcaba el tablero: la ' +
'única forma de saber que una carta estaba protegida — lo que decide si un segundo tren sobre ' +
'ella es seguro — era pasar el ratón por encima. **El Agente de Carga dice lo que hizo ' +
'realmente.** La línea decía "un vagón movido desde o hacia una instalación" incluso cuando nada ' +
'se había movido, y luego callaba. No hacer nada es una elección legítima — las reglas no exigen ' +
'ninguna acción, y un bot prefiere eso a destrozar una caja que funciona — así que ahora lo dice, ' +
'y explica por qué; y cuando sí hay trabajo, nombra el vagón, la industria por su nombre en vez ' +
'de una coordenada, y en qué dirección fue. **Toda la guía es accesible desde dentro de la ' +
'partida**, en la tarjeta Esta Partida: la Guía Rápida, las Reglas completas, todas las cartas, ' +
'ambas referencias de mazos y la lista de Componentes, cada una en una pestaña nueva para no ' +
'perder la partida. La versión anterior publicaba solo la Guía Rápida y los enlaces de su pie no ' +
'llevaban a ninguna parte. Se sirven como texto plano por ahora, así que sus tablas salen como ' +
'filas de barras. **Menor:** la lista de acciones y el registro imprimían la misma casilla en dos ' +
'órdenes distintos, y ahora coinciden.',
de_DE:
'Enthält Station Master v0.8.0.17 — vier Korrekturen aus einem Testspiel, alle von derselben Art: ' +
'das Spiel wusste etwas, das der Bildschirm nicht sagte. **Bereits laufende Partien auf diesem ' +
'Server werden normal fortgesetzt**: keine Regel hat sich geändert. **ABS-Signale konnten nur auf ' +
'einer einzigen Streckenkarte gespielt werden**, obwohl die Karte jede erlaubt. Die Regel war nie ' +
'falsch — das Spiel beschrieb alle diese Züge mit denselben Worten, und die Aktionsliste blendet ' +
'Duplikate aus, sodass alle bis auf einen verschwanden, bevor man sie sah. **Man sieht jetzt, was ' +
'auf einer Streckenkarte steht.** Eine Karte mit ABS-Signalen zeichnet einen Signalmast mit ' +
'brennender Lampe in ihrer Ecke, und die Steigungs-Modifikatoren erscheinen als BRK, AIR und HLP ' +
'neben dem Kartennamen. Bisher markierte keiner von ihnen das Brett: Um zu erfahren, dass eine ' +
'Karte geschützt ist — was entscheidet, ob ein zweiter Zug darauf sicher ist — musste man mit der ' +
'Maus darüberfahren. **Der Frachtagent sagt, was er wirklich getan hat.** Die Zeile lautete "ein ' +
'Wagen zu oder von einer Anlage bewegt", auch wenn sich nichts bewegt hatte, und schwieg dann. ' +
'Nichts zu tun ist eine legitime Wahl — die Regeln verlangen keine Aktion, und ein Bot verzichtet ' +
'lieber, als eine funktionierende Box aufzubrechen — also sagt er es jetzt und begründet es; und ' +
'wenn gearbeitet wird, nennt er den Wagen, die Industrie beim Namen statt einer Koordinate, und ' +
'die Richtung. **Die ganze Anleitung ist aus dem laufenden Spiel erreichbar**, in der Karte Diese ' +
'Partie: Schnellstart, die vollständigen Regeln, jede Karte, beide Deck-Referenzen und die ' +
'Komponentenliste, jeweils in einem neuen Tab, damit das Lesen die Partie nicht verliert. Die ' +
'vorherige Version veröffentlichte nur den Schnellstart, und die Links an seinem Fuß führten ins ' +
'Leere. Sie werden vorerst als reiner Text ausgeliefert, ihre Tabellen erscheinen also als Reihen ' +
'von Strichen. **Kleineres:** Aktionsliste und Verlauf gaben dasselbe Feld in zwei verschiedenen ' +
'Reihenfolgen aus und stimmen nun überein.',
pl_PL:
'Zawiera Station Master v0.8.0.17 — cztery poprawki z rozgrywki testowej, wszystkie tego samego ' +
'rodzaju: gra wiedziała coś, czego ekran nie mówił. **Partie już trwające na tym serwerze ' +
'wznawiają się normalnie**: żadna zasada się nie zmieniła. **Sygnały ABS można było zagrać tylko ' +
'na jednej karcie Magistrali**, choć karta mówi o dowolnej. Zasada nigdy nie była błędna — gra ' +
'opisywała wszystkie te zagrania tymi samymi słowami, a lista akcji ukrywa duplikaty, więc ' +
'wszystkie poza jednym znikały, zanim je zobaczyłeś. **Teraz widać, co stoi na karcie ' +
'Magistrali.** Karta z Sygnałami ABS rysuje maszt sygnałowy z zapaloną lampą w rogu, a ' +
'modyfikatory Stromego Podjazdu pojawiają się jako BRK, AIR i HLP obok nazwy karty. Wcześniej ' +
'żaden z nich nie znaczył planszy: jedynym sposobem, by dowiedzieć się, że karta jest chroniona — ' +
'co decyduje, czy drugi pociąg na niej jest bezpieczny — było najechanie na nią kursorem. **Agent ' +
'Towarowy mówi, co naprawdę zrobił.** Linia brzmiała "jeden wagon przesunięty do lub z zakładu" ' +
'nawet wtedy, gdy nic się nie ruszyło, i potem milkła. Nicnierobienie to uprawniony wybór — ' +
'zasady nie wymagają żadnej akcji, a bot woli odpuścić, niż rozbić działającą skrzynkę — więc ' +
'teraz to mówi i wyjaśnia dlaczego; a gdy praca się odbywa, nazywa wagon, zakład po nazwie ' +
'zamiast współrzędnych, i kierunek. **Cały przewodnik jest dostępny z wnętrza gry**, w karcie Ta ' +
'Partia: Szybki start, pełne zasady, każda karta, obie referencje talii i lista komponentów, ' +
'każda w nowej zakładce, by czytanie nie zgubiło partii. Poprzednie wydanie publikowało tylko ' +
'Szybki start, a odnośniki u jego stopy prowadziły donikąd. Na razie są podawane jako zwykły ' +
'tekst, więc ich tabele wychodzą jako rzędy kresek. **Drobne:** lista akcji i dziennik wypisywały ' +
'to samo pole w dwóch różnych kolejnościach, a teraz są zgodne.',
fr_FR:
'Contient Station Master v0.8.0.17 — quatre corrections issues d\'une partie de test, toutes de la ' +
'même nature : le jeu savait quelque chose que l\'écran ne disait pas. **Les parties déjà en cours ' +
'sur ce serveur reprennent normalement** : aucune règle n\'a changé. **Les Signaux ABS ne ' +
'pouvaient être joués que sur une seule carte de Grande Ligne**, alors que la carte en autorise ' +
'n\'importe laquelle. La règle n\'a jamais été fautive : le jeu décrivait tous ces placements avec ' +
'les mêmes mots, et la liste d\'actions masque les doublons, de sorte que tous sauf un ' +
'disparaissaient avant que vous les voyiez. **On voit maintenant ce qui se trouve sur une carte ' +
'de Grande Ligne.** Celle qui porte des Signaux ABS dessine un mât de signal avec une lampe ' +
'allumée dans son coin, et les modificateurs de Forte Rampe apparaissent en BRK, AIR et HLP à ' +
'côté du nom de la carte. Auparavant aucun ne marquait le plateau : le seul moyen d\'apprendre ' +
'qu\'une carte était protégée — ce qui décide si un second train peut y rouler sans risque — était ' +
'de la survoler. **L\'Agent de Fret dit ce qu\'il a réellement fait.** La ligne indiquait "un wagon ' +
'déplacé vers ou depuis une industrie" même quand rien n\'avait bougé, puis se taisait. Ne rien ' +
'faire est un choix légitime — les règles n\'exigent aucune action, et un bot préfère s\'abstenir ' +
'plutôt que d\'éventrer une case qui fonctionne — alors il le dit désormais, et explique pourquoi ' +
'; et quand il y a du travail, il nomme le wagon, l\'industrie par son nom plutôt qu\'une ' +
'coordonnée, et le sens du mouvement. **Tout le guide est accessible depuis une partie en ' +
'cours**, dans la carte Cette Partie : le Démarrage rapide, les Règles complètes, toutes les ' +
'cartes, les deux références de decks et la liste des Composants, chacune dans un nouvel onglet ' +
'pour ne pas perdre la partie. La version précédente ne publiait que le Démarrage rapide, et les ' +
'liens en bas de page ne menaient nulle part. Ils sont servis en texte brut pour l\'instant, leurs ' +
'tableaux sortent donc en rangées de barres. **Mineur :** la liste d\'actions et l\'historique ' +
'écrivaient la même case dans deux ordres différents, et concordent désormais.',
},
migrations: {
/**
* NOTHING TO CARRY, AND CHECKED THE SAME NARROW WAY v0.7.9.8's ENTRY WAS.
*
* The rule this package lives by is in the game's README: a save is a seed plus the moves
* played, replayed through the CURRENT rules, so the only thing that strands an older save is a
* change that makes a once-legal move illegal. So the question is never "how big was the
* release" — v0.8.0 is a large one — but "did any predicate change its answer".
*
* Measured with `git diff v0.7.9.8..v0.8.0.1 -- src/engine/`. The WHOLE engine diff is eight
* lines:
* four `GameEvent` types (`trayMoved`, `carsCoupled`, `carsDropped`, `consistSorted`) gained a
* `player` field, and the four places that build them pass it. `check()` is untouched, `legal.ts`
* and `advance.ts` are untouched, and no predicate anywhere was edited. Games in progress resume,
* and the release notes say so in all five locales rather than leaving it to be discovered.
*
* EVENTS ARE NOT PERSISTED, so widening four of them cannot invalidate anything on disk: a
* `SavedGame` is `{ seed, config, history: Intent[], … }` and the events are derived by replaying
* it. The narration TEXT of two lines changed with them ("Moved Train 3 …" where it used to read
* "CREW moved …"), which a resumed game simply regenerates — the log is not stored either.
*
* WHAT IS NOT COVERED BY THAT ARGUMENT, and why it still does not need a migration: the wire
* between this server and a browser gained a lot. `Push` now carries ordered presentation steps
* and a public-board baseline, and the board deltas changed shape. None of it is on disk, and a
* browser reloads onto the new page as part of the update, so there is no version skew to
* migrate — the same reasoning v0.7.9.8 used for its own `Frame` changes.
*
* v0.8.0.1 ADDED NOTHING TO THIS ARGUMENT: `git diff v0.8.0..v0.8.0.1 -- src/engine/` is empty.
* It changed `sim/pacing.ts`, `web/step-queue.ts` and `web/main.ts` — how long a step is shown
* and when the queue calls itself idle — which is presentation and touches neither the rules nor
* anything on disk.
*
* v0.8.0.2 DOES TOUCH THE ENGINE, and it is worth being exact about why that is still nothing to
* migrate. `git diff v0.8.0.1..v0.8.0.2 -- src/engine/` is three added lines: `collisionsPrevDay`
* declared on `GameState`, initialised to 0 in `setup.ts`, and assigned at the Day rollover in
* `advance.ts`. It is a counter that nothing checks — no predicate reads it, so no once-legal move
* became illegal.
*
* v0.8.0.3 THROUGH v0.8.0.7 ADDED NOTHING: `git diff v0.8.0.2..v0.8.0.7 -- src/engine/` is empty.
* One moved the Skip button, changed what the waiting row says, and stopped the speed control
* stretching the clock; one took a hostname out of comments; the last drew the Home Office deck
* and lit the pile a watched move touched, which is a diff of two frames the client already
* holds. None of it is a rule, and none of it is on disk.
*
* v0.8.0.8 IS DIFFERENT AND IS THE ONE TO READ CAREFULLY: it changes a RULE (Gitea#23). When the
* Home Office deck is reshuffled, a timetabled train sitting in the SALVAGE YARD is no longer
* recovered — it was played, its number is on the timetable, and it cannot be run twice. The same
* card in a DEPARTMENT was discarded rather than played and still comes back, as does any Extra.
* A duplicate went with it: `trainScheduled` had been pushing a synthetic `train-<n>` beside the
* real card, so four scheduled trains left eight entries in a pile of four.
*
* GAMES IN PROGRESS STILL RESUME, and the reason is the narrow one this package always asks
* (README § Design notes): a save is a seed plus the moves played, replayed through the CURRENT
* rules, so what strands one is a change that makes a once-legal move ILLEGAL. Nothing here does.
* `check()` is untouched; a draw is a draw whatever lies on top of the deck. What differs is the
* Salvage Yard's depth, which was double-counting, and which cards a reshuffle returns — and a
* reshuffle is effectively unreachable in ordinary play: eight games driven to 4000 moves across
* eight seeds produced ZERO. A game that had somehow reshuffled would replay to a different deck
* order rather than refusing to replay, which is worth knowing and is not the same as breaking.
*
* v0.8.0.9 TOUCHES THE ENGINE FOR SPEED, AND PROVED IT CHANGED NOTHING. `git diff v0.8.0.8..v0.8.0.9
* -- src/engine/` adds a route cache scoped to one unchanged position (`withRouteCache`), splits
* `applyIntent` into `prepareIntent` + `commitEvents`, trims allocation in `exploreMoves`, adds
* `legalSwitchingActions`, and exports `badlyMadeUp`, `protoCard` and `extendLimitsIfNeeded` for the
* bot. No predicate's answer changed: every event and intent of 32 seeded games hashed identical before
* and after each step, and the game's `test/route-cache.test.ts` pins the split. Everything else is the
* developer bot, whose past moves are already intents in a save. Games in progress resume.
*
* v0.8.0.10 IS THE FIRST BUMP THAT BREAKS RESUMES, AND IT DOES SO DELIBERATELY. It corrects WHEN §8.1
* asks the Superintendent to rule (Gitea#26): a train on a card BEHIND the one departing is nobody's
* concern, and was being counted. A save is the seed and the moves replayed through the CURRENT rules,
* so a game holding a `mainline.clearance` the rules no longer ask for is refused at that move with
* NO_PENDING_DECISION — `tryResumeSession` reports which move, and `index.ts` logs the refusal and
* leaves the file alone. Measured before shipping: 40 four-seat co-op games recorded by bots under
* v0.8.0.9 and replayed under this release — 28 stop, usually 5-40% of the way in. Jesse's call
* (2026-09-15): no games in progress need keeping, so this ships without a per-game switch for the old
* rule, and the release notes say so in all five locales. A game worth finishing can be finished by
* putting v0.8.0.9 back — the save file is untouched.
*
* The rest of the release is the screen and the log — who the board says it is waiting on, what the
* history says and when it says it, a flash on a realigned Mainline card — plus one new read-only
* route (`GET /api/save?token=…`) that hands a seated player their own save. None of it is on disk.
*
* A NEW STATE FIELD CANNOT STRAND A SAVE HERE, which is the property worth naming rather than
* re-deriving: a `SavedGame` holds `{ seed, config, history }` and NOT a serialised `GameState`.
* Resuming calls `createGame` — which fills the new field from `setup.ts` — and then replays the
* intents through the current rules, so the field is populated on the way past. There is no old
* shape on disk for a new field to be missing from.
*
* THE ONE THING THAT WOULD HAVE NEEDED CARE, had it been built the way the plan first described:
* the display-step collector runs inside `submit()`, and the resume path (`fromMultiplayerSave`)
* deliberately does not go through `submit()`. So replaying a saved game emits no steps and burns
* no sequence numbers. A test in the game pins that, because it is a property rather than an
* accident.
*
* v0.8.0.11 RESUMES, AND IT WAS MEASURED THE SAME NARROW WAY — which matters more than usual
* here, because the release immediately before it is the one that did NOT.
* `git diff v0.8.0.10..v0.8.0.11 -- src/engine/` is three files and nineteen insertions:
* `trainArrived` gains an `owner` field (`events.ts`), the one line in `advance.ts` that fills
* it from `playerAtSeat`, and a Mainline card's printed description losing a sentence about a
* speed that is not drawn on the card (`content.ts`). `check()` and `legal.ts` are untouched and
* no predicate was edited, so nothing once legal became illegal. Events are not persisted — a
* `SavedGame` is `{ seed, config, history }` and the events are derived by replaying it — so
* widening one of them cannot invalidate anything on disk, exactly as the v0.8.0.1 entry above
* argues for four of them.
*
* THE REST OF THE RELEASE IS THE SCREEN: a Pause control for the catch-up queue, a one-render
* look at another player's Office Area, the turn chart following the step being replayed rather
* than the live game, "still needs" on the make-up panel, the amber on an addable yard chip, and
* save filenames carrying the join code. None of it is a rule and none of it is on disk.
*
* v0.8.0.12 TOUCHES THE ENGINE NOT AT ALL, which is the shortest entry this comment has ever
* had a right to: `git diff v0.8.0.11..v0.8.0.12 -- src/engine/` is EMPTY. The release is the
* server's HTTP surface, the browser client and the docs — a seat recovery flow (Gitea#33) for
* a player whose browser has lost the token that is their only identity.
*
* WHAT IT ADDS, AND WHY NONE OF IT IS A MIGRATION: two routes (`POST /api/games/<id>/claim`
* behind the admin secret, `POST /api/claim` for the player following the link), a `?claim=`
* entry path in the client, and `seatedPlayers` on the administrative game listing. The codes
* themselves live in memory and are deliberately NOT persisted — minted on demand and spent
* within minutes, so a restart dropping them is the right failure rather than a loss. Nothing
* new is written to the volume, no predicate was edited, and `check()` and `legal.ts` are
* untouched, so no once-legal move became illegal. Games in progress resume, and the release
* notes say so in all five locales.
*
* v0.8.0.13 TOUCHES THE ENGINE AGAIN, AND THE WHOLE DIFF IS TWO LINES.
* `git diff v0.8.0.12..v0.8.0.13 -- src/engine/` adds a `superintendentChanged` variant to the
* `GameEvent` union (`events.ts`) and the one `events.push` in `advance.ts` that emits it beside
* the `actorChanged` that was already there — §5's handover of the Fedora, which the log had been
* dropping as turn bookkeeping. Nothing was removed and nothing was edited: `check()`, `legal.ts`
* and every predicate are untouched, so no once-legal move became illegal, and a widened event
* cannot invalidate anything on disk because events are DERIVED by replaying a `SavedGame` rather
* than stored in one — the same argument the v0.8.0.1 and v0.8.0.11 entries above make for
* theirs. Games in progress resume, and the release notes say so in all five locales.
*
* THE REST IS THE SCREEN AND THE LOG, none of it on disk: the Division Yard chips now obey the
* catch-up queue (they did not, and a click during it submitted a real intent against a stale
* board), the yard counts are read from the shown board rather than the live game, the district
* picker gained your own seat and is ordered by seat rather than by player index, collisions name
* the district's owner and the 5 Revenue they lose, a Depot that cannot stock an outbound
* passenger explains which car it is short of, and the history panel keeps 90 lines. The
* passenger case is a RULING rather than a fix — §6.3 wants a loaded coach in the Division Yard,
* and Jesse kept the shortage (Gitea#2's ruling) while ending the silence about it.
*
* v0.8.0.14 IS THE SECOND BUMP THAT BREAKS RESUMES, AND LIKE v0.8.0.10 IT DOES SO DELIBERATELY.
* A Modifier card may no longer be placed outside a player's Limits (§2.1). That REVERSES an
* earlier ruling of Jesse's — Modifiers were exempt because a Facility standing at the limit has
* three of its nine spots beyond the sign — and it is exactly the shape of change this package's
* `UPDATING.md` says to look for: a predicate in `apply.ts` changed its answer, so a move that
* was legal when it was played is refused on replay.
*
* MEASURED, NOT ESTIMATED. The Day 3 playtest save stops at intent 528 of 539 —
* `card.play c55 → (-2,4)` with the sign at column 3 — eleven moves short of where the table had
* got to. `tryResumeSession` names the move, `index.ts` logs the refusal, and the file is left
* untouched, so re-installing v0.8.0.13 finishes any game worth finishing. Jesse's call, knowing
* it strands the game that was on the box.
*
* THE REST OF THE ENGINE DIFF STRANDS NOTHING, and is worth separating from the part that does.
* `makeUpShort` is a new event reporting that the make-up round could give a train nothing;
* `switchingEnded` closes a switching turn; `trayMoved` carries the Stage's Move allowance and
* `consistSorted` carries where the engine ended up; `switch.sortConsist` gained an OPTIONAL
* `engineAt` (absent means the nose, which is what every sort did before, so an older save
* replays to the same train). Events are derived by replaying a save rather than stored in one,
* and an optional intent field defaulting to the old behaviour changes no past move.
*
* THE SMALL YARD RULE CHANGED IN THE PERMISSIVE DIRECTION, which cannot strand a save either: a
* train there may now be sorted with cars ahead of its engine (`implications.md` against the
* v0.4.5 card text, Jesse's ruling). Nothing once legal became illegal; §8.2's departure check is
* untouched and still holds a broken-backed train at the Office.
*
* v0.8.0.15 AND v0.8.0.16 CHANGE NO RULE AND STRAND NOTHING.
* `git diff v0.8.0.14..v0.8.0.16 -- src/engine/` is one sentence of card TEXT and one doc
* comment. The Interchange stopped telling players "Cars may be sorted into any new order here"
* — a printed capability that has never been implemented, reaching the board through
* `mainlineDescription`, which `view.ts` renders as a Mainline card's `what`. Nothing reads
* `sortsCars` to permit a sort; its only live use is marking the card an Extra may be made up
* on. No predicate was touched, so no once-legal move became illegal.
*
* The rest of those two releases is documentation inside the repository — a Quickstart for a new
* player, and the four hand-written references brought up to the game as it runs. None of it is
* served by the site or read by the service; it rides along in the image because the Dockerfile
* copies the game's tree in.
*
* SO THE RESUME WARNING IN THESE RELEASE NOTES IS ENTIRELY v0.8.0.14's, and it still applies:
* a box on 0.8.0.13:0 takes this update in one hop and meets the Modifier rule on the way.
*/
up: async ({ effects }) => {},
down: IMPOSSIBLE,
},
})