Give TV cards roomy spacing and edge-straddling focus rings #40

Merged
justinzeus merged 3 commits from fm/tv-spacing-b7 into main 2026-11-06 13:24:16 +01:00
Owner

Outcome

Deliver TV walk build B7b with the approved Level 2 Roomy spacing, card/cast rings and library toolbar clearance. AI-assisted (fork-internal).

Final pushed head: 92c5661be0605fc8836eaf6c079ffd6a916d29f8.
Four debug APKs plus verified SHA256SUMS are ready at /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7b/. No device/ADB, release/signing or version changes.

Base and scope

Initially integrated the startup/navigation fixes by fast-forward from origin/fm/tv-walk-fix1 (9e15dbee). After those fixes landed, merged current origin/main (711dbebf), including the Anime-root Back correction (6e0f9952), into this branch. Startup/navigation change: #39 . Those fixes are preserved.

  • Copy the amended revision-3 spec tokens into the design module, update cast/name/grid title tokens, regenerate Kotlin/CSS/drift hashes.
  • Use 40 px card gaps, 44 px cast gaps, 84 px heading bands, 68 px shelf bottom gaps, 96 px poster caption bands and 524 px grid rows. Tiles become 400×225; wide cards 544×306. Poster/entry/circle art sizes and six/four/three/seven shelf slots stay unchanged.
  • Draw one 4 px accent stroke centred on card/cast art, above content, without a background gap, retaining the existing lift parameters and 1.08 scale. Lift membership expands: cast portraits and episode tiles now receive FocusLift.Card, previously None. All five card-ring call sites switch; controls, avatars, picker and selected-chip borders do not.
  • Use the new 136 px toolbar token for library/See all layout and both scroll-coordinate calculations; Discover and season-chip rows retain 104 px.
  • Give title shelves vertical drawing room for scaled rings rather than clipping their upper edges.
  • Letter rail choice: five columns while the rail is visible, six otherwise. The 200-title native capture clears the fifth focused card; navigation regression covers five-column Down/Up, rail entry/return and returning to six columns below the threshold.

Hero, nav, text sizes, caption content, colours, motion and behaviour outside this spacing/ring change stay as inherited from the base. Existing token readers for Home/Discover/title row heights, Home visible-row re-entry thresholds, caption placement, slots and paging are exercised by the final suite; no unrelated reader rewrites. Native capture tests record the real surface; they are not automated reference-pixel assertions. Pair pixel measurements are a separate check. Existing native capture suites regenerate their frames with the amended tokens. The checked-in library geometry manifest is updated. Review fixes decouple poster progress from caption spacing using Title.cardProgressInset (18 px per side, 220 px track), and key library focus-follow on effective columns, focused row and header geometry. LibrarySpacingRegressionTest renders and asserts both progress geometry and unchanged deep focused index/viewport across 199→200→199 titles.

Native-resolution comparison

The three 3840×1080 native | reference pairs are attached in the evidence comment. Each half remains 1920×1080; references are the supplied ref_library_shows.png, ref_tile_ring.png and ref_cast_ring.png.

Accent-ring raster bounds below are [left, top, right-exclusive, bottom-exclusive], measured in native pixels with the same lilac mask for both images.

Frame Native ring bounds Reference ring bounds Offset (L/T/R/B)
Shows, first poster 84 / 355 / 364 / 773 84 / 355 / 364 / 773 0 / 0 / 0 / 0 px
Home Next up, first tile 78 / 241 / 514 / 488 78 / 241 / 514 / 488 0 / 0 / 0 / 0 px
Title Cast, first person 86 / 238 / 306 / 457 86 / 238 / 306 / 457 0 / 0 / 0 / 0 px

Library chips remain y 252–320; first art row y 372 gives 52 px chip-to-art clearance. Poster art scales to 276.48×414.72 at x 85.76/y 356.64. Next-up tiles start at y 252 and x 96/536/976/1416; its next heading is y 545. Cast circles start at y 252 and x 96/340/584; resting name line boxes start at y 488 (focused name box y 494.48 from the unchanged whole-card scale). Native Cast/More like this headings are at y 168/630.

