{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://docs.spectrokernel.io/ai/schemas/preset.schema.json",
  "title": "spectro-kernel preset (recipe)",
  "description": "A named, versioned pipeline of catalogue algorithms. Instrument- or observer-dependent values are declared as variables and supplied by a profile.",
  "type": "object",
  "required": ["name", "version", "description", "steps"],
  "properties": {
    "name": {"type": "string", "pattern": "^[a-z][a-z0-9_]*$"},
    "version": {"type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$"},
    "description": {"type": "string", "minLength": 1},
    "requires": {"type": "string", "description": "spectro-kernel version range, e.g. '>=0.7, <1.0'"},
    "metadata": {
      "type": "object",
      "properties": {
        "kind": {"enum": ["analysis", "reduction", "campaign", "template"]},
        "status": {"enum": ["draft", "reviewed", "reference"]},
        "references": {"type": "array", "items": {"type": "string", "minLength": 1}},
        "conventions": {"type": "string"},
        "author": {"type": "string"},
        "category": {"type": "string"},
        "expects": {"type": "string"},
        "notes": {"type": "string"}
      },
      "additionalProperties": true
    },
    "variables": {
      "type": "object",
      "propertyNames": {"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"},
      "additionalProperties": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "type": {"enum": ["str", "int", "float", "bool", "path", "list"]},
              "default": {},
              "required": {"type": "boolean"},
              "description": {"type": "string"},
              "choices": {"type": "array"}
            },
            "additionalProperties": false
          },
          {"type": ["string", "number", "boolean", "array", "null"]}
        ]
      }
    },
    "steps": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["algorithm"],
        "properties": {
          "algorithm": {"type": "string", "pattern": "^[a-z0-9_]+$"},
          "name": {"type": "string"},
          "label": {"type": "string"},
          "params": {"type": ["object", "null"]},
          "depends_on": {"type": "array", "items": {"type": "string"}}
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": true
}
