in-toto predicate: detection/v1
A signed statement about one Article 50(2) detection run over a content manifest, carried in an in-toto Statement v1 envelope.
- predicateType
https://councilof.ai/attestations/detection/v1
- Statement
https://in-toto.io/Statement/v1
- DSSE payloadType
application/vnd.in-toto+json
- Signature
- Ed25519,
did:web:csoai.org#board-attestation-1
- Canonicalisation
- Recursively sorted keys, no whitespace — byte-identical to RFC 8785 for ASCII/number payloads
- Issuer
- CSOAI Ltd (Council of AI), UK company 16939677
Why this exists
EU AI Act Article 50(2) requires that synthetic content be marked in a machine-readable way.
That obligation was not deferred by the Digital Omnibus: it is enforced, with the
machine-readable marking deadline standing at 2 December 2026. A passport that asserts a mark is
only as good as the check behind it. This predicate carries the result of that check, signed, so a
reader can verify the detection rather than trust the assertion.
Scope — read this before relying on it
Two layers are declared and only one is checked. The metadata layer is
verified: Ed25519 over the canonical claim. The watermark layer is
declared, not checked. An attestation under this predicate says nothing about
whether a watermark is present or intact.
A manifest that cannot be resolved returns UNVERIFIABLE — never a pass, never a
fabricated failure. The endpoint is free for everyone and unrestricted for authorities, media,
fact-checkers, researchers and civil society.
What it establishes — and what it does not
An attestation under this predicate is evidence of what was checked, and when, by the
issuer. It is not a certification, an endorsement, or a conformity mark,
and must not be presented as one. It is not a finding that content is or is not AI-generated.
Verifying the signature establishes that the named key produced these bytes and that the bytes
have not changed. It says nothing about the state of that key now: offline verification is a
computation over the parameters you hold, while revocation is a property of the present. A consumer
must not treat a signature that verifies as evidence that the signing key is still valid. Where a
decision depends on revocation state, the key-resolution path and the staleness you accept are
operational parameters of your deployment and must be stated by it. Recorded against our own rule as
correction C-2026-0902-09.
Shape
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [{ "name": "ai-content-detection", "digest": { "sha256": "<hex>" } }],
"predicateType": "https://councilof.ai/attestations/detection/v1",
"predicate": {
"verdict": "<verdict | UNVERIFIABLE>",
"article": "EU AI Act Article 50(2)",
"verifies": {
"metadata_layer": "Ed25519 over canonical claim",
"watermark_layer": "declared, not checked"
},
"as_of": "<RFC 3339>"
}
}
Complements /api/article50, which issues a passport: this endpoint proves the mark
that one otherwise trusts.
Verify one
POST a manifest to /api/detect. Offline card
verifier, zero dependencies, three states rather than two:
gspc-verify.mjs (Apache-2.0).
Rule: HOW-TO-VERIFY.md.
Live board: GET /api/gspc.