Ring-to-neighbour clearance Before scaling ring itself Including ring scale
Poster 27.76 px ≈ 28 27.60 px
Tile 22.00 px 21.84 px
Wide 16.24 px ≈ 16 16.08 px

These clearances derive from the amended 40 px gap, measured card dimensions and 1.08 scale (gap − width×0.04 − ringOutside). Wide clearance is geometry-derived, not a claim of a real-box multi-resume walk. The focused fifth poster in the native rail frame ends at raster x 1548; the rail lane begins at x 1772, leaving 224 px.

Font and unchanged reference differences

Platform Roboto remains intentionally unchanged. Both versions retain one-line names/captions; their ink metrics differ: Ruth Wilson is 138 px wide natively versus 172 px in the browser, with ink top y 495 versus 493; focused Tom Hardy is 135 versus 167 px wide, ink top y 502 versus 499. The focused Shows caption is 335 versus 431 px wide, ink top y 801 versus 799. Next up ink top is y 176 versus 177; the next heading is y 552 versus 553. No font or per-title compensation was added.

Not done/outside this change: the prototype's second Shows row includes Stage at column three, unlike the existing native fixture order; the prototype Cast frame includes a sample pill that native screens already omit. The inherited startup/navigation fix makes the scrolled nav band opaque. No attempt was made to undo those existing differences, redesign control rings, refresh the source prototype gallery, or exercise real-player Back/device playback.

Verification

  • Native Robolectric smoke rendered the shipped Shows, Home Next up and title Cast surfaces at 1920×1080 before the final gates; B7b targeted run re-recorded the same frames and separate pixel measurement still found zero ring-bound offsets.
  • Historical B7 make test on c17447c5: passed, 674 app + 181 design + 17 client tests = 872; zero failures/errors/skips. Includes native captures, Home key/viewport re-entry paths, library paging/rail/scroll paths and title keys. Client runtime smoke also passed live-profile → disk reopen → ETag 304 → HTTP 503 retention.
  • B7b targeted tests passed (24 total: 15 design, 9 app; zero failures/errors/skips): new progress/rail regressions; spacing recordings; design shell keys/snapshot reads; app shell routing/startup, fresh sign-in navigation, Anime availability and Anime-root removal. No full-suite rerun after the main merge/review fixes.
  • One B7b final-head make apk-debug: passed, including branding inspection of all four packaged debug APKs. Copied them immediately, then sha256sum -c SHA256SUMS passed all four.
  • No Maven fallback, native-abort rerun or untracked Gradle override was needed in either B7 or B7b. Worktree clean after commit and push.

Proof, pairs, pixel measurements and gate logs: /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/. Real-TV installation/walk remains with firstmate; no device result is claimed here.

library-shows-native-reference.png
tile-ring-native-reference.png
cast-ring-native-reference.png

