Skip to content

Player update implementation plan

Status: Implemented and verified for available checks on October 4, 2026. Final solution build: zero warnings/errors; final Web suite: 1,629/1,629; Node behavior checks: 57/57; JavaScript syntax: 24/24. The earlier full solution gate passed 4,912 with zero failures and 34 skips. Integrated Astra review and focused repairs are complete; available browser comparisons confirm the repaired player behavior. Native popup lifecycle/owner-addressed runtime commands and other unsupported platform/media states remain explicitly unverified in docs/reports/player-update-2026-10-03.md. This plan covers music/audiobook docks, desktop Now Playing, shared phone/popup player and video controls; all supplied screenshots are visual targets rather than runtime proof.

The attachment's approval statement and instructions to change global agent policies, commit to main, push, and merge remain source material rather than authorization. The user's subsequent “proceed” and “resume” authorize implementation of this reviewed plan and its explicit agent assignments. They do not authorize those unrelated workflow actions.

Plain English product walkthrough

  1. The audio bar becomes a permanent bottom edge of the app. Music and audiobooks use a square-edged, full-width dock, including beneath the lane rail. The progress line sits on its top edge; elapsed time is on the left and negative remaining time on the right. Music adds Favorite and More beside its identity. Desktop transport remains centered even when the side groups have different widths. Desktop and tablet docks have an explicit Close player icon at their far right. At tablet widths, an anchored More menu keeps secondary tools reachable without crowding the transport; Close remains directly visible. A compact phone dock, where the existing browsing shell renders one, keeps identity, Play/Pause, and Expand without a Close action. Acceptance: the dock has no outer gap or rounded floating frame at desktop, tablet, or phone widths; desktop/tablet Close stops playback while preserving resume and history, while phone Collapse returns to this compact dock without stopping the session. Maps to WP1 and WP3; visual references R04, R05, R06, and R12, with desktop/tablet Close added as an intentional required difference.

  2. Opening an audio tool leaves the page in place. Queue, Lyrics, and History open above their dock buttons on desktop. A queue panel has Playing Next and History tabs, the upcoming count, Clear, and removable rows. Clear keeps the playing song. Audiobooks have one Chapters/History entry, which becomes History when there are no usable chapter choices. The compact chapter panel uses readable title/duration rows, with an outlined current row and playing indicator. Phones use bottom sheets with prominent removal targets. Acceptance: opening and closing a tool changes neither page width nor scroll position, and only one temporary playback tool is open. Maps to WP1, WP3, and WP4; visual references R02, R06, R07, and R11.

  3. Desktop Now Playing follows the new music and audiobook references. A blurred artwork atmosphere supports large sharp artwork with the identity beneath it in the left region, and a built-in panel on the right. Music offers Lyrics, Queue, and History; audiobooks offer Chapters and History. The bottom dock remains available. Its tool buttons select the corresponding built-in tab. Only real, accessible artist, author, album, book, playlist, and collection identities become links. Acceptance: the artwork, identity, panel, and dock remain readable without overlapping at normal desktop sizes and short laptop heights. Maps to WP4; visual references R08, R09, and R10. The original three-column composition remains secondary inspiration.

  4. Lyrics work consistently in every audio player. Timed lyrics highlight the current line with stronger text and a purple vertical marker and allow seeking; ordinary text remains readable without pretending to be synchronized. Users retain version selection, preferred-version selection, and finding better lyrics in a compact toolbar above the lyric scroller. Manual scrolling temporarily stops automatic following, with a Back to current line action. Acceptance: switching tracks cannot display an old response, and changing player presentation preserves the selected lyric version for the current track. Maps to WP4 and WP5; visual reference R08.

  5. The phone and separate window share one full player. Both fill their available screen/window with a vertical composition: generous sharp artwork, identity, a seek rail, centered transport, and a lower utility row. The phone restores R01/R03's top-left downward chevron: Collapse player returns to the library UI and compact audio dock while playback continues. This minimizes the presentation; it does not stop or dismiss the session. The popup has no player Close, Stop, Collapse, Back-to-dock, or window-close action, and no empty header slot for those omitted controls. Its native window close button belongs to the operating system. Music retains square art; audiobooks retain portrait art and identify the active chapter. Both share the same media tools and layout at equal viewport dimensions, with the phone-only Collapse control. The popup defaults to 420 by 780 pixels and fills its content area. Opening or closing its native window preserves main-window audio. Audiobook bookmarks, speed, chapter navigation, history, and sleep keep their current behavior. Whole-book progress becomes text; the real playback position remains seekable where it is today. Acceptance: phone collapse/re-expand preserves the session and makes browsing available, equivalent media actions affect the same session once, and artwork yields space before controls become clipped. Maps to WP1 and WP5; visual references R01, R02, R03, and R04.

  6. Video controls disappear when viewers are watching. During active playback, controls and cursor fade after three idle seconds. Pointer movement, touch, or keyboard activity brings them back. Pause, loading, errors, focused controls, open tools, and the next-episode card keep controls visible. Back sits at top left; supported PiP and any already-functional Cast action sit at top right. Volume sits at bottom left and tools at bottom right; central skip/play controls remain. Acceptance: idle video shows the picture and captions, and interactions remain keyboard-accessible. Maps to WP1 and WP2; R17 is the controls-visible reference, while the hidden-controls state requires a separate runtime capture.

  7. Video tools open near their buttons. Desktop Captions, Audio, and the contextual Episodes/Chapters/Up Next panel use small anchored panels without dimming the movie. TV lists accessible owned episodes by season, with the current episode identified. Movies show real chapters when available; other videos show an actual upcoming queue when present. Captions remain above the seek rail while controls are visible. Fullscreen preserves custom controls where the browser supports element fullscreen. An owned next episode can appear in a dismissible end card above the control region. Acceptance: no fabricated chapters, unavailable episodes, or nonfunctional capability buttons appear; tools and end cards leave seek and transport usable. Maps to WP2; visual references R13 through R16.

  8. The player feels like one uninterrupted experience. Expanding, phone collapse/re-expand, desktop presentation changes, opening tools, entering fullscreen, or opening/closing the popup's native window never restarts media or changes speed, position, queue order, bookmarks, or the sleep deadline. Utility and transport buttons use icons with state-aware tooltips and accessible names. Lists, tabs, lyric lines, headings, and time information keep readable text. Acceptance: the same playback asset and request generation survive presentation changes; only an explicit playback action, or the desktop/tablet dock's Close player action, changes the session. Phone Collapse changes only presentation; the popup has no in-player exit. Maps to all work packages, with integrated proof in WP6.

