# UI sweep coverage (plan ยง7.5) Gate: every line below executes for BOTH personas unless marked "admin-only". Status: โœ… swept+green ยท ๐Ÿ”ฒ pending (future sweep runs). | # | Page / control | admin | restricted | |---|---|---|---| | 1 | Login: bad password rejected; good login lands authed; logout | โœ… | โœ… | | 2 | Dashboard: sections render (Recently Added / Not Started) | โœ… | โœ… (hidden lib absent) | | 3 | Dashboard: hidden library visibility (Audiobooks) | โœ… visible | โœ… absent | | 4 | Search: results scoped (`/api/media-items/search`) | โœ… | โœ… no leaks | | 5 | Media list: no hidden items in payloads | โœ… | โœ… | | 6 | Library browse grid + pagination | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 7 | Library create / edit / delete (admin) | ๐Ÿ”ฒ | n/a | | 8 | Admin visibility toggle roundtrip (hide โ†’ restricted loses โ†’ unhide) | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 9 | Media detail: edit metadata / archive / delete | ๐Ÿ”ฒ | n/a | | 10 | Reader: open, page turn, TOC, bookmark, highlight, note, settings | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 11 | Collections: CRUD, add/remove items, smart-rule editor | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 12 | Series: list/detail | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 13 | Stats screens + range filters | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 14 | Admin: users CRUD, visibility matrix, settings toggles, processing issues | ๐Ÿ”ฒ | n/a | | 15 | Upload: EPUB generated at runtime, upload โ†’ appears โ†’ delete | ๐Ÿ”ฒ | n/a | | 16 | Auth edges: restricted โ†’ admin URL; anonymous โ†’ media URL | ๐Ÿ”ฒ | โœ… (detail/404) | | 17 | OPDS / KOReader | API-covered (invariant test) | API-covered | | 18 | Podcasts: page renders (empty state before any feed) | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 19 | Podcasts: add-feed modal โ†’ feed page (member flow) | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 20 | Podcasts: feed detail โ€” episode list lifecycle (download/queue/failed+retry states inline), Download All, gap banner | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 21 | Podcasts: cross-user invisibility โ€” own feed only (RLS ยง20 surfaces) | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 22 | Podcasts: order selector re-renders episode list; serial suggestion shown only for serial/audiobook feeds | ๐Ÿ”ฒ | ๐Ÿ”ฒ | | 23 | Podcasts: audio reader "Ep N/M" + prev/next episode; chain-advance to next episode | ๐Ÿ”ฒ | ๐Ÿ”ฒ | ### Podcast-specific sweep notes (plan task 1.10) - The download lifecycle needs a fetchable enclosure: sweep with a local feed server fixture (the integration tests use `swapFeedServer`; the Playwright run needs the same trick) โ€” otherwise episodes stay pending and rows 20's queue/failed states can't render. - Row 21 rides `TestPodcastRLSSurfaces` (API level) until the sweep lands; the page-level check is the 404 render for a foreign feed id. - Row 23 chains by page navigation โ€” assert the URL becomes the next episode's reader and progress carries over.