{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://kaldenframelabs.com/schemas/replay-input-preflight-contract-v1.schema.json",
  "title": "Replay Input Preflight contract v1",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "subject", "workspace", "limits", "policy", "authorities", "inputs", "discoveries"],
  "properties": {
    "schema": {"const": "kaldenframe.replay-input-preflight.contract.v1"},
    "subject": {"type": "string", "pattern": "^[a-z][a-z0-9-]{0,63}$"},
    "workspace": {"type": "string", "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^\\\\]+$"},
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": ["max_files", "max_single_file_bytes", "max_total_bytes"],
      "properties": {
        "max_files": {"type": "integer", "minimum": 1, "maximum": 10000},
        "max_single_file_bytes": {"type": "integer", "minimum": 1, "maximum": 1000000000},
        "max_total_bytes": {"type": "integer", "minimum": 1, "maximum": 10000000000}
      }
    },
    "policy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["require_authority_hashes", "require_input_hashes"],
      "properties": {
        "require_authority_hashes": {"type": "boolean"},
        "require_input_hashes": {"type": "boolean"}
      }
    },
    "authorities": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/authority"}},
    "inputs": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/input"}},
    "discoveries": {"type": "array", "items": {"$ref": "#/$defs/discovery"}}
  },
  "$defs": {
    "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
    "suffixes": {"type": "array", "maxItems": 32, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\.[a-z0-9][a-z0-9._-]{0,15}$"}},
    "baseEntry": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "path", "kind", "required", "allowed_suffixes"],
      "properties": {
        "id": {"type": "string", "pattern": "^[a-z][a-z0-9-]{0,63}$"},
        "path": {"type": "string", "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^\\\\]+$"},
        "kind": {"enum": ["file", "directory"]},
        "required": {"type": "boolean"},
        "allowed_suffixes": {"$ref": "#/$defs/suffixes"},
        "sha256": {"$ref": "#/$defs/sha256"},
        "min_bytes": {"type": "integer", "minimum": 0, "maximum": 1000000000}
      }
    },
    "authority": {"allOf": [{"$ref": "#/$defs/baseEntry"}, {"properties": {"kind": {"const": "file"}}}]},
    "input": {"$ref": "#/$defs/baseEntry"},
    "discovery": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "root", "pattern", "min_matches", "max_matches", "severity", "allowed_suffixes"],
      "properties": {
        "id": {"type": "string", "pattern": "^[a-z][a-z0-9-]{0,63}$"},
        "root": {"type": "string", "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^\\\\]+$"},
        "pattern": {"type": "string", "pattern": "^(?!/)(?!.*//)(?!.*(?:^|/)\\.{1,2}(?:/|$))[^\\\\]+$"},
        "min_matches": {"type": "integer", "minimum": 0, "maximum": 10000},
        "max_matches": {"type": "integer", "minimum": 0, "maximum": 10000},
        "severity": {"enum": ["BLOCK", "WARN"]},
        "allowed_suffixes": {"$ref": "#/$defs/suffixes"}
      }
    }
  }
}
