extensions/audience-decision.md registers two route-record documents, each signed in its canonical form under its own domain. `wai.video.audience` (`wai-audience-decision`): a decider's signed decision of whether the sessions in one region may be shown a programme over a span, under the blackouts in force. Each blackout is named by the id a session class carries (http-delivery Appendix H `blackouts`) and lists its regions in rung-price §2's region codes, with the programme shown in its place. A session aggregates its own location before it leaves the session: to the one listed code that holds it, to outside, or to unresolved (no location, or a country of which only subdivisions are listed); the aggregation decides exactly what the location would. A decision whose evidence holds anything else (coordinates, a postal code, a session's identifier) or a region finer than the aggregation gives is refused `audience_location_not_aggregated`; one whose region the blackouts neither list nor hold, `audience_region_not_in_set`. The blackouts applied (every one, unresolved), the verdict (show, withhold, or alternate when all that apply name one programme) and that programme are recomputed; a session class of the programme carries the applied set as its `blackouts` and the region's country as its `geo`, and a verifier given both states the class's hash. `wai.delivery.territory` (`wai-territory`): a publisher's signed statement of where its content may be shown (everywhere, only in some regions, everywhere but some). Its latest statement stands alone; a lapsed or contradicted latest revives none. The territory (within, outside, undetermined, or unstated with its reason) is reported beside a server key's placement, which cache-authority §4.4 computes from its own inputs and no statement changes; a statement that names servers, nodes, origins, roles or may_sign is refused `territory_scopes_serving`. cache-authority §4.3 and §4.4 are unchanged; §4.4 gains a paragraph saying so. The reference is the `audience_decision` module of wai-rs (feature `audience_decision`); the corpus is live-conformance/audience/ (13 aggregations, 67 decisions, 17 classes, 39 statements, 32 territories, 10 placements), and audience_decision_verify.py is its second implementation: 178 cases agree, 21 of 21 mutated copies fail and 34 of 34 weakened verifiers are caught. Twelve faults planted in the reference each fail its tests: the evidence's extra-member check and its finer-region check, rule 6 (a region not the blackouts'), the serving-member check and `may_sign` among its members, a placement refused beside an outside territory, a decision's and a statement's signature verified without the domain, over the text as written and under the other record's domain, an unresolved session read as outside, and a lapsed statement letting an earlier one stand. Co-Authored-By: Claude Opus 5.5 <[email protected]>
2.6 KiB
live-conformance/audience — audience decisions and territories
The corpus of extensions/audience-decision.md §8, in one
file, vectors.json.
Provenance. Generated here by wai_audience_decision_vectors gen (wai-rs, feature
audience_decision), from Ed25519 keys on seeds of one byte repeated 32 times and constant
instants; no input from outside this repository. Every region is an ISO 3166-1 user-assigned code
(XA, XB, …) or a subdivision of one, and names no place.
keys names every key by its role, as 64 lowercase hexadecimal digits: the decider and another,
the publishers of the territory statements, the servers the placements place (server_c1, active
with cache/serve; server_c2, in no log; server_c3, revoked; server_c8, listed with
delivery-gap alone), the operator's key log root, and small_order, the identity point.
aggregations(§4.3) are eachblackoutsand a session'slocation(a region code ornull);outcomeis the evidence it aggregates to,regionandresolved.decisions(§4.4 to §4.6) are each a decision'stext;outcomeisread, with itsdigest,verdict,appliedandalternate, orrefuseand itsreason.classes(§4.7) are each adecision's text and a sessionclass(http-delivery Appendix H);outcomeisconsistentwith the class'ssession_class_hash, orrefusewith itsreasonand, foraudience_class_mismatch, thememberthat differs.statements(§5.2, §5.3) are each a territory statement'stext;outcomeisread, with itsdigest,publisherandshow, orrefuseand itsreason.territories(§5.4, §5.5) are eachtexts, apublisher, the receivers'region(ornull) and the instantat_us;outcome.territoryis the territory as §5.5 writes it.placements(§5.6) are each a serverkey, an instantat_ms, theheadsby origin, apublisher, aregionandtexts;outcomeis theplacementas cache-authority §4.4 writes it and theterritorybeside it.
Everything is synthetic: keys attest nothing. Each case states the outcome it was written to have, declared in the generator and never copied from a verifier.
wai_audience_decision_vectors verify and tests/audience_decision.rs check that the file
regenerates byte for byte and that wai-rs reaches every stated outcome.
../audience_decision_verify.py is the second implementation, written from the extension's text,
which also mutates copies of the corpus and drops each of its own checks in turn and requires each
to be caught.