0.7.8:0 — bundle Station Master v0.7.8

Submodule pinned to v0.7.8 (193800a). current.ts bumped in place at
0.7.8:0 — no new version file, no migration: the change is which screen
a solitaire visit lands on, plus the splash footer's wording. Both are
client-side, and a solitaire save lives in the browser rather than on
this server, so nothing here is involved either way.

0.7.5 skipped the setup screen whenever the browser held a save, and any
browser that has ever played solitaire holds one — so the door could
never reach the screen again. The door outranks a save now; a bare
reload still resumes; #ss-resume keeps the game in progress reachable
since Deal clears it.

Verified on phoenix.local against what the server returns: the door
carries ?solitaire, play.html carries #ss-resume and #ss-saved-note, the
footer names both ways to play, and the build tag is 0.7.8-mtfaojtv.
Migration 0.7.7:0 -> 0.7.8:0 ran empty and both multiplayer games in
progress (WHISTLE-4086, COAL-7370) resumed with their same intent counts.

The behaviour itself is covered by four new tests upstream that
reproduce the reported state (door + existing save) rather than by
reading served output — which is what the two previous attempts did, and
why they were reported as verified while still being wrong.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AdG46Ja2PEDBkpqiDazMoX
This commit is contained in:
Jesse
2026-08-30 00:16:07 -04:00
co-authored by Claude Sonnet 5
parent 921db34b55
commit 3b7b334968
4 changed files with 72 additions and 50 deletions
+16 -2
View File
@@ -13,8 +13,22 @@ Station Master is a railroad operations board game with an authoritative multipl
solitaire needs no server and is not what this package is for. This package runs that server —
the browser client, the lobby, and the intent/SSE API — as a single StartOS service.
**Bundled version: 0.7.7.** Fixes the client caching that stopped the two releases before it from
ever reaching a browser. `build-web.ts` stamps a build tag onto every module URL as a cache key, and
**Bundled version: 0.7.8.** Makes the solitaire setup screen reachable at all. 0.7.5 skipped it
whenever `load()` found a saved game — reasoned as "a saved game is a game to resume" — and a browser
that has ever played solitaire always has one, so the door could never reach the screen again. The
door (`?solitaire`) outranks a save now; a bare reload still resumes. Since dealing calls
`clearSave()`, the screen carries a **Continue saved game** button and states what Deal costs, so the
door cannot destroy a game in progress. A solitaire save is browser-side, so nothing on this server
is involved either way. The splash footer also now names both ways to play.
**This was reported three times before it was found, and the first two fixes were real bugs that were
not it** — a routing fault (0.7.6) and a caching fault (0.7.7). Both were reported as verified, and
both verifications read what the SERVER returned rather than exercising the path with the state a
returning player actually has. What found it was a failing test written before the fix. Worth knowing
when the next "that didn't work" arrives: reproduce the reporter's state first.
**0.7.7 fixed the client caching** that stopped the two releases before it from ever reaching a
browser. `build-web.ts` stamps a build tag onto every module URL as a cache key, and
its fallback when `git rev-parse` fails was the literal `nogit` — which is precisely the `.s9pk`
case, since the Dockerfile copies the working tree in without `.git`. So every packaged release
published `./web/main.js?v=nogit`, byte-identical to the one before, and a returning browser refetched
+7
View File
@@ -35,6 +35,13 @@ watches the table — there is nothing else to open.
Solitaire runs entirely in your own browser and needs nothing from the server, so it works here
exactly as it does on the public Station Master site.
**What changed in 0.7.8.** The solitaire setup screen now appears for everyone. It was being skipped
whenever your browser held a saved solitaire game — and any browser that has ever played holds one —
so most players never saw it at all. Clicking **Play solitaire** now always asks how you want the
game set up. **Your game in progress is safe:** the screen offers **Continue saved game**, and says
plainly that dealing a new one replaces it. Simply reopening the page still picks up where you left
off, exactly as before. The homepage footer now names both ways to play, too.
**What changed in 0.7.7.** Updates to this service now actually reach your browser. Until now every
release published its files under the same cache name and the server never told browsers when to
look again, so returning players kept running whatever version their browser had already stored —
+48 -47
View File
@@ -5,62 +5,63 @@ export const current = VersionInfo.of({
// (`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.
version: '0.7.7:0',
version: '0.7.8:0',
releaseNotes: {
en_US:
'Bundles Station Master v0.7.7 \u2014 updates now actually reach your browser. Every packaged ' +
'release until now published its files under the same cache key, and the server never told ' +
'browsers when to look again, so a returning player kept running whichever version their ' +
'browser had already stored: the v0.7.5 solitaire setup screen and the v0.7.6 fix to it were ' +
'both installed correctly and neither was ever seen. Each build now carries its own key and ' +
"the pages are marked to revalidate, so this is the last update you'll have to open a private " +
'window to see. No rules changed; games in progress are unaffected.',
'Bundles Station Master v0.7.8 \u2014 the solitaire setup screen finally works for everyone. It was ' +
'skipped whenever your browser held a saved solitaire game, and any browser that has ever ' +
'played holds one, so most players never saw it at all. Clicking Play solitaire now always ' +
'asks how you want the game set up. Your game in progress is safe: the screen offers Continue ' +
'saved game, and says plainly that dealing a new one replaces it. Simply reopening the page ' +
'still resumes where you left off, as before. The homepage footer now also names both ways to ' +
'play. No rules changed; games in progress are unaffected.',
es_ES:
'Incluye Station Master v0.7.7: las actualizaciones ahora llegan de verdad a tu navegador. Hasta ' +
'ahora, cada versi\u00f3n empaquetada publicaba sus archivos bajo la misma clave de cach\u00e9, y el ' +
'servidor nunca indicaba a los navegadores cu\u00e1ndo volver a mirar, as\u00ed que quien regresaba segu\u00eda ' +
'ejecutando la versi\u00f3n que su navegador ya ten\u00eda guardada: la pantalla de configuraci\u00f3n del ' +
'solitario de la v0.7.5 y su correcci\u00f3n en la v0.7.6 se instalaron correctamente y nunca se ' +
'vieron. Ahora cada compilaci\u00f3n lleva su propia clave y las p\u00e1ginas se marcan para revalidarse, ' +
'as\u00ed que esta es la \u00faltima actualizaci\u00f3n que tendr\u00e1s que abrir en una ventana privada para ver. ' +
'Las reglas no han cambiado; las partidas en curso no se ven afectadas.',
'Incluye Station Master v0.7.8: la pantalla de configuraci\u00f3n del solitario por fin funciona para ' +
'todos. Se omit\u00eda siempre que el navegador ten\u00eda una partida de solitario guardada, y cualquier ' +
'navegador que haya jugado alguna vez tiene una, as\u00ed que la mayor\u00eda de los jugadores nunca la ' +
'vio. Al pulsar Jugar en solitario ahora siempre se te pregunta c\u00f3mo quieres configurar la ' +
'partida. Tu partida en curso est\u00e1 a salvo: la pantalla ofrece Continuar partida guardada e ' +
'indica claramente que repartir una nueva la reemplaza. Volver a abrir la p\u00e1gina sigue ' +
'retom\u00e1ndola donde la dejaste, como antes. El pie de la p\u00e1gina de inicio ahora tambi\u00e9n nombra ' +
'las dos formas de jugar. Las reglas no han cambiado; las partidas en curso no se ven afectadas.',
de_DE:
'Enth\u00e4lt Station Master v0.7.7 \u2014 Aktualisierungen erreichen jetzt tats\u00e4chlich deinen Browser. ' +
'Bisher ver\u00f6ffentlichte jede paketierte Version ihre Dateien unter demselben Cache-Schl\u00fcssel, ' +
'und der Server teilte Browsern nie mit, wann sie erneut nachsehen sollten. Wer zur\u00fcckkam, ' +
'f\u00fchrte also weiter die Version aus, die sein Browser bereits gespeichert hatte: der ' +
'Solo-Einrichtungsbildschirm aus v0.7.5 und dessen Korrektur in v0.7.6 wurden beide korrekt ' +
'installiert und nie gesehen. Jeder Build tr\u00e4gt nun seinen eigenen Schl\u00fcssel, und die Seiten ' +
'sind zur erneuten Pr\u00fcfung markiert \u2014 dies ist also die letzte Aktualisierung, f\u00fcr die du ein ' +
'privates Fenster \u00f6ffnen musst. Keine Regel\u00e4nderungen; laufende Spiele sind nicht betroffen.',
'Enth\u00e4lt Station Master v0.7.8 \u2014 der Solo-Einrichtungsbildschirm funktioniert endlich f\u00fcr alle. ' +
'Er wurde \u00fcbersprungen, sobald der Browser ein gespeichertes Solospiel hielt, und jeder Browser, ' +
'der je gespielt hat, h\u00e4lt eines \u2014 die meisten Spieler sahen ihn also nie. Ein Klick auf Solo ' +
'spielen fragt jetzt immer, wie das Spiel eingerichtet werden soll. Dein laufendes Spiel ist ' +
'sicher: der Bildschirm bietet Gespeichertes Spiel fortsetzen und sagt deutlich, dass ein neues ' +
'Austeilen es ersetzt. Die Seite einfach erneut zu \u00f6ffnen setzt wie bisher dort fort, wo du ' +
'aufgeh\u00f6rt hast. Die Fu\u00dfzeile der Startseite nennt jetzt au\u00dferdem beide Spielarten. Keine ' +
'Regel\u00e4nderungen; laufende Spiele sind nicht betroffen.',
pl_PL:
'Zawiera Station Master v0.7.7 \u2014 aktualizacje naprawd\u0119 docieraj\u0105 teraz do twojej przegl\u0105darki. ' +
'Do tej pory ka\u017cde wydanie publikowa\u0142o swoje pliki pod tym samym kluczem pami\u0119ci podr\u0119cznej, a ' +
'serwer nigdy nie m\u00f3wi\u0142 przegl\u0105darkom, kiedy sprawdzi\u0107 ponownie, wi\u0119c powracaj\u0105cy gracz nadal ' +
'uruchamia\u0142 t\u0119 wersj\u0119, kt\u00f3r\u0105 jego przegl\u0105darka ju\u017c zapisa\u0142a: ekran ustawie\u0144 gry solo z v0.7.5 i ' +
'jego poprawka z v0.7.6 zosta\u0142y poprawnie zainstalowane i nigdy nie zosta\u0142y zobaczone. Ka\u017cda ' +
'kompilacja ma teraz w\u0142asny klucz, a strony s\u0105 oznaczone do ponownej weryfikacji \u2014 to wi\u0119c ' +
'ostatnia aktualizacja, kt\u00f3r\u0105 trzeba otworzy\u0107 w oknie prywatnym, \u017ceby j\u0105 zobaczy\u0107. Zasady si\u0119 ' +
'nie zmieni\u0142y; gry w toku nie s\u0105 dotkni\u0119te.',
'Zawiera Station Master v0.7.8 \u2014 ekran ustawie\u0144 gry solo wreszcie dzia\u0142a dla wszystkich. By\u0142 ' +
'pomijany zawsze, gdy przegl\u0105darka przechowywa\u0142a zapisan\u0105 gr\u0119 solo, a ka\u017cda przegl\u0105darka, kt\u00f3ra ' +
'kiedykolwiek gra\u0142a, tak\u0105 przechowuje \u2014 wi\u0119c wi\u0119kszo\u015b\u0107 graczy nigdy go nie zobaczy\u0142a. ' +
'Klikni\u0119cie Zagraj solo zawsze pyta teraz, jak chcesz ustawi\u0107 gr\u0119. Twoja gra w toku jest ' +
'bezpieczna: ekran oferuje Kontynuuj zapisan\u0105 gr\u0119 i jasno m\u00f3wi, \u017ce rozdanie nowej j\u0105 zast\u0105pi. ' +
'Zwyk\u0142e ponowne otwarcie strony nadal wznawia gr\u0119 w miejscu, w kt\u00f3rym sko\u0144czy\u0142e\u015b. Stopka strony ' +
'g\u0142\u00f3wnej wymienia teraz r\u00f3wnie\u017c oba sposoby gry. Zasady si\u0119 nie zmieni\u0142y; gry w toku nie s\u0105 ' +
'dotkni\u0119te.',
fr_FR:
'Inclut Station Master v0.7.7 \u2014 les mises \u00e0 jour atteignent enfin r\u00e9ellement votre navigateur. ' +
"Jusqu'ici, chaque version empaquet\u00e9e publiait ses fichiers sous la m\u00eame cl\u00e9 de cache, et le " +
'serveur ne disait jamais aux navigateurs quand regarder \u00e0 nouveau : un joueur qui revenait ' +
"continuait donc d'ex\u00e9cuter la version que son navigateur avait d\u00e9j\u00e0 stock\u00e9e. L'\u00e9cran de " +
'configuration du solo de la v0.7.5 et son correctif en v0.7.6 ont tous deux \u00e9t\u00e9 install\u00e9s ' +
'correctement et ne furent jamais vus. Chaque build porte d\u00e9sormais sa propre cl\u00e9 et les pages ' +
'sont marqu\u00e9es \u00e0 revalider : voici donc la derni\u00e8re mise \u00e0 jour que vous devrez ouvrir dans une ' +
"fen\u00eatre priv\u00e9e pour la voir. Aucune r\u00e8gle n'a chang\u00e9 ; les parties en cours ne sont pas " +
'affect\u00e9es.',
"Inclut Station Master v0.7.8 \u2014 l'\u00e9cran de configuration du solo fonctionne enfin pour tout le " +
'monde. Il \u00e9tait ignor\u00e9 d\u00e8s que le navigateur d\u00e9tenait une partie solo sauvegard\u00e9e, et tout ' +
'navigateur ayant d\u00e9j\u00e0 jou\u00e9 en d\u00e9tient une : la plupart des joueurs ne l\u2019ont donc jamais vu. ' +
'Cliquer sur Jouer en solitaire demande d\u00e9sormais toujours comment configurer la partie. Votre ' +
'partie en cours est en s\u00e9curit\u00e9 : l\u2019\u00e9cran propose Continuer la partie sauvegard\u00e9e et indique ' +
'clairement qu\u2019en distribuer une nouvelle la remplace. Rouvrir simplement la page reprend ' +
'toujours o\u00f9 vous en \u00e9tiez. Le pied de page de l\u2019accueil nomme maintenant les deux fa\u00e7ons de ' +
"jouer. Aucune r\u00e8gle n'a chang\u00e9 ; les parties en cours ne sont pas affect\u00e9es.",
},
migrations: {
/**
* STILL NOTHING TO CARRY. v0.7.7 fixes how the built client is CACHED, not what it does: every
* packaged build published the same cache key (`?v=nogit` — the `.s9pk` build has no `.git` for
* `git rev-parse`) and the server sent no `Cache-Control` at all, so two correct releases never
* reached the browsers that asked for them. A build tag that varies and a revalidate header are
* both static-file concerns: no rule the engine enforces, no save-format change. A game in
* progress, on the server or in a browser, resumes exactly as it would have on v0.7.6.
* STILL NOTHING TO CARRY. v0.7.8 changes which SCREEN a solitaire visit lands on — the setup
* screen was skipped whenever the browser held a save, so a returning player never saw it — plus
* the splash footer's wording. Both are client-side; no rule the engine enforces and no
* save-format change.
*
* A SOLITAIRE SAVE LIVES IN THE BROWSER, not on this server, so nothing here can touch it either
* way: `#ss-resume` is what keeps it reachable, and only the player's own Deal clears it. A
* multiplayer game in progress resumes exactly as it would have on v0.7.7.
*/
up: async ({ effects }) => {},
down: IMPOSSIBLE,