wai: live-events (Draft) — wai.live.events, a signed, timeline-bound event track (WEV1), with its policy, verifier, poll tallies as feed state, MSF/DATERANGE/emsg bindings, corpus and independent verifier #279

Closed
dcharlot wants to merge 0 commits from wai/live-events into main
Owner

Slice L1 of WAI's live and interactive work: the wai.live.events extension. It is a signed, timeline-bound event track. This PR holds the spec, the reference implementation, the conformance corpus and an independent verifier. WAI defines no transport by charter, and this PR adds none: it gives field semantics and the rules over them.

What was built

wai/extensions/live-events.md

The header follows the house style: a Status line, a "Drafts read for this revision" line, and RFC 2119/8174 keywords. The drafts read are draft-ietf-moq-msf-01, draft-wilaw-moq-scte35-event-timeline-00, draft-wilaw-moq-webvtt-msf-00, draft-jennings-moq-mocha-chat-00 and draft-jennings-moq-mocha-reactions-00, together with RFC 8216 §4.3.2.7 and AOM id3-emsg v1.0.0.

§3 The WEV1 record. It has these fields:

  • version
  • room (32 bytes)
  • principal (an Ed25519 key)
  • seq (u64, per principal)
  • prev (32 bytes)
  • t (µs of room clock)
  • an optional anchor: the SHA-256 of the track name, then group and object
  • kind
  • a payload bounded by a u16 length
  • sig

The digest is SHA-256 over the record without sig. The signature is Ed25519 over the domain wai:live-event\x01 followed by those same bytes, and it is verified strictly under SPEC §7 Signatures (bad_key / bad_signature). §3.3 says how a record is read, with refusals truncated, malformed and unknown_version.

§4 Kinds and their payloads.

  • meta
  • cue: a summary (out, in, chapter or break, with cue_id and a duration) and an optional SCTE-35 message carried verbatim. The message is either a 35-1 splice_info_section(), checked for table_id and section_length, or a 35-2 event-based message carried opaque.
  • chat
  • reaction: the type and value integers of draft-jennings-moq-mocha-reactions-00, either standalone or aimed at a target, and retractable.
  • poll_open, vote, poll_close
  • marker: taxonomy, polarity, text, and an optional attachment digest.
  • control: record_start{count_in_ms}, record_stop, zoom{q16}, mute{on}, layer_request{layer}, each addressed to a target principal. mute takes an on/off byte so that the same command can unmute.
  • caption: text, a BCP 47 language tag, and origin (human, machine or machine-reviewed), with a model digest when the origin is machine.
  • decision: allow, deny or redact, with a target digest and a reason code.
  • take_commit: an opaque blob bounded in length. Its code is reserved for L4.
  • lifecycle (0x10–0x16): join, leave, publish, unpublish, grant_exchange, takeover and failover. Codes 0x17–0x1F are reserved.

§4.1 sets the text rules (bad_utf8, text_too_long).

§5 The WEP1 event policy. It holds:

  • a bitmap of permitted kinds
  • max_payload (default 1024)
  • max_text_cp (default 500)
  • max_events per window_us (default 50 per 1 s)
  • max_reactions per reaction_window_us (default 1 per 1 s)

Every number the spec gives is one of these defaults. One sentence notes that the L2 room grant will carry these same fields per principal.

§6 Verification.

  • §6.1 checks one record. Each check is applied in a fixed order, and a failure has a named reason.
  • §6.2 checks the per-principal chain in stream order:
    • A record identical to one already held is a duplicate and is ignored.
    • seq_replay: a different event claims a seq already held.
    • seq_not_increasing: the seq is behind the head.
    • chain_broken: prev is not the head's digest, or the genesis prev is not zero.
    • time_reversed: t goes backwards.
    • A seq jump is a detectable delivery gap (delivery_gap). It is reported as a gap, never as corruption.
  • §6.3 enforces both rates.
  • §6.4 defines three outcomes: refuse, gap or accept.

