Smooth Discover heroes and retain Details destination focus #58
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-rd2-discover"
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?
AI-assisted (fork-internal)
Outcome
Smooth Discover artwork changes, retain destination focus after Details, and make Discover lane memory visit-local. The copy-only review correction restores the approved sequential handoff and first-appearance entry on both Discover and Home; it removes the overlapping text seen in the reviewed counter-fade.
Current pushed head:
79f64f6e18aba3eff2938831061d1d53532ba98e. Base:fm/tv-round2. Integration and the title follow-up are merged without rewriting published history. No merge is requested before re-review and the merged-candidate checks.Native reviewed-versus-corrected frame strips, 16 ms alpha/translation/position series, Home proof and provenance
Copy review corrections
heroCopyOut120 ms ease (.25,.1,.25,1). Incoming is gated on decoded art/final fallback and theheroCopyDelay140 ms start window, then enters withheroCopyIn200 ms ease-out andcopyRise14 px. Text is replaced only after outgoing alpha reaches zero. Interruptions retarget current alpha; pending artwork does not cancel an already-running copy entry. There can never be two painted copies together.rowEnter180 ms ease-out andcopyEntryRise16 px. A saveable entry marker suppresses replay only when the same saved hero is remounted. Native Discover and Home cases verify alpha 0 / rise 16 on first appearance and alpha 1 / translation 0 on saved return.Measured copy behavior
The reviewed counter-fade at
7bfa4313is preserved separately, not overwritten as if it were the original art baseline. These paired runs use identical fixture data, selections and timestamps; “visible” below means alpha > 0.Corrected maximum simultaneous visible copy: 1, including the Home sequence. The approved fade-through intentionally permits zero-alpha copy: the longest exact-zero run in these sampled handoffs is 2 frames / 32 ms. Repeated input can extend the visually quiet interval while the last selection waits for its entry window. There is no minimum-copy-opacity claim. Artwork keeps an opaque base and controls remain visible.
Visible outgoing translation stays where entry stopped; incoming visible translation is monotonic. At zero alpha the slot may reset its pose for the next copy. The original upper-art probe improvements remain unchanged: peak RGB-channel steps are 35 interrupted, 31 failed and 39 sustained input, versus up to 255 in the original art baseline. These are upper-probe measurements, not full-screen maxima: the approved bounded lower backdrop still changes on art readiness.
Applied where
HeroMotion,DiscoverScreenandDiscoverArtworkretain painted art until decoded art/final fallback is ready. Each outgoing artwork layer keeps its own original token lifetime and current alpha. Copy uses the sequential slot above. Details/pager remain outside copy motion; dots retarget current values.HomeHeadershares the readiness scope and copy primitive. Copy grows upward inside the bottom-anchored layout; controls stay stationary. Home rows, focus-loop policy, presets, merged lane and card gradient are not changed here. Resume/Play still shareHomeAction.Playand navigate directly to playback withoutfocusNav; Home Details shares the title roots below. Player playback was not exercised by this lane.TitlePagechange removes forcedfocusNavduring Loading. Down cannot enter skeletons; Back still pops without opening the picker.WolfskinTitleViewModel.loadkeeps already-ready catalogue and held titles Ready on same-route/same-person refresh, retaining the existing authentication guard. Four obsolete nav-focus expectations were migrated without weakening stale-cast, Down, Back or picker safety. These paths are unchanged by the copy correction.TitleArtworkdisables Coil's independent painter transition only for hero-controlled requests. Standalone title/episode art keeps ordinary reveal. The touched native Coil NETWORK-success edge still measures red + blue >= 254/255 over 40 frames, with no nested painter-fade gap.Motion audit and spec
Art:
heroFade/easeInOut. Copy out:heroCopyOut/ease; delayed start:heroCopyDelay; copy in:heroCopyIn/easeOut. Initial entry:rowEnter/easeOutandcopyEntryRise. Pager:focusMove/easeOut. Fade durations usemotionDuration; reduced motion removes the copy delay and translation, snaps pager geometry, and caps each permitted fade at 80 ms.data/tv-spec/spec.mdrecords the approved sequential copy, restored first entry/saveable remount behavior, visit-local lane memory and destination-focus/no-refresh-replay contract. Animated artwork stays bounded to Home 1920×820 and Discover 1920×740. The full painted backdrop remains static while incoming art is pending; no full-screen animated alpha owner is added.Untouched findings from the explicit
tween/animate*AsState/spring/animateScroll/Animatableaudit:NavBar: literal label easing and a Shell duration rather than Motion; reduced colour tween omits explicit token easing. Spring parameters are token-backed.HomeRatings/SourceRatings: rating-plate tweens omit explicit token easing.TitlePageseason-chip scroll, outside the loading-focus fix:animateScrollToItemuses the library default; reduced motion snaps. Its frame-scroll spec is token-backed.TitleMenu,TitleShelfand readiness-height motion already use token durations/easing and reduced-motion handling.Choices I made
Resolved navigation choices
Verification — approved slim scope
On
79f64f6e18aba3eff2938831061d1d53532ba98e, the touched/native copy set passes 10/10:DiscoverHeroSequenceTest: six cases — interrupted, slow art, failed art, sustained burst, reduced motion, and first-entry/saved-remount.HeroMotionTest: two shared/Home cases, including the bounded art region and stable outgoing-copy/Play anchors.HomeHeroSequenceTest: one full native Home sequence.DiscoverNetworkHeroTest: one real Coil success edge.The earlier full gate on
7bfa4313passed 984/984 (design 226, client 26, app 732), plus all four debug APK/branding checks. Those are historical results, not fresh full-suite/build results for this copy-only head. As Justin explicitly approved, no fullmake testormake apk-debugwas rerun after installation; one full run plus Opt checks will be done on the merged round candidate. Firstmate confirms combined Optbf2efcfd(Homec5dbe910+ copy79f64f6e) is installed and launches; this lane performed no device access or installation.Captures are actual Compose/Robolectric native 1920×1080, sampled every 16 ms, not browser approximations or TV frame-time measurements. Initial/remount and Home panels are after-only; one deliberately absent host frame exercises saveable disposal/restoration. The retained title-refresh panel is explicitly from
7bfa4313, not rerun under the slim scope. Published files are 660/directories 770; native strips were inspected locally behind the expected page auth gate.Code review (Claude) of head
7bfa43135081595b7ae83ac177133286573c782d: APPROVE, no blocking finding. I judge, I do not merge.Read: HeroMotion (art/copy/scope), DiscoverArtwork/TitleArtwork/TitleSlotArtwork readiness and Coil transition scoping, DiscoverScreen/Shelf/State lane memory, HomeHeader, TitlePage + TitleState, WolfskinTitleViewModel.load/readTitle/ConductarrTitlePages, ShellState route/tab logic, and the new and migrated tests. Ran only
generate_tokens.py --check(passes; no ad-hoc easing literals added). No Gradle.Findings:
Non-blocking notes (full detail in the review report):
Design review (Claude) - reviewed SHA
7bfa43135081595b7ae83ac177133286573c782d- verdict: BLOCK on one finding, everything else non-blocking.Full report:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/review-58-design/report.md. Evidence: the published frames and series under/opt/stacks/pages/store/wolfskin/tv-round2-discover/(after-strip.png,after/interrupted/first-06..09.png,after/rapid/press-2-02.png,press-4-00.png,burst-3-00.png,after/slow/ready-02.png,after/title-refresh/*, everyafter/*/series.json).Good: art blend (no flash, dip, pop or snap-back; upper-probe step 35/31/39; series equals the 320 ms ease-in-out token curve), interrupted retarget, stationary buttons and pager (Details button/pager y constant), reduced motion (80 ms, no translation), failed-art fallback, and Details from the Discover hero (12 refresh frames pixel-identical to the loaded frame, nav not focused).
Blocking - B1 copy hand-off. The PR replaced the approved sequential copy hand-off (out 120 ms ease, in from 140 ms over 200 ms ease-out, 14 px rise) with a simultaneous 200 ms ease-out counter-fade. Frames 5-9 after each press show both titles, metadata rows and overviews overlapped (five displayed frames, overview unreadable); in the 54-press burst 3-4 titles and several "For you" kickers stack (up to 7 copy layers, composite minimum 0.546). The new copy also leads the art by about 100 ms. Justin's words (flicker, smooth easing) are about the art restart and the dip, which this PR fixes; they do not ask for overlapped text, and the approved direction A shows none.
heroCopyOutandheroCopyDelayare now unused. Fix is copy-only: restore outheroCopyOut/ease, in afterheroCopyDelaywithheroCopyIn/easeOut+ 14 px rise, still gated on art readiness, keep everything else. If a crossfade is preferred it needs Justin's explicit OK onfirst-08.png.Values not equal to the page: outgoing copy 200 ms ease-out (page 120 ms ease); incoming copy start 0 ms (page 140 ms); initial Home/Discover hero copy entry removed (page 180 ms / 16 px rise). All other numbers equal the tokens (heroFade 320 easeInOut, heroCopyIn 200 easeOut, copyRise 14, pager focusMove 180 easeOut, reducedFade 80).
Non-blocking:
heroCopyOut/heroCopyDelay(resolved by the B1 fix).Questions for Justin (recommendation only): Home row entry - yes, adopt leftmost-until-moved on Home (his "make it universal"), keep Home's visited-row restore, do not reset on tab leave, sequence after the Home focus-loop fix since both touch
HomeFocus.kt. Library grid - agree with the PR, keep standard grid navigation (one continuous grid, not lanes).Commit status
review/design-claudeon this SHA: failure (B1).Combined round-2 review (code + design) of the Discover PR at head
79f64f6e18aba3eff2938831061d1d53532ba98e, delta since7bfa4313plus integration with the Home PR.Code verdict: APPROVE (status
review/code-claude= success).Design verdict: PASS (status
review/design-claude= success). The earlier blocker B1 (overlapped copy) is fixed as approved.B1 fix, evidence (published native frames and 16 ms series):
heroCopyOut/heroCopyDelay/heroCopyIn/rowEnter/copyEntryRise/copyRise), not literals;generate_tokens.py --checkpasses. The spec rows (spec.md:69,:71,:74) are restored.Non-blocking notes:
spec.md:57("Home's nearest-centre shelves ... unchanged") contradicts the Home PR's leftmost rule once both land. Reword to say Home follows the same rule and Library is unchanged.DiscoverScreen.kt, resolved correctly. Pushing a title does not reset lane memory, becausecurrentTabfollowsrootRoute. [INFERENCE]DiscoverStatestill reads the route-scopedshell.view, so the outgoing Discover entry could briefly show a hero focus jump during a lane-row Details exit. Pre-existing; worth a look in the box walk.Full report:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/round2-review/report.md. Not run: Gradle/make (separate gate), nothing on the box.Pull request closed