docs(modules): phase 5 as built — Android leg A, and the capability a client had to be given #257
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/rust-phase-5"
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?
module-rustphase 5. The module's read path gets its second client, and the phase criterion — the app renders a Rust site it has never seen, and a UO site unchanged — was walked on one device against two running cores rather than asserted.Two files:
modules/rust/PLAN.md§18 — the phase as built, and the phase-5 row marked done.android/PLAN.mdM14 — the app's own record, as every Android milestone has.The decision worth the most words
D16. This module declared five capability strings and every one named a surface —
servers,killfeed,leaderboard,presence,wipes— while a client gating a whole navigation group needs one that names the module.module-uohas exactly that (shard); this had none.Core flattens every started module's capabilities into one list, so gating on
serverswould let any future module declaring that generic word silently reveal these screens on a site that does not run Rust.Gating on the module
idwas considered and rejected, in as many words in the doc:idis a mount prefix (§2.1 requires it to equal the directory core loads from),MODULE_API.md§2.9 forbids a client inferring a route from a capability, and letting a client gate onidmakes the two the same value in practice — the day one builds/<id>/serversfrom it, the separation that lets this module move its own pages is gone.So the module declares its own name as a sixth capability (Module-Rust#5), asserted in its own suite against
manifest.idso the two cannot drift.The other three decisions
STARTEDwas rejected because it keeps polling behind a partly obscured screen.edgefor the rest of the workstream, releases cut at the cutover. All four repos'pr-checks.ymlalready trigger on[main, edge], so it costs no CI.NavPathslearns/rust(without which an admin's override on the module's own nav row hands off to a browser).Two things that had to be translated rather than copied
useAsync, one tier along. A refresh is invisible when it succeeds and keeps the rows when it fails.What §18.3 and §18.4 record
The walk proved
refreshIntoagainst a genuinely dead backend, R12's arithmetic on a phone (all-time 59 = 41 + 18, and a player who appears only in the older wipe drops out rather than reading zero), everydescribebranch from real rows, and the calendar-day rule.It also found three defects that 644 green tests did not, each because it is about what a screen looks like or when a number is re-read: a live count that resolved once per process, card text flush against its edge, and a player name touching its own kill count.
§18.6 is deliberately short
Two things are not proven and say so: the website's own pages have still not been read at phone width (§17.6 left that open and this phase did not close it), and the badge's non-zero case was shown with a seeded count rather than by people playing.
AI disclosure
🤖 Generated with Claude Code
https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4