§7 Polls replay as wai.feed.state. The spec defines which votes count, and which poll_close closes a poll. Each poll is a feed0 node mint_node_id(author, seq) holding Int cells, built by CREATE, then ADD_INT(1+option, 1), then SET_CELL(0, 0). The tally's state hash is feed0's. A tally that a poll_close states is checked whenever no gap exists (tally_mismatch).

§8 Bindings.

  • MoQ. The events track is an MSF event timeline: eventType urn:wai:event:1. Each principal has its own track, as in mocha-chat. Groups are one minute long. Object 0 of each group is the independent object, holding the join set. Records are written {"t"|"l": …, "data": {"wev1": <base64url>}}, with l = [group, object] for anchored events.
  • Joining mid-stream (§8.2). A join set is repeated at each group start: open polls, the principal's last vote in each open poll, captions still showing, and open cues. This follows WebVTT-over-MSF §5.
  • LL-HLS. EXT-X-DATERANGE with CLASS="science.transaction.wai.event" and X-WAI-EVENT, plus SCTE35-OUT/-IN/-CMD and DURATION/PLANNED-DURATION for cues.
  • CMAF/DASH. emsg v1 with scheme_id_uri urn:wai:event:1 and value set to the kind name.
  • WebRTC. A data channel, one record per message.
  • Recording. The chain concatenated in seq order.

Each binding has rules for reading back, with refusals binding_malformed and binding_mismatch. The spec also notes two places where the texts it ingests disagree:

  • RFC 8216's one-ID-per-splice-pair rule cannot hold when each tag carries its own signed event.
  • The SCTE-35 event type is spelled urn:scte:scte35:2022:bin in draft-wilaw-moq-scte35-event-timeline-00 but urn:scte:scte35:2013:bin in the MSF -01 initial table.

Remaining sections. §9 is the reasons table, §10 covers conformance, and §11 covers security and privacy. Appendix A is the request to the MSF "Event Timeline Types" registry for urn:wai:event:1.

wai/wai-rs/src/live_events.rs (feature live_events = ["world"])

No new dependency. It reuses sha2, ed25519-dalek through crate::sig::verify_strict, and the feed sim (world::feed) for the tally.

The module provides:

  • Event::{parse, body, digest, sign, verify_signature, to_bytes}
  • Payload with encode and parse_payload
  • Policy with parse and to_bytes
  • RoomVerifier::offer, verify_stream and verify_chain
  • tally and tally_ops, which build real feed0 CausalOps and apply them through FeedState
  • check_tallies
  • join_set
  • both directions of every binding: to_daterange/from_daterange, to_emsg/from_emsg, to_msf_record/from_msf_record

Unit tests cover:

  • record round trips and every-prefix truncation
  • strict signatures against sig::forgeries
  • round trips of every payload
  • the text rules
  • the policy rules
  • the chain rules
  • both rates
  • tally equals feed0 replay
  • base64url and the dates
  • binding round trips
  • join sets
  • reason codes

wai/live-conformance/events/

vectors.json is written deterministically by wai_live_events_vectors gen from fixed seeds: keys and room ids are SHA-256 of fixed labels, every time is a constant, and Ed25519 is deterministic. The generator asserts that each vector reaches its intended outcome before writing it. A README follows the house style, and wai/live-conformance/README.md carries the provenance line that tests/corpus_provenance.rs requires.

Counts:

  • 45 vectors with 150 records.
    • 13 accept: one per kind (kind_*), room_interleaved (five principals, three groups) and join_set_repeats.
    • 2 gap: joiner_mid_stream and chain_gap.
    • 30 negative controls, each refused with its exact reason. Every negative you asked for is covered:
      • bad signature, plus three strict-rule forgeries
      • chain gap (outcome gap, delivery_gap), plus chain_broken and chain_broken_genesis
      • reorder → seq_not_increasing
      • seq replay
      • t backwards
      • oversize payload
      • kind not permitted, plus a lifecycle kind sent by a participant
      • rate exceeded and reaction rate exceeded
      • invalid UTF-8 (overlong and surrogate), plus text too long
      • truncated (tail and header)
      • unknown version
      • also: bad magic, trailing bytes, bad anchor flag, unknown kind, reserved lifecycle kind, wrong room, malformed cue, malformed language tag, malformed poll, tally mismatch
  • 12 policy cases (4 accept, 8 refuse).
  • 32 binding cases (10 accept, 22 refuse) across DATERANGE, emsg and MSF.

