Fix TV episode Back navigation and live Resume freshness #48

Merged
justinzeus merged 2 commits from fm/tv-fb2-fix into main 2026-11-06 22:59:33 +01:00
Owner

Tests are not green: the final full suite has six person-switch timeouts. Four match the earlier title-layout review; two additional failing names are disclosed below. No picker code or picker tests were changed to hide them.

TV episode navigation and live Resume freshness

AI-assisted implementation and PR description for this fork-internal change. No device connection, ADB, installation, backend release, or service mutation.

Changes

  • Episode-shelf choices on an episode page use NavigationManager.replaceTop, preserving every parent. Repeated A → B → C choices no longer build an episode history; Back reaches the series/Home parent. Opening the first episode from a series, related titles, cast and performer credits remains a push. The existing root-clearing replace is unchanged.
  • Down initially focuses the selected playable season, not Season 1. The chip row scrolls the selected/focused chip into view and remembers deliberate browsing. The rendered key regression uses Season 29 of 30.
  • Both Home hero Play and title primary Play resolve the live Jellyfin item and current millisecond checkpoint at the click. Series actions query current NextUp with EnableResumable=true; explicit episode choice remains exact, and explicit Restart remains zero. Current Played flags are retained without discarding resumable rewatches.
  • Saved Home/title watch fields are provisional: Home offers Details and title playback controls wait for revalidation. Fresh Resume/NextUp publish independently of unrelated library shelves. Entry/foreground and acknowledged per-user PlaybackStopped revisions refresh visible watch state; the successful stop also invalidates that user's persisted library grid snapshots. Progress/stop reporting is ordered so an older progress write cannot overtake that listener's stop.
  • Same-entry watch refresh retains held-page selections without bypassing the existing catalogue/sign-out authority reset. Updated docker/README.md documents the boundaries.

No card progress lines/subtitles, hero rail, artwork/layout styling, or Conductarr changes.

Verification

Final head: 5bd2affc1ab124b1562bcea07b30c479773c5fc7.

Check Observed result
Targeted app regressions and actual Compose key/return scenarios 83 passed; recorded Resume/NextUp checkpoint shapes, exact episode/Restart, repeated stack transitions, later-season visibility, provisional saved controls, independent Home publication, acknowledged stop and scoped grid invalidation
Final-head make test 705 app cases: 699 passed, six picker timeouts; design/client dependency gates and client smoke passed or were up-to-date from successful runs
Final-head make apk-debug Passed; branding checks passed for all four debug APK packages

An earlier full run exposed a new signed-out catalogue-ratings assertion. Limited state reuse to held pages and preserved authority reset; that existing surface test then passed targeted and on the final full run. There was one full-suite invocation on the corrected final head, plus the earlier full invocation on its predecessor. No native SIGABRT occurred; no serial rerun was needed. Existing Android 9/11 Robolectric jars were copied from the local Gradle cache into ignored test output; no SDK/build workaround is committed.

Exact remaining full-suite failures

All are PersonPickerSessionTest timeouts with the chosen person and closed picker correct, but replacement sign-in/identity absent:

Test Compared with the earlier title-layout review
launchRightThenOneOkKeepsPickerClosed Listed there
fastLeftLeftOkKeepsPickerClosed Listed there
avatarRightThenOneOkKeepsPickerClosed Listed there
gearAndBackThenOneOkKeepsPickerClosed Listed there
launchLeftThenOneOkKeepsPickerClosed Additional failing name; not listed there
avatarLeftThenOneOkKeepsPickerClosed Additional failing name; not listed there

The final log also contains GCLocker allocation retries. No main A/B or causal isolation was run, so the two additional names are newly observed failures, not evidence that their cause is established. Person switching is not cleared for shipping by this run.

On-device review checklist — owner installation only

  1. From launch and the avatar picker, move both Left and Right between people and press OK once. Confirm the picker stays closed and the replacement person's signed-in Home loads; the six failures above make this a required check.
  2. Open a series whose playable episode is in Season 3+. Press Down from the header: its season chip must be focused and visible. Browse Left/Right, go Up then Down, and confirm browsing memory remains usable.
  3. Open episode A, choose B and then C from the episode shelf, then Back. Expect the series/Home parent, never B or A. Check related-title and cast/person drill-ins still return normally.
  4. Advance the checkpoint or NextUp on another client, then use Home Play and series-page Play without relying on their old painted offsets. Verify the live target/position; explicitly opening an older episode must keep that episode. Restart must begin at zero.
  5. Seek/play far enough to satisfy Jellyfin's resume threshold, then stop and Back. Confirm Home/title Resume/NextUp refresh after the acknowledged stop and the library grid does not wait ten minutes. Repeat with a different person to check isolation.

Debug APKs use stub playback codecs; this is not optimized-release or physical-TV playback proof. Failed stop reports remain logged and do not fabricate an acknowledgement. External players without a usable stop result cannot supply a missing checkpoint; another client's writes after the final click-time read are outside that snapshot.

