{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/aimeat-io/json-schema/aimeat-io-ai-provenance-declaration-schema.json",
  "title": "AiProvenanceDeclaration",
  "description": "What a caller SAYS about how the content in this request was made — the input block, not the stored record. It is the same shape the MCP write tools take as `ai_provenance`, so a statement means one thing whichever surface it arrives on.\n\nWhat is deliberately absent is identity. There is no principal, no node and no attestation here: the node fills in who you are, which node, when, and the hash of the exact bytes, and it never takes any of those from the caller. A declaration is believed about the HOW and never about the WHO.\n\nOmitting the block is not an error. For an AGENT or ECOSYSTEM principal the node then stamps a record itself (`stampedBy: node`) — silence from a non-human writer must not read as \"a human wrote it\" — while an OWNER principal is never stamped.\n",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/aimeat-io-openapi.json#/components/schemas/AiProvenanceDeclaration",
  "type": "object",
  "required": [
    "level"
  ],
  "properties": {
    "level": {
      "type": "string",
      "enum": [
        "original",
        "assisted",
        "synthesized",
        "ai-generated"
      ],
      "description": "How much of this a model made. `original` = a person wrote it, no model involved. `assisted` = a person wrote it and a model edited or refined it. `synthesized` = a model combined real sources into new content at someone's direction. `ai-generated` = a model produced it.\n"
    },
    "method": {
      "type": "string",
      "enum": [
        "human",
        "rewritten",
        "summarized",
        "translated",
        "synthesized",
        "fully-generated",
        "multi-agent",
        "transcribed"
      ],
      "description": "Optional detail under `level`."
    },
    "media_kind": {
      "type": "string",
      "enum": [
        "text",
        "image",
        "audio",
        "video",
        "code",
        "data"
      ],
      "description": "What kind of thing this is. It gives the label its words (a picture is not \"this text\") and decides whether the deep-fake rule applies, which reaches image, audio and video only. Omitted: the node states text for text it stores, and nothing for bytes.\n"
    },
    "media_type": {
      "type": "string",
      "description": "The IANA media type of the bytes."
    },
    "resembles_real": {
      "type": "string",
      "enum": [
        "yes",
        "no",
        "unknown"
      ],
      "description": "For image, audio or video: does it resemble a real person, place, object or event? Public synthetic media is labelled either way; this decides only whether the record cites the deep-fake rule.\n"
    },
    "human_involvement": {
      "type": "string",
      "enum": [
        "none",
        "light-review",
        "editorial-control",
        "full-human"
      ],
      "description": "Whether a person examined what the model produced. Only a step where someone reads the SUBSTANCE and can reject it counts — a skim, a spell-check or clicking publish is `light-review` at most. Omitted means `none`.\n"
    },
    "model": {
      "type": "string",
      "description": "The model that produced it, as the provider names it. When the declarer made it, this is its own model id. Without it the record says only who served the model, never which one, and an app publish answers with the `provenance-without-model` hint.\n"
    },
    "provider": {
      "type": "string",
      "description": "Who SERVED the model, when that is not obvious from its name. Worth stating whenever the declarer routes through an intermediary: \"which model\" and \"who ran it\" are different questions, and a router alias answers neither on its own.\n"
    },
    "sources": {
      "type": "array",
      "maxItems": 100,
      "description": "For synthesized content, where the material came from.",
      "items": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "pattern": "^https?://",
            "description": "http or https ONLY, checked at the door. A declaration carrying any other scheme is refused with a validation error rather than minted."
          },
          "title": {
            "type": "string"
          },
          "retrieved_at": {
            "type": "string",
            "format": "date-time"
          },
          "role": {
            "type": "string",
            "description": "How it was used, e.g. 'primary' or 'background'."
          }
        }
      }
    },
    "notes": {
      "type": "string",
      "maxLength": 1000,
      "description": "Anything a reader needs to interpret the above. Never prompt text or anything private — the record is publishable alongside the content.\n"
    }
  }
}