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.