## Outcome Deliver TV walk build B7b with the approved Level 2 Roomy spacing, card/cast rings and library toolbar clearance. AI-assisted (fork-internal). Final pushed head: `92c5661be0605fc8836eaf6c079ffd6a916d29f8`. Four debug APKs plus verified `SHA256SUMS` are ready at `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7b/`. No device/ADB, release/signing or version changes. ## Base and scope Initially integrated the startup/navigation fixes by fast-forward from `origin/fm/tv-walk-fix1` (`9e15dbee`). After those fixes landed, merged current `origin/main` (`711dbebf`), including the Anime-root Back correction (`6e0f9952`), into this branch. Startup/navigation change: https://git.justinvisser.org/justinzeus/wolfskin/pulls/39 . Those fixes are preserved. - Copy the amended revision-3 spec tokens into the design module, update cast/name/grid title tokens, regenerate Kotlin/CSS/drift hashes. - Use 40 px card gaps, 44 px cast gaps, 84 px heading bands, 68 px shelf bottom gaps, 96 px poster caption bands and 524 px grid rows. Tiles become 400×225; wide cards 544×306. Poster/entry/circle art sizes and six/four/three/seven shelf slots stay unchanged. - Draw one 4 px accent stroke centred on card/cast art, **above** content, without a background gap, retaining the existing lift parameters and 1.08 scale. Lift membership expands: cast portraits and episode tiles now receive `FocusLift.Card`, previously `None`. All five card-ring call sites switch; controls, avatars, picker and selected-chip borders do not. - Use the new 136 px toolbar token for library/See all layout and both scroll-coordinate calculations; Discover and season-chip rows retain 104 px. - Give title shelves vertical drawing room for scaled rings rather than clipping their upper edges. - **Letter rail choice: five columns while the rail is visible**, six otherwise. The 200-title native capture clears the fifth focused card; navigation regression covers five-column Down/Up, rail entry/return and returning to six columns below the threshold. Hero, nav, text sizes, caption content, colours, motion and behaviour outside this spacing/ring change stay as inherited from the base. Existing token readers for Home/Discover/title row heights, Home visible-row re-entry thresholds, caption placement, slots and paging are exercised by the final suite; no unrelated reader rewrites. Native capture tests record the real surface; they are not automated reference-pixel assertions. Pair pixel measurements are a separate check. Existing native capture suites regenerate their frames with the amended tokens. The checked-in library geometry manifest is updated. Review fixes decouple poster progress from caption spacing using `Title.cardProgressInset` (18 px per side, 220 px track), and key library focus-follow on effective columns, focused row and header geometry. `LibrarySpacingRegressionTest` renders and asserts both progress geometry and unchanged deep focused index/viewport across 199→200→199 titles. ## Native-resolution comparison The three 3840×1080 **native | reference** pairs are attached in the evidence comment. Each half remains 1920×1080; references are the supplied `ref_library_shows.png`, `ref_tile_ring.png` and `ref_cast_ring.png`. Accent-ring raster bounds below are `[left, top, right-exclusive, bottom-exclusive]`, measured in native pixels with the same lilac mask for both images. | Frame | Native ring bounds | Reference ring bounds | Offset (L/T/R/B) | |---|---|---|---| | Shows, first poster | 84 / 355 / 364 / 773 | 84 / 355 / 364 / 773 | 0 / 0 / 0 / 0 px | | Home Next up, first tile | 78 / 241 / 514 / 488 | 78 / 241 / 514 / 488 | 0 / 0 / 0 / 0 px | | Title Cast, first person | 86 / 238 / 306 / 457 | 86 / 238 / 306 / 457 | 0 / 0 / 0 / 0 px | Library chips remain y 252–320; first art row y 372 gives 52 px chip-to-art clearance. Poster art scales to 276.48×414.72 at x 85.76/y 356.64. Next-up tiles start at y 252 and x 96/536/976/1416; its next heading is y 545. Cast circles start at y 252 and x 96/340/584; resting name line boxes start at y 488 (focused name box y 494.48 from the unchanged whole-card scale). Native Cast/More like this headings are at y 168/630. | Ring-to-neighbour clearance | Before scaling ring itself | Including ring scale | |---|---:|---:| | Poster | 27.76 px ≈ 28 | 27.60 px | | Tile | 22.00 px | 21.84 px | | Wide | 16.24 px ≈ 16 | 16.08 px | These clearances derive from the amended 40 px gap, measured card dimensions and 1.08 scale (`gap − width×0.04 − ringOutside`). Wide clearance is geometry-derived, not a claim of a real-box multi-resume walk. The focused fifth poster in the native rail frame ends at raster x 1548; the rail lane begins at x 1772, leaving 224 px. ## Font and unchanged reference differences Platform Roboto remains intentionally unchanged. Both versions retain one-line names/captions; their ink metrics differ: Ruth Wilson is 138 px wide natively versus 172 px in the browser, with ink top y 495 versus 493; focused Tom Hardy is 135 versus 167 px wide, ink top y 502 versus 499. The focused Shows caption is 335 versus 431 px wide, ink top y 801 versus 799. Next up ink top is y 176 versus 177; the next heading is y 552 versus 553. No font or per-title compensation was added. Not done/outside this change: the prototype's second Shows row includes Stage at column three, unlike the existing native fixture order; the prototype Cast frame includes a sample pill that native screens already omit. The inherited startup/navigation fix makes the scrolled nav band opaque. No attempt was made to undo those existing differences, redesign control rings, refresh the source prototype gallery, or exercise real-player Back/device playback. ## Verification - Native Robolectric smoke rendered the shipped Shows, Home Next up and title Cast surfaces at 1920×1080 before the final gates; B7b targeted run re-recorded the same frames and separate pixel measurement still found zero ring-bound offsets. - **Historical B7 `make test` on `c17447c5`: passed**, 674 app + 181 design + 17 client tests = 872; zero failures/errors/skips. Includes native captures, Home key/viewport re-entry paths, library paging/rail/scroll paths and title keys. Client runtime smoke also passed live-profile → disk reopen → ETag 304 → HTTP 503 retention. - **B7b targeted tests passed (24 total: 15 design, 9 app; zero failures/errors/skips)**: new progress/rail regressions; spacing recordings; design shell keys/snapshot reads; app shell routing/startup, fresh sign-in navigation, Anime availability and Anime-root removal. No full-suite rerun after the main merge/review fixes. - **One B7b final-head `make apk-debug`: passed**, including branding inspection of all four packaged debug APKs. Copied them immediately, then `sha256sum -c SHA256SUMS` passed all four. - No Maven fallback, native-abort rerun or untracked Gradle override was needed in either B7 or B7b. Worktree clean after commit and push. Proof, pairs, pixel measurements and gate logs: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/`. Real-TV installation/walk remains with firstmate; no device result is claimed here. [library-shows-native-reference.png](https://git.justinvisser.org/attachments/32347771-e3ed-43d6-b953-80f85bf47eb4) [tile-ring-native-reference.png](https://git.justinvisser.org/attachments/7d669c6a-f581-4f87-9d19-df95cc3de813) [cast-ring-native-reference.png](https://git.justinvisser.org/attachments/6d7d8d12-4783-4ef6-9a51-87ef6a0be4a3)
justinzeus added 7 commits 2026-11-06 13:00:24 +01:00
Author
Owner