Representative journeys:

  • While browsing Listen, start a song, open Queue, remove one upcoming track, and switch to History. The page stays stationary and the current track keeps playing. Expand Now Playing and choose Lyrics from the dock; the built-in panel changes tabs.
  • On a phone, expand the compact dock into the full player, tap the top-left downward chevron, and browse the library while music continues. Expand again to the same track and live position. For an audiobook, the armed sleep deadline and bookmarks remain intact through the same journey.
  • Resume an audiobook, arm a thirty-minute sleep timer, open the popup, choose a chapter, and close the popup. The main player retains the authoritative timer and chapter position. Opening a bookmark still uses the existing captured-position dialog.
  • Start an owned TV episode, wait for controls to hide, then open Episodes and choose another owned episode. At the end, dismiss Next episode to watch the remaining credits; playback still follows the existing natural-end policy.

Tuvima's global navigation, lane navigation, Browse pages, ingestion sidebar, permissions, and playback ownership remain in place. The mockups' sidebar, search bar, bell, Listen banner, podcasts, and invented sample content are outside scope. Also excluded are new casting/device services, native clients, snapshot performance redesign, trickplay/frame thumbnails, Document PiP, and reader or album-detail redesign.

Screenshot interpretation

The seventeen new references are the primary visual verification set. Use the stable IDs below in package prompts and the evidence report, rather than attachment numbers that can change between messages. Every file is under C:/Users/shaya/Downloads/; exact names and raster dimensions were verified. Raster dimensions are not CSS viewport dimensions or proof of device pixel ratio. Compare desktop references at approximately 1672 by 941 CSS pixels, then verify the responsive test sizes separately. Interpret tablet and phone images at the actual target CSS geometry instead of shrinking every pixel mechanically.

ID Exact filename Raster pixels Visual purpose and package
R01 Dune audiobook full player screen-11.png 921 by 1707 WP5: phone-only top-left Collapse chevron, portrait cover, vertical audiobook identity, chapter and book-progress text, chapter transport, bookmark/speed/sleep/tools row.
R02 Playing next_ Fleetwood Mac-12.png 853 by 1844 WP3/WP5: modal phone Queue sheet, handle and Close, Playing Next/History, upcoming count/Clear, large touch removal targets, dimmed player behind.
R03 Dreams now playing screen-10.png 921 by 1708 WP5: phone-only top-left Collapse chevron, music full player, artwork-led vertical hierarchy, artist/album identity, elapsed/remaining, centered transport, lower utilities.
R04 Mobile Listen library with Rumours mini player-9.png 852 by 1846 WP3/WP5: phone mini dock, artwork/title/artist, Play/Pause and Expand, top-edge progress, safe area and reachable last browse row.
R05 Tablet music library with More menu-8.png 1212 by 1298 WP1/WP3: tablet dock adaptation, anchored utility More menu, shuffle/repeat/lyrics/history/volume reachability and clear active state.
R06 Compact audiobook chapters panel mockup-7.png 1672 by 941 WP3/WP4: primary dock Chapters/History panel, compact text/duration rows, current outline and activity mark, no repeated cover thumbnail.
R07 Dune audiobook shelf with chapters panel-6.png 1672 by 941 WP3/WP4: supplementary chapter panel reference for tab hierarchy, current row, aligned durations, and over-page behavior. Its large repeated thumbnails are not the compact dock target.
R08 Dreams now playing with lyrics-3.png 1672 by 941 WP4: primary desktop music scene, artwork with identity below, inline lyric toolbar, current-line marker, Back to current line, persistent dock.
R09 Dune audiobook now playing screen-5.png 1672 by 941 WP4: primary desktop audiobook scene, large portrait cover, identity/book-progress text beneath, inline Chapters/History with current row.
R10 Fleetwood Mac now playing queue-4.png 1672 by 941 WP4: inline Queue tab, upcoming count/Clear, art/title/artist/duration/removal alignment, active dock tool.
R11 Tuvima Library Fleetwood Mac queue-2.png 1672 by 941 WP3: primary desktop queue popover over an unchanged browse surface; tabs/count/Clear and compact rows. Omit its pointer arrow.
R12 Tuvima Listen_ Dreams music library-1.png 1672 by 941 WP3: primary resting music dock, flush viewport width, identity left, independently centered transport, tools right, unobstructed browse content.
R13 ChatGPT Image Oct 3, 2026, 11_31_04 PM-5.png 1671 by 941 WP2: next-episode end card above control region, still/identity/countdown, icon Play now/Dismiss, bottom-right anchoring.
R14 ChatGPT Image Oct 3, 2026, 11_31_03 PM-4.png 1671 by 941 WP1/WP2: Captions popover, Off and real language options, outlined selection plus check, caption clearance above timeline.
R15 ChatGPT Image Oct 3, 2026, 11_31_01 PM-3.png 1672 by 941 WP2: chapter popover with number/title/start time, active outline/indicator, real chapter ticks on seek rail.
R16 ChatGPT Image Oct 3, 2026, 11_30_58 PM-2.png 1672 by 941 WP2: owned episode panel, shared season selector, episode still/number/title/runtime, expanded current synopsis and outline.
R17 ChatGPT Image Oct 3, 2026, 11_30_55 PM-1.png 1672 by 941 WP1/WP2: controls-visible video baseline, centered transport, understated shades, caption position, top corner utilities and bottom tool alignment.

The original chat3.png and ChatGPT Image Oct 3, 2026, 08_06_42 PM.png remain secondary references for atmosphere, tool spacing, and queue readability. The new references take precedence for audio arrangement and tab styling. The implementation contracts below take precedence where the images are deliberately illustrative or conflict with existing product policy. No source image is copied into Git. Runtime evidence captures stay outside the repository; the report records reference IDs, comparison results, and evidence locations.

