docs(android): scope M11 — Protocol 3.0 shard parity for the app #74
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/android-v3-parity"
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?
Why
link/v3.md§10 carried Android parity as a "track separately" follow-up, described as needing/public/shard/featuresto hide its own nav. Re-examined before theedge→maincutover, the gap is wider than nav hiding.The app cannot see any of the four features v3 added — no reference to
ruleset,leaderboards,marketoratlasanywhere in the Kotlin tree — plus two carry-overs: nopointsblock on the character sheet (§7.3) and no cliloc-resolved item names (§8.6), so equipment still renders as a layer or a bare id where the web sheet shows real names.And the part that matters for §3:
Menu.ktgates shard navigation on session role alone. An admin who disables a feature or raises its audience leaves the app rendering entries that404/403into a generic error screen where the web client hides them.requireFeature's two statuses mean different things (404= disabled and deliberately not disclosed,403= below the audience) and the app distinguishes neither.What this adds
android/PLAN.md§9 M11 — Protocol 3.0 shard parity, in two PRs:/public/shard/featuresconsumer (mirroring the web client's per-viewer session cache),MenuEntry.featurebeside the existingaccess, the404/403/503split,char.profile.points, andequipment[].clilocName/titles.rewardResolved.The traps a real shard exposes are recorded inline rather than left to be rediscovered: uncapped
maxPoints: 0being the common case,nameStringusually null so humanising thesystemkey is the primary display path, skill caps in tenths, the market staleness banner being required rather than decorative, themarketSSE fan-out being off by default, atlas delays in seconds, andpoints-as-count vsspawners-as-list.Also splits §5's guideline: session role is no longer the only gate on a shard surface, and the in-flight/failed lookup deliberately fails open — the same call the web client makes, because the server gates regardless and a nav that flickers in on every load is worse than a link that briefly
403s.Two things verified as already correct
Recorded so they are not re-derived later:
MissingFieldException.Cutover sequencing
edge→mainis held until both app PRs land, so web and app surface the same shard on the same day. The bump PRs intoedge(link#20, website#117, docs#72) are unaffected.Neither app PR is coupled to the merge order: against a pre-v3 website every new route and
/public/shard/features404s and each consumer falls back to today's behavior, and the app declares no protocol version and never talks to the sidecar. Holding the cutover is a schedule decision, not a technical dependency — recorded that way in §10 so the reason survives.Scope note
Excluded, in the same class as M10's exclusions: the admin configuration panels (Shard Visibility, Spawn Atlas, Cliloc import), alongside the hero/CMS editor, Discord-bot config, uo-link config and OAuth-provider setup.
Docs only — no code, no schema, no routes.
Co-Authored-Bytrailer.🤖 Generated with Claude Code
https://claude.ai/code/session_01U7CBg11prhLimL9iHSX1bP
The v3 work added four shard features and an admin-configurable visibility framework the Android client knows nothing about. v3.md §10 deferred the app side as a follow-up; re-examining it before the cutover found the gap is wider than nav hiding: - no consumer for any of ruleset / leaderboards / market / atlas, - no `points` block on the character sheet (§7.3), - no cliloc-resolved item names (§8.6), and - shard nav gated on session role alone, so an admin who disables a feature or raises its audience leaves the app rendering entries that 404/403 into a generic error where the web client hides them. Scoped as PLAN.md §9 M11 in two PRs (the visibility rules + read-model adds, then the four screens), with the traps a real shard exposes recorded inline: uncapped `maxPoints: 0`, cliloc-named boards with a null `nameString`, skill caps in tenths, the required market staleness banner, the market stream being off by default, atlas delays in seconds, and `points`-count vs `spawners`-list. edge → main is held until both land so web and app surface the same shard on the same day. Neither PR is coupled to the merge order — on a pre-v3 website every new route and /public/shard/features 404s and the app falls back to today's behavior — so holding the cutover is a schedule decision, not a technical dependency. Also records two things verified as already correct, so they are not re-derived: the app's SSE request rides the authenticated client (same audience rung as the same account on web), and every shard DTO is nullable-with-defaults (field projection cannot cause a decode failure). Co-Authored-By: Claude <noreply@anthropic.com>