Repository navigation
feat: podcasts - Add media-backed audio playback controls #363
Description
Outcome
Replace simulated detail-player state with genuine episode audio controls.
Verified context
PodcastDetailPage.tsx hardcodes progress/time and does not consume the available audio reference.
Scope
Use mapped audio from #43’s approved launch selection; keep show notes, verified transcripts and optional guests distinct. Launch requires at least one genuine approved playable podcast with a clear purpose and equivalent, recording-checked text alternative. Launch acceptance waits for approved source/audio/text revisions, rights/credits and runnable prerequisites. Validate actual playback, controls, episode transitions and accessible text access against recorded build/source revisions; missing prerequisites remain blocked, not passed. Do not select hosting, privacy, feed or offline policy.
Acceptance criteria
- Play/pause, elapsed time, duration and seeking follow media events.
- Missing source, load failure and rejected playback have accessible truthful states.
- Keyboard controls work and episode changes stop/reset obsolete playback.
- Controlled media-event tests cover success/failure without relying on a live provider; these do not prove real-source playback or launch readiness.
Boundaries and sources
Creation defines work only; it does not start implementation. Preserve unrelated code, protected assets, editorial wording and existing records. Do not fabricate content, identity, media, manuscript chapters, dates or engagement data. Use approved repository-native authoring, validation, preview and publication decisions; do not provision an external CMS or database. Existing editorial verification remains with its current issues. All acceptance criteria remain unchecked until evidenced.
Repository evidence was inspected on develop at 4ecdb26d9655a48bf000a7c89da2f70383edce87. Recheck before implementation; no build or browser tests were run for this draft. Follow repository instructions and applicable Spec Kit requirements. Paths below refer to this repository.
Sources: repository instructions, application, editorial content.
Branch instructions
- Repository: lightspeedwp/ThisOneTimeOnAcidCom
- Proposed branch:
feat/podcasts-audio-controls - Base:
develop - Naming policy: local guide, validator, organisation strategy.
- Pull request template: Organisation .github/PULL_REQUEST_TEMPLATE/pr_feature.md, per inspected local routing; recheck before opening a PR.
- Constraints: Preserve unrelated changes; do not force-push, merge or deploy. Complete applicable Spec Kit requirements before implementation.
- Conflicts or missing evidence: Proposed branch, not an existing branch; collision freedom is unverified. Recheck current branch routing and open governance changes, including PR automation: repo-governance - Add governance automation and validation #346. Older instructions claim branch rules are absent; the inspected local guide and executable validator establish the current convention. This draft creates no branch or pull request.
Branch instructions — batch 22 audit addendum
- Repository:
lightspeedwp/ThisOneTimeOnAcidCom; implementation target: this playback issue and verified counterpart, GitHub issue 363. - Proposed branch:
feat/podcasts-audio-controls; base: refresheddevelop, checked at4ecdb26d9655a48bf000a7c89da2f70383edce87(D). Organisation baseline:8f28eca80bff198879f7aaf496717dc0551bb32e(O). - Branch state: proposed new branch, not created/reused. Absent from current remote inventory; no matching playback/exact-head PR or Linear PR association found. Refresh before implementation; verify ownership/scope before reusing discovered work.
- Naming: local guide and validator authorise feat and type/scope-title. Static inspection only; validator not executed. Older no-conventions claims conflict with current evidence.
- PR template: shared Feature template, matching local routing and organisation configuration. Suggestions/frontmatter do not prove inherited body loading or applied metadata. Verify selection separately; no local template copies, locked-template edits or automatic labels.
- Parent context: preserve hierarchy; omit coordination-parent identifiers/links from branches, PR metadata and coding prompts. Never use a parent epic as a native development/closing target.
- Allowed closing targets: none currently. Partial work cannot close the issue; future references/native associations require separate review. No linking syntax or template closing examples authorised here.
- Governance PR346 remains context, not delivered baseline, implementation approval or reuse branch. No repository edits, branch/PR operations, execution, merge or deployment authorised.
Expected file changes
Conditional implementation plan, not delivered code. Existing paths inspected at D; new test destination proposed.
| Operation | Path | Intended change | Evidence/revision | Approval or dependency |
|---|---|---|---|---|
| Edit | src/app/components/pages/podcasts/PodcastDetailPage.tsx |
Replace simulated player with media-backed play/pause, elapsed time, duration and seeking; truthful unavailable/error/rejected-play states; keyboard operation; stop/reset obsolete playback and ignore stale callbacks | D: boolean toggle, fixed progress/time, no audio element or audioUrl consumption | Delivered approved source contract; serialise routing’s overlapping edits |
| Edit | src/app/data/mock/ui/podcasts.ts |
Playback labels, accessible status and error copy in UK English/sentence case | D: existing detail labels lack playback/error states | Copy/recovery-behaviour approval; preserve routing changes |
| Edit, conditional | src/styles/blocks/podcasts-page.css |
Narrow player BEM styling for controls, seeking, disabled/error states and visible focus across themes | D: placeholder audio-player block | Approved accessible controls; preserve archive/editorial styling |
| Create, proposed | e2e/podcast-playback.spec.ts |
Controlled media API/events for playback, time, seeking, errors, missing source, keyboard and episode-change/unmount cleanup; no live provider | D: existing routing suite and Playwright e2e discovery; new destination | Reachable detail routes and approved deterministic test-only inputs; no production fixture content |
No moves/deletions. Adapter/routing remain Todo; applied plans are not delivered dependencies. Do not recreate loading, taxonomy, routes, breadcrumbs or schema work. Refresh shared detail/UI files after those contributions.
Inspected mock/source episodes use example.com audio. Do not present placeholders as playable or invent replacement media/metadata. Playback timing follows media events, not editorial duration strings. Tests are not editorial evidence. Preserve show notes, verified-transcript distinctions and optional guests.
Complete specification-first approval; no podcast specification verified in inspected catalogue/directories. Resolve constitution authority ambiguity explicitly without incidental governance repair.
Reuse existing Playwright infrastructure. Current Jest targets JavaScript script/tests paths, not TSX component tests; no new DOM framework, dependencies or configuration assumed. Additional fixture seams, paths or materially different scope require revised preview and approval.
Preserve bundler safeguards, protected images/references, fallback component, attribution/changelog, guidelines, Supabase, workflows and deployment configuration. Resolve changelog handling separately. No commands, installs, scripts, hooks, tests, builds or cloud operations performed. Exclude credentials/restricted content from public sync. Description approval changes no status, ownership, labels, hierarchy or PR associations and grants no implementation authority.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Activity
linear-code commentedon Oct 18, 2026
TOA-311