Build the Wolfskin TV Home feed #31
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-slice3-home"
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?
Wolfskin TV Home
AI-assisted (fork-internal)
Build the approved Home screen on the merged shell, Libraries, Requests and Discover: hero chain, Jellyfin and Your shelves, captions, focused rating plates, focus-follow, Discover continuation and Home recovery states. Home See all opens the real merged grid with the complete fixture list; the final continuation opens real Discover at its top. Remove the obsolete Home Discover stub.
Refs: approved TV specification (§6.2, §4.7–4.8, §7.8–7.9, §10.1); locked Opus v2 prototype; merged shell/navigation; merged Libraries and See all; merged Requests under Settings; merged Discover.
Head:
061670848f45ece00c0ae6e69dda3a39014b2536. Base:main(86d3432fb0078935a40785764f1eab536068668c). Plain additive main merges:14a74ac4Libraries,4cd75cfaRequests,575103ceDiscover. Viewport fix9c8fceb1; callback migration5033c171; independently namespaced Library/Discover capture artifacts06167084. The earlier Home-only gap override is superseded by main’s canonical 8px Library token. No rebase, force-push or merge of this pull request.Review corrections and integration
Library.captionSeparatorOpacity; multiply the existing muted alpha by 0.4. Remove the duplicate Home token. Across st-009, st-019, st-020, st-099 and x-home-discover-start, isolated dot peak RGB is 77/77/79, versus reference 79/79/81 and the reviewed, incorrect native 101/101/102. The remaining two-channel levels are reported, not hidden by another alpha adjustment.exactLineBoxallocate the declared CSS heights despite Android paragraph intrinsic minimums. Keep the original hero spacers and border-box-aware recovery padding. Shared shell/Library typography defaults are unchanged. Native paragraph diagnostics deliberately retain the raw 99px paragraph beside the declared 85.68px hero line; the Home layout allocates the rounded 86px box rather than using that intrinsic minimum.ShellContentFocuskey-up/repeat/Back guard, sharedTitleCard,Caption,LibrarySeeAllCard, canonicalFocusLiftshadows, and one boundedWolfskinImagesloader. Remove obsolete Home card/See all/input/cache/shadow paths and duplicate Library image loading. Requests thumbnails retain their 96×144 slot and bitmap/URI model support; Discover retains its exact poster/backdrop slots and RGB565 requests. The shared interceptor preserves the strict global four-read limit. Requests recovery uses namedonClickwith the shared button API. Preserve main’s caption ellipsis/first-fact accent, overlay key precedence and selective Library focus registration.shell.viewbefore its enter effect and borrowed/clamped Home’s scroller. Main’s canonicalrememberedView(route)now binds each destination before effects; remove the supersededviewForAPI and migrate all callers. Home retains actual per-row horizontal states, restores track before page usingscrollToItem, and preserves the saved viewport without a return animation. Native Android focus stays with the existing shell; no second per-card focus system is introduced..pill.warn, not.saved.library/anddiscover/, including Discover text metadata, so one test cannot overwrite another renderer’s image. Keep every test, scenario and assertion. Home already useshome/.Review reports: per-element geometry and retained Library scope · five caption dots · native dot atlas · exact text mask rectangles · viewport failure/fix and native replay.
Implementation
HomeReadFacadeisolates real selected-user Jellyfin Resume/NextUp/newest/destination reads, atomic last-known-good projection and actual film/episode playback preflight. Reuse the missing-person guard before Home’s view-model mounts. Debug household data/artwork use the frozen fixture seam; no handwritten Conductarr HTTP or live-server test reads.Final merged-head verification
wolfskin-designJVM suiteappJVM suiteconductarr-clientJVM suitemake testmake apk-debug7,8remains one line; English captures retain7.8Every existing test remains; no assertion weakened. The missing-person regression retains its original backdrop/focus assertions plus the sign-in assertion. Final build logs, full XML and narrow failed-before/passed-after logs are in the bundle.
Approved key data replay the real Android shell/Home handler:
Capture exit check
All 23 pairs are prototype-left / native Compose-right, 1920×1080 at density 2.0, from the existing Robolectric/Roborazzi path. Each pair has raw images, a 4× diff and numeric RGB metrics in the bundle.
Font ruling: locked browser DejaVu Sans, mandated native platform Roboto. No font bundled, no per-title/per-row compensation, and no wrapping, ellipsis or ink-width parity claim. The table names every frame with measured text ink bounds (inclusive width×height in pixels, within the recorded mask rectangle); full line rows/bounds are in the reports. Other residual classes are reference JPEG compression, RGB565 poster quantisation, CSS/native blur/shadow/antialiasing, approved 1.05 control scale rather than 1.06, and omitted prototype sample pills. These numeric differences are evidence, not an automatic visual pass.
Native detail crops: Saved geometry · See all stroke · Episode weight · Caption separator.
Retained Library surface
Compared all 16 new native Library captures with the approved native halves from the earlier Libraries merge: 1 of 16 are pixel-identical. The earlier 15/16 statement predates Discover and is not claimed for this head. Main’s later canonical focus shadows/default caption ellipsis and the shared locked film-glyph stroke are retained rather than reverting them to satisfy an obsolete baseline. All changed pixel counts and bounds remain visible. All 16 measured scope rows.
Retained Requests surface
After both main merges and the shared cache/callback/focus-button migration, 1 of 8 native frames are pixel-identical to the approved Requests native halves. Main’s button-shadow fringe changes st-083/st-084 by maximum 7 channel levels; the other five nonzero frames change only 1–4 edge pixels (maximum 11 levels). Do not carry forward the earlier 8/8 equality claim from head
5033c171. All eight measured Requests scope rows.Retained Discover surface
Compared independently generated Discover captures with the approved merged Discover native halves: 24 of 28 are pixel-identical. The four remaining frames (st-029/033/037/105) change 55/158/55/158 rounded-poster-edge pixels, at maximum 4 channel levels; connected component bounds are retained in the bundle. [INFERENCE] These tiny edge changes are clip compositing through the shared card frame, not text or layout shifts. This comparison uses later main styles, not browser font parity. The three formerly colliding st-030/st-035/st-039 outputs are all exact against the approved Discover halves, and both independent renderer images now survive. All 28 measured Discover scope rows.
Proof bundle: Complete merged-head Home evidence.
Main integration and upstream files
Upstream files touched: none. No changes under
app/src/main/or upstream-owned tests. Reuse the existing upstream hook and destination registration.Resolve all main merges additively: preserve Home/Library/Requests/Discover routing, route memory, content-overlay key precedence, Settings muted avatar, Coming-in sheet, glyphs and all token groups; regenerate canonical Kotlin/CSS/checksum outputs. Reuse main’s
rememberedView,FocusLift, caption first-fact accent/default ellipsis and shared 8px See all gap; remove superseded APIs rather than aliases. Migrate Requests and Discover image callers into the canonical bounded loader without losing their model support, dimensions or strict four-read interception. Only capture output directories change in the two existing renderer tests; no assertion or scenario changes. Home See all and Discover continuation use the real merged destinations, not obsolete stubs.Fork integration lives under
app/src/wolfskin/andapp/src/test/java/org/justinvisser/wolfskin/tv/; shared UI/models/assets/tests live in:wolfskin-design. The scoped Home styles do not change shared typography defaults.docker/README.mddocuments the data, focus, scroll ownership and continuation contracts. GPL notices intact.Explicit boundaries and nonblocking follow-ups
Design review (Claude, cross-family) of head
b54bcc148c362a7332c502d96643b541eb2f7b83: REQUEST CHANGES — 3 blocking findings.Checked: side-by-side measurement of st-005..020, st-096, st-099..103 and x-home-discover-start at native resolution; spec 6.2 / 7.1 / 7.2 / 7.3 / 7.8 / 7.9; the six press-count paths (real key replay, real data; they fail if row order or skipping breaks); architecture (no
app/src/mainfile touched, one shell hook, one Jellyfin facade, per-person cache scope, no network in tests); hygiene (no test deleted/weakened, plain commits, no release/signing/version change). Font-only differences (DejaVu vs Roboto widths, wraps, ellipsis) accepted as named.Blocking:
Caption.kt.LineHeightStyle, so the 1.3 line box is not reproduced. Re-derive the spacing and re-measure.HomeScreenparks focus on the nav, and nothing hands it back to the hero when rows become focusable, so Play next is 3 presses rather than 2 (Resume 4, not 3). The press tests use a synchronous snapshot and cannot see it. Needs the fix plus a skeleton-to-loaded replay test.Non-blocking (N1-N8: Saved pill in the Discover header, progress bar clip/inset, episode ratings cache key, SDK-direct Resume/NextUp read, skeleton flash despite saved copy, Try again toast on Discover states, saved-chip border alpha, no capture for poster-only art) are in the full report:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31/report.md.No Gradle run (read and pixel review only). Commit status
review/design-claudeset to failure on this SHA.justinzeus referenced this pull request2026-11-05 20:37:28 +01:00
Design re-review (Claude, round 2) of head
061670848f45ece00c0ae6e69dda3a39014b2536: approve from design review (review/design-claude= success). No blocking findings.Checked at native resolution on the refreshed pairs, my own measurements:
HomeTypeplusexactLineBox; sharedType.*tokens are untouched. Hero kicker 0 (was -8); caption facts +2 and tile title/subtitle +2 (were -3 and -5); Home state panel bottom border st-016 0 and st-013 +1 (were -12 and -10). Remaining: a uniform +1..+2 px downward offset of Home text blocks, block-internal rhythm within 1 px. Not font-attributable by metrics; low severity, please name it in the PR text.HomeScreentakes hero focus when rows turn focusable if no key/nav input arrived while loading.asynchronousFreshHomePlaysNextInTwoPressesfails without the fix;asynchronousHomeDoesNotStealFocusAfterNavInputguards the other side.ShellSurface; no existing test deleted or weakened.Non-blocking, needs a ruling: the public design object
LibraryImageswas removed and replaced byWolfskinImages(all callers migrated, disk cache directory renamed), which conflicts with the "no public design-module API removed or renamed" check. Also sharedwolfskin_film.xmlstroke now matches the locked glyph and moves merged Library fallback glyph pixels (intentional). Other low items are in the report.Not run: Gradle/make or any device (lane reports 732 tests green at this head; not verified by me). Full report:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-31-r2/report.md.