wai.telemetry.aggregate: QoE the operator can sum but cannot take apart (DAP + Prio3, signed aggregates) (TEL) #429

Closed
dcharlot wants to merge 0 commits from wai/telemetry-aggregate into main
Owner

wai.telemetry.aggregate: quality of experience the service receives only as sums (TEL)

What is in it

  • wai/extensions/telemetry-aggregation.md (new, registers the record wai.telemetry.aggregate):
    • §3 measures: four, over delivery-telemetry §7.2's session metrics: outcomes (Prio3SumVec, length 4, max 1), stalls (Prio3Sum, max 65535), durations (Prio3SumVec, length 3, max 2^32 − 1) and start_time (Prio3Histogram, 8 buckets). Clamp rule. The range proof is the VDAF's own.
    • §4 the DAP task: WAI's layout of DAP's task_info (label, measure, scope = 0 or a room id, salt, the leader's, helper's and collector's Ed25519 keys). The task id is SHA-256 over the TaskConfiguration. Rules: time-interval mode only, the measure's VDAF and Appendix B configuration, min_batch_size ≥ 50 (floor_too_low), two distinct aggregator keys (aggregator_alone).
    • §5 the roles as DAP-20 defines them: the sink shards and HPKE-encrypts per DAP §4.4.2.1. The aggregators run §4.5/§4.6 unchanged, so an out-of-range measurement fails both (vdaf_verify_error). Each refuses to release a share of a batch below the minimum (invalidBatchSize); the helper also refuses batchMismatch and batchOverlap.
    • §6 WQS1: the statement each aggregator signs of its share, binding the task, the collection, the batch, the count and the checksum. It is sealed to the collector with HPKE.
    • §7 WQA1: the collector's aggregate receipt (task, collection, interval, both statements, result).
    • §8 verification in 11 ordered steps.
    • §9 where DAP replaces delivery-telemetry §8.4's suppression, and where §8.4 still applies: Request-mode reports, Event-mode reports consumed live, and figures no measure aggregates. A room's cell (live-metering §4.7) comes from its outcomes/stalls/durations receipts.
    • §10 what a report reveals (no consent gate; a lawful basis is a lawful-basis claim).
    • §11 the reasons table, §12 conformance, §13 security.
  • delivery-telemetry.md:
    • §3.4: every CMCD key the mapping writes is classed delivery or measurement, with what it reveals and in which mode it is reported. The class is not a permission.
    • §4.3: delivery-only Request mode, with measurement_key_in_delivery for a report that breaks it.
    • §8.1 is restated as facts with no consent gate; §8.4 points to aggregation; §9.4 points to the corpus.
  • live-metering.md: §4.7 and a new §6.5: a room may aggregate its QoE instead of sending logs. The WMR1 receipt then names no logs and its cell is suppressed, as §4.7 already requires, and the room's cell comes from the aggregate receipts. The WMR1 layout is unchanged.
  • wai-rs, feature telemetry_aggregate:
    • field, xof, flp, prio3: Prio3Count/Sum/SumVec/Histogram written from draft-irtf-cfrg-vdaf-22. Field64 and Field128 (wide multiply and a three-step fold for Field128), TurboSHAKE128 checked against the RFC 9861 vectors, XofTurboShake128, the FLP in the Lagrange basis, sharding, verification, aggregation, unsharding and the ping-pong messages.
    • vdaf_vectors runs the draft's published test vectors.
    • hpke: RFC 9180 base mode, checked against A.1.1.
    • dap: DAP-20 messages.
    • aggregator: a reference client, leader, helper and collector, run in the corpus generator and the tests.
    • measure and receipt: the task rules, WQS1/WQA1, verification and the cell.
    • telemetry::cmcd: key_class, the delivery-only encoder and its check.
    • bin wai_telemetry_aggregate_vectors gen|verify; tests/telemetry_aggregate.rs.
  • Corpus wai/live-conformance/aggregate/:
    • vdaf-22/: the draft's Prio3 and XofTurboShake128 vectors as published at the commit its [TestVectors] reference names.
    • vectors.json, from fixed seeds: 50 sessions and four flows, each with its upload, aggregation job request and response, the refusals, the collection, the sealed statements, the result and the receipt.
    • 30 receipts: the 4 accepted ones and 26 single-defect controls.
    • 2 cells, and 7 delivery-only cases.
    • The required negatives are all present:
      • an out-of-range measurement whose proof fails, in every flow;
      • a batch below the minimum, refused by the leader and by the helper (invalidBatchSize) and by a reader (batch_too_small);
      • an aggregate whose parameters do not match the reports (signed_for_a_task_the_reports_were_not_uploaded_to, reports_of_another_batch, a_report_withheld → batch_mismatch);
      • a single aggregator claiming the result (leader_alone, leader_signs_both, task_names_one_aggregator → aggregator_alone);
      • a measurement key served as delivery (measurement_key_in_delivery).
  • wai/live-conformance/telemetry_aggregate_verify.py: an independent verifier, standard library only, run with -I. It is written from the extension text and the drafts:
    • its own Keccak-p[1600,12], TurboSHAKE128, fields, FLP and Prio3; it passes the draft's vectors;
    • its own X25519, HKDF, AES-128-GCM and HPKE;
    • it re-runs every flow from its reports with the test keys: it recombines each measurement and requires it to be its session's, and requires the aggregation job request and response byte for byte. It recomputes the buckets, every refusal and the collection;
    • it verifies receipts and cells with _ed25519.py;
    • it reads the key classes from delivery-telemetry §3.4 and the reasons from §11;
    • 25 mutations, each caught; 19 weakened verifiers, each caught by the corpus.
  • The rest:
    • CI: a step in wai-conformance.yml, with both extension texts in its paths:.
    • REGISTRY.md, the registry export, WQS1/WQA1 as wire identifiers, a SPEC §5 paragraph and a CHANGELOG entry.
    • The live-conformance README row with its generator column, and the int_kernels_vectors.rs live-conformance exclusion reason now names the vendored vectors.

Design decisions, and why

  • A new extension, not an amendment. DAP tasks, two signed record formats and a verifier are a record family of their own. delivery-telemetry gets the key classes and delivery-only mode; live-metering gets the room option. The WMR1 layout stays unchanged.
  • No consent or recorded-basis gate (owner rule). The key classes state facts: what each key reveals and to whom. delivery-telemetry §8.1's old "without the person's agreement" sentence conflicted with that rule, and with sending shares to a helper run by another party, so it is restated as facts plus the lawful-basis claim.
  • DAP used as written, nothing registered. WAI's binding lives in task_info, which DAP leaves to deployments. It enters every input share's and aggregate share's AAD, so a report is bound at upload to its measure, its scope and the three keys. No new DAP codepoint was needed. The task id is derived (DAP §8.6.1 allows it); the salt keeps it unpredictable.
  • Statements carry the plaintext aggregate share and travel sealed to the collector. A reader can recompute the result from two signed shares. The leader that relays the helper's statement learns nothing, so DAP's property that the leader does not learn the result is kept.
  • Floor enforced by the aggregators. min_batch_size ≥ 50 is a task rule; each aggregator refuses a smaller batch, and a reader refuses a receipt below it. A below-minimum result therefore needs both aggregators to misbehave.
  • Time-interval batch mode only. In leader-selected mode the leader composes the batch (DAP §8.2).
  • VDAFs implemented, not imported. No maintained Rust crate tracks VDAF-22's wire format: draft-18 moved the FLP to the Lagrange basis, a wire-breaking change. The only established crate is MPL-2.0 and large. Small permissive primitives were taken behind the feature instead: keccak 0.1.6 (Keccak-p[1600, 12]), aes-gcm 0.10.3 and hkdf 0.12.4, all RustCrypto under Apache-2.0 OR MIT. X25519 uses the existing optional curve25519-dalek. The lockfile only gains entries (checked); re-resolution had also changed two existing windows-sys/getrandom edges, and those changes were removed.
  • Prio3Count is implemented and vector-checked but no measure uses it. Prio3MultihotCountVec, Poplar1 and the draft's non-normative HigherDegree and SumVecWithMultiproof vectors are not implemented.
  • Corpus size. vectors.json is about 0.9 MB, mostly the durations flow's 32-bit SumVec shares. Every accepted batch must hold ≥ 50 reports, so the size follows from the floor. The Python verifier takes about 40 s, including mutations, because results are memoized per part.

Checks (exact commands, all passing)

check command result
module unit tests cargo test --locked --no-default-features --features telemetry_aggregate --lib -- telemetry_aggregate:: telemetry:: (rb) 23 passed
integration test cargo test --locked --no-default-features --features telemetry_aggregate --test telemetry_aggregate (rb) 6 passed
corpus tool cargo run --no-default-features --features telemetry_aggregate --bin wai_telemetry_aggregate_vectors -- verify ../live-conformance/aggregate (rb) 3 × PASS
independent verifier python3 -I live-conformance/telemetry_aggregate_verify.py live-conformance/aggregate exit 0 (57 PASS lines: self-tests, vectors, 4 flows, receipts/cells/delivery-only, 25 mutations, 19 weakened verifiers)
registry cargo test --locked --no-default-features --lib codecs::registry; cargo run --no-default-features --bin wai -- registry export --check (rb) 14 passed; up to date
provenance, CLI cargo test --locked --no-default-features --test carriage --test manifest_builders --test cli_wrap_intent --test cli_registry --test corpus_provenance (rb) all passed
sha256 rule cargo test --locked --no-default-features --features neural_int,video_int,audio_int,world_int,splat_int,generate,score,staged,stage_measure,legacy_int,i32_forms --test int_kernels_vectors every_decoded_output (rb) passed
touched neighbours wai_telemetry verify ../telemetry-conformance; cargo test --features live_metering --test live_metering; cargo test --features telemetry --lib telemetry::; wasm32 build of telemetry (rb) all pass
other verifiers live_metering_verify.py metering, energy_steering_verify.py steering, settlement_verify.py settlement, live_rooms_verify.py rooms, claim_verify.py claim-conformance/vectors.json exit 0
clippy cargo clippy --locked --no-default-features --features telemetry_aggregate --all-targets (rb) no notes in new code (the one left on telemetry/cmcd.rs:86, members' signature, is on main)
dependents cargo build --locked in wai/wai-relay, wai/wai-pack, wai/wai-live-web (rb) build
lockfiles cargo metadata --locked --offline in each of the 10 lockfiles that contain wai (rb) all OK
repo checks check-tests-in-ci.py, check-workflow-concurrency.sh, check-spec-refs.py, check-wai-section-refs.py, check-no-vanity-metrics.sh, test-public-text-checks.sh, check-comparative-prose.sh, check-orphan-sources.py all exit 0
public names check-public-names.sh with the private denylist on every changed file and the vendored vectors; commit messages with grep -E clean

Falsifications (committed state, each restored)

  • Draft vectors: a changed agg_result and a flipped verifier share → the_drafts_prio3_vectors_pass fails (exit 101).
  • Dropping the receipt floor check (§8.1 step 9) → batch_below_the_minimum is accepted, so the tests fail.
  • An aggregator that skips the range proof → the draft vectors and the corpus fail.
  • A helper that ignores the minimum batch size → the generator's refusal assert fails.
  • Reclassing sid as delivery in delivery-telemetry §3.4 → delivery_telemetry_classes_the_keys_the_reference_does fails.
  • Python: a refused receipt restated as accepted in a copy of the corpus → exit 1. Its built-in 25 mutations and 19 weakened-check runs are each caught.

Not done

  • No aggregators in production and no contact with anyone (out of scope).
  • The live-metering room-session receipt (WMR1) does not name the room's aggregate receipts by digest. Binding them would need a WMR1 version 2; today the link is the room id in the tasks' scope.
  • How a sealed statement travels beside DAP's messages is left to the deployment (§6.3).
  • No client authentication, anonymizing proxy or differential privacy; these are pointed to DAP §8.

🤖 Generated with Claude Code


Closed: landed on main through merge train C (#461, e0ac15f5); this PR's head is an ancestor of main.

## wai.telemetry.aggregate: quality of experience the service receives only as sums (TEL) ### What is in it - **`wai/extensions/telemetry-aggregation.md`** (new, registers the record `wai.telemetry.aggregate`): - **§3 measures**: four, over delivery-telemetry §7.2's session metrics: `outcomes` (Prio3SumVec, length 4, max 1), `stalls` (Prio3Sum, max 65535), `durations` (Prio3SumVec, length 3, max 2^32 − 1) and `start_time` (Prio3Histogram, 8 buckets). Clamp rule. The range proof is the VDAF's own. - **§4 the DAP task**: WAI's layout of DAP's `task_info` (label, measure, scope = 0 or a room id, salt, the leader's, helper's and collector's Ed25519 keys). The task id is SHA-256 over the TaskConfiguration. Rules: time-interval mode only, the measure's VDAF and Appendix B configuration, `min_batch_size` ≥ 50 (`floor_too_low`), two distinct aggregator keys (`aggregator_alone`). - **§5** the roles as DAP-20 defines them: the sink shards and HPKE-encrypts per DAP §4.4.2.1. The aggregators run §4.5/§4.6 unchanged, so an out-of-range measurement fails both (`vdaf_verify_error`). Each refuses to release a share of a batch below the minimum (`invalidBatchSize`); the helper also refuses `batchMismatch` and `batchOverlap`. - **§6 `WQS1`**: the statement each aggregator signs of its share, binding the task, the collection, the batch, the count and the checksum. It is sealed to the collector with HPKE. - **§7 `WQA1`**: the collector's aggregate receipt (task, collection, interval, both statements, result). - **§8** verification in 11 ordered steps. - **§9** where DAP replaces delivery-telemetry §8.4's suppression, and where §8.4 still applies: Request-mode reports, Event-mode reports consumed live, and figures no measure aggregates. A room's cell (live-metering §4.7) comes from its `outcomes`/`stalls`/`durations` receipts. - **§10** what a report reveals (no consent gate; a lawful basis is a `lawful-basis` claim). - **§11** the reasons table, **§12** conformance, **§13** security. - **`delivery-telemetry.md`**: - **§3.4**: every CMCD key the mapping writes is classed `delivery` or `measurement`, with what it reveals and in which mode it is reported. The class is not a permission. - **§4.3**: delivery-only Request mode, with `measurement_key_in_delivery` for a report that breaks it. - **§8.1** is restated as facts with no consent gate; **§8.4** points to aggregation; **§9.4** points to the corpus. - **`live-metering.md`**: §4.7 and a new **§6.5**: a room may aggregate its QoE instead of sending logs. The WMR1 receipt then names no logs and its cell is suppressed, as §4.7 already requires, and the room's cell comes from the aggregate receipts. The WMR1 layout is unchanged. - **`wai-rs`, feature `telemetry_aggregate`**: - `field`, `xof`, `flp`, `prio3`: Prio3Count/Sum/SumVec/Histogram written from `draft-irtf-cfrg-vdaf-22`. Field64 and Field128 (wide multiply and a three-step fold for Field128), TurboSHAKE128 checked against the RFC 9861 vectors, XofTurboShake128, the FLP in the Lagrange basis, sharding, verification, aggregation, unsharding and the ping-pong messages. - `vdaf_vectors` runs the draft's published test vectors. - `hpke`: RFC 9180 base mode, checked against A.1.1. - `dap`: DAP-20 messages. - `aggregator`: a reference client, leader, helper and collector, run in the corpus generator and the tests. - `measure` and `receipt`: the task rules, WQS1/WQA1, verification and the cell. - `telemetry::cmcd`: `key_class`, the delivery-only encoder and its check. - bin `wai_telemetry_aggregate_vectors gen|verify`; `tests/telemetry_aggregate.rs`. - **Corpus `wai/live-conformance/aggregate/`**: - `vdaf-22/`: the draft's Prio3 and XofTurboShake128 vectors as published at the commit its [TestVectors] reference names. - `vectors.json`, from fixed seeds: 50 sessions and four flows, each with its upload, aggregation job request and response, the refusals, the collection, the sealed statements, the result and the receipt. - 30 receipts: the 4 accepted ones and 26 single-defect controls. - 2 cells, and 7 delivery-only cases. - The required negatives are all present: - an out-of-range measurement whose proof fails, in every flow; - a batch below the minimum, refused by the leader and by the helper (`invalidBatchSize`) and by a reader (`batch_too_small`); - an aggregate whose parameters do not match the reports (`signed_for_a_task_the_reports_were_not_uploaded_to`, `reports_of_another_batch`, `a_report_withheld` → `batch_mismatch`); - a single aggregator claiming the result (`leader_alone`, `leader_signs_both`, `task_names_one_aggregator` → `aggregator_alone`); - a measurement key served as delivery (`measurement_key_in_delivery`). - **`wai/live-conformance/telemetry_aggregate_verify.py`**: an independent verifier, standard library only, run with `-I`. It is written from the extension text and the drafts: - its own Keccak-p[1600,12], TurboSHAKE128, fields, FLP and Prio3; it passes the draft's vectors; - its own X25519, HKDF, AES-128-GCM and HPKE; - it re-runs every flow from its reports with the test keys: it recombines each measurement and requires it to be its session's, and requires the aggregation job request and response byte for byte. It recomputes the buckets, every refusal and the collection; - it verifies receipts and cells with `_ed25519.py`; - it reads the key classes from delivery-telemetry §3.4 and the reasons from §11; - 25 mutations, each caught; 19 weakened verifiers, each caught by the corpus. - **The rest**: - CI: a step in `wai-conformance.yml`, with both extension texts in its `paths:`. - `REGISTRY.md`, the registry export, `WQS1`/`WQA1` as wire identifiers, a SPEC §5 paragraph and a CHANGELOG entry. - The live-conformance README row with its generator column, and the `int_kernels_vectors.rs` live-conformance exclusion reason now names the vendored vectors. ### Design decisions, and why - **A new extension, not an amendment.** DAP tasks, two signed record formats and a verifier are a record family of their own. delivery-telemetry gets the key classes and delivery-only mode; live-metering gets the room option. The WMR1 layout stays unchanged. - **No consent or recorded-basis gate** (owner rule). The key classes state facts: what each key reveals and to whom. delivery-telemetry §8.1's old "without the person's agreement" sentence conflicted with that rule, and with sending shares to a helper run by another party, so it is restated as facts plus the `lawful-basis` claim. - **DAP used as written, nothing registered.** WAI's binding lives in `task_info`, which DAP leaves to deployments. It enters every input share's and aggregate share's AAD, so a report is bound at upload to its measure, its scope and the three keys. No new DAP codepoint was needed. The task id is derived (DAP §8.6.1 allows it); the salt keeps it unpredictable. - **Statements carry the plaintext aggregate share and travel sealed to the collector.** A reader can recompute the result from two signed shares. The leader that relays the helper's statement learns nothing, so DAP's property that the leader does not learn the result is kept. - **Floor enforced by the aggregators.** `min_batch_size` ≥ 50 is a task rule; each aggregator refuses a smaller batch, and a reader refuses a receipt below it. A below-minimum result therefore needs both aggregators to misbehave. - **Time-interval batch mode only.** In leader-selected mode the leader composes the batch (DAP §8.2). - **VDAFs implemented, not imported.** No maintained Rust crate tracks VDAF-22's wire format: draft-18 moved the FLP to the Lagrange basis, a wire-breaking change. The only established crate is MPL-2.0 and large. Small permissive primitives were taken behind the feature instead: `keccak` 0.1.6 (Keccak-p[1600, 12]), `aes-gcm` 0.10.3 and `hkdf` 0.12.4, all RustCrypto under Apache-2.0 OR MIT. X25519 uses the existing optional `curve25519-dalek`. The lockfile only gains entries (checked); re-resolution had also changed two existing windows-sys/getrandom edges, and those changes were removed. - **Prio3Count is implemented and vector-checked** but no measure uses it. `Prio3MultihotCountVec`, `Poplar1` and the draft's non-normative `HigherDegree` and `SumVecWithMultiproof` vectors are not implemented. - **Corpus size.** `vectors.json` is about 0.9 MB, mostly the `durations` flow's 32-bit SumVec shares. Every accepted batch must hold ≥ 50 reports, so the size follows from the floor. The Python verifier takes about 40 s, including mutations, because results are memoized per part. ### Checks (exact commands, all passing) | check | command | result | |---|---|---| | module unit tests | `cargo test --locked --no-default-features --features telemetry_aggregate --lib -- telemetry_aggregate:: telemetry::` (rb) | 23 passed | | integration test | `cargo test --locked --no-default-features --features telemetry_aggregate --test telemetry_aggregate` (rb) | 6 passed | | corpus tool | `cargo run --no-default-features --features telemetry_aggregate --bin wai_telemetry_aggregate_vectors -- verify ../live-conformance/aggregate` (rb) | 3 × PASS | | independent verifier | `python3 -I live-conformance/telemetry_aggregate_verify.py live-conformance/aggregate` | exit 0 (57 PASS lines: self-tests, vectors, 4 flows, receipts/cells/delivery-only, 25 mutations, 19 weakened verifiers) | | registry | `cargo test --locked --no-default-features --lib codecs::registry`; `cargo run --no-default-features --bin wai -- registry export --check` (rb) | 14 passed; up to date | | provenance, CLI | `cargo test --locked --no-default-features --test carriage --test manifest_builders --test cli_wrap_intent --test cli_registry --test corpus_provenance` (rb) | all passed | | sha256 rule | `cargo test --locked --no-default-features --features neural_int,video_int,audio_int,world_int,splat_int,generate,score,staged,stage_measure,legacy_int,i32_forms --test int_kernels_vectors every_decoded_output` (rb) | passed | | touched neighbours | `wai_telemetry verify ../telemetry-conformance`; `cargo test --features live_metering --test live_metering`; `cargo test --features telemetry --lib telemetry::`; wasm32 build of `telemetry` (rb) | all pass | | other verifiers | `live_metering_verify.py metering`, `energy_steering_verify.py steering`, `settlement_verify.py settlement`, `live_rooms_verify.py rooms`, `claim_verify.py claim-conformance/vectors.json` | exit 0 | | clippy | `cargo clippy --locked --no-default-features --features telemetry_aggregate --all-targets` (rb) | no notes in new code (the one left on `telemetry/cmcd.rs:86`, `members`' signature, is on main) | | dependents | `cargo build --locked` in `wai/wai-relay`, `wai/wai-pack`, `wai/wai-live-web` (rb) | build | | lockfiles | `cargo metadata --locked --offline` in each of the 10 lockfiles that contain `wai` (rb) | all OK | | repo checks | `check-tests-in-ci.py`, `check-workflow-concurrency.sh`, `check-spec-refs.py`, `check-wai-section-refs.py`, `check-no-vanity-metrics.sh`, `test-public-text-checks.sh`, `check-comparative-prose.sh`, `check-orphan-sources.py` | all exit 0 | | public names | `check-public-names.sh` with the private denylist on every changed file and the vendored vectors; commit messages with `grep -E` | clean | ### Falsifications (committed state, each restored) - Draft vectors: a changed `agg_result` and a flipped verifier share → `the_drafts_prio3_vectors_pass` fails (exit 101). - Dropping the receipt floor check (§8.1 step 9) → `batch_below_the_minimum` is accepted, so the tests fail. - An aggregator that skips the range proof → the draft vectors and the corpus fail. - A helper that ignores the minimum batch size → the generator's refusal assert fails. - Reclassing `sid` as `delivery` in delivery-telemetry §3.4 → `delivery_telemetry_classes_the_keys_the_reference_does` fails. - Python: a refused receipt restated as accepted in a copy of the corpus → exit 1. Its built-in 25 mutations and 19 weakened-check runs are each caught. ### Not done - No aggregators in production and no contact with anyone (out of scope). - The live-metering room-session receipt (`WMR1`) does not name the room's aggregate receipts by digest. Binding them would need a WMR1 version 2; today the link is the room id in the tasks' scope. - How a sealed statement travels beside DAP's messages is left to the deployment (§6.3). - No client authentication, anonymizing proxy or differential privacy; these are pointed to DAP §8. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- **Closed:** landed on main through merge train C (#461, e0ac15f5); this PR's head is an ancestor of main.
Fields, TurboSHAKE128 (RFC 9861 vectors) and XofTurboShake128, the FLP in the
Lagrange basis, sharding, verification, aggregation, unsharding and the
ping-pong messages; the draft's published Prio3 vectors (commit 888e4b1)
vendored under live-conformance/aggregate/vdaf-22/ and run by
tests/telemetry_aggregate.rs. New dependencies behind the feature: keccak,
aes-gcm, hkdf (RustCrypto, Apache-2.0 OR MIT); the lockfile only gains entries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
extensions/telemetry-aggregation.md: four measures over session metrics
(Prio3SumVec, Prio3Sum, Prio3Histogram), the DAP task's task_info layout and
id, the floor of fifty reports each aggregator enforces, the WQS1 statement
each aggregator signs, the WQA1 receipt the collector signs, verification,
and a room's cell. delivery-telemetry: a class and what it reveals for every
CMCD key the mapping writes (§3.4), delivery-only Request mode (§4.3), §8.1
stated as facts with no consent gate, §8.4 pointing to aggregation.
live-metering §4.7/§6.5: a room may aggregate its QoE instead of sending logs.

wai-rs: HPKE base mode (RFC 9180 A.1.1), DAP-20 messages, a reference
client, leader, helper and collector, the receipt verifier, and the corpus
generator; live-conformance/aggregate/vectors.json from fixed seeds.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Written from the extension's text and the drafts it cites, sharing no code
with wai-rs: Keccak-p[1600,12], TurboSHAKE128 and the VDAF XOF; Field64 and
Field128, the Lagrange-basis FLP and Prio3 (passing the draft's vectors);
X25519, HKDF, AES-128-GCM and HPKE (RFC 9180 A.1.1); every flow re-run from
its reports with the test keys, byte for byte; receipts and cells in §8.1's
order; delivery-telemetry §3.4's classes read from the text. Every mutated
copy of the corpus fails and every weakened verifier fails the corpus.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The record and its magics (WQS1, WQA1) in the registry and its export; a SPEC
§5 paragraph; the live-conformance table's row with its generator; the
corpus exclusion's reason names the vendored VDAF vectors; a CI step runs the
module's tests, tests/telemetry_aggregate.rs and the independent verifier,
with both extension texts in the workflow's paths. A unit test of the
delivery-only Request mode.

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]>
telemetry-aggregation: a configuration that does not read is task_invalid; plainer §3.2
Some checks failed
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (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 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 energy receipts / does this change touch it (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 conformance / does this change touch it (pull_request) Has been cancelled
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
standards workspaces build + test / which workspaces this change touches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
repository checks / lockfiles, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Has been cancelled
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (pull_request) Has been cancelled
8a853e4347
Co-Authored-By: Claude Opus 5.5 <[email protected]>
dcharlot closed this pull request 2026-10-25 23:51:12 -04:00
Some checks failed
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
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 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-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 studio and desktop / does this change touch it (pull_request) Has been cancelled
wai-quantum studio and desktop / studio · browser (pull_request) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (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-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (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 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 energy receipts / does this change touch it (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 conformance / does this change touch it (pull_request) Has been cancelled
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
standards workspaces build + test / which workspaces this change touches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
repository checks / lockfiles, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Has been cancelled
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (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!429
No description provided.