{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://bigscreenvr.github.io/omp-spt/contracts/release-evidence-v1.schema.json",
  "title": "omp-spt per-target release evidence",
  "description": "A passing, durable release record for one supported native target.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "release",
    "target",
    "environment",
    "artifacts",
    "acquisition",
    "native_acceptance",
    "tested_at"
  ],
  "properties": {
    "schema_version": {"const": 1},
    "release": {
      "type": "object",
      "additionalProperties": false,
      "required": ["version", "tag", "source_commit", "source_tree"],
      "properties": {
        "version": {
          "type": "string",
          "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
        },
        "tag": {
          "type": "string",
          "pattern": "^v[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
        },
        "source_commit": {"$ref": "#/$defs/gitObject"},
        "source_tree": {"$ref": "#/$defs/gitObject"}
      }
    },
    "target": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_]+(?:-[A-Za-z0-9_.]+)+$"
    },
    "environment": {
      "type": "object",
      "additionalProperties": false,
      "required": ["omp_version", "spt_core_version"],
      "properties": {
        "omp_version": {"$ref": "#/$defs/semver"},
        "spt_core_version": {"$ref": "#/$defs/semver"}
      }
    },
    "artifacts": {
      "type": "array",
      "minItems": 2,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["name", "sha256"],
        "properties": {
          "name": {"type": "string", "minLength": 1},
          "sha256": {"$ref": "#/$defs/sha256"}
        }
      }
    },
    "acquisition": {"$ref": "#/$defs/outcome"},
    "native_acceptance": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "fresh",
        "resume",
        "message_reply",
        "lifecycle",
        "shutdown",
        "ready_agent",
        "live_agent"
      ],
      "properties": {
        "fresh": {"$ref": "#/$defs/sessionOutcome"},
        "resume": {"$ref": "#/$defs/sessionOutcome"},
        "message_reply": {"$ref": "#/$defs/outcome"},
        "lifecycle": {"$ref": "#/$defs/outcome"},
        "shutdown": {"$ref": "#/$defs/outcome"},
        "ready_agent": {"$ref": "#/$defs/outcome"},
        "live_agent": {"$ref": "#/$defs/outcome"}
      }
    },
    "tested_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?(?:Z|[+-][0-9]{2}:[0-9]{2})$"
    }
  },
  "$defs": {
    "semver": {
      "type": "string",
      "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:(?:0|[1-9][0-9]*)|(?:[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*))(?:\\.(?:(?:0|[1-9][0-9]*)|(?:[0-9A-Za-z-]*[A-Za-z-][0-9A-Za-z-]*)))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$"
    },
    "opaqueId": {
      "type": "string",
      "pattern": "^\\S+$"
    },
    "gitObject": {
      "type": "string",
      "pattern": "^[0-9a-f]{40}(?:[0-9a-f]{24})?$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "evidenceRef": {
      "type": "string",
      "pattern": "^[^/\\\\#\\r\\n]+#sha256=[0-9a-f]{64}$"
    },
    "outcome": {
      "type": "object",
      "additionalProperties": false,
      "required": ["passed", "evidence"],
      "properties": {
        "passed": {"const": true},
        "evidence": {"$ref": "#/$defs/evidenceRef"}
      }
    },
    "sessionOutcome": {
      "type": "object",
      "additionalProperties": false,
      "required": ["passed", "endpoint_id", "session_id", "evidence"],
      "properties": {
        "passed": {"const": true},
        "endpoint_id": {"$ref": "#/$defs/opaqueId"},
        "session_id": {"$ref": "#/$defs/opaqueId"},
        "evidence": {"$ref": "#/$defs/evidenceRef"}
      }
    }
  }
}
