open-standards/wai/live-conformance/captions/README.md
Transaction Science 70803602e9
Some checks failed
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (push) Successful in 1m3s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 1m11s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 11s
WAI examples / WAI examples · does this change touch them (push) Successful in 10s
joule-moq-http live HTTP egress / joule-moq-http · does this change touch it (push) Successful in 1m30s
wai-ledger service / does this change touch it (push) Successful in 1m27s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 1m31s
wai-audit collector and player integration / does this change touch it (push) Successful in 1m28s
wai-app and Create / wai-app · does this change touch it (push) Successful in 1m29s
joule-moq-agent AI participants / joule-moq-agent · does this change touch it (push) Successful in 1m35s
WAI operation catalogue / does this change touch it (push) Successful in 1m28s
wai-pack / wai-pack · does this change touch it (push) Successful in 1m36s
wai-fleet service / does this change touch it (push) Successful in 1m37s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 1m41s
wai-quantum for JavaScript / does this change touch it (push) Successful in 1m37s
wai-fleet service / service · macos (push) Successful in 45s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 58s
wai-ledger service / service · macos (push) Failing after 1m22s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m53s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 1m43s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 3m45s
wai-pack / wai-pack · macos (push) Successful in 4m4s
wai-quantum studio and desktop / does this change touch it (push) Successful in 4m41s
wai-sink-android native sink library / does this change touch it (push) Successful in 4m24s
WAI Studio / does this change touch it (push) Successful in 5m33s
wai-sink-swift native sink package / does this change touch it (push) Successful in 5m39s
wai-ledger service / service · linux (push) Successful in 4m37s
wai-audit collector and player integration / collector · linux (push) Successful in 4m51s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 7m29s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m3s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 7m57s
joule-code conformance gate / Build + round-trip C1-C4 vectors (push) Successful in 8m46s
wai-fleet service / service · linux (push) Successful in 4m39s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 5m10s
wai-quantum for JavaScript / javascript · linux (push) Successful in 5m7s
joule-moq-http live HTTP egress / joule-moq-http, every target (push) Successful in 9m51s
joule-moq-agent AI participants / joule-moq-agent, every target (push) Successful in 4m16s
joule-code conformance gate / joule-moq-relay, every target (push) Successful in 13m57s
wai-pack / wai-pack · linux-arm64 (push) Successful in 5m18s
wai-quantum studio and desktop / studio · browser (push) Successful in 7m45s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 9m32s
wai-pack / wai-pack · the floor through a media prober (push) Successful in 1m55s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 14m20s
wai-pack / wai-pack · linux (push) Successful in 11m54s
wai-pack / wai-pack · dependency licences (push) Successful in 3m16s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 9m54s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (push) Successful in 17m8s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 12m1s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 19m32s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 17m8s
WAI examples / WAI examples · portable · linux (push) Successful in 21m8s
WAI examples / WAI examples · android-app · linux-arm64 (push) Successful in 25m41s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 11m56s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 13m5s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 22m5s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Failing after 34m52s
joule-code conformance gate / joule-moq-ingest, every target (push) Successful in 35m54s
wai-pack / wai-pack · independent verifier (Python) (push) Successful in 25m7s
WAI Studio / Studio in WebKit · linux (push) Successful in 34m24s
wai release binaries build on Windows / the seven release binaries · windows (push) Successful in 22m13s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 14m58s
Timed text: a revision's window is the one that follows it, and a lost window is unknown (D104)
2abd0060c let a revision with no window take the window of the revision it
supersedes, while the §4.6 join set carried only each caption's own window:
a subscriber joining after a partial with no window, superseding one in W,
put it in no window and refused the final in W (supersede_mismatch), a
stream a subscriber from the start accepts. A join set carrying each open
partial's earlier revisions does not close it (two cues interleaved in one
window: the earlier's partial is in no join set), so the window now follows
each revision, and a revision with no window superseding one in a window is
supersede_mismatch; the join set's own windows are what a joiner needs.

A window lost to a gap had the same effect; such a window is now unknown:
the superseded revision's where the verifier knows it, else compared with
nothing and shown as no window.

