diff --git a/.github/workflows/wai-conformance.yml b/.github/workflows/wai-conformance.yml index 2d24b8bed..50878b75e 100644 --- a/.github/workflows/wai-conformance.yml +++ b/.github/workflows/wai-conformance.yml @@ -793,18 +793,8 @@ jobs: # int_payload_verify.py (the integer payloads and their refusal fixtures), and # staged_verify.py (the staged-delivery corpus), and http_verify.py (the HTTP delivery # corpus), and quantum-conformance/tools/referee.py (both quantum-sim capabilities), and - # live_events_verify.py (the live-events corpus), and live_rooms_verify.py (the - # live-rooms corpus), and capture_take_verify.py (the capture-binding corpus), and - # live_compose_verify.py (the live-compose corpus), live_record_verify.py (the - # live-recording corpus), timed_text_verify.py (the timed-text corpus), - # live_metering_verify.py (the live-metering corpus), energy_steering_verify.py (the - # energy-steering corpus), and live_moderation_verify.py (the live-moderation corpus), and - # e2ee_verify.py (the end-to-end encrypted rooms corpus), live_watermark_verify.py (the - # forensic-watermark corpus), live_ads_verify.py (the live-ads corpus), c2pa_live_verify.py - # (the live-provenance corpus), edge_verify.py (the deriving-edge corpus), - # synthesis_verify.py (the synthesis corpus), ai_usage_verify.py (the AI usage corpus), - # contribution_verify.py (the contribution-records corpus) and settlement_verify.py (the - # delivery settlement corpus). + # one verifier for each corpus under live-conformance/, which live-conformance/README.md + # lists beside its directory, extension and generator. # Each exits non-zero on any failure or any difference, and the step fails with it. # One platform: what they check is the reading of the text, not the architecture. independent-verifiers: diff --git a/wai/REGISTRY.md b/wai/REGISTRY.md index 8bff268dd..70be16b2d 100644 --- a/wai/REGISTRY.md +++ b/wai/REGISTRY.md @@ -37,17 +37,10 @@ Every registered string has one kind. - **derivation** — an operation of ISO/IEC 23001-16 (`wai.derive.*`, [derived-tracks](extensions/derived-tracks.md)). It acts on samples another capability decoded and names no payload format. -- **record** — a signed record a WAI tool emits and verifies (a receipt kind: - `wai.asset.provenance`, the quantum-operations receipts, the delivery records - `wai.video.manifest` and its siblings; the live records `wai.live.events`, - `wai.live.room`, `wai.capture.take`, `wai.live.compose`, `wai.live.recording`, - `wai.live.metering`, `wai.live.steering`, `wai.live.moderation`, `wai.live.e2ee`, - `wai.live.watermark`, `wai.live.ads` and `wai.live.provenance`; timed text, - `wai.text.timed`; the deriving edge's record, `wai.edge.derivation`; the origin claims of - media, `wai.media.synthesis`; AI usage preferences and consumption claims, `wai.ai.usage`; - the contribution records of media made by people and models together, - `wai.media.contribution`; delivery settled on what its receiver signed, - `wai.delivery.settlement`). It names no payload format. +- **record** — a signed record a WAI tool emits and verifies: a receipt kind, a + delivery record, or a record of one of the live, provenance and delivery extensions. The + table below lists every one, kind `record`, with the section that registers it. It names + no payload format. A derivation or record string is not a payload capability, so it is not dispatchable (SPEC §4): dispatch never takes an envelope's capability that names diff --git a/wai/SPEC.md b/wai/SPEC.md index 40415b941..89fdf22e0 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -588,18 +588,9 @@ kind: own; - a **derivation** operation (`wai.derive.*`): an operation on samples another capability decoded, which names no payload format; -- a **record**: a signed record a WAI tool emits and verifies (a receipt kind — - `wai.asset.provenance`, `wai.quantum.calibration`, `wai.quantum.job`, and the - delivery records `wai.video.manifest`, `wai.video.ssai`, `wai.video.keys`, - `wai.video.package` and `wai.video.channel`; and the live records `wai.live.events`, - `wai.live.room`, `wai.capture.take`, `wai.live.compose`, `wai.live.recording`, - `wai.live.metering`, `wai.live.steering`, `wai.live.moderation`, `wai.live.e2ee`, - `wai.live.watermark`, `wai.live.ads` and `wai.live.provenance`, and timed text, - `wai.text.timed`; an edge's derivation record, `wai.edge.derivation`; the origin claims of - media, `wai.media.synthesis`; AI usage preferences and consumption claims, `wai.ai.usage`; - the contribution records of media made by people and models together, - `wai.media.contribution`; and delivery settled on what its receiver signed, - `wai.delivery.settlement`), which names no payload format. +- a **record**: a signed record a WAI tool emits and verifies (a receipt kind, a + delivery record, or a record of one of the extensions this section registers; + [REGISTRY](REGISTRY.md) lists every one, kind `record`), which names no payload format. Only payload, companion and refinement capabilities have a media class, a fidelity tier, a replicate class and a role. A derivation or record string is not a payload diff --git a/wai/live-conformance/README.md b/wai/live-conformance/README.md index d6d76f863..33895b784 100644 --- a/wai/live-conformance/README.md +++ b/wai/live-conformance/README.md @@ -3,44 +3,31 @@ Conformance corpora of the live and interactive extensions, one directory per extension, and the independent verifier of each, beside it. -| directory | extension | verifier | -|---|---|---| -| [`events/`](events/) | [live-events](../extensions/live-events.md) (`wai.live.events`) | `live_events_verify.py` | -| [`rooms/`](rooms/) | [live-rooms](../extensions/live-rooms.md) (`wai.live.room`) | `live_rooms_verify.py` | -| [`takes/`](takes/) | [capture-binding](../extensions/capture-binding.md) (`wai.capture.take`) | `capture_take_verify.py` | -| [`compose/`](compose/) | [live-compose](../extensions/live-compose.md) (`wai.live.compose`) | `live_compose_verify.py` | -| [`recordings/`](recordings/) | [live-recording](../extensions/live-recording.md) (`wai.live.recording`) | `live_record_verify.py` | -| [`captions/`](captions/) | [timed-text](../extensions/timed-text.md) (`wai.text.timed`) | `timed_text_verify.py` | -| [`metering/`](metering/) | [live-metering](../extensions/live-metering.md) (`wai.live.metering`) | `live_metering_verify.py` | -| [`steering/`](steering/) | [energy-steering](../extensions/energy-steering.md) (`wai.live.steering`) | `energy_steering_verify.py` | -| [`moderation/`](moderation/) | [live-moderation](../extensions/live-moderation.md) (`wai.live.moderation`) | `live_moderation_verify.py` | -| [`ads/`](ads/) | [live-ads](../extensions/live-ads.md) (`wai.live.ads`) | `live_ads_verify.py` | -| [`e2ee/`](e2ee/) | [confidentiality](../extensions/confidentiality.md) (`wai.live.e2ee`) | `e2ee_verify.py` | -| [`watermark/`](watermark/) | [forensic-watermark](../extensions/forensic-watermark.md) (`wai.live.watermark`) | `live_watermark_verify.py` | -| [`c2pa-live/`](c2pa-live/) | [live-provenance](../extensions/live-provenance.md) (`wai.live.provenance`) | `c2pa_live_verify.py` | -| [`synthesis/`](synthesis/) | [synthesis](../extensions/synthesis.md) (`wai.media.synthesis`) | `synthesis_verify.py` | -| [`usage/`](usage/) | [ai-usage](../extensions/ai-usage.md) (`wai.ai.usage`) | `ai_usage_verify.py` | -| [`contribution/`](contribution/) | [contribution](../extensions/contribution.md) (`wai.media.contribution`) | `contribution_verify.py` | -| [`settlement/`](settlement/) | [settlement](../extensions/settlement.md) (`wai.delivery.settlement`) | `settlement_verify.py` | +| directory | extension | generator | verifier | +|---|---|---|---| +| [`events/`](events/) | [live-events](../extensions/live-events.md) (`wai.live.events`) | `wai_live_events_vectors gen` | `live_events_verify.py` | +| [`rooms/`](rooms/) | [live-rooms](../extensions/live-rooms.md) (`wai.live.room`) | `wai_live_room_vectors gen` | `live_rooms_verify.py` | +| [`takes/`](takes/) | [capture-binding](../extensions/capture-binding.md) (`wai.capture.take`) | `wai_capture_take_vectors gen` | `capture_take_verify.py` | +| [`compose/`](compose/) | [live-compose](../extensions/live-compose.md) (`wai.live.compose`) | `wai_live_compose_vectors gen` | `live_compose_verify.py` | +| [`recordings/`](recordings/) | [live-recording](../extensions/live-recording.md) (`wai.live.recording`) | `wai_live_record_vectors gen` | `live_record_verify.py` | +| [`captions/`](captions/) | [timed-text](../extensions/timed-text.md) (`wai.text.timed`) | `wai_timed_text_vectors gen` | `timed_text_verify.py` | +| [`metering/`](metering/) | [live-metering](../extensions/live-metering.md) (`wai.live.metering`) | `wai_live_metering_vectors gen` | `live_metering_verify.py` | +| [`steering/`](steering/) | [energy-steering](../extensions/energy-steering.md) (`wai.live.steering`) | `wai_energy_steering_vectors gen` | `energy_steering_verify.py` | +| [`moderation/`](moderation/) | [live-moderation](../extensions/live-moderation.md) (`wai.live.moderation`) | `wai_live_moderation_vectors gen` | `live_moderation_verify.py` | +| [`ads/`](ads/) | [live-ads](../extensions/live-ads.md) (`wai.live.ads`) | `wai_live_ads_vectors gen` | `live_ads_verify.py` | +| [`e2ee/`](e2ee/) | [confidentiality](../extensions/confidentiality.md) (`wai.live.e2ee`) | `joule_moq_e2ee_vectors gen` (joule-moq-mls) | `e2ee_verify.py` | +| [`watermark/`](watermark/) | [forensic-watermark](../extensions/forensic-watermark.md) (`wai.live.watermark`) | `wai_live_watermark_vectors gen` | `live_watermark_verify.py` | +| [`c2pa-live/`](c2pa-live/) | [live-provenance](../extensions/live-provenance.md) (`wai.live.provenance`) | `wai_live_provenance_vectors gen` | `c2pa_live_verify.py` | +| [`synthesis/`](synthesis/) | [synthesis](../extensions/synthesis.md) (`wai.media.synthesis`) | `wai_synthesis_vectors gen` | `synthesis_verify.py` | +| [`usage/`](usage/) | [ai-usage](../extensions/ai-usage.md) (`wai.ai.usage`) | `wai_ai_usage_vectors gen` | `ai_usage_verify.py` | +| [`contribution/`](contribution/) | [contribution](../extensions/contribution.md) (`wai.media.contribution`) | `wai_contribution_vectors gen` | `contribution_verify.py` | +| [`settlement/`](settlement/) | [settlement](../extensions/settlement.md) (`wai.delivery.settlement`) | `wai_settlement_vectors gen` | `settlement_verify.py` | -**Provenance.** Generated here: `wai_live_events_vectors gen` writes `events/`, -`wai_live_room_vectors gen` writes `rooms/`, `wai_capture_take_vectors gen` writes -`takes/`, `wai_live_compose_vectors gen` writes `compose/`, `wai_live_record_vectors gen` -writes `recordings/`, `wai_timed_text_vectors gen` writes `captions/` and -`wai_live_metering_vectors gen` writes `metering/`, `wai_energy_steering_vectors gen` writes -`steering/`, `wai_live_moderation_vectors gen` writes `moderation/`, -`wai_live_watermark_vectors gen` writes `watermark/`, `wai_live_ads_vectors gen` writes -`ads/`, `wai_live_provenance_vectors gen` writes `c2pa-live/`, `wai_synthesis_vectors gen` -writes `synthesis/`, `wai_ai_usage_vectors gen` writes `usage/`, -`wai_contribution_vectors gen` writes `contribution/` and `wai_settlement_vectors gen` writes -`settlement/`, each from records authored in code, from fixed seeds (`events/README.md`, -`rooms/README.md`, `takes/README.md`, `compose/README.md`, `recordings/README.md`, -`captions/README.md`, `metering/README.md`, `steering/README.md`, `moderation/README.md`, -`watermark/README.md`, `ads/README.md`, `c2pa-live/README.md`, `synthesis/README.md`, -`usage/README.md`, `contribution/README.md`, `settlement/README.md`); `c2pa-live/` cuts its media -from the packaging corpus's AV1 floor, and `contribution/` generates its pictures with -`wai.generate.spectral` and the model file of that capability's conformance vector. -`joule_moq_e2ee_vectors gen` (in +**Provenance.** Generated here: each directory's corpus is written by its row's generator +(`gen`, in `wai/wai-rs`), from records authored in code and from fixed seeds, and each +directory's README says how. `c2pa-live/` cuts its media from the packaging corpus's AV1 +floor, and `contribution/` generates its pictures with `wai.generate.spectral` and the model +file of that capability's conformance vector. `joule_moq_e2ee_vectors gen` (in `joule-code/joule-code-rs/crates/joule-moq-mls`) writes `e2ee/vectors.json` from fixed seeds, and `e2ee/` also holds the test vectors RFC 9605 and `draft-ietf-moq-secure-objects-01` publish, as printed (`e2ee/README.md`). One recorded record: `metering/relay-record.wmh` and diff --git a/wai/wai-rs/src/codecs/registry.rs b/wai/wai-rs/src/codecs/registry.rs index b88ba3170..8ad7b2440 100644 --- a/wai/wai-rs/src/codecs/registry.rs +++ b/wai/wai-rs/src/codecs/registry.rs @@ -550,11 +550,8 @@ const fn wire(name: &'static str, kind: WireKind, document: &'static str, sectio /// The wire identifiers of the container, of its two delivery bindings /// (http-delivery, moq-streaming-format), of the key discovery those bindings serve -/// (jwp-receipts §7), of packaging, of live events, of live rooms, of capture binding, of -/// live composition, of live recording, of timed text, of live metering, of energy steering, -/// of live moderation, of confidentiality, of forensic watermark sessions, of live ads, of live -/// provenance, of the deriving edge, of synthesis, of AI usage, of contribution records and of -/// delivery settlement, in document order. The export lists them sorted by name and kind. +/// (jwp-receipts §7) and of every extension that defines one: grouped by document, each +/// group in its document's order. The export lists them sorted by name and kind. pub const WIRE_IDENTIFIERS: &[WireIdentifier] = &[ wire("WAI1", WireKind::Magic, "SPEC.md", "§2", WireStatus::Defined), wire("WAI2", WireKind::Magic, "SPEC.md", "§7.1", WireStatus::Defined), diff --git a/wai/wai-rs/tests/int_kernels_vectors.rs b/wai/wai-rs/tests/int_kernels_vectors.rs index 1056ddb6a..b302a4006 100644 --- a/wai/wai-rs/tests/int_kernels_vectors.rs +++ b/wai/wai-rs/tests/int_kernels_vectors.rs @@ -224,7 +224,7 @@ fn every_decoded_output_states_a_sha256() { ("ops-conformance", "integer operators: every operator, stage and graph vector, the lower_* decodes of the sets under sets/ among them, states its output integers in full or its refusal code, never a digest of them; certificates/ states each lowered set's SHA-256 (a parameter-set identity) and holds the lowered graphs as bytes, compared byte for byte; the output digests a capability decoded through its lowering reproduces (integer-operators §14.4) are stated by that capability's own corpus"), ("signer-conformance", "key logs, grants and statuses: signed documents, no decoded output"), ("edge-conformance", "derivation records of a deriving edge: each replicate-tier output is recomputed and compared byte for byte by its verifier, and every output is named by its content hash in the record"), - ("live-conformance", "live events, rooms, takes, compositions, recordings, captions, metering, steering, moderation, watermark sessions, ads, AI usage, contribution records and settlement: signed records, commitments, packages, clips, cues and their renderings, per-hop records, ledgers and session receipts with their units and joules recomputed, steering policies and decisions with each pathway's evidence and the steering manifests recomputed byte for byte, review policies, decisions, notices and the items' timelines with each statement-of-reasons export written byte for byte, watermark tokens, session records, recovered sequences and disclosures, ad policies, breaks with their interstitial tags, events and asset lists written byte for byte and their impression receipts, usage statements with every term's preference, receipted envelopes (whose payloads are opaque test bytes no case decodes), room usage records, HTTP fields, catalogs, consumption claims and gate decisions, acknowledgements of delivery with their item lists, range proofs over objects' BLAKE3 chunk trees (whose objects are opaque test bytes no case decodes) and settlement statements with every line, amount and per-class joule total recomputed, and their verdicts, and layouts and mixes stated in full, rectangle for rectangle and sample for sample; nothing decoded against a parameter set but the contribution corpus's generated pictures, which wai.generate.spectral makes with its model file and which the corpus names, every one, by the SHA-256 of its RGB8 samples"), + ("live-conformance", "the corpora of the live, provenance and delivery extensions, one directory each (live-conformance/README.md lists its extension, generator and verifier): signed records, commitments and statements authored in code from fixed seeds and recomputed byte for byte by each corpus's verifier; payloads are opaque test bytes no case decodes, and a picture a corpus generates is named in it by the SHA-256 of its RGB8 samples; nothing decoded against a parameter set"), ("http-conformance", "objects and head proofs for transport: no case decodes a payload, and the component a fetch case picks is stated by its SHA-256"), ("cache-conformance", "cache rules: a driver, its controls and their reports, with no objects of its own"), ("byte-exact-conformance", "goldens over tests/vectors, whose sidecars state the SHA-256"),