Ground Discover watch claims and request history in evidence #46

Merged
justinzeus merged 1 commit from fm/tv-fb1-truth into main 2026-11-06 20:37:47 +01:00
Owner

Outcome

Discover now reserves “Because you watched” for watched seed evidence. Settings > Requests presents household request history, not an invented queue of open downloads. TV-only; no Conductarr changes or live repairs.

AI-assisted (fork-internal).

Changes

  • Group recommendation contributions by media type + TMDB identity, retain watched/added flags, and use stable seed lane IDs. Added-only seeds produce no named shelf; their candidates remain in the general For-you collections. Titleless contributions stay dropped. The pinned wire has no per-seed watch timestamp, so watched shelves retain wire order rather than inventing recency.
  • Count all returned history rows, including Ready: the recorded snapshot reads 56 requests, not 22 open. Unknown/unavailable empty counts remain absent. Missing actors omit the “by” clause; authenticated Shared actors still read “by Shared”.
  • Separate acquisition, visibility proof, entitlement and playback health. Right expands actual stage words plus the relevant API summary. A present title does not suppress a playback-health fault.

Recorded-wire acceptance matrix

ActivityTruthProjectionTest consumes the recorded activity API shapes, not title-specific overrides.

Recorded title / evidence New label
Steins;Gate movie; represented file, visibility proof error Check needed
Yu Yu Hakusho; represented files, visibility proof error Check needed
Love is Blind; represented files, visibility proof error Check needed
Spider-Man: Homecoming; held outside the original beneficiary's libraries In another library
One Hour Photo; deleted, including a row with retained historical playback Removed
The Body; unreleased Not out yet
Avatar; unresolved playback-health fault File health needs attention
Partition; dispatched, waiting for an Arr import, no transfer proof Waiting for a file
Love is Blind: Netherlands; import not observed by the primary route Waiting for a file

Ready and explicitly signalled Downloading remain intact. Tests also cover absent membership, unknown in-progress acquisition, same-title seed identity collisions, combined watched/added evidence, added-only candidates remaining available, and health details retaining episode/source names when supplied in the summary.

Why Locke and One Hour Photo remain

The read-only audit found Mindel's own recorded plays, not another profile's seed history:

  • Locke: Mindel's played ledger is dated 2026-09-19T23:17:55Z; her Jellyfin UserData independently retains Played=1, PlayCount=1, and the matching last-play time. It is now held by Justin/Shared, not Mindel.
  • One Hour Photo: Mindel's retained played ledger is dated 2026-09-20T11:22:00Z; her original dispatch was subsequently deleted. The title no longer has a current audited household holding. Retained history still makes it a watched seed; it is not evidence of current ownership or independent proof of a human viewing session.

Seven of the 23 contributing seed identities were added-only. Those must not claim “watched”. The audit's original 142-pick sample had zero picks in Mindel's owned library: these are intentionally acquisition suggestions, filtered against her holdings, not in-library recommendations. That product behavior is unchanged. The later recorded test fixture contains 41 movies and 100 series, with the same 23 identities / seven added-only seeds.

Native visual evidence

Native Robolectric/Roborazzi Compose frames, 1920×1080, density 2.0. Both sides deliberately omit artwork and use the shipped missing-art renderer. No token, ring, spacing, Home, Title, Picker or Library renderer changes. Sheet geometry, five/four-row windows, shelf heading positions and focus treatment remain unchanged; expanded rows naturally grow for the evidence summary. Files are stored under /opt/stacks/pages/store/wolfskin/tv-fb1-truth/, mode 660. Pages links require the existing sign-in.

Surface Before After
Coming-in list and Settings history count Before request history After request history
Mindel Discover series lane titles Before series lanes After series lanes
Mindel Discover watched movie lane titles Before movie lanes After movie lanes
Avatar expanded readiness Before health detail After health detail
Deleted request history Before removed history After removed history

Expanded Steins;Gate visibility-proof summary.