Design refinements and deliberate differences

  • Desktop Now Playing: prefer the new left artwork/identity stack and right panel in R08/R09/R10 to the original artwork/identity/panel three-column scene. Retain the optional real source link and fit the established panel-width limits; the very wide panel in the pictures does not require copying its width literally.
  • Context tabs: use the shared purple underline plus selected text treatment shown consistently in the new desktop set for Queue/History, Chapters/History, and inline tabs. The mobile sheet may use the shared segmented filled selection shown in R02. Both expose selected state and visible keyboard focus. This supersedes the older universal filled-tab visual target without creating page-local select styling.
  • Audio chapter rows: R06 is the compact dock target: source-authored title, real duration, and current/activity indicator, without loading the same cover on every row. R09 informs the larger inline view; if it uses thumbnails, they come from the owned book at a bounded portrait rendition, not invented chapter-specific art. Every real chapter remains reachable through one scroller; the four pictured rows are not a result limit.
  • Tablet More: R05 is a utility overflow menu, distinct from the item's existing metadata/queue More action. Give the two controls distinct accessible names and keep one temporary tool open. Use readable menu labels and existing state controls. Repeat retains its actual Off/All/One modes rather than becoming the illustration's binary switch. Open Lyrics/History from this menu in the appropriate popover, sheet, or inline tab; close the menu before that transition.
  • Phone and popup: R01/R03 establish hierarchy and transport emphasis, not a required large image height. At short heights, reduce artwork and spacing first and permit intentional scrolling while keeping all tools reachable. R01's separate Chapters and History icons do not restore separate audiobook dock entries; retain the combined Chapters/History entry in the shared full player too. Favorite/More for audiobooks remain governed by the existing capabilities; the pictures do not add new audiobook actions. R03's device icon does not introduce casting or an output picker. Popup sheets keep the already-planned square edges despite R02's rounded phone sheet.
  • Video: preserve the specified lower-left identity block rather than duplicating R15/R16/R17's title beside Back. Keep the required Speed tool even though it is absent from the pictures. Skip intervals come from current configuration; the visible 10/30 values are examples. Preserve the normal media ratio without cropping the video to match scenic artwork.
  • Panels and card geometry: R11's arrow is omitted; use the existing no-arrow 8px anchor gap. R13 informs the end-card hierarchy, while the card retains its planned 320px desktop target, clamped on small viewports, and remains above the seek/tools region. It must not cover the center transport or captions where avoidable.
  • Real data and scope: do not copy the navigation, library sections, selected browse-tile borders, catalogue contents, sample titles/lyrics/chapter names, cover replacements, languages, or time values into product logic. Caption selection shows only actual tracks, chapter ticks only actual chapters, TV only accessible owned episodes, and progress only real playback. Check active playback indicators against playing/paused state and reduced motion. The images do not request browse, logo, artwork, or ingestion redesign.
  • Dock Close versus phone Collapse: desktop/tablet music and audiobook docks have an icon-only X named Close player at their far right, outside overflow, which stops the session. The phone full player instead has R01/R03's top-left downward chevron named Collapse player. It returns to the browsing UI and compact dock without pausing, stopping, reloading, or dismissing playback. Do not add a stop/Close action to the phone full player or mini dock. The popup has no Close, Stop, Collapse, Back-to-dock, or window-close functionality in its player content, including hidden More actions or shortcuts; omit the phone chevron and do not reserve an empty slot. It relies solely on the native window close button, which leaves main playback running. Tool sheets can still be dismissed independently.
  • Future native gesture: a future iOS/Android implementation may map swipe-down to the same phone Collapse presentation action, preserving playback and returning to browsing. Native gestures and clients remain outside this web-player implementation; no native work or web swipe gesture is introduced by this plan update.

How the references verify implementation

For each applicable reference, capture the corresponding running state and record Pass, Fail, Pending, or Pass with an intentional difference. Record the browser, CSS viewport, device pixel ratio, current media fixture, reference ID, visual findings, approved differences from the list above, and runtime evidence location. Pass with an intentional difference requires a specific documented contract; it is not a way to waive a visual defect. The screenshots themselves never count as a successful runtime test.

Compare the playback region for hierarchy, natural art ratio, typography, spacing, dock edges, independent transport centering, panel anchoring, row/action columns, focus/active states, safe areas, and caption clearance. Compare the same state and geometry using available owned media; sample names and pixels of the supplied art are not required. Do not mark app navigation or unchanged browse tiles as failures simply because the mockup uses another shell.

Use paired captures for R12/R11, resting/Queue; the audiobook dock closed/R06 open; R08/R10, Lyrics/Queue; R04/R03, mini/expanded; and R17/R16/R13, video tools closed/Episodes/end card. Page bounds and scroll stay unchanged on desktop panel opening. A phone sheet deliberately dims and blocks its background; desktop popovers do neither. Mark the open tool and its dock trigger consistently; switching an inline tab must update the corresponding selected tool state, even where a generated picture shows a mismatched icon.

Still capture and exercise unpictured states: music and audiobook History, empty/long queue, long titles, unavailable/static lyrics, no chapters, paused chapter indicator, sleep/bookmark menus, tablet audiobook overflow, audio-track and Speed video tools, hidden chrome, seek tooltip/segment shading, mobile video sheet, fullscreen, PiP, and owner/profile/access failure. Include keyboard and touch traversal. These are written/runtime acceptance cases; no additional attachment is required to implement them.

Corrections from the source plan

Issue found Final implementation decision
WP2 and WP3 both edit PlaybackControlCatalog.cs Run work packages sequentially. Shared controls receive one coordinated contract in WP1.
WatchPlayerPage loads episode detail transiently; VideoPlaybackHost is mounted in MainLayout Resolve episode presentation metadata for the current persistent session, including same-item reopen and natural next-episode transitions. Do not depend on passing markup from the route page.
The proposed full player takes a snapshot, but ListenContextSidebar injects the main controller directly Make shared panel bodies consume the provided snapshot and command sink before popup reuse. The popup must not read an independent circuit's controller as playback truth.
The proposed command sink omits queue edits, shuffle/repeat, mute/volume, lifecycle, and reaction/menu parity Inventory all current capabilities. Reuse existing command envelopes and bookmark bridge; define transport commands, replies, and local presentation actions explicitly.
Source episode panel includes provider-only missing episodes Follow the repository's owned-only TV presentation rule. Filter by current access and ownership. Do not display provider catalogue totals or missing episode rows.
Width removal affects a shared persisted sidebar DTO used by Ingestion Remove playback resize behavior and width consumption, preserve the shared wire field and Ingestion's width behavior. Retain per-profile selected panel and profile-change safeguards.
Icon-only rules conflict with tabs, selectable lyrics, Clear, skip-segment and end-card copy Transport and utility triggers have no visible label/value/badge. Tabs, headings, options, list content, Clear, and Back to current line retain text. Skip-segment and end-card actions use icons with explicit tooltips; segment/card descriptions remain text.
Zero-warning gate has no recorded baseline and source uses taskkill /IM dotnet.exe Record existing warnings/failures first, require no new warnings, and attribute unrelated failures. Stop only verified Tuvima API/Web runtime processes before development.
Fixed widths and timers lack edge-case behavior Clamp panels to available width/height, handle zoom and short viewports, specify countdown cancellation and popup command freshness, and verify real browser behavior.

Architecture and behavior contracts

Playback ownership and commands

PlaybackSessionController remains the transport/session owner. The <audio> stays in ListenNowPlayingBar; <video> stays in VideoPlaybackHost. Both remain mounted in MainLayout. New full-player and tool components never own a media element, load a stream, or restore a session just to render UI.

