feat(rust): a player's own Rust account on the phone — M15 (module-rust phase 8, Android leg B) #48
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/rust-p8-android-b"
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?
R10's leg B: identity (module-rust phase 6) and the half of site-owned permissions (phase 7) a player is allowed to see. Design of record:
docs/modules/rust/PLAN.md§22 (D39–D41);docs/android/PLAN.mdgains M15.Every route existed and answered before a line of Kotlin was written except one —
GET /player/rust/permissions, added for this screen in Module-Rust#10 and rendered on the website there too.It is
CharactersScreenfor a different game, deliberately. One drawer row under the player group, code card at the top of the screen it opens — the shape UO has had since M4. A tab under one Rust server was rejected (a link is fleet-wide: one Steam account is one person on every server, while stats are per server and per wipe), and a section inside core's Account screen was rejected (the app has no slot mechanism, so the module's data would be hard-wired into a core screen).Gated on
rust, not onidentity. D16's rule stands: a capability answers is the module there, and core flattens every module's capabilities into one list, so a surface word is not something a row may hang on.MenuAccess.PLAYERisisPlayer || isStaff, which is right —/player/rust/*isrequireAuthwith no role above it, and staff play too.Two reads, neither blocking the other. An entitlement is authored against the website account, so it exists before a Steam id does; the person who has just been given something and has not linked yet is exactly the one who needs both halves at once.
The four refusals stay four pieces of advice. 400 a spent code, 409 a Steam account another website account holds (
/unlinkin game releases it — it is never moved silently), 429 the limiter, 503 a server that could not be reached — where the code is still good, so it may not say "get a new one".The app does no scope arithmetic:
*never reaches a screen. Each entry arrives with its servers resolved and marked, because a second implementation of that rule is a second thing to keep true.Verified
657 tests, 0 failures,
lintDebug,assembleDebug, and an emulator walk against a core with the module installed and a live Oxide rig behind it — the first Rust leg whose backend was a real game server rather than a stand-in.Walked: the row absent signed-out and absent on a UO site, present for a signed-in player; both reads; a code the live plugin genuinely refused, rendering beside the button; a rank marked has it and a grant marked waiting, matching what the pushed ledger actually said; and the release.
The walk found one thing 657 green tests did not — the row said who, and not when or where. The website's row has always read "linked just now on rust-oxide"; which server minted the code is where a support conversation starts. Fixed in the second commit.
The acceptance line needs a person in game: a
/linkcode reaches a player and nobody else. The walk is written down indocs/rust-link/PLAYER_WALK.md.AI disclosure
Written with Claude Code (Opus 5).
🤖 Generated with Claude Code
https://claude.ai/code/session_01PMH6bw1jXMgbyF3ZWGEzSM