Say things a player can act on, and test the crash containment - #9
Merged
Conversation
nicodes
force-pushed
the
marketplace-through-the-api
branch
from
August 3, 2026 01:40
4714f37 to
14f6813
Compare
Four small things, all the same complaint: the arcade explained itself
to a developer.
The registry client turned a transport failure into Go's error, which
names a host, a port, a query string and a syscall. None of that is
actionable, and the TUI rendered it straight into a notice — so a
marketplace that was merely not running looked like a stack trace. It
is one message now, with the detail behind TERMCADE_DEBUG for whoever
is actually debugging.
before: registry unreachable: Get "http://127.0.0.1:8080/v1/games/
aviorstudio/tetris/resolve?abi=1": dial tcp 127.0.0.1:8080:
connect: connection refused
after: the marketplace is not answering — check your connection
and try again
The registry writes its own messages for a person to read, so they pass
through unprefixed; "termcade: registry: ..." was a stutter rather than
attribution. Same reason the TUI stopped prefixing "marketplace
unreachable:" onto a message that already says so.
`list` printed nothing at all with nothing installed, which reads as a
broken command rather than an empty arcade. The TUI has empty states on
every screen; the CLI had none.
A bare slug is the likeliest way to get an id wrong, and "open
asteroid: no such file or directory" answers a question about the
filesystem that nobody asked.
SafeGame had no tests, which was the wrong place for the gap: it is the
whole of "a broken game can never take the arcade down". It now has
eight, including that every method contains a panic, that the first
crash latches and nothing reaches the game afterwards, and that Close
still runs after a crash — which is exactly when a wasm instance needs
releasing.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
nicodes
force-pushed
the
player-facing-errors
branch
from
August 3, 2026 01:44
7f81e26 to
dc150ff
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The polish pass from the readiness audit. Four small things, all the same complaint: the arcade explained itself to a developer.
Stacked on #8 (which is stacked on #7). Merge in order and each retargets cleanly.
Errors a player can act on
The registry client turned a transport failure into Go's error, and the TUI rendered it straight into a notice — so a marketplace that was merely not running looked like a stack trace.
The detail is behind
TERMCADE_DEBUGfor whoever is actually debugging:Fixed in the client, so the CLI and the TUI both get it — they were rendering the same string. The registry's own messages now pass through unprefixed, since
termcade: registry: ...was a stutter rather than attribution, and the TUI stopped prefixingmarketplace unreachable:onto a message that already says so.Empty state for
listWith nothing installed it printed nothing at all and exited 0, which reads as a broken command rather than an empty arcade. The TUI has empty states on every screen; the CLI had none.
A bare slug says what's wrong with it
Forgetting the author is the likeliest way to get an id wrong, and the old answer was about the filesystem.
Anything with a slash, a scheme, or a
.tcadeon the end still means a file or a URL and is left alone.SafeGame has tests now
It had none, which was the wrong place for the gap — it is the whole of "a broken game can never take the arcade down". Eight tests:
Reset,HandleKey,HandleKeyUp,Draw,Update,Score,HUD) contains a panic rather than propagating itInfo, which happens insideSafeitself before the caller holds anythingClosestill runs after a crash, which is exactly when a wasm instance needs releasingCloseis contained too, and a realCloseerror is passed throughVerification
go vetclean, full suite passes. Every message above was checked against a clean install with the registry pointed at a dead port.🤖 Generated with Claude Code