RELEASE · 2026-10-22T18:30:03.493Z · Vega Virtual Device, aarch64, OS 1.2 (TV Ship/102282480) · Release aarch64, SDK 0.24.12112 · clip: 20 s of Tears of Steel, 4 segments, packaged · app 64a5b72 · package 0.2.0 · capture grpc · keys inputd-cli · selftest 4/4 passing scenarios shown able to fail
VARIANT · 2026-10-22T18:32:50.127Z · Vega Virtual Device, aarch64, OS 1.2 (TV Ship/102282480) · Release aarch64 + INTERSTICE_E2E, SDK 0.24.12112 · e2e-fixture: first 60 s of Tears of Steel, host-served · app 64a5b72+dirty · package 0.2.0 · capture grpc · keys inputd-cli · selftest 8/8 passing scenarios shown able to fail · Release package restored: yes
The app's acceptance criteria
21 criteria: 4 automated · 4 fixture · 1 blocked · 9 out of scope · 2 manual · 2 hardware.
RELEASE results are the submitted binary. FIXTURE results ran a test build against a labelled stand-in track that is not the product's and never ships.
id
criterion
class
evidence
AC1
the app runs on the Vega simulator and plays the demo asset end to end
the live capture layer, if it ships, is off by default and names where the frame goes before the first send
out of scope
—
AC10
react-native-tv-audio-description is public, licensed, documented, and has a runnable example, with commits inside the submission window
out of scope
—
AC11
FRICTION-LOG.md holds dated entries written during the build, not reconstructed at the end
out of scope
—
AC12
the demo video is under 3 minutes, in English, and shows the app running on the target platform
out of scope
—
AC13
every Devpost field is submitted before 2026-10-23 12:00 PT, with the primary track and both mini challenges declared
out of scope
—
AC14
the author watches the demo asset end to end with the description track and rates every cue 1–5 against the picture; track mean and % failed are recorded and the worst cues are regenerated before the demo video is recorded
manual
—
AC15
the control surface is exercised under VoiceView: every control is reachable and announces its state, and the demo video shows it
hardware
—
AC16
the submission package cites at least one sourced figure on audio-description coverage; the figure and its source enter the registry before the prose
out of scope
—
AC17
three verbosity levels (concise/standard/detailed) are selectable from the remote, rescale max_words_per_cue per limits.ad.verbosity_scales, and are demonstrated in the demo
a dramatis personae pass precedes per-gap description and is fed into every C9 prompt alongside rolling context; cue coherence is checked during the AC14 watch
out of scope
—
AC20
at least one blind/low-vision viewer validates the track before Phase 5 (20–30 min, with/without comparison, consent on file); anonymized quote retained for SUBMISSION.md/video
manual
—
AC23
the app plays the full-length demo asset without exceeding memory on the worst device in the matrix: limits.mse_buffer holds, SourceBuffer.remove() runs behind the playhead, and no QuotaExceededError is raised across an end-to-end watch
hardware S18 on the Virtual Device supports it and cannot close it
—
AC24
a stall — bytes running short mid-playback — produces a stated visible and spoken state rather than a frozen picture, and a seek outside the buffered window either resolves or says why it cannot
Audible ducking. The trace shows the volume property set and restored. Whether a listener hears the film get quieter is checked on hardware.
VoiceView. It cannot be switched on in the Virtual Device. "What the viewer is told" below is what the app hands to the screen reader, not what the screen reader did with it.
The memory bound on a real Fire TV. Every run here is on the Virtual Device.
That every cue avoids dialogue. On the generated track, S07 checks the first cue against its window; all 55 described cues were rated by watching the whole film (the app set's AC14, mean 4.51 of 5). Fixture windows are declared, not derived from subtitles.
The submitted build
PASS
S01 · The viewer opens the app and lands on the title list with a title focused.
RELEASE · covers AC1, AC2
The title list on launch
(CC) Blender Foundation | mango.blender.org
What the viewer is told
Loading title
Audio description on, standard, 56 descriptions
The video paused while it loads more. Press back to return to the list.
S06 · The viewer plays the film; the buffer runs ahead of the picture and lets go behind it.
RELEASE · covers AC1
The film playing
(CC) Blender Foundation | mango.blender.org
What the viewer is told
Loading title
Audio description on, standard, 56 descriptions
The video paused while it loads more. Press back to return to the list.
Steps
2.8s wait — asset.segments
4.3s keys — ENTER
4.3s wait — player.play
4.9s shot — The film playing
51.6s wait — player.progress
52.4s wait — buffer.evicted
Decided by
✓ asset.segments n=(checked)
✓ player.opened → player.play → player.progress
✓ player.progress pos_ms=(checked)
✓ buffer.evicted held=(checked)
✓ buffer.evicted held=(checked) ×0 (saw 0)
✓ buffer.complete ×0 (saw 0)
✓ buffer.failed ×0 (saw 0)
Cannot show: The whole film, and memory: this run watches 45 s of 12 min on the Virtual Device. AC23 names the worst device in the matrix and an end-to-end watch.
✓ no player.stalled between controls.verbosity to=concise and player.progress pos_ms=(checked) [emitter: src/screens/PlayerScreen.tsx onStalled -> player.stalled]