Build the approved TV Updates settings UI #65
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-updater-ui"
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?
Outcome
AI-assisted (fork-internal). Build the approved Wolfskin TV Updates screen, add Updates immediately after Requests, retain every existing Settings group, and put Classic settings (trial) last.
Base is main, following firstmate steering 004. The verified updater core is already in main through the household updater core review; this UI consumes its process-scoped controller. Final pushed head:
9061384ad1260e1b2f802725970c008fb3c158fb. No round-2 branch rebase or device/box action.Applied decisions
installedVersion; Auto-check uses the controller's existing app-wide preference. No second preference or updater metadata store.Failed.operation. Check/download/install errors receive operation-correct headings without parsing reason strings. Permission/handoff dismissal uses the core's verified-file-preserving cancellation contract, including its independent installer-ownership guard.Choices I made
update-tokens.json, using the existing generator/drift guard. Add only missing motion tokens: 1800 ms scanning, 1600 ms sheen, and the linear curve needed by the approved progress treatment. Existing motion curves/durations, reduced motion andmotionDurationremain authoritative.Captures and visible differences
Native/approved comparison and motion proof
All 18 prescribed pairs: unretouched 1920×1080 originals, 3840×1080 side-by-side files, approved fixture data (
1.1.0-140-g5162c299→1.1.1, 47.8 MB, 6 Nov 2026). Those sizes are fixture facts, not a measured release APK. Additional no-release and unknown-total outcomes are linked. Files are 0660; directories 0770.The page records renderer/review heads, original hashes, per-label pixel deltas and causes. The retained fixture matrix is supplemented by three narrow native integration captures. The fixed post-install Idle image is pixel-identical to the existing same-data Updated native image: zero differing pixels.
No difference is waived. The approved-frame rule remains a merge gate: a visible unapproved deviation blocks merge.
Native motion proof: 113 checking, 24 state-transition and 101 downloading frames at manually clocked 16 ms steps; reduced-motion frames 1600 ms apart are pixel-identical. Another 24 entry and 24 return frames cover Navigation3 and exact Settings restoration.
The final served-file page was inspected in an isolated 1920×1080 Chromium session: dark scheme, 18 decoded pairs, zero broken images, working integration-image link. The clean remote route redirects an unauthenticated session to Authentik; authenticated remote-page verification is not claimed.
Verification
At final merged-main head
9061384ad1260e1b2f802725970c008fb3c158fb:make apk-debugApp coverage includes 27 real-controller loopback/persistence cases, 2 session-stream cases, 3 manifest cases, 12 updater UI behavior cases, and 18 affected view-model cases. State/action boundaries, percentage validity, focus/Back behavior, toggle semantics, notes trapping and the refreshed-identity/checking precedence are covered without wording tests.
The APK gate inspected 1016 branding resources per artifact and preserved legal attribution. These are debug/stub-media builds, not distribution or playback proof. Per the released slim pilot, focused tests were followed by one final-head APK gate; the full
make testsuite was not rerun. Counts, source and native image hashes are linked from the proof page.Questions for Justin
No additional product decisions beyond native-frame review. The measured rendering differences above are disclosed, not silently accepted or treated as an approval waiver.
Not in this change
Review of the Settings Updates UI at head
9061384ad1260e1b2f802725970c008fb3c158fb(basemain).Code verdict: APPROVE (
review/code-claude= success).Design verdict: PASS (
review/design-claude= success). No blocking finding.Design. I compared all 18 approved and native frame pairs: Settings with Updates focused, Classic settings last, checking, up to date, available, notes, notes open, downloading, ready, permission, handing off, cancelled, failed (Download failed, 403), offline, no installer, updated and the Auto-check frames. Copy, layout, button set and order, focus ring and fills match. The only differences are glyph antialiasing, +1 RGB on composited fills and the animation phase, all disclosed in
visible-differences.json. The shortened descriptions on existing Settings rows are the approved copy.Behaviour, UI side.
UpdateControllerstate, release, installed-version and auto-check flows.UpdateFocusholds only focus state, so there is no second updater store. Auto-check goes through the controller's preference.install().Failed.operationdrives theCheck failed/Download failed/Install failedheadline. The cancel actions map tocancel(), which keeps the verified file.Verifiedwording appears only in Ready and InstallCancelled.Up to dateonly for the core'sUpToDate, distinct from no release, offline and failed.generate_tokens.py --checkpasses.Non-blocking notes:
wolfskinwordmark and no selected-tab pill. The PR reproduces all three on Settings and Updates only, so the nav changes typeface, wordmark case and selection between those routes and Home, Discover, Movies and Shows. It follows frames he approved, so it is not a block, but it looks like a mock artifact. The switch lives inUpdateTypographyandNavBar(hasSelectedTab).Check for updatesbutton until the entry check starts. The core awaits the restore, including re-hashing a retained APK, first, so on the armv7 box this could last seconds. Showing the Checking track in that gap would be safer.InvalidMetadataand showsVerification failed, which is not accurate. This is a mapping nit.Updated to Xrelies on a version code remembered at first composition. A real install replaces the process, so a fresh screen showsUp to dateinstead. The text is never wrong, only less informative.Full report (review 4):
/root/.treehouse/firstmate-7bab20/2/firstmate/data/round2-review/report.md. Not run: Gradle/make, nothing on the box.