Each accepted vector also states its digests, its tally (state hash and per-poll counts), and the MSF, DATERANGE and emsg renderings of every record.

wai/live-conformance/live_events_verify.py

This verifier is independent. It is written from the extension text, never imports or runs the Rust code, and uses only the standard library. It uses the same Ed25519 the other *_verify.py files use (claim-conformance/_ed25519.py, WAI's strict rule, whose self-test it runs) and claim-conformance/_blake3.py.

It re-derives:

  • every outcome, reason, index, gap, digest and tally
  • every rendering, byte for byte
  • every read-back
  • every policy and binding case

It also requires that every kind has an accepted event and every reason has a case.

CI and registry

  • wai-conformance.yml. The independent-verifiers job (linux-arm64) gains the step "live events · wai-rs and live_events_verify.py". It runs:
    • cargo test --no-default-features --features live_events --lib live_events::
    • cargo test … --test live_events
    • python3 -I live-conformance/live_events_verify.py live-conformance/events
  • Path gate. wai/extensions/live-events.md is added to both paths: lists. scripts/pr-touches-paths.py reads those lists and answers true for this branch. wai/live-conformance/** is already covered by wai/*-conformance/**.
  • tests/live_events.rs. It has required-features = ["live_events"] and is named by the CI step, so check-tests-in-ci.py passes. It checks that:
    • the committed corpus regenerates byte for byte
    • every case gets its outcome
    • the corpus covers every kind and reason
    • §9 lists exactly Reason::ALL
  • Registry. wai.live.events is registered as a record under SPEC §5 Interactive, temporal & computed content, with a SPEC registration paragraph and an entry in the record list. Its wire identifiers are WEV1, WEP1, urn:wai:event:1 (catalog and scheme), science.transaction.wai.event and X-WAI-EVENT. The REGISTRY.md prose was updated and wai registry export re-run (capabilities.json, vocab/v2.ttl, the REGISTRY table). There is also a CHANGELOG entry.
  • include/wai.h. It was regenerated by build.rs and is committed. cbindgen exports the module's numeric constants, as it already does for the world and feed constants.
  • Merge. origin/main (#274, #276, #277) was merged in. The only conflict was the top of CHANGELOG, and both entries were kept. After the merge, registry export --check reports up to date and the header regenerates unchanged.

How it was tested

Every cargo command ran on the build host through ~/kani-logs/remote/rb under memguard. None ran on the dev Mac.

command (in wai/wai-rs) result
cargo test --no-default-features --features live_events --lib live_events:: 12 passed, exit 0
cargo test --no-default-features --features live_events --test live_events 4 passed, exit 0
cargo run --no-default-features --features live_events --bin wai_live_events_vectors -- verify ../live-conformance/events PASS regenerates byte for byte; PASS every case; exit 0
cargo test --no-default-features --features live_events --lib codecs:: (registry, SPEC and wire-identifier tests) 53 passed, exit 0
cargo run --no-default-features --bin wai -- registry export --check up to date, exit 0
cargo test --no-default-features --test carriage --test manifest_builders --test cli_wrap_intent --test cli_registry --test corpus_provenance all passed, exit 0
CI's library unit test step (cargo test --lib with its full feature list) 833 passed, exit 0
cargo clippy --no-default-features --features live_events --lib --tests --bin wai_live_events_vectors the new code's style warnings fixed

Also run:

  • The Python verifier, locally. python3 -I live-conformance/live_events_verify.py live-conformance/events gives PASS on all 45 vectors and on every policy and binding case.
  • Falsification of the verifier. Mutated copies of the corpus (a flipped signature bit, a changed tally, a changed DATERANGE rendering, a wrong stated reason) each make it fail.
  • Repository checks, locally. check-tests-in-ci, check-spec-refs, check-wai-section-refs, check-no-vanity-metrics, check-comparative-prose, check-workflow-concurrency, check-lockfiles and the pr-touches-paths self-test all exit 0.

Deferred

  • L2 (rooms).
    • The room descriptor: room id, t0, the room clock and its authority.
    • The grant that carries the WEP1 fields per principal. Until L2 lands, a verifier is given its policies by its caller.
    • Track naming.
    • The detail of each lifecycle kind.
    • Per-object relay receipts for events tracks.
  • L4 (capture binding). The contents of take_commit. L1 reserves the code and bounds the blob.
  • Later slices.
    • Packaging a recording's events component (L7).
    • A mapping from captions to WebVTT/IMSC and 608/708 (L8). The spec gives only a MAY.
    • Cue → SSAI (L11).
    • The moderation review policy (L12).
    • The draft-22 wire codec (L5).
  • Not implemented in the reference.
    • Optional emission on the SCTE-35 MSF timeline. It is specified as a MAY; choosing its index means parsing pts_time from the section.
    • An ID3 frame for the record. It is specified as a MAY, with no frame defined.

🤖 Generated with Claude Code


Closed: landed in main through #289 (main 13360b4e), by way of #284; both contain this branch's head defa48c0 unchanged.

Slice L1 of WAI's live and interactive work: the `wai.live.events` extension. It is a signed, timeline-bound event track. This PR holds the spec, the reference implementation, the conformance corpus and an independent verifier. WAI defines no transport by charter, and this PR adds none: it gives field semantics and the rules over them. ## What was built ### `wai/extensions/live-events.md` The header follows the house style: a Status line, a "Drafts read for this revision" line, and RFC 2119/8174 keywords. The drafts read are `draft-ietf-moq-msf-01`, `draft-wilaw-moq-scte35-event-timeline-00`, `draft-wilaw-moq-webvtt-msf-00`, `draft-jennings-moq-mocha-chat-00` and `draft-jennings-moq-mocha-reactions-00`, together with RFC 8216 §4.3.2.7 and AOM id3-emsg v1.0.0. **§3 The `WEV1` record.** It has these fields: - `version` - `room` (32 bytes) - `principal` (an Ed25519 key) - `seq` (u64, per principal) - `prev` (32 bytes) - `t` (µs of room clock) - an optional `anchor`: the SHA-256 of the track name, then group and object - `kind` - a `payload` bounded by a u16 length - `sig` The digest is SHA-256 over the record without `sig`. The signature is Ed25519 over the domain `wai:live-event\x01` followed by those same bytes, and it is verified strictly under SPEC §7 *Signatures* (`bad_key` / `bad_signature`). §3.3 says how a record is read, with refusals `truncated`, `malformed` and `unknown_version`. **§4 Kinds and their payloads.** - `meta` - `cue`: a summary (out, in, chapter or break, with `cue_id` and a duration) and an optional SCTE-35 message carried verbatim. The message is either a 35-1 `splice_info_section()`, checked for `table_id` and `section_length`, or a 35-2 event-based message carried opaque. - `chat` - `reaction`: the type and value integers of `draft-jennings-moq-mocha-reactions-00`, either standalone or aimed at a target, and retractable. - `poll_open`, `vote`, `poll_close` - `marker`: taxonomy, polarity, text, and an optional attachment digest. - `control`: `record_start{count_in_ms}`, `record_stop`, `zoom{q16}`, `mute{on}`, `layer_request{layer}`, each addressed to a target principal. `mute` takes an on/off byte so that the same command can unmute. - `caption`: text, a BCP 47 language tag, and `origin` (human, machine or machine-reviewed), with a model digest when the origin is machine. - `decision`: allow, deny or redact, with a target digest and a reason code. - `take_commit`: an opaque blob bounded in length. Its code is reserved for L4. - `lifecycle` (0x10–0x16): join, leave, publish, unpublish, grant_exchange, takeover and failover. Codes 0x17–0x1F are reserved. §4.1 sets the text rules (`bad_utf8`, `text_too_long`). **§5 The `WEP1` event policy.** It holds: - a bitmap of permitted kinds - `max_payload` (default 1024) - `max_text_cp` (default 500) - `max_events` per `window_us` (default 50 per 1 s) - `max_reactions` per `reaction_window_us` (default 1 per 1 s) Every number the spec gives is one of these defaults. One sentence notes that the L2 room grant will carry these same fields per principal. **§6 Verification.** - §6.1 checks one record. Each check is applied in a fixed order, and a failure has a named reason. - §6.2 checks the per-principal chain in stream order: - A record identical to one already held is a duplicate and is ignored. - `seq_replay`: a different event claims a seq already held. - `seq_not_increasing`: the seq is behind the head. - `chain_broken`: `prev` is not the head's digest, or the genesis `prev` is not zero. - `time_reversed`: `t` goes backwards. - A seq jump is a **detectable delivery gap** (`delivery_gap`). It is reported as a gap, never as corruption. - §6.3 enforces both rates. - §6.4 defines three outcomes: refuse, gap or accept. **§7 Polls replay as `wai.feed.state`.** The spec defines which votes count, and which `poll_close` closes a poll. Each poll is a feed0 node `mint_node_id(author, seq)` holding `Int` cells, built by `CREATE`, then `ADD_INT(1+option, 1)`, then `SET_CELL(0, 0)`. The tally's state hash is feed0's. A tally that a `poll_close` states is checked whenever no gap exists (`tally_mismatch`). **§8 Bindings.** - **MoQ.** The events track is an MSF event timeline: `eventType` `urn:wai:event:1`. Each principal has its own track, as in mocha-chat. Groups are one minute long. Object 0 of each group is the independent object, holding the join set. Records are written `{"t"|"l": …, "data": {"wev1": <base64url>}}`, with `l` = [group, object] for anchored events. - **Joining mid-stream (§8.2).** A join set is repeated at each group start: open polls, the principal's last vote in each open poll, captions still showing, and open cues. This follows WebVTT-over-MSF §5. - **LL-HLS.** `EXT-X-DATERANGE` with `CLASS="science.transaction.wai.event"` and `X-WAI-EVENT`, plus `SCTE35-OUT`/`-IN`/`-CMD` and `DURATION`/`PLANNED-DURATION` for cues. - **CMAF/DASH.** `emsg` v1 with `scheme_id_uri` `urn:wai:event:1` and `value` set to the kind name. - **WebRTC.** A data channel, one record per message. - **Recording.** The chain concatenated in seq order. Each binding has rules for reading back, with refusals `binding_malformed` and `binding_mismatch`. The spec also notes two places where the texts it ingests disagree: - RFC 8216's one-ID-per-splice-pair rule cannot hold when each tag carries its own signed event. - The SCTE-35 event type is spelled `urn:scte:scte35:2022:bin` in `draft-wilaw-moq-scte35-event-timeline-00` but `urn:scte:scte35:2013:bin` in the MSF -01 initial table. **Remaining sections.** §9 is the reasons table, §10 covers conformance, and §11 covers security and privacy. Appendix A is the request to the MSF "Event Timeline Types" registry for `urn:wai:event:1`. ### `wai/wai-rs/src/live_events.rs` (feature `live_events = ["world"]`) No new dependency. It reuses `sha2`, `ed25519-dalek` through `crate::sig::verify_strict`, and the feed sim (`world::feed`) for the tally. The module provides: - `Event::{parse, body, digest, sign, verify_signature, to_bytes}` - `Payload` with encode and `parse_payload` - `Policy` with `parse` and `to_bytes` - `RoomVerifier::offer`, `verify_stream` and `verify_chain` - `tally` and `tally_ops`, which build real feed0 `CausalOp`s and apply them through `FeedState` - `check_tallies` - `join_set` - both directions of every binding: `to_daterange`/`from_daterange`, `to_emsg`/`from_emsg`, `to_msf_record`/`from_msf_record` Unit tests cover: - record round trips and every-prefix truncation - strict signatures against `sig::forgeries` - round trips of every payload - the text rules - the policy rules - the chain rules - both rates - tally equals feed0 replay - base64url and the dates - binding round trips - join sets - reason codes ### `wai/live-conformance/events/` `vectors.json` is written deterministically by `wai_live_events_vectors gen` from fixed seeds: keys and room ids are SHA-256 of fixed labels, every time is a constant, and Ed25519 is deterministic. The generator asserts that each vector reaches its intended outcome before writing it. A README follows the house style, and `wai/live-conformance/README.md` carries the provenance line that `tests/corpus_provenance.rs` requires. Counts: - 45 vectors with 150 records. - 13 accept: one per kind (`kind_*`), `room_interleaved` (five principals, three groups) and `join_set_repeats`. - 2 gap: `joiner_mid_stream` and `chain_gap`. - 30 negative controls, each refused with its exact reason. Every negative you asked for is covered: - bad signature, plus three strict-rule forgeries - chain gap (outcome gap, `delivery_gap`), plus `chain_broken` and `chain_broken_genesis` - reorder → `seq_not_increasing` - seq replay - `t` backwards - oversize payload - kind not permitted, plus a lifecycle kind sent by a participant - rate exceeded and reaction rate exceeded - invalid UTF-8 (overlong and surrogate), plus text too long - truncated (tail and header) - unknown version - also: bad magic, trailing bytes, bad anchor flag, unknown kind, reserved lifecycle kind, wrong room, malformed cue, malformed language tag, malformed poll, tally mismatch - 12 policy cases (4 accept, 8 refuse). - 32 binding cases (10 accept, 22 refuse) across DATERANGE, emsg and MSF. Each accepted vector also states its digests, its tally (state hash and per-poll counts), and the MSF, DATERANGE and emsg renderings of every record. ### `wai/live-conformance/live_events_verify.py` This verifier is independent. It is written from the extension text, never imports or runs the Rust code, and uses only the standard library. It uses the same Ed25519 the other `*_verify.py` files use (`claim-conformance/_ed25519.py`, WAI's strict rule, whose self-test it runs) and `claim-conformance/_blake3.py`. It re-derives: - every outcome, reason, index, gap, digest and tally - every rendering, byte for byte - every read-back - every policy and binding case It also requires that every kind has an accepted event and every reason has a case. ### CI and registry - **`wai-conformance.yml`.** The `independent-verifiers` job (linux-arm64) gains the step "live events · wai-rs and live_events_verify.py". It runs: - `cargo test --no-default-features --features live_events --lib live_events::` - `cargo test … --test live_events` - `python3 -I live-conformance/live_events_verify.py live-conformance/events` - **Path gate.** `wai/extensions/live-events.md` is added to both `paths:` lists. `scripts/pr-touches-paths.py` reads those lists and answers `true` for this branch. `wai/live-conformance/**` is already covered by `wai/*-conformance/**`. - **`tests/live_events.rs`.** It has `required-features = ["live_events"]` and is named by the CI step, so `check-tests-in-ci.py` passes. It checks that: - the committed corpus regenerates byte for byte - every case gets its outcome - the corpus covers every kind and reason - §9 lists exactly `Reason::ALL` - **Registry.** `wai.live.events` is registered as a **record** under SPEC §5 *Interactive, temporal & computed content*, with a SPEC registration paragraph and an entry in the record list. Its wire identifiers are `WEV1`, `WEP1`, `urn:wai:event:1` (catalog and scheme), `science.transaction.wai.event` and `X-WAI-EVENT`. The REGISTRY.md prose was updated and `wai registry export` re-run (`capabilities.json`, `vocab/v2.ttl`, the REGISTRY table). There is also a CHANGELOG entry. - **`include/wai.h`.** It was regenerated by build.rs and is committed. cbindgen exports the module's numeric constants, as it already does for the world and feed constants. - **Merge.** `origin/main` (#274, #276, #277) was merged in. The only conflict was the top of CHANGELOG, and both entries were kept. After the merge, `registry export --check` reports up to date and the header regenerates unchanged. ## How it was tested Every cargo command ran on the build host through `~/kani-logs/remote/rb` under memguard. None ran on the dev Mac. | command (in `wai/wai-rs`) | result | |---|---| | `cargo test --no-default-features --features live_events --lib live_events::` | 12 passed, exit 0 | | `cargo test --no-default-features --features live_events --test live_events` | 4 passed, exit 0 | | `cargo run --no-default-features --features live_events --bin wai_live_events_vectors -- verify ../live-conformance/events` | PASS regenerates byte for byte; PASS every case; exit 0 | | `cargo test --no-default-features --features live_events --lib codecs::` (registry, SPEC and wire-identifier tests) | 53 passed, exit 0 | | `cargo run --no-default-features --bin wai -- registry export --check` | up to date, exit 0 | | `cargo test --no-default-features --test carriage --test manifest_builders --test cli_wrap_intent --test cli_registry --test corpus_provenance` | all passed, exit 0 | | CI's library unit test step (`cargo test --lib` with its full feature list) | 833 passed, exit 0 | | `cargo clippy --no-default-features --features live_events --lib --tests --bin wai_live_events_vectors` | the new code's style warnings fixed | Also run: - **The Python verifier, locally.** `python3 -I live-conformance/live_events_verify.py live-conformance/events` gives PASS on all 45 vectors and on every policy and binding case. - **Falsification of the verifier.** Mutated copies of the corpus (a flipped signature bit, a changed tally, a changed DATERANGE rendering, a wrong stated reason) each make it fail. - **Repository checks, locally.** `check-tests-in-ci`, `check-spec-refs`, `check-wai-section-refs`, `check-no-vanity-metrics`, `check-comparative-prose`, `check-workflow-concurrency`, `check-lockfiles` and the `pr-touches-paths` self-test all exit 0. ## Deferred - **L2 (rooms).** - The room descriptor: room id, `t0`, the room clock and its authority. - The grant that carries the `WEP1` fields per principal. Until L2 lands, a verifier is given its policies by its caller. - Track naming. - The `detail` of each lifecycle kind. - Per-object relay receipts for events tracks. - **L4 (capture binding).** The contents of `take_commit`. L1 reserves the code and bounds the blob. - **Later slices.** - Packaging a recording's events component (L7). - A mapping from captions to WebVTT/IMSC and 608/708 (L8). The spec gives only a MAY. - Cue → SSAI (L11). - The moderation review policy (L12). - The draft-22 wire codec (L5). - **Not implemented in the reference.** - Optional emission on the SCTE-35 MSF timeline. It is specified as a MAY; choosing its index means parsing `pts_time` from the section. - An ID3 frame for the record. It is specified as a MAY, with no frame defined. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- **Closed:** landed in main through #289 (main 13360b4e), by way of #284; both contain this branch's head defa48c0 unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai: live-conformance/README.md, with the corpus's provenance
Some checks failed
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural sink gates / does this change touch it (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-pack / wai-pack · does this change touch it (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum WebGPU member / does this change touch it (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / does this change touch it (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
8a58f94bb6
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai: live_events stays out of include/wai.h
Some checks failed
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
defa48c0b5
Its constants (VERSION, IN, OUT, BREAK, CHAT and the rest) are Rust-only. As bare
macros they would collide in any C program that includes wai.h beside a platform
header or a build-wide -DVERSION. The module is cbindgen:ignore; the header is
regenerated and is back to main's.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
dcharlot closed this pull request 2026-10-17 09:23:32 -04:00
Some checks failed
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 11m58s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 7s
WAI conformance / does this change touch it (pull_request) Successful in 5s
standards workspaces build + test / macOS energy backends (pull_request) Has been skipped
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 4s
WAI energy receipts / does this change touch it (pull_request) Successful in 5s
WAI neural sink gates / does this change touch it (pull_request) Successful in 5s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 6s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 5s
wai-quantum WebGPU member / does this change touch it (pull_request) Successful in 4s
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Successful in 4s
wai-web wasm32 / does this change touch it (pull_request) Successful in 4s
repository checks / lockfiles, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 44s
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!279
No description provided.