# Lecture video debt frontend evidence

Captured 2026-10-09, Asia/Saigon. Actual full LMS frontend app from the current uncommitted worktree on feature/SP-679-narration-language, base commit e06935ab.

Scope: **local mocked API and local demo authentication**. This is the real application route, header, sidebar and breadcrumbs, not an isolated component harness. It does not prove backend generation, paid AI/TTS, delivery, or live Bunny captions. No paid APIs or shared database were used.

Browser: headless Remotion Chromium, desktop 1440x1250 and mobile 360x1200, scale 1, light mode. Local demo instructor Alice Demo, alice@example.test. API at 8138 and Vite at 5187. Browser mock requests are fulfilled through CDP from a disposable local HTTP mock server.

## Screenshots

Each shot has PNG source, WebP quality 82 and JPG quality 85. No cropping or retouching. All eight PNGs were visually inspected. Mobile images scroll to the feature while keeping the application header visible.

| File stem | Shows | Pixels | PNG / WebP / JPG |
| --- | --- | --- | --- |
| 01-desktop-timing-review | Full LMS timing review, 120-second lesson target, 150-second specified subtotal, row 7 missing. No automatic decision. | 1440x1250 | 136,389 bytes / 88,966 bytes / 182,263 bytes |
| 02-desktop-timing-approved | Explicit actual-narration approval resumes the same mocked job to Waiting. | 1440x1250 | 100,825 bytes / 61,120 bytes / 138,111 bytes |
| 03-desktop-failed-retry | Failed render offers retry for retained inputs; attempt 1 of 3, original failure remains visible. | 1440x1250 | 112,821 bytes / 70,972 bytes / 153,569 bytes |
| 04-desktop-retry-queued | Same-job retry is queued without creating upload slots. | 1440x1250 | 100,476 bytes / 61,030 bytes / 137,894 bytes |
| 05-desktop-caption-states | Delivered videos show attached, pending and failed captions separately. Watch remains available. | 1440x1250 | 155,498 bytes / 92,924 bytes / 185,266 bytes |
| 06-mobile-timing-review | 360px timing review keeps both explicit choices readable. | 360x1200 | 76,087 bytes / 49,454 bytes / 85,776 bytes |
| 07-mobile-failed-retry | 360px retry state shows a readable failure message and attempt count without horizontal page scroll. | 360x1200 | 68,009 bytes / 40,540 bytes / 74,733 bytes |
| 08-mobile-caption-states | 360px delivered caption states and Watch controls, with readable wrapped copy. | 360x1200 | 78,757 bytes / 42,530 bytes / 73,383 bytes |

## Verified interactions

- Page width equals viewport width on all eight shots, at both 360 and 1440px. No horizontal page scroll.
- No timing decision request occurs when the conflict loads.
- Clicking actual narration timing sends exactly one same-job POST with decision actual_narration. The refreshed job is Waiting.
- Retry sends exactly one same-job retry POST, with no upload/draft/confirm requests. The refreshed job is Waiting.
- Caption failure leaves the video delivered and Watch available. Pending captions remain separately visible.
- See verification.json for request records, visible UI text and viewport checks. These are mock interactions, not production server results.

## Seed facts

A local demo course Business English: Email Phrases. Source row 2 requests 120 seconds; rows 5 and 6 request 90 and 60 seconds, subtotal 150 seconds. Row 7 has no duration and is not treated as zero. Retry fixture has attempt 1 of 3 and RENDER_ERROR. Three delivered fixtures have ATTACHED, PENDING and FAILED captions.

## Issues found and corrected

Initial visual inspection found that the delivered-note text inherited table no-wrap and overlapped caption status. Mobile failure text required horizontal table scrolling to read. Lecture-video rows now wrap delivered/status text, and mobile uses two fixed columns with the creation timestamp under the title. Final screenshots show the corrected layout.

The temporary HTTP mock had intermittent Windows/headless browser connection aborts. Final capture uses CDP fulfillment, backed by the same mock state machine. No backend/application failure is inferred from that temporary harness issue.

## Limits and cleanup

No walkthrough video was requested or recorded. No fresh real rendered video, real Bunny playback, caption synchronization, or backend delivery was tested in this capture. Tests and backend evidence are separate.

Output remains in this folder. Helper scripts remain outside Git under %TEMP%/SP-679-debt-ui. The temporary local mock API and Vite services are stopped after capture. No seeded shared database rows or Compose containers were created.

## Frontend validation

Final full frontend run passed 687 tests in 102 files. Production build passed, including TypeScript project checks. Touched-file ESLint, formatting, generated translation interface and git diff --check passed. Build emitted the existing Firebase mixed static/dynamic import warning. Tests and build logs are saved beside this manifest.