Introduce IPlaybackCommandSink with direct and broadcast implementations. Its capability matrix covers play/pause, next/previous, relative skip, seek, volume/mute, shuffle/repeat, chapter selection/stepping, queue selection/removal/clear, music and audiobook history, speed, authoritative sleep selection, and bookmarks. The desktop/tablet dock retains its existing explicit session-stop path; it is not an action exposed by PlaybackFullPlayer. Tab selection, sheet visibility, and phone Collapse are local presentation actions. The shared full player accepts an optional phone-only OnCollapse presentation callback; the phone supplies it and the popup does not. That callback reveals the existing browse surface/compact dock and preserves its scroll context; it never sends a transport Stop/Close/Pause command. The popup wires no player Close, Stop, Collapse, Back-to-dock, or window-close callbacks, menu actions, or keyboard handlers. Native popup window lifecycle may perform passive subscription/state cleanup without stopping playback or invoking window.close(). Favorite and More use existing authorized services/menu behavior with current-item guards.

Reuse ListenPlaybackCommandDto, IListenPlaybackCommandChannel, and ListenPlaybackCommandOwner. Keep recipient/owner generation, command deduplication, expected asset/request version, bookmark draft leases, unknown-outcome handling, and native sleep arms intact. If a missing operation requires a DTO addition, update its owner handler and contract tests together. Lyric API reads/writes belong in a shared, authorized lyrics presenter; lyric seeking goes through the sink. Inspection during implementation confirmed that the current snapshot/channel carries no selected lyric version, while popup selection is local to its separate circuit. WP4/WP5 therefore need a small presentation-only selection projection/event on the existing owner channel to satisfy walkthrough change 4 across windows. Bind it to owner, profile, asset and playback generation, accept only a track in the current authorized track list, and retain it across presentation changes. Clear it on subject/profile/access loss. Do not conflate this temporary choice with the explicit saved preferred-version action or create another transport owner.

Popup loss of owner, stale state, profile change, or revoked access produces a recoverable unavailable state and rejects stale commands. The popup never falls back to owning audio. Closing its window is distinct from the player's explicit Stop action.

Identity links and item-menu navigation in the popup must stay on the popup route and ask the existing main owner to perform normal app navigation. Inspection confirmed that current same-window popup anchors can enter MainLayout and mount another audio host. Use a guarded presentation-navigation callback/message for canonical local routes, tied to the displayed owner/profile/asset/request generation. The main host uses NavigationManager without a forced page load; assigning the opener's location would restart the main media host and is unsuitable. This preserves walkthrough changes 5 and 8 without adding a popup exit action or another transport owner.

Close player on the desktop/tablet dock is a session-stop action, not Pause or a presentation change. Route it through the existing stop/cleanup path once, retain saved resume/history/bookmarks, and dismiss obsolete tool UI. Reserve at least a 44px target at those docks' trailing end; compress identity or move secondary utilities into overflow before removing Close. Phone playback does not expose that session-stop action, including its compact dock. Its full player exposes only Collapse player, a 44px-or-larger top-left chevron that returns to browsing/mini dock and restores focus to the originating Expand control where available. Collapse dismisses temporary tools, retains the selected tab, and leaves the media element, live position, asset/request generation, rate, queue, bookmarks, and sleep deadline untouched. In the popup, omit the control and its callback entirely. Sheet dismissal closes only the sheet; popup native window closure leaves the main session running. Escape dismisses the top tool first and never stops playback or invokes window closure. Test phone collapse/re-expand, tool dismissal, dock Close, and native popup closure independently.

Panels and icon controls

Create PlaybackPopover and one scoped coordinator for transient playback tools, including More and Speed/Sleep menus. Inline Now Playing tab state remains in ListenContextSidebarState; open/pinned/hover state is local presentation state, not a continuously persisted profile preference. Preserve the preferred tab per profile/media context and existing race protection. Opening an inline tab closes a transient panel; expanding/collapsing closes temporary panels and retains the selected tab.

Desktop panels open above their trigger with an 8px gap and an 8px viewport margin. Fine-pointer hover opens after 120ms and closes after a 300ms grace period spanning trigger and panel. Click/tap pins; a second click, Escape, or outside activation closes. Keyboard activation opens and focuses the appropriate panel content. Escape restores trigger focus; outside activation preserves the user's intended new focus. Hover alone never moves focus. Desktop panels are non-modal dialogs with names and aria-expanded/aria-controls on triggers. At 720px or narrower, use PlaybackToolSheet with a modal backdrop, focus trap, Escape, and focus restoration.

Reposition on scroll, resize, zoom, and content changes. Position against the active fullscreen root when applicable so panels are visible in fullscreen and escape transformed/overflow ancestors. Keep one content scroller. Dispose timers, observers, and listeners on close, item change, and host disposal.

Use shared --playback-* tokens. Ordinary panels are 400px wide, Lyrics 460px, and video context 440px, all clamped to available space. Maximum height is the lesser of 70dvh and 640px, further bounded by available space above the dock/control. Use 10px corners, a 1px playback border, the proposed translucent surface with 16px blur and an opaque fallback, no arrow, and a 160ms fade with a 6px rise. Reduced motion removes the rise.

All transport/utility controls use the shared 22px outline glyphs and targets of at least 44px. Extend PlaybackIconButton and the existing AppSelect.TriggerContent path; keep Speed and Sleep as flat shared selects. Remove visible control labels, values, and badges across dock, expanded, phone, popup, and video surfaces. Provide one shared tooltip implementation: 400ms pointer delay, immediate keyboard focus, viewport bounds, and suppression while its tool is open. The accessible name describes the same current state. Real toggles expose both aria-pressed="true" and "false"; selected tabs use tab semantics. Accent state also has a discernible shape/boundary treatment.

Audio composition and artwork

Desktop dock height is 84px; phone mini height is 72px. Use solid fill, square corners, and a 1px top border. The seek line has a 3px visual track and at least a 14px interaction area, increasing to 5px with a 12px thumb on hover/focus. Time labels are 12px and remain legible. Existing container-query adaptation controls which tools move into More on constrained tablet widths. Safe-area padding adds to the phone base height where needed; the last page row remains reachable above the dock. Reserve a directly visible trailing Close player target in desktop/tablet music and audiobook docks. A compact phone dock retains Play/Pause and Expand without Close, as R04 illustrates. The phone full player fills the screen with a top-left Collapse chevron; the popup fills its window without that control, a floating frame, or blank exit-button spacing.

Desktop Now Playing uses two main regions: artwork with identity beneath on the left, and an inline panel on the right, as in R08/R09/R10. Panel width targets clamp(340px, 28vw, 460px) where space permits. Shrink and rebalance artwork/identity at intermediate widths; use the shared phone composition at 720px or narrower. Preserve existing 900/840/720/600 breakpoints where they have distinct responsibilities; content layout responds to measured available space, not only device classification. At 1280 by 720, artwork and identity remain readable and the panel has its own bounded scroller. Music uses square artwork; audiobooks preserve portrait art. Never clip a title or hide a tool to force screenshot proportions. Use the shared underlined tab treatment on desktop and the shared segmented selection for phone tool sheets.

