Upload an English lesson, confirm its narration settings, and follow generation through delivery. Usage is sent during processing.
English lessons need the correct narration language. Instructors can resolve language and timing choices before generation continues. Usage is recorded across failed and successful executions. The runner now sends each usage event in the background and retries from a local journal.
Choose the English script and slide deck.
Confirm language and resolve timing conflicts when requested.
Create speech and render while usage is reported.
Inspect the delivered video and reporting outcome.
Silent recording of the initial beta attempt. Waiting between generation stages is shortened. The successful fresh retest on 17 October is documented in the check table below.

| Check | Result | Evidence and scope |
|---|---|---|
| Runner tests and type check | Passed | 132 runner tests passed. TypeScript type check passed. |
| Backend lecture-video tests | Passed | 113 non-database tests and 25 database tests passed. The database tests used an isolated PostgreSQL 17 instance. |
| Upload and automatic language detection | Passed | Fresh job 2DvU-mF9MqEOz8UbuuRz8 accepted the English XLSX and PPTX. AI detected English and selected US English. |
| Instructor override | Passed | UK English was selectable. US English was restored and confirmed before speech generation. |
| Speech, render and delivery | Passed | Cloud execution lecture-video-runner-lspd4 completed with exit 0. The fresh video was delivered without a retry. |
| Usage acknowledgments | Passed | Runner exit reported pending=0, rejected=0 and outcomePending=false. |
| Bunny encoding | Passed | Fresh video 1fa208db-9f97-40c3-bf85-a69387a91dba reached status 4 and 100%. Duration 123 seconds; 480p, 720p and 1080p available. No transcoding messages. |
| English captions | Passed | Bunny lists English captions. The generated English VTT file exists. |
| Encoded video integrity | Passed | The fresh 480p MP4 downloaded successfully and fully decoded with FFmpeg, exit 0. |
| Signed embedded player request | Passed | The player returned HTTP 200 with the normal beta page Referer. |
| Chrome playback | Passed, manually verified | The instructor opened the newest 17 October video in Chrome and confirmed: It plays successfully. Browser automation could not render the embedded player. |
| Timing conflicts and delivery retry | Automated coverage | These inputs did not trigger a timing conflict or a delivery failure. Related branches are covered by automated tests; the fresh live run did not exercise them. |
Each provider call creates a stable event ID. The backend accepts identical repeats without adding cost again. A final pending count of zero means the runner received acknowledgments for its queued events. It does not independently prove that provider invoices match the database ledger.
| Decision | Choice |
|---|---|
| Usage delivery | Send each event directly in the background, one request at a time. |
| Recovery | Keep a local retry journal. No R2 usage backup. |
| Protection | Stable event IDs, execution authentication, 600 reporting requests per execution per minute and bounded storage. |
The existing fixes are deployed to beta. This verification required no new application code, PR or deployment. Production release remains separate.