Some checks failed
WAI conformance / does this change touch it (push) Has been skipped
WAI conformance / cargo-class corpora · linux (push) Has been skipped
WAI conformance / cargo-class corpora · linux-arm64 (push) Has been skipped
WAI conformance / cargo-class corpora · macos (push) Has been skipped
WAI conformance / cargo-class corpora · windows (push) Has been skipped
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (push) Has been skipped
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (push) Has been skipped
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (push) Has been skipped
WAI conformance / v2 vocabulary · manifests validate as stated (push) Has been skipped
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (push) Has been skipped
WAI conformance / independent verifiers · every verifier step, each corpus's Rust side (push) Has been skipped
WAI conformance / each feature of the independent verifiers' steps compiles alone (push) Has been skipped
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (push) Has been skipped
WAI conformance / cross-arch byte-equality · linux (push) Has been skipped
WAI conformance / cross-arch byte-equality · linux-arm64 (push) Has been skipped
WAI conformance / cross-arch byte-equality · macos (push) Has been skipped
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (push) Has been skipped
WAI conformance / C2PA manifest emission · signed, read back, validated (push) Has been skipped
WAI conformance / independent verifiers · each needs= is what a run without packages shows (nightly) (push) Has been skipped
wai-audit collector and player integration / does this change touch it (push) Successful in 46s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 1m1s
joule-moq-http live HTTP egress / joule-moq-http · does this change touch it (push) Successful in 1m8s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 58s
wai-quantum studio and desktop / does this change touch it (push) Successful in 45s
WAI Studio / does this change touch it (push) Successful in 43s
wai-sink-swift native sink package / does this change touch it (push) Successful in 43s
wai-sink-android native sink library / does this change touch it (push) Successful in 45s
wai-fleet service / does this change touch it (push) Successful in 2m50s
wai-ledger service / does this change touch it (push) Successful in 3m10s
WAI operation catalogue / does this change touch it (push) Successful in 3m12s
wai-pack / wai-pack · does this change touch it (push) Successful in 4m6s
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (push) Successful in 52s
wai-quantum for JavaScript / does this change touch it (push) Successful in 4m47s
wai-app and Create / wai-app · does this change touch it (push) Successful in 5m33s
joule-moq-agent AI participants / joule-moq-agent · does this change touch it (push) Successful in 6m0s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 6m26s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 2m11s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 52s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 3m32s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 7m36s
joule-moq-http live HTTP egress / joule-moq-http, every target (push) Successful in 9m46s
wai-pack / wai-pack · the floor through a media prober (push) Successful in 2m55s
wai-fleet service / service · macos (push) Successful in 43s
wai web player plugins / the four players in Chromium, Firefox and WebKit · macos (push) Failing after 17m29s
wai-pack / wai-pack · dependency licences (push) Successful in 4m31s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 10s
WAI examples / WAI examples · does this change touch them (push) Successful in 10s
WAI conformance / a push to main · corpus provenance and sidecars, signer ids, the registry export (push) Successful in 52s
wai-ledger service / service · macos (push) Successful in 3m8s
joule-code conformance gate / joule-moq-relay, every target (push) Successful in 23m50s
wai web player plugins / the browser run's room compiles · linux (push) Successful in 1m21s
wai-pack / wai-pack · linux-arm64 (push) Successful in 11m49s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m28s
wai web player plugins / the plugins' core under Node · linux (push) Successful in 4m54s
joule-moq-agent AI participants / joule-moq-agent, every target (push) Successful in 5m46s
wai-ledger service / service · linux (push) Successful in 2m41s
wai-pack / wai-pack · macos (push) Successful in 8m52s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 22m24s
wai-fleet service / service · linux (push) Successful in 5m9s
wai-quantum studio and desktop / studio · browser (push) Successful in 6m57s
wai-audit collector and player integration / collector · linux (push) Successful in 8m0s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 40s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 19m6s
wai-pack / wai-pack · linux (push) Successful in 3m53s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 20m10s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 23m50s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 10m38s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 37m47s
joule-code conformance gate / Build + round-trip C1-C4 vectors (push) Successful in 17m0s
wai-quantum for JavaScript / javascript · linux (push) Successful in 10m32s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 17m57s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 14m49s
wai release binaries build on Windows / the seven release binaries · windows (push) Successful in 21m39s
joule-code conformance gate / joule-moq-ingest, every target (push) Failing after 47m10s
wai-pack / wai-pack · independent verifier (Python) (push) Successful in 33m37s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 25m57s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 13m29s
WAI Studio / Studio in WebKit · linux (push) Successful in 32m45s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 3m47s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 48m5s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 13m30s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (push) Successful in 21m5s
WAI examples / WAI examples · portable · linux (push) Successful in 27m47s
WAI examples / WAI examples · android-app · linux-arm64 (push) Successful in 19m2s
A profile record (live-rooms §8.1) could not state the Opus frame length or a jitter-buffer target, so no profile could ask for the short frames performers playing together need, and the room page took its frame from the URL (20 ms by default). A descriptor of version 2 is version 1 with frame_us and jitter_us in every profile record. A frame is one of RFC 6716 §2.1.4's durations, on a profile of Opus alone; a jitter target is whole frames, at most a second, and needs a frame; video states neither. A descriptor is written at the lowest version that carries it, and a version-2 descriptor that states no frame is refused, so every room of version 1 keeps its bytes and room id; a verifier of the earlier revision refuses version 2 as unknown_version (fails closed). Decision D111. jam (§8.2): music with 5 ms frames (CELT alone, 7.5 ms of algorithmic delay) and a 10 ms jitter target, which leaves 7.5 to 12.5 ms of the 25 to 30 ms ensemble threshold to the path. D111 says why not 2.5 or 10 ms, with the receipt bytes a one-object group costs measured on the corpora (377 to 409 bytes). wai-rs live_room reads and writes version 2 and registers jam; the rooms corpus adds jam's record (its version stated), a jam room and a room with a 10 ms profile of its own, and eight descriptors refused for one defect each; descriptor_unknown_version is now version 3. live_rooms_verify.py follows the text, with mutated copies and eight weakened checks each caught; live_worlds_verify.py reads version 2; joule-moq-ingest's own reader reads version 2 and knows jam; wai-live-web's room view states frame_us and jitter_us; the room page encodes with catalog.js's opusConfig (the profile's frame over the URL's, lowdelay below 10 ms, music signal, no DTX or in-band FEC), tested on the corpus records. The three breaks are acknowledged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
63 lines
2.9 KiB
Rust
63 lines
2.9 KiB
Rust
//! `wai.live.room` (extensions/live-rooms.md): the committed corpus
|
|
//! `live-conformance/rooms/vectors.json` regenerates byte for byte from its fixed seeds,
|
|
//! every vector in it gets the outcome it states, it refuses with every reason the
|
|
//! extension adds, and the extension's §11 lists exactly those reasons.
|
|
#![cfg(feature = "live_room")]
|
|
|
|
use std::collections::BTreeSet;
|
|
use std::path::PathBuf;
|
|
use wai::live_room::{corpus, Reason};
|
|
|
|
fn wai_dir() -> PathBuf {
|
|
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("..")
|
|
}
|
|
|
|
fn committed() -> String {
|
|
std::fs::read_to_string(wai_dir().join("live-conformance/rooms/vectors.json")).expect("the committed corpus")
|
|
}
|
|
|
|
#[test]
|
|
fn the_committed_corpus_regenerates_from_its_seeds() {
|
|
assert!(committed() == corpus::generate(), "live-conformance/rooms/vectors.json differs from `wai_live_room_vectors gen`");
|
|
}
|
|
|
|
#[test]
|
|
fn every_vector_gets_its_stated_outcome() {
|
|
let fails = corpus::verify(&committed());
|
|
assert!(fails.is_empty(), "{}", fails.join("\n"));
|
|
}
|
|
|
|
/// Every reason this extension adds has a vector, a proof (§10.5) or a request of `seek`
|
|
/// (§10.6) refused with it, and the corpus has the room shapes §12 names, accepted.
|
|
#[test]
|
|
fn the_corpus_covers_every_reason_and_room() {
|
|
let doc: serde_json::Value = serde_json::from_str(&committed()).unwrap();
|
|
let vectors = doc["vectors"].as_array().unwrap();
|
|
let proofs = doc["proofs"].as_array().unwrap();
|
|
let seek = doc["seek"].as_array().unwrap();
|
|
let reasons: BTreeSet<&str> = vectors.iter().chain(proofs).chain(seek).filter_map(|v| v["reason"].as_str()).collect();
|
|
for r in Reason::ALL {
|
|
assert!(reasons.contains(r.code()), "nothing in the corpus is refused with {r}");
|
|
}
|
|
for name in ["lesson", "broadcast", "takeover", "redundant_failover", "promote_viewer", "dvr", "ai_participant", "ai_captioner", "jam", "timed_profile"] {
|
|
let v = vectors.iter().find(|v| v["name"] == name).unwrap_or_else(|| panic!("no vector {name}"));
|
|
assert_eq!(v["outcome"], "accept", "{name}");
|
|
}
|
|
let outcomes: BTreeSet<&str> = seek.iter().filter_map(|c| c["outcome"].as_str()).collect();
|
|
assert_eq!(outcomes, BTreeSet::from(["refuse", "serve"]), "seek has requests served and refused");
|
|
}
|
|
|
|
/// §11 of the extension lists exactly the codes `Reason::ALL` has, each once, in order.
|
|
#[test]
|
|
fn the_extension_lists_the_reasons() {
|
|
let text = std::fs::read_to_string(wai_dir().join("extensions/live-rooms.md")).expect("the extension");
|
|
let at = text.find("\n## 11. Reasons").expect("a §11");
|
|
let end = text[at + 1..].find("\n## ").map_or(text.len(), |e| at + 1 + e);
|
|
let listed: Vec<String> = text[at..end]
|
|
.lines()
|
|
.filter(|l| l.starts_with("| `"))
|
|
.filter_map(|l| l.split('`').nth(1).map(String::from))
|
|
.collect();
|
|
let want: Vec<String> = Reason::ALL.iter().map(|r| r.code().to_string()).collect();
|
|
assert_eq!(listed, want, "§11's table and Reason::ALL differ");
|
|
}
|