> **Tests are not green:** the final full suite has six person-switch timeouts. Four match the earlier title-layout review; two additional failing names are disclosed below. No picker code or picker tests were changed to hide them. ## TV episode navigation and live Resume freshness AI-assisted implementation and PR description for this fork-internal change. No device connection, ADB, installation, backend release, or service mutation. ### Changes - Episode-shelf choices on an episode page use `NavigationManager.replaceTop`, preserving every parent. Repeated A → B → C choices no longer build an episode history; Back reaches the series/Home parent. Opening the first episode from a series, related titles, cast and performer credits remains a push. The existing root-clearing `replace` is unchanged. - Down initially focuses the selected playable season, not Season 1. The chip row scrolls the selected/focused chip into view and remembers deliberate browsing. The rendered key regression uses Season 29 of 30. - Both Home hero Play and title primary Play resolve the live Jellyfin item and current millisecond checkpoint at the click. Series actions query current NextUp with `EnableResumable=true`; explicit episode choice remains exact, and explicit Restart remains zero. Current Played flags are retained without discarding resumable rewatches. - Saved Home/title watch fields are provisional: Home offers Details and title playback controls wait for revalidation. Fresh Resume/NextUp publish independently of unrelated library shelves. Entry/foreground and acknowledged per-user PlaybackStopped revisions refresh visible watch state; the successful stop also invalidates that user's persisted library grid snapshots. Progress/stop reporting is ordered so an older progress write cannot overtake that listener's stop. - Same-entry watch refresh retains held-page selections without bypassing the existing catalogue/sign-out authority reset. Updated `docker/README.md` documents the boundaries. No card progress lines/subtitles, hero rail, artwork/layout styling, or Conductarr changes. ### Verification Final head: `5bd2affc1ab124b1562bcea07b30c479773c5fc7`. | Check | Observed result | |---|---| | Targeted app regressions and actual Compose key/return scenarios | 83 passed; recorded Resume/NextUp checkpoint shapes, exact episode/Restart, repeated stack transitions, later-season visibility, provisional saved controls, independent Home publication, acknowledged stop and scoped grid invalidation | | Final-head `make test` | 705 app cases: 699 passed, six picker timeouts; design/client dependency gates and client smoke passed or were up-to-date from successful runs | | Final-head `make apk-debug` | Passed; branding checks passed for all four debug APK packages | An earlier full run exposed a new signed-out catalogue-ratings assertion. Limited state reuse to held pages and preserved authority reset; that existing surface test then passed targeted and on the final full run. There was one full-suite invocation on the corrected final head, plus the earlier full invocation on its predecessor. No native SIGABRT occurred; no serial rerun was needed. Existing Android 9/11 Robolectric jars were copied from the local Gradle cache into ignored test output; no SDK/build workaround is committed. #### Exact remaining full-suite failures All are `PersonPickerSessionTest` timeouts with the chosen person and closed picker correct, but replacement sign-in/identity absent: | Test | Compared with [the earlier title-layout review](https://git.justinvisser.org/justinzeus/wolfskin/pulls/47) | |---|---| | `launchRightThenOneOkKeepsPickerClosed` | Listed there | | `fastLeftLeftOkKeepsPickerClosed` | Listed there | | `avatarRightThenOneOkKeepsPickerClosed` | Listed there | | `gearAndBackThenOneOkKeepsPickerClosed` | Listed there | | `launchLeftThenOneOkKeepsPickerClosed` | **Additional failing name; not listed there** | | `avatarLeftThenOneOkKeepsPickerClosed` | **Additional failing name; not listed there** | The final log also contains GCLocker allocation retries. No main A/B or causal isolation was run, so the two additional names are newly observed failures, not evidence that their cause is established. Person switching is not cleared for shipping by this run. ### On-device review checklist — owner installation only 1. From launch and the avatar picker, move both Left and Right between people and press OK once. Confirm the picker stays closed and the replacement person's signed-in Home loads; the six failures above make this a required check. 2. Open a series whose playable episode is in Season 3+. Press Down from the header: its season chip must be focused and visible. Browse Left/Right, go Up then Down, and confirm browsing memory remains usable. 3. Open episode A, choose B and then C from the episode shelf, then Back. Expect the series/Home parent, never B or A. Check related-title and cast/person drill-ins still return normally. 4. Advance the checkpoint or NextUp on another client, then use Home Play and series-page Play without relying on their old painted offsets. Verify the live target/position; explicitly opening an older episode must keep that episode. Restart must begin at zero. 5. Seek/play far enough to satisfy Jellyfin's resume threshold, then stop and Back. Confirm Home/title Resume/NextUp refresh after the acknowledged stop and the library grid does not wait ten minutes. Repeat with a different person to check isolation. Debug APKs use stub playback codecs; this is not optimized-release or physical-TV playback proof. Failed stop reports remain logged and do not fabricate an acknowledgement. External players without a usable stop result cannot supply a missing checkpoint; another client's writes after the final click-time read are outside that snapshot.
justinzeus added 2 commits 2026-11-06 22:57:46 +01:00
Preserve title authority reset during watch refresh
All checks were successful
review/code-gpt Firstmate read the PR evidence and diff stat: TV navigation, live resume read at click, stop-ack refresh, season focus; 83 targeted cases pass, apk-debug green; full suite has six PersonPickerSessionTest timeouts (disclosed, cause unisolated; bisect on main follows); person switching is verified on the real box before it ships
review/design-claude Firstmate read the PR evidence and diff stat: TV navigation, live resume read at click, stop-ack refresh, season focus; 83 targeted cases pass, apk-debug green; full suite has six PersonPickerSessionTest timeouts (disclosed, cause unisolated; bisect on main follows); person switching is verified on the real box before it ships
5bd2affc1a
justinzeus merged commit f4fb6e22c9 into main 2026-11-06 22:59:33 +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#48
No description provided.