Add TV offline recovery and per-person saved-state isolation #35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-slice8-states"
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
Add the cross-screen TV state sweep: retained last-known-good (LKG) views, reachable recovery, Saved timestamps, missing-art fallbacks and per-person isolation. Home is included after its merge; only the Title family remains for the short integration PR.
AI-assisted (fork-internal)
Verified head:
a01c0a78fb3f2adb4d8ebfd05c9da6976dc5bf3c, branchfm/tv-slice8-states, basemain. Fetched/mergedorigin/mainimmediately before the final gate pair; it was already current. Not a release or TV-install request.Refs: approved TV specification, sections 3.3, 4.9, 6.13, 7.9, 10.1 and 12; locked Opus prototype. Existing visual sign-offs: shell/navigation, Libraries/See all, Home, Requests, Discover.
Download the exact-head proof archive: native captures, three reference pairs/diffs, text/pixel measurements, source audit, frame inventory, all final JUnit XML and both gate logs; no APK. Archive SHA256:
190adfabea70ed98cb02f3a9f978f336c124ff58948fa79a30012b72ed3ceed0.Changed
RecoveryToastuses the locked warning glyph, 760 px maximum width, 22/28 px padding, 14 px icon gap, 22 px corners, shadow and actual CSS body-line allocation. Network failures use the exact approved words, never exception text.SavedPillis reused by Home, Libraries and Requests. Nav Saved padding includes the 2 px border rather than silently narrowing its border box.Done bar — all eight items
.dp/.sporColor(0xin screens. Token drift check passes. Applies to shell/settings, Home, Libraries/See all, Discover/service/request sheets and Requests.st-*IDs at 1920×1080/density 2.0, plus the Home extra capture. All merged-screen contract IDs exist; title-nav st-060 belongs to the 32 deferred Title states. Existing family sign-offs are inherited, not falsely re-claimed as a new review of all 113 frames. Fresh side-by-side inspection covers the changed Saved frames st-015/st-017 and actual offline-player st-090. The accepted st-089 exception is below.HomeRatingsUiTest.dutchDecimalPlateStaysOnOneLine,RecoveryCaptureTest.dutchLibraryScoreRendersCommaWithoutBreakingThePlate,RecoveryCaptureTest.dutchDiscoverHeroScoreRendersComma, andRequestsKeysTest.cachedRatingsRenderInTheTelevisionLocalepass. TMDB 7.8 displays 7,8; RT percentages are unchanged. Discover's test configures Android resources to nl-NL as well as the JVM locale. These are native Robolectric checks, not an ADB/emulator or physical-TV session.Per-screen source-failure and recovery proof
Cache boundary: release Conductarr TV sign-in/provider wiring is still unavailable, as in the merged slices. Release Discover remains signed out; release Requests remains honestly unavailable. This PR does not claim production authenticated catalogue/Requests reads or introduce fake network fallbacks. The existing generated client's identity-scoped disk cache is reused as the Conductarr boundary. Added UI state tests exercise the approved fixture seam; Home/Library use their existing real disk stores. No request is queued offline, and no Seerr fallback or handwritten HTTP is introduced.
Player acceptance and native comparisons
PlayerHandoffTest.successfulPlaybackUsesTheRealFullscreenDestinationAndBackKeepsTheResumeCardpasses, including real Destination.Playback, resume position, fullScreen and the original retained view/card after Back. No upstream-player fixture capture or playback/decoder certification is claimed.PlayerHandoffTest.failedPlaybackReadLeavesSavedHomeFocusedAndDrawsTheExactOfflineToastpasses. Separate actual-person guard test proves another person's session cannot resolve/start playback.Every pair is frozen prototype left, native Compose right; each half 1920×1080 at density 2.0. The accepted shell compare script is reused. Mean RGB is absolute channel error on 0–255; >12 is the percentage whose maximum channel error exceeds 12; nav is the top 150 pixels, not isolated geometry.
Native-resolution paint/layout probes
Approved font ruling is unchanged: platform Roboto, frozen browser DejaVu Sans; no bundled font, size fudge, title-specific wrapping or ellipsis-parity claim. The three pairs above were inspected side by side. Existing family sign-offs and their explicitly accepted residuals remain the visual baseline for unchanged frames.
Final commands and results
python3 wolfskin-design/generate_tokens.py --checkmake testmake apk-debugInitial targeted attempts exposed the known Maven429 runtime fetch and new harness setup issues (Android resource locale, paused Robolectric main looper, outer-versus-padded semantics bounds). Those were repaired before the final pair. The approved already-seeded Robolectric cache used a checkout-scoped untracked init hook; that hook was removed after both green gates. No tracked dependency/wrapper/Dockerfile workaround, shared daemon/volume administration, release, signing or version configuration change occurred.
Upstream files touched
None under
app/src/main. No upstream player, manifest, hook, destination or preference implementation changed. The 29 changed files are confined toapp/src/wolfskin, new fork tests,wolfskin-design(including generated token artifacts), and existing feature documentationdocker/README.md.Not done / integration boundary
Evidence is retained under
/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-slice8-states/: native captures, reference pairs/diffs, layout/pixel measurements, source audit, inventory, all final JUnit XML and both gate logs.Deferred Title-family state sweep
Home merged during this task and is now in scope; no Home state is deferred for an unmerged branch. The following 32 Title-family states require the short integration sweep after the Title implementation merges. Existing Discover-owned st-058/st-059 are not counted as full Title-family delivery.
Design review (Claude Sonnet, cross-family): PASS, zero blockers. Reviewed head
a01c0a78fb3f2adb4d8ebfd05c9da6976dc5bf3c. Read and measure only; no Gradle run.Checked
st-090toast measured against the locked frame at 1920x1080: top 150, right edge 1823 (right 96), width 760, warn glyph same size and x, line pitch 36 vs 37 px, 3200 ms. The fill is 1 px taller (117 vs 116), as the PR states. The wrap differs (Roboto fits "and try" on line 1), which is font-only.st-015Saved chip: 2 px border, colour, 22 px side padding, wifi icon and gap all match. The chip is 212 px wide against 233 px in the reference (text 129 vs 150 px). That is the Roboto vs DejaVu advance difference only.st-017is byte-identical tost-015in the locked set.server:user(digest in the path), a revision guard drops an older person's late response, Discover state is rebuilt per person, Requests state is a map keyed by person, Libraries are per person. I found no cross-person leak.generate_tokens.py --checkpasses and the checksums verify. No existing test was changed, nothing underapp/src/mainwas touched, and no public design API was removed.Non-blocking
DiscoverShelf.kt:95caption). A one-string fix.Full report:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-35/report.md