- timed-text §4.3 step 5, §4.4, §4.6, §4.7, §13, §14.
- wai-rs timed_text: no inheritance, Revision::window_unknown, join_set by
  own windows; corpus: window_chain_join (join asserted equal),
  window_lost_in_gap (refused before), supersede_mismatch_no_window; a gap
  stream states no resolution.
- timed_text_verify.py follows the text; three more mutated copies fail.
- D104 corrected in place.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-13 04:59:35 -05:00

58 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# live-conformance/captions — timed text and live captions
The corpus of [`extensions/timed-text.md`](../../extensions/timed-text.md) §13: live
captions as `WEV1` events with their `WTX1` annotations, cues given as lists, and what each
maps onto: WebVTT documents and segments, IMSC1 documents, the two MoQ caption timelines,
CTA-608 byte pairs, and the disclosure label in HLS, C2PA, the catalogs and the sidecar.
**Timed-text equivalence.** For each event vector, a conforming verifier of the corpus's
room, holding every principal to live-events' default policy and offered `events` one at a
time in the order given, reaches the outcome the vector states (§4.3): `refuse` with the
`reason` and `index`, `gap` with the `gaps`, or `accept`. A vector that does not refuse also
states its `revisions`, each with its `window` (§4.7: its `source`, `cta-608` or `cta-708`, its
`service` and its `window`, or null) and whether that window is unknown (`window_unknown`),
what a sink shows at each instant of `shown` (§4.4), each caption with its window, and, for
a stream with no gap, the cues the stream resolves to or the refusal (`resolve`, §4.5); a
vector with a `join` states the
records a subscriber joining the events track at that group receives, its outcome and what it
shows (§4.6). For each event vector that resolves and each cue vector, `targets` states, for
each target it names, the file written or the reason refused: `webvtt` (§5.1), `segments`
(§5.2), `imsc` (§6.1, §6.2), `timelines` (§7.1–§7.3; every object byte for byte), `cc608`
(§8; the mode, the slot clock's rate, the file and what the decoder reports of it, §8.8) and
`disclosure` (§7.4, §10: the HLS tags, the session data, the sidecar, the C2PA statement and
the catalog entries, each byte for byte). `read_cases` are WebVTT texts the reader refuses
(§5.3), and `decode_cases` 608 streams the decoder refuses (§8.8), each with its reason. A
verifier that reaches another outcome, reason, index, revision, cue, rendering or byte does
not conform.
**Provenance.** Generated here: `wai_timed_text_vectors gen` writes `vectors.json` and every
expected output from events and cues authored in code, from fixed seeds. Each principal's key
and each model digest is SHA-256 of a fixed label and an index, the room id likewise, every
time is a constant, and Ed25519 signing is deterministic (RFC 8032), so every file is the
same bytes on every machine. The texts are written for the corpus, in English and Spanish.
The generator asserts, before it writes, that each vector reaches the outcome it was written
to have, that every WebVTT file reads back to its cues, that every 608 file decodes to the
rows its cues lay out, and that the corpus covers every reason of §12 and every 608 code path
of §8. No recorded data.
## Layout
- `vectors.json`: `pt0_ms` (the media time of the room's `t0`), `room`, `principals`
(`captioner`, `asr`, `host`), `models`, `event_vectors`, `cue_vectors`, `read_cases` and
`decode_cases`. A cue is written as `start`, `end`, `lang`, `origin`, `model` (lowercase
hexadecimal, or null), `anchor`, `text` and `italic` (pairs of first code point and count).
- `NAME.vtt`, `NAME.segK.vtt`: WebVTT documents and segments.
- `NAME.ttml`: IMSC1 Text Profile documents.
- `NAME.MODE[.rNUM-DEN].608.hex`: 608 byte pairs in the hexadecimal form of §8.3, on the
30000/1001 slot clock unless the name gives another rate.
## Checking
```
cargo run --no-default-features --features timed_text --bin wai_timed_text_vectors -- verify ../live-conformance/captions
python3 -I timed_text_verify.py captions
```
The first runs from `wai-rs/`, the second from `live-conformance/`. The second is the
corpus's second implementation, written from the extension's text; it shares no code with
`wai-rs`.