Skip to main content
Glama

Edit deck

apply_ops

Applies slide edits in order—add, update, remove or move slides, set design, motion, title, brief or brand kit—as one atomic change that saves only if all succeed.

Instructions

The only way to change a deck. Applies operations in order (add, update, remove or move slides, set design, motion, title, brief, apply a brand kit). All operations succeed or none is saved. Fails when expected_revision is not the current revision.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "deck_id": "<deck_id>",
      "expected_revision": "<expected_revision>",
      "ops": "<ops>",
      "summary": "<summary>"
    },
    "name": "apply_ops"
  }
}

Input Schema

NameRequiredDescriptionDefault
opsYes
deck_idYesDeck id from create_deck or list_decks
summaryYesWhat changed, for the history
previewsNoLocal server: return PNG previews of changed slides and slides with errors (up to 4)
expected_revisionYesRevision you read last

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.1.1
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "description": "Position, default end of deck",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "op": {
      -        "const": "add_slide",
      -        "type": "string"
      -      },
      -      "slide": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "blocks": {
      -            "additionalProperties": {
      -              "oneOf": [
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "level": {
      -                      "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
      -                      "enum": [
      -                        "display",
      -                        "h1",
      -                        "h2"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "heading",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "level"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "size": {
      -                      "enum": [
      -                        "lead",
      -                        "body",
      -                        "small"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "Paragraph. Aim for at most 260 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "text",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "size"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 5,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "bullets",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "decimals": {
      -                      "maximum": 2,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "detail": {
      -                      "description": "Optional context or source. Aim for at most 90 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "label": {
      -                      "description": "What the number means. Aim for at most 48 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "prefix": {
      -                      "description": "e.g. $, €",
      -                      "maxLength": 3,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "suffix": {
      -                      "description": "e.g. %, x, M, k",
      -                      "maxLength": 4,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "stat",
      -                      "type": "string"
      -                    },
      -                    "value": {
      -                      "description": "The number itself, animated as a count up",
      -                      "type": "number"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "value",
      -                    "label"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "decimals": {
      -                            "maximum": 2,
      -                            "minimum": 0,
      -                            "type": "integer"
      -                          },
      -                          "detail": {
      -                            "description": "Optional context or source. Aim for at most 90 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "label": {
      -                            "description": "What the number means. Aim for at most 48 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "prefix": {
      -                            "description": "e.g. $, €",
      -                            "maxLength": 3,
      -                            "type": "string"
      -                          },
      -                          "suffix": {
      -                            "description": "e.g. %, x, M, k",
      -                            "maxLength": 4,
      -                            "type": "string"
      -                          },
      -                          "value": {
      -                            "description": "The number itself, animated as a count up",
      -                            "type": "number"
      -                          }
      -                        },
      -                        "required": [
      -                          "value",
      -                          "label"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 4,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "stats",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "caption": {
      -                      "description": "Source or footnote. Aim for at most 90 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "categories": {
      -                      "description": "X axis labels (column, line), rows (bar) or segments (donut)",
      -                      "items": {
      -                        "maxLength": 24,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 8,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "highlight": {
      -                      "description": "Index of the category to draw in the accent color, the rest stays muted",
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "kind": {
      -                      "enum": [
      -                        "column",
      -                        "bar",
      -                        "line",
      -                        "donut"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "series": {
      -                      "description": "One value per category. Donut takes exactly one series",
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "name": {
      -                            "maxLength": 30,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "values": {
      -                            "items": {
      -                              "type": "number"
      -                            },
      -                            "type": "array"
      -                          }
      -                        },
      -                        "required": [
      -                          "name",
      -                          "values"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 3,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "chart",
      -                      "type": "string"
      -                    },
      -                    "unit": {
      -                      "description": "Shown after values, e.g. %, $M",
      -                      "maxLength": 6,
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "kind",
      -                    "categories",
      -                    "series"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "alt": {
      -                      "description": "What the image shows. Aim for at most 120 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "assetId": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "fit": {
      -                      "enum": [
      -                        "cover",
      -                        "contain"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "focus": {
      -                      "additionalProperties": false,
      -                      "description": "Focal point for cover crops",
      -                      "properties": {
      -                        "x": {
      -                          "maximum": 1,
      -                          "minimum": 0,
      -                          "type": "number"
      -                        },
      -                        "y": {
      -                          "maximum": 1,
      -                          "minimum": 0,
      -                          "type": "number"
      -                        }
      -                      },
      -                      "required": [
      -                        "x",
      -                        "y"
      -                      ],
      -                      "type": "object"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "image",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "assetId",
      -                    "alt",
      -                    "fit"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "alt": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "assetId": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "logo",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "assetId",
      -                    "alt"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "items": {
      -                      "description": "Customer, partner or press logos",
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "alt": {
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "assetId": {
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "assetId",
      -                          "alt"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 8,
      -                      "minItems": 3,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "logos",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "author": {
      -                      "maxLength": 40,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "role": {
      -                      "maxLength": 60,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "The quote, without quotation marks. Aim for at most 200 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "quote",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "author"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "current": {
      -                      "description": "Index of the milestone that represents now",
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "label": {
      -                            "description": "Date or phase, e.g. Q3 2026",
      -                            "maxLength": 16,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "text": {
      -                            "description": "Detail. Aim for at most 80 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "title": {
      -                            "description": "Milestone. Aim for at most 36 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "label",
      -                          "title"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 3,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "timeline",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "people": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "bio": {
      -                            "description": "One line of credibility. Aim for at most 80 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "name": {
      -                            "maxLength": 32,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "photoAssetId": {
      -                            "type": "string"
      -                          },
      -                          "role": {
      -                            "maxLength": 40,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "name",
      -                          "role"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "team",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "people"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "columns": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "highlight": {
      -                            "description": "Our column, drawn with the accent",
      -                            "type": "boolean"
      -                          },
      -                          "items": {
      -                            "items": {
      -                              "description": "Point. Aim for at most 60 characters",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "maxItems": 5,
      -                            "minItems": 1,
      -                            "type": "array"
      -                          },
      -                          "title": {
      -                            "maxLength": 28,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "title",
      -                          "items"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 3,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "comparison",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "columns"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "text": {
      -                            "description": "Card text. Aim for at most 110 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "title": {
      -                            "description": "Card title. Aim for at most 32 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "title",
      -                          "text"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 4,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "cards",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "columns": {
      -                      "items": {
      -                        "maxLength": 24,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 5,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "highlightColumn": {
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "rows": {
      -                      "description": "Each row has one cell per column",
      -                      "items": {
      -                        "items": {
      -                          "maxLength": 40,
      -                          "type": "string"
      -                        },
      -                        "type": "array"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "table",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "columns",
      -                    "rows"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "detail": {
      -                      "description": "Contact, link or next step. Aim for at most 80 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "cta",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text"
      -                  ],
      -                  "type": "object"
      -                }
      -              ]
      -            },
      -            "description": "Block per zone of the layout, keyed by zone name",
      -            "propertyNames": {
      -              "type": "string"
      -            },
      -            "type": "object"
      -          },
      -          "intent": {
      -            "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
      -            "maxLength": 160,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "layout": {
      -            "description": "Layout id from instadeck://layouts",
      -            "enum": [
      -              "title",
      -              "title-image",
      -              "statement",
      -              "section",
      -              "headline-stat",
      -              "stats",
      -              "points",
      -              "text-image",
      -              "image-text",
      -              "image-full",
      -              "chart",
      -              "chart-insight",
      -              "cards",
      -              "comparison",
      -              "timeline",
      -              "team",
      -              "quote",
      -              "logos",
      -              "table",
      -              "closing"
      -            ],
      -            "type": "string"
      -          },
      -          "motion": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "entrance": {
      -                "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
      -                "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -                "type": "string"
      -              },
      -              "transition": {
      -                "description": "Transition INTO this slide, overrides the deck default",
      -                "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -                "type": "string"
      -              },
      -              "zones": {
      -                "additionalProperties": {
      -                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -                  "type": "string"
      -                },
      -                "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
      -                "propertyNames": {
      -                  "type": "string"
      -                },
      -                "type": "object"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "notes": {
      -            "description": "Speaker notes",
      -            "maxLength": 1200,
      -            "type": "string"
      -          },
      -          "tone": {
      -            "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
      -            "enum": [
      -              "default",
      -              "inverse",
      -              "accent"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "layout",
      -          "intent",
      -          "blocks"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "slide"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "blocks": {
      -        "additionalProperties": {
      -          "anyOf": [
      -            {
      -              "oneOf": [
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "level": {
      -                      "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
      -                      "enum": [
      -                        "display",
      -                        "h1",
      -                        "h2"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "heading",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "level"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "size": {
      -                      "enum": [
      -                        "lead",
      -                        "body",
      -                        "small"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "Paragraph. Aim for at most 260 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "text",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "size"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 5,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "bullets",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "decimals": {
      -                      "maximum": 2,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "detail": {
      -                      "description": "Optional context or source. Aim for at most 90 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "label": {
      -                      "description": "What the number means. Aim for at most 48 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "prefix": {
      -                      "description": "e.g. $, €",
      -                      "maxLength": 3,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "suffix": {
      -                      "description": "e.g. %, x, M, k",
      -                      "maxLength": 4,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "stat",
      -                      "type": "string"
      -                    },
      -                    "value": {
      -                      "description": "The number itself, animated as a count up",
      -                      "type": "number"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "value",
      -                    "label"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "decimals": {
      -                            "maximum": 2,
      -                            "minimum": 0,
      -                            "type": "integer"
      -                          },
      -                          "detail": {
      -                            "description": "Optional context or source. Aim for at most 90 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "label": {
      -                            "description": "What the number means. Aim for at most 48 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "prefix": {
      -                            "description": "e.g. $, €",
      -                            "maxLength": 3,
      -                            "type": "string"
      -                          },
      -                          "suffix": {
      -                            "description": "e.g. %, x, M, k",
      -                            "maxLength": 4,
      -                            "type": "string"
      -                          },
      -                          "value": {
      -                            "description": "The number itself, animated as a count up",
      -                            "type": "number"
      -                          }
      -                        },
      -                        "required": [
      -                          "value",
      -                          "label"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 4,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "stats",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "caption": {
      -                      "description": "Source or footnote. Aim for at most 90 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "categories": {
      -                      "description": "X axis labels (column, line), rows (bar) or segments (donut)",
      -                      "items": {
      -                        "maxLength": 24,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 8,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "highlight": {
      -                      "description": "Index of the category to draw in the accent color, the rest stays muted",
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "kind": {
      -                      "enum": [
      -                        "column",
      -                        "bar",
      -                        "line",
      -                        "donut"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "series": {
      -                      "description": "One value per category. Donut takes exactly one series",
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "name": {
      -                            "maxLength": 30,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "values": {
      -                            "items": {
      -                              "type": "number"
      -                            },
      -                            "type": "array"
      -                          }
      -                        },
      -                        "required": [
      -                          "name",
      -                          "values"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 3,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "chart",
      -                      "type": "string"
      -                    },
      -                    "unit": {
      -                      "description": "Shown after values, e.g. %, $M",
      -                      "maxLength": 6,
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "kind",
      -                    "categories",
      -                    "series"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "alt": {
      -                      "description": "What the image shows. Aim for at most 120 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "assetId": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "fit": {
      -                      "enum": [
      -                        "cover",
      -                        "contain"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "focus": {
      -                      "additionalProperties": false,
      -                      "description": "Focal point for cover crops",
      -                      "properties": {
      -                        "x": {
      -                          "maximum": 1,
      -                          "minimum": 0,
      -                          "type": "number"
      -                        },
      -                        "y": {
      -                          "maximum": 1,
      -                          "minimum": 0,
      -                          "type": "number"
      -                        }
      -                      },
      -                      "required": [
      -                        "x",
      -                        "y"
      -                      ],
      -                      "type": "object"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "image",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "assetId",
      -                    "alt",
      -                    "fit"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "alt": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "assetId": {
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "logo",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "assetId",
      -                    "alt"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "items": {
      -                      "description": "Customer, partner or press logos",
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "alt": {
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "assetId": {
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "assetId",
      -                          "alt"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 8,
      -                      "minItems": 3,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "logos",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "author": {
      -                      "maxLength": 40,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "role": {
      -                      "maxLength": 60,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "The quote, without quotation marks. Aim for at most 200 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "quote",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text",
      -                    "author"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "current": {
      -                      "description": "Index of the milestone that represents now",
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "label": {
      -                            "description": "Date or phase, e.g. Q3 2026",
      -                            "maxLength": 16,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "text": {
      -                            "description": "Detail. Aim for at most 80 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "title": {
      -                            "description": "Milestone. Aim for at most 36 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "label",
      -                          "title"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 3,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "timeline",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "people": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "bio": {
      -                            "description": "One line of credibility. Aim for at most 80 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "name": {
      -                            "maxLength": 32,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "photoAssetId": {
      -                            "type": "string"
      -                          },
      -                          "role": {
      -                            "maxLength": 40,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "name",
      -                          "role"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "team",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "people"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "columns": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "highlight": {
      -                            "description": "Our column, drawn with the accent",
      -                            "type": "boolean"
      -                          },
      -                          "items": {
      -                            "items": {
      -                              "description": "Point. Aim for at most 60 characters",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "maxItems": 5,
      -                            "minItems": 1,
      -                            "type": "array"
      -                          },
      -                          "title": {
      -                            "maxLength": 28,
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "title",
      -                          "items"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 3,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "comparison",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "columns"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "build": {
      -                      "description": "together = all items with the block, items = one item per click",
      -                      "enum": [
      -                        "together",
      -                        "items"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "items": {
      -                      "items": {
      -                        "additionalProperties": false,
      -                        "properties": {
      -                          "text": {
      -                            "description": "Card text. Aim for at most 110 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          },
      -                          "title": {
      -                            "description": "Card title. Aim for at most 32 characters",
      -                            "minLength": 1,
      -                            "type": "string"
      -                          }
      -                        },
      -                        "required": [
      -                          "title",
      -                          "text"
      -                        ],
      -                        "type": "object"
      -                      },
      -                      "maxItems": 4,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "cards",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "items"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "columns": {
      -                      "items": {
      -                        "maxLength": 24,
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 5,
      -                      "minItems": 2,
      -                      "type": "array"
      -                    },
      -                    "highlightColumn": {
      -                      "maximum": 9007199254740991,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "rows": {
      -                      "description": "Each row has one cell per column",
      -                      "items": {
      -                        "items": {
      -                          "maxLength": 40,
      -                          "type": "string"
      -                        },
      -                        "type": "array"
      -                      },
      -                      "maxItems": 6,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "type": {
      -                      "const": "table",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "columns",
      -                    "rows"
      -                  ],
      -                  "type": "object"
      -                },
      -                {
      -                  "additionalProperties": false,
      -                  "properties": {
      -                    "detail": {
      -                      "description": "Contact, link or next step. Aim for at most 80 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "step": {
      -                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      -                      "maximum": 5,
      -                      "minimum": 0,
      -                      "type": "integer"
      -                    },
      -                    "text": {
      -                      "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "const": "cta",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "type",
      -                    "text"
      -                  ],
      -                  "type": "object"
      -                }
      -              ]
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "description": "Zones to set. null removes the block from the zone. Unlisted zones stay",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "intent": {
      -        "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
      -        "maxLength": 160,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "layout": {
      -        "description": "Layout id from instadeck://layouts",
      -        "enum": [
      -          "title",
      -          "title-image",
      -          "statement",
      -          "section",
      -          "headline-stat",
      -          "stats",
      -          "points",
      -          "text-image",
      -          "image-text",
      -          "image-full",
      -          "chart",
      -          "chart-insight",
      -          "cards",
      -          "comparison",
      -          "timeline",
      -          "team",
      -          "quote",
      -          "logos",
      -          "table",
      -          "closing"
      -        ],
      -        "type": "string"
      -      },
      -      "motion": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "entrance": {
      -            "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
      -            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -            "type": "string"
      -          },
      -          "transition": {
      -            "description": "Transition INTO this slide, overrides the deck default",
      -            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -            "type": "string"
      -          },
      -          "zones": {
      -            "additionalProperties": {
      -              "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -              "type": "string"
      -            },
      -            "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
      -            "propertyNames": {
      -              "type": "string"
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "notes": {
      -        "maxLength": 1200,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update_slide",
      -        "type": "string"
      -      },
      -      "slide_id": {
      -        "type": "string"
      -      },
      -      "tone": {
      -        "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
      -        "enum": [
      -          "default",
      -          "inverse",
      -          "accent"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "slide_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "op": {
      -        "const": "remove_slide",
      -        "type": "string"
      -      },
      -      "slide_id": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "slide_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "op": {
      -        "const": "move_slide",
      -        "type": "string"
      -      },
      -      "slide_id": {
      -        "type": "string"
      -      },
      -      "to": {
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "slide_id",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "design": {
      -        "additionalProperties": false,
      -        "description": "Only the fields to change",
      -        "properties": {
      -          "colors": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "accent": {
      -                "description": "Signal color: key numbers, highlights, chart focus. Never for decoration",
      -                "type": "string"
      -              },
      -              "accent2": {
      -                "description": "Secondary chart and diagram color",
      -                "type": "string"
      -              },
      -              "bg": {
      -                "description": "Main background",
      -                "type": "string"
      -              },
      -              "fg": {
      -                "description": "Main text",
      -                "type": "string"
      -              },
      -              "muted": {
      -                "description": "Secondary text: labels, captions, detail",
      -                "type": "string"
      -              },
      -              "surface": {
      -                "description": "Card and panel background, close to bg",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "fonts": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "body": {
      -                "oneOf": [
      -                  {
      -                    "additionalProperties": false,
      -                    "properties": {
      -                      "family": {
      -                        "description": "Family from the curated Google Fonts list (instadeck://fonts)",
      -                        "enum": [
      -                          "Inter",
      -                          "Inter Tight",
      -                          "Plus Jakarta Sans",
      -                          "Manrope",
      -                          "DM Sans",
      -                          "Space Grotesk",
      -                          "Sora",
      -                          "Outfit",
      -                          "Work Sans",
      -                          "IBM Plex Sans",
      -                          "Archivo",
      -                          "Schibsted Grotesk",
      -                          "Geist",
      -                          "Figtree",
      -                          "Fraunces",
      -                          "Playfair Display",
      -                          "Instrument Serif",
      -                          "Source Serif 4",
      -                          "Newsreader",
      -                          "Libre Caslon Text",
      -                          "DM Serif Display",
      -                          "Bricolage Grotesque",
      -                          "Syne",
      -                          "Unbounded",
      -                          "Big Shoulders Display",
      -                          "JetBrains Mono",
      -                          "IBM Plex Mono"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "const": "google",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "source",
      -                      "family"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "additionalProperties": false,
      -                    "properties": {
      -                      "assetId": {
      -                        "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
      -                        "type": "string"
      -                      },
      -                      "family": {
      -                        "description": "Name to register the font under",
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "const": "asset",
      -                        "type": "string"
      -                      },
      -                      "weight": {
      -                        "description": "Weight of this file",
      -                        "maximum": 900,
      -                        "minimum": 100,
      -                        "type": "integer"
      -                      }
      -                    },
      -                    "required": [
      -                      "source",
      -                      "assetId",
      -                      "family",
      -                      "weight"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "heading": {
      -                "oneOf": [
      -                  {
      -                    "additionalProperties": false,
      -                    "properties": {
      -                      "family": {
      -                        "description": "Family from the curated Google Fonts list (instadeck://fonts)",
      -                        "enum": [
      -                          "Inter",
      -                          "Inter Tight",
      -                          "Plus Jakarta Sans",
      -                          "Manrope",
      -                          "DM Sans",
      -                          "Space Grotesk",
      -                          "Sora",
      -                          "Outfit",
      -                          "Work Sans",
      -                          "IBM Plex Sans",
      -                          "Archivo",
      -                          "Schibsted Grotesk",
      -                          "Geist",
      -                          "Figtree",
      -                          "Fraunces",
      -                          "Playfair Display",
      -                          "Instrument Serif",
      -                          "Source Serif 4",
      -                          "Newsreader",
      -                          "Libre Caslon Text",
      -                          "DM Serif Display",
      -                          "Bricolage Grotesque",
      -                          "Syne",
      -                          "Unbounded",
      -                          "Big Shoulders Display",
      -                          "JetBrains Mono",
      -                          "IBM Plex Mono"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "const": "google",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "source",
      -                      "family"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "additionalProperties": false,
      -                    "properties": {
      -                      "assetId": {
      -                        "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
      -                        "type": "string"
      -                      },
      -                      "family": {
      -                        "description": "Name to register the font under",
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "const": "asset",
      -                        "type": "string"
      -                      },
      -                      "weight": {
      -                        "description": "Weight of this file",
      -                        "maximum": 900,
      -                        "minimum": 100,
      -                        "type": "integer"
      -                      }
      -                    },
      -                    "required": [
      -                      "source",
      -                      "assetId",
      -                      "family",
      -                      "weight"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "shape": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "cards": {
      -                "description": "How cards and panels are drawn",
      -                "enum": [
      -                  "flat",
      -                  "outline",
      -                  "filled"
      -                ],
      -                "type": "string"
      -              },
      -              "radius": {
      -                "description": "Corner radius of cards, images and charts in px",
      -                "maximum": 32,
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "space": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "density": {
      -                "enum": [
      -                  "airy",
      -                  "balanced",
      -                  "compact"
      -                ],
      -                "type": "string"
      -              },
      -              "unit": {
      -                "description": "Spacing unit in px, every gap is a multiple",
      -                "maximum": 16,
      -                "minimum": 8,
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": {
      -            "additionalProperties": false,
      -            "properties": {
      -              "base": {
      -                "description": "Body size in px on a 1920x1080 slide",
      -                "maximum": 36,
      -                "minimum": 22,
      -                "type": "number"
      -              },
      -              "headingCase": {
      -                "enum": [
      -                  "none",
      -                  "upper"
      -                ],
      -                "type": "string"
      -              },
      -              "headingTracking": {
      -                "description": "Letter spacing of headings in em",
      -                "maximum": 0.05,
      -                "minimum": -0.05,
      -                "type": "number"
      -              },
      -              "headingWeight": {
      -                "maximum": 900,
      -                "minimum": 300,
      -                "type": "integer"
      -              },
      -              "scale": {
      -                "enum": [
      -                  "minor-third",
      -                  "major-third",
      -                  "perfect-fourth",
      -                  "augmented-fourth",
      -                  "perfect-fifth",
      -                  "golden"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "op": {
      -        "const": "set_design",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "design"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "motion": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "entrance": {
      -            "description": "Default entrance of slide content: a preset or a name from vocabulary.entrances",
      -            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -            "type": "string"
      -          },
      -          "heroes": {
      -            "description": "Animate numbers, charts and timelines (count up, grow, draw)",
      -            "type": "boolean"
      -          },
      -          "intensity": {
      -            "description": "How much this deck moves: still (nothing moves), subtle, expressive, kinetic. Measured against what the motion really does",
      -            "enum": [
      -              "still",
      -              "subtle",
      -              "expressive",
      -              "kinetic"
      -            ],
      -            "type": "string"
      -          },
      -          "rationale": {
      -            "description": "Why this motion language fits the audience and brand, one or two sentences",
      -            "maxLength": 240,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "tempo": {
      -            "description": "Scales every duration: calm 1.25x, confident 1x, brisk 0.8x",
      -            "enum": [
      -              "calm",
      -              "confident",
      -              "brisk"
      -            ],
      -            "type": "string"
      -          },
      -          "transition": {
      -            "description": "Default transition between slides: a preset or a name from vocabulary.transitions",
      -            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -            "type": "string"
      -          },
      -          "vocabulary": {
      -            "additionalProperties": false,
      -            "description": "Entries to add or replace, null removes one. Unlisted entries stay",
      -            "properties": {
      -              "entrances": {
      -                "additionalProperties": {
      -                  "anyOf": [
      -                    {
      -                      "additionalProperties": false,
      -                      "properties": {
      -                        "duration": {
      -                          "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
      -                          "maximum": 3000,
      -                          "minimum": 0,
      -                          "type": "integer"
      -                        },
      -                        "easing": {
      -                          "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
      -                          "type": "string"
      -                        },
      -                        "keyframes": {
      -                          "description": "States from hidden towards rest. The element always ends in its natural place, so never write the final resting keyframe",
      -                          "items": {
      -                            "additionalProperties": false,
      -                            "properties": {
      -                              "clipPath": {
      -                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "easing": {
      -                                "description": "Easing from this keyframe to the next",
      -                                "type": "string"
      -                              },
      -                              "filter": {
      -                                "description": "CSS filter, e.g. blur(8px)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "offset": {
      -                                "description": "Position in time 0 to 1, default evenly spaced",
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "opacity": {
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "transform": {
      -                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              }
      -                            },
      -                            "type": "object"
      -                          },
      -                          "maxItems": 6,
      -                          "type": "array"
      -                        },
      -                        "purpose": {
      -                          "description": "What this motion is for, one sentence",
      -                          "maxLength": 160,
      -                          "minLength": 1,
      -                          "type": "string"
      -                        },
      -                        "stagger": {
      -                          "description": "Milliseconds between blocks that enter together, default from the tempo",
      -                          "maximum": 600,
      -                          "minimum": 0,
      -                          "type": "integer"
      -                        }
      -                      },
      -                      "required": [
      -                        "purpose",
      -                        "keyframes",
      -                        "duration",
      -                        "easing"
      -                      ],
      -                      "type": "object"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ]
      -                },
      -                "propertyNames": {
      -                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -                  "type": "string"
      -                },
      -                "type": "object"
      -              },
      -              "transitions": {
      -                "additionalProperties": {
      -                  "anyOf": [
      -                    {
      -                      "additionalProperties": false,
      -                      "properties": {
      -                        "duration": {
      -                          "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
      -                          "maximum": 2000,
      -                          "minimum": 0,
      -                          "type": "integer"
      -                        },
      -                        "easing": {
      -                          "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
      -                          "type": "string"
      -                        },
      -                        "enter": {
      -                          "description": "Incoming slide: states before rest, e.g. [{ transform: 'translateX(1920px)' }]. Rest is the implicit end",
      -                          "items": {
      -                            "additionalProperties": false,
      -                            "properties": {
      -                              "clipPath": {
      -                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "easing": {
      -                                "description": "Easing from this keyframe to the next",
      -                                "type": "string"
      -                              },
      -                              "filter": {
      -                                "description": "CSS filter, e.g. blur(8px)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "offset": {
      -                                "description": "Position in time 0 to 1, default evenly spaced",
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "opacity": {
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "transform": {
      -                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              }
      -                            },
      -                            "type": "object"
      -                          },
      -                          "maxItems": 6,
      -                          "type": "array"
      -                        },
      -                        "exit": {
      -                          "description": "Outgoing slide: states after rest, e.g. [{ opacity: 0, transform: 'scale(0.96)' }]. Rest is the implicit start",
      -                          "items": {
      -                            "additionalProperties": false,
      -                            "properties": {
      -                              "clipPath": {
      -                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "easing": {
      -                                "description": "Easing from this keyframe to the next",
      -                                "type": "string"
      -                              },
      -                              "filter": {
      -                                "description": "CSS filter, e.g. blur(8px)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              },
      -                              "offset": {
      -                                "description": "Position in time 0 to 1, default evenly spaced",
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "opacity": {
      -                                "maximum": 1,
      -                                "minimum": 0,
      -                                "type": "number"
      -                              },
      -                              "transform": {
      -                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      -                                "maxLength": 200,
      -                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      -                                "type": "string"
      -                              }
      -                            },
      -                            "type": "object"
      -                          },
      -                          "maxItems": 6,
      -                          "type": "array"
      -                        },
      -                        "over": {
      -                          "description": "Which slide lies on top during the transition, default exit",
      -                          "enum": [
      -                            "exit",
      -                            "enter"
      -                          ],
      -                          "type": "string"
      -                        },
      -                        "purpose": {
      -                          "description": "What this motion is for, one sentence",
      -                          "maxLength": 160,
      -                          "minLength": 1,
      -                          "type": "string"
      -                        },
      -                        "shared": {
      -                          "description": "Elements on both slides (the headline, a logo, the same image) glide from their old place and size to the new one",
      -                          "type": "boolean"
      -                        }
      -                      },
      -                      "required": [
      -                        "purpose",
      -                        "duration",
      -                        "easing"
      -                      ],
      -                      "type": "object"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ]
      -                },
      -                "propertyNames": {
      -                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      -                  "type": "string"
      -                },
      -                "type": "object"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "op": {
      -        "const": "set_motion",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "motion"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "op": {
      -        "const": "set_title",
      -        "type": "string"
      -      },
      -      "title": {
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "title"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "brief": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "audience": {
      -            "description": "Who will see it: seed investors, enterprise buyers, partners",
      -            "type": "string"
      -          },
      -          "company": {
      -            "description": "Company or product name",
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "goal": {
      -            "description": "What the audience should do or believe afterwards",
      -            "type": "string"
      -          },
      -          "language": {
      -            "description": "Language of the slide content, BCP 47 tag, e.g. en, cs, de",
      -            "minLength": 2,
      -            "type": "string"
      -          },
      -          "topic": {
      -            "description": "What the deck is about, e.g. seed round pitch, partner pitch, product launch",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "op": {
      -        "const": "set_brief",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "brief"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "brand_kit_id": {
      -        "description": "Brand kit whose colors and fonts replace the design",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "apply_brand",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "brand_kit_id"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "description": "Position, default end of deck",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "op": {
      +        "const": "add_slide",
      +        "type": "string"
      +      },
      +      "slide": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "background": {
      +            "description": "Background of the slide. brand = a visual drawn from the brand colors (no assets needed), image = the user's image under an overlay that keeps text legible. Use it for the title and chapter openers, not on every slide",
      +            "oneOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "type": {
      +                    "const": "brand",
      +                    "type": "string"
      +                  },
      +                  "visual": {
      +                    "description": "numeral = the chapter number set very large, field = a color field across part of the slide, geometry = one thin line in the accent along the edge of the slide",
      +                    "enum": [
      +                      "numeral",
      +                      "field",
      +                      "geometry"
      +                    ],
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "visual"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "assetId": {
      +                    "description": "An image asset the user supplied (add_asset). Never a stock or generated image",
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "focus": {
      +                    "additionalProperties": false,
      +                    "description": "Focal point for the crop. Put it where the text is not",
      +                    "properties": {
      +                      "x": {
      +                        "maximum": 1,
      +                        "minimum": 0,
      +                        "type": "number"
      +                      },
      +                      "y": {
      +                        "maximum": 1,
      +                        "minimum": 0,
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "x",
      +                      "y"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "overlay": {
      +                    "description": "How much of the slide background color covers the image so text stays legible, 0 to 0.95. Default 0.55. The browser measures the text over the image and reports the smallest value that works",
      +                    "maximum": 0.95,
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  "type": {
      +                    "const": "image",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "assetId"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "beat": {
      +            "description": "The story beat this slide carries (section pitch, beats): hook, problem, traction, ask...",
      +            "enum": [
      +              "hook",
      +              "problem",
      +              "why-now",
      +              "solution",
      +              "product",
      +              "traction",
      +              "market",
      +              "business-model",
      +              "competition",
      +              "go-to-market",
      +              "roadmap",
      +              "team",
      +              "financials",
      +              "risks",
      +              "decision",
      +              "ask"
      +            ],
      +            "type": "string"
      +          },
      +          "blocks": {
      +            "additionalProperties": {
      +              "oneOf": [
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "level": {
      +                      "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
      +                      "enum": [
      +                        "display",
      +                        "h1",
      +                        "h2"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "heading",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "level"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "size": {
      +                      "enum": [
      +                        "lead",
      +                        "body",
      +                        "small"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "Paragraph. Aim for at most 260 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "text",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "size"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 5,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "bullets",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "decimals": {
      +                      "maximum": 2,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "detail": {
      +                      "description": "Optional context or source. Aim for at most 90 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "label": {
      +                      "description": "What the number means. Aim for at most 48 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "prefix": {
      +                      "description": "e.g. $, €",
      +                      "maxLength": 3,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "suffix": {
      +                      "description": "e.g. %, x, M, k",
      +                      "maxLength": 4,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "stat",
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "description": "The number itself, animated as a count up",
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "value",
      +                    "label"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "decimals": {
      +                            "maximum": 2,
      +                            "minimum": 0,
      +                            "type": "integer"
      +                          },
      +                          "detail": {
      +                            "description": "Optional context or source. Aim for at most 90 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "label": {
      +                            "description": "What the number means. Aim for at most 48 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "prefix": {
      +                            "description": "e.g. $, €",
      +                            "maxLength": 3,
      +                            "type": "string"
      +                          },
      +                          "suffix": {
      +                            "description": "e.g. %, x, M, k",
      +                            "maxLength": 4,
      +                            "type": "string"
      +                          },
      +                          "value": {
      +                            "description": "The number itself, animated as a count up",
      +                            "type": "number"
      +                          }
      +                        },
      +                        "required": [
      +                          "value",
      +                          "label"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 4,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "stats",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "axis": {
      +                      "description": "Show a value axis with gridlines. Only when the audience must read values off the chart, labels on the bars usually suffice (Tufte)",
      +                      "type": "boolean"
      +                    },
      +                    "caption": {
      +                      "description": "Source or footnote. Aim for at most 90 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "categories": {
      +                      "description": "X axis labels (column, stacked, waterfall, line), rows (bar) or segments (donut)",
      +                      "items": {
      +                        "maxLength": 24,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 10,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "decimals": {
      +                      "description": "Decimal places of the value labels. Omit it: labels keep the decimals the values have (at most 3), the same for every label",
      +                      "maximum": 3,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "estimate": {
      +                      "description": "Index of the first category that is an estimate or plan (IBCS): from there bars are hatched. Name those categories e.g. 2025E",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "highlight": {
      +                      "description": "Index of the category to draw in the accent color, the rest stays muted",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "kind": {
      +                      "description": "column, bar (horizontal), line, donut (share of a whole, at most 4 segments read well), stacked (columns split into series), waterfall (bridge: first and last categories are totals, the ones between are changes that add up)",
      +                      "enum": [
      +                        "column",
      +                        "bar",
      +                        "line",
      +                        "donut",
      +                        "stacked",
      +                        "waterfall"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "reference": {
      +                      "additionalProperties": false,
      +                      "description": "A horizontal line at a reference value: target, plan or average",
      +                      "properties": {
      +                        "label": {
      +                          "description": "What the line marks, e.g. Target, Plan, Average. Aim for at most 24 characters",
      +                          "minLength": 1,
      +                          "type": "string"
      +                        },
      +                        "value": {
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "value",
      +                        "label"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "series": {
      +                      "description": "One value per category. Donut takes exactly one series",
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "name": {
      +                            "maxLength": 30,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "values": {
      +                            "items": {
      +                              "type": "number"
      +                            },
      +                            "type": "array"
      +                          }
      +                        },
      +                        "required": [
      +                          "name",
      +                          "values"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 3,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "chart",
      +                      "type": "string"
      +                    },
      +                    "unit": {
      +                      "description": "Shown after values, e.g. %, $M",
      +                      "maxLength": 6,
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "kind",
      +                    "categories",
      +                    "series"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "alt": {
      +                      "description": "What the image shows. Aim for at most 120 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "assetId": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "fit": {
      +                      "enum": [
      +                        "cover",
      +                        "contain"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "focus": {
      +                      "additionalProperties": false,
      +                      "description": "Focal point for cover crops",
      +                      "properties": {
      +                        "x": {
      +                          "maximum": 1,
      +                          "minimum": 0,
      +                          "type": "number"
      +                        },
      +                        "y": {
      +                          "maximum": 1,
      +                          "minimum": 0,
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "x",
      +                        "y"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "image",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "assetId",
      +                    "alt",
      +                    "fit"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "alt": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "assetId": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "logo",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "assetId",
      +                    "alt"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "items": {
      +                      "description": "Customer, partner or press logos",
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "alt": {
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "assetId": {
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "assetId",
      +                          "alt"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 8,
      +                      "minItems": 3,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "logos",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "author": {
      +                      "maxLength": 40,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "role": {
      +                      "maxLength": 60,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "The quote, without quotation marks. Aim for at most 200 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "quote",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "author"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "current": {
      +                      "description": "Index of the milestone that represents now",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "label": {
      +                            "description": "Date or phase, e.g. Q3 2026",
      +                            "maxLength": 16,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "text": {
      +                            "description": "Detail. Aim for at most 80 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "title": {
      +                            "description": "Milestone. Aim for at most 36 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "label",
      +                          "title"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 3,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "timeline",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "people": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "bio": {
      +                            "description": "One line of credibility. Aim for at most 80 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "name": {
      +                            "maxLength": 32,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "photoAssetId": {
      +                            "type": "string"
      +                          },
      +                          "role": {
      +                            "maxLength": 40,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "name",
      +                          "role"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "team",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "people"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "columns": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "highlight": {
      +                            "description": "Our column, drawn with the accent",
      +                            "type": "boolean"
      +                          },
      +                          "items": {
      +                            "items": {
      +                              "description": "Point. Aim for at most 60 characters",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "maxItems": 5,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "title": {
      +                            "maxLength": 28,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "title",
      +                          "items"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 3,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "comparison",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "columns"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "icon": {
      +                            "description": "An icon that carries the meaning of the card (the kind of risk, the step of a process). Give all cards one or none, and avoid the same icon on two cards unless they mean the same thing",
      +                            "enum": [
      +                              "risk",
      +                              "security",
      +                              "lock",
      +                              "time",
      +                              "people",
      +                              "person",
      +                              "goal",
      +                              "growth",
      +                              "decline",
      +                              "chart",
      +                              "money",
      +                              "global",
      +                              "speed",
      +                              "done",
      +                              "fail",
      +                              "layers",
      +                              "settings",
      +                              "data",
      +                              "cloud",
      +                              "delivery",
      +                              "company",
      +                              "document",
      +                              "search",
      +                              "mail",
      +                              "launch",
      +                              "milestone",
      +                              "link",
      +                              "balance",
      +                              "partnership",
      +                              "idea",
      +                              "package",
      +                              "route"
      +                            ],
      +                            "type": "string"
      +                          },
      +                          "text": {
      +                            "description": "Card text. Aim for at most 110 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "title": {
      +                            "description": "Card title. Aim for at most 32 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "title",
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 4,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "cards",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "columns": {
      +                      "items": {
      +                        "maxLength": 24,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 5,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "highlightColumn": {
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "rows": {
      +                      "description": "Each row has one cell per column",
      +                      "items": {
      +                        "items": {
      +                          "maxLength": 40,
      +                          "type": "string"
      +                        },
      +                        "type": "array"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "table",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "columns",
      +                    "rows"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "detail": {
      +                      "description": "Contact, link or next step. Aim for at most 80 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "cta",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text"
      +                  ],
      +                  "type": "object"
      +                }
      +              ]
      +            },
      +            "description": "Block per zone of the layout, keyed by zone name",
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "composition": {
      +            "additionalProperties": false,
      +            "description": "The geometry of the slide grid as intent: where the content sits, how two columns share the width and which zone leads. The engine derives the numbers and measures that the slide holds. Without it the slide follows the composition of the school",
      +            "properties": {
      +              "axis": {
      +                "description": "left (default), center (low density layouts with one column) or asymmetric (the content is pushed right, the left side stays empty on purpose)",
      +                "enum": [
      +                  "left",
      +                  "center",
      +                  "asymmetric"
      +                ],
      +                "type": "string"
      +              },
      +              "dominant": {
      +                "description": "The zone that leads and gets the larger column, in a two column layout",
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "split": {
      +                "description": "Ratio of the two columns of title-image, text-image, image-text and chart-insight",
      +                "enum": [
      +                  "1:3",
      +                  "1:2",
      +                  "1:1",
      +                  "2:1",
      +                  "3:1"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "intent": {
      +            "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
      +            "maxLength": 160,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "layout": {
      +            "description": "Layout id from instadeck://layouts",
      +            "enum": [
      +              "title",
      +              "title-image",
      +              "statement",
      +              "section",
      +              "headline-stat",
      +              "stats",
      +              "points",
      +              "text-image",
      +              "image-text",
      +              "image-full",
      +              "chart",
      +              "chart-insight",
      +              "cards",
      +              "comparison",
      +              "timeline",
      +              "team",
      +              "quote",
      +              "logos",
      +              "table",
      +              "closing"
      +            ],
      +            "type": "string"
      +          },
      +          "motion": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "entrance": {
      +                "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
      +                "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +                "type": "string"
      +              },
      +              "transition": {
      +                "description": "Transition INTO this slide, overrides the deck default",
      +                "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +                "type": "string"
      +              },
      +              "zones": {
      +                "additionalProperties": {
      +                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +                  "type": "string"
      +                },
      +                "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
      +                "propertyNames": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "notes": {
      +            "description": "Speaker notes",
      +            "maxLength": 1200,
      +            "type": "string"
      +          },
      +          "tone": {
      +            "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
      +            "enum": [
      +              "default",
      +              "inverse",
      +              "accent"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "layout",
      +          "intent",
      +          "blocks"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "slide"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "background": {
      +        "anyOf": [
      +          {
      +            "description": "Background of the slide. brand = a visual drawn from the brand colors (no assets needed), image = the user's image under an overlay that keeps text legible. Use it for the title and chapter openers, not on every slide",
      +            "oneOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "type": {
      +                    "const": "brand",
      +                    "type": "string"
      +                  },
      +                  "visual": {
      +                    "description": "numeral = the chapter number set very large, field = a color field across part of the slide, geometry = one thin line in the accent along the edge of the slide",
      +                    "enum": [
      +                      "numeral",
      +                      "field",
      +                      "geometry"
      +                    ],
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "visual"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "assetId": {
      +                    "description": "An image asset the user supplied (add_asset). Never a stock or generated image",
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "focus": {
      +                    "additionalProperties": false,
      +                    "description": "Focal point for the crop. Put it where the text is not",
      +                    "properties": {
      +                      "x": {
      +                        "maximum": 1,
      +                        "minimum": 0,
      +                        "type": "number"
      +                      },
      +                      "y": {
      +                        "maximum": 1,
      +                        "minimum": 0,
      +                        "type": "number"
      +                      }
      +                    },
      +                    "required": [
      +                      "x",
      +                      "y"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "overlay": {
      +                    "description": "How much of the slide background color covers the image so text stays legible, 0 to 0.95. Default 0.55. The browser measures the text over the image and reports the smallest value that works",
      +                    "maximum": 0.95,
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  "type": {
      +                    "const": "image",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "assetId"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "null removes the background"
      +      },
      +      "beat": {
      +        "description": "The story beat this slide carries (section pitch, beats): hook, problem, traction, ask...",
      +        "enum": [
      +          "hook",
      +          "problem",
      +          "why-now",
      +          "solution",
      +          "product",
      +          "traction",
      +          "market",
      +          "business-model",
      +          "competition",
      +          "go-to-market",
      +          "roadmap",
      +          "team",
      +          "financials",
      +          "risks",
      +          "decision",
      +          "ask"
      +        ],
      +        "type": "string"
      +      },
      +      "blocks": {
      +        "additionalProperties": {
      +          "anyOf": [
      +            {
      +              "oneOf": [
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "level": {
      +                      "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
      +                      "enum": [
      +                        "display",
      +                        "h1",
      +                        "h2"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "heading",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "level"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "size": {
      +                      "enum": [
      +                        "lead",
      +                        "body",
      +                        "small"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "Paragraph. Aim for at most 260 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "text",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "size"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 5,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "bullets",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "decimals": {
      +                      "maximum": 2,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "detail": {
      +                      "description": "Optional context or source. Aim for at most 90 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "label": {
      +                      "description": "What the number means. Aim for at most 48 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "prefix": {
      +                      "description": "e.g. $, €",
      +                      "maxLength": 3,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "suffix": {
      +                      "description": "e.g. %, x, M, k",
      +                      "maxLength": 4,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "stat",
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "description": "The number itself, animated as a count up",
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "value",
      +                    "label"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "decimals": {
      +                            "maximum": 2,
      +                            "minimum": 0,
      +                            "type": "integer"
      +                          },
      +                          "detail": {
      +                            "description": "Optional context or source. Aim for at most 90 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "label": {
      +                            "description": "What the number means. Aim for at most 48 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "prefix": {
      +                            "description": "e.g. $, €",
      +                            "maxLength": 3,
      +                            "type": "string"
      +                          },
      +                          "suffix": {
      +                            "description": "e.g. %, x, M, k",
      +                            "maxLength": 4,
      +                            "type": "string"
      +                          },
      +                          "value": {
      +                            "description": "The number itself, animated as a count up",
      +                            "type": "number"
      +                          }
      +                        },
      +                        "required": [
      +                          "value",
      +                          "label"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 4,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "stats",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "axis": {
      +                      "description": "Show a value axis with gridlines. Only when the audience must read values off the chart, labels on the bars usually suffice (Tufte)",
      +                      "type": "boolean"
      +                    },
      +                    "caption": {
      +                      "description": "Source or footnote. Aim for at most 90 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "categories": {
      +                      "description": "X axis labels (column, stacked, waterfall, line), rows (bar) or segments (donut)",
      +                      "items": {
      +                        "maxLength": 24,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 10,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "decimals": {
      +                      "description": "Decimal places of the value labels. Omit it: labels keep the decimals the values have (at most 3), the same for every label",
      +                      "maximum": 3,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "estimate": {
      +                      "description": "Index of the first category that is an estimate or plan (IBCS): from there bars are hatched. Name those categories e.g. 2025E",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "highlight": {
      +                      "description": "Index of the category to draw in the accent color, the rest stays muted",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "kind": {
      +                      "description": "column, bar (horizontal), line, donut (share of a whole, at most 4 segments read well), stacked (columns split into series), waterfall (bridge: first and last categories are totals, the ones between are changes that add up)",
      +                      "enum": [
      +                        "column",
      +                        "bar",
      +                        "line",
      +                        "donut",
      +                        "stacked",
      +                        "waterfall"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "reference": {
      +                      "additionalProperties": false,
      +                      "description": "A horizontal line at a reference value: target, plan or average",
      +                      "properties": {
      +                        "label": {
      +                          "description": "What the line marks, e.g. Target, Plan, Average. Aim for at most 24 characters",
      +                          "minLength": 1,
      +                          "type": "string"
      +                        },
      +                        "value": {
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "value",
      +                        "label"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "series": {
      +                      "description": "One value per category. Donut takes exactly one series",
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "name": {
      +                            "maxLength": 30,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "values": {
      +                            "items": {
      +                              "type": "number"
      +                            },
      +                            "type": "array"
      +                          }
      +                        },
      +                        "required": [
      +                          "name",
      +                          "values"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 3,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "chart",
      +                      "type": "string"
      +                    },
      +                    "unit": {
      +                      "description": "Shown after values, e.g. %, $M",
      +                      "maxLength": 6,
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "kind",
      +                    "categories",
      +                    "series"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "alt": {
      +                      "description": "What the image shows. Aim for at most 120 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "assetId": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "fit": {
      +                      "enum": [
      +                        "cover",
      +                        "contain"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "focus": {
      +                      "additionalProperties": false,
      +                      "description": "Focal point for cover crops",
      +                      "properties": {
      +                        "x": {
      +                          "maximum": 1,
      +                          "minimum": 0,
      +                          "type": "number"
      +                        },
      +                        "y": {
      +                          "maximum": 1,
      +                          "minimum": 0,
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "x",
      +                        "y"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "image",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "assetId",
      +                    "alt",
      +                    "fit"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "alt": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "assetId": {
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "logo",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "assetId",
      +                    "alt"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "items": {
      +                      "description": "Customer, partner or press logos",
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "alt": {
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "assetId": {
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "assetId",
      +                          "alt"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 8,
      +                      "minItems": 3,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "logos",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "author": {
      +                      "maxLength": 40,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "role": {
      +                      "maxLength": 60,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "The quote, without quotation marks. Aim for at most 200 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "quote",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text",
      +                    "author"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "current": {
      +                      "description": "Index of the milestone that represents now",
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "label": {
      +                            "description": "Date or phase, e.g. Q3 2026",
      +                            "maxLength": 16,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "text": {
      +                            "description": "Detail. Aim for at most 80 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "title": {
      +                            "description": "Milestone. Aim for at most 36 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "label",
      +                          "title"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 3,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "timeline",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "people": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "bio": {
      +                            "description": "One line of credibility. Aim for at most 80 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "name": {
      +                            "maxLength": 32,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "photoAssetId": {
      +                            "type": "string"
      +                          },
      +                          "role": {
      +                            "maxLength": 40,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "name",
      +                          "role"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "team",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "people"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "columns": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "highlight": {
      +                            "description": "Our column, drawn with the accent",
      +                            "type": "boolean"
      +                          },
      +                          "items": {
      +                            "items": {
      +                              "description": "Point. Aim for at most 60 characters",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "maxItems": 5,
      +                            "minItems": 1,
      +                            "type": "array"
      +                          },
      +                          "title": {
      +                            "maxLength": 28,
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "title",
      +                          "items"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 3,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "comparison",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "columns"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "build": {
      +                      "description": "together = all items with the block, items = one item per click",
      +                      "enum": [
      +                        "together",
      +                        "items"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "items": {
      +                      "items": {
      +                        "additionalProperties": false,
      +                        "properties": {
      +                          "icon": {
      +                            "description": "An icon that carries the meaning of the card (the kind of risk, the step of a process). Give all cards one or none, and avoid the same icon on two cards unless they mean the same thing",
      +                            "enum": [
      +                              "risk",
      +                              "security",
      +                              "lock",
      +                              "time",
      +                              "people",
      +                              "person",
      +                              "goal",
      +                              "growth",
      +                              "decline",
      +                              "chart",
      +                              "money",
      +                              "global",
      +                              "speed",
      +                              "done",
      +                              "fail",
      +                              "layers",
      +                              "settings",
      +                              "data",
      +                              "cloud",
      +                              "delivery",
      +                              "company",
      +                              "document",
      +                              "search",
      +                              "mail",
      +                              "launch",
      +                              "milestone",
      +                              "link",
      +                              "balance",
      +                              "partnership",
      +                              "idea",
      +                              "package",
      +                              "route"
      +                            ],
      +                            "type": "string"
      +                          },
      +                          "text": {
      +                            "description": "Card text. Aim for at most 110 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          },
      +                          "title": {
      +                            "description": "Card title. Aim for at most 32 characters",
      +                            "minLength": 1,
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "title",
      +                          "text"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "maxItems": 4,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "cards",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "items"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "columns": {
      +                      "items": {
      +                        "maxLength": 24,
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 5,
      +                      "minItems": 2,
      +                      "type": "array"
      +                    },
      +                    "highlightColumn": {
      +                      "maximum": 9007199254740991,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "rows": {
      +                      "description": "Each row has one cell per column",
      +                      "items": {
      +                        "items": {
      +                          "maxLength": 40,
      +                          "type": "string"
      +                        },
      +                        "type": "array"
      +                      },
      +                      "maxItems": 6,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "type": {
      +                      "const": "table",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "columns",
      +                    "rows"
      +                  ],
      +                  "type": "object"
      +                },
      +                {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "detail": {
      +                      "description": "Contact, link or next step. Aim for at most 80 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "step": {
      +                      "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
      +                      "maximum": 5,
      +                      "minimum": 0,
      +                      "type": "integer"
      +                    },
      +                    "text": {
      +                      "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "const": "cta",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "type",
      +                    "text"
      +                  ],
      +                  "type": "object"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "description": "Zones to set. null removes the block from the zone. Unlisted zones stay",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "composition": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "description": "The geometry of the slide grid as intent: where the content sits, how two columns share the width and which zone leads. The engine derives the numbers and measures that the slide holds. Without it the slide follows the composition of the school",
      +            "properties": {
      +              "axis": {
      +                "description": "left (default), center (low density layouts with one column) or asymmetric (the content is pushed right, the left side stays empty on purpose)",
      +                "enum": [
      +                  "left",
      +                  "center",
      +                  "asymmetric"
      +                ],
      +                "type": "string"
      +              },
      +              "dominant": {
      +                "description": "The zone that leads and gets the larger column, in a two column layout",
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "split": {
      +                "description": "Ratio of the two columns of title-image, text-image, image-text and chart-insight",
      +                "enum": [
      +                  "1:3",
      +                  "1:2",
      +                  "1:1",
      +                  "2:1",
      +                  "3:1"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "null returns the slide to the composition of its school. A new layout resets it too, unless you give one"
      +      },
      +      "intent": {
      +        "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
      +        "maxLength": 160,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "layout": {
      +        "description": "Layout id from instadeck://layouts",
      +        "enum": [
      +          "title",
      +          "title-image",
      +          "statement",
      +          "section",
      +          "headline-stat",
      +          "stats",
      +          "points",
      +          "text-image",
      +          "image-text",
      +          "image-full",
      +          "chart",
      +          "chart-insight",
      +          "cards",
      +          "comparison",
      +          "timeline",
      +          "team",
      +          "quote",
      +          "logos",
      +          "table",
      +          "closing"
      +        ],
      +        "type": "string"
      +      },
      +      "motion": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "entrance": {
      +            "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
      +            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +            "type": "string"
      +          },
      +          "transition": {
      +            "description": "Transition INTO this slide, overrides the deck default",
      +            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +            "type": "string"
      +          },
      +          "zones": {
      +            "additionalProperties": {
      +              "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +              "type": "string"
      +            },
      +            "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "notes": {
      +        "maxLength": 1200,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update_slide",
      +        "type": "string"
      +      },
      +      "slide_id": {
      +        "type": "string"
      +      },
      +      "tone": {
      +        "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
      +        "enum": [
      +          "default",
      +          "inverse",
      +          "accent"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "slide_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "op": {
      +        "const": "remove_slide",
      +        "type": "string"
      +      },
      +      "slide_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "slide_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "op": {
      +        "const": "move_slide",
      +        "type": "string"
      +      },
      +      "slide_id": {
      +        "type": "string"
      +      },
      +      "to": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "slide_id",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "design": {
      +        "additionalProperties": false,
      +        "description": "Only the fields to change",
      +        "properties": {
      +          "colors": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "accent": {
      +                "description": "Signal color: key numbers, highlights, chart focus. Never for decoration",
      +                "type": "string"
      +              },
      +              "accent2": {
      +                "description": "Secondary chart and diagram color",
      +                "type": "string"
      +              },
      +              "bg": {
      +                "description": "Main background",
      +                "type": "string"
      +              },
      +              "fg": {
      +                "description": "Main text",
      +                "type": "string"
      +              },
      +              "muted": {
      +                "description": "Secondary text: labels, captions, detail",
      +                "type": "string"
      +              },
      +              "surface": {
      +                "description": "Card and panel background, close to bg",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "fonts": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "body": {
      +                "oneOf": [
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "family": {
      +                        "description": "Family from the curated Google Fonts list (instadeck://fonts)",
      +                        "enum": [
      +                          "Inter",
      +                          "Inter Tight",
      +                          "Plus Jakarta Sans",
      +                          "Manrope",
      +                          "DM Sans",
      +                          "Space Grotesk",
      +                          "Sora",
      +                          "Outfit",
      +                          "Work Sans",
      +                          "IBM Plex Sans",
      +                          "Archivo",
      +                          "Schibsted Grotesk",
      +                          "Geist",
      +                          "Figtree",
      +                          "Fraunces",
      +                          "Playfair Display",
      +                          "Instrument Serif",
      +                          "Source Serif 4",
      +                          "Newsreader",
      +                          "Libre Caslon Text",
      +                          "DM Serif Display",
      +                          "Bricolage Grotesque",
      +                          "Syne",
      +                          "Unbounded",
      +                          "Big Shoulders Display",
      +                          "JetBrains Mono",
      +                          "IBM Plex Mono"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "const": "google",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "source",
      +                      "family"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "assetId": {
      +                        "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
      +                        "type": "string"
      +                      },
      +                      "family": {
      +                        "description": "Name to register the font under",
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "const": "asset",
      +                        "type": "string"
      +                      },
      +                      "weight": {
      +                        "description": "Weight of this file",
      +                        "maximum": 900,
      +                        "minimum": 100,
      +                        "type": "integer"
      +                      }
      +                    },
      +                    "required": [
      +                      "source",
      +                      "assetId",
      +                      "family",
      +                      "weight"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "heading": {
      +                "oneOf": [
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "family": {
      +                        "description": "Family from the curated Google Fonts list (instadeck://fonts)",
      +                        "enum": [
      +                          "Inter",
      +                          "Inter Tight",
      +                          "Plus Jakarta Sans",
      +                          "Manrope",
      +                          "DM Sans",
      +                          "Space Grotesk",
      +                          "Sora",
      +                          "Outfit",
      +                          "Work Sans",
      +                          "IBM Plex Sans",
      +                          "Archivo",
      +                          "Schibsted Grotesk",
      +                          "Geist",
      +                          "Figtree",
      +                          "Fraunces",
      +                          "Playfair Display",
      +                          "Instrument Serif",
      +                          "Source Serif 4",
      +                          "Newsreader",
      +                          "Libre Caslon Text",
      +                          "DM Serif Display",
      +                          "Bricolage Grotesque",
      +                          "Syne",
      +                          "Unbounded",
      +                          "Big Shoulders Display",
      +                          "JetBrains Mono",
      +                          "IBM Plex Mono"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "const": "google",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "source",
      +                      "family"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "additionalProperties": false,
      +                    "properties": {
      +                      "assetId": {
      +                        "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
      +                        "type": "string"
      +                      },
      +                      "family": {
      +                        "description": "Name to register the font under",
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "const": "asset",
      +                        "type": "string"
      +                      },
      +                      "weight": {
      +                        "description": "Weight of this file",
      +                        "maximum": 900,
      +                        "minimum": 100,
      +                        "type": "integer"
      +                      }
      +                    },
      +                    "required": [
      +                      "source",
      +                      "assetId",
      +                      "family",
      +                      "weight"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "shape": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "cards": {
      +                "description": "How cards and panels are drawn",
      +                "enum": [
      +                  "flat",
      +                  "outline",
      +                  "filled"
      +                ],
      +                "type": "string"
      +              },
      +              "radius": {
      +                "description": "Corner radius of cards, images and charts in px",
      +                "maximum": 32,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "space": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "density": {
      +                "enum": [
      +                  "airy",
      +                  "balanced",
      +                  "compact"
      +                ],
      +                "type": "string"
      +              },
      +              "unit": {
      +                "description": "Spacing unit in px, every gap is a multiple",
      +                "maximum": 16,
      +                "minimum": 8,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "base": {
      +                "description": "Body size in px on a 1920x1080 slide",
      +                "maximum": 36,
      +                "minimum": 22,
      +                "type": "number"
      +              },
      +              "headingCase": {
      +                "enum": [
      +                  "none",
      +                  "upper"
      +                ],
      +                "type": "string"
      +              },
      +              "headingTracking": {
      +                "description": "Letter spacing of headings in em",
      +                "maximum": 0.05,
      +                "minimum": -0.05,
      +                "type": "number"
      +              },
      +              "headingWeight": {
      +                "maximum": 900,
      +                "minimum": 300,
      +                "type": "integer"
      +              },
      +              "scale": {
      +                "enum": [
      +                  "minor-third",
      +                  "major-third",
      +                  "perfect-fourth",
      +                  "augmented-fourth",
      +                  "perfect-fifth",
      +                  "golden"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "op": {
      +        "const": "set_design",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "design"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "motion": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "entrance": {
      +            "description": "Default entrance of slide content: a preset or a name from vocabulary.entrances",
      +            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +            "type": "string"
      +          },
      +          "heroes": {
      +            "description": "Animate numbers, charts and timelines (count up, grow, draw)",
      +            "type": "boolean"
      +          },
      +          "intensity": {
      +            "description": "How much this deck moves: still (nothing moves), subtle, expressive, kinetic. Measured against what the motion really does",
      +            "enum": [
      +              "still",
      +              "subtle",
      +              "expressive",
      +              "kinetic"
      +            ],
      +            "type": "string"
      +          },
      +          "rationale": {
      +            "description": "Why this motion language fits the audience and brand, one or two sentences",
      +            "maxLength": 240,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "tempo": {
      +            "description": "Scales every duration: calm 1.25x, confident 1x, brisk 0.8x",
      +            "enum": [
      +              "calm",
      +              "confident",
      +              "brisk"
      +            ],
      +            "type": "string"
      +          },
      +          "transition": {
      +            "description": "Default transition between slides: a preset or a name from vocabulary.transitions",
      +            "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +            "type": "string"
      +          },
      +          "vocabulary": {
      +            "additionalProperties": false,
      +            "description": "Entries to add or replace, null removes one. Unlisted entries stay",
      +            "properties": {
      +              "entrances": {
      +                "additionalProperties": {
      +                  "anyOf": [
      +                    {
      +                      "additionalProperties": false,
      +                      "properties": {
      +                        "duration": {
      +                          "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
      +                          "maximum": 3000,
      +                          "minimum": 0,
      +                          "type": "integer"
      +                        },
      +                        "easing": {
      +                          "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
      +                          "type": "string"
      +                        },
      +                        "keyframes": {
      +                          "description": "States from hidden towards rest. The element always ends in its natural place, so never write the final resting keyframe",
      +                          "items": {
      +                            "additionalProperties": false,
      +                            "properties": {
      +                              "clipPath": {
      +                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "easing": {
      +                                "description": "Easing from this keyframe to the next",
      +                                "type": "string"
      +                              },
      +                              "filter": {
      +                                "description": "CSS filter, e.g. blur(8px)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "offset": {
      +                                "description": "Position in time 0 to 1, default evenly spaced",
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "opacity": {
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "transform": {
      +                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              }
      +                            },
      +                            "type": "object"
      +                          },
      +                          "maxItems": 6,
      +                          "type": "array"
      +                        },
      +                        "purpose": {
      +                          "description": "What this motion is for, one sentence",
      +                          "maxLength": 160,
      +                          "minLength": 1,
      +                          "type": "string"
      +                        },
      +                        "stagger": {
      +                          "description": "Milliseconds between blocks that enter together, default from the tempo",
      +                          "maximum": 600,
      +                          "minimum": 0,
      +                          "type": "integer"
      +                        }
      +                      },
      +                      "required": [
      +                        "purpose",
      +                        "keyframes",
      +                        "duration",
      +                        "easing"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ]
      +                },
      +                "propertyNames": {
      +                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              },
      +              "transitions": {
      +                "additionalProperties": {
      +                  "anyOf": [
      +                    {
      +                      "additionalProperties": false,
      +                      "properties": {
      +                        "duration": {
      +                          "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
      +                          "maximum": 2000,
      +                          "minimum": 0,
      +                          "type": "integer"
      +                        },
      +                        "easing": {
      +                          "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
      +                          "type": "string"
      +                        },
      +                        "enter": {
      +                          "description": "Incoming slide: states before rest, e.g. [{ transform: 'translateX(1920px)' }]. Rest is the implicit end",
      +                          "items": {
      +                            "additionalProperties": false,
      +                            "properties": {
      +                              "clipPath": {
      +                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "easing": {
      +                                "description": "Easing from this keyframe to the next",
      +                                "type": "string"
      +                              },
      +                              "filter": {
      +                                "description": "CSS filter, e.g. blur(8px)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "offset": {
      +                                "description": "Position in time 0 to 1, default evenly spaced",
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "opacity": {
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "transform": {
      +                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              }
      +                            },
      +                            "type": "object"
      +                          },
      +                          "maxItems": 6,
      +                          "type": "array"
      +                        },
      +                        "exit": {
      +                          "description": "Outgoing slide: states after rest, e.g. [{ opacity: 0, transform: 'scale(0.96)' }]. Rest is the implicit start",
      +                          "items": {
      +                            "additionalProperties": false,
      +                            "properties": {
      +                              "clipPath": {
      +                                "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "easing": {
      +                                "description": "Easing from this keyframe to the next",
      +                                "type": "string"
      +                              },
      +                              "filter": {
      +                                "description": "CSS filter, e.g. blur(8px)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              },
      +                              "offset": {
      +                                "description": "Position in time 0 to 1, default evenly spaced",
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "opacity": {
      +                                "maximum": 1,
      +                                "minimum": 0,
      +                                "type": "number"
      +                              },
      +                              "transform": {
      +                                "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
      +                                "maxLength": 200,
      +                                "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
      +                                "type": "string"
      +                              }
      +                            },
      +                            "type": "object"
      +                          },
      +                          "maxItems": 6,
      +                          "type": "array"
      +                        },
      +                        "over": {
      +                          "description": "Which slide lies on top during the transition, default exit",
      +                          "enum": [
      +                            "exit",
      +                            "enter"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        "purpose": {
      +                          "description": "What this motion is for, one sentence",
      +                          "maxLength": 160,
      +                          "minLength": 1,
      +                          "type": "string"
      +                        },
      +                        "shared": {
      +                          "description": "Elements on both slides (the headline, a logo, the same image) glide from their old place and size to the new one",
      +                          "type": "boolean"
      +                        }
      +                      },
      +                      "required": [
      +                        "purpose",
      +                        "duration",
      +                        "easing"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ]
      +                },
      +                "propertyNames": {
      +                  "pattern": "^[a-z][a-z0-9-]{0,31}$",
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "op": {
      +        "const": "set_motion",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "motion"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "op": {
      +        "const": "set_title",
      +        "type": "string"
      +      },
      +      "title": {
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "title"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "brief": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "audience": {
      +            "description": "Who will see it: seed investors, enterprise buyers, partners",
      +            "type": "string"
      +          },
      +          "bigIdea": {
      +            "description": "What the audience should take away and do, in one sentence. Every slide serves it",
      +            "maxLength": 200,
      +            "minLength": 10,
      +            "type": "string"
      +          },
      +          "company": {
      +            "description": "Company or product name",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "concept": {
      +            "additionalProperties": false,
      +            "description": "The design concept, required when the deck is created",
      +            "properties": {
      +              "avoid": {
      +                "description": "What the deck must not look like",
      +                "maxLength": 160,
      +                "minLength": 3,
      +                "type": "string"
      +              },
      +              "idea": {
      +                "description": "The visual idea of the deck in one sentence, e.g. a quiet editorial deck where one number per slide speaks",
      +                "maxLength": 200,
      +                "minLength": 10,
      +                "type": "string"
      +              },
      +              "references": {
      +                "description": "Named references, e.g. Bloomberg Businessweek covers, Braun product manuals",
      +                "items": {
      +                  "maxLength": 80,
      +                  "minLength": 2,
      +                  "type": "string"
      +                },
      +                "maxItems": 4,
      +                "type": "array"
      +              },
      +              "school": {
      +                "description": "Design school the deck follows (section schools), when one fits",
      +                "enum": [
      +                  "swiss",
      +                  "editorial",
      +                  "ma",
      +                  "keynote",
      +                  "product-tech",
      +                  "brutalist",
      +                  "bauhaus",
      +                  "functional",
      +                  "data-editorial",
      +                  "ibcs",
      +                  "humanist"
      +                ],
      +                "type": "string"
      +              },
      +              "signature": {
      +                "description": "One device that recurs on every slide: a rule, a crop, a number style, a color field",
      +                "maxLength": 160,
      +                "minLength": 3,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "idea",
      +              "avoid",
      +              "signature"
      +            ],
      +            "type": "object"
      +          },
      +          "delivery": {
      +            "description": "How the deck is used: live (spoken to an audience), pre-read (read alone, no speaker) or both. It decides text density, motion and speaker notes (validation checks density and motion). Ask the user, do not infer it from the industry",
      +            "enum": [
      +              "live",
      +              "pre-read",
      +              "both"
      +            ],
      +            "type": "string"
      +          },
      +          "frame": {
      +            "description": "Narrative frame that orders the story (section pitch, frames): classical, scqa, abt, monroe, story-spine, sparkline, toulmin",
      +            "enum": [
      +              "classical",
      +              "scqa",
      +              "abt",
      +              "monroe",
      +              "story-spine",
      +              "sparkline",
      +              "toulmin"
      +            ],
      +            "type": "string"
      +          },
      +          "goal": {
      +            "description": "What the audience should do or believe afterwards",
      +            "type": "string"
      +          },
      +          "language": {
      +            "description": "Language of the slide content, BCP 47 tag, e.g. en, cs, de",
      +            "minLength": 2,
      +            "type": "string"
      +          },
      +          "topic": {
      +            "description": "What the deck is about, e.g. seed round pitch, partner pitch, product launch",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "op": {
      +        "const": "set_brief",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "brief"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "brand_kit_id": {
      +        "description": "Brand kit whose colors and fonts replace the design",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "apply_brand",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "brand_kit_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observedv0.1.0

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the write profile is already known; the description adds genuinely new behavior: operations are applied in order, the batch is atomic ('all operations succeed or none is saved'), and it fails on a stale expected_revision. It does not state whether a removal is recoverable or what the response/preview behavior is, but the atomicity and concurrency semantics are the important disclosures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, ~40 words, with the most decision-relevant claim ('The only way to change a deck') front-loaded. The operation list, atomicity, and revision guard each earn their sentence; nothing is redundant with the schema or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter batch-mutation tool with a very large nested schema and no output schema, the description covers the critical contract: ordering, all-or-nothing save, and the stale-revision failure. What's missing is the recovery path — where the current revision comes from (get_deck) and that the agent should re-read and retry on a revision mismatch.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the baseline is 3, but the description adds semantics the schema only states tersely: expected_revision is a concurrency guard whose mismatch aborts the whole call, and the ops array members are named by operation type. It adds little about deck_id or summary, so it sits slightly above baseline rather than at 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('The only way to change a deck') and then enumerates exactly what it edits: add, update, remove, move slides, set design, motion, title, brief, apply a brand kit. That enumeration separates it from siblings like render_preview, export_deck or validate_deck without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'The only way to change a deck' is an explicit routing statement that tells the agent any deck mutation belongs here rather than in another tool. It does not name when-not/alternatives explicitly (e.g. that revert_deck undoes a change, or that you must read the deck first for the revision), so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.