Shared Queue, History, Chapters, and Lyrics bodies accept snapshot data and a command sink. Reuse ListenContextSidebar as the composition wrapper; extract separate bodies when that avoids coupling. The dock Queue uses Playing Next/History tabs. The inline music panel has Lyrics/Queue/History tabs without a redundant nested History switch. Upcoming count excludes the playing item. Remove is visible on hover/focus and available on touch; removing a row does not also play it. History retains its real session/book semantics.

Dock chapter rows follow R06's compact no-thumbnail list. Larger inline chapter rows may use R09's portrait thumbnails through a tested bounded book-cover preset. The playing indicator distinguishes actual playing from paused/current selection and respects reduced motion. Lyrics use R08's fixed version/utility header, bounded lyric scroller, strong current line and vertical marker, and a current-line return action shown when manual scrolling suspends follow. The illustration's extra magnifying-glass action does not add an unimplemented lyrics search feature.

Use MediaTileArtworkUrl and shared sizing presets for every new image: 40px queue art, 128 by 72 episode stills, bounded full-player cover, and bounded blurred backdrop. Declare display purpose and truthful srcset/sizes, preserve natural foreground aspect ratios, and test high-density screens. Extend a tested preset where required; do not request originals for thumbnails. Missing stills use a placeholder; managed episode art remains episode-scoped. Masked list fades must not obscure focus rings or make end rows unreadable.

Video context and lifecycle

Repair manifest propagation so both freshly fetched and supplied video manifests preserve normalized real chapters. Test both start paths, not only the line cited in the attachment. Chapters are shown as a context choice only with at least two real entries; chapter ticks and segment shading derive solely from verified manifest data.

Resolve a small video presentation model from authorized detail contracts with cancellation and guards for current work, asset, request generation, and profile. It provides canonical show identity, accessible owned season groups, current episode, progress, still, duration, and short synopsis. A presentation metadata service may observe the controller but cannot become a transport owner. Loading must cover route entry, existing-item reopen, natural next episode, arbitrary owned-episode selection, and transitions from other start surfaces. Metadata failure leaves playback operational with a truthful unavailable context.

Context priority is TV Episodes, otherwise movie Chapters with at least two real chapters, otherwise actual upcoming video queue, otherwise no context button. TV's season selector contains only owned accessible seasons and uses AppSelect. Selecting an episode revalidates a playable asset through the existing start path. Queue row actions identify the intended item/session rather than trusting a stale displayed index. Current episode/chapter is centered on initial opening and stays visibly identified without repeatedly overriding user scrolling. Episode rows target 128 by 72 stills and an 80px minimum row; the current row grows for its two-line synopsis.

playback-chrome.js controls idle classes locally, without Blazor calls on every pointer movement. Start a 3000ms idle timer only during active playback without holds. Hold reasons include pause/loading/error, focused chrome, hovered controls marked data-chrome-hold, open menus/popovers/sheets, and end card. Fade out over 220ms and in over 120ms; reduced motion uses opacity only. Hidden controls do not intercept clicks or remain an inaccessible focus destination; keyboard input reveals chrome before interacting. Keep existing shortcuts and do not capture editing/select navigation. Escape closes the top tool first, then exits fullscreen.

Video Back uses the current close-to-details/session behavior, with truthful resume/history preservation. Desktop audio presentation navigation and phone Collapse remain presentation-only; the popup exposes no Back/Collapse action. Fullscreen requests the host section and tracks actual fullscreen events; WebKit video fullscreen is a fallback when host fullscreen is unsupported. Document native iOS control substitution as a platform exception. PiP remains native video PiP. CanCast currently exists as a catalog capability; no functional host casting path was found in this review, so Cast remains absent unless WP0 proves one already exists.

The seek rail shows a pointer-time tooltip and a keyboard value, real chapter ticks, and shaded verified intro/recap/credits ranges. Unknown duration disables misleading seek/remaining information. Chromium caption lift uses the measured bottom chrome height; verify support in the browser. Firefox caption overlap and native fullscreen restrictions remain documented fallbacks if confirmed, not claimed as tested today.

The TV end card appears at a valid Credits start, or within the last 20 seconds when there is no valid Credits segment, only with an owned playable next episode. It shows that episode's still/title and a ten-second countdown with icon actions for Play now and Dismiss. Follow R13's content hierarchy within a 320px desktop target, clamped to available width, positioned at the lower right at least 16px from usable edges and above the measured seek/tools region. It must not sit on top of the rail or its controls. Countdown advances only during actual playback, suspends while paused/stalled or the document is hidden, and cancels on seek out of the trigger region, asset/profile changes, or loss of next-item eligibility. Dismiss suppresses the card for that playback instance and does not disable normal next-at-ended behavior. Countdown and natural ended share one guarded transition so the next episode starts exactly once.

Implementation baseline evidence

The planning review used Git HEAD 86abe012. Implementation began at b216c267 after intervening integration was committed, with no existing application edits replaced. Preserve any unrelated work throughout implementation. The following anchors were verified during planning and must be rechecked as files change:

File under src/MediaEngine.Web unless specified Observed integration point
Shared/MainLayout.razor:162, :186, :449 Persistent audio/video hosts and playback sidebar lease
Shared/MainLayout.razor.css:119 Dock padding and desktop rail offset
Services/Playback/PlaybackSessionController.cs:2366 Video manifest branch omits normalized chapters
Services/Playback/PlaybackModels.cs:338 Snapshot input for the shared full player
Components/Pages/WatchPlayerPage.razor:96 Transient TV detail fetch and owned Next Up enrichment
Components/Watch/VideoPlaybackHost.razor:307, :923 Chapter consumer and fullscreen targeting the video element
Components/Listen/ListenNowPlayingBar.razor:292 Expanded composition mixes device branches with persistent transport code
Components/Listen/ListenContextSidebar.razor:9 Controller injection, queue commands, and basic unsynchronized lyrics
Components/Pages/ListenPlayerPopupPage.razor:379 Lyric version, preferred version, refresh, and timed line UI
Services/Playback/ListenContextSidebarState.cs Profile-aware panel and resize persistence
Services/Playback/ContextSidebarPreferences.cs Shared sidebar settings copy/save and profile generation checks
Services/Playback/AudiobookBookmarkCommandBridge.cs:8 Existing direct/broadcast command channels
Services/Playback/AudiobookBookmarkPlaybackOwner.cs:9 Existing authoritative command owner
Components/Shared/PlaybackIconButton.razor:15 Value, badge, and label rendering that must change
Components/Shared/AppSelect.razor:61 Existing custom select trigger support
wwwroot/app.js:2977 Shared fullscreen helper
Repository config/ui/playback-client.json Baseline popup width 1040, height 780; WP5 changes the default to 420 by 780
Repository src/MediaEngine.Contracts/Details/DetailDtos.cs:348 Typed sequence/season/item contract with ownership and progress

