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
Merged
dcharlot
merged 10 commits from 2026-10-22 00:11:35 -04:00
wai/synthesis-mark into main 2026-10-21
Merge origin/main into wai/synthesis-mark
Some checks failed
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Has been cancelled
WAI energy receipts / does this change touch it (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI conformance / does this change touch it (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
standards workspaces build + test / which workspaces this change touches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
repository checks / lockfiles, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (pull_request) Has been cancelled
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-relay, every target (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/synthesis-mark (room e2e window wait)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/synthesis-mark (settlement, contribution, shared lists)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge remote-tracking branch 'origin/main' into wai/synthesis-mark
All checks were successful
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 1m12s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 2m11s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 26s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m0s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 1m51s
wai-pack / wai-pack · linux (pull_request) Successful in 1m24s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 19m34s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 2m29s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 4m11s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 8m7s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 5m53s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 24s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 15s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 2m44s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 3m15s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 22m47s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m13s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 8m23s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 4m38s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 17s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 2m5s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 38m56s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m44s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 15m49s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 20s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 47s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m58s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 2m48s
wai-pack / wai-pack · macos (pull_request) Successful in 1m11s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m15s
wai-mark:tent64: registry, SPEC §5, CHANGELOG, CI step, corpus README
The wire identifiers wai-mark:tent64 and wai-mark:conformance (schemes, §7.4) and /.well-known/wai-mark/ (proposed, §7.7); the registry export regenerated. A CI step runs the scheme's unit tests, tests/synthesis_mark.rs in release and synthesis_mark_verify.py. The corpus README states its provenance and names the photographs of §7.5.8's informative column by SHA-256. Co-Authored-By: Claude Opus 5.5 <[email protected]>
synthesis.md §7: the registered scheme wai-mark:tent64, what it survives, its signpost and resolver; the second implementations
§7.4 registers wai-mark:tent64 by its definition and digest and keeps wai-mark:conformance as the scheme with no algorithm. §7.5 is the scheme: frames and luma, the grid and the tent pattern, the stream, the shuffle, the signs and the mask, the shortened BCH code, the informed embedding, the detector in eight orientations, what it guarantees (no other channel, a PSNR floor, a false-positive bound derived and checked), the battery and the table of what it survives, with the claims it makes. §7.6 proves a marking by recomputation and reproduces a detection; §7.7 gives the signpost in the content and in the C2PA statement, and a well-known resolver; §7.8 has a sink that generates mark as part of the reconstruction it is held to. _wai_mark.py is the scheme and the battery in Python from the text; synthesis_verify.py runs §7.6's checks with it; synthesis_mark_verify.py verifies the scheme's corpus, mutates it and weakens itself in turn. Co-Authored-By: Claude Opus 5.5 <[email protected]>
synthesis_mark: the scheme's attack battery, measurement sets and conformance corpus
The battery applies the crate's own integer codecs (wai.video.int_motion's encoder, a staged base through wai-synthesis:upscale2), the pinned derivations of §4, area resampling, crops, quarter turns and mirrors, small rotations, noise from a fixed stream, brightness, contrast and a local blur, each an integer function of the frames. The measurement sets are generated from fixed seeds: wai.generate.spectral's generator with its committed model, and a dead-leaves generator. The corpus holds the scheme's definition, the code's words, embeddings and detections over stored frames, a battery sample, cases whose markings are recomputed and detections run again, and the measurement. The amplitude cap is 12: at 8 the most textured photographs left bits short. A conversion's detection agrees with the claim it inherits the mark from. Co-Authored-By: Claude Opus 5.5 <[email protected]>
synthesis: markings and detections of the registered scheme are recomputed and run again
A marking states the frames it embedded into (their size and the digests of the unmarked and the marked frames) and a detection the frames it read. Holding the unmarked frames, a verifier recomputes the marking's derivation; holding the decoded frames, it runs the detector again. New codes: scheme_mismatch, mark_evidence_invalid, mark_input_mismatch, mark_recompute_mismatch, detection_irreproducible, layer_not_proved; a policy member second_layer; each marking states its C2PA signpost. The synthesis corpus regenerates with the new members and gives the codes that need no frames. Co-Authored-By: Claude Opus 5.5 <[email protected]>
synthesis: the watermark scheme wai-mark:tent64, embedded by a pinned integer derivation and read with no key
A tent checkerboard in each cell of a 64 x 64 grid that follows the picture through a rescale; a public stream shuffles the cells, signs them and masks the code; the 8-byte payload is a BCH(255, 71) codeword shortened to 248 bits, each bit carried by 16 cells; each bit is given the least amplitude up to 8 that gives its statistic the sign the codeword asks with a margin of 3/2 of its weight mass. The detector reads the signs in each of the 8 orientations and decodes up to 29 errors. Co-Authored-By: Claude Opus 5.5 <[email protected]>