[Content][Feature] Video captions: 8 media elements lack subtitle/description tracks (S4084, split from a11y epic #732) #777

Closed
opened 2026-07-21 19:52:26 +00:00 by spikerj · 2 comments
Owner

The last substantive a11y-tagged findings (Web:S4084 ×8): playground-videos-pane ×2, lesson-video-moderation, country-detail, blog-create, blog-entry, confirm-delete, asset-approval. Videos have no subtitle/description files.

This is CONTENT + FEATURE work, not code cleanup:

  1. Caption tracks need to be produced for platform-owned videos (lesson/playground/geography).
  2. User-uploaded videos (blog) need a caption-upload path (or auto-transcription — the swarm has GPU capacity; whisper-class model as an EventHandler worker would fit the existing pipeline architecture).
  3. The

Split from epic #732 (whose Sonar backlog is otherwise fully dispositioned) so the epic can close.

The last substantive a11y-tagged findings (Web:S4084 ×8): playground-videos-pane ×2, lesson-video-moderation, country-detail, blog-create, blog-entry, confirm-delete, asset-approval. Videos have no <track> subtitle/description files. This is CONTENT + FEATURE work, not code cleanup: 1. Caption tracks need to be produced for platform-owned videos (lesson/playground/geography). 2. User-uploaded videos (blog) need a caption-upload path (or auto-transcription — the swarm has GPU capacity; whisper-class model as an EventHandler worker would fit the existing pipeline architecture). 3. The <video> templates then get <track kind="captions"> wiring. Split from epic #732 (whose Sonar backlog is otherwise fully dispositioned) so the epic can close.
Author
Owner

Audited at file level against origin/master — NOT DONE. 0 of 8.

git grep -n "<track" origin/master across the entire spikersoft-angular repo returns zero hits — not just in templates, in any file type. All eight media elements from the ticket are still present and track-less:

  • libraries/platform/clang-runtime/src/lib/playground-videos-pane.component.html:14 and :52
  • projects/spikersoft/src/app/_components/admin/lesson-video-moderation/lesson-video-moderation.component.html:45
  • projects/spikersoft/src/app/_components/learning/geography-explorer/country-detail/country-detail.component.html:76
  • libraries/features/blog/src/lib/components/blog-create/blog-create.html:173
  • libraries/features/blog/src/lib/components/blog-entry/blog-entry-component.html:228
  • libraries/features/blog/src/lib/components/confirm-delete/confirm-delete.component.html:13
  • projects/spikersoft/src/app/_components/asset-approval/asset-approval.component.html:10

Exactly the ticket's list, unchanged.

Remaining: all three phases — caption production, the blog caption-upload / auto-transcription path, and the <track> wiring itself.

Two observations that might help scope this:

The eight aren't equivalent, and splitting them would unblock most of the value. Three (lesson-video-moderation, asset-approval, confirm-delete) are staff/admin-only preview surfaces — they show uploaded media to a moderator, not to learners. Those arguably need a <track kind="descriptions"> or an explicit exemption rationale rather than authored captions. The learner-facing ones — the two playground-videos-pane elements, country-detail, and the two blog surfaces — are where captions actually matter for the students this platform serves.

The blog pair needs the upload path first. blog-create and blog-entry render user-supplied media, so there's nothing to caption until authors can supply a caption file (or auto-transcription exists). That's the phase-2 dependency, and it means those two can't be closed by template edits alone.

So a reasonable first slice is the four platform-owned learner-facing elements, where the video content is ours and captions can simply be authored.

Audited at file level against `origin/master` — **NOT DONE. 0 of 8.** `git grep -n "<track" origin/master` across the **entire** spikersoft-angular repo returns **zero hits** — not just in templates, in any file type. All eight media elements from the ticket are still present and track-less: - `libraries/platform/clang-runtime/src/lib/playground-videos-pane.component.html:14` and `:52` - `projects/spikersoft/src/app/_components/admin/lesson-video-moderation/lesson-video-moderation.component.html:45` - `projects/spikersoft/src/app/_components/learning/geography-explorer/country-detail/country-detail.component.html:76` - `libraries/features/blog/src/lib/components/blog-create/blog-create.html:173` - `libraries/features/blog/src/lib/components/blog-entry/blog-entry-component.html:228` - `libraries/features/blog/src/lib/components/confirm-delete/confirm-delete.component.html:13` - `projects/spikersoft/src/app/_components/asset-approval/asset-approval.component.html:10` Exactly the ticket's list, unchanged. **Remaining:** all three phases — caption production, the blog caption-upload / auto-transcription path, and the `<track>` wiring itself. Two observations that might help scope this: **The eight aren't equivalent, and splitting them would unblock most of the value.** Three (`lesson-video-moderation`, `asset-approval`, `confirm-delete`) are **staff/admin-only preview surfaces** — they show uploaded media to a moderator, not to learners. Those arguably need a `<track kind="descriptions">` or an explicit exemption rationale rather than authored captions. The learner-facing ones — the two `playground-videos-pane` elements, `country-detail`, and the two blog surfaces — are where captions actually matter for the students this platform serves. **The blog pair needs the upload path first.** `blog-create` and `blog-entry` render user-supplied media, so there's nothing to caption until authors can supply a caption file (or auto-transcription exists). That's the phase-2 dependency, and it means those two can't be closed by template edits alone. So a reasonable first slice is the four platform-owned learner-facing elements, where the video content is ours and captions can simply be authored.
Author
Owner

Migrated as part of the umbrella-tracker breakup.

This ticket needed changes in more than one repo, so it became one issue per repo:

Verified 2026-08-07 against spikersoft-angular@8e5a4048 and spikersoft-backend@98102023. git grep '<track' over the whole Angular
repo returns zero hits — 0 of 8 done. The element list drifted slightly: asset-approval no longer exists
(directory removed) and a new captionless video appeared at blog-photo-details.component.html:126, so the count
is still 8. Live: no caption assets served by learn.spikersoft.com.

Split because the blog pair genuinely cannot be closed by template edits — user-uploaded video has no caption
source until the backend provides an upload or auto-transcription path. The platform-owned learner-facing videos
can proceed independently in Angular right now.

Status: not started, both halves.

Note on the parent: the body says this was split out of a11y epic #732 so that epic could close; #732 is not in the
active epic set, so no epic parent is recorded.

Closing here. Work now lives in the repos that hold the fixes, so fixes #N in a PR will auto-close them on merge. The umbrella tracker keeps cross-repo epics only.

— Opus 5 Agent

Migrated as part of the umbrella-tracker breakup. This ticket needed changes in more than one repo, so it became one issue per repo: - Angular: **spikerj/spikersoft-angular#683** - Backend: **spikerj/spikersoft-backend#571** Verified 2026-08-07 against `spikersoft-angular@8e5a4048` and `spikersoft-backend@98102023`. `git grep '<track'` over the whole Angular repo returns **zero hits** — 0 of 8 done. The element list drifted slightly: `asset-approval` no longer exists (directory removed) and a new captionless video appeared at `blog-photo-details.component.html:126`, so the count is still 8. Live: no caption assets served by `learn.spikersoft.com`. Split because the blog pair genuinely cannot be closed by template edits — user-uploaded video has no caption source until the backend provides an upload or auto-transcription path. The platform-owned learner-facing videos can proceed independently in Angular right now. Status: not started, both halves. Note on the parent: the body says this was split out of a11y epic #732 so that epic could close; #732 is not in the active epic set, so no epic parent is recorded. Closing here. Work now lives in the repos that hold the fixes, so `fixes #N` in a PR will auto-close them on merge. The umbrella tracker keeps cross-repo epics only. — Opus 5 Agent
Sign in to join this conversation.