Agent Wranglers

CMP-72Required

Mark generated content so machines can detect it

Give every image, audio and video file a generative feature makes signed metadata and an invisible watermark. Watermark generated text, and offer a free tool that detects your marks.

How to do it

AI Act Article 50(2) asks providers of generative systems to mark output in a machine-readable way that can be detected. It has applied since 2 August 2026. Systems on the market before that date have until 2 December 2026. The Commission published the final Code of Practice on transparency of AI-generated content on 10 June 2026. Signing it is voluntary, but it is the accepted way to show you meet Article 50. No single technique is good enough yet, so the Code asks for two layers. The first is metadata that says the content is AI-made, digitally signed and time-stamped. The second is an invisible watermark that is hard to remove. Fingerprints or logs may be added, but never replace the two layers. Plain text cannot carry metadata, so a watermark alone is enough for text. The detection tool may be a public specification, a library or an API, and it is free. If you build on a vendor's model, you are still the provider of your feature. You may use the vendor's watermark and detector, but record which ones. C2PA Content Credentials is one open standard for the signed metadata. Never strip existing marks when you resize or convert uploaded files. Record the marks per feature in the AI register. The visible label for people follows label AI output where people see it.

Examples

YAML example

- id: product-photo-generator
  role: provider
  outputs: [image]
  marking:
    signed_metadata: c2pa
    watermark: vendor watermark of model-provider-a
  detector: https://example.com/ai-check

JavaScript example

const MEDIA = ['image', 'audio', 'video'];
export const markingProblems = entries => entries.filter(entry => entry.outputs?.length).flatMap(entry => [
  ...(entry.marking?.watermark ? [] : [`${entry.id}: no watermark`]),
  ...(entry.outputs.some(type => MEDIA.includes(type)) && !entry.marking?.signed_metadata ? [`${entry.id}: media without signed metadata`] : []),
  ...(entry.detector ? [] : [`${entry.id}: no detection tool`]),
]);

Python example

MEDIA = {"image", "audio", "video"}

def marking_problems(entries: list[dict]) -> list[str]:
    problems = []
    for e in (e for e in entries if e.get("outputs")):
        marking = e.get("marking") or {}
        if not marking.get("watermark"):
            problems.append(f"{e['id']}: no watermark")
        if MEDIA & set(e["outputs"]) and not marking.get("signed_metadata"):
            problems.append(f"{e['id']}: media without signed metadata")
        if not e.get("detector"):
            problems.append(f"{e['id']}: no detection tool")
    return problems

How to check

The build makes one sample of each output type through every generative feature. A metadata verifier, such as c2patool, finds a valid signature and an AI-generated statement on each image, audio and video sample. The detector finds the watermark on every sample. Every register entry with a generative feature names a detector address that answers 200.

Sources

For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/compliance/ai-act/ai-content-marking">Agent Wranglers compliance and governance playbook</a>. In code you write, add a comment next to it with the same link.