# Title-page review fixes — exact final head Source: `cd625b4227ce8baa57512df50c8e74e57f5b42a9`. Additive merge includes native Home from main `9dd321f07e82393bd7afc2f470e4b61789907e13`; no LibraryImages shim was resurrected. All 13 requested changes are implemented. This is measured evidence for re-review, not self-approval of design fidelity. References are the reviewer's frozen Chromium geometry (`review-wolfskin-34/evidence/proto-*.json`) and locked 1920×1080 JPEGs. Native captures are 1920×1080 at density2.0, generated by the actual Compose surfaces under native Robolectric/Roborazzi. `measure_findings.py` reproduces the numbers in `measurements.json`; full native text and element dumps accompany all34 title-family pairs. ## Every requested finding | Finding | Frozen target / former defect | Final observation and residual | |---|---|---| | D1 Header CSS geometry | Preserve33.8px kicker,89.76px title line,38px facts,36.4px overview lines and actual negative progress margins; old native stack drifted8–18px. | Shared fractional CSS layout restores facts y358 vs357.5, film actions y553 vs552.7, series actions y603 vs602.5. Native title ink y261–327 vs260–327; year ink367–387 vs364–385; overview ink416–443/453–480/490–511 vs414–442/450–478/487–509. Residual glyph baselines1–3px are explicit. The native heading TextLayoutResult natural box `[96,245,327,349]` is104px high and is NOT claimed to be its surrounding89.76px CSS line box. No fontflow excuse remains for stack geometry. | | D2 Progress and episode marks | Progress is26px regular400, not Medium500. Episode order is TMDB mark → Ep → score. | Actual progress weight400; native progress bounds `[96,539,457,573]`, source row y538.7. Native TMDB x578–625 → Ep x633–663 →7.8 x671–709. Source corresponding x645.6/700.4/744.8 differs because the Roboto progress string is361px wide versus DejaVu415.4px; order, weight and line box are fixed. | | D3 Focused-button lift | Canonical shadow0px x/12px y/40px blur/50% black was absent. | TitleControl uses shared FocusLift.Button. Five pixels below the native Undo outer-ring run, y425, mean RGB is14.54/14.54/20.00, no longer flat19/19/26. Equivalent frozen Undo sample y472 is15/14/19. Absolute y differs because the approved Simulated disclaimer is removed. Native and Chromium kernels are not asserted identical. | | D4 Focused selected radio inset | Selected plus focused radio retains its3px dark inset stroke, not a flat accent disk. | Both Version044 and Audio046 show native core RGB108/85/135 versus frozen core about106–111/82–89/129–148. Native horizontal dark-core runs are2px and3px plus AA; declared stroke is3px. Frozen fully dark runs are3px plus JPEG edges. Centre y286 vs285 for Version and298 vs298 for Audio. Approved row scale1.02 versus frozen1.03 changes transformed x bounds. | | D5 Watched-eye ring | Hide the inset watched-state ring while focused. | Native eye-centre scan has exactly TWO accent runs, y543–547 and635–639; no extra inset pair. Frozen outer runs are about542–545 and635–638. Native four-pixel canonical stroke versus three thresholded JPEG pixels remains documented. | | D6 Sheet button margins | Restore12px top margin for Media info Close, confirmation actions, and Undo/Done. | Native Close top845.1px versus reviewer's approximate image target844px; the scraper has no Close node. Native Mark as watched top283.1 vs Chromium282.5. Native Undo top332.1 vs frozen378.9 minus the approved31.2px disclaimer and16px gap =331.7; residual0.4px is consistent with approved1.05 versus1.06 button scaling. | | D7 Fractional media table |31.2px lines +6px gaps; old independent rounding accumulated about12px. | Container top263, Dutch top789: whole-table span526px versus source526.078125px. Fractional positions accumulate before rounding; adjacent observed pitch alternates37/38 instead of rounding every row to38. Existing pair assertion retained and a526.2±1 whole-span regression passes. | | D8 Loading skeleton gaps | Blocks y200/260/376/440/584 with gaps26/24/30/34, not a uniform-gap approximation. | Native blocks `[200,234]`, `[260,352]`, `[376,410]`, `[440,550]`, `[584,660]`, exactly the declared CSS geometry. JPEG thresholding yields441–549 and585–660 for the last two interiors. No spinner, loading copy or stale shelves. | | D9 Cast and poster captions | Preserve name/role/facts CSS line boxes; do not contract the stack by3–4px or damage siblings. | Unfocused character box starts478 vs source477.8. Focused Ruth character ink493–512 vs491–515; INVINCIBLE facts ink673–690 vs671–689:2px top residual from glyph ink, not contracted layout. Shared Caption keeps merged Home's style/overflow API and role/ownership flex shrinking.84 fresh namespaced sibling captures were compared and inspected;36 are byte-identical to published native baselines,48 have explicit deltas. Family numbers are below; no missing poster, shifted shelf, lost focus state or clipping regression was observed. | | D10 Rating-plate fade | Preserve the inherited inline descender; focused fades formerly ended about8px too early. | Unshrunk native plate100px versus source100.2, including shared6.6px inline descender. Focused clipped fade ends315.24 in056 vs reference about316, and320.64 in104 vs about321. At x330/y316, st104 RGB is EXACTLY179/191/117 in both; y300 is native138/145/87 vs136/146/85, y321 is191/204/125 vs190/202/126. Smaller multi-score plates retain their proportionate font sizing rather than forcing every row to100px. | | F1 Subtitle Off persistence | UI Off−1 must mean playback disabled, not upstream unspecified−1/preferred language. | Actual facade regression proves UI−1 stores TrackIndex.DISABLED−2; UNSPECIFIED−1 is never written. A subsequent real subtitle index8 remains8. No live endpoint in the test. | | F2 Focused sheet scrolling | D-pad focus must remain visible beyond the initial viewport. | Real sheet regression traverses20 focusable choices including Done with19 Down events. Every focused row's visible bounds stay inside the viewport with visible height>20px; Done closes the sheet without promoting nav focus. BringIntoViewRequester is attached to actual focused choices and footer controls. | | F3 Async person focus | A real delayed person load must focus first credit, not retain the nav/loading focus owner. | Real TitleDestination + WolfskinTitleViewModel regression delays the facade reply, proves loading Down is inert, completes the person read, then observes credit0/nav false. Actual Right reaches credit1/nav false. Both async title/person scenarios pass; PersonSurface owns the mounted ready transition, not a racing parent effect. | ## Full launch paths — no deferred prefixes The four TitleLaunchKeysTest cases use the actual Who's watching, native Home hero/shelves, title/person components and production focus handling. Every fixture key is replayed, including Home navigation. No direct row/focus assignment substitutes for input. | Path | Actual key presses | Observed outcome | |---|---:|---| | Launch → title → nav |4| Nav owns the current tab while the title is retained | | Launch → title → switch person |8| Mindel selected, chooser closed, and Home route active | | Launch → Locke → second version → Play |15| Source v2 selected, sheet closed, and Play for Locke emitted | | Launch → Locke → cast/person |11| Tom Hardy person route reached through the cast row | The Home prefix reaches Locke through its real current ordering: three Down events then four Right events in Your movies. No fixture reordering or placeholder hero remains. The older suffix-only tests are retained as additional coverage. ## Shared-component siblings `measure_siblings.py` selects fresh `home/`, `library/`, `discover/` captures and the actual root Requests/shell outputs. It deliberately ignores stale flat root Library/Discover staging copies. Before is each sibling lane's published native PNG; all full hashes, baseline paths, thresholded pixel deltas and locked-reference errors are in `sibling-captures.json` and `.md`. The92-file pre-review flat staging hash record is preserved separately and its exact-match flags are explicit. Published-baseline identity is not misrepresented as a particular source-commit guarantee. | Family | Byte-identical | Changed PNGs | Largest native mean RGB delta / pixels >12 | |---|---:|---:|---| | Native Home |11|11|0.5234 /0.7032% | | Library |1|15|0.5024 /0.9496% | | Discover |18|10|0.6950 /0.7205% | | Requests |0|8|7.1176 /5.9045% | | Shell fixtures |6|4|0.0112 /0.0072% | All48 changed before/after pairs were visually inspected in eight contact sheets; all34 title-family pairs were inspected in nine sheets. Shared changes are not claimed absent: poster captions/fade bands, regular progress/episode-mark ordering and canonical focused-button lift are visible corrections. The Requests published baseline also differs in the Settings-header initials and row text/readiness wrapping; its largest delta is the expanded Downloading row in086. These differences remain numeric and visible, not hidden under an unchanged-hash claim or an assertion of pixel identity. Nav-only shell fixtures are distinct from the actual Home captures. ## Final command evidence Exactly one final-head `make test` and one `make apk-debug` ran after source was committed; no source edits followed. Complete XML and the unabridged combined command log are included. | Command | Actual result | |---|---| | `make test` | BUILD SUCCESSFUL in2m51;807 tests,0 failures,0 errors,0 skipped: app638, design152, generated client17 | | `make apk-debug` | BUILD SUCCESSFUL in1m14; local debug artifact only, no install/upload/release | | Targeted design regression/capture smoke before the final pair | BUILD SUCCESSFUL in1m03; all existing design tests retained | | Complete title-family smoke before the final pair | BUILD SUCCESSFUL in2m43; all34 title captures and four full Home launch paths | No ADB, device access, TV installation, release, tag, signing/version change, shared-service administration, merge or Forgejo status manipulation was performed. ## Remaining limitations disclosed, not part of the13 requested fixes Native Roboto versus frozen DejaVu glyph widths/ink and line breaks remain approved platform differences; per-title offsets or fake copy were not added. Unheld trailers remain omitted until Conductarr addition5; held trailers use the installed YouTube-family app intent or calm unavailable-app fallback, never the prototype's sample hand-off screen. Conductarr TV sign-in is not built, so its reads use the debug fixture seam, not handwritten HTTP or live tests. Device performance and blur below Android31 were not proven here. The review's nonblocking observations remain: releasing a held OK outside the title can leave okHeld true; Play has no in-flight guard; non-UUID release IDs remain loading until their Conductarr read exists; duplicate cast-person IDs can collide in LazyRow keys; signed-in Request/household CTAs still show the current toast rather than dispatching into slice6; production Hide/More like this remain unavailable without the Conductarr integration; pre31 blur is a no-op; debug fixture assets are about67MB; the locked recovery copy names Conductarr even for a Jellyfin failure. The unreachable duplicate glyph branches and seven obsolete resources were removed during this merge cleanup. Upstream-source change explicitly disclosed: `app/src/default/AndroidManifest.xml` adds package visibility for `vnd.youtube` handler resolution. It is an upstream default-flavour source file, not one of the architecture section2.7 hook files; appstore/firetv visibility is not asserted covered. All other changed production source is in fork-owned source sets/module paths. GPL notices remain intact.