Skip to main content
Glama

Add elements to clips

add_elements

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

SEND LESS. Most batches repeat themselves — the same clip_index, element_type, font_setting, alignment or gradientSetting on every item. Hoist those into defaults and send them once; each item then carries only what differs, and overrides any key it sets (type_data merges one level). On a 20-30 element batch this typically cuts the call by a quarter to a half. returning shapes the response the way select shapes a get_clip read.

defaults: { clip_index: 2, element_type: 'text', type_data: { font_setting: { font: 'Inter', weight: '600' }, alignment: 'center' } } elements: [ { name: 'headline', x: 960, y: 400, type_data: { text: 'Hello', fontSize: 120 } }, ... ]

Use after calling get_element_schema to confirm the type_data shape per element_type. Items within one call are applied in order; returns one result entry per input item so partial success is fine.

Native is the default; compute boxes and eased keyframes in run_script (layout.row/grid/split, anim.stagger, native.box/text/tween — worked example: get_design_guide({topic: "stdlib", query: "native-elements"})). An animation item with code lands as a draft you refine in place with edit_animation(element_id, project_id).

Across a cut: an item {continue_from: <element_id or group id>, clip_index?, start_time?, end_time?, type_data?: {animation_setting: {exit}}} carries that element, group or animation into the next clip (or clip_index) as it was at its end, so consecutive scenes in one world don't reset; end_time and an exit let it leave on time. It returns the new element_ids and end_state: the transform the copy starts with, as applied (positionX, positionY, width, height, rotation and held values such as opacity or scale; for a group {group, elements: {: state}}), so a keyframe that starts from it continues without a jump.

Reuse instead of rebuilding: an item may pass component_id INSTEAD of element_type/type_data to insert a saved component from this workspace exactly as stored — no generation, instant — returning every new element_id plus its parameter_schema; set its content afterwards with update_elements(type_data.parameter_values). Find them with find(type='element_components'). Use base_component_id (with element_type='animation' and a prompt) only when you want a NEW variant rather than that component.

Z-order: list position IS z-index — later renders on top — and a new element goes on top by default. Pass insert_at: 'back' to put it behind what's already there, or insert_at: {before: id} / {after: id} to land next to a specific element — that also puts the new element in THAT node's group, which is the only way to place inside one. reorder_elements rewrites the whole order in one call, grouped clips included.

group + insert_at: {before|after} together: what the reference is relative to decides what gets positioned. Point at a node INSIDE the group and the ELEMENT takes that slot among its new siblings. Point at one OUTSIDE it and the GROUP takes that slot, with the element inside — which is how you put a backdrop pattern of N elements at a chosen depth as one hideable unit: hoist both into defaults and the first item seats the group, the rest just join it. The one refusal left is naming a reference outside a group that already exists somewhere else, since moving an established group is not what adding one element to it should do; seat the group where you want it in the call that CREATES it, because there is no reposition afterwards. front/back with a group follow the same principle: they address the GROUP only while the element is alone in it — the call that creates it — and once the group has other members they address the ELEMENT within the group's interior, so they will not move an established group either.

Grouping (group: "<name>") never changes coordinates but 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 scattered elements pulls them together at the lowest member's slot.

Concurrency: within ONE call every element lands in a single save. Across calls the conflict domain is the CLIP's element list, not the individual element, so you can fan this tool out across parallel subagents targeting DIFFERENT clips. Two concurrent add_elements calls on the SAME clip are NOT safe: every add claims that clip's element list, so the later call is REJECTED ('changed since this edit was based on') and nothing it sent is written — batch all of a clip's elements into ONE call instead. A rejection is not last-write-wins: re-read and re-apply. Do NOT run it concurrently with a whole-clip or whole-project mutation on the same guide (update_clips on that clip, add_clips/remove_clip/split_clip/duplicate_clip, add_audio, update_project) — those rewrite a larger scope and would clobber the element.

Element-type quirks (handled per-item): • zoom → x/y/width/height are ignored; use centerX/centerY in type_data • image → provide x/y/width/height (the clip is located by clip_index; the clip_id input is accepted but unused) • animation → x/y/width/height default to the full canvas if omitted (the clip is located by clip_index) • avatar → an AI presenter; type_data.avatarId from find(type='avatars'). Omit x/y for the default bottom-right position (both 0 also means default) and width/height for the default size; width sets the size and height follows the look. The result's avatar says whether export will render it and what it costs — read get_element_schema('avatar') before the first one. For everything else, x/y/width/height are required.

