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
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]>
58 lines
3.7 KiB
Markdown
58 lines
3.7 KiB
Markdown
# 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`.
|