Keep loaded title refreshes stable and guard request identities #66
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-discover-details-flash"
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
Keep already-shown title pages out of the first-load skeleton and make missing request identity a recoverable Wolfskin error, not an exception.
Head:
5f759b8fef3a44391b7f2905319adb62fd109f84Branch:
fm/tv-discover-details-flash→fm/tv-round2Real versus fixture findings
TitleDestinationforces reads on identity/watch/foreground changes, so a repeated fixture read rebuilt both Loading andTitleState. Ordinary real catalogue/held refreshes already retain Ready; neitherTitleReadFacadenorConductarrTitlePagesemits a main-page Loading during those refreshes. Real authorization loss also bypassed the fast path and constructed Loading.Request needs a catalogue identityThe exact effect key behind the m3 emulator flash was not recorded. The vulnerable forced-load path is identified from the code; the new native regression drives that same repeat-load path directly. The original observation remains documented in the m3 emulator walk.
The nullable request projection also serves catalogue hide/restore. Its rejected optimistic action is rolled back; the two-line shared
TitleStateadjustment prevents a false hide receipt after that local rejection. Request projections used for snapshot/hidden synchronization are remembered rather than repeatedly allocated.Verification
Final focused Docker/Gradle run: 10 passed, no failures/errors/skips. No full suite, APK build, emulator/device access, or infrastructure lifecycle actions.
DiscoverRefreshMotionTestConductarrTitleSurfaceTestTitleRequestSafetyTestTitleDestination: Request from deliberately incomplete/stale metadata displays the recovery toast while retaining title focus/content. Rejected hide remains unhidden and produces no false receipt.ConductarrTitlePagesTestCommand (using the already-provided serial/shared-lock overlay):
Native evidence and XML are outside the checkout at:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-rd2-discover/details-flash/discover-fixture-refresh-strip.png,discover-refresh-strip.png,discover-held-refresh-strip.png: loaded, +16 ms, +96 ms, +192 ms, in reading order.native/: 43 full-resolution PNGs, including missing-identity recovery and revoked-access frames.test-counts-final.jsonand the four JUnit XML files.The native renderer is SDK 34 at 1920×1080 with deterministic decoded image bitmaps. This proves the rendered state/focus/layout paths, not physical-TV frame timing or live artwork fetching.
Scope
Updated the existing TV specification. No Home rows, title/episode layout, Back handling, updater UI, motion curves or durations changed. The shared design changes are only the recovery message and the locally-rejected-hide receipt condition.
Review of the Discover Details flash and Request guard fix at head
5f759b8fef3a44391b7f2905319adb62fd109f84(basefm/tv-round2,b51dced5).Code verdict: APPROVE (
review/code-claude= success).Design verdict: PASS (
review/design-claude= success). No blocking finding.1. Loaded title stays loaded.
TitleState.TitleState(guarded bytitle === fixtureRefresh) instead of rebuilding Loading.TitleState, so no stale data for another title or person survives.Unavailableinstead ofLoading. See note 1.Readywith identical bounds and brightness at every 16 ms step for the fixture, held and catalogue cases. The revoked case staysUnavailablefor twelve frames.2. Request with incomplete identity.
requestTitlereturns null unless the root is a movie or tv with a positive TMDB id (fromtmdbIdor a matchingkind:idroute). Episodes, persons, zero, negative, mismatched and malformed ids are rejected, and an episode never substitutes for its series.TitleNoticeandRecoveryToastwith the token position, shadow and timing. The native frame showsCan’t update this title right now.top-right with the page and focus unchanged.3. Looks. There is no layout, token or motion change. The 16, 96 and 192 ms strip is identical to the loaded frame. Tests assert behaviour, not wiring.
4. Merge. A merge-tree check against
fm/tv-round2(b51dced5) is clean.fm/tv-back-titleis not on origin yet, so I could not test it. It touches theBackHandlerhunk (around line 340) while this PR touchesload()(lines 90-130) in the same file. A textual conflict is unlikely [INFERENCE]; re-check once it is pushed.Non-blocking notes:
BuildConfig.DEBUG-only, so the Opt build only gets the auth-loss and request-guard changes. Re-test Discover hero -> Details on a non-debug build in the next walk.TitleState.handle, as it does today.Full report (review 5):
/root/.treehouse/firstmate-7bab20/2/firstmate/data/round2-review/report.md. Not run: Gradle/make, nothing on the box.