Scanner methodology

How the checker reaches a result

The checker uses deterministic parsers and cryptographic validation—not an AI authorship score. This page records what is inspected, what is changed, the versions involved, and what a zero result means.

Current release

Scanner 2026.08.17.2 · Text rules literal-unicode-c2pa-text-4 · Image rules png-jpeg-webp-container-2 · Media credentials c2pa-image-video-actions-cleanup-3 · @contentauth/c2pa-web@0.13.4

Text scan

The text scanner first checks both C2PA 2.4 text formats. For unstructured text, it decodes contiguous Unicode variation selectors after the exact prefix; a supported wrapper must begin with C2PATXT\0, use version 1, and contain exactly the declared manifest byte count. For structured text, it locates fixed ASCII-armored delimiters and validates an absolute manifest URI or bounded embedded C2PA data URI. Complete credentials are counted once instead of exposing their encoded characters individually. The scanner then classifies 476 Unicode code points across format controls, unusual spaces, bidirectional controls, tag characters, joiners, variation selectors, mathematical invisible operators, and line or paragraph separators.

ActionPolicyExamples
RemoveDelete controls treated as safe clutter by this ruleset.Zero-width space, soft hyphen, supported bidi formatting controls.
Remove blockDelete a complete credential only when its whole host range is unambiguous.C2PA Unicode wrapper, recognized comment line, or manifest lines inside YAML/TOML front matter.
NormalizeReplace an unusual supported space with an ordinary space.Em space, thin space, no-break space.
ReviewShow the character but preserve it automatically because meaning or rendering may depend on it.Joiners, variation selectors, mathematical invisible operators, line and paragraph separators.

Complete C2PA Unicode wrappers are removed as one exact UTF-16 range. A structured block is automatically removed only when it occupies an exact recognized comment line or an exact three-line range inside bounded YAML or TOML front matter. External manifest URIs are never fetched. Corrupted, incomplete, oversized, unsupported, and host-ambiguous candidates are retained. This release performs structural C2PA text detection only: @contentauth/c2pa-web@0.13.4 does not accept text/plain, so manifest signatures, trust, external resources, and c2pa.hash.data bindings are reported as not validated. Read the invisible-wrapper guide or the structured-text guide.

The scanner does not estimate whether prose was written by a person or model. It does not test provider-keyed statistical token watermarks such as Gemini SynthID Text or Claude's keyed SynthID-Text variant. Those signals live in token choices rather than literal Unicode characters and require the matching provider configuration, key, or API.

PNG, JPEG, and WebP scan

The image parser validates PNG chunk boundaries and CRC values, JPEG segment boundaries, or WebP RIFF lengths, chunks, and padding before reporting supported metadata. It separates container metadata from render-relevant bytes. After cleaning, the checker recomputes a SHA-256 fingerprint over the retained render-relevant structure; the download is blocked if that fingerprint changes.

PolicyRemovedRetained
Provenance onlyRecognized embedded C2PA manifest structures.Exif, XMP, comments, rendering profiles, image data.
Privacy cleanRecognized C2PA, Exif, XMP, IPTC, comments, editor data, supported text, and timestamps.Rendering profiles, image data, and unclassified segments.

For WebP, cleanup rebuilds the RIFF file length and synchronizes the VP8X Exif and XMP feature flags while preserving encoded image, alpha, animation, and color-profile chunks. C2PA chunks are accepted only at the required end of the WebP RIFF container. Read the focused WebP metadata and C2PA guide.

C2PA validation

For PNG, JPEG, WebP, MP4, MOV, and M4V, the browser uses @contentauth/c2pa-web@0.13.4 with post-read verification and trust checking enabled. It fetches the current C2PA signing and time-stamp trust anchors from the official conformance repository. Your media bytes are processed in the browser and are not sent with those trust-list requests. The report preserves every declared c2pa.actions entry, its software agent and declared action time, plus the credential signer, certificate issuer, and signature time when available.

A c2pa.watermarked.unbound action means the signer declares that an invisible watermark was inserted without a soft binding. When the credential validates, the checker can validate that declaration as part of the signed claim; it still does not independently inspect the pixels or frames to prove that the watermark remains detectable. The generic C2PA action also does not identify the watermark technology, so the checker does not relabel an OpenAI declaration as Google SynthID. Video cleanup replaces only verified top-level C2PA UUID boxes with equal-size standard free-space boxes, preserving file length and media offsets.

Evidence reports

Every text, image, or video scan can produce a local JSON evidence report. Reports contain scanner and ruleset versions, SHA-256 fingerprints, exact findings, C2PA action history and identity fields, coverage limits, and cleanup verification when performed. Raw text, pixels, frames, and filenames are excluded. The report itself is created and downloaded in the browser.

The report is not cryptographically signed or independently time-stamped. Its time comes from the user's device, and it does not prove authorship, custody, or when a file first existed. It is an auditable record of a local scan: another person can compare the SHA-256 fingerprint with the same content and inspect the stated method.

How to interpret zero

Zero means no supported signal was found in the inspected layer. It never means “human-written,” “not AI-generated,” or “all possible watermarks absent.” Unsupported, provider-keyed, pixel-level, externally discoverable, or damaged signals remain outside the result.

Change policy

A ruleset version changes when detection or cleanup behavior changes. The scanner version changes when any report-relevant component changes. Evidence reports preserve both values so results can be interpreted against the method used at scan time.