feat: SDXL default; AVIF/HEIF/JPEG-XL C2PA stripping

SD-1.5 dreamshaper at 768 px did not defeat SynthID v2 on Gemini 3 Pro
outputs (verified May 2026 via Gemini app's "Verify with SynthID"). Switch
the default invisible engine to SDXL at 1024 px, matching the raiw-app
production config (strength 0.05, steps 50). Drop the SD-1.5 pipeline.

Metadata layer: add C2PA UUID and IPTC AI marker byte-scan detection
across all formats, plus an ISOBMFF box walker (noai/isobmff.py) that
strips top-level C2PA uuid and JUMBF jumb boxes from AVIF/HEIF/JPEG-XL
containers without re-encoding.

README gets a Legal table and a Threat-model section about SynthID v2's
136-bit payload. CLAUDE.md tracks the SD-1.5 regression as historical
context.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
test-user
2026-05-17 12:54:37 -07:00
co-authored by Claude Opus 4.7
parent 89b7633e5c
commit f2fc5e09ab
10 changed files with 298 additions and 41 deletions
+2 -2
View File
@@ -63,7 +63,7 @@ class TestModelProfiles:
"""Tests for watermark_profiles.py."""
def test_default_profile(self):
assert get_model_id_for_profile("default") == "Lykon/dreamshaper-8"
assert get_model_id_for_profile("default") == "stabilityai/stable-diffusion-xl-base-1.0"
def test_ctrlregen_profile(self):
assert get_model_id_for_profile("ctrlregen") == "yepengliu/ctrlregen"
@@ -73,7 +73,7 @@ class TestModelProfiles:
get_model_id_for_profile("nonexistent")
def test_detect_default(self):
assert detect_model_profile("Lykon/dreamshaper-8") == "default"
assert detect_model_profile("stabilityai/stable-diffusion-xl-base-1.0") == "default"
def test_detect_ctrlregen(self):
assert detect_model_profile("yepengliu/ctrlregen") == "ctrlregen"