B7 native | reference comparison pairs

Evidence for the roomy TV spacing change: #40 . Final pushed head c17447c528ed66db480ca55654005cfc55071316. Each attachment is lossless 3840×1080, with native 1920×1080 on the left and the supplied 1920×1080 reference on the right. Open the image at native size to inspect the inset/outside stroke.

Shows library — first poster focused

Native Shows library | amended reference

Ring bounds in both halves: [84,355,364,773) px. Native minus reference L/T/R/B: 0/0/0/0 px. Chips bottom y 320; art starts y 372; clearance 52 px. Poster pitch 296 px. Ring-to-neighbour: 27.76 px before ring scale, 27.60 px including it (rounded acceptance: 28 px). Caption ink top: native y 801 vs reference y 799; the unchanged Roboto caption is 335 vs 431 px wide, one line in both. Native fixture ordering differs in row two because the prototype contains Stage at column three; not changed here.

Home Next up — first tile focused

Native Next up | amended reference

Ring bounds in both halves: [78,241,514,488) px. Native minus reference L/T/R/B: 0/0/0/0 px. Resting tile art is 400×225 px, starts y 252 at x 96/536/976/1416. Next heading is y 545. Ring-to-neighbour: 22.00 px before ring scale, 21.84 px including it. Heading ink top differs by −1 px (native y 176, reference y 177); narrower Roboto text is unchanged.

Title Cast — first person focused

Native Cast | amended reference

Ring bounds in both halves: [86,238,306,457) px. Native minus reference L/T/R/B: 0/0/0/0 px. Resting circles start y 252, x 96/340/584 (200 px circle, 244 px pitch). Resting name line boxes start y 488; the focused name box is y 494.48 after the unchanged whole-card scale. Ruth Wilson's ink is 138 vs 172 px wide, top y 495 vs 493; focused Tom Hardy is 135 vs 167 px wide, top y 502 vs 499. Both remain one line. The prototype sample pill remains intentionally absent in native output.

Wide-card geometry remains 544×306, pitch 584, three slots; derived ring-to-neighbour clearance 16.24 px before ring scale, 16.08 px including it (rounded acceptance: 16 px). This is a geometry measurement, not a real-box multi-resume walk claim.

The separate 200-title native rail capture uses five columns while the rail is visible; the fifth focused poster's ring ends at x 1548, clear of the x 1772 rail lane by 224 px. Below the threshold, or without the A–Z rail, grids remain six columns.

