Skip to main content
Glama

Update elements

update_elements
Destructive

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

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

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

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

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

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

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

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

Keyframes: pass a top-level keyframes array (sibling of x/y/type_data, NOT inside type_data) to set, or null to clear. Per-entry shape: { timestamp, positionX?, positionY?, width?, height?, interpolation? } in canvas pixels; positionX/Y use the element's alignment-aware origin.

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

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
updatesYesElement updates — at least one entry.
defaultsNoValues shared by every item, sent once rather than repeated. Items win per key; type_data merges one level. E.g. defaults:{clip_index:1, element_type:'text', type_data:{font_setting:{font:'Inter',weight:'600'}, alignment:'center'}} then items carry only what differs.
returningNoDeclare 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.
project_idYesProject ID

Schema Changelog

Changes observed during successful MCP inspections.

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

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint: false, destructiveHint: true), the description discloses critical behavior: partial success is fine, later concurrent edits to the same element are rejected (no last-write-win), wrong clip_index is corrected rather than rejected, error findings always return while warnings are opt-in, and grouping never moves coordinates. It also explains z-order effects and keyframe replacement semantics. This goes far beyond what annotations alone provide and contains no contradictions.

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?

The description is exceptionally long but well-structured with clear sections (defaults/returning, grouping, keyframes, text, concurrency) and front-loaded with the core purpose. While every sentence adds value for such a complex tool, the sheer length risks overwhelming an agent. It earns a high score for organization but loses a point for verbosity that could have been trimmed without losing essential information.

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 tool of this complexity with no output schema, the description is remarkably complete. It covers return shaping, failure semantics, grouping edge cases, keyframe replacement, text fitting, concurrency conflict rules, and even the meaning of 'fits' vs 'fits_height'. It also explains the fallback font warning. An agent has everything needed to call it correctly across varied scenarios.

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?

The schema already has detailed parameter descriptions, but the tool description adds substantial meaning: it explains the defaults/items override model, the exact meaning of each `returning` value, the group name semantics, the top-level vs type_data keyframe distinction, and fit_to_lines behavior. It provides concrete examples (e.g., defaults snippet) and clarifies nuanced behaviors like placement vs width checks. This far exceeds the schema's coverage.

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?

The description clearly states it updates many elements across clips in one call and explicitly replaces the per-element tool, always batching. It names the sibling tool it supersedes, distinguishing itself from add_elements, remove_elements, and update_clips. The verb-resource pairing is specific and unambiguous.

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?

The description provides rich usage guidance: when to batch, how to use defaults to avoid repetition, how to shape returns with `returning`, when to use `group` for organizing, and clear concurrency rules. It explicitly warns against concurrent whole-clip/project mutations and tells agents to re-read after a rejected edit. It also directs users to get_element_schema for type-specific fields, so alternatives are covered.

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.