docs(android): M12 phase 0 as landed, and phase 7 cancelled #112
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/android-theming-nav-phase-0"
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
Two records, one milestone. Code pair: Android-app#33.
Phase 7 is cancelled
Reading
nav_admin/nav_player. §6.4 already made the case against it and the phase was scheduled last and marked optional precisely so the call could be taken on its merits with the rest of the milestone working. Taking it now, before phases 1–6 make it more expensive to unpick:The two authenticated navs reach four app rows between them —
/player,/account,/admin,/admin/moderation. The website sidebar's other ~18 rows are admin configuration the app deliberately excludes (M10/M11), and two of the app's four staff entries are aggregates with no single web row to be renamed from. Four rows does not pay for a new authenticated fetch, a session-keyed cache and its teardown on sign-out.Consequences, all of them wanted:
GET /public/settingsis the whole lifecycle, and there is nothing session-keyed to tear down;@StringReslabels, so those labels stay localized. That is the one thing given up, and for four rows the trade reads better in this direction;label: String?-beside-labelResmechanism still ship, because phase 5 needs both for the public nav. Nothing in phases 0–6 was scaffolding for phase 7.Four places are amended so the doc does not contradict itself: §3's endpoint table row, §4's locked decision, §5.5's lifecycle paragraph, and the §8 table — plus a standing "Phase 7, cancelled" note that keeps the reasoning for anyone who revives it.
Phase 0 as landed
The contract and the appearance store, shipped as Android-app#33. Its notes record two departures from what §8 specified, both in service of §2's forgiving-on-read rule:
themeis a rawJsonElement, notMap<String, String>?. The typed map is what the contract says — a closed set of string-valued tokens, validated server-side on write. Butkotlinx.serializationfails the decode of the whole object on a value of an unexpected kind, andthemeshares its payload withbrandandpush: one odd token would have blanked the branding and dropped the push relay URL. Coerced field-by-field instead, so a bad token costs exactly itself.NONE. §5.5 said "best-effort"; the distinction it did not draw is that a moment of no connectivity on resume must not repaint a themed shard back to the shipped defaults. Only the initial load can produceNONE.The rest of the notes are boundary decisions worth having on the record: the second-stage parse stops at "is this a plain object" (so no half-built nav model ships in phase 0),
SiteAppearance.NONEis the shipped app and three different failures resolve to it, the resume refresh lives inMainActivitybeside the theme rather than inRunicApp, andRunicAppstill takesbrand: BrandDto?— which is what makes the phase's diff provably invisible.PLAN.md§9's M12 entry is updated for both: eight phases now, not nine, with phase 0 marked landed.How it was tested
Documentation only — nothing to build or run. Both records were checked against what actually shipped rather than what was planned: the §8 table, §3, §4 and §5.5 were re-read for statements the cancellation makes false, and the "as landed" notes were written from the merged diff (the
JsonElementmodeling, the refresh-keeps-last-good branch, theMainActivityresume effect, and the unchangedRunicAppsignature), not from the plan.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-Bytrailer.License