Final gates passed once each: make test (872 tests, zero failures/errors/skips) and make apk-debug (four APKs; branding checks passed). B7 APKs and verified SHA256SUMS are in /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7/. Full captures, pairs, measurements and logs: /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/. No ADB/device or playback actions.

## B7 native | reference comparison pairs Evidence for the roomy TV spacing change: https://git.justinvisser.org/justinzeus/wolfskin/pulls/40 . Final pushed head `c17447c528ed66db480ca55654005cfc55071316`. Each attachment is lossless 3840×1080, with native 1920×1080 on the left and the supplied 1920×1080 reference on the right. Open the image at native size to inspect the inset/outside stroke. ### Shows library — first poster focused ![Native Shows library | amended reference](https://git.justinvisser.org/attachments/32347771-e3ed-43d6-b953-80f85bf47eb4) Ring bounds in both halves: `[84,355,364,773)` px. Native minus reference L/T/R/B: **0/0/0/0 px**. Chips bottom y 320; art starts y 372; clearance **52 px**. Poster pitch **296 px**. Ring-to-neighbour: **27.76 px before ring scale**, **27.60 px including it** (rounded acceptance: 28 px). Caption ink top: native y 801 vs reference y 799; the unchanged Roboto caption is 335 vs 431 px wide, one line in both. Native fixture ordering differs in row two because the prototype contains Stage at column three; not changed here. ### Home Next up — first tile focused ![Native Next up | amended reference](https://git.justinvisser.org/attachments/7d669c6a-f581-4f87-9d19-df95cc3de813) Ring bounds in both halves: `[78,241,514,488)` px. Native minus reference L/T/R/B: **0/0/0/0 px**. Resting tile art is **400×225 px**, starts y 252 at x **96/536/976/1416**. Next heading is y **545**. Ring-to-neighbour: **22.00 px before ring scale**, **21.84 px including it**. Heading ink top differs by −1 px (native y 176, reference y 177); narrower Roboto text is unchanged. ### Title Cast — first person focused ![Native Cast | amended reference](https://git.justinvisser.org/attachments/6d7d8d12-4783-4ef6-9a51-87ef6a0be4a3) Ring bounds in both halves: `[86,238,306,457)` px. Native minus reference L/T/R/B: **0/0/0/0 px**. Resting circles start y **252**, x **96/340/584** (200 px circle, 244 px pitch). Resting name line boxes start y **488**; the focused name box is y **494.48** after the unchanged whole-card scale. Ruth Wilson's ink is 138 vs 172 px wide, top y 495 vs 493; focused Tom Hardy is 135 vs 167 px wide, top y 502 vs 499. Both remain one line. The prototype sample pill remains intentionally absent in native output. Wide-card geometry remains **544×306**, pitch **584**, three slots; derived ring-to-neighbour clearance **16.24 px before ring scale**, **16.08 px including it** (rounded acceptance: 16 px). This is a geometry measurement, not a real-box multi-resume walk claim. The separate 200-title native rail capture uses **five columns** while the rail is visible; the fifth focused poster's ring ends at x 1548, clear of the x 1772 rail lane by 224 px. Below the threshold, or without the A–Z rail, grids remain six columns. Final gates passed once each: `make test` (872 tests, zero failures/errors/skips) and `make apk-debug` (four APKs; branding checks passed). B7 APKs and verified `SHA256SUMS` are in `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7/`. Full captures, pairs, measurements and logs: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/`. No ADB/device or playback actions.
Author
Owner

TV roomy spacing review — changes required

Reviewed head: c17447c528ed66db480ca55654005cfc55071316.
Scope: spacing commit only, origin/fm/tv-walk-fix1...HEAD after 9e15dbee8c97dede2fba370693f09eaba736f403. Earlier startup/navigation changes excluded.

Blocking regressions

B1 — Caption spacing also narrows already-merged poster progress bars. WolfskinTokens.kt:149 changes Layout.captionOffset from 9 to 19 dp. LibraryPoster.kt:43-46 also uses that token for horizontal progress padding, so partially watched posters now have 38 px rather than 18 px insets: track width 220 → 180 px on unchanged 256 px art. That consumer exists on origin/main; the amended prototype still specifies left:18px; right:18px for .card .prog (amended index.html:139). Keep the new caption spacing but decouple the progress inset using an appropriate existing 9 dp progress token. This affects Library and other LibraryPoster consumers, not Home's separate renderer. Source/token calculation; this state was not newly rendered by the reviewer.

