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.13.5 · Text rules literal-unicode-c2pa-text-3 · Image rules png-jpeg-webp-container-2 · Media credentials c2pa-image-video-actions-1 · @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 remaining format controls, unusual spaces, bidirectional controls, tag characters, joiners, variation selectors, and mathematical invisible operators.

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.

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 statistical token watermarks such as SynthID Text, because those signals are not literal Unicode characters.

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. Supported c2pa.actions declarations are shown separately from validity so an invalid credential cannot be presented as trusted AI provenance. Video inspection is read-only and does not test frame-level SynthID.

Evidence reports

Every text or image scan can produce a local JSON evidence report. Reports contain scanner and ruleset versions, SHA-256 fingerprints, exact findings, coverage limits, and cleanup verification when performed. Raw text, pixels, 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.