Animation: pass a top-level keyframes array (sibling of x/y/type_data, NOT inside type_data) — entries are { timestamp, positionX?, positionY?, width?, height?, interpolation? } in canvas pixels. positionX/Y use the SAME origin as the element's x/y — for text sent with y and y_anchor, positionY follows the anchor too, so native.text(box, …) with native.tween(t, d, {positionY: y + 40}, {positionY: y}) slides onto the anchored line. Keyframe timestamps are clip seconds, never negative: an anticipation wind-up goes inside the clip. Text caveat: width/height are not keyframable on text — animate its size with fontSize (letterSpacing/lineHeight/padding* are also keyframable).

Position origin: for TEXT y is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top; x is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right.

To centre a label in a row, pill, chip, card or beside an icon: pass the container's centre line as y with y_anchor:'center'. The server centres the measured text in it, so it is one number and it holds for wrapped text. Add type_data.fit{max_height} whenever the text could wrap, so the box stays inside the space you gave it. y_anchor is a directive for computing the stored y, not a property that sticks — repeat it on any later call that moves the same label.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
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.
elementsYesElements to add — at least one entry.
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. Changed20 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"
      +}
    • addedInput schema / properties / elements / 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 / elements / items / properties / continue_from
      Added value: +{
      +  "description": "Carry an element across the cut instead of adding a new one: an element_id or group id from an earlier clip. clip_index is the clip it continues into (default: the next clip after the source). An animation is placed again, same animation, entry and box, picking up at the animation second it reached (timing 'trim'); a native element, or every element of a group, is copied at t=0 holding its end state (keyframes evaluated at its end) with no entry animation. Besides clip_index the item takes only start_time / end_time (clip seconds; default the cut and the clip's end), insert_at, and type_data: {animation_setting: {exit}} so a carried text, image or video leaves on time. Stacking: the carried elements keep their source order and land just above the target clip's backdrop (a full-canvas scene or background), under its other elements, unless insert_at says; an overlay that must stay on top (a cursor, a caption pill): add it last or pass insert_at: 'front'. Into the next clip, from a source that lasts to its clip's end, the source's exit and end fade are taken off (the cut is the continuity) and listed as source_updated. Returns the new element_ids (a group as a new group, renamed in group_name if the target clip has its name); anything not brought across is listed in not_carried.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / elements / 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 / elements / items / properties / group / description
      Previous value: -"Put this element in a named group. The name is the handle: items in ONE call sharing the same name land in the SAME group, and a later call with that name adds to it. Use it to keep a unit together (a card and its label, a stat and its caption) so the user can move or hide it as one thing. Grouping never moves anything — coordinates stay absolute. Animations and AI-generated images are created in the background and cannot be grouped as they are added; add them first, then set `group` via update_elements."New value: +"Put this element in a named group. The name is the handle: items in ONE call sharing the same name land in the SAME group, and a later call with that name adds to it. Use it to keep a unit together (a card and its label, a stat and its caption) so the user can move or hide it as one thing. Grouping never moves anything — coordinates stay absolute. Animations generated from a `prompt` and AI-generated images are made in the background and cannot be grouped as they are added; add them first, then set `group` via update_elements. A placed animation (`animation` + `entry`, or `code`) takes `group` and `insert_at` here like any element, and lands below later items of the same call."
    • changedInput schema / properties / elements / 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 / elements / items / properties / paramTracks
      Added value: +{
      +  "description": "Same as param_tracks.",
      +  "items": {},
      +  "type": "array"
      +}
    • addedInput schema / properties / elements / 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"
      +}
    • 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."
  2. Changed3 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 / elements / items / properties / element_type / description
      Previous value: -"One of: text, callout, rectangle, arrow, blur, spotlight, zoom, image, video, animation. Omit when using component_id."New value: +"One of: text, callout, rectangle, arrow, blur, spotlight, zoom, image, video, animation, avatar. Omit when using component_id."
    • changedInput schema / properties / elements / 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. Changed3 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 / elements / 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"
      +  }
      +]
    • 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."
  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",
      -  "elements",
      -  "context",
      -  "llm_model"
      -]New value: +[
      +  "project_id",
      +  "elements"
      +]
  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",
      -  "elements"
      -]New value: +[
      +  "project_id",
      +  "elements",
      +  "context",
      +  "llm_model"
      +]
  6. Changed14 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/elements/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"
      +}
    • addedInput schema / properties / elements / items / properties / clip_index / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / elements / items / properties / insert_at / description
      Previous value: -"Where the element lands in z-order, so you don't need a follow-up reorder_elements. `front` (default) puts it on top of what's already on the clip; `back` puts it behind everything — what a backdrop panel or a wash needs. `{before: element_id}` / `{after: element_id}` place it next to a specific element or group and put it in THAT node's group, which is the only way to position inside a group. Placement is relative to the clip AS IT STANDS when the item is applied, so several `back` items in one call end up in REVERSE input order: send one backdrop per call, or list them back-to-front."New value: +"Where the element lands in z-order, so you don't need a follow-up reorder_elements. `front` (default) puts it on top of what's already on the clip; `back` puts it behind everything — what a backdrop panel or a wash needs. `{before: element_id}` / `{after: element_id}` place it next to a specific element or group and put it in THAT node's group, which is the only way to position inside a group. Passing `group` as well changes what `front`/`back` address — see the Z-order notes in this tool's description. Placement is relative to the clip AS IT STANDS when the item is applied, so several `back` items in one call end up in REVERSE input order: send one backdrop per call, or list them back-to-front."
    • changedInput schema / properties / elements / 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/elements/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/elements/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/elements/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/elements/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/elements/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/elements/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      -          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -        },
      -        "textStrokeColor": {
      -          "$ref": "#/properties/elements/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 / elements / items / properties / keyframes_repeat / properties / count / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / elements / items / properties / type_data / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / elements / items / properties / x / description
      Previous value: -"X position in canvas pixels. ORIGIN is alignment-dependent: TEXT only — left-aligned uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right. All other element types (callout, rectangle, arrow, blur, spotlight, image, animation) use top-left. For zoom, use type_data.centerX instead."New value: +"X position in canvas pixels. `x` is the left edge, except TEXT where alignment picks it: left→left, center→centre, right→right (callout, rectangle, arrow, blur, spotlight, image and animation all use the left edge). For zoom, use type_data.centerX instead."
    • changedInput schema / properties / elements / items / properties / y / description
      Previous value: -"Y position in canvas pixels. Which part of the element this refers to is set by type_data.y_anchor for text (top / center / bottom). To sit a label on a row, pill, chip, card or beside an icon, pass that container's centre line here with y_anchor:'center'."New value: +"Y position in canvas pixels — for TEXT `y` is the vertical CENTRE when centre-aligned and the TOP otherwise; every other type uses the top. Pair it with y_anchor (below), always."
    • addedInput schema / properties / elements / 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. To centre in a row, pill, chip, card or button: pass the container's centre line as `y` with y_anchor:'center'. The server centres the MEASURED box — you cannot compute that height, since wrapping and `fit` change it. A write-time DIRECTIVE: never stored, never returned by a read, so send it on every call whose `y` means the same thing. (Also accepted inside type_data — older spelling; this one wins.)",
      +  "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), '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."
  7. Changed14 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/elements/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"
      +}
    • changedInput schema / properties / elements / items / properties / clip_index / description
      Previous value: -"Zero-based clip index"New value: +"Zero-based clip index. Required unless hoisted into `defaults`."
    • changedInput schema / properties / elements / items / properties / height / description
      Previous value: -"Height, pixels (0 allowed)"New value: +"Height, pixels (0 allowed). For text the box's height always follows the measured text, so this reads as the space you are giving it: the text is centred in that space and layout.fits_height says whether it fit. Use type_data.fit to shrink the font into it."
    • addedInput schema / properties / elements / 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": "Where the element lands in z-order, so you don't need a follow-up reorder_elements. `front` (default) puts it on top of what's already on the clip; `back` puts it behind everything — what a backdrop panel or a wash needs. `{before: element_id}` / `{after: element_id}` place it next to a specific element or group and put it in THAT node's group, which is the only way to position inside a group. Placement is relative to the clip AS IT STANDS when the item is applied, so several `back` items in one call end up in REVERSE input order: send one backdrop per call, or list them back-to-front."
      +}
    • addedInput schema / properties / elements / items / properties / keyframes / anyOf
      Added 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/elements/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/elements/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/elements/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/elements/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/elements/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/elements/items/properties/keyframes/anyOf/0/items/properties/fillColor",
      +          "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      +        },
      +        "textStrokeColor": {
      +          "$ref": "#/properties/elements/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"
      +  }
      +]
    • changedInput schema / properties / elements / items / properties / keyframes / description
      Previous value: -"Animation keyframes (≥2 entries). Each entry has a timestamp plus one or more keyframable properties (position/size in canvas pixels; rotation°, opacity 0-100, scale, colors as #rrggbb[aa], etc. in native units). Easing: per-entry `interpolation` + optional per-property `interpolation_overrides`. Call get_element_schema to see which properties this element_type can keyframe."New value: +"Animation keyframes (≥2 entries). Each entry has a timestamp plus one or more keyframable properties (position/size in canvas pixels; rotation°, opacity 0-100, scale, colors as #rrggbb[aa], etc. in native units). Easing: per-entry `interpolation` + optional per-property `interpolation_overrides`. Call get_element_schema to see which properties this element_type can keyframe. null is accepted and means none."
    • removedInput schema / properties / elements / items / properties / keyframes / items
      Removed value: -{
      -  "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/elements/items/properties/keyframes/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/elements/items/properties/keyframes/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/elements/items/properties/keyframes/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/elements/items/properties/keyframes/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/elements/items/properties/keyframes/items/properties/strokeColor",
      -      "description": "textColor as #rrggbb or #rrggbbaa (alpha = opacity)"
      -    },
      -    "textStrokeColor": {
      -      "$ref": "#/properties/elements/items/properties/keyframes/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"
      -}
    • removedInput schema / properties / elements / items / properties / keyframes / type
      Removed value: -"array"
    • addedInput schema / properties / elements / 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 / elements / items / properties / width / description
      Previous value: -"Width, pixels (0 allowed — e.g. a bar that draws in from 0)"New value: +"Width, pixels (0 allowed — e.g. a bar that draws in from 0). For text this is the WRAP width and it is kept as sent: the text wraps to it and the box stays this wide. (Height differs — the box's height follows the measured text.)"
    • changedInput schema / properties / elements / items / properties / x / description
      Previous value: -"X position in canvas pixels. ORIGIN is alignment-dependent: TEXT only — left-aligned uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right. All other element types (callout, rectangle, arrow, blur, spotlight, image, animation) use top-left. For zoom, use type_data.center_x instead."New value: +"X position in canvas pixels. ORIGIN is alignment-dependent: TEXT only — left-aligned uses top-left, center-aligned uses CENTER POINT, right-aligned uses top-right. All other element types (callout, rectangle, arrow, blur, spotlight, image, animation) use top-left. For zoom, use type_data.centerX instead."
    • changedInput schema / properties / elements / items / properties / y / description
      Previous value: -"Y position in canvas pixels. ORIGIN matches x: center-aligned text positions by its vertical center. All other types and alignments use the top edge."New value: +"Y position in canvas pixels. Which part of the element this refers to is set by type_data.y_anchor for text (top / center / bottom). To sit a label on a row, pill, chip, card or beside an icon, pass that container's centre line here with y_anchor:'center'."
    • removedInput schema / properties / elements / items / required
      Removed value: -[
      -  "clip_index"
      -]
    • 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"
      +}
  8. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare only non-readonly and non-destructive, which is a low bar; the description adds the critical behavioral layer: same-clip concurrency is rejected (not last-write-wins), items apply in order with per-item partial success, z-order is list position, grouping pulls elements to the lowest slot, and continue_from carries end state across a cut. This is far beyond what the annotations convey.

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-loads the core batching advice and uses sectioned topics, and nearly every sentence carries actionable detail for a genuinely complex tool. It is nonetheless very long, and some z-order/grouping passages are dense enough that a reader must re-read them, so it is not maximally tight.

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?

For a high-complexity mutation tool with nested objects and no output schema, the description covers the missing return-value territory itself: `returning` modes, end_state shape, continue_from's not_carried, and universal error behavior. Nothing an agent needs to invoke it safely is absent.

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

Parameters5/5

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

Schema coverage is 100%, setting the baseline at 3, but the description adds substantial semantics the schema lacks: how `defaults` hoisting and one-level type_data merge work, that insert_at before/after also seats the element in that node's group, that y_anchor is a write-time directive never stored, and per-type quirks like zoom ignoring x/y.

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 precise verb+resource+scope ('Add many elements across one or more clips in a single tool call') and explicitly positions itself against the per-element tool with 'always batch'. An agent can distinguish it from update_elements and add_clips without opening any schema.

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 and when-not guidance: use after get_element_schema, prefer component_id over element_type for reuse, use base_component_id only for a NEW variant, and never run concurrently with whole-clip mutations. Alternatives and prerequisites are named directly.

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.