B2 — A library refresh crossing the rail threshold can strand retained focus offscreen. LibraryGridState.kt:94,105 dynamically switches six→five columns at 200 A–Z titles, but the focus-follow effect at LibraryScreen.kt:91-99 is not keyed on column count or effective focused row. The production snapshot path (WolfskinLibrary.kt:84-90) updates source while retaining the same focused identity/index. Example: 199 titles, index 198; append a title sorting last. Index stays 198 but row changes 33→39, requiring 3144 px additional scroll. No effect key changes. Regrouping first-title row keys (LibraryScreen.kt:131-134) does not preserve the focused row generally. [INFERENCE: exact viewport outcome from source, not a new Android reproduction.] Reconcile scroll on effective layout changes while retaining ordinary Back restoration; cover an unchanged deep focus across 199↔200 titles. The new controller test resets index and does not exercise this transition.

Checks that pass

  • Spec tokens are JSON-identical; all build-delta card/layout/focus/title values, px/dp conversions and slot counts verified. python3 wolfskin-design/generate_tokens.py --check → Token drift check passed; generated Kotlin/CSS/manifest agree with all inputs.
  • Single above-content 4 px straddle stroke, scale 1.08, no gap; audited poster/tile/wide/entry/See all/recovery/cast/episode callers and inner-versus-parent clipping. Static shelf draw room is sufficient. Buttons, avatars, picker and selected-chip border remain unchanged.
  • Library toolbar and both scroll coordinate calculations use 136 px only when the toolbar exists; Discover/seasons remain 104 px. First art y372, chip bottom y320. Pitches/slots and catalogue pagination remain consistent.
  • Five columns genuinely apply only while the rail is visible. Supplied native rail capture clears the focused fifth ring; calculated edge x1548.4 versus rail x1772. B2 is the live-transition defect, not the static geometry.
  • Inspected supplied native/reference frames. Independently decoded/measured original native and reference PNGs: Shows ring 84/355/364/773, Next up 78/241/514/488, Cast 86/238/306/457; native/reference match exactly. Supplied reference SHA-256 values match. Font metrics/fixture differences are inherited and documented.
  • Compared every test/capture change before/after: no assertion removal or tolerance loosening. Rail assertions correctly move edge index 5→4 and add five-column strides/return-to-six coverage.

Non-blocking notes

  1. Card lift parameters are unchanged, but TitleShelf.kt:67,118 adds FocusLift.Card to previously shadowless cast/episode paths. This agrees with card treatment and the supplied cast frame, but “lift unchanged” should distinguish parameters from recipients.
  2. Capture helpers are record-only, not automatic reference-image assertions. The updated library-screen.json geometry is descriptive; its discovered consumer reads press paths only. Passing capture tests do not independently assert pixel parity or live rail transitions.

Shared-source inventory: generated WolfskinTokens (no Type/colour/motion/hero/nav changes), Focus.focusRing, TitleCard, CatalogueRecoveryCard, DiscoverShelf entry ring, TitleCast/TitleMediaShelf/episode TitlePoster, LibraryToolbar and library scroll calculations, and LibraryGridState.columns. Scoped as requested except B1, B2 and the noted shadow-recipient change.

No Gradle/make/build/device commands were run by this reviewer. Supplied builder logs report successful gates; firstmate's Xiaomi walk is separate supplied evidence. No security/data-safety issue found. No code edits, push, approval or merge.

Standalone report: /root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-40/report.md.

