Round 2 release candidate 2: round branch merged with main (updater) and Back fix #68

Merged
justinzeus merged 28 commits from fm/tv-round2-rc2 into fm/tv-round2 2026-11-07 23:20:12 +01:00
Owner

Round 2 release candidate 2: the round branch fm/tv-round2 (now containing the Discover/Home/trailer/crash-fix/stock-screens candidate PR 64, the Discover Details-flash PR 66 and the Back-fix PR 67) merged with main (which carries the updater core PR 60 and the Settings Updates UI PR 65), plus one test-only fix commit. Exact commit: 408aff3db77777159fade10091015bd0e81cafaf.

What is merged

  • origin/fm/tv-round2 985ebc53 (PR 64 #64, Discover Details-flash PR 66 #66) plus Back-fix PR 67 #67 head a268cdd7b8d887157bcf6749a54c0f9ab0ccf4f1 (review/code-claude and review/design-claude success on that head). The round branch has since moved to 1dee8997, which only adds the PR 67 merge, so the tree is the same.
  • origin/main 6fc10b7af2ddd3a8585e3b6d812a90189cd7e7b5, containing the updater core PR 60 #60 and the Settings Updates UI PR 65 #65.

Merge conflicts and resolutions (diffs kept in the gate report)

  1. wolfskin-design/build.gradle.kts: main replaced the single Robolectric SDK configuration with per-version detached configurations; PR 67 added the sdk-16 jar to the old configuration. Kept main's structure and added 16-robolectric-13921718-i7 to its version list.
  2. wolfskin-design/src/main/java/org/justinvisser/wolfskin/design/ShellSurface.kt: kept both sides: main's installedVersion = settingsInstalledVersion on SettingsList and the round branch's view.listState for the nav band.
  3. wolfskin-design/tokens.sha256: regenerated with generate_tokens.py (generated Kotlin/CSS were already consistent; only the manifest differed).
  4. Compile fix in WolfskinRootExitTest.kt: main's WolfskinShellViewModel gained an updates argument; the round branch test now passes FakeUpdateController() like main's other tests.

Test-only fix commit (product code unchanged)

  • UpdatesKeysTest (main's new test) pressed Key.Back; PR 67 deliberately keeps only Key.Escape as the shell Back key (native Back goes through the Activity dispatcher). The test now presses Key.Escape for Back, mirroring PR 67's own test migration.
  • UpstreamContentFocusTest.switchOffShowsRealUpstreamBackdropAndSwitchOnRestoresOwnedBackground: it mocked the view model relaxed, so model.updates returned a bare object and WolfskinApp.kt:441 threw a ClassCastException. The test now stubs model.updates with FakeUpdateController(). This failure already exists on origin/main 6fc10b7a (PR 65 was merged with only its touched tests run); this PR carries the fix.

Test evidence

  • One full run on the merge before the test-only commit (2eeacdc5, --continue, no exclusions or retries): design 253/253 pass, app 832 tests with 830 passed and the 2 failures above (both classified: the first only with PR 67, the second also on main alone).
  • On this exact commit 408aff3d: the only delta from that run is the two test files above; both classes rerun and pass (UpdatesKeysTest 6/6, UpstreamContentFocusTest 2/2). Combined: 1085 tests, 1085 passing.

Opt build (this commit)

bash docker/gradle.sh optimized --offline -PtvVersion=1.1.1 -PtvVersionCode=69 ... :app:assembleDefaultOptimized (main now requires -PtvVersionCode; versionName is plain 1.1.1). All four APKs in one run: package org.justinvisser.wolfskin.tv.opt, label Wolfskin (Opt), not debuggable, versionCode 69 (installed 66), signer SHA-256 182bac72e292b9ea4d3d4e6383f92eb2161fa28ba5afcff0337cb7d5a9d5341d, baseline.prof/.profm present, no fixture assets, no missing_rules.txt. Debug APKs of the same commit were built for the emulator walk.

Closes: nothing further; the round 2 lane PRs were already merged into the round branch.

Round 2 release candidate 2: the round branch `fm/tv-round2` (now containing the Discover/Home/trailer/crash-fix/stock-screens candidate PR 64, the Discover Details-flash PR 66 and the Back-fix PR 67) merged with `main` (which carries the updater core PR 60 and the Settings Updates UI PR 65), plus one test-only fix commit. Exact commit: `408aff3db77777159fade10091015bd0e81cafaf`. ## What is merged - `origin/fm/tv-round2` `985ebc53` (PR 64 https://git.justinvisser.org/justinzeus/wolfskin/pulls/64, Discover Details-flash PR 66 https://git.justinvisser.org/justinzeus/wolfskin/pulls/66) plus Back-fix PR 67 https://git.justinvisser.org/justinzeus/wolfskin/pulls/67 head `a268cdd7b8d887157bcf6749a54c0f9ab0ccf4f1` (review/code-claude and review/design-claude success on that head). The round branch has since moved to `1dee8997`, which only adds the PR 67 merge, so the tree is the same. - `origin/main` `6fc10b7af2ddd3a8585e3b6d812a90189cd7e7b5`, containing the updater core PR 60 https://git.justinvisser.org/justinzeus/wolfskin/pulls/60 and the Settings Updates UI PR 65 https://git.justinvisser.org/justinzeus/wolfskin/pulls/65. ## Merge conflicts and resolutions (diffs kept in the gate report) 1. `wolfskin-design/build.gradle.kts`: main replaced the single Robolectric SDK configuration with per-version detached configurations; PR 67 added the sdk-16 jar to the old configuration. Kept main's structure and added `16-robolectric-13921718-i7` to its version list. 2. `wolfskin-design/src/main/java/org/justinvisser/wolfskin/design/ShellSurface.kt`: kept both sides: main's `installedVersion = settingsInstalledVersion` on `SettingsList` and the round branch's `view.listState` for the nav band. 3. `wolfskin-design/tokens.sha256`: regenerated with `generate_tokens.py` (generated Kotlin/CSS were already consistent; only the manifest differed). 4. Compile fix in `WolfskinRootExitTest.kt`: main's `WolfskinShellViewModel` gained an `updates` argument; the round branch test now passes `FakeUpdateController()` like main's other tests. ## Test-only fix commit (product code unchanged) - `UpdatesKeysTest` (main's new test) pressed `Key.Back`; PR 67 deliberately keeps only `Key.Escape` as the shell Back key (native Back goes through the Activity dispatcher). The test now presses `Key.Escape` for Back, mirroring PR 67's own test migration. - `UpstreamContentFocusTest.switchOffShowsRealUpstreamBackdropAndSwitchOnRestoresOwnedBackground`: it mocked the view model relaxed, so `model.updates` returned a bare object and `WolfskinApp.kt:441` threw a ClassCastException. The test now stubs `model.updates` with `FakeUpdateController()`. **This failure already exists on `origin/main` 6fc10b7a (PR 65 was merged with only its touched tests run); this PR carries the fix.** ## Test evidence - One full run on the merge before the test-only commit (`2eeacdc5`, `--continue`, no exclusions or retries): design 253/253 pass, app 832 tests with 830 passed and the 2 failures above (both classified: the first only with PR 67, the second also on main alone). - On this exact commit `408aff3d`: the only delta from that run is the two test files above; both classes rerun and pass (UpdatesKeysTest 6/6, UpstreamContentFocusTest 2/2). Combined: 1085 tests, 1085 passing. ## Opt build (this commit) `bash docker/gradle.sh optimized --offline -PtvVersion=1.1.1 -PtvVersionCode=69 ... :app:assembleDefaultOptimized` (main now requires `-PtvVersionCode`; versionName is plain 1.1.1). All four APKs in one run: package `org.justinvisser.wolfskin.tv.opt`, label `Wolfskin (Opt)`, not debuggable, versionCode 69 (installed 66), signer SHA-256 `182bac72e292b9ea4d3d4e6383f92eb2161fa28ba5afcff0337cb7d5a9d5341d`, baseline.prof/.profm present, no fixture assets, no missing_rules.txt. Debug APKs of the same commit were built for the emulator walk. Closes: nothing further; the round 2 lane PRs were already merged into the round branch.
justinzeus added 28 commits 2026-11-07 23:19:05 +01:00
## Description
If the server plugin is not installed, trying to add Seerr server will
show an endless loading page. This PR fixes that.

### Related issues
Fixes #2177

### Testing
Emulator against server with & without the plugin

## Screenshots
N/A

## AI or LLM usage
None
-----BEGIN SSH SIGNATURE-----
 U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgrqffh93Kw9xITbVISXK/jkih9K
 Q1NSQeC6TBqiLCg2oAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
 AAAAQMNewXnxMn5HlyJcrG3vlqPg4lBjF2q9uyedLQQ2S+G4PZQf1XxPTy4q9DKBcT8UIN
 XSrDmvm0HJci43S6FMTgE=
 -----END SSH SIGNATURE-----

Merge tag 'v1.1.1' into fm/wolfskin-upstream-1-1-1

v1.1.1

# -----BEGIN SSH SIGNATURE-----
# U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgrqffh93Kw9xITbVISXK/jkih9K
# Q1NSQeC6TBqiLCg2oAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
# AAAAQMNewXnxMn5HlyJcrG3vlqPg4lBjF2q9uyedLQQ2S+G4PZQf1XxPTy4q9DKBcT8UIN
# XSrDmvm0HJci43S6FMTgE=
# -----END SSH SIGNATURE-----
# gpg verification failed.
Document upstream v1.1.1 setup fix
All checks were successful
review/code-claude No blocking findings on 00e8e83b; waits for Justin go
00e8e83bb6
Merge current main into upstream integration
All checks were successful
review/code-claude Reviewed at 00e8e83b; delta is a clean merge of main (diff vs main still 2 files, +12); full gate green except the known WatchReturnTest flake
e189d9318a
Cache each Robolectric SDK without version conflicts
Some checks failed
review/safety-opus Blocking: versionCode ledger bypassable; tv-publish lacks monotonic check
c78a8dfa8d
Expose persistent update metadata and safe UI dismissals
All checks were successful
review/safety-opus Delta PASS: B1 closed; seams keep install invariants
51799669e7
Merge main for the updater UI review
All checks were successful
review/code-claude Code APPROVE: single state store, no implicit install
review/design-claude Design PASS: 18 frame pairs match approved
9061384ad1
Keep loaded title refreshes stable and guard request identities
All checks were successful
review/code-claude Code APPROVE: no stale data, request guard recovers via toast
review/design-claude Design PASS: no look change beyond flash removal
5f759b8fef
Fix two tests that predate the merge of the round and main
All checks were successful
gate/round2-candidate design 253/253 + app 830/832 on 2eeacdc5, the 2 failing classes pass on this commit (test-only delta); Opt build versionCode 69 signer ok
408aff3db7
Test-only; product code is unchanged.
UpdatesKeysTest presses Key.Escape for Back because the Back fix routes native Back through the Activity dispatcher and keeps only Escape as the shell key.
UpstreamContentFocusTest stubs the relaxed view model's updates with the fake controller, as the other tests do, so the Updates row gets an installed version.
justinzeus merged commit 49d8ffc892 into fm/tv-round2 2026-11-07 23:20:12 +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#68
No description provided.