Verification on 278335f0

  • Failing-before regression reproduced Steins;Gate as Failed instead of Check needed; the recorded-wire matrix now passes.
  • Targeted provider, lane projection, request focus/ratings/polling and native capture checks passed. All six changed-surface native captures passed again in the final full suite.
  • Final full gate passed with 697 app, 190 design and 17 client tests green, plus the client disk-reopen / 304 / saved-on-503 smoke. Serial rerun used the same testDefaultDebugUnitTest target through a scratch Make overlay, one Gradle worker and one test fork; no tests were excluded.
  • The initial standard make test failed because offline SDK 28/30 jars were missing (109 failures) and three picker-session tests timed out under load. An online prerequisite task resolved each pinned Robolectric SDK independently; all three runtime jars were cached on its first attempt. The serial full suite then passed without source changes, picker edits, or test suppression. The repository's ordinary combined SDK dependency configuration selects only one version; the online warm-up was local build setup, not part of this patch.
  • Isolated PersonPickerSessionTest confirmation passed all 7 tests, including the three initially timed-out cases. No picker source or tests were changed.
  • make apk-debug passed, including branding checks on all four packaged debug APKs.

Boundaries and device review

The activity contract currently distinguishes deleted/unreleased/held-elsewhere/import-waiting states through stage summaries rather than structured reason codes. The adapter recognizes the existing signals; unknown in-progress acquisition is neutral Waiting, never assumed Downloading. Expanded detail preserves the provider's summary, including its library-route identifier. Avatar's current activity wire supplies only a title-level health summary, not the audit's individual affected episode/source list; the TV preserves such scope if a summary supplies it, and invents none.

No ADB, device access, installation, playback probe, service mutation, queue retry or backend repair. External service access was read-only GET/SQLite. Owner merges and installs.

After installation, check Mindel > Discover (especially Series: no watched captions for added-only seeds; Locke/One Hour Photo remain legitimate historical watched seeds) and Settings > Requests (neutral history count, absent actors omitted, deleted/unreleased/elsewhere labels). Press Right on Steins;Gate and Avatar to distinguish visibility checks from file-health attention; confirm Ready and genuinely Downloading rows still behave normally.