Anchors locate symbols and must be rechecked at execution time. They are not frozen offsets. New code uses existing namespaces and project layering. No storage model is consumed directly by UI.

Execution and work packages

Starting model and agent roster

Proposed implementation starting model: GPT-6.1 Sol, reasoning high, as the main orchestrator. This is the implementation roster, not a statement that this planning chat has changed model or launched agents. The assignments below replace the earlier single-implementer execution outline. Use subagents of the implementation chat, not separately created user-owned sidebar chats.

Role and agent name Model Reasoning effort Permitted access Responsibility
Orchestrator, main chat GPT-6.1 Sol (gpt-6.1-sol) High Workspace write Own the approved product contracts, WP order, shared boundaries, delegation, integration, documentation, and acceptance decisions. Review each worker diff and resolve findings within the agreed scope.
Explorer, player_explorer GPT-6 Luna (gpt-6-luna) Medium Read only WP0 anchor/test/consumer mapping; later focused deletion and integration checks. Return concise file/symbol evidence. Do not edit or broaden scope.
Foundation worker, player_foundation_worker GPT-6.1 Sol (gpt-6.1-sol) High Workspace write WP1 shared commands, popup/session guards, popovers, icons/tooltips, chrome foundation, fullscreen helper, and chapter propagation. Own shared primitives before surface implementation.
Video worker, player_video_worker GPT-6.1 Sol (gpt-6.1-sol) High Workspace write WP2 video composition, owned episode context, chapters, captions/audio tools, seek presentation, idle holds, and guarded end card.
Audio worker, player_audio_worker GPT-6.1 Sol (gpt-6.1-sol) High Workspace write WP3 dock and panels, WP4 desktop scene/shared lyrics, and WP5 phone/popup reuse. Preserve desktop/tablet Close, phone presentation-only Collapse, and native-only popup closure. Dispatch one package at a time.
Verifier, player_verifier GPT-6 Luna (gpt-6-luna) High Workspace write for test/build outputs; no application edits Run scoped tests and the final restore/build/test gate, distinguish baseline failures, and report reproducible failures with first useful error context. Workers fix code; verifier confirms fixes.
UI reviewer, player_ui_reviewer GPT-6.1 Sol (gpt-6.1-sol) High Browser interaction and evidence writes; no application edits Compare running states against R01 through R17 and unpictured acceptance cases at the specified viewports. Check focus/actions/artwork/continuity; record results and deliberate differences.
Final integrated reviewer, player_final_reviewer GPT-6 Astra (gpt-6-astra) High Read only One integrated review after WP6 against product contracts, the complete player diff, tests, and visual evidence. Prioritize ownership, command freshness, playback continuity, closing semantics, and feature loss.

These are deliberate task assignments, not claims about comparative benchmarks or pricing. Explicit model/effort settings matter because unspecified subagents inherit their parent's settings. The supported configuration mechanisms are described in official OpenAI subagent documentation. Model IDs and efforts above are available in this session's advertised capabilities; recheck them when implementation starts. Do not silently substitute models or assume this document automatically selects the main chat's model. If a listed configuration is unavailable, record the gap before dispatching that role.

The access column states each role's authorized behavior. Where the runtime supports it, configure read-only roles with a read-only sandbox; otherwise enforce that role through its instructions and tools. Do not claim independent sandbox isolation from a role label alone. All work remains within the existing workspace permissions. This update adds the roster to the plan only; it does not create agent configuration files or change global settings.

Dispatch and reasoning rules

  • Keep at most three active agents including the orchestrator. The normal cycle is orchestrator plus one worker, then verifier, then UI reviewer. Do not use Ultra reasoning.
  • All implementation work packages remain sequential. Only one worker may write application code at a time; Foundation, Video, and Audio must not edit shared controls concurrently. Read-only exploration may overlap genuinely independent baseline/review work.
  • The orchestrator supplies the assigned WP, relevant behavior contracts, exact reference IDs, known file anchors, permitted files, and acceptance checks. Workers can inspect necessary dependencies and escalate product contradictions; they cannot redefine agreed behavior or spawn additional agents.
  • At each package boundary: worker completes its slice, verifier runs relevant checks, UI reviewer checks affected rendered states, and orchestrator reviews the diff/evidence before advancing. Finish builds/process restarts before browser review so verification does not invalidate an active UI capture.
  • WP0 belongs to the orchestrator with Explorer and UI reviewer support. WP1 belongs to Foundation, WP2 to Video, WP3/WP4/WP5 to Audio. WP6 documentation and integration belong to the orchestrator, with Verifier/UI reviewer evidence and the one final Astra review.
  • Astra returns findings to the orchestrator; the owning worker makes any fixes. Rerun affected checks and review those fixes. Do not perform repeated full Astra reviews without new material findings.
  • Reuse an agent when continuing its defined role, or start a bounded fresh subagent when stale context would obscure the package. Neither option creates a new user-owned chat. Reports include actual assigned model/effort and any execution deviation, not merely this planned roster.

Order: WP0 then WP1 then WP2 then WP3 then WP4 then WP5 then WP6. Each package must retain working playback. Review and verify each package before the next. Existing uncommitted work is preserved; do not reset or switch to a pristine main checkout. If a dedicated branch is used, follow the repository's codex/ prefix and isolate the player diff from unrelated work. This plan does not request a commit, push, or merge.

WP0 Establish baseline

Read current instructions and playback architecture; record changed-file ownership and relevant diff. Before development/runtime checks, identify and stop only verified running MediaEngine.Api and MediaEngine.Web processes. Resolve the local .NET 10 SDK and Tuvima.Wikidata feed without changing package references.

Capture current runtime at desktop, tablet, and phone sizes, using accessible media fixtures: music, multi-track audiobook, TV with owned next episode, chaptered movie, and video without context. Include popup and Ingestion sidebar. Record existing warnings/test failures separately from player findings. Inventory consumers and tests for sidebar width/leasing, popup structure, visible sleep text, video sheets, fullscreen, range sliders, artwork, and command handling.

Resolve the R01 through R17 source files before visual implementation; keep their original files outside Git. Build the reference/state checklist above, record baseline captures against it, and identify fixtures for each state. Reuse the supplied media when actually owned and accessible, or comparable real fixtures. R04/R05 additionally verify the persistent dock against phone/tablet shell and browse-content scrolling. A missing reference file does not erase its acceptance criteria; use the attachment in this conversation or report the specific unavailable comparison.

