2 Commits
Author SHA1 Message Date
JesseandClaude Opus 5 81f9d06705 0.8.0.13:0 — bundle Station Master v0.8.0.13
Nine fixes from the Day 1-2 playtest of 0.8.0.12, almost all of them about what
the table can see. The one that mattered moved a car: the Division Yard chips
stayed clickable while a player's board was catching up on other people's turns,
so a click submitted a real intent against a position several moves stale. They
obey the catch-up queue now, and the yard counts beside them are read from the
board on screen rather than the live game. The district picker gained a button
for your own seat and is ordered west to east as the map draws it; the Fedora
passing is announced and logged; a collision names whose district it was and who
loses the 5 Revenue; and a Depot that cannot stock another passenger says which
car it is short of instead of the action silently vanishing.

Packaging is the submodule pin, the version and the words. No action, route,
file model or interface changed — the whole release is inside the bundled game.

GAMES IN PROGRESS RESUME NORMALLY, measured rather than assumed:
`git diff v0.8.0.12..v0.8.0.13 -- src/engine/` is two ADDED lines — a
superintendentChanged variant on the GameEvent union, and the events.push that
emits it beside the actorChanged already there. Nothing was removed or edited:
check(), legal.ts and every predicate are untouched, so no once-legal move
became illegal, and events are derived by replaying a save rather than stored in
one, so widening the union cannot invalidate anything on disk. README,
instructions.md and the release notes in all five locales say so.

Two files come along that this release did not otherwise touch:
`prettier --write startos` reflowed a call in restoreSeat.ts and a return type
in serverApi.ts, formatting drift left by the 0.8.0.12 commit.

The 0.8.0.12 release it follows was deployed and verified at a table: a seat was
recovered end to end from a one-time claim code minted by the StartOS action,
which is what the previous commit said had not yet been exercised.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmdqqCNoiqE7GBo6wthBnR
2026-09-17 05:08:10 -04:00
JesseandClaude Opus 5 a70337cf8b 0.8.0.12:0 — bundle Station Master v0.8.0.12, and a Restore a Seat action
A player who has lost their browser storage can be put back in their seat
(Gitea#33 in the game repo). The session token is the only identity the game
has and it lives in one browser's localStorage, scoped to the origin joined at,
so a cleared profile, a private window or a different browser locks a player
out of a game that is still running with their session still on disk. Seen at a
real table: of two humans in one game, the host reloaded straight back in and
the joiner met an empty lobby.

New action, restore-seat: pick a seat from a dropdown of the players actually
holding a session — bots never appear, since seatedPlayers is read from the
server's session map rather than guessed from display names — and get back a
link built from this interface's own address. serverApi gained mintClaim; the
dictionary gained 57-64 in all five locales.

THE LINK CARRIES A CODE, NOT THE TOKEN. lobby-and-sessions.md §1 says to keep
the token out of URLs so it is not shoulder-surfed or pasted into a chat, and a
recovery link is exactly what gets pasted into a chat. The code is single-use,
expires in 30 minutes, and the page trades it for the real token over a POST.
Minting is admin-gated because deciding that somebody has lost a seat is a
judgement no route can make safely; spending needs no secret, because the
player following the link holds none.

GAMES IN PROGRESS RESUME NORMALLY, measured rather than assumed:
`git diff v0.8.0.11..v0.8.0.12 -- src/engine/` is EMPTY. The release is the
server's HTTP surface, the client and the docs. The codes live in memory and
are deliberately not persisted, so nothing new reaches the volume and there is
nothing to migrate. README, instructions.md and the release notes in all five
locales say so.

NOT YET EXERCISED END TO END: the two routes and the action are typechecked and
the claim store is unit-tested, but nothing has run them against a live server.
This build is what makes that possible.

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