Bundle Station Master v0.6.0: updates stop destroying games in progress

Pin moves to v0.6.0, package version to 0.6.0:0.

README and instructions.md both promised the opposite of what now happens
and had to be rewritten: an update keeps games in progress unless the rules
actually changed, and a game that genuinely cannot replay is named in the
log rather than described as a version mismatch.

Verified on phoenix.local by doing the thing the release is about. A game
(MAIL-4571) was created on the installed 0.5.6:0, then this build was
installed over it. All four saved games on the volume came back:

  Resuming 4 saved game(s)…
  Resumed HOPPER-4607  — 37 intents replayed.   (written under 0.5.2)
  Resumed TRESTLE-5109 —  5 intents replayed.   (written under 0.5.3)
  Resumed TENDER-8092  — 38 intents replayed.   (written under 0.5.5)
  Resumed MAIL-4571    —  0 intents replayed.   (written under 0.5.6)

The first three had been refused on every boot since the release that
stranded them. They were never damaged, only unreachable, and replaying
them is all it took to get them back — which is the clearest evidence that
the version comparison was answering the wrong question. All four now show
in Games in Progress with the correct Day, Stage and waiting-on player.
This commit is contained in:
Jesse
2026-08-21 21:56:58 -04:00
parent 5bd06af932
commit e84c640067
4 changed files with 30 additions and 28 deletions
+9 -6
View File
@@ -96,12 +96,15 @@ and a critical task is raised pointing at **Get Join Secret** — the service st
the moment the daemon is healthy, but a player cannot create or join a game until the join secret the moment the daemon is healthy, but a player cannot create or join a game until the join secret
has been retrieved and shared with them. has been retrieved and shared with them.
**Updating the package ends every game in progress.** A save records the engine version that wrote **Updating the package keeps games in progress, unless the rules actually changed.** On boot the
it and the server refuses to resume one recorded under different rules, logging the refusal and server replays each saved game's moves through the current engine and resumes it if they all still
leaving the file untouched. This is upstream's deliberate design, not something this package works apply — the version that wrote the file is recorded and reported but decides nothing. When a move
around: a move that was legal under the old rules may not be under the new ones. Let games finish *is* rejected, that game is refused and the log names it: `move 3 of 8 (localOps.choose) is
before updating, or accept losing them — rolling the package version back makes them loadable rejected by the current rules with OPTION_ALREADY_CHOSEN`. A refused game is never modified or
again, since nothing is deleted. deleted, so reinstalling the previous version makes it loadable again and it can be played out.
Earlier versions of this package compared version strings instead, which destroyed every game in
progress on every update, including updates that changed only how the board is drawn.
## Actions ## Actions
+4 -5
View File
@@ -60,8 +60,7 @@ a game that will never be finished — otherwise it sits there, and comes back e
service restarts. It cannot be undone, so the game's save is handed back to you when it happens: service restarts. It cannot be undone, so the game's save is handed back to you when it happens:
that text is the only copy left, so keep it if the game was worth watching. that text is the only copy left, so keep it if the game was worth watching.
> One thing to know before you update this service: **games in progress do not survive an > **Games in progress normally survive an update of this service.** When the update changes the
> update.** The rules can change between versions, so a half-played game recorded under the old > rules of the game itself, a half-played game cannot be resumed under rules it was not played by,
> ones is refused rather than resumed under rules it was not played by. Nothing is deleted, and > and that game is set aside rather than continued — you would see it disappear from the lobby.
> going back to the previous version makes them playable again — but the safe habit is to finish > Nothing is ever deleted, so going back to the previous version makes it playable again.
> games before updating.
+16 -16
View File
@@ -4,28 +4,28 @@ export const current = VersionInfo.of({
// `<upstream>:<downstream>` — the upstream half tracks the bundled Station Master tag exactly // `<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 // (`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. // action. The downstream half moves only for packaging-only changes.
version: '0.5.6:0', version: '0.6.0:0',
releaseNotes: { releaseNotes: {
en_US: en_US:
'Bundles Station Master v0.5.6. Seats are numbered from 1 rather than 0 everywhere a person ' + 'Bundles Station Master v0.6.0. Games in progress now survive an update of this service, so long ' +
"reads them, the current player's name on the Division map is legible again, and the " + 'as the rules did not change. The lobby lets the host set every game setting, and the Employee ' +
'west-to-east seating line appears only while the game is opening.', 'Rotation optional rule is playable.',
es_ES: es_ES:
'Incluye Station Master v0.5.6. Los asientos se numeran desde 1 en lugar de 0 allí donde los ' + 'Incluye Station Master v0.6.0. Las partidas en curso sobreviven a una actualización de este ' +
'lee una persona, el nombre del jugador en turno vuelve a ser legible en el mapa de la ' + 'servicio, siempre que las reglas no hayan cambiado. La sala permite al anfitrión ajustar todas ' +
'División, y la línea de asientos solo aparece al comenzar la partida.', 'las opciones, y la regla opcional de Rotación de Empleados ya se puede jugar.',
de_DE: de_DE:
'Enthält Station Master v0.5.6. Plätze werden überall, wo ein Mensch sie liest, ab 1 statt ab 0 ' + 'Enthält Station Master v0.6.0. Laufende Spiele überstehen jetzt ein Update dieses Dienstes, ' +
'gezählt, der Name des Spielers am Zug ist auf der Divisionskarte wieder lesbar, und die ' + 'sofern sich die Regeln nicht geändert haben. In der Lobby stellt der Gastgeber alle ' +
'Sitzreihenfolge erscheint nur noch zu Spielbeginn.', 'Spieloptionen ein, und die optionale Regel Employee Rotation ist spielbar.',
pl_PL: pl_PL:
'Zawiera Station Master v0.5.6. Miejsca są numerowane od 1 zamiast od 0 wszędzie tam, gdzie ' + 'Zawiera Station Master v0.6.0. Gry w toku przetrwają teraz aktualizację tej usługi, o ile ' +
'czyta je człowiek, nazwa gracza wykonującego ruch jest znów czytelna na mapie Dywizji, a ' + 'zasady się nie zmieniły. W poczekalni gospodarz ustawia wszystkie opcje gry, a zasada ' +
'linia kolejności miejsc pojawia się tylko na początku gry.', 'opcjonalna Employee Rotation jest już grywalna.',
fr_FR: fr_FR:
'Inclut Station Master v0.5.6. Les places sont numérotées à partir de 1 plutôt que de 0 ' + 'Inclut Station Master v0.6.0. Les parties en cours survivent désormais à une mise à jour de ce ' +
'partout où une personne les lit, le nom du joueur dont c’est le tour est de nouveau lisible ' + 'service, tant que les règles n’ont pas changé. Le salon permet à l’hôte de régler toutes les ' +
'sur la carte de la Division, et la ligne des places n’apparaît qu’au début de la partie.', 'options, et la règle optionnelle Employee Rotation est jouable.',
}, },
migrations: { migrations: {
up: async ({ effects }) => {}, up: async ({ effects }) => {},