## TV roomy spacing review — changes required Reviewed head: `c17447c528ed66db480ca55654005cfc55071316`. Scope: spacing commit only, `origin/fm/tv-walk-fix1...HEAD` after `9e15dbee8c97dede2fba370693f09eaba736f403`. Earlier startup/navigation changes excluded. ### Blocking regressions **B1 — Caption spacing also narrows already-merged poster progress bars.** `WolfskinTokens.kt:149` changes `Layout.captionOffset` from 9 to 19 dp. `LibraryPoster.kt:43-46` also uses that token for horizontal progress padding, so partially watched posters now have 38 px rather than 18 px insets: track width **220 → 180 px** on unchanged 256 px art. That consumer exists on `origin/main`; the amended prototype still specifies `left:18px; right:18px` for `.card .prog` (amended `index.html:139`). Keep the new caption spacing but decouple the progress inset using an appropriate existing 9 dp progress token. This affects Library and other `LibraryPoster` consumers, not Home's separate renderer. Source/token calculation; this state was not newly rendered by the reviewer. **B2 — A library refresh crossing the rail threshold can strand retained focus offscreen.** `LibraryGridState.kt:94,105` dynamically switches six→five columns at 200 A–Z titles, but the focus-follow effect at `LibraryScreen.kt:91-99` is not keyed on column count or effective focused row. The production snapshot path (`WolfskinLibrary.kt:84-90`) updates source while retaining the same focused identity/index. Example: 199 titles, index 198; append a title sorting last. Index stays 198 but row changes 33→39, requiring 3144 px additional scroll. No effect key changes. Regrouping first-title row keys (`LibraryScreen.kt:131-134`) does not preserve the focused row generally. **[INFERENCE: exact viewport outcome from source, not a new Android reproduction.]** Reconcile scroll on effective layout changes while retaining ordinary Back restoration; cover an unchanged deep focus across 199↔200 titles. The new controller test resets index and does not exercise this transition. ### Checks that pass - Spec tokens are JSON-identical; all build-delta card/layout/focus/title values, px/dp conversions and slot counts verified. `python3 wolfskin-design/generate_tokens.py --check` → `Token drift check passed`; generated Kotlin/CSS/manifest agree with all inputs. - Single above-content 4 px straddle stroke, scale 1.08, no gap; audited poster/tile/wide/entry/See all/recovery/cast/episode callers and inner-versus-parent clipping. Static shelf draw room is sufficient. Buttons, avatars, picker and selected-chip border remain unchanged. - Library toolbar and both scroll coordinate calculations use 136 px only when the toolbar exists; Discover/seasons remain 104 px. First art y372, chip bottom y320. Pitches/slots and catalogue pagination remain consistent. - Five columns genuinely apply only while the rail is visible. Supplied native rail capture clears the focused fifth ring; calculated edge x1548.4 versus rail x1772. B2 is the live-transition defect, not the static geometry. - Inspected supplied native/reference frames. Independently decoded/measured original native and reference PNGs: Shows ring **84/355/364/773**, Next up **78/241/514/488**, Cast **86/238/306/457**; native/reference match exactly. Supplied reference SHA-256 values match. Font metrics/fixture differences are inherited and documented. - Compared every test/capture change before/after: no assertion removal or tolerance loosening. Rail assertions correctly move edge index 5→4 and add five-column strides/return-to-six coverage. ### Non-blocking notes 1. Card lift parameters are unchanged, but `TitleShelf.kt:67,118` adds `FocusLift.Card` to previously shadowless cast/episode paths. This agrees with card treatment and the supplied cast frame, but “lift unchanged” should distinguish parameters from recipients. 2. Capture helpers are record-only, not automatic reference-image assertions. The updated `library-screen.json` geometry is descriptive; its discovered consumer reads press paths only. Passing capture tests do not independently assert pixel parity or live rail transitions. Shared-source inventory: generated `WolfskinTokens` (no Type/colour/motion/hero/nav changes), `Focus.focusRing`, `TitleCard`, `CatalogueRecoveryCard`, `DiscoverShelf` entry ring, `TitleCast`/`TitleMediaShelf`/episode `TitlePoster`, `LibraryToolbar` and library scroll calculations, and `LibraryGridState.columns`. Scoped as requested except B1, B2 and the noted shadow-recipient change. No Gradle/make/build/device commands were run by this reviewer. Supplied builder logs report successful gates; firstmate's Xiaomi walk is separate supplied evidence. No security/data-safety issue found. No code edits, push, approval or merge. Standalone report: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-wolfskin-40/report.md`.
justinzeus added 2 commits 2026-11-06 13:22:39 +01:00
Preserve poster progress and focus across library rail changes
All checks were successful
review/code-gpt GPT review blockers fixed and read by firstmate: poster progress inset back to Title.cardProgressInset (220 px track) with test tag + regression; library focus-follow effect keyed on columns/focusedRow/header/rowHeight with a 199<->200 regression; token values/ring bounds/toolbar gap passed review on c17447c5; walked on the real box
92c5661be0
Author
Owner

