Skip to main content
Glama

Update elements

update_elements
Destructive

Update many elements across one or more clips in a single tool call. Replaces the per-element tool — always batch.

SEND LESS, GET BACK LESS. defaults carries what every item shares (clip_index, element_type, and type_data entries like font_setting or alignment) so you send it once instead of per item; each item overrides any key it sets. returning declares what comes back, the way select shapes a get_clip read — omit it for a sensible default, or pass [] for just the counts.

defaults: { clip_index: 1, element_type: 'text', type_data: { font_setting: {...} } } returning: [] → { total, succeeded, failed }, plus error codes + element ids if any returning: ['layout'] → + the measured text fit per element returning: ['qa.codes'] → + the clip audit with prose stripped from non-errors (any returning value → error findings regardless; only warnings are opt-in)

Each item can update position/timing fields alone, or type-specific fields via type_data (use get_element_schema in 'update' mode to see what's settable for an element_type). Items within one call are applied in order; partial success is fine.

You do NOT need clip_index here — an element_id is unique within the project, so the server locates the clip itself. Pass it only as a hint; a wrong one is corrected rather than rejected.

Grouping: pass group: "<name>" to move an element into a named group (created on demand), or group: "" to pull it back out to the clip root. Several items sharing a name collect into one group — the way to tidy loose elements into units the user can move or hide together. Grouping never changes coordinates. It does affect z-order: a group's members render contiguously at the group's slot, and a NEW group takes the slot of its first member, so grouping already-adjacent elements keeps their z-position while grouping scattered ones pulls them together at the lowest member's slot.

Customising a component: after add_elements(component_id=...), set its content here with type_data.parameter_values on the animation element it returned.

Concurrency: parallel-safe (conflict domain: the individual element), same as add_elements — fan out across subagents as long as they touch DIFFERENT element ids — those carry different entity paths and both land. Two concurrent edits to the SAME element id do NOT merge and do NOT last-write-win: the later one is REJECTED ('changed since this edit was based on'), nothing is written, and you must re-read and re-apply. Do NOT run concurrently with whole-clip/whole-project mutations on the same guide (update_clips on that clip, structural clip ops, add_audio, update_project).

Keyframes: pass a top-level keyframes array (sibling of x/y/type_data, NOT inside type_data) to set, or null to clear. Per-entry shape: { timestamp, positionX?, positionY?, width?, height?, interpolation? } in canvas pixels; positionX/Y use the element's alignment-aware origin, except that on text sent with y + y_anchor in the same item, positionY means the anchored point as y does.

Text elements: pass fit_to_lines: N to run an automatic widen + font-shrink pass after the entry's regular update lands. The server reshapes the element so the rendered text wraps to at most N lines without overlapping its neighbours.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
updatesYesElement updates — at least one entry.
defaultsNoValues shared by every item, sent once rather than repeated. Items win per key; type_data merges one level. E.g. defaults:{clip_index:1, element_type:'text', type_data:{font_setting:{font:'Inter',weight:'600'}, alignment:'center'}} then items carry only what differs.
returningNoWhat comes back, the way get_clip's `select` shapes a read. Omitted: ids, the measured layout and the clip audit in compact form. 'ids': element_id per result. 'layout': the measured text fit (font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — widen a box to natural_width_px, not text_width_px; an `adjusted` entry when the measured line box replaced your height) plus `placement` {y_anchor, top, center, bottom}: compare placement.center with a container's centre line to verify centring. 'qa.codes': the clip audit with severity/code/element_ids per finding; 'qa': with the message and fix on each. Errors always come back: in full under ['ids'], as {clip_index, errors: [{code, element_ids}]} under []; bleed under a keyframed group is a warning marked camera_move. A failed item and font_warnings always come back. [] is the leanest write: {total, succeeded, failed} plus errors.
project_idYesProject ID

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed18 schema fields changed
    • addedInput schema / properties / defaults / properties / actions
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.actions, accepted here too (send it in one place).",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / defaults / properties / cues
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.cues, accepted here too (send it in one place). E.g. update_elements({updates:[{element_id, cues:[{op:'set', key, t}]}]}).",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / defaults / properties / insert_at / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "front",
      +      "back"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "before": {
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "before"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "after": {
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "after"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / defaults / properties / insert_at / enum
      Removed value: -[
      -  "front",
      -  "back"
      -]
    • removedInput schema / properties / defaults / properties / insert_at / type
      Removed value: -"string"
    • changedInput schema / properties / defaults / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "cropHeight": {
      -          "description": "cropHeight (native unit)",
      -          "type": "number"
      -        },
      -        "cropWidth": {
      -          "description": "cropWidth (native unit)",
      -          "type": "number"
      -        },
      -        "cropX": {
      -          "description": "cropX (native unit)",
      -          "type": "number"
      -        },
      -        "cropY": {
      -          "description": "cropY (native unit)",
      -          "type": "number"
      -        },
      -        "fillColor": {
      -          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "enum": [
      -              "linear",
      -              "easeInOut",
      -              "easeIn",
      -              "easeOut",
      -              "sigmoid",
      -              "smootherstep",
      -              "smoothstep",
      -              "hold",
      -              "easeInBack",
      -              "easeOutBack",
      -              "easeInOutBack",
      -              "custom"
      -            ],
      -            "type": "string"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeColor": {
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / defaults / properties / keyframes / description
      Added value: +"Same entries as an item's keyframes."
    • addedInput schema / properties / defaults / properties / keyframes_repeat
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Same as an item's keyframes_repeat.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / defaults / properties / name
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / defaults / properties / paramTracks
      Added value: +{
      +  "description": "Same as param_tracks.",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / defaults / properties / param_tracks
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.param_tracks, accepted here too (send it in one place).",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / defaults / properties / y_anchor
      Added value: +{
      +  "enum": [
      +    "top",
      +    "center",
      +    "bottom"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / returning / description
      Previous value: -"Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping; plus `placement` {y_anchor, top, center, bottom} — where the box landed and what your `y` meant, emitted only when the origin was implicit or resolves to 'center'. Compare placement.center with a container's centre line to verify centring: a mis-anchored label is the one layout error nothing else reports), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). A text element measured on a fallback face is listed in top-level `font_warnings` whichever you choose. ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write."New value: +"What comes back, the way get_clip's `select` shapes a read. Omitted: ids, the measured layout and the clip audit in compact form. 'ids': element_id per result. 'layout': the measured text fit (font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — widen a box to natural_width_px, not text_width_px; an `adjusted` entry when the measured line box replaced your height) plus `placement` {y_anchor, top, center, bottom}: compare placement.center with a container's centre line to verify centring. 'qa.codes': the clip audit with severity/code/element_ids per finding; 'qa': with the message and fix on each. Errors always come back: in full under ['ids'], as {clip_index, errors: [{code, element_ids}]} under []; bleed under a keyframed group is a warning marked camera_move. A failed item and font_warnings always come back. [] is the leanest write: {total, succeeded, failed} plus errors."
    • addedInput schema / properties / updates / items / properties / actions
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.actions, accepted here too (send it in one place).",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / updates / items / properties / cues
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.cues, accepted here too (send it in one place). E.g. update_elements({updates:[{element_id, cues:[{op:'set', key, t}]}]}).",
      +  "items": {},
      +  "type": "array"
      +}
    • changedInput schema / properties / updates / items / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "cropHeight": {
      -          "description": "cropHeight (native unit)",
      -          "type": "number"
      -        },
      -        "cropWidth": {
      -          "description": "cropWidth (native unit)",
      -          "type": "number"
      -        },
      -        "cropX": {
      -          "description": "cropX (native unit)",
      -          "type": "number"
      -        },
      -        "cropY": {
      -          "description": "cropY (native unit)",
      -          "type": "number"
      -        },
      -        "fillColor": {
      -          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "enum": [
      -              "linear",
      -              "easeInOut",
      -              "easeIn",
      -              "easeOut",
      -              "sigmoid",
      -              "smootherstep",
      -              "smoothstep",
      -              "hold",
      -              "easeInBack",
      -              "easeOutBack",
      -              "easeInOutBack",
      -              "custom"
      -            ],
      -            "type": "string"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeColor": {
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "enum": [
      +              "linear",
      +              "easeInOut",
      +              "easeIn",
      +              "easeOut",
      +              "sigmoid",
      +              "smootherstep",
      +              "smoothstep",
      +              "hold",
      +              "easeInBack",
      +              "easeOutBack",
      +              "easeInOutBack",
      +              "custom"
      +            ],
      +            "type": "string"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). On TEXT whose item also sends y with y_anchor, positionY means the same point y does (e.g. y_anchor:'center' → the line the text is centred on), so a tween from y+40 to y slides it onto that line: the server shifts the track by the offset it applied to y and says so in keyframes_shifted. Otherwise the element's stored origin: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeColor": {
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds, 0 or later (0 = the clip's first frame)",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / updates / items / properties / paramTracks
      Added value: +{
      +  "description": "Same as param_tracks.",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / updates / items / properties / param_tracks
      Added value: +{
      +  "description": "Animation elements only: the same list as type_data.param_tracks, accepted here too (send it in one place).",
      +  "items": {},
      +  "type": "array"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / defaults / properties / element_type / enum
      Previous value: -[
      -  "text",
      -  "callout",
      -  "rectangle",
      -  "arrow",
      -  "blur",
      -  "spotlight",
      -  "zoom",
      -  "image",
      -  "video",
      -  "animation"
      -]New value: +[
      +  "text",
      +  "callout",
      +  "rectangle",
      +  "arrow",
      +  "blur",
      +  "spotlight",
      +  "zoom",
      +  "image",
      +  "video",
      +  "animation",
      +  "avatar"
      +]
    • changedInput schema / properties / updates / items / properties / element_type / enum
      Previous value: -[
      -  "text",
      -  "callout",
      -  "rectangle",
      -  "arrow",
      -  "blur",
      -  "spotlight",
      -  "zoom",
      -  "image",
      -  "video",
      -  "animation"
      -]New value: +[
      +  "text",
      +  "callout",
      +  "rectangle",
      +  "arrow",
      +  "blur",
      +  "spotlight",
      +  "zoom",
      +  "image",
      +  "video",
      +  "animation",
      +  "avatar"
      +]
  3. Changed4 schema fields changed
    • changedInput schema / properties / defaults / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "required": [
      -            "positionX",
      -            "positionY",
      -            "width",
      -            "height",
      -            "rotation",
      -            "scaleX",
      -            "scaleY",
      -            "rotateX",
      -            "rotateY",
      -            "cropX",
      -            "cropY",
      -            "cropWidth",
      -            "cropHeight",
      -            "opacity",
      -            "blur",
      -            "backgroundBlur",
      -            "strokeWidth",
      -            "strokeDash",
      -            "strokeGap",
      -            "strokeTrimStart",
      -            "strokeTrimEnd",
      -            "strokeTrimOffset",
      -            "textStrokeWidth",
      -            "textStrokeDash",
      -            "textStrokeGap",
      -            "imageBorderWidth",
      -            "shadowOffsetX",
      -            "shadowOffsetY",
      -            "shadowBlur",
      -            "shadowSpread",
      -            "borderRadiusTopLeft",
      -            "borderRadiusTopRight",
      -            "borderRadiusBottomRight",
      -            "borderRadiusBottomLeft",
      -            "imageCornerRadiusTopLeft",
      -            "imageCornerRadiusTopRight",
      -            "imageCornerRadiusBottomRight",
      -            "imageCornerRadiusBottomLeft",
      -            "videoCornerRadiusTopLeft",
      -            "videoCornerRadiusTopRight",
      -            "videoCornerRadiusBottomRight",
      -            "videoCornerRadiusBottomLeft",
      -            "fontSize",
      -            "lineHeight",
      -            "letterSpacing",
      -            "paddingTop",
      -            "paddingRight",
      -            "paddingBottom",
      -            "paddingLeft",
      -            "textBgRadiusTopLeft",
      -            "textBgRadiusTopRight",
      -            "textBgRadiusBottomRight",
      -            "textBgRadiusBottomLeft",
      -            "fillColor",
      -            "strokeColor",
      -            "textStrokeColor",
      -            "imageBorderColor",
      -            "textColor",
      -            "textBackgroundColor",
      -            "shadowColor"
      -          ],
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "cropHeight": {
      -          "description": "cropHeight (native unit)",
      -          "type": "number"
      -        },
      -        "cropWidth": {
      -          "description": "cropWidth (native unit)",
      -          "type": "number"
      -        },
      -        "cropX": {
      -          "description": "cropX (native unit)",
      -          "type": "number"
      -        },
      -        "cropY": {
      -          "description": "cropY (native unit)",
      -          "type": "number"
      -        },
      -        "fillColor": {
      -          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "enum": [
      -              "linear",
      -              "easeInOut",
      -              "easeIn",
      -              "easeOut",
      -              "sigmoid",
      -              "smootherstep",
      -              "smoothstep",
      -              "hold",
      -              "easeInBack",
      -              "easeOutBack",
      -              "easeInOutBack",
      -              "custom"
      -            ],
      -            "type": "string"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "required": [
      -            "positionX",
      -            "positionY",
      -            "width",
      -            "height",
      -            "rotation",
      -            "scaleX",
      -            "scaleY",
      -            "rotateX",
      -            "rotateY",
      -            "cropX",
      -            "cropY",
      -            "cropWidth",
      -            "cropHeight",
      -            "opacity",
      -            "blur",
      -            "backgroundBlur",
      -            "strokeWidth",
      -            "strokeDash",
      -            "strokeGap",
      -            "strokeTrimStart",
      -            "strokeTrimEnd",
      -            "strokeTrimOffset",
      -            "textStrokeWidth",
      -            "textStrokeDash",
      -            "textStrokeGap",
      -            "imageBorderWidth",
      -            "shadowOffsetX",
      -            "shadowOffsetY",
      -            "shadowBlur",
      -            "shadowSpread",
      -            "borderRadiusTopLeft",
      -            "borderRadiusTopRight",
      -            "borderRadiusBottomRight",
      -            "borderRadiusBottomLeft",
      -            "imageCornerRadiusTopLeft",
      -            "imageCornerRadiusTopRight",
      -            "imageCornerRadiusBottomRight",
      -            "imageCornerRadiusBottomLeft",
      -            "videoCornerRadiusTopLeft",
      -            "videoCornerRadiusTopRight",
      -            "videoCornerRadiusBottomRight",
      -            "videoCornerRadiusBottomLeft",
      -            "fontSize",
      -            "lineHeight",
      -            "letterSpacing",
      -            "paddingTop",
      -            "paddingRight",
      -            "paddingBottom",
      -            "paddingLeft",
      -            "textBgRadiusTopLeft",
      -            "textBgRadiusTopRight",
      -            "textBgRadiusBottomRight",
      -            "textBgRadiusBottomLeft",
      -            "fillColor",
      -            "strokeColor",
      -            "textStrokeColor",
      -            "imageBorderColor",
      -            "textColor",
      -            "textBackgroundColor",
      -            "shadowColor"
      -          ],
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeColor": {
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "enum": [
      +              "linear",
      +              "easeInOut",
      +              "easeIn",
      +              "easeOut",
      +              "sigmoid",
      +              "smootherstep",
      +              "smoothstep",
      +              "hold",
      +              "easeInBack",
      +              "easeOutBack",
      +              "easeInOutBack",
      +              "custom"
      +            ],
      +            "type": "string"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeColor": {
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / returning / description
      Previous value: -"Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping; plus `placement` {y_anchor, top, center, bottom} — where the box landed and what your `y` meant, emitted only when the origin was implicit or resolves to 'center'. Compare placement.center with a container's centre line to verify centring: a mis-anchored label is the one layout error nothing else reports), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write."New value: +"Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping; plus `placement` {y_anchor, top, center, bottom} — where the box landed and what your `y` meant, emitted only when the origin was implicit or resolves to 'center'. Compare placement.center with a container's centre line to verify centring: a mis-anchored label is the one layout error nothing else reports), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). A text element measured on a fallback face is listed in top-level `font_warnings` whichever you choose. ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write."
    • changedInput schema / properties / updates / items / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "required": [
      -            "positionX",
      -            "positionY",
      -            "width",
      -            "height",
      -            "rotation",
      -            "scaleX",
      -            "scaleY",
      -            "rotateX",
      -            "rotateY",
      -            "cropX",
      -            "cropY",
      -            "cropWidth",
      -            "cropHeight",
      -            "opacity",
      -            "blur",
      -            "backgroundBlur",
      -            "strokeWidth",
      -            "strokeDash",
      -            "strokeGap",
      -            "strokeTrimStart",
      -            "strokeTrimEnd",
      -            "strokeTrimOffset",
      -            "textStrokeWidth",
      -            "textStrokeDash",
      -            "textStrokeGap",
      -            "imageBorderWidth",
      -            "shadowOffsetX",
      -            "shadowOffsetY",
      -            "shadowBlur",
      -            "shadowSpread",
      -            "borderRadiusTopLeft",
      -            "borderRadiusTopRight",
      -            "borderRadiusBottomRight",
      -            "borderRadiusBottomLeft",
      -            "imageCornerRadiusTopLeft",
      -            "imageCornerRadiusTopRight",
      -            "imageCornerRadiusBottomRight",
      -            "imageCornerRadiusBottomLeft",
      -            "videoCornerRadiusTopLeft",
      -            "videoCornerRadiusTopRight",
      -            "videoCornerRadiusBottomRight",
      -            "videoCornerRadiusBottomLeft",
      -            "fontSize",
      -            "lineHeight",
      -            "letterSpacing",
      -            "paddingTop",
      -            "paddingRight",
      -            "paddingBottom",
      -            "paddingLeft",
      -            "textBgRadiusTopLeft",
      -            "textBgRadiusTopRight",
      -            "textBgRadiusBottomRight",
      -            "textBgRadiusBottomLeft",
      -            "fillColor",
      -            "strokeColor",
      -            "textStrokeColor",
      -            "imageBorderColor",
      -            "textColor",
      -            "textBackgroundColor",
      -            "shadowColor"
      -          ],
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "cropHeight": {
      -          "description": "cropHeight (native unit)",
      -          "type": "number"
      -        },
      -        "cropWidth": {
      -          "description": "cropWidth (native unit)",
      -          "type": "number"
      -        },
      -        "cropX": {
      -          "description": "cropX (native unit)",
      -          "type": "number"
      -        },
      -        "cropY": {
      -          "description": "cropY (native unit)",
      -          "type": "number"
      -        },
      -        "fillColor": {
      -          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "enum": [
      -              "linear",
      -              "easeInOut",
      -              "easeIn",
      -              "easeOut",
      -              "sigmoid",
      -              "smootherstep",
      -              "smoothstep",
      -              "hold",
      -              "easeInBack",
      -              "easeOutBack",
      -              "easeInOutBack",
      -              "custom"
      -            ],
      -            "type": "string"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ],
      -            "type": "string"
      -          },
      -          "required": [
      -            "positionX",
      -            "positionY",
      -            "width",
      -            "height",
      -            "rotation",
      -            "scaleX",
      -            "scaleY",
      -            "rotateX",
      -            "rotateY",
      -            "cropX",
      -            "cropY",
      -            "cropWidth",
      -            "cropHeight",
      -            "opacity",
      -            "blur",
      -            "backgroundBlur",
      -            "strokeWidth",
      -            "strokeDash",
      -            "strokeGap",
      -            "strokeTrimStart",
      -            "strokeTrimEnd",
      -            "strokeTrimOffset",
      -            "textStrokeWidth",
      -            "textStrokeDash",
      -            "textStrokeGap",
      -            "imageBorderWidth",
      -            "shadowOffsetX",
      -            "shadowOffsetY",
      -            "shadowBlur",
      -            "shadowSpread",
      -            "borderRadiusTopLeft",
      -            "borderRadiusTopRight",
      -            "borderRadiusBottomRight",
      -            "borderRadiusBottomLeft",
      -            "imageCornerRadiusTopLeft",
      -            "imageCornerRadiusTopRight",
      -            "imageCornerRadiusBottomRight",
      -            "imageCornerRadiusBottomLeft",
      -            "videoCornerRadiusTopLeft",
      -            "videoCornerRadiusTopRight",
      -            "videoCornerRadiusBottomRight",
      -            "videoCornerRadiusBottomLeft",
      -            "fontSize",
      -            "lineHeight",
      -            "letterSpacing",
      -            "paddingTop",
      -            "paddingRight",
      -            "paddingBottom",
      -            "paddingLeft",
      -            "textBgRadiusTopLeft",
      -            "textBgRadiusTopRight",
      -            "textBgRadiusBottomRight",
      -            "textBgRadiusBottomLeft",
      -            "fillColor",
      -            "strokeColor",
      -            "textStrokeColor",
      -            "imageBorderColor",
      -            "textColor",
      -            "textBackgroundColor",
      -            "shadowColor"
      -          ],
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeColor": {
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "enum": [
      +              "linear",
      +              "easeInOut",
      +              "easeIn",
      +              "easeOut",
      +              "sigmoid",
      +              "smootherstep",
      +              "smoothstep",
      +              "hold",
      +              "easeInBack",
      +              "easeOutBack",
      +              "easeInOutBack",
      +              "custom"
      +            ],
      +            "type": "string"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeColor": {
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / updates / items / properties / parent_id
      Added value: +{
      +  "description": "The parent `get_clip` reports on this element: a group id, or the clip id for an ungrouped element. Accepted so a read round-trips unedited — the element's current parent is a no-op and leaves z-order alone. A different group id on this element's clip moves it there (the group must have a name); the clip id or null moves it to the root. Use `group` when you are choosing a group — the name is the handle. `group` wins if both are sent.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Changed4 schema fields changed
    • removedInput schema / properties / context
      Removed value: -{
      -  "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"",
      -  "type": "string"
      -}
    • removedInput schema / properties / conversation_id
      Removed value: -{
      -  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
      -  "type": "string"
      -}
    • removedInput schema / properties / llm_model
      Removed value: -{
      -  "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "project_id",
      -  "updates",
      -  "context",
      -  "llm_model"
      -]New value: +[
      +  "project_id",
      +  "updates"
      +]
  5. Changed4 schema fields changed
    • addedInput schema / properties / context
      Added value: +{
      +  "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"",
      +  "type": "string"
      +}
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
      +  "type": "string"
      +}
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "project_id",
      -  "updates"
      -]New value: +[
      +  "project_id",
      +  "updates",
      +  "context",
      +  "llm_model"
      +]
  6. Changed15 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / defaults / properties / clip_index / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / defaults / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "required": [
      +            "positionX",
      +            "positionY",
      +            "width",
      +            "height",
      +            "rotation",
      +            "scaleX",
      +            "scaleY",
      +            "rotateX",
      +            "rotateY",
      +            "cropX",
      +            "cropY",
      +            "cropWidth",
      +            "cropHeight",
      +            "opacity",
      +            "blur",
      +            "backgroundBlur",
      +            "strokeWidth",
      +            "strokeDash",
      +            "strokeGap",
      +            "strokeTrimStart",
      +            "strokeTrimEnd",
      +            "strokeTrimOffset",
      +            "textStrokeWidth",
      +            "textStrokeDash",
      +            "textStrokeGap",
      +            "imageBorderWidth",
      +            "shadowOffsetX",
      +            "shadowOffsetY",
      +            "shadowBlur",
      +            "shadowSpread",
      +            "borderRadiusTopLeft",
      +            "borderRadiusTopRight",
      +            "borderRadiusBottomRight",
      +            "borderRadiusBottomLeft",
      +            "imageCornerRadiusTopLeft",
      +            "imageCornerRadiusTopRight",
      +            "imageCornerRadiusBottomRight",
      +            "imageCornerRadiusBottomLeft",
      +            "videoCornerRadiusTopLeft",
      +            "videoCornerRadiusTopRight",
      +            "videoCornerRadiusBottomRight",
      +            "videoCornerRadiusBottomLeft",
      +            "fontSize",
      +            "lineHeight",
      +            "letterSpacing",
      +            "paddingTop",
      +            "paddingRight",
      +            "paddingBottom",
      +            "paddingLeft",
      +            "textBgRadiusTopLeft",
      +            "textBgRadiusTopRight",
      +            "textBgRadiusBottomRight",
      +            "textBgRadiusBottomLeft",
      +            "fillColor",
      +            "strokeColor",
      +            "textStrokeColor",
      +            "imageBorderColor",
      +            "textColor",
      +            "textBackgroundColor",
      +            "shadowColor"
      +          ],
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "enum": [
      +              "linear",
      +              "easeInOut",
      +              "easeIn",
      +              "easeOut",
      +              "sigmoid",
      +              "smootherstep",
      +              "smoothstep",
      +              "hold",
      +              "easeInBack",
      +              "easeOutBack",
      +              "easeInOutBack",
      +              "custom"
      +            ],
      +            "type": "string"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "required": [
      +            "positionX",
      +            "positionY",
      +            "width",
      +            "height",
      +            "rotation",
      +            "scaleX",
      +            "scaleY",
      +            "rotateX",
      +            "rotateY",
      +            "cropX",
      +            "cropY",
      +            "cropWidth",
      +            "cropHeight",
      +            "opacity",
      +            "blur",
      +            "backgroundBlur",
      +            "strokeWidth",
      +            "strokeDash",
      +            "strokeGap",
      +            "strokeTrimStart",
      +            "strokeTrimEnd",
      +            "strokeTrimOffset",
      +            "textStrokeWidth",
      +            "textStrokeDash",
      +            "textStrokeGap",
      +            "imageBorderWidth",
      +            "shadowOffsetX",
      +            "shadowOffsetY",
      +            "shadowBlur",
      +            "shadowSpread",
      +            "borderRadiusTopLeft",
      +            "borderRadiusTopRight",
      +            "borderRadiusBottomRight",
      +            "borderRadiusBottomLeft",
      +            "imageCornerRadiusTopLeft",
      +            "imageCornerRadiusTopRight",
      +            "imageCornerRadiusBottomRight",
      +            "imageCornerRadiusBottomLeft",
      +            "videoCornerRadiusTopLeft",
      +            "videoCornerRadiusTopRight",
      +            "videoCornerRadiusBottomRight",
      +            "videoCornerRadiusBottomLeft",
      +            "fontSize",
      +            "lineHeight",
      +            "letterSpacing",
      +            "paddingTop",
      +            "paddingRight",
      +            "paddingBottom",
      +            "paddingLeft",
      +            "textBgRadiusTopLeft",
      +            "textBgRadiusTopRight",
      +            "textBgRadiusBottomRight",
      +            "textBgRadiusBottomLeft",
      +            "fillColor",
      +            "strokeColor",
      +            "textStrokeColor",
      +            "imageBorderColor",
      +            "textColor",
      +            "textBackgroundColor",
      +            "shadowColor"
      +          ],
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeColor": {
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / defaults / properties / type_data / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / returning / description
      Previous value: -"Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write."New value: +"Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping; plus `placement` {y_anchor, top, center, bottom} — where the box landed and what your `y` meant, emitted only when the origin was implicit or resolves to 'center'. Compare placement.center with a container's centre line to verify centring: a mis-anchored label is the one layout error nothing else reports), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write."
    • addedInput schema / properties / updates / items / properties / clip_index / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / updates / items / properties / fit_to_lines / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / updates / items / properties / insert_at / description
      Previous value: -"Move this element in z-order, without rebuilding it. `front`/`back` are the ends of the group it is already in (the clip itself for an ungrouped element), so they never change what it belongs to. `{before: element_id}` / `{after: element_id}` sit it next to that element or group and put it in THAT node's group — which is how you move something into or out of a group and position it in one call. Applied after `group` when both are passed."New value: +"Move this element in z-order, without rebuilding it. `front`/`back` are the ends of the group it is already in (the clip itself for an ungrouped element), so they never change what it belongs to — with one exception: for an element that is ALONE in its group they move the GROUP within its parent scope, because positioning a sole member inside its own group would be a no-op. `{before: element_id}` / `{after: element_id}` sit it next to that element or group and put it in THAT node's group — which is how you move something into or out of a group and position it in one call. Applied after `group` when both are passed."
    • changedInput schema / properties / updates / items / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ]
      -          },
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "cropHeight": {
      -          "description": "cropHeight (native unit)",
      -          "type": "number"
      -        },
      -        "cropWidth": {
      -          "description": "cropWidth (native unit)",
      -          "type": "number"
      -        },
      -        "cropX": {
      -          "description": "cropX (native unit)",
      -          "type": "number"
      -        },
      -        "cropY": {
      -          "description": "cropY (native unit)",
      -          "type": "number"
      -        },
      -        "fillColor": {
      -          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/interpolation"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "cropX",
      -              "cropY",
      -              "cropWidth",
      -              "cropHeight",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "fillColor",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ]
      -          },
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Uses the SAME alignment-aware origin as the element's top-level x — left-aligned text uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right; all other types use top-left.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Origin matches positionX — center-aligned text positions by vertical center. y_anchor applies to the element's own y, not to keyframe values — keyframes use the alignment origin, so read the element back and key off its stored y.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textStrokeColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "required": [
      +            "positionX",
      +            "positionY",
      +            "width",
      +            "height",
      +            "rotation",
      +            "scaleX",
      +            "scaleY",
      +            "rotateX",
      +            "rotateY",
      +            "cropX",
      +            "cropY",
      +            "cropWidth",
      +            "cropHeight",
      +            "opacity",
      +            "blur",
      +            "backgroundBlur",
      +            "strokeWidth",
      +            "strokeDash",
      +            "strokeGap",
      +            "strokeTrimStart",
      +            "strokeTrimEnd",
      +            "strokeTrimOffset",
      +            "textStrokeWidth",
      +            "textStrokeDash",
      +            "textStrokeGap",
      +            "imageBorderWidth",
      +            "shadowOffsetX",
      +            "shadowOffsetY",
      +            "shadowBlur",
      +            "shadowSpread",
      +            "borderRadiusTopLeft",
      +            "borderRadiusTopRight",
      +            "borderRadiusBottomRight",
      +            "borderRadiusBottomLeft",
      +            "imageCornerRadiusTopLeft",
      +            "imageCornerRadiusTopRight",
      +            "imageCornerRadiusBottomRight",
      +            "imageCornerRadiusBottomLeft",
      +            "videoCornerRadiusTopLeft",
      +            "videoCornerRadiusTopRight",
      +            "videoCornerRadiusBottomRight",
      +            "videoCornerRadiusBottomLeft",
      +            "fontSize",
      +            "lineHeight",
      +            "letterSpacing",
      +            "paddingTop",
      +            "paddingRight",
      +            "paddingBottom",
      +            "paddingLeft",
      +            "textBgRadiusTopLeft",
      +            "textBgRadiusTopRight",
      +            "textBgRadiusBottomRight",
      +            "textBgRadiusBottomLeft",
      +            "fillColor",
      +            "strokeColor",
      +            "textStrokeColor",
      +            "imageBorderColor",
      +            "textColor",
      +            "textBackgroundColor",
      +            "shadowColor"
      +          ],
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "enum": [
      +              "linear",
      +              "easeInOut",
      +              "easeIn",
      +              "easeOut",
      +              "sigmoid",
      +              "smootherstep",
      +              "smoothstep",
      +              "hold",
      +              "easeInBack",
      +              "easeOutBack",
      +              "easeInOutBack",
      +              "custom"
      +            ],
      +            "type": "string"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ],
      +            "type": "string"
      +          },
      +          "required": [
      +            "positionX",
      +            "positionY",
      +            "width",
      +            "height",
      +            "rotation",
      +            "scaleX",
      +            "scaleY",
      +            "rotateX",
      +            "rotateY",
      +            "cropX",
      +            "cropY",
      +            "cropWidth",
      +            "cropHeight",
      +            "opacity",
      +            "blur",
      +            "backgroundBlur",
      +            "strokeWidth",
      +            "strokeDash",
      +            "strokeGap",
      +            "strokeTrimStart",
      +            "strokeTrimEnd",
      +            "strokeTrimOffset",
      +            "textStrokeWidth",
      +            "textStrokeDash",
      +            "textStrokeGap",
      +            "imageBorderWidth",
      +            "shadowOffsetX",
      +            "shadowOffsetY",
      +            "shadowBlur",
      +            "shadowSpread",
      +            "borderRadiusTopLeft",
      +            "borderRadiusTopRight",
      +            "borderRadiusBottomRight",
      +            "borderRadiusBottomLeft",
      +            "imageCornerRadiusTopLeft",
      +            "imageCornerRadiusTopRight",
      +            "imageCornerRadiusBottomRight",
      +            "imageCornerRadiusBottomLeft",
      +            "videoCornerRadiusTopLeft",
      +            "videoCornerRadiusTopRight",
      +            "videoCornerRadiusBottomRight",
      +            "videoCornerRadiusBottomLeft",
      +            "fontSize",
      +            "lineHeight",
      +            "letterSpacing",
      +            "paddingTop",
      +            "paddingRight",
      +            "paddingBottom",
      +            "paddingLeft",
      +            "textBgRadiusTopLeft",
      +            "textBgRadiusTopRight",
      +            "textBgRadiusBottomRight",
      +            "textBgRadiusBottomLeft",
      +            "fillColor",
      +            "strokeColor",
      +            "textStrokeColor",
      +            "imageBorderColor",
      +            "textColor",
      +            "textBackgroundColor",
      +            "shadowColor"
      +          ],
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Same origin as the element's top-level x: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). Same origin as the element's top-level y: for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. y_anchor applies to the element's own y, NOT to keyframe values, so read the element back and key off its stored y.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeColor": {
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / updates / items / properties / keyframes_repeat / properties / count / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / updates / items / properties / type_data / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / updates / items / properties / x / description
      Previous value: -"New X (canvas pixels). ORIGIN follows the element's alignment: text uses top-left / CENTER / top-right per alignment, all other types use top-left. Changing alignment in the same call re-anchors x/y to the new origin."New value: +"New X (canvas pixels). Same origin as add_elements: `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right. Changing alignment in the same call re-anchors x to the new edge."
    • changedInput schema / properties / updates / items / properties / y / description
      Previous value: -"New Y (canvas pixels). Takes type_data.y_anchor the same way add_elements does."New value: +"New Y (canvas pixels) — for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. See y_anchor."
    • addedInput schema / properties / updates / items / properties / y_anchor
      Added value: +{
      +  "description": "TEXT only. ALWAYS send `y_anchor` ('top'|'center'|'bottom') when you set `y` on text, so the position states what you meant instead of inheriting the alignment origin. Omit `y` and it anchors to the element's CURRENT box, holding a centred label centred across a re-measure. Not stored — state it on every call. (Also accepted inside type_data; this one wins.)",
      +  "enum": [
      +    "top",
      +    "center",
      +    "bottom"
      +  ],
      +  "type": "string"
      +}
  7. Changed10 schema fields changed
    • addedInput schema / properties / defaults
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Values shared by every item, sent once rather than repeated. Items win per key; type_data merges one level. E.g. defaults:{clip_index:1, element_type:'text', type_data:{font_setting:{font:'Inter',weight:'600'}, alignment:'center'}} then items carry only what differs.",
      +  "properties": {
      +    "clip_id": {
      +      "type": "string"
      +    },
      +    "clip_index": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "element_type": {
      +      "enum": [
      +        "text",
      +        "callout",
      +        "rectangle",
      +        "arrow",
      +        "blur",
      +        "spotlight",
      +        "zoom",
      +        "image",
      +        "video",
      +        "animation"
      +      ],
      +      "type": "string"
      +    },
      +    "end_time": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "group": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "height": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "insert_at": {
      +      "enum": [
      +        "front",
      +        "back"
      +      ],
      +      "type": "string"
      +    },
      +    "keyframes": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "rotation": {
      +      "type": "number"
      +    },
      +    "start_time": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "type_data": {
      +      "additionalProperties": {},
      +      "type": "object"
      +    },
      +    "width": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "x": {
      +      "type": "number"
      +    },
      +    "y": {
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / returning
      Added value: +{
      +  "description": "Declare what comes back, the way get_clip's `select` shapes a read. Omit it and you get ids, the measured layout, and the clip audit in compact form — which names every problem but drops the explanatory prose. Values: 'ids' (element_id per result), 'layout' (the measured text fit — font_size_px, text_width_px, natural_width_px, line_count, fits_width/fits_height/fits — `fits` is the WIDTH check (the widest rendered line inside the box), `fits_height` is the separate height one — plus an `adjusted` entry whenever the measured line box replaced the height you sent; widen a box to natural_width_px, NOT text_width_px, which is the widest RENDERED line and so a lower bound on text that is already wrapping), 'qa.codes' (audit counts and summary plus severity/code/element_ids per finding), 'qa' (the same audit with the full message and suggested fix on every finding — ask for this when a code alone isn't enough to act on). ERROR-severity findings always come back with their full message whichever you choose — including `returning:[]` and `['ids']`, which suppress WARNINGS only. A failed item always returns complete. Pass [] for just {total, succeeded, failed} plus any errors, the leanest write.",
      +  "items": {
      +    "enum": [
      +      "ids",
      +      "layout",
      +      "qa",
      +      "qa.codes"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / updates / items / properties / clip_index / description
      Previous value: -"Zero-based clip index"New value: +"Zero-based clip index. OPTIONAL — `element_id` is unique within the project, so the server finds the clip itself. Pass it only as a fast-path hint; a wrong one is corrected rather than rejected."
    • changedInput schema / properties / updates / items / properties / height / description
      Previous value: -"New height, pixels (0 allowed)"New value: +"New height, pixels (0 allowed). For text, the space you are giving it — the box resizes to the measured text. See layout.fits_height in the response."
    • addedInput schema / properties / updates / items / properties / insert_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "front",
      +        "back"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "before": {
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "before"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "after": {
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "after"
      +      ],
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Move this element in z-order, without rebuilding it. `front`/`back` are the ends of the group it is already in (the clip itself for an ungrouped element), so they never change what it belongs to. `{before: element_id}` / `{after: element_id}` sit it next to that element or group and put it in THAT node's group — which is how you move something into or out of a group and position it in one call. Applied after `group` when both are passed."
      +}
    • changedInput schema / properties / updates / items / properties / keyframes / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "backgroundBlur": {
      -          "description": "Backdrop blur behind the element",
      -          "type": "number"
      -        },
      -        "bezier": {
      -          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      -          "items": {
      -            "type": "number"
      -          },
      -          "maxItems": 4,
      -          "minItems": 4,
      -          "type": "array"
      -        },
      -        "bezier_overrides": {
      -          "additionalProperties": {
      -            "items": {
      -              "type": "number"
      -            },
      -            "maxItems": 4,
      -            "minItems": 4,
      -            "type": "array"
      -          },
      -          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ]
      -          },
      -          "type": "object"
      -        },
      -        "blur": {
      -          "description": "Layer blur",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomLeft": {
      -          "description": "borderRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusBottomRight": {
      -          "description": "borderRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopLeft": {
      -          "description": "borderRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "borderRadiusTopRight": {
      -          "description": "borderRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "fontSize": {
      -          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      -          "type": "number"
      -        },
      -        "height": {
      -          "description": "Height in canvas pixels (0 allowed)",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "imageBorderColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/strokeColor",
      -          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "imageBorderWidth": {
      -          "description": "imageBorderWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomLeft": {
      -          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusBottomRight": {
      -          "description": "imageCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopLeft": {
      -          "description": "imageCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "imageCornerRadiusTopRight": {
      -          "description": "imageCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "interpolation": {
      -          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      -          "enum": [
      -            "linear",
      -            "easeInOut",
      -            "easeIn",
      -            "easeOut",
      -            "sigmoid",
      -            "smootherstep",
      -            "smoothstep",
      -            "hold",
      -            "easeInBack",
      -            "easeOutBack",
      -            "easeInOutBack",
      -            "custom"
      -          ],
      -          "type": "string"
      -        },
      -        "interpolation_overrides": {
      -          "additionalProperties": {
      -            "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/interpolation"
      -          },
      -          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      -          "propertyNames": {
      -            "enum": [
      -              "positionX",
      -              "positionY",
      -              "width",
      -              "height",
      -              "rotation",
      -              "scaleX",
      -              "scaleY",
      -              "rotateX",
      -              "rotateY",
      -              "opacity",
      -              "blur",
      -              "backgroundBlur",
      -              "strokeWidth",
      -              "strokeDash",
      -              "strokeGap",
      -              "strokeTrimStart",
      -              "strokeTrimEnd",
      -              "strokeTrimOffset",
      -              "textStrokeWidth",
      -              "textStrokeDash",
      -              "textStrokeGap",
      -              "imageBorderWidth",
      -              "shadowOffsetX",
      -              "shadowOffsetY",
      -              "shadowBlur",
      -              "shadowSpread",
      -              "borderRadiusTopLeft",
      -              "borderRadiusTopRight",
      -              "borderRadiusBottomRight",
      -              "borderRadiusBottomLeft",
      -              "imageCornerRadiusTopLeft",
      -              "imageCornerRadiusTopRight",
      -              "imageCornerRadiusBottomRight",
      -              "imageCornerRadiusBottomLeft",
      -              "videoCornerRadiusTopLeft",
      -              "videoCornerRadiusTopRight",
      -              "videoCornerRadiusBottomRight",
      -              "videoCornerRadiusBottomLeft",
      -              "fontSize",
      -              "lineHeight",
      -              "letterSpacing",
      -              "paddingTop",
      -              "paddingRight",
      -              "paddingBottom",
      -              "paddingLeft",
      -              "textBgRadiusTopLeft",
      -              "textBgRadiusTopRight",
      -              "textBgRadiusBottomRight",
      -              "textBgRadiusBottomLeft",
      -              "strokeColor",
      -              "textStrokeColor",
      -              "imageBorderColor",
      -              "textColor",
      -              "textBackgroundColor",
      -              "shadowColor"
      -            ]
      -          },
      -          "type": "object"
      -        },
      -        "letterSpacing": {
      -          "description": "Letter spacing in canvas pixels.",
      -          "type": "number"
      -        },
      -        "lineHeight": {
      -          "description": "lineHeight (native unit)",
      -          "type": "number"
      -        },
      -        "opacity": {
      -          "description": "Opacity 0-100",
      -          "maximum": 100,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "paddingBottom": {
      -          "description": "paddingBottom in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingLeft": {
      -          "description": "paddingLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingRight": {
      -          "description": "paddingRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "paddingTop": {
      -          "description": "paddingTop in canvas pixels",
      -          "type": "number"
      -        },
      -        "positionX": {
      -          "description": "X position in canvas pixels (NOT `x`). Uses the SAME alignment-aware origin as the element's top-level x — left-aligned text uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right; all other types use top-left.",
      -          "type": "number"
      -        },
      -        "positionY": {
      -          "description": "Y position in canvas pixels (NOT `y`). Origin matches positionX — center-aligned text positions by vertical center.",
      -          "type": "number"
      -        },
      -        "rotateX": {
      -          "description": "rotateX (native unit)",
      -          "type": "number"
      -        },
      -        "rotateY": {
      -          "description": "rotateY (native unit)",
      -          "type": "number"
      -        },
      -        "rotation": {
      -          "description": "Rotation in degrees",
      -          "type": "number"
      -        },
      -        "scaleX": {
      -          "description": "Horizontal scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "scaleY": {
      -          "description": "Vertical scale multiplier (1 = 100%)",
      -          "type": "number"
      -        },
      -        "shadowBlur": {
      -          "description": "shadowBlur in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/strokeColor",
      -          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "shadowOffsetX": {
      -          "description": "shadowOffsetX in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowOffsetY": {
      -          "description": "shadowOffsetY in canvas pixels",
      -          "type": "number"
      -        },
      -        "shadowSpread": {
      -          "description": "shadowSpread in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeColor": {
      -          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      -          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      -          "type": "string"
      -        },
      -        "strokeDash": {
      -          "description": "strokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeGap": {
      -          "description": "strokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "strokeTrimEnd": {
      -          "description": "strokeTrimEnd (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimOffset": {
      -          "description": "strokeTrimOffset (native unit)",
      -          "type": "number"
      -        },
      -        "strokeTrimStart": {
      -          "description": "strokeTrimStart (native unit)",
      -          "type": "number"
      -        },
      -        "strokeWidth": {
      -          "description": "strokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBackgroundColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/strokeColor",
      -          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textBgRadiusBottomLeft": {
      -          "description": "textBgRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusBottomRight": {
      -          "description": "textBgRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopLeft": {
      -          "description": "textBgRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "textBgRadiusTopRight": {
      -          "description": "textBgRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "textColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/strokeColor",
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textStrokeColor": {
      -          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/strokeColor",
      -          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textStrokeDash": {
      -          "description": "textStrokeDash in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeGap": {
      -          "description": "textStrokeGap in canvas pixels",
      -          "type": "number"
      -        },
      -        "textStrokeWidth": {
      -          "description": "textStrokeWidth in canvas pixels",
      -          "type": "number"
      -        },
      -        "timestamp": {
      -          "description": "Clip-relative time in seconds",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomLeft": {
      -          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusBottomRight": {
      -          "description": "videoCornerRadiusBottomRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopLeft": {
      -          "description": "videoCornerRadiusTopLeft in canvas pixels",
      -          "type": "number"
      -        },
      -        "videoCornerRadiusTopRight": {
      -          "description": "videoCornerRadiusTopRight in canvas pixels",
      -          "type": "number"
      -        },
      -        "width": {
      -          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "timestamp"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "backgroundBlur": {
      +          "description": "Backdrop blur behind the element",
      +          "type": "number"
      +        },
      +        "bezier": {
      +          "description": "Cubic-bezier [x1,y1,x2,y2]; used when interpolation is 'custom'.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "maxItems": 4,
      +          "minItems": 4,
      +          "type": "array"
      +        },
      +        "bezier_overrides": {
      +          "additionalProperties": {
      +            "items": {
      +              "type": "number"
      +            },
      +            "maxItems": 4,
      +            "minItems": 4,
      +            "type": "array"
      +          },
      +          "description": "Per-property cubic-bezier override, e.g. {\"opacity\":[.4,0,.6,1]}, when two `custom`-eased properties in this entry need DIFFERENT curves. Keys must be properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ]
      +          },
      +          "type": "object"
      +        },
      +        "blur": {
      +          "description": "Layer blur",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomLeft": {
      +          "description": "borderRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusBottomRight": {
      +          "description": "borderRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopLeft": {
      +          "description": "borderRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "borderRadiusTopRight": {
      +          "description": "borderRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "cropHeight": {
      +          "description": "cropHeight (native unit)",
      +          "type": "number"
      +        },
      +        "cropWidth": {
      +          "description": "cropWidth (native unit)",
      +          "type": "number"
      +        },
      +        "cropX": {
      +          "description": "cropX (native unit)",
      +          "type": "number"
      +        },
      +        "cropY": {
      +          "description": "cropY (native unit)",
      +          "type": "number"
      +        },
      +        "fillColor": {
      +          "description": "fillColor as #rrggbb or #rrggbbaa (alpha = opacity)",
      +          "pattern": "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
      +          "type": "string"
      +        },
      +        "fontSize": {
      +          "description": "Font size in CANVAS PIXELS (same unit as the top-level fontSize — NOT a fraction).",
      +          "type": "number"
      +        },
      +        "height": {
      +          "description": "Height in canvas pixels (0 allowed)",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "imageBorderColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "imageBorderColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "imageBorderWidth": {
      +          "description": "imageBorderWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomLeft": {
      +          "description": "imageCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusBottomRight": {
      +          "description": "imageCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopLeft": {
      +          "description": "imageCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "imageCornerRadiusTopRight": {
      +          "description": "imageCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "interpolation": {
      +          "description": "Easing for THIS entry, applied to every property in it (default easeInOut). NOT `easing`.",
      +          "enum": [
      +            "linear",
      +            "easeInOut",
      +            "easeIn",
      +            "easeOut",
      +            "sigmoid",
      +            "smootherstep",
      +            "smoothstep",
      +            "hold",
      +            "easeInBack",
      +            "easeOutBack",
      +            "easeInOutBack",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "interpolation_overrides": {
      +          "additionalProperties": {
      +            "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/interpolation"
      +          },
      +          "description": "Per-property easing override, e.g. {\"opacity\":\"linear\"} while the rest use `interpolation`. Keys must be keyframable properties present in this entry.",
      +          "propertyNames": {
      +            "enum": [
      +              "positionX",
      +              "positionY",
      +              "width",
      +              "height",
      +              "rotation",
      +              "scaleX",
      +              "scaleY",
      +              "rotateX",
      +              "rotateY",
      +              "cropX",
      +              "cropY",
      +              "cropWidth",
      +              "cropHeight",
      +              "opacity",
      +              "blur",
      +              "backgroundBlur",
      +              "strokeWidth",
      +              "strokeDash",
      +              "strokeGap",
      +              "strokeTrimStart",
      +              "strokeTrimEnd",
      +              "strokeTrimOffset",
      +              "textStrokeWidth",
      +              "textStrokeDash",
      +              "textStrokeGap",
      +              "imageBorderWidth",
      +              "shadowOffsetX",
      +              "shadowOffsetY",
      +              "shadowBlur",
      +              "shadowSpread",
      +              "borderRadiusTopLeft",
      +              "borderRadiusTopRight",
      +              "borderRadiusBottomRight",
      +              "borderRadiusBottomLeft",
      +              "imageCornerRadiusTopLeft",
      +              "imageCornerRadiusTopRight",
      +              "imageCornerRadiusBottomRight",
      +              "imageCornerRadiusBottomLeft",
      +              "videoCornerRadiusTopLeft",
      +              "videoCornerRadiusTopRight",
      +              "videoCornerRadiusBottomRight",
      +              "videoCornerRadiusBottomLeft",
      +              "fontSize",
      +              "lineHeight",
      +              "letterSpacing",
      +              "paddingTop",
      +              "paddingRight",
      +              "paddingBottom",
      +              "paddingLeft",
      +              "textBgRadiusTopLeft",
      +              "textBgRadiusTopRight",
      +              "textBgRadiusBottomRight",
      +              "textBgRadiusBottomLeft",
      +              "fillColor",
      +              "strokeColor",
      +              "textStrokeColor",
      +              "imageBorderColor",
      +              "textColor",
      +              "textBackgroundColor",
      +              "shadowColor"
      +            ]
      +          },
      +          "type": "object"
      +        },
      +        "letterSpacing": {
      +          "description": "Letter spacing in canvas pixels.",
      +          "type": "number"
      +        },
      +        "lineHeight": {
      +          "description": "lineHeight (native unit)",
      +          "type": "number"
      +        },
      +        "opacity": {
      +          "description": "Opacity 0-100",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "paddingBottom": {
      +          "description": "paddingBottom in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingLeft": {
      +          "description": "paddingLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingRight": {
      +          "description": "paddingRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "paddingTop": {
      +          "description": "paddingTop in canvas pixels",
      +          "type": "number"
      +        },
      +        "positionX": {
      +          "description": "X position in canvas pixels (NOT `x`). Uses the SAME alignment-aware origin as the element's top-level x — left-aligned text uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right; all other types use top-left.",
      +          "type": "number"
      +        },
      +        "positionY": {
      +          "description": "Y position in canvas pixels (NOT `y`). Origin matches positionX — center-aligned text positions by vertical center. y_anchor applies to the element's own y, not to keyframe values — keyframes use the alignment origin, so read the element back and key off its stored y.",
      +          "type": "number"
      +        },
      +        "rotateX": {
      +          "description": "rotateX (native unit)",
      +          "type": "number"
      +        },
      +        "rotateY": {
      +          "description": "rotateY (native unit)",
      +          "type": "number"
      +        },
      +        "rotation": {
      +          "description": "Rotation in degrees",
      +          "type": "number"
      +        },
      +        "scaleX": {
      +          "description": "Horizontal scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "scaleY": {
      +          "description": "Vertical scale multiplier (1 = 100%)",
      +          "type": "number"
      +        },
      +        "shadowBlur": {
      +          "description": "shadowBlur in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "shadowColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "shadowOffsetX": {
      +          "description": "shadowOffsetX in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowOffsetY": {
      +          "description": "shadowOffsetY in canvas pixels",
      +          "type": "number"
      +        },
      +        "shadowSpread": {
      +          "description": "shadowSpread in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "strokeColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "strokeDash": {
      +          "description": "strokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeGap": {
      +          "description": "strokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "strokeTrimEnd": {
      +          "description": "strokeTrimEnd (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimOffset": {
      +          "description": "strokeTrimOffset (native unit)",
      +          "type": "number"
      +        },
      +        "strokeTrimStart": {
      +          "description": "strokeTrimStart (native unit)",
      +          "type": "number"
      +        },
      +        "strokeWidth": {
      +          "description": "strokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBackgroundColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "textBackgroundColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "textBgRadiusBottomLeft": {
      +          "description": "textBgRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusBottomRight": {
      +          "description": "textBgRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopLeft": {
      +          "description": "textBgRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "textBgRadiusTopRight": {
      +          "description": "textBgRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "textColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "textStrokeColor": {
      +          "$ref": "#/properties/updates/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "textStrokeColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "textStrokeDash": {
      +          "description": "textStrokeDash in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeGap": {
      +          "description": "textStrokeGap in canvas pixels",
      +          "type": "number"
      +        },
      +        "textStrokeWidth": {
      +          "description": "textStrokeWidth in canvas pixels",
      +          "type": "number"
      +        },
      +        "timestamp": {
      +          "description": "Clip-relative time in seconds",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomLeft": {
      +          "description": "videoCornerRadiusBottomLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusBottomRight": {
      +          "description": "videoCornerRadiusBottomRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopLeft": {
      +          "description": "videoCornerRadiusTopLeft in canvas pixels",
      +          "type": "number"
      +        },
      +        "videoCornerRadiusTopRight": {
      +          "description": "videoCornerRadiusTopRight in canvas pixels",
      +          "type": "number"
      +        },
      +        "width": {
      +          "description": "Width in canvas pixels (0 allowed — e.g. a bar that draws in from 0)",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "timestamp"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / updates / items / properties / keyframes_repeat
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Repeat `keyframes` as a cycle — { count, mode?, every? }. Requires `keyframes` in the same call.",
      +  "properties": {
      +    "count": {
      +      "description": "TOTAL number of cycles, INCLUDING the one you wrote. 1 is a no-op. Expansion stops at the clip end rather than piling the overflow onto the last frame, and the generated total is capped at 600 keyframes (it errors rather than silently truncating).",
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "every": {
      +      "description": "Seconds between cycle STARTS. Defaults to the cycle's own span (back-to-back). A LARGER value holds the last value in the gap — that is how you get a pulse every 2s instead of a constant wobble. Shorter than the cycle is rejected, because the cycles would overlap and collide on the same frames.",
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    },
      +    "mode": {
      +      "description": "'loop' (default) replays the cycle forwards every time — seamless only if your first and last values match. 'pingpong' alternates forwards/backwards, so the value always returns to where it started without a jump; use it for a breathe/pulse written as a one-way ramp.",
      +      "enum": [
      +        "loop",
      +        "pingpong"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "count"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / updates / items / properties / width / description
      Previous value: -"New width, pixels (0 allowed — e.g. a bar that draws in from 0)"New value: +"New width, pixels (0 allowed — e.g. a bar that draws in from 0). For text this is the wrap width and re-wraps the text."
    • changedInput schema / properties / updates / items / properties / y / description
      Previous value: -"New Y (canvas pixels). ORIGIN matches x — center-aligned text positions by vertical center."New value: +"New Y (canvas pixels). Takes type_data.y_anchor the same way add_elements does."
    • changedInput schema / properties / updates / items / required
      Previous value: -[
      -  "clip_index",
      -  "element_id"
      -]New value: +[
      +  "element_id"
      +]
  8. First observed

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, so the agent knows this mutates state. The description adds substantial extra behavior: partial success, server-side clip resolution, keyframe track-replacement semantics (only present tracks replaced), group z-order rules, and y_anchor non-persistence. This is richer than most, but it never states permission/auth requirements or return payload guarantees beyond the `returning` examples, so with annotations carrying the safety profile a 3 is fair.

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

Conciseness4/5

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

Front-loaded with the core purpose and the high-value concurrency/grouping rules, and every paragraph targets a real gotcha. It is long and dense — the concurrency and keyframe sections could be tightened — but the length is justified by the tool's complexity, so not wasteful enough to drop below a 4.

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

Completeness5/5

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

No output schema exists, so the description must carry return-shape detail, and it does comprehensively via the `returning` examples (counts, layout, qa.codes, error behavior). Combined with grouping, keyframes, and concurrency semantics, an agent has everything needed to call this correctly.

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 100%, so the baseline is 3 and the schema already documents most params. The description adds real value beyond the schema: the `defaults` merge rule (items win per key, type_data merges one level), `returning` shape examples, and the ordering/clip-hint semantics of clip_index that clarify intent rather than restate type.

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+resource+scope: 'Update many elements across one or more clips in a single tool call.' It also explicitly distinguishes itself from the per-element alternative ('Replaces the per-element tool — always batch') and from remove/reorder/add by naming the batch-update role.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('always batch', 'use get_element_schema in update mode'), when-not-to-run-concurrently (names update_clips, structural clip ops, add_audio, update_project), and the concurrency fan-out rule across subagents. It even names the safe conflict domain (individual element) and the rejection path on same-id collisions.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.