Skip to content

Robustness report

How well our marks hold up, measured on our own machines and published, as the Code of Practice's Commitment 3 asks. Measured 2026-10-23, on CPU, with the code and models the API runs.

Two layers, two kinds of strength

  • The C2PA manifest is metadata, signed: it proves who signed what, and breaks loudly if the file changes. Most platforms strip metadata when they re-encode an upload, so it rarely survives a re-post.
  • The watermark (TrustMark, variant Q) is in the pixels and carries a 61-bit ID. It survives the usual re-encoding and resizing, and its ID leads to the file's durable credential, the manifest we keep. This report measures it.

How it was measured

78 AI pictures made by GenVista (everyday scenes; median 0.7 megapixels), each watermarked with a random ID as the API does, then edited each way below, and read back. A success is the exact ID; anything else, including no watermark found, counts as a miss. The same edits on the pictures without a watermark show how often the reader claims a mark that isn't there. Intervals are Wilson's 95%. marker/tools/robustness.py reproduces it.

The watermark after each edit

Watermark IDs read back after each edit
EditID read back95% intervalUnmarked pictures read as marked
Unchanged (PNG)100% (78/78)95.3%–100%0
JPEG, quality 95100% (78/78)95.3%–100%0
JPEG, quality 85100% (78/78)95.3%–100%0
JPEG, quality 75100% (78/78)95.3%–100%0
JPEG, quality 60100% (78/78)95.3%–100%0
JPEG, quality 50100% (78/78)95.3%–100%0
WebP, quality 80100% (78/78)95.3%–100%0
Long side 1080 px, JPEG 85 (a social network's upload)100% (78/78)95.3%–100%0
Resized to 75%100% (78/78)95.3%–100%0
Resized to 50%100% (78/78)95.3%–100%0
Resized to 25%100% (78/78)95.3%–100%0
Cropped to the centre 90% of each side100% (78/78)95.3%–100%0
Cropped to the centre 75% of each side52.6% (41/78)41.6%–63.3%0
Cropped to the centre 50% of each side0% (0/78)0%–4.7%0
Brightness +20%88.5% (69/78)79.5%–93.8%0
Brightness −20%100% (78/78)95.3%–100%1
Contrast +20%100% (78/78)95.3%–100%0
Contrast −20%100% (78/78)95.3%–100%0
Saturation +30%100% (78/78)95.3%–100%0
Greyscale98.7% (77/78)93.1%–99.8%1
Gaussian blur, radius 1 px100% (78/78)95.3%–100%0
Gaussian blur, radius 2 px100% (78/78)95.3%–100%0
Gaussian noise, σ 5100% (78/78)95.3%–100%0
Gaussian noise, σ 10100% (78/78)95.3%–100%0
Rotated 2° and cropped straight100% (78/78)95.3%–100%0
Rotated 5° and cropped straight41.0% (32/78)30.8%–52.1%0
Mirrored left to right100% (78/78)95.3%–100%0

The watermark costs little: a median PSNR of 42.2 dB against the original (the lowest 39.0 dB). On a laptop CPU, embedding took a median 0.15 s and reading 0.06 s.

Where it weakens: crops that keep less than about 80% of each side (half the IDs survive at 75%, none at 50%), rotations of a few degrees (41% at 5°), and strong brightening. Edits made on purpose to remove it weren't tested. A missing watermark proves nothing about a picture. A found one is worth what its credential says: the reader claimed a mark on an unmarked picture 2 times in 2,106, each time with a random 61-bit ID that all but certainly leads to no credential, so always look the ID up.

The safety check's false alarms

The same 78 everyday pictures through the safety check, under both policies: everyday pictures should all be allowed.

Everyday pictures the safety check flagged or blocked
PolicyAllowedFlagged or blocked95% interval of false alarms
ai-act78/7800%–4.7%
safe-only78/7800%–4.7%

A check took a median 0.12 s on a laptop CPU. How often explicit pictures are caught isn't measured here: no test of ours makes or holds a sexual picture. The nudity classifier's own published evaluation stands in for it, and the apparent-age error rates measured on FairFace's faces are on the safety check's page, with its known limits.