{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://syngraphe.org/schemas/ai-interaction-receipt/v1",
  "title": "Syngraphe AI Interaction Receipt structural schema v1",
  "$comment": "Structural envelope only. Runtime parsing and verification are mandatory; cross-field, temporal, ordering, uniqueness, serialized-size, and statistical invariants are runtime-only.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema",
    "receipt_id",
    "session_id",
    "evidence_class",
    "endpoint",
    "model_id",
    "request_digest",
    "response_digest",
    "timestamp",
    "retention_class",
    "terms_in_force",
    "credential_status",
    "transparency",
    "trust_statement",
    "session_proof_envelope"
  ],
  "properties": {
    "schema": {
      "const": "https://syngraphe.org/schemas/ai-interaction-receipt/v1"
    },
    "receipt_id": { "$ref": "#/$defs/identifier" },
    "session_id": { "$ref": "#/$defs/identifier" },
    "evidence_class": {
      "enum": ["zktls-bound", "gateway-signed", "declared"]
    },
    "endpoint": {
      "type": "string",
      "maxLength": 2048,
      "pattern": "^https://[^?#]+$"
    },
    "model_id": { "$ref": "#/$defs/identifier" },
    "request_digest": { "$ref": "#/$defs/digest" },
    "response_digest": { "$ref": "#/$defs/digest" },
    "timestamp": { "$ref": "#/$defs/timestamp" },
    "retention_class": {
      "enum": [
        "anthropic-covered-model-30d",
        "anthropic-feature-specific",
        "anthropic-zero-data-retention",
        "google-approved-zero-data-retention",
        "google-feature-specific",
        "google-paid-service-limited-abuse-monitoring",
        "openai-abuse-monitoring-30d",
        "openai-application-state-30d",
        "openai-modified-abuse-monitoring",
        "openai-zero-data-retention",
        "undeclared"
      ]
    },
    "terms_in_force": {
      "type": "object",
      "additionalProperties": false,
      "required": ["terms_id", "document_digest", "effective_at"],
      "properties": {
        "terms_id": { "$ref": "#/$defs/uri" },
        "document_digest": { "$ref": "#/$defs/digest" },
        "effective_at": { "$ref": "#/$defs/timestamp" }
      }
    },
    "credential_status": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "type",
        "statusPurpose",
        "statusListIndex",
        "statusListCredential"
      ],
      "properties": {
        "id": { "$ref": "#/$defs/uri" },
        "type": { "const": "BitstringStatusListEntry" },
        "statusPurpose": { "const": "revocation" },
        "statusListIndex": {
          "type": "string",
          "pattern": "^(0|[1-9][0-9]{0,15})$"
        },
        "statusListCredential": { "$ref": "#/$defs/uri" }
      }
    },
    "transparency": {
      "type": "object",
      "additionalProperties": false,
      "required": ["log_id", "checkpoint_digest", "inclusion_proof_digest"],
      "properties": {
        "log_id": { "$ref": "#/$defs/uri" },
        "checkpoint_digest": { "$ref": "#/$defs/digest" },
        "inclusion_proof_digest": { "$ref": "#/$defs/digest" }
      }
    },
    "trust_statement": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "notaries",
        "notary_trust_model",
        "quorum",
        "terminating_party",
        "witness_mode"
      ],
      "properties": {
        "notaries": {
          "type": "array",
          "maxItems": 16,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["id", "jurisdiction", "key_ref", "operator"],
            "properties": {
              "id": { "$ref": "#/$defs/identifier" },
              "jurisdiction": {
                "type": "string",
                "pattern": "^[A-Z]{2}(?:-[A-Z0-9]{1,3})?$"
              },
              "key_ref": { "$ref": "#/$defs/keyReference" },
              "operator": { "$ref": "#/$defs/identifier" }
            }
          }
        },
        "notary_trust_model": {
          "enum": ["counterparty", "none", "tee", "threshold"]
        },
        "quorum": {
          "type": "object",
          "additionalProperties": false,
          "required": ["k", "n"],
          "properties": {
            "k": { "$ref": "#/$defs/count" },
            "n": { "$ref": "#/$defs/count" }
          }
        },
        "terminating_party": {
          "enum": ["cloudflare", "google-fe", "provider"]
        },
        "witness_mode": {
          "enum": ["mpc-tls", "provider-signature", "proxy-tls", "tee-quote"]
        }
      }
    },
    "session_proof_envelope": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "required": ["state", "schema", "digest"],
          "properties": {
            "state": { "const": "present" },
            "schema": {
              "const": "https://syngraphe.org/schemas/session-proof-envelope/v1"
            },
            "digest": { "$ref": "#/$defs/digest" }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": ["state", "gap"],
          "properties": {
            "state": { "const": "gap" },
            "gap": {
              "allOf": [
                {
                  "$ref": "https://syngraphe.org/schemas/countersign-verification-gap/v1"
                },
                {
                  "type": "object",
                  "properties": {
                    "component": { "const": "session-proof-envelope" }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  },
  "allOf": [
    {
      "if": {
        "properties": { "evidence_class": { "const": "zktls-bound" } },
        "required": ["evidence_class"]
      },
      "then": {
        "properties": {
          "session_proof_envelope": {
            "type": "object",
            "properties": { "state": { "const": "present" } },
            "required": ["state"]
          }
        }
      },
      "else": {
        "properties": {
          "session_proof_envelope": {
            "type": "object",
            "properties": { "state": { "const": "gap" } },
            "required": ["state"]
          }
        }
      }
    }
  ],
  "$defs": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 65535
    },
    "digest": {
      "type": "string",
      "pattern": "^sha256:[a-f0-9]{64}$"
    },
    "identifier": {
      "type": "string",
      "minLength": 1,
      "maxLength": 256,
      "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]*$"
    },
    "keyReference": {
      "type": "string",
      "pattern": "^(?:ed25519|k256|ml-dsa-65):sha256:[a-f0-9]{64}$"
    },
    "timestamp": {
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"
    },
    "uri": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2048,
      "pattern": "^[A-Za-z][A-Za-z0-9+.-]*:[^\\s]+$"
    }
  }
}
