Check motion frame by frame
figma_check_motionAudit an animated Figma frame's motion from keyframes without rendering, catching pops, dead holds, blur errors and timing issues with per-layer fixes before export.
Instructions
A motion designer's frame-by-frame check of an animated top-level frame from its keyframes, no render: figma_check_layout for motion. Each issue names layer, field, frame and numbers at fps, with a fix. It finds pops and vanishes mid-move, one frame carrying most of a move, fast moves without blur, blur out of phase, one-frame peaks, arrivals never held, dead stretches (outside holds), a cold open, template moves, missing staggers, keys between frames, HOLD, beat offsets (bpm or beatTimes), text too brief, a late brand or short CTA (brandId, ctaId). The frame's plan (figma_set_motion_plan) fills bpm, holds, brandId and ctaId when left out; its accept lists intended findings apart. ok: true = no errors or warnings. A whole passing check (no rules, from, to, nothing looser than the plan) at the delivery fps unlocks figma_export_video { final: true } until the file changes. Then figma_review_video. UNSUPPORTED: no Figma Motion here. Skill: critique. Editors: Design only, unverified.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Judge up to this time, s. Default the end. | |
| bpm | No | Tempo: turns on the beat check. Default the plan's. | |
| fps | No | Frame rate to judge at; match the planned export. Default 30. | |
| from | No | Judge from this time, s. Default the start. | |
| ctaId | No | The call-to-action layer: turns on cta_short. Default the plan's. | |
| holds | No | Intended stillness, exempt from dead_span: seconds, e.g. [{ from: 10.4, to: 10.9 }], or frames at `fps`, e.g. [{ fromFrame: 312, toFrame: 327 }]. Default the plan's. | |
| limit | No | Max findings returned. Default 100. | |
| rules | No | Only these rules. Default all. | |
| nodeId | No | The animated top-level frame, or any layer in it (id or Figma link). Default: the selection's frame, else the page's only animated frame. | |
| brandBy | No | Brand fully visible by this time, s. Default 3. | |
| brandId | No | The brand layer: turns on brand_late. Default the plan's. | |
| ctaMinS | No | Seconds the CTA must stay readable. Default 2.5. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxNodes | No | Layers read. Default 2000. | |
| beatTimes | No | The beat times of the music in seconds, increasing: the beat check uses them instead of the bpm grid. | |
| beatOffset | No | Time of the first downbeat, s. Default the plan's, else 0. | |
| thresholds | No | Override a default threshold; each comes from a measured 2026-10-09 finding. | |
| beatsPerBar | No | Default 4. | |
| minSeverity | No | Hide findings below this level. Default "info". | |
| includeActivity | No | Add `activity`: the fastest on-screen move per frame, px. |