wai.ai.usage: AI usage preferences bound to the bytes, and the agent's consumption claim (AG1) #386
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/ai-usage"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What this is
wai.ai.usage(AG1): AI usage preferences for media, bound to the bytes they govern, and the signed statement of an agent that consumed media.Extension
wai/extensions/ai-usage.md. A usage statement carries three published vocabularies verbatim, each in its own member, with no WAI category and no mapping between them:aipref: a statement of preference ofdraft-ietf-aipref-vocab-08in its Structured Field form (train-ai,ai-use,search);tdmrep: the TDM Reservation Protocol'stdm-reservationandtdm-policy(Final Community Group Report, 10 May 2024, the latest);cawg: the entries of acawg.training-miningassertion (Training and Data Mining Assertion 1.1, ratified 16 May 2025, current).Carriage.
ai_usage. The receipt's content hash covers it, so the group receipt signs it with the content; a stripped or altered statement fails the receipt (usage_unbound).WAU1, signed by the authority and chained by effective instant (live-rooms §3.8).ai_usageholds one principal's terms (live-rooms §4.4).draft-ietf-aipref-attach-05'sContent-Usageand the TDMRep fields from the signed statement.wai_ai_usage(moq-streaming-format §4).One precedence rule (§5). A grant's terms decide first. Then the signed statements, the most restrictive governing (the vocabulary's own §5.1 combining rule). Unsigned statements count only where nothing is signed. A field or catalog that contradicts the signed statement is refused (
header_conflicts,catalog_conflicts), and the signed statement governs.Consumption claim (§6). This is the jwp-receipts claim class
consumption(§2.4.13, its step 4 and step 6 reasons in §3.1, its authority in §7.5). The agent signs it under itsdid:key, and it names:nullfor a use outside it);It is checked against the objects, their statements and the room. A use the statements disallow is refused
usage_disallowed; that refusal is of the use, never of the signature.Gate (§7). A relay or gateway MAY require claims before serving an agent. It has two policy knobs:
window: 0 means claim before fetch (HTTP); n means claim within n groups (MOQT);require_allowed.The proposed request field
WAI-Usage-Claimcarries a claim over HTTP.Reference:
wai-rsfeatureai_usage:src/ai_usage.rs, with RFC 9651's Dictionary parser written insrc/ai_usage/sf.rs;src/claim_receipt/consumption.rs;http_binding::receiptsstep 6 refuses a consumption claim served beside an object (context_not_held), because its context is the whole set of objects.Corpus
wai/live-conformance/usage/vectors.json(generatorwai_ai_usage_vectors, testtests/ai_usage.rs). It covers:WAI2among them);Every reason of §9 appears. The negative controls asked for, with their codes:
feature_stripped,usage_unbound;aipref_contradicts,tdm_contradicts,tdm_policy_contradicts, allheader_conflicts;training_forbidden,mining_constrainedandroom_training_unlicensed, allusage_disallowed;room_own_and_room, own statement allows and room disallows,usage_disallowed;wrong_digests,consumption_object_unknown;bad_signature,signature_verify_failedat step 3.Second implementation
wai/live-conformance/ai_usage_verify.py. It is written from the text and shares no code withwai-rs:live_rooms_verify.py;claim-conformance;-I, standard library only.claim-conformance/claim_verify.pyalso learns the class, steps 1 to 4, with aconsumptionmode run in CI.Registry:
wai.ai.usage,WAU1,wai_ai_usage,WAI-Usage-Claim(proposed). Export regenerated. Also SPEC §5 paragraph, CHANGELOG, CI step and path trigger.Decisions the reviewer should know
draft-ietf-aipref-vocab-08(14 Sep 2026) anddraft-ietf-aipref-attach-05(19 Aug 2026): both WG documents, intended Proposed Standard, IESG state "I-D Exists", so not yet submitted. The vocab marks its §3 and §4 as without consensus.usage_revision_unknown, failing closed; a later revision of this extension adds revisions.WRD1has no extension point. Its readers includejoule-moq-ingestand every live verifier, so a version bump would have rippled across them. The room's preference is a separate authority-signed record bound to the room id and chained like live-moderation's review policy. That also lets the preference change at an instant without reaching earlier objects (draft-ietf-aipref-attach-05§3.3's rule). live-rooms §3.8 says this.usage_unanswered), each in its own terms. The most restrictive answer governs. This closes picking the most permissive vocabulary without inventing an equivalence table.constrainedreads as disallow absent a grant, per the assertion's §3.1. The CDDL member isconstraint_info; the assertion's prose spells itconstraints_info, and §3.4 notes it.http_binding/receipts.rschanged, which fireswai-http's falsify shards. The new arm sits so that every committed*.patchstill applies (git apply --checkover all of them: 0 fail).Checks
All cargo runs went through
rbon the build host.cargo test --locked --no-default-features --features ai_usage --lib ai_usage::cargo test --locked --no-default-features --features ai_usage --lib claim_receipt::cargo test --locked --no-default-features --features ai_usage --test ai_usagehttp_binding,codecs::registry,staged::moq)cargo test --locked --lib --no-default-features --features world,audio_scene,haptic,splat4d,score,provenance,neural_int,film,oer,receipt_claims,key_discovery,staged,video_int,audio_int,splat_int,stage_measure,telemetry,video_package,httpcargo test --locked --no-default-features --features neural_int,video_int,audio_int,world_int,splat_int --test int_kernels_vectors every_decoded_outputcargo test --locked --no-default-features --lib codecs::registry;wai registry export --checkwai_ai_usage_vectors verify ../live-conformance/usagecargo clippy --locked --no-default-features --features ai_usage,http --all-targetspython3 -I live-conformance/ai_usage_verify.py live-conformance/usagepython3 -I claim-conformance/claim_verify.py consumption live-conformance/usage/vectors.jsonpython3 -I claim-conformance/claim_verify.pylive_rooms_verify.py rooms,live_moderation_verify.py moderation,live_ads_verify.py ads,jwp_verify.py,http_verify.py http-conformancecheck-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.pygit apply --checkover every committed*.patchcheck-public-names.shwas not run: its pattern list is a CI secret.Falsifications
Each was applied uncommitted, run, then restored, with a clean tree after.
cargo test --test ai_usage every_case. Every one fails, naming these cases:training_forbidden,mining_constrained,room_training_unlicensed,room_own_and_room, gatesclaim_ahead_disallowed,room_agent_disallowed;feature_stripped,feature_altered,wrong_digests;did:keyrule dropped:signer_not_principal;aipref_contradicts,aipref_drops_a_label;room_terms_lift,room_untimed,room_licensed_training;aipref_trailing_comma.the_extension_lists_the_reasonsfails;ai_usage_verify.pyexits 1 (§9 read from the extension: 20 reasons).consumptionmode fails onseen_unordered.Not done
draft-jennings-agentproto-mcp-over-moqt-00, 6 Jul 2026, individual, verified at the datatracker) is not in this PR. §1 lists the agent protocols as out of scope for this revision.claim-conformance/.claim_verify.pyreads them through its newconsumptionmode.🤖 Generated with Claude Code