{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "slidedeck.schema.json",
  "title": "Slide Deck",
  "type": "object",
  "description": "CTK ingestion contract for a slide deck, aligned to the Doolittle SlideDeckContent object. Maps 1:1 to ContentInput via defaultLocale, description, groups, sets and components (the ordered slides). The content-item envelope (type, sourceId) is optional and derived during ingestion when absent.",
  "required": [ "components" ],
  "properties": {
    "type": {
      "type": "string",
      "const": "slidedeck",
      "description": "When present, must be 'slidedeck'."
    },
    "sourceId": {
      "type": "string",
      "description": "Optional source identifier; a deterministic one is derived at ingestion when absent."
    },
    "defaultLocale": {
      "type": "string",
      "description": "Maps to ContentInput.defaultLocale."
    },
    "description": {
      "type": "string",
      "description": "Human-readable breadcrumb/description. Maps to ContentInput.description."
    },
    "groups": {
      "type": "array",
      "description": "Named groupings of slide sets. May be empty.",
      "items": { "$ref": "slide-group.schema.json" }
    },
    "sets": {
      "type": "array",
      "description": "Contiguous slide runs (e.g. days), indexed into the components array.",
      "items": { "$ref": "slide-set.schema.json" }
    },
    "components": {
      "type": "array",
      "description": "Ordered slides in deck order; each maps to a SlideContent.",
      "items": { "$ref": "slide.schema.json" }
    }
  },
  "additionalProperties": true
}
