wai.media.synthesis: origin claims for every kind of media, two marking layers, AI participants, reviews and labels #387
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/synthesis"
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
SYN: one origin claim for every kind of media WAI carries. Today WAI labels origin for captions only. This PR adds the record
wai.media.synthesis(wai/extensions/synthesis.md).Origin claim (
wai-origin). It covers an object, a group or a track. Its class is one of:captured;reconstructed: a codec, neural or not, rebuilding what was captured;assistive: an edit that does not substantially alter its input;synthesized: generated.The claim names its step (
capture,convert,assist,generate), the models the step ran and the oversight of a generation. It names each input by content hash and by the link hash of the input's own claim. The class is the greatest of the step's class and the inputs' classes, so it rises along every chain of derivations and never falls.Exports. The IPTC digital source type and the C2PA statement are pure functions of the claim. The C2PA statement is the actions plus one
c2pa.ai-disclosureper trained model, written in JCS.Assistive evidence. Two integer derivations are pinned: a 2× upscale using
int_motion's half-sample rounding, and a 3×3 binomial denoise.attestand is reported as asserted.Two marking layers (Code of Practice Sub-measures 1.1.1 and 1.1.2):
wai-markingrecord names what was embedded, and awai-detectionrecord names what a detector read. A detection that disagrees with the claim is refused, and so is a marked object in which the detector finds no mark.wai-mark:conformance, which names no algorithm, to exercise the records and the agreement check.Live rooms.
aithat names the model acting for a participant.ai_unmarked). A relay must not forward such an event.originandmodelafter their last field. Existing records keep their bytes.ai_track_unlabelled).Certified synthesis (
wai-review). A review is a signed verdict over one exact reconstruction, atdecode-equivalenceorgeneration-equivalence.noneif any float stage or post-decode alteration lies on it;Labels.
wai-label-policysays which classes are labelled and with which assets, at what interval and grace.wai-player) of presentations, labels shown, resumptions and reviews presented is checked against the policy. A label is due at first exposure, after each interruption, and within the interval.Design decisions and why
The records are standalone JSON (JCS + Ed25519 + BLAKE3 link hash), not new jwp-receipts claim classes. This follows the deriving edge's record. Adding claim classes would have meant changing the jwp claim verifier, and every jwp verifier must reject an unknown class. The encodings are jwp-receipts §2.4.3's, and the strict JSON reading is §3.1 step 1's.
A codec is a
convertstep. It names no model, asserts no source of its own, and keeps its input's class and source. Its C2PA statement isc2pa.opened+c2pa.convertedwith no digital source type. This is exactly energy-binding §6.1's position, so the neural-codec distinction is kept.Class ↔ IPTC ↔ C2PA mapping (§5, §6) agrees with timed-text §10.3 and the C2 live-provenance branch's §9:
digitalCapture/screenCapture/digitalCreation;trainedAlgorithmicMedia+fully_autonomous;compositeWithTrainedAlgorithmicMedia+human_validated(C2PA 2.4 §18.28.3's pairing);compositeCapture/compositeSynthetic/composite.I messaged the C2 builder. Captions'
originmaps onto these classes (§1).The second layer must be a watermark. I read the Code itself. Measure 1.1 asks for two layers, 1.1.1 (signed metadata) and 1.1.2 (an imperceptible watermark), and Sub-measure 1.1.3 says fingerprinting and logging are never sufficient alone. So a content-bound commitment (a reconstruction binding) is a supplement here, not the second layer. The payload points at the claim, but I do not claim it is the Measure 3.4(c)(ii) signpost, which names the detection solution.
The "synthesized object labelled captured" check is evidential.
GenerativeDeterministic/Behavioral, orintent: create) cannot carry a non-generateclaim (class_understated).class_mismatch).layers_disagree).The AI participant marker is a grant attribute, not a new power bit. Attributes are signed with the grant and need no layout change; powers mean capabilities. The room verifier enforces it in step 6 of §9.2.
D1 coordination. Done by reading the branch only, no edits. My
recordmember carries D1's derivation-record hash. D1 switched its rising labels to my step namesassist/generate, so the spellings must stay. D1's record does not yet list awai-originamong its provenance items; that is a follow-up once both land. I do not linkderiving-edge.md, so check-spec-refs stays green on both branches.Primary sources verified
Checks
cargo test --no-default-features --features synthesis --lib synthesis::(build host)cargo test --no-default-features --features synthesis --test synthesisReason::ALL, §10.2 =EU_ICONSwai_synthesis_vectors verify ../live-conformance/synthesis--features live_events --lib live_events::/--test live_events--features live_room --lib live_room::/--test live_room--testlive_moderation, live_ads, live_metering, energy_steering, timed_text, live_watermark, live_compose, live_record, capture_take--no-default-features --lib codecs::registry(wire identifiers in their sections)wai registry exportthen--check--all-targetsonsynthesis+ live featurescargo test --locked, clippy, wasm32 checkcargo check --locked --all-targetscargo metadata --locked --offlineon all 9 lockfiles withwailive-conformance/*_verify.py(-I), including the newsynthesis_verify.pycheck-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.pyFalsifications (committed first, restored after)
Rust. Each rule was disabled in turn on the build host:
Each time the generator's intent assertion fires (exit 101), and
tests/synthesis.rs every_case_gets_its_stated_outcomeFAILS, naming the vector. Without the AI rule,tests/live_room.rsFAILS.Python. The same checks, plus the upscale rounding and the signature check, were disabled one at a time in a copy of
synthesis_verify.py. Each run exits 1, naming the vector.One real finding. The first corpus's reconstruction cleared the low 3 bits, so every pair sum was even and a changed upscale rounding went uncaught. The corpus now quantises to multiples of 3, and the falsification is caught.
synthesis_verify.pyalso mutates the corpus 17 ways. Each mutated copy fails.What is NOT done
public.machine-generatedwriter (§6 states a SHOULD only).ai_unmarkedevents or unlabelled AI tracks) are normative text only.🤖 Generated with Claude Code