{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://kaldenframelabs.com/schemas/target-blind-feature-freeze-contract-v1.schema.json",
  "title": "KaldenFrame Target-Blind Feature Freeze Contract v1",
  "type": "object",
  "additionalProperties": false,
  "required": ["contract", "freeze_id", "schema", "boundaries", "selection_policy", "limits"],
  "properties": {
    "contract": {"const": "kaldenframe.target-blind-feature-freeze.v1"},
    "freeze_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,95}$"},
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "format"],
      "properties": {
        "path": {"type": "string", "minLength": 1, "maxLength": 240},
        "format": {"const": "kaldenframe.column-schema.v1"},
        "expected_sha256": {"type": "string", "pattern": "^[A-Fa-f0-9]{64}$"}
      }
    },
    "boundaries": {
      "type": "object",
      "additionalProperties": false,
      "required": ["target_names", "identity_names", "time_names"],
      "properties": {
        "target_names": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
        "identity_names": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
        "time_names": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1}}
      }
    },
    "selection_policy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["allowed_types", "include_patterns", "exclude_patterns", "forbidden_exact_names", "min_selected", "max_selected"],
      "properties": {
        "allowed_types": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"enum": ["boolean", "integer", "number", "string", "category"]}},
        "include_patterns": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1, "maxLength": 512}},
        "exclude_patterns": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1, "maxLength": 512}},
        "forbidden_exact_names": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
        "min_selected": {"type": "integer", "minimum": 1},
        "max_selected": {"type": "integer", "minimum": 1}
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": ["max_schema_bytes", "max_columns", "max_patterns", "max_name_chars"],
      "properties": {
        "max_schema_bytes": {"type": "integer", "minimum": 1, "maximum": 16777216},
        "max_columns": {"type": "integer", "minimum": 1, "maximum": 100000},
        "max_patterns": {"type": "integer", "minimum": 1, "maximum": 1000},
        "max_name_chars": {"type": "integer", "minimum": 1, "maximum": 1024}
      }
    }
  }
}
