diff --git a/.gitignore b/.gitignore index f66ea2b..a277e61 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,9 @@ Thumbs.db # Test results data/results/ -# SynthID corpus images (manifest.csv + README.md stay tracked) -data/synthid_corpus/images/ +# SynthID corpus reference fills (synthetic black/white calibration tiles, +# regenerable; the labeled pos/neg/cleaned images ARE tracked, see README) +data/synthid_corpus/refs/ # Reference materials _refs/ @@ -33,4 +34,3 @@ yolov8n.pt # Claude Code local settings .claude/settings.local.json -data/synthid_corpus/refs/ diff --git a/CLAUDE.md b/CLAUDE.md index 3d6b191..dbbce30 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,8 +14,8 @@ You are a **principal Python engineer** maintaining a CLI tool and library for r - `bash maintain.sh` — uv-outdated, uv-secure, ruff check/fix, ruff format, pyright, pytest -n auto - `maintain.sh` may not finish fully green (pre-existing, not per-change): strict pyright carries debt in `remove_ai_metadata` / `cli.py` (untyped piexif/PIL/click/rich). (`uv-secure` is clean since idna was bumped 3.11 -> 3.16, fixing GHSA-65pc-fj4g-8rjx.) To gate a change, run `uv run ruff check`, `uv run pyright `, `uv run pytest` directly. - Run `uv run` from the repo root — from another cwd it falls back to a bare env without numpy/cv2/torch. -- Metadata/C2PA tests assert against real committed fixtures in `data/samples/` (`chatgpt-*.png` = OpenAI C2PA, `firefly-1.png` = Adobe, `mj-*` = Midjourney IPTC, `doubao-1.png` = ByteDance Doubao with the China TC260 `` XMP label **and** a visible "豆包AI生成" text mark bottom-right, `not-ai-*` = clean); synthetic byte blobs cover the JPEG/ISOBMFF format paths. -- SynthID reference corpus: `scripts/synthid_corpus.py` ingests labeled images into `data/synthid_corpus/` (`manifest.csv` tracked, `images/` gitignored); see its README for the collection protocol and verification oracles. +- Metadata/C2PA tests assert against real committed fixtures in `data/samples/` (`chatgpt-*.png` = OpenAI C2PA, `firefly-1.png` = Adobe, `mj-*` = Midjourney IPTC, `doubao-1.png` = ByteDance Doubao with the China TC260 `` XMP label **and** a visible "豆包AI生成" text mark bottom-right); synthetic byte blobs cover the JPEG/ISOBMFF format paths. The "non-AI / clean photo" control is no longer in `data/samples/` -- the `clean_photo` conftest fixture serves a verified-negative image from the corpus `neg/` set (skips if the corpus is absent). +- SynthID reference corpus: `scripts/synthid_corpus.py` ingests labeled images into `data/synthid_corpus/`. The labeled `images/` (`pos/` `neg/` `cleaned/`) are **committed** (public repo -- review every image for private content before adding; `manifest.csv` is kept in sync with the files on disk, one row per tracked image); only the synthetic `refs/` calibration fills are gitignored. See its README for the collection protocol and verification oracles. ## Configuration diff --git a/data/samples/not-ai-1.jpeg b/data/samples/not-ai-1.jpeg deleted file mode 100644 index 90b17fb..0000000 Binary files a/data/samples/not-ai-1.jpeg and /dev/null differ diff --git a/data/samples/not-ai-2.jpeg b/data/samples/not-ai-2.jpeg deleted file mode 100644 index cec716d..0000000 Binary files a/data/samples/not-ai-2.jpeg and /dev/null differ diff --git a/data/samples/not-ai-3.webp b/data/samples/not-ai-3.webp deleted file mode 100644 index e05e356..0000000 Binary files a/data/samples/not-ai-3.webp and /dev/null differ diff --git a/data/synthid_corpus/README.md b/data/synthid_corpus/README.md index c87546d..71a11ed 100644 --- a/data/synthid_corpus/README.md +++ b/data/synthid_corpus/README.md @@ -17,16 +17,21 @@ external oracle, recorded per image in `verified_via` (see below). ``` data/synthid_corpus/ README.md # this protocol (committed) - manifest.csv # labels + provenance (committed, reviewable) - images/ # the actual files (gitignored, local-only) + manifest.csv # labels + provenance (committed; one row per tracked image) + images/ # the labeled corpus (committed) pos/ # SynthID present - neg/ # SynthID absent + neg/ # SynthID absent (incl. reviewed real photos) cleaned/ # our pipeline output from a pos image + refs/ # synthetic black/white calibration fills (gitignored, regenerable) ``` -Images are gitignored on purpose: the corpus is large, may contain personal or -licensed content, and SynthID-positive outputs are best kept local. The -`manifest.csv` (sha256 + labels + extracted metadata) is the durable artifact. +The labeled images are committed so the corpus is reproducible and the removal +regression set runs in CI. `manifest.csv` is kept in sync with the files on +disk (one row per tracked image; dangling rows are pruned when files are +removed). Before adding any image, confirm it carries no private or +identifiable content you would not publish -- this is a public repo and git +history is permanent. The synthetic `refs/` fills stay gitignored (regenerable, +not part of the labeled set). ## Verification levels (`verified_via`) @@ -58,7 +63,8 @@ For the **regression set**: - `neg` controls: non-AI photos and outputs from non-SynthID models (SD, Midjourney, Firefly) verified negative. -Avoid personal or identifiable content; the corpus stays local. +The corpus is committed to a public repo: review every image before adding it +and keep out anything private or identifiable you would not publish. ## Ingesting diff --git a/data/synthid_corpus/images/cleaned/f6dd47a5-4ef377bd-gpt-image-2-cleaned.png b/data/synthid_corpus/images/cleaned/f6dd47a5-4ef377bd-gpt-image-2-cleaned.png new file mode 100644 index 0000000..a054fe0 Binary files /dev/null and b/data/synthid_corpus/images/cleaned/f6dd47a5-4ef377bd-gpt-image-2-cleaned.png differ diff --git a/data/synthid_corpus/images/neg/06b04d8f-IMG_1474.HEIC b/data/synthid_corpus/images/neg/06b04d8f-IMG_1474.HEIC new file mode 100644 index 0000000..927c126 Binary files /dev/null and b/data/synthid_corpus/images/neg/06b04d8f-IMG_1474.HEIC differ diff --git a/data/synthid_corpus/images/neg/0bb4c176-IMG_1790.HEIC b/data/synthid_corpus/images/neg/0bb4c176-IMG_1790.HEIC new file mode 100644 index 0000000..39b1b63 Binary files /dev/null and b/data/synthid_corpus/images/neg/0bb4c176-IMG_1790.HEIC differ diff --git a/data/synthid_corpus/images/neg/1fa5f77f-IMG_0786.HEIC b/data/synthid_corpus/images/neg/1fa5f77f-IMG_0786.HEIC new file mode 100644 index 0000000..56beaaa Binary files /dev/null and b/data/synthid_corpus/images/neg/1fa5f77f-IMG_0786.HEIC differ diff --git a/data/synthid_corpus/images/neg/2b148db2-IMG_1832.HEIC b/data/synthid_corpus/images/neg/2b148db2-IMG_1832.HEIC new file mode 100644 index 0000000..2898b12 Binary files /dev/null and b/data/synthid_corpus/images/neg/2b148db2-IMG_1832.HEIC differ diff --git a/data/synthid_corpus/images/neg/2d02fed0-IMG_1520.HEIC b/data/synthid_corpus/images/neg/2d02fed0-IMG_1520.HEIC new file mode 100644 index 0000000..d46484c Binary files /dev/null and b/data/synthid_corpus/images/neg/2d02fed0-IMG_1520.HEIC differ diff --git a/data/synthid_corpus/images/neg/2ea228ed-IMG_1791.HEIC b/data/synthid_corpus/images/neg/2ea228ed-IMG_1791.HEIC new file mode 100644 index 0000000..a8c38f2 Binary files /dev/null and b/data/synthid_corpus/images/neg/2ea228ed-IMG_1791.HEIC differ diff --git a/data/synthid_corpus/images/neg/3fc0c425-IMG_1450.HEIC b/data/synthid_corpus/images/neg/3fc0c425-IMG_1450.HEIC new file mode 100644 index 0000000..0903ae4 Binary files /dev/null and b/data/synthid_corpus/images/neg/3fc0c425-IMG_1450.HEIC differ diff --git a/data/synthid_corpus/images/neg/3fc4c831-IMG_2566.HEIC b/data/synthid_corpus/images/neg/3fc4c831-IMG_2566.HEIC new file mode 100644 index 0000000..c4dd62a Binary files /dev/null and b/data/synthid_corpus/images/neg/3fc4c831-IMG_2566.HEIC differ diff --git a/data/synthid_corpus/images/neg/4c795238-IMG_3034.HEIC b/data/synthid_corpus/images/neg/4c795238-IMG_3034.HEIC new file mode 100644 index 0000000..1039d28 Binary files /dev/null and b/data/synthid_corpus/images/neg/4c795238-IMG_3034.HEIC differ diff --git a/data/synthid_corpus/images/neg/4ead7918-IMG_1300.HEIC b/data/synthid_corpus/images/neg/4ead7918-IMG_1300.HEIC new file mode 100644 index 0000000..54cb5ba Binary files /dev/null and b/data/synthid_corpus/images/neg/4ead7918-IMG_1300.HEIC differ diff --git a/data/synthid_corpus/images/neg/5abfaccb-IMG_3018.HEIC b/data/synthid_corpus/images/neg/5abfaccb-IMG_3018.HEIC new file mode 100644 index 0000000..951430a Binary files /dev/null and b/data/synthid_corpus/images/neg/5abfaccb-IMG_3018.HEIC differ diff --git a/data/synthid_corpus/images/neg/5fe59521-IMG_1496.HEIC b/data/synthid_corpus/images/neg/5fe59521-IMG_1496.HEIC new file mode 100644 index 0000000..cd529c9 Binary files /dev/null and b/data/synthid_corpus/images/neg/5fe59521-IMG_1496.HEIC differ diff --git a/data/synthid_corpus/images/neg/5fed1923-IMG_0272.HEIC b/data/synthid_corpus/images/neg/5fed1923-IMG_0272.HEIC new file mode 100644 index 0000000..f7cb2cf Binary files /dev/null and b/data/synthid_corpus/images/neg/5fed1923-IMG_0272.HEIC differ diff --git a/data/synthid_corpus/images/neg/8f170c06-IMG_1078.HEIC b/data/synthid_corpus/images/neg/8f170c06-IMG_1078.HEIC new file mode 100644 index 0000000..b6c47ea Binary files /dev/null and b/data/synthid_corpus/images/neg/8f170c06-IMG_1078.HEIC differ diff --git a/data/synthid_corpus/images/neg/8fdb574a-IMG_3557.HEIC b/data/synthid_corpus/images/neg/8fdb574a-IMG_3557.HEIC new file mode 100644 index 0000000..8b44209 Binary files /dev/null and b/data/synthid_corpus/images/neg/8fdb574a-IMG_3557.HEIC differ diff --git a/data/synthid_corpus/images/pos/1f81827c-Designer.png b/data/synthid_corpus/images/pos/1f81827c-Designer.png new file mode 100644 index 0000000..c800a3e Binary files /dev/null and b/data/synthid_corpus/images/pos/1f81827c-Designer.png differ diff --git a/data/synthid_corpus/images/pos/28f32334-chatgpt_fisherman.png b/data/synthid_corpus/images/pos/28f32334-chatgpt_fisherman.png new file mode 100644 index 0000000..b69afed Binary files /dev/null and b/data/synthid_corpus/images/pos/28f32334-chatgpt_fisherman.png differ diff --git a/data/synthid_corpus/images/pos/4ef377bd-ChatGPT Image May 23, 2026, 02_43_02 PM.png b/data/synthid_corpus/images/pos/4ef377bd-ChatGPT Image May 23, 2026, 02_43_02 PM.png new file mode 100644 index 0000000..d10d79e Binary files /dev/null and b/data/synthid_corpus/images/pos/4ef377bd-ChatGPT Image May 23, 2026, 02_43_02 PM.png differ diff --git a/data/synthid_corpus/images/pos/7b650522-ChatGPT Image May 24, 2026, 12_19_54 PM.png b/data/synthid_corpus/images/pos/7b650522-ChatGPT Image May 24, 2026, 12_19_54 PM.png new file mode 100644 index 0000000..d1a4f95 Binary files /dev/null and b/data/synthid_corpus/images/pos/7b650522-ChatGPT Image May 24, 2026, 12_19_54 PM.png differ diff --git a/data/synthid_corpus/images/pos/88e61a38-chatgpt_tokyo.png b/data/synthid_corpus/images/pos/88e61a38-chatgpt_tokyo.png new file mode 100644 index 0000000..976739f Binary files /dev/null and b/data/synthid_corpus/images/pos/88e61a38-chatgpt_tokyo.png differ diff --git a/data/synthid_corpus/images/pos/c8697342-aistudio_lake.png b/data/synthid_corpus/images/pos/c8697342-aistudio_lake.png new file mode 100644 index 0000000..205945f Binary files /dev/null and b/data/synthid_corpus/images/pos/c8697342-aistudio_lake.png differ diff --git a/data/synthid_corpus/images/pos/d09f84c0-Gemini_Generated_Image_vq7wkwvq7wkwvq7w.png b/data/synthid_corpus/images/pos/d09f84c0-Gemini_Generated_Image_vq7wkwvq7wkwvq7w.png new file mode 100644 index 0000000..04e7337 Binary files /dev/null and b/data/synthid_corpus/images/pos/d09f84c0-Gemini_Generated_Image_vq7wkwvq7wkwvq7w.png differ diff --git a/data/synthid_corpus/images/pos/d20d4cc9-Gemini_Generated_Image_ug6kdpug6kdpug6k.png b/data/synthid_corpus/images/pos/d20d4cc9-Gemini_Generated_Image_ug6kdpug6kdpug6k.png new file mode 100644 index 0000000..459d9f3 Binary files /dev/null and b/data/synthid_corpus/images/pos/d20d4cc9-Gemini_Generated_Image_ug6kdpug6kdpug6k.png differ diff --git a/data/synthid_corpus/images/pos/fb28dba2-Gemini_Generated_Image_dsjlnsdsjlnsdsjl.png b/data/synthid_corpus/images/pos/fb28dba2-Gemini_Generated_Image_dsjlnsdsjlnsdsjl.png new file mode 100644 index 0000000..0af81f0 Binary files /dev/null and b/data/synthid_corpus/images/pos/fb28dba2-Gemini_Generated_Image_dsjlnsdsjlnsdsjl.png differ diff --git a/data/synthid_corpus/manifest.csv b/data/synthid_corpus/manifest.csv index 7526317..be6ed08 100644 --- a/data/synthid_corpus/manifest.csv +++ b/data/synthid_corpus/manifest.csv @@ -1,119 +1,26 @@ sha256,filename,label,source,model,width,height,format,c2pa_issuer,synthid_metadata,verified_via,added,notes 4ef377bde1a1d4eff141972841938643b173f5052992a018b9a21b31ac31731e,"4ef377bd-ChatGPT Image May 23, 2026, 02_43_02 PM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,openai-verify,2026-05-23T21:48:12Z,fresh post-rollout 2026-05-23; openai.com/verify: SynthID+C2PA detected d09f84c0e4c6d8b336bf4a9a7277314e940dcb5052ae7051e785cbb3bb42d656,d09f84c0-Gemini_Generated_Image_vq7wkwvq7wkwvq7w.png,pos,Gemini app,gemini,2816,1536,png,Google LLC,yes,c2pa-metadata,2026-05-23T21:52:40Z,"user: latest Gemini, SynthID v2" -47188e88f956291bd38ab6906e5f21eb273d4a697ddc8b4479deac9f48915e1a,47188e88-disco_synthid_removed.png,cleaned,our pipeline (invisible/SDXL),stabilityai/stable-diffusion-xl-base-1.0,1254,1254,png,,,openai-verify,2026-05-23T22:06:54Z,cleaned from 4ef377bd disco; openai.com/verify: SynthID NOT detected (defeated) -52bb6bd524a74bff1b74ed893784c1c0ee76f48a9b45a009bae95ad4a57b7759,"52bb6bd5-ChatGPT Image May 24, 2026, 11_01_02 AM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,c2pa-metadata,2026-05-24T18:49:35Z,solid black ref (spectral pilot 2026-05-24) -ee75ade07914d6306eae3443b3028782e0ac8c125a31b2d5a141f75aebdafb18,"ee75ade0-ChatGPT Image May 24, 2026, 11_10_04 AM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,c2pa-metadata,2026-05-24T18:49:35Z,solid black ref (spectral pilot 2026-05-24) -9398c74dfad0f030633bd3ac224ba53e56a7ff9711d7b3a4c464e0073ece51b5,"9398c74d-ChatGPT Image May 24, 2026, 11_10_09 AM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,c2pa-metadata,2026-05-24T18:49:35Z,solid black ref (spectral pilot 2026-05-24) -79c3733895e82e3c9e506de0ddd6dfbf20ba09171263d88444520777151868c8,"79c37338-ChatGPT Image May 24, 2026, 11_10_13 AM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,c2pa-metadata,2026-05-24T18:49:35Z,solid black ref (spectral pilot 2026-05-24) -38315a0a83aa0e094a50520ea44e01aa26115927f09a532ff2ab8636de743e0a,"38315a0a-ChatGPT Image May 24, 2026, 11_10_19 AM.png",pos,ChatGPT,gpt-image,1254,1254,png,OpenAI,yes,c2pa-metadata,2026-05-24T18:49:35Z,solid black ref (spectral pilot 2026-05-24) -f3a1fbc3bc8f768265400724bb9800d322f8e0b1461b2c585540845ea8352c5d,f3a1fbc3-winter_scene_X.png,neg,local (SDXL/processed),sdxl-or-processed,2816,1536,png,,,none,2026-05-24T18:52:23Z,metadata-clean: no C2PA/SynthID source -f07bc0bcad09a5a5687ae312a1298c9ddd110a5e414265efc52ef4d524b36f86,f07bc0bc-api_enterprise_gate_ax.png,neg,local (SDXL/processed),sdxl-or-processed,1080,1350,png,,,none,2026-05-24T18:52:23Z,metadata-clean: no C2PA/SynthID source -89571987e368f1ce82f9dedfa9101584434def842e50d1f4c759de64db5c21d9,89571987-c87bd3c48a4443a68cb84a65604dacd3_clean.png,neg,local (SDXL/processed),sdxl-or-processed,2816,1536,png,,,none,2026-05-24T18:52:23Z,metadata-clean: no C2PA/SynthID source 7b650522d42db09568e249c04d683c469fb3e280a2c53fcd1031cb9df27c619a,"7b650522-ChatGPT Image May 24, 2026, 12_19_54 PM.png",pos,ChatGPT,gpt-image,1602,982,png,OpenAI,yes,c2pa-metadata,2026-05-24T19:20:25Z,content: misty pine forest at dawn fb28dba2a82cc101a92fdee5714867b32610d0564f37737fe4bb70782b8ecf32,fb28dba2-Gemini_Generated_Image_dsjlnsdsjlnsdsjl.png,pos,Gemini app,gemini,2816,1536,png,Google LLC,yes,c2pa-metadata,2026-05-24T19:30:25Z,content: elderly fisherman portrait d20d4cc936dbdfe909c52502039a9e84ba93d97b42b24a0acee5b7d6c71930ae,d20d4cc9-Gemini_Generated_Image_ug6kdpug6kdpug6k.png,pos,Gemini app,gemini,2816,1536,png,Google LLC,yes,c2pa-metadata,2026-05-24T19:33:15Z,content: red coffee mug product shot 28f323345f6496d936c3f1a72f671ddf59d0f81565c24a63bf3286860f633afe,28f32334-chatgpt_fisherman.png,pos,ChatGPT,gpt-image,1023,1537,png,OpenAI,yes,c2pa-metadata,2026-05-24T19:39:20Z,content: elderly fisherman portrait (fetch+blob dl) 88e61a384c2e0b12d97bc66046e4a10542b2987448ba89c4b49e66311e969c84,88e61a38-chatgpt_tokyo.png,pos,ChatGPT,gpt-image,1023,1537,png,OpenAI,yes,c2pa-metadata,2026-05-24T19:42:02Z,content: tokyo street night (fetch+blob dl) -607087e40da1ac2636f7233c06784295d374d503ab928bb0c0c9b09e0140b3bc,607087e4-IMG_0505.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) 1fa5f77f710c11a4cc69fed60195450def734401ed57c2600a84ce191f985440,1fa5f77f-IMG_0786.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -ac32346771d3ebb6b9d7d395e1efad995972fb708b76082905d15299d61dcfaa,ac323467-IMG_0114.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) 2ea228ed270cd169e9d38bc3f1a162de7edbf54b6e5ad3c701a3c90010ec7067,2ea228ed-IMG_1791.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -eb0e14f7c8dfe88d710804fe0d2e74eb033d4d72db5525a526bb3751f2d52f4f,eb0e14f7-ai_price_software_not_hardware.png,neg,iPhone (me/post_photos),,1200,675,png,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -cd2c0eba3625bf7a90178063b4a769667cf00904db968efff7502734f8456892,cd2c0eba-IMG_3201.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -208b21ccfa8c81d2e75903a6083f2806ac068d856ad12957e6f6ea7870af0096,208b21cc-IMG_0712.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -f9c64806fd2b1ea4cf39a49f67e651f2146e9c892f1a401d9981e9d7f0601062,f9c64806-grep_vs_vector_agentic_search.png,neg,iPhone (me/post_photos),,1600,900,png,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -beaae48cf40c8d471c9c1a49d205cd87cf6c079211847f66ced4d4310aa7cff4,beaae48c-IMG_1699.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -41307ceeb9c981fa766ec4d711fe72f647fce86d21f1026e63c45dcd95063a65,41307cee-IMG_2148.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -3801fbe36a77134336508f888f658deb03657c5b765c8b3205b2d928e1b3a5f8,3801fbe3-IMG_2364.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -3012ff6d1db0535423c4dfb22e8d4d2da77b94b776c38cf06fa06958b7a71860,3012ff6d-IMG_2489.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -b978efbdec5ec96b320e53fb23a1aec306f5a32a796a56a032ae66929c803e7b,b978efbd-IMG_0334.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -1136f4df74e842e4ba95c91731656e4bf125361b0aa83b1fc4e128161668a8fe,1136f4df-IMG_0363.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -6e768835f52e840ec0f6af4a9604bd31ed38b2ce3fa187cfe5cc7daa2acb56e4,6e768835-IMG_3492.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -5470ded7892073b1deb31980b3cc541ce73b4cf025d56a43eb6e80c2db810ff2,5470ded7-IMG_1417.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) 0bb4c176d83fbcbf4e628de7587d6183b9134c4f3fa85f55b96e94185273c7f6,0bb4c176-IMG_1790.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -c1f3267973e33e91c82ab889d21b6be18a6128e2178a85403bf89b04a6ea8c36,c1f32679-IMG_2981.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -efcb985a4ecc055029bea0df82ba161442340b1df6aa54639c2c717f8ebe7c4e,efcb985a-IMG_0841.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -383c6d9f4d74d1d30eeab2bfbe9b83212dcedb52b36b8ac403efa45730563326,383c6d9f-IMG_1616.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -b284d9ad7f58a44dc2b0d2e69b12236cf004d5052fb5484cfa1c21548bfd3821,b284d9ad-IMG_1250.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -85802ce2d2d8a7a155e631ef36a82cb912691fbbab4b2c28bb2438efed0b9225,85802ce2-IMG_2973.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -15b1e4e26340630345fc18e439ec98995ddca2816f38e13d4b2ee9e99ed26bac,15b1e4e2-IMG_1563.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -d8a1eed3cc327b5db7f5fd635fd4c37b29ff24a3360fce57622ea1cf35af284a,d8a1eed3-IMG_1666.heic,neg,iPhone (me/post_photos),,3024,4032,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -505047f592db5fd2ce4fc0fc3580e0b28abc19b6720a98a73530f2cb7158f7c1,505047f5-IMG_2569.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:47Z,post photo; no C2PA/SynthID (verified) -a499773829f0ed206f9bd8c46740fc01955c1d43f45e8e775582015d9db9956c,a4997738-IMG_1980.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -a2f98b6a8887c7b4909601c46d03fb1f6e5145e714ffe3bc8b7056bc636bfee0,a2f98b6a-IMG_0780.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -9172987b14366231857e74a3f7b554ec0fc8cc23ebb7f88cd8eca3ce95ef8498,9172987b-IMG_3293.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -2f21fcd7b1ace88aa368028a7a97ffadd6ebe7cffe6c221d47abbed2a205074b,2f21fcd7-IMG_3144.PNG,neg,iPhone (me/post_photos),,2250,3000,png,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -d95e9af4d343501c4597918b5dfc66a1afc338b126e29c9eba13e7b2a61174d5,d95e9af4-IMG_1390.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -25b72de3a2ba4110c5dea68e82af6d19592eecc7000b2f12f52f8512afd48e73,25b72de3-IMG_1369.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -d18874c51b17ced8f736e24cd12ba54bd6c4f76292cba702a9c8a2d97c72f1c4,d18874c5-IMG_1447.HEIC,neg,iPhone (me/post_photos),,3088,2316,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -bf5abcd01037f44b2418b586c3b864340188a00f95047433832972ab797ae2d5,bf5abcd0-IMG_0743.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -a2782e0e6bb3d611925cace6ca3da10259ae70229aad3f366bc25b9e94538ab4,a2782e0e-IMG_0345.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 3fc0c4253f86427777904f41355eacbdcc1a29f6897ec694c7fc68b6e7f70846,3fc0c425-IMG_1450.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -56023f628e6d8ad0a3fb204b5bd10c9e9182446bad9032b0ab8c8d068a311bc7,56023f62-IMG_1796.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -100a121953049a83a714cd8771c7ac3f5afba69d8f8abb073535e98358395014,100a1219-IMG_0037.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -3e287f9e838f4f1bef5d8417957ea504954e5851de61656bbe32915c90db3a1f,3e287f9e-IMG_2323.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -237ff92d14163216687649f1fe222d5427f8600d8a97cb667386e71466a5d908,237ff92d-IMG_2270.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -a3f4a1a85bbd1cc6236e20c5a7d58bc18ccf695bc471cc02f36c1ad885551df8,a3f4a1a8-IMG_1309.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -be2f8bcb71f4bc5a4e79821bb4691e0f3c817ce916a35b05ffacce003a380c1c,be2f8bcb-IMG_0999.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -d5a4f2f81e86696cd18d38796c6b92ce96dcfe073bfd3a9c5dedf9d574aa66d6,d5a4f2f8-span_vs_flattening.png,neg,iPhone (me/post_photos),,1600,1000,png,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 2b148db2b1a314a87647a03828b3d235e7c4c939252f448b572b7658c7bb9723,2b148db2-IMG_1832.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 2d02fed0b6d60ce1142eadac9837a83896569dddbdad7cc5cfdec018f0506d36,2d02fed0-IMG_1520.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -68bf936a5491478484a295b3d882fef042f77e9784cae1b64a9e6e1b72d0628c,68bf936a-IMG_1107.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -32a9b71a13ecec3c90dcd7b54b90206acbe0f646a2296c955e227baa83823eec,32a9b71a-IMG_1238.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 8f170c06f843c2bcf4cf6e249dd76365287fdb3a322637ba93c570f50cb19772,8f170c06-IMG_1078.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -f7634a3779812f52de0599736b4c35f55b61027bae191e4ca060b10341661731,f7634a37-IMG_1605.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -e2ae859a96a5076f37b6efc5a1dad4952e29550f93cee4bba4899ef6fda09305,e2ae859a-IMG_3394.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -b4ea1e6f9134dfc91b4334ed723a15c937eee4fe3fd65b210cc31959884e5c4e,b4ea1e6f-IMG_1595.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -bf9d4d9ebb17cbae46407446d440b273fc136ea3e157a648e4959b116fca376d,bf9d4d9e-IMG_0916.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -2546689c376f365188a5e5a85e72982ff099b5680608e861c8490bde340e8a29,2546689c-IMG_2481.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -88944f46e3d85ea5c4f6d4559f8da9360f68060f73bb8b8c3344c3fdd3b54476,88944f46-IMG_2157.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 3fc4c8316012abc462df5534d4d995e5af84d35076a2927331107ff994293d9e,3fc4c831-IMG_2566.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -af59d9a72a859a72b6ad8e6178992e320934f74eb2a88d74c9d4c64b5bdb89f5,af59d9a7-IMG_2198.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -4f9d6807ff42d0bcd9494dc5d4c9d15f7b96691e29bfe2d670b8e3bceba934de,4f9d6807-IMG_0371.HEIC,neg,iPhone (me/post_photos),,3088,2316,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -237492e65e73acacf8135a2a903a2a231ee9c68ddcc2c590e90ec6e54c6a4520,237492e6-IMG_0473.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -d8a339db6b19c71d4ccf1a467c8999c5d2947b5c8cfd07a8b17b343f579e3f26,d8a339db-IMG_1798.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -abe73f771fb57c959663070cb560cfd5365999ef6b9aa419b18ea1031fab4a9d,abe73f77-IMG_3434.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -15fbe3e101bce529ec9b7a49fb668ecdad62c3aceb6e649f4668b58af1784c32,15fbe3e1-IMG_0481.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -455d618e94ebf2e469ede016e06c48def5cc14ef68c090584b31570b9fc5e34e,455d618e-IMG_2957.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -dae46cfca7baa921675ffaf74701617b6fe10e629c5e7f099c67bf21a3f2a62c,dae46cfc-IMG_0356.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -cb4d61e66982736d552b043866d80bfb304fe1f44ec07f3acabeff71d08b3708,cb4d61e6-IMG_1681.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -c7776595d517bebab73370b6395deb1dc2bb507f99d2bd551bfe1a2416f5165b,c7776595-168E1031-ADC1-48A2-8B63-F5EB228DF5B4.JPG,neg,iPhone (me/post_photos),,3664,2062,jpeg,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 5fe59521d579b536340253d2bcaa7c28ddd2485fa964fc27a9b9e5118ad0cdd1,5fe59521-IMG_1496.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -81e4e532c124b182b1608d19feda52b829390adc9b77f47b72d89829035917ff,81e4e532-IMG_2193.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) 4ead7918a5aeea7fba78b36af44358fea7ed1db7f46f4bc675152b9d04e68c38,4ead7918-IMG_1300.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:48Z,post photo; no C2PA/SynthID (verified) -75f8a25c217374689d8224d58736f09245882334a9e4d39931025bd66a6df341,75f8a25c-IMG_3540.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -574acd7b8a49652d62df90539c2e18d1f3f510399a294f6c5209ab725c96a7df,574acd7b-IMG_3393.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -8115feaa7b758fd1b984c55355fc8f4c10dfe02192fe810bb6692556190d5176,8115feaa-IMG_1341.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) 4c795238b89178cf52a3674e721ed7f4cd5068028385491d12171a3c62545c35,4c795238-IMG_3034.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) 5abfaccb37c549de67c7f3a751a528a423e24a82c643fdb29094be8debbb206d,5abfaccb-IMG_3018.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) 5fed1923d513c1e9ffcba2f240e617fa9344fb39d35144169570ece8b0bd0f33,5fed1923-IMG_0272.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -b3e1b034bc9ff1fd7e3db77ae0f0a695fcb4ed7bdcb473312427d78aa18700a1,b3e1b034-IMG_1199.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -79a12ccab0ccb954b1917d8edc75cb7c01d02c3a803b34f45be7afdb69cf80ea,79a12cca-IMG_0767.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -7252adc2103f7be6d04d56e0eed0d90122c8203af0ae08c28f922338b7c1bbb5,7252adc2-IMG_0623.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) 06b04d8fe8e1cd6bee9a973f93bfda37586924cbfec7d372f59d52aa9196160b,06b04d8f-IMG_1474.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -591636c01c57864c44bdf7c1062bf6fca87efa8fae25bfc58c7cffb5a73424ab,591636c0-IMG_2809.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -ca2f226f45a5e37071605f074fa64de31cd09f923b22f57bb8255aa9046c6b92,ca2f226f-IMG_1419.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -ed751e2489ce4b26c268019942ed65a1f95a10f8056f26ac646d7d19e5db58ad,ed751e24-IMG_1225.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -3757e6100e567cbbf8eadf4cb8a064d79073cea1588251125a3b1ae13893e778,3757e610-IMG_2583.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -e973424c779cfa5dcd2403f103673423771192509395586f8efc459c92240d5d,e973424c-IMG_2215.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -46657fb69680b3e5db8fdb17aa306f2b6ee41a719408ac5812ff4cb399e15485,46657fb6-IMG_1439.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -dd112d116dda31847b50f40ab0990306d1c1f137780c67bb094ee6992f2d6f7e,dd112d11-IMG_1317.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -a0cdcc17d39eda2a7b2c34ff1f4ed97290fa996fef530c1d24da91722b1a6893,a0cdcc17-IMG_0005.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -70fabcbeedafb3c033d5805328ffd12bf644102e8666b878eca5968bd075b3fe,70fabcbe-IMG_3500.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) 8fdb574a94e65e14ac29017cf2d5a2ede18a8c4e3f12e04c64292b0d38570062,8fdb574a-IMG_3557.HEIC,neg,iPhone (me/post_photos),,4032,3024,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -cb6777332e357aa38916400c2c1fe76801aad54946e789e9fa6a7d4659d02948,cb677733-IMG_3582.HEIC,neg,iPhone (me/post_photos),,5712,4284,heic,,,none,2026-05-24T20:58:49Z,post photo; no C2PA/SynthID (verified) -72c71846fdb9eb3d960142c24627304349ee4fd8665d10d06e336430b0e20d80,72c71846-meta_lake.jpg,neg,Meta AI,meta,810,1440,jpeg,,,none,2026-05-24T21:33:47Z,"IPTC Made-with-AI (trainedAlgorithmicMedia); NO SynthID, NO C2PA" c86973424817f62510e2a312b85c52e05adf47ace87a8e717fd442607596f501,c8697342-aistudio_lake.png,pos,Google AI Studio (Nano Banana),gemini-2.5-flash-image,1024,1024,png,,,gemini-app,2026-05-24T21:39:09Z,"API/playground: SynthID pixel CONFIRMED (Gemini-app oracle) + visible sparkle, but NO C2PA/IPTC -> synthid_source blind spot" 1f81827c06d67cf6f6c7f5d53ec8f9738183942a6d1d2717b161fea0fdcc540a,1f81827c-Designer.png,pos,Microsoft Designer,dall-e (Designer),1024,1024,png,"OpenAI, Microsoft",yes,c2pa-metadata,2026-05-24T22:18:40Z,C2PA issuer OpenAI+Microsoft; synthid_source=OpenAI (DALL-E surface inherits OpenAI SynthID+C2PA) -f3ebe4683fc40aa2a0b80cc3ced3dc8062385ae32b488f4b33cb2330949e658d,f3ebe468-leonardo_lake.jpg,neg,Leonardo.ai,lucid-origin,1024,1024,jpeg,,,none,2026-05-24T22:22:15Z,non-SynthID AI; NO provenance metadata (no C2PA/IPTC/SynthID) -12775f4c0aec1ecd615e88c4941a788a053d0258d08d31ad34d330d3e21969bd,12775f4c-grok_original.jpg,neg,Grok (xAI),aurora,784,1168,jpeg,,,none,2026-05-24T22:47:46Z,full-res original via Download button; xAI non-adopter; NO C2PA/IPTC/SynthID (has benign EXIF block) -74b605deb102d74443a182f70fbea34a6a470bed381d62ae0bfa0083a6ecc5a3,74b605de-_e1f7984d-98e7-4cdc-91d2-f72314a4bc56.jpeg,neg,Bing Image Creator,MAI-Image-2e,1024,1024,jpeg,,,c2pa-metadata,2026-05-25T00:10:28Z,C2PA issuer Microsoft; non-SynthID; issuer-coverage fixture -f9bb6b1039ee228221d2eead7daebd46422a36a4a8959a74fa0198e1aa19f9b8,f9bb6b10-a_red_ceramic_coffee_mug_on_a_wooden_table_soft_morning_light_photorealistic_20260525000725_04.png,neg,Stability Brand Studio,Stable Image,1024,1024,png,Stability AI,,c2pa-metadata,2026-05-25T00:10:31Z,C2PA issuer Stability AI; non-SynthID; no imwatermark -23a06e0067930a9ad09a803f634414eb8ca0234fc0bbaca8d33f138745175e2e,23a06e00-a-red-ceramic-coffee-mug-on-a-wooden-table--soft-m.png,neg,Recraft V4.1,recraft-v4,896,1152,png,,,none,2026-05-25T01:21:35Z,"PNG export, no C2PA/EXIF/IPTC/imwatermark; clean download" -4f3fea84c24fda8d72a6e7bfbae31827348d9edc755ec9a5e8c835860130de57,4f3fea84-a_red_ceramic_coffee_mug_on_a_wooden_table_soft_morning_light_photorealistic_67qgxtyin9kjk5yb5mph_0.png,neg,Krea (FLUX 2 host),flux-2-dev via Krea,832,1248,png,,,none,2026-05-25T01:21:38Z,no imwatermark despite FLUX; Krea host strips/omits; clean download -7bdff2c3131cdc21783282a8a95c88f4b14ad38494a1041d0d68691af7fa5cd8,7bdff2c3-0001_1_a-red-ceramic-coffee-mug-sits-on-weather_D3BRZfOyUwuh5Emjtu8v4g_F7yI1GFGTayDA1NAUmkraw_cover.jpeg,neg,Ideogram,ideogram-3,1024,1024,jpeg,,,none,2026-05-25T01:36:38Z,EXIF Make='Ideogram AI'; no C2PA/SynthID; caught via exif_generator -ca2162624607b8f030c63cb1371d6afdd3f0d7af3d9b17514f7ae64a2e8f378c,ca216262-0001_2_a-red-ceramic-coffee-mug-sits-on-weather_rs0Lt1beXV-Mwjs33vWKVw_F7yI1GFGTayDA1NAUmkraw.jpeg,neg,Ideogram,ideogram-3,1024,1024,jpeg,,,none,2026-05-25T01:36:38Z,EXIF Make='Ideogram AI'; no C2PA/SynthID; caught via exif_generator -8a90f2ddf83ceedd7944531d27248191c79dc321ec76ea1f36df6cff9f6b8916,8a90f2dd-0001_3_a-red-ceramic-coffee-mug-sits-on-weather_Lm96lBwcXsmdeCfCpm52vw_F7yI1GFGTayDA1NAUmkraw.jpeg,neg,Ideogram,ideogram-3,1024,1024,jpeg,,,none,2026-05-25T01:36:38Z,EXIF Make='Ideogram AI'; no C2PA/SynthID; caught via exif_generator -87fca198d5c436b27a16685972802a2ff0a310a941248c9ec8d81560d7f387a1,87fca198-0001_4_a-red-ceramic-coffee-mug-sits-on-weather_pGmlgcH4XqSaq41hc0a9AQ_F7yI1GFGTayDA1NAUmkraw.jpeg,neg,Ideogram,ideogram-3,1024,1024,jpeg,,,none,2026-05-25T01:36:38Z,EXIF Make='Ideogram AI'; no C2PA/SynthID; caught via exif_generator f6dd47a5ffd319aea21bf10dcf9877097666420b02c2620080bac12b03976e7e,f6dd47a5-4ef377bd-gpt-image-2-cleaned.png,cleaned,"our pipeline (invisible/SDXL, native-res default)",stabilityai/stable-diffusion-xl-base-1.0,1254,1254,png,,,openai-verify,2026-05-25T20:50:38Z,"cleaned from 4ef377bd via v0.5.3 'all' at native 1254x1254 (prod-equivalent); openai.com/verify: SynthID NOT detected. Re-confirms #10 native-res default defeats OpenAI SynthID (closes #15 root cause). Note: native res OOMs on 20GB MPS, auto-fell back to CPU." diff --git a/tests/conftest.py b/tests/conftest.py index c21e131..4b4fd78 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,10 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from pathlib import Path +from pathlib import Path import cv2 import numpy as np @@ -13,6 +10,22 @@ import pytest from PIL import Image from PIL.PngImagePlugin import PngInfo +CORPUS_NEG_DIR = Path(__file__).resolve().parent.parent / "data" / "synthid_corpus" / "images" / "neg" + + +@pytest.fixture +def clean_photo() -> Path: + """A verified-negative real photo from the corpus neg/ set. + + Used by the "non-AI image" assertions (no SynthID, verdict unknown). These + are real photos with no AI provenance, the ground truth for "must not false- + positive". Skips if the corpus is not checked out. + """ + files = sorted(CORPUS_NEG_DIR.glob("*")) if CORPUS_NEG_DIR.exists() else [] + if not files: + pytest.skip("no corpus neg/ images present") + return files[0] + @pytest.fixture def tmp_image_path(tmp_path: Path) -> Path: diff --git a/tests/test_identify.py b/tests/test_identify.py index 9ef7a33..bbb39d4 100644 --- a/tests/test_identify.py +++ b/tests/test_identify.py @@ -156,15 +156,15 @@ class TestIdentifyRealSamples: assert r.is_ai_generated is True assert any("IPTC" in w for w in r.watermarks) - def test_clean_photo_is_unknown_not_clean(self): - r = identify(SAMPLES_DIR / "not-ai-1.jpeg", check_visible=False) + def test_clean_photo_is_unknown_not_clean(self, clean_photo: Path): + r = identify(clean_photo, check_visible=False) assert r.is_ai_generated is None # never asserted False assert r.platform is None assert r.confidence == "none" assert r.watermarks == [] - def test_strip_caveat_always_present(self): - r = identify(SAMPLES_DIR / "not-ai-1.jpeg", check_visible=False) + def test_strip_caveat_always_present(self, clean_photo: Path): + r = identify(clean_photo, check_visible=False) assert any("not proof" in c for c in r.caveats) def test_returns_report_dataclass(self): diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 1ee3889..dc77b94 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -224,8 +224,8 @@ class TestSynthIDSource: assert synthid_source(SAMPLES_DIR / "firefly-1.png") is None assert "synthid_watermark" not in get_ai_metadata(SAMPLES_DIR / "firefly-1.png") - def test_non_ai_image_is_not_synthid_source(self): - assert synthid_source(SAMPLES_DIR / "not-ai-1.jpeg") is None + def test_non_ai_image_is_not_synthid_source(self, clean_photo: Path): + assert synthid_source(clean_photo) is None class TestSynthIDSourceNonPng: @@ -377,6 +377,24 @@ class TestExifGenerator: Image.new("RGB", (64, 64)).save(path, exif=exif) assert exif_generator(path) is None + def test_artist_tag_ai_tool_detected(self, tmp_path: Path): + # exif_generator also reads the EXIF Artist field for an AI token. + exif = piexif.dump({"0th": {piexif.ImageIFD.Artist: b"Midjourney"}, "Exif": {}, "GPS": {}, "1st": {}}) + path = tmp_path / "artist.jpg" + Image.new("RGB", (64, 64)).save(path, exif=exif) + assert exif_generator(path) == "Midjourney" + + def test_imagedescription_tag_ai_tool_detected(self, tmp_path: Path): + # ...and the EXIF ImageDescription field. + exif = piexif.dump( + {"0th": {piexif.ImageIFD.ImageDescription: b"Made with Stable Diffusion"}, "Exif": {}, "GPS": {}, "1st": {}} + ) + path = tmp_path / "desc.jpg" + Image.new("RGB", (64, 64)).save(path, exif=exif) + result = exif_generator(path) + assert result is not None + assert "Stable Diffusion" in result + def test_xmp_creatortool_scan_covers_unopenable(self, tmp_path: Path): # PIL can't open this fake HEIF; the raw XMP CreatorTool scan still works. path = tmp_path / "fake.heic" diff --git a/tests/test_noai.py b/tests/test_noai.py index 63e18e9..a1a804f 100644 --- a/tests/test_noai.py +++ b/tests/test_noai.py @@ -259,6 +259,29 @@ class TestParseChunkGuards: assert "OpenAI" in info["issuer"] # issuer byte-search still robust +class TestC2PADigitalSourceType: + """The three IPTC digitalSourceType variants drive the AI verdict. + + Only *trained* and *composite-with-trained* mean AI-generated (and so imply + a SynthID proxy for a SynthID vendor); plain ``algorithmicMedia`` is + procedural (not trained) and must NOT be flagged as AI. + """ + + def test_plain_algorithmic_media_not_flagged_ai(self): + chunk = b"...name" + bytes([0x69]) + b"some-tool" + b" OpenAI algorithmicMedia" + info: dict = {} + _parse_c2pa_chunk(chunk, info) + assert info["source_type"] == "algorithmicMedia" + assert "synthid_watermark" not in info # procedural, not AI-generated + + def test_composite_with_trained_is_ai_and_synthid(self): + chunk = b"...name" + bytes([0x69]) + b"some-tool" + b" OpenAI compositeWithTrainedAlgorithmicMedia" + info: dict = {} + _parse_c2pa_chunk(chunk, info) + assert "compositeWithTrainedAlgorithmicMedia" in info["source_type"] + assert "synthid_watermark" in info # AI-enhanced + OpenAI issuer + + # ── ISOBMFF (AVIF / HEIF / JPEG-XL container stripping) ────────────── FTYP = b"\x00\x00\x00\x18ftypavif\x00\x00\x00\x00avifmif1" # 24-byte ftyp box