docs(link): the shard-name fallback, the atlas places shape, and two traps
#76
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/protocol-3-smoke-findings"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
Records what the live Protocol 3.0 smoke test turned up, so none of it has to be rediscovered. Pairs with RunicGateway/website#119 and RunicGateway/Android-app#32.
v3.md§5.3 — the rulesetshardfallbackWhy the stock ServUO
Name=My Shardis treated as unnamed; that the substitute issettings.getInstanceName()(site_title || BRAND_NAME, the same resolutiongetPublic().brand.nameuses, so one install never shows two names); why it is done at ingest rather than on read (the ruleset is also broadcast live, so a read-time fix is undone by the next reconnect's frame); and that the match is whole-value only, so "My Shard Reborn" keeps its name.Also corrects the backfill note: it says the object-shaped ruleset can't use the array-only
snapshot()helper, which was read as licence to write state directly — and that made it a second writer that skipped the normalization. It now says explicitly that it must still go throughshardIngest.ingest(), asingestEachdoes.v3.md§7.4 — unscored boardsAn empty board renders a placeholder row rather than a blank card, and why it is deliberately not shaped like a real entry. Notes that this is presentation only — the API keeps sending an empty
top, so nothing fabricated reaches a consumer — and that web and app render it identically.android/PLAN.md§9 M11 — the atlas trap, and a testing ruleThe section listed two traps for the atlas. Adds the third, which is the one that actually bit:
placesis a list of{facet, label, spawners, maxAlive}objects, not of place-name strings, it arrives only on the detail route, and typing itList<String>makes that whole route fail to decode while the request itself returns200.Adds the rule that came out of it, next to the existing "DTO decode for each new shape" requirement: decode tests must feed real captured JSON, because the fakes under
data/api/fake/construct DTOs in Kotlin and can never catch a wire mismatch — which is how this shipped past a green suite.How it was tested
Documentation only. Every claim was verified live during the smoke run against ServUO + sidecar + website + AVD; the corresponding code changes are in the two linked PRs.
Checklist
AI-assisted contributions (required)
Claude Code (Opus 5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with aCo-Authored-By/Assisted-Bytrailer.License
🤖 Generated with Claude Code
https://claude.ai/code/session_01U7CBg11prhLimL9iHSX1bP
Records what the live Protocol 3.0 smoke test (ServUO + sidecar + website + AVD) turned up, so none of it has to be rediscovered. v3.md §5.3 — the ruleset `shard` field now falls back to the instance's own name when the shard publishes ServUO's stock "My Shard", why that is done at ingest rather than on read (the frame is also broadcast live), and why the backfill snapshot must go through the dispatcher instead of writing state directly: a direct call made it a second writer that skipped the normalization. v3.md §7.4 — an unscored board renders a placeholder row rather than a blank card, and why it is deliberately not shaped like a real entry. PLAN.md §9 M11 — `places` is a list of {facet,label,spawners,maxAlive} OBJECTS, not of place-name strings, and typing it `List<String>` makes the whole detail route fail to decode while the request itself returns 200. Adds the rule that came out of it: decode tests must feed real captured JSON, because the fakes build DTOs in Kotlin and can never catch a wire mismatch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7CBg11prhLimL9iHSX1bP