wai-mark:tent64: the second marking layer, a watermark recomputed from its payload, read with no key, measured against an attack battery (SYN-2) #407
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/synthesis-mark"
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
The second marking layer of
wai.media.synthesis, made real.extensions/synthesis.md§7.4 left the watermark scheme as an empty slot (wai-mark:<name>+ digest), so a detection was a signed statement and nothing more. This PR registers a scheme,wai-mark:tent64, and ties §7.3's agreement steps to it, adds the detection signpost of the Code of Practice's Measure 3.4(c)(ii), and measures what the mark survives.Texts read for it, fetched today: the Code of Practice on Transparency of AI-Generated Content, final text of 10 June 2026 (the Commission's document 129555, SHA-256
7bd22c5a…bf9bc28): Section 1 Measures 1.1, 2.1, 2.3, 3.2 to 3.4 and the Glossary's signpost solution; C2PA 2.4 §9.3, §18.10, §18.15.4.8, §18.15.5 (soft binding,c2pa.watermarked.bound); RFC 8615.The scheme (§7.4, §7.5)
What it guarantees (§7.5.6)
forensic-watermark.md, whose purpose is the opposite.Robustness, measured (§7.5.7, §7.5.8)
The battery is 33 picture attacks and 7 clip attacks. Each is an integer function, with noise drawn from a fixed SHA-256 stream, so a run reproduces bit for bit. Python re-runs every picture attack on the corpus still and gets identical digests. The attacks are:
wai.video.int_motionencoder at q = 4 to 48, and a staged base layer (half resolution, int_motion, thenwai-synthesis:upscale2);denoise3once and four times;upscale2and an aspect change;The measurement sets are generated in-repo from fixed seeds: 16 spectral pictures (
wai.generate.spectralwith its committed model), 16 dead-leaves pictures, and 4 panning clips. The informative photographs column covers 24 lossless 768 × 512 photographs of a common test suite. They are measured withwai_synthesis_mark_vectors measure, named by SHA-256 in the corpus README and not committed.Claims rule: an attack is claimed only if every picture in every column was detected with its payload and no unmarked picture under it gave a payload.
Verification (§7.3, §7.6, §7.8)
embedding(frame count and size, plus SHA-256 of the unmarked and marked frames). A detection gainsread(frame count and size, plus SHA-256 of the frames read).mark_input_mismatch,mark_recompute_mismatch). With the decoded frames held, it compares (samples_mismatch).detection_irreproducible). This is where "an attack beyond the claimed robustness reported as detected-and-agreed" is refused.agree-inherited). A capture claim over marked synthesized content islayers_disagree.second_layer: require-proof(layer_not_proved).scheme_mismatchandmark_evidence_invalid.present_output_irreproducible.wai-mark:conformanceis kept. It is the scheme with no algorithm. It exercises the records independent of any algorithm and stands for any scheme a verifier does not implement.Signpost and resolver (§7.7)
c2pa.watermarked.boundplus ac2pa.soft-bindingassertion withalg= term,alg-params= digest and the payload as the block value. The marking's statement is part of §11.3's accepted output./.well-known/wai-mark/<name>(the definition) and/.well-known/wai-mark/<name>/payload/<p>(claims by payload).Deliverables
wai/extensions/synthesis.md§7 rewritten (7.1–7.8), with matching updates to the header, §1, §11, §12 (6 new codes), §13 and §14.wai-rssynthesis::mark, under featuresynthesisbecause the verifier needs it;synthesis_markmodule (battery, measurement sets, PSNR/SSIM, corpus), under the new featuresynthesis_mark= synthesis + video_int + generate + png_still, which adds no dependency;wai_synthesis_mark_vectors gen|verify|measurebinary.wai/live-conformance/synthesis-mark/, withscheme.json,vectors.json,battery.jsonandframes/<sha256>.rgb(about 1.3 MB). It contains:live-conformance/_wai_mark.py(scheme and battery, written from §7.5);synthesis_verify.py, with the §7.6 checks;synthesis_mark_verify.py, which checks the corpus, the spec's definition, generator, figures, table and claims, applies 14 mutations, and weakens its own verifier 3 ways.wai-conformance.yml; REGISTRY wire identifiers (wai-mark:tent64andwai-mark:conformanceas schemes,/.well-known/wai-mark/as proposed); regenerated registry export; SPEC §5 paragraph; CHANGELOG;live-conformance/README.md; the corpus README with its Provenance line; theint_kernels_vectors.rslive-conformance reason extended.Checks
All were run on the merged tree (origin/main at
aa0b98d33, merged as5d33f01b4). Cargo commands ran on the build host throughrb; Python and the scripts ran locally.cargo run --no-default-features --bin wai -- registry export --check(afterregistry export)cargo test --no-default-features --features synthesis_mark --lib -- synthesis::mark synthesis_mark::cargo test --release --no-default-features --features synthesis_mark --test synthesis_markcargo test --no-default-features --features synthesis --lib synthesis::cargo test --no-default-features --features synthesis --test synthesiscargo test --no-default-features --lib codecs::registrycargo test --no-default-features --test carriage --test manifest_builders --test cli_wrap_intent --test cli_registry --test corpus_provenancecargo test --release --no-default-features --features neural_int,video_int,audio_int,world_int,splat_int --test int_kernels_vectorscargo clippy --no-default-features --features synthesis_mark --all-targetspython3 -I live-conformance/synthesis_mark_verify.py live-conformance/synthesis-markpython3 -I live-conformance/synthesis_verify.py live-conformance/synthesislive_rooms_verify.py rooms,live_events_verify.py eventscheck-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.pycheck-public-names.shwith the private denylistwai-rs/src/live_provenance.rs, which this PR does not touch (pre-existing)synthesis_markcomposes existing features; no code outside wai-rs usessynthesisFalsifications
Each was committed first, then run on the build host: the patch was applied, the guarding check run, and the file restored.
tests/synthesis_markevery_vector_and_casecrop-1%the_extension_claims_only_what_the_measurement_showsthe_extension_pins_the_schemethe_committed_corpus_regenerates_from_its_seedssynthesis_mark_verify.pycrop-1%Two attempts did not fail, and the reasons are worth recording:
Not done
/.well-known/wai-mark/with IANA;🤖 Generated with Claude Code
dcharlot referenced this pull request2026-10-22 03:27:47 -04:00