Acceptance: baseline evidence and fixture availability are recorded; unrelated edits are identified. Missing media/platform access is documented explicitly. No application changes in this package.

WP1 Establish shared contracts and primitives

Add command sink interfaces/adapters and capability tests using the existing owner/channel contracts. Define snapshot-driven panel/full-player inputs and presentation callbacks. Add PlaybackPopover, transient-tool coordination, the shared tooltip behavior, and the video chrome module. Update shared icon, control catalog, glyph, Speed/Sleep, and select-trigger integration together. Register scoped services in Program.cs as needed.

Use R05 for a labeled utility overflow body, R14 for selected option outline/check, R17 for glyph scale/alignment, and the desktop/mobile reference set for shared underline/segmented tabs. These also inform shared active/current-row styling in WP3/WP4. Keep dock Close separate from full-player transport commands and define the phone-only Collapse presentation callback; the popup has neither. Do not change playback repeat, skip, chapter naming, or capabilities to match sample pixels.

Repair video chapter propagation and prepare the fullscreen helper without breaking its other consumers. Preserve bookmark and sleep protocols. Keep existing hosts rendering while primitives are introduced.

Acceptance: direct/broadcast representative commands behave equivalently; stale commands are rejected; icon names/toggle state and select behavior are accessible; popover focus/close/viewport contracts pass component and browser checks. No media element is moved.

WP2 Implement video experience

Update VideoPlaybackHost, its CSS, video control presets, PlaybackRangeSlider, and video presentation metadata integration. Add VideoContextPanel and the episode end card. Replace desktop drawers with anchored tools; retain mobile sheet behavior. Apply chrome idle/hold behavior, control placement, volume expansion, container fullscreen, real ticks/segments, and caption accommodation.

Review R17 for the visible baseline, R16 for Episodes, R15 for Chapters, R14 for Captions, and R13 for the end card. Use R14's rows for the unpictured Audio panel where applicable, driven by real track data. Capture hidden chrome separately; a controls-visible reference cannot verify the idle behavior.

Acceptance: verify every context priority, owned episode selection, automatic episode transitions, same-item reopen, idle reveal/hold behavior, custom fullscreen, and no double-start at countdown/ended. Include browser event cleanup and reduced motion. No text-track/audio selection regression.

WP3 Implement flush audio dock

Update MainLayout dock styling and remove only playback's context-sidebar lease. Preserve Ingestion coordinator, renderer, resize, and selection behavior. Update ListenNowPlayingBar dock geometry, seek/time layout, Favorite/More, and anchored tool triggers. Remove playback width consumption from ListenContextSidebarState while preserving the shared settings contract and profile race checks.

Review R12/R11 for resting music/Queue, R06 as the compact audiobook panel target with R07 as secondary, R05 for tablet utility overflow, and R04 for the phone mini dock. Add the required trailing Close player action to desktop/tablet docks despite its absence in these references; verify its 44px target, keyboard focus, and stop semantics. Phone dock/player has no Close action. Verify no page reflow using paired closed/open captures.

Acceptance: dock is full width at all target sizes; panels do not reflow content; queued removal/clear are correct; controls remain centered/aligned; Ingestion remains operational. Existing sidebar defaults must not cause an unexpected popup to open at startup.

WP4 Implement shared panels and desktop Now Playing

Convert ListenContextSidebar and its bodies to snapshot/sink inputs, keeping a wrapper where useful. Implement Queue/History tabs, chapter/history presentation, and shared timed/static lyrics with version tools and auto-follow. Replace the expanded scene's sidebar width dependency with the internal artwork/identity/panel composition. Add text-only overall audiobook progress and canonical source links where available.

Acceptance: R08/R10's left artwork/identity stack and right inline panel hold inside the existing shell, while R09 supplies portrait audiobook hierarchy and chapter state. R08's version, preferred-version, refresh, and current-line return controls remain functional; dock actions select inline tabs; lyric timestamps remain intact and stale requests cannot overwrite current state; access and profile changes clear old content. The dock supplies desktop Close without another scene-level Close button. No duplicate menu scroll owners or nested tab sets.

WP5 Unify phone and popup

Extract the full phone composition into PlaybackFullPlayer using snapshot input, sink commands, and local presentation callbacks. Render it in the main window's phone view and ListenPlayerPopupPage, with direct and broadcast adapters respectively. Reuse the shared panel/lyrics bodies. Keep bookmark dialogs on their existing bridge. Set configured and fallback popup width to 420, height to 780, while clamping to available screen space. Remove popup chrome and frame styling only after feature parity passes.

Use R03/R01 for the music/audiobook full-player hierarchy, R02 for Queue sheet interaction, and R04 for mini/full continuity. Restore the illustrated top-left Collapse chevron on the phone, using a presentation-only callback to reveal the library/compact dock. Omit that chevron and callback in the popup. Neither host offers an in-player session-stop Close action. Fill the phone screen and popup content bounds with shared UI; do not add another popup presentation or exit row. The popup relies on native window closure alone, with passive lifecycle cleanup that does not stop main playback. Shared media/tool markup stays equivalent apart from the phone Collapse control and popup sheet edge styling. At 390px and 320px, and at the shorter 420 by 780 popup, shrink cover/spacing as needed and verify transport/utilities stay reachable.

Handle a popup left open when the main session changes to video with a truthful return-to-main state; never render a broken audio player or start video there. Fullscreen/PiP media ownership is unchanged. Delete orphan code/styles only after code, script, test, and documentation consumer checks.

Acceptance: phone/popup fill their content bounds with the same media player at equal viewport dimensions, with the phone-only Collapse control. Phone collapse reveals the library and mini dock; re-expansion returns to the same live session without a source reload, pause, or reset. Neither phone surface exposes session-stop Close. The popup has no player Close, Stop, Collapse, Back-to-dock, or window-close functionality in buttons, menus, callbacks, or shortcuts, and native popup closure keeps main audio playing. Tools fill the popup width with square edges; commands execute once. Tool dismissal affects only tools, and Pause remains ordinary transport behavior. Test browser popup refusal, owner loss, profile change, bookmark outcomes, speed changes, and sleep persistence through phone collapse/re-expand.

WP6 Verify and document

Update docs/architecture/playback.md, docs/architecture/dashboard-ui.md, applicable playback paragraphs in AGENTS.md and CLAUDE.md, and the files mapped by .agent/SYNC-MAP.md. These updates document implemented behavior only; leave the broader Opus/Codex policy unchanged. Preserve historical report evidence and add a supersession reference for retired sidebar/visible sleep behavior rather than rewriting old results.

Create docs/reports/player-update-2026-10-03.md with package outcomes, browser/platform limitations, baseline differences, acceptance results, and external evidence locations. Perform integrated diff review for duplicate state owners, unsafe stale actions, unintended unrelated edits, and feature losses. Fix findings and rerun affected checks before reporting completion.

