AI Content Detection
Inbound-asset provenance detector. Counterpart to the outbound b.contentCredentials seal path: the operator extracts whatever provenance metadata their format-specific muxer surfaces (C2PA-COSE envelope from JPEG XMP / PNG iTXt / MP4 boxes, CAC implicit-label JSON from the embedded metadata block, IPTC digitalSourceType when an IPTC PhotoMetadata reader is wired), feeds them to report({...}), and renders the normalized result in their user-facing UI. California AB-853 §22757.21 requires the disclosure; the framework owns the validation + trust-list anchor layer, the application owns the rendering.
Trust-list anchored: the operator declares which signer subjects are acceptable. Default trust list is empty — the framework does not ship a curated CA list. Operators that want a one-line ramp point at the public C2PA Trust List per https://opensource.contentauthenticity.org/docs/trust-list.
Posture vocabulary: strict (refuse on signature invalid, refuse on signer not on trust list), balanced (refuse on cryptographic tamper, audit-only on missing provenance), permissive (audit-only across the board). Default balanced.
IPTC digitalSourceType PhotoMetadata reading is forward-watch — the framework ships no XMP / EXIF parser yet, so operators that want IPTC detection pre-parse with their tool of choice and pass the field via opts.ipmd. AB-853 names C2PA as "widely adopted". A built-in IPTC PhotoMetadata reader is deferred pending a vendoring decision for an XMP/EXIF parser; the opts.ipmd escape hatch covers the gap until then.
b.ai.aiContentDetect.report(opts) #
{
c2paEnvelope: object, // { manifest, signature } from operator's C2PA extractor
c2paPublicKeyPem: string, // PEM for verify (operator-pinned signer key)
cacImplicitLabel: Buffer|string|object, // GB 45438-2025 implicit metadata block
ipmd: object, // IPTC PhotoMetadata digitalSourceType field (operator-pre-parsed)
trustList: string[], // acceptable signer subject identifiers
profile: "strict"|"balanced"|"permissive",
posture: string, // pins profile per posture vocabulary
}
Build a normalized provenanceReport from the provenance artifacts an operator's muxer extracted from an inbound asset. At least one of c2paEnvelope, cacImplicitLabel, or ipmd must be supplied; absence of all three returns kind: "none" with verified: false.
var report = b.ai.aiContentDetect.report({
c2paEnvelope: env, c2paPublicKeyPem: pem,
trustList: ["CN=Acme AI, O=Acme, C=US"],
posture: "ca-ab-853",
});
report.kind; // → "c2pa"
report.verified; // → true if signature OK and signer on trustList
b.ai.aiContentDetect.compliancePosture(posture) #
Return the effective profile name (strict / balanced / permissive) for a compliance posture, or null for unknown posture names. Operators introspect the cascade before wiring default-on paths.
b.ai.aiContentDetect.compliancePosture("ca-ab-853"); // → "strict"
Last updated 2026-08-08T16:39:49.652Z by seeder.