wai.media.contribution: who contributed what, computed from the process (CO1) #403
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/contribution"
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 adds
wai.media.contribution(CO1): who contributed what to media made by people and models together, computed from the process that made it.wai/extensions/contribution.md(§1 scope, §2 records, §3 session and membership, §4 steps, acts, parameters, check and pinned operations, §5 chain and Merkle tree, §6 the contribution record, §7 the authorship map, §8 disclosure, §9 origin-claim agreement and the C2PA, identity and live-track mappings, §10 verification, §11 reasons, §12 conformance, §13 security and privacy).wai-rs/src/contribution.rsbehind featurecontribution = ["synthesis", "generate"](no new dependency), its corpus generatorsrc/contribution/corpus.rs, the binwai_contribution_vectors, andtests/contribution.rs.wai/live-conformance/contribution/vectors.json(written from fixed seeds) and its README with the Provenance. line.wai/live-conformance/contribution_verify.py, standard library only, run aspython3 -I..github/workflows/wai-conformance.ymlbeside synthesis's, andwai/extensions/contribution.mdin the workflow'spaths:.wai.media.contributionand five document kinds (wai-session§3.1,wai-membership§3.2,wai-step§4.1,wai-contribution§6,wai-authorship-map§7.3) incodecs/registry.rs;registry exportregenerated (registry/capabilities.json,vocab/v2.ttl,REGISTRY.md). SPEC §5 paragraph and record list, CHANGELOG entry,live-conformance/README.md, and thelive-conformanceexclusion reason intests/int_kernels_vectors.rs(the generated pictures are made against a model file and each is named by the SHA-256 of its RGB8 samples).Design decisions, and why
wai:contribution\x01/wai:contribution-link\x01. Transforms evaluate deriving-edge §4.2'swai.derive.crop,rotation,mirror,overlay_compositionandgrid_composition, and synthesis §4.1/§4.2'swai-synthesis:upscale2anddenoise3, by name and arithmetic.wai.derive.scalingstays unpinned (attested), as deriving-edge has it.wai-contribution:lut. The brief expected a colour operation in deriving-edge §4.2; there is none, and no WAI text pins a per-sample colour mapping. A value transform is needed for the "keepsmade_by, adds the chooser" rule, so the extension pins one 768-byte per-channel table and says why.wai.generate.spectral(SPEC §5,generate.rs) with the model file of its conformance vector, which the corpus embeds byte for byte. An exact inpainting makes the generator's picture at the input's size and copies it inside the region. The Python port of the generator checks itself againstwai-rs/tests/vectors/generate/sha256.jsonbefore it is trusted.checkinstead of a booleanexact. Records admit no boolean; the step'schecktakes deriving-edge §4.5'sreplicate/attest. Samples a person introduces (author, an edit's region) are the source of the chain, as a capture is in synthesis §3.2, so those acts arereplicate.(step, samples), not by digest alone, so two states with equal samples but different histories cannot be confused.unknown: no pinned rule fixes the sample even with every step disclosed (an attested transform or composition).undisclosed: a verifier's computed map only, for samples from steps it does not hold. A stated map may holdunknown, neverundisclosed. Comparison: where the computed set holdsundisclosed, its other members must be in the stated set; otherwise the sets are equal. A stated party where the computed set isunknownisunknown_attributed; other differences aremap_mismatch.made_bythat model, with the stepattested, rather thanunknown. Reading the brief's "a step that isn't exact leaves its region unknown" literally would make the generated region of every float-model session unknown, which defeats separating model-made from person-made parts; hereunknownis reserved for an unpinned sample mapping, and the tier reports what was regenerated. The lead may want to confirm this reading.directed_byis reset inside the region). Conditioning from outside the region is left to the conditioning-attribution slot.seq; proofs walked as jwp-receipts §3 step 5. The duplicated last leaf also walks from the position past the end; the record'sstepscount and §5.1'sseq < stepsrule close that, and the unit test states it.recomputed(every step behind the output held andchecked),checked(otherwise, with at least one step),stated(no step held). A policy membertierrefuses an outcome below it (tier_not_met).synthesizedwherever the stated map has a model-made sample.c2pa.createdfromhttp://c2pa.org/digitalsourcetype/empty(C2PA 2.4 §18.15.2), then one action per step behind the output withsoftwareAgent, IPTC digital source type andchangesregion maps. A selection gets no action (C2PA 2.4's Table 8 has none, and it changes no sample). Identity assertions (Identity Assertion 1.2) and live tracks (live-provenance) are informative.mediaisimageand §1 says so.Checks
All cargo work ran on the build host through
~/kani-logs/remote/rb, on the merged tree (head2d67596d9).cargo test --no-default-features --features contribution --lib contribution::cargo test --no-default-features --features contribution --test contributioncargo run -q --no-default-features --features contribution --bin wai_contribution_vectors -- verify ../live-conformance/contributionpython3 -I live-conformance/contribution_verify.py live-conformance/contributioncargo test --no-default-features --features synthesis --test synthesis;python3 -I live-conformance/synthesis_verify.py live-conformance/synthesispython3 -I <x>_verify.py <dir>for events, rooms, takes, compose, recordings, captions, metering, steering, moderation, ads, e2ee, watermark, c2pa-live, synthesis, usagecargo run -q --no-default-features --bin wai -- registry exportthen-- registry export --checkcargo test --no-default-features --lib codecs::registry;cargo test --no-default-features --test cli_registry --test corpus_provenancecargo test --no-default-features --features neural_int,video_int,audio_int,world_int,splat_int --test int_kernels_vectors every_decoded_output_states_a_sha256cargo clippy --no-default-features --features contribution --all-targetschunks_exactnotes the new 1.98 lint raised were fixed withas_chunks)cargo metadata --locked --offline --format-version 1(wai-rs)python3 -I scripts/check-tests-in-ci.py,./scripts/check-workflow-concurrency.sh,python3 scripts/check-spec-refs.py,python3 scripts/check-wai-section-refs.py,bash scripts/check-no-vanity-metrics.sh,bash scripts/test-public-text-checks.sh,bash scripts/check-comparative-prose.sh,python3 scripts/check-orphan-sources.pyscripts/check-public-names.shneeds the private denylist and was not run locally; CI runs it.Falsifications
Committed first; each break applied to the build host's snapshot, tested, then restored.
cargo test --features contribution --test contributionunknown_attributedfolded intomap_mismatchregeneration_mismatch_inpaint; now exit 101the_extension_lists_the_reasons)directed_byprevlink check droppedThe inpaint gap led to a second control for every check with a second place in §10.2 (record-level
samples_mismatch,session_mismatch,signer_mismatch,party_unknown;region_invalidfrom a held buffer;selection_not_in_setfor an output that is not its member; size-onlyrecompute_mismatch; shape-onlyparams_invalid; aprevthat skips). The Python verifier drops each of its own checks in turn and the corpus catches every one; it exits 1 on a copy of the corpus with one byte of the inpainted state changed.Not done
directis reserved and refused), conditioning attribution, tooling and presentation: slots named in §1.🤖 Generated with Claude Code