B7b: review blockers fixed and landed navigation base included

Final pushed head: 92c5661be0605fc8836eaf6c079ffd6a916d29f8. Merged origin/main at 711dbebf, preserving the Anime-root Back correction.

  • Poster progress: use Title.cardProgressInset, independent of the enlarged caption offset. LibrarySpacingRegressionTest.partiallyWatchedPosterKeepsItsOriginalProgressInsets renders a partially watched 256 px poster and asserts a 220 px track with 18 px left/right insets.
  • Live letter-rail transitions: focus-follow now keys effective column count, derived focused row, header count, row height and density. crossingRailThresholdKeepsTheSameDeepFocusedPosterVisible renders index 198 and asserts its identity, displayed viewport top and full height survive 199→200→199 titles without a directional key. The production fix is under 20 lines.
  • Wording corrected: lift parameters remain unchanged, but cast portraits and episode tiles now also receive FocusLift.Card. Capture tests record the native surface; reference-pixel measurement is separate, not an assertion provided by those capture tests.

Targeted tests passed: 24 tests (15 design, 9 app), zero failures/errors/skips, covering both new regressions, spacing recordings, shell keys/snapshot reads/routing/startup, first-sign-in navigation, Anime availability and Anime-root removal. Separate measurement of the regenerated three comparison frames still gives 0/0/0/0 px ring-bound offsets. The existing attachment pairs remain representative. The 872-test full suite on c17447c5 remains historical evidence; no full-suite loop was run.

One final-head make apk-debug passed; all four APKs were copied immediately and sha256sum -c SHA256SUMS passed. Install set: /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7b/. Targeted XML results, refreshed measurements and APK log: /root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/. Worktree clean. No device/ADB/release/signing actions.

## B7b: review blockers fixed and landed navigation base included Final pushed head: `92c5661be0605fc8836eaf6c079ffd6a916d29f8`. Merged `origin/main` at `711dbebf`, preserving the Anime-root Back correction. - **Poster progress:** use `Title.cardProgressInset`, independent of the enlarged caption offset. `LibrarySpacingRegressionTest.partiallyWatchedPosterKeepsItsOriginalProgressInsets` renders a partially watched 256 px poster and asserts a 220 px track with 18 px left/right insets. - **Live letter-rail transitions:** focus-follow now keys effective column count, derived focused row, header count, row height and density. `crossingRailThresholdKeepsTheSameDeepFocusedPosterVisible` renders index 198 and asserts its identity, displayed viewport top and full height survive 199→200→199 titles without a directional key. The production fix is under 20 lines. - **Wording corrected:** lift parameters remain unchanged, but cast portraits and episode tiles now also receive `FocusLift.Card`. Capture tests record the native surface; reference-pixel measurement is separate, not an assertion provided by those capture tests. Targeted tests passed: **24 tests (15 design, 9 app), zero failures/errors/skips**, covering both new regressions, spacing recordings, shell keys/snapshot reads/routing/startup, first-sign-in navigation, Anime availability and Anime-root removal. Separate measurement of the regenerated three comparison frames still gives **0/0/0/0 px** ring-bound offsets. The existing attachment pairs remain representative. The 872-test full suite on `c17447c5` remains historical evidence; no full-suite loop was run. **One final-head `make apk-debug` passed**; all four APKs were copied immediately and `sha256sum -c SHA256SUMS` passed. Install set: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b7b/`. Targeted XML results, refreshed measurements and APK log: `/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-spacing-b7/`. Worktree clean. No device/ADB/release/signing actions.
justinzeus merged commit f37ad0f0fe into main 2026-11-06 13:24:16 +01:00
Sign in to join this conversation.
No reviewers
No labels
exploring
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: justinzeus/wolfskin#40
No description provided.