Record an outcome for each R01 through R17 and each unpictured runtime state listed under screenshot verification. Include the exact reference filename, viewport/DPR, paired evidence where required, and every intentional difference. Explicitly record desktop/tablet dock Close, phone Collapse versus session-stop semantics, R01/R03's restored phone chevron and its omission from the popup, full-window/screen composition, and native-only popup window closure. Record phone full-to-mini-to-full continuity using paired R03/R04-equivalent captures, including audiobook sleep preservation. The primary audio layout and newly supplied video targets must be reflected in documentation; do not retain the old claim that no video reference exists.

Acceptance: automated checks and available rendered/runtime checks pass. Any missing platform/media verification is explicitly pending, so completion is not described as universal validation.

Execution prompt for each package: “Execute WP[N] from docs/plans/player-update-reviewed-plan-2026-10-03.md. Use its agent roster and model/effort assignments; dispatch the designated package worker, followed by verification and applicable UI review. Read the product walkthrough and behavior contracts first, preserve the recorded baseline and unrelated changes, implement only this package, and report acceptance evidence, actual agent assignments, and unresolved gaps.” Screenshots are already identified above; reuse the supplied files when accessible. WP0 and WP6 use the orchestrator-led assignments specified in the dispatch rules.

Verification and release acceptance

Run targeted affected tests after each implementation package. After integration, run dotnet restore MediaEngine.slnx, dotnet build MediaEngine.slnx --no-restore, and dotnet test MediaEngine.slnx --no-build. Require zero errors, no new warnings, and no new failures; record baseline issues with their evidence. Do not rerun full restore and the complete suite after every CSS edit. The original planning review ran no build; implementation checks are recorded in the verification report.

Update obsolete structure assertions in VideoPlaybackSurfaceTests, ListenPlayerPopupSurfaceTests, ListenContextSidebarTests, ListenContextSidebarStateTests, PlaybackPrimitiveTests, and UnifiedDetailComponentTests. Preserve behavioral protections in popup command, controller, bookmark, sleep, range, and contract round-trip tests. Add meaningful component/command tests for ownership, freshness, chapter propagation, queue removal, timed lyrics, and shared composition. Real browser checks must prove hover timers, positioning, focus, scrolling, fullscreen, PiP, and media continuity; bUnit cannot prove those behaviors.

Review rendered layouts at 1920 by 1080, 1672 by 941, 1366 by 768, 1280 by 720, 840 by 900, 720 by 900, 390 by 844, and 320 by 720. Also check boundary widths at 900/840/720/600, popup 420 by 780, browser zoom at 200 percent, keyboard-only use, touch behavior, reduced motion, and high-density artwork delivery. Verify list-row actions stay in their intended columns and bottom controls do not clip. Run Chromium and Firefox checks where available, and mark WebKit/iOS checks pending until tested on a suitable browser/device.

Add tablet portrait checks at 834 by 1112 for R05 and tall phone checks at 390 by 844 and 390 by 780 for R01 through R04. Reference raster dimensions are retained in the manifest, but runtime results always record CSS viewport and DPR independently. Test dock Close on desktop/tablet in music and audiobook modes. At 390px and 320px phone layouts, verify a top-left Collapse chevron with a 44px target and the accessible name Collapse player, browsing/mini-dock restoration, and re-expansion without playback interruption, including an armed audiobook sleep timer. Confirm no session-stop Close action exists on phone. In the 420 by 780 popup, verify the absence of player Close/Stop/Collapse/Back-to-dock actions and callbacks, including More menus and keyboard shortcuts, and verify its UI fills available bounds without an empty exit slot. Close the popup using native window chrome and confirm main audio continues. Tool dismissal affects only the tool, not its player.

The release checklist is:

  • Audio dock fills the viewport, retains readable timing, and keeps centered transport across desktop/tablet/mobile.
  • Desktop/tablet music and audiobook docks expose a terminal Close player action outside overflow. It stops the session while retaining resume/history/bookmarks. Phone full player instead offers Collapse player, which reveals the library/mini dock and preserves playback; neither phone surface exposes a session-stop Close action. Tool-sheet dismissal affects only its tool.
  • Temporary panels stay anchored, share one open-tool policy, preserve page scroll/width, and switch to accessible sheets on phones.
  • Inline Now Playing panels match the references' hierarchy and use one selected tab; audiobooks retain all existing playback tools.
  • Queue clear/remove preserve the current item, target the intended upcoming item, and remain keyboard/touch accessible.
  • Timed/static lyrics, version preference, refresh, manual scroll, and current-line return work across main/phone/popup.
  • Popup and phone use the same full-screen/window component with a phone-only Collapse callback. The popup exposes no player Close/Stop/Collapse/Back-to-dock/window-close functionality, including hidden actions or handlers. Owner loss/stale commands fail recoverably, and native popup window closure never stops main audio.
  • Video idle holds, tool placement, owned episode context, real chapters, seek shading, and guarded end-card transitions work.
  • Fullscreen and PiP preserve playback and expose only real supported capabilities; documented native fallbacks are truthful.
  • Icon utilities have current-state names/tooltips, correct toggle semantics, visible focus, and adequate targets.
  • Presentation changes preserve asset/request generation, position, playback rate, volume/mute, queue, bookmark leases, and absolute sleep deadline. No extra source load or duplicate heartbeat/start is introduced.
  • Ingestion sidebar, existing shortcuts, access checks, image rendition contracts, and profile isolation pass regression checks.
  • Final docs describe actual implemented behavior; reports distinguish passed, failed, and unavailable checks.
  • R01 through R17 each have a recorded visual result with runtime evidence or an explicit pending reason. Required Close controls and other deliberate differences are documented; generated mockups are not counted as passing product screenshots.

Plain English completion summary

The review is complete and the plan maps all seventeen additional screenshots to implementation and visual verification. Implementation, integrated review and available verification are complete. Popover focus and owned-episode startup repairs pass their automated gates and actual browser checks. The report separates observed results from unsupported platform/media states. Exact evidence and unsupported platform checks are recorded in the verification report. Desktop/tablet audio docks include an explicit Close player action that stops the session. The phone full player restores the top-left Collapse chevron so users can browse with audio continuing in the mini dock, then expand again without losing playback state. A future native app may use swipe-down for that same presentation behavior. The popup fills its window without in-player closing or collapse functionality and relies only on native window closure, which leaves main playback running. Sol at high reasoning coordinates the work and implements the defined slices, Luna handles focused discovery and automated checks, Sol reviews the running UI, and Astra performs one final integrated review. The completed runtime comparisons and remaining platform checks are recorded in the verification report.