feat: add profile-scoped Recent channels v10 - #107
Conversation
MrFr3di
left a comment
There was a problem hiding this comment.
Static execution checkpoint while self-hosted CI is disabled:
- keep this PR draft/unmerged;
- complete only R2/Recent semantics, schema and Channels integration here;
- do not add Home/Guide/FFmpeg/CI Phase 2 to this branch;
- exact-head Full + DB old-edge/current + Product old-edge/current remain mandatory before ready-for-review/merge;
- current known-red root cause is stale test references to removed
RecentChannelWriteResult.TargetUnavailable; production API already usesProfileUnavailable.
MrFr3di
left a comment
There was a problem hiding this comment.
Static review after fixing the two stale enum fixtures on head b268557de3ab9dc23b721c8f0e1efd7abb2aa0a4:
- Room entity,
MIGRATION_9_10, DAO semantics and the previously generated Room v10 artifact agree on the intended schema: composite(profileId, canonicalChannelId)key, profile FK only, no canonical FK. - Historical generated v10 identity hash:
f6625d546ddfbad62e4e33340b17f490. - Current read path preserves active/current-revision + non-hidden truth and repository newest-first order.
- Channels filter/focus wiring remains stable-key based for restoration and first-row Up targets the selected filter.
MainActivity -> AppNavigation -> ChannelsRoutecarries the same required Recent repository; Media3 remains independent of Room through the app observer boundary.
No additional runtime semantic change is proposed from this static pass. Remaining hard blockers are generated 10.json commit and exact-head build/device validation once a build environment/self-hosted runner is available. Keep draft/unmerged.
MrFr3di
left a comment
There was a problem hiding this comment.
Execution boundary while self-hosted CI is off: do not add Home/Guide/transport/FFmpeg work to #107. Finish R2 as persistence + Channels only; generated schema and exact-head Full/DB/Product gates remain mandatory before merge.
MrFr3di
left a comment
There was a problem hiding this comment.
Next accepted sequence after #107 (separate clean branches from accepted main, never stacked): #110 compressed EPG transport -> #114 catalog truth invariants -> bounded Guide/#29 -> #108 transport classification -> #109 measured buffering -> #117 FFmpeg audio spike only on codec evidence -> #30 fallback/Doctor -> #111/#116/#113/#118 hardening -> #31 alpha/release. CI #101 remains a separate optimization and is not the product critical path.
MrFr3di
left a comment
There was a problem hiding this comment.
Runner-off checklist for the next resume:
Can complete now by source/static work: stale call-site cleanup, schema/entity/migration semantic comparison, DI/navigation/focus review, privacy review, PR scope cleanup.
Must wait for build environment: commit/re-generate exact Room 10.json, run JVM/Android compile, migration matrix, API old-edge/current TV journeys, release/lint checks.
Do not interpret absence of new CI failures while the runner is offline as success.
MrFr3di
left a comment
There was a problem hiding this comment.
Static privacy boundary remains unchanged: Recent persists only profile ID, canonical channel ID and successful-playback timestamp; no URL, header, credential, query, provider locator, programme title or raw exception is added to persistence/diagnostics by this PR.
MrFr3di
left a comment
There was a problem hiding this comment.
Plan document updated at commit 35f9f853c01ffee5b9d2bf8191b1d3361fc463e0: docs/superpowers/plans/2026-08-05-recent-channels-v10.md now records completed source work, generated-schema blocker, runner-off restrictions, Home R2B split and final acceptance order.
|
Current exact-head update after device-evidence review:
The exact generated Room v10 artifact remains the explicit unclosed static merge gate. Verified generated artifact: version Keep draft/unmerged until the exact |
Scope
Implement R2 of #29: bounded profile-scoped Recent channels whose only write trigger is the service-owned accepted first-rendered-frame signal.
Implementation plan:
docs/superpowers/plans/2026-08-05-recent-channels-v10.md.Product contract
Durable profile-scoped history
(profileId, canonicalChannelId);Active/profile-visible read truth
A Recent row is projected only when that canonical identity currently has a stream variant from the source's
activeRevisionand is not hidden for the selected profile. Hidden or temporarily inactive history remains bounded internally and may reappear only when the same canonical identity becomes active/visible again.Playback ownership
RecentPlaybackObserverconsumes the existing direct first-frame observer fan-out;TV surface
Все / Избранное / Недавние;Показано, never claims an exact total;Room v10
9→10createsrecent_channels;core/database/schemas/app.muxtv.database.MuxTvDatabase/10.json;10;f6625d546ddfbad62e4e33340b17f490;809c0bfa812e5a86a5a84d97fe4f48f1d9ac71e515c5745ef222f24689e926c4;Defect found and fixed during acceptance
The first old-edge Product matrix exposed migration-test harness drift:
EpgMigration4To5Testvalidated4→5, then opened current Room v10 while registering migrations only through8→9. Commit9492702adds productionMIGRATION_9_10to that current-schema open without destructive fallback or runtime migration changes.Final exact-head acceptance
Exact head:
d095fb0e99485f93f9dbed8675c13b0f5ac52537.Android TV product DeviceMatrix
31027992936— success against a conflict-free merge with acceptedmain@158210876251a95869463208da9491d7f46f0663.The matrix includes its own Full host acceptance before AVD execution and then runs all connected product suites sequentially on exact Android TV API26 and API36 profiles.
Per profile:
Schema evidence is byte-identical on host, API26 and API36:
809c0bfa812e5a86a5a84d97fe4f48f1d9ac71e515c5745ef222f24689e926c4;f6625d546ddfbad62e4e33340b17f490.Separate Self-hosted Full
31027992891and Database DeviceMatrix31027992820were queued by path ownership, but are redundant independent invocations of the host/database work already executed successfully inside the exact-head Product DeviceMatrix. They are not treated as missing evidence.Final semantic/privacy review:
Non-goals
No Home shelf, full Guide, fallback/Doctor, alternate player, M3U conditional validators, CI Phase 2, Paging3, Rust/UniFFI, speculative indexes or secret-bearing Recent state.