## Outcome Discover now reserves “Because you watched” for watched seed evidence. Settings > Requests presents household request **history**, not an invented queue of open downloads. TV-only; no Conductarr changes or live repairs. AI-assisted (fork-internal). ## Changes - Group recommendation contributions by media type + TMDB identity, retain watched/added flags, and use stable seed lane IDs. Added-only seeds produce no named shelf; their candidates remain in the general For-you collections. Titleless contributions stay dropped. The pinned wire has no per-seed watch timestamp, so watched shelves retain wire order rather than inventing recency. - Count all returned history rows, including Ready: the recorded snapshot reads **56 requests**, not **22 open**. Unknown/unavailable empty counts remain absent. Missing actors omit the “by” clause; authenticated Shared actors still read “by Shared”. - Separate acquisition, visibility proof, entitlement and playback health. Right expands actual stage words plus the relevant API summary. A present title does not suppress a playback-health fault. ## Recorded-wire acceptance matrix `ActivityTruthProjectionTest` consumes the recorded activity API shapes, not title-specific overrides. | Recorded title / evidence | New label | |---|---| | Steins;Gate movie; represented file, visibility proof error | Check needed | | Yu Yu Hakusho; represented files, visibility proof error | Check needed | | Love is Blind; represented files, visibility proof error | Check needed | | Spider-Man: Homecoming; held outside the original beneficiary's libraries | In another library | | One Hour Photo; deleted, including a row with retained historical playback | Removed | | The Body; unreleased | Not out yet | | Avatar; unresolved playback-health fault | File health needs attention | | Partition; dispatched, waiting for an Arr import, no transfer proof | Waiting for a file | | Love is Blind: Netherlands; import not observed by the primary route | Waiting for a file | Ready and explicitly signalled Downloading remain intact. Tests also cover absent membership, unknown in-progress acquisition, same-title seed identity collisions, combined watched/added evidence, added-only candidates remaining available, and health details retaining episode/source names when supplied in the summary. ## Why Locke and One Hour Photo remain The read-only audit found Mindel's own recorded plays, not another profile's seed history: - **Locke:** Mindel's played ledger is dated `2026-09-19T23:17:55Z`; her Jellyfin UserData independently retains `Played=1`, `PlayCount=1`, and the matching last-play time. It is now held by Justin/Shared, not Mindel. - **One Hour Photo:** Mindel's retained played ledger is dated `2026-09-20T11:22:00Z`; her original dispatch was subsequently deleted. The title no longer has a current audited household holding. Retained history still makes it a watched seed; it is not evidence of current ownership or independent proof of a human viewing session. Seven of the 23 contributing seed identities were added-only. Those must not claim “watched”. The audit's original 142-pick sample had zero picks in Mindel's owned library: these are intentionally **acquisition suggestions**, filtered against her holdings, not in-library recommendations. That product behavior is unchanged. The later recorded test fixture contains 41 movies and 100 series, with the same 23 identities / seven added-only seeds. ## Native visual evidence Native Robolectric/Roborazzi Compose frames, **1920×1080, density 2.0**. Both sides deliberately omit artwork and use the shipped missing-art renderer. No token, ring, spacing, Home, Title, Picker or Library renderer changes. Sheet geometry, five/four-row windows, shelf heading positions and focus treatment remain unchanged; expanded rows naturally grow for the evidence summary. Files are stored under `/opt/stacks/pages/store/wolfskin/tv-fb1-truth/`, mode `660`. Pages links require the existing sign-in. | Surface | Before | After | |---|---|---| | Coming-in list and Settings history count | ![Before request history](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/before/requests-history.png) | ![After request history](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/requests-history.png) | | Mindel Discover series lane titles | ![Before series lanes](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/before/discover-tv.png) | ![After series lanes](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/discover-tv.png) | | Mindel Discover watched movie lane titles | ![Before movie lanes](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/before/discover-movie.png) | ![After movie lanes](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/discover-movie.png) | | Avatar expanded readiness | ![Before health detail](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/before/requests-health.png) | ![After health detail](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/requests-health.png) | | Deleted request history | ![Before removed history](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/before/requests-removed.png) | ![After removed history](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/requests-removed.png) | [Expanded Steins;Gate visibility-proof summary](https://pages.justinvisser.org/wolfskin/tv-fb1-truth/after/requests-proof.png). ## Verification on `278335f0` - Failing-before regression reproduced Steins;Gate as `Failed` instead of `Check needed`; the recorded-wire matrix now passes. - Targeted provider, lane projection, request focus/ratings/polling and native capture checks passed. All six changed-surface native captures passed again in the final full suite. - Final full gate passed with **697 app, 190 design and 17 client tests green**, plus the client disk-reopen / 304 / saved-on-503 smoke. Serial rerun used the same `testDefaultDebugUnitTest` target through a scratch Make overlay, one Gradle worker and one test fork; no tests were excluded. - The initial standard `make test` failed because offline SDK 28/30 jars were missing (109 failures) and three picker-session tests timed out under load. An online prerequisite task resolved each pinned Robolectric SDK independently; all three runtime jars were cached on its first attempt. The serial full suite then passed without source changes, picker edits, or test suppression. The repository's ordinary combined SDK dependency configuration selects only one version; the online warm-up was local build setup, not part of this patch. - Isolated `PersonPickerSessionTest` confirmation passed all **7 tests**, including the three initially timed-out cases. No picker source or tests were changed. - `make apk-debug` passed, including branding checks on all four packaged debug APKs. ## Boundaries and device review The activity contract currently distinguishes deleted/unreleased/held-elsewhere/import-waiting states through stage summaries rather than structured reason codes. The adapter recognizes the existing signals; unknown in-progress acquisition is neutral Waiting, never assumed Downloading. Expanded detail preserves the provider's summary, including its library-route identifier. Avatar's current activity wire supplies only a title-level health summary, not the audit's individual affected episode/source list; the TV preserves such scope if a summary supplies it, and invents none. No ADB, device access, installation, playback probe, service mutation, queue retry or backend repair. External service access was read-only GET/SQLite. Owner merges and installs. After installation, check **Mindel > Discover** (especially Series: no watched captions for added-only seeds; Locke/One Hour Photo remain legitimate historical watched seeds) and **Settings > Requests** (neutral history count, absent actors omitted, deleted/unreleased/elsewhere labels). Press Right on Steins;Gate and Avatar to distinguish visibility checks from file-health attention; confirm Ready and genuinely Downloading rows still behave normally.
justinzeus added 1 commit 2026-11-06 20:34:57 +01:00
Present watched recommendation seeds and request history truthfully
All checks were successful
review/code-gpt Firstmate read the PR evidence: TV-only labels and seed grouping, recorded-wire acceptance matrix, fixtures contain no secrets (checked), native before/after frames, full serial suite 697/190/17 green plus apk-debug; no tokens, ring or spacing changes; device check follows
review/design-claude Firstmate read the PR evidence: TV-only labels and seed grouping, recorded-wire acceptance matrix, fixtures contain no secrets (checked), native before/after frames, full serial suite 697/190/17 green plus apk-debug; no tokens, ring or spacing changes; device check follows
278335f009
justinzeus merged commit 5162c299db into main 2026-11-06 20:37:47 +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#46
No description provided.