The other skills point here for order and gates: motion-art-direction locks the visual system before any scene code, motion-craft decides how each beat looks and moves, motion-assets supplies the real screenshots, motion-render produces the frames and files, motion-review judges them. This skill decides WHEN each of them runs and WHEN to stop.
Gates G1 (stills → draft) and G2 (draft → master) are owner approvals. They are enforced by the harness motion scope (hooks/hooks.json) and specified in references/stage-gates.md: draft and master renders are denied until the owner types MOTION-APPROVE stills|draft <code>. The agent still stops at each gate on its own. G0 (board + look.md, before scene code) is an owner step, not a harness gate: the agent stops and waits, never self-approves.
Motion Method
Agent Workflow (MANDATORY)
| Step |
Who |
What |
| Before the brief |
fuse-ai-pilot:explore-codebase |
Find the product's real tokens, screens, copy, existing .motion/ state |
| Named style unknown |
fuse-ai-pilot:research-expert |
Verify what the named reference style actually looks like (no guessing) |
| G0 tone |
fuse-ai-pilot:challenger |
Blind-locks one of 3 text tone sketches (motion-art-direction) |
| Draft rendered |
motion-critic |
One review pass per round via motion-review; at most 2 fix rounds |
| Scripts written |
fuse-ai-pilot:sniper |
Validate scene/render scripts (code only) |
| Before "done" |
fuse-ai-pilot:challenger |
Challenge the "master verified" claim |
Overview
| Stage |
Output |
Stop? |
| 1 Brief lock |
.motion/brief.md — genre: ad or demo, <inputs> (with defaults), <direction>, <structure>, <build>, <gotchas>, <start> |
Ask ONE question if an input has no default; genre: ad → owner confirms the message |
| 2 Beat map |
.motion/beats.md — one row per beat (0.5-1 s), its primary gesture, details, words, 3D reason; DURATION = sum of beats; ≤ 0.75 s gesture-free, CTA still ≤ 1.2 s, ≥ 1 beat change/s; key action on the drop |
— |
| 2b G0 art direction |
brief → 3 text sketches (tone candidates) → fuse-ai-pilot:challenger locks the tone blind → reference board → .motion/look.md (dials) + 3 key frames → owner sees the key frames → scene code (motion-art-direction) |
STOP — G0, owner approves; never self-approve |
| 3 Assets |
real screenshots + .motion/assets.json (see motion-assets) |
— |
| 4 Scene |
Built from the motion-art-direction templates first — cut-rhythm, composition-grid, kinetic-type, objects.md — then motion-render for seek/capture/encode only (window.seek(t) / DURATION / FPS, ?t= and ?capture) |
— |
5 --stage stills (default) |
one still per beat + contact sheet |
STOP — G1 |
6 --stage draft (540p) |
draft mp4 → motion-critic (≤2 fix rounds) |
STOP — G2 |
7 --stage master |
master file, verified with ffprobe + frame diff vs approved stills |
— |
| 8 Validate |
sniper on scripts, challenger on the "done" claim |
— |
Critical Rules
- No code before the brief is locked — every section filled, or defaulted and marked "default — owner skipped". One question at a time. Shape from field template (ultimaxbt, 2026-10-07). For
genre: ad the agent never self-locks: the owner confirms the message.
- No scene code before G0 — pipeline: brief (genre ad|demo; owner confirms an ad's message) → beats (on a tempo grid) → G0, in this exact order: brief → 3 text sketches (tone candidates) → challenger locks the tone blind → reference board →
look.md (dials) + 3 key frames → owner sees the key frames → scene code. Then stills (G1) → draft + critic (G2) → master. No .motion/scene/* file is written before look.md and the key frames exist; never self-approve G0. This is a prose rule — the harness does not enforce G0 yet. genre: ad also applies ad-genre.md.
- A named reference style, never an adjective — "Linear launch", not "premium/modern". See reference-styles.md.
- Facts on screen come from a facts file only — no invented feature, metric, or UI state.
- DURATION = sum of beats — the scene's DURATION constant is derived from
beats.md, never typed separately.
- Omitted
--stage means stills — the pipeline never jumps to draft or master by default.
- Stop at G1 and G2, never lean on the deny — the harness enforces both; the owner approves by typing
MOTION-APPROVE, never the agent. .motion/project.json is owner-managed: if missing before the first draft, STOP and give the owner its content (see stage-gates.md).
- Continuous purposeful motion, readable, never drifting — a gesture in progress at every moment: no span > 0.75 s without one, the final CTA still ≤ 1.2 s, a beat change every 0.5-1 s (≥ 1 per second); ≥ 0.25 s per word on screen; long copy split into more beats — never kept alive by a drift (
motion-craft → timing-holds).
- The scene step routes through
motion-art-direction templates first — composition-grid, kinetic-type, cut-rhythm; motion-render supplies only seek/capture/encode. Frame 0 shows the opening statement at full value; no opacity blends, no centered hero, entrances rotate (motion-craft).
- Verify the file, not the intent — the master is done when ffprobe and the frame diff say so, not when the render command exits 0.
- Every decorative effect is banned — gradient backgrounds, decorative blur, glow, shadow, grain, glass/chrome, ambient 3D, particles, bouncy easing; no exception via
look.md; the list and its four bounded allowances (swap blur, master motion blur, ≤ 3 % overshoot, purposeful 3D) live in motion-craft → anti-slop-video.
- Not only type — one recurring geometric actor and animated objects move with the words; 3D where the expert judges it serves, justified in look.md and the beat map (
motion-art-direction → objects.md).
Architecture
<project>/.motion/
├── brief.md # Stage 1 — locked brief (template: brief.md)
├── facts.md # Only source for on-screen claims
├── beats.md # Stage 2 — beat map (template: beats.md)
├── look.md # G0 — locked visual system (motion-art-direction)
├── refs/ # G0 — board.png + refs.md, owner-approved before scene code
├── assets.json # Stage 3 — provenance (motion-assets)
├── scene/ # Stage 4 — index.html + timeline.js (window.seek(t))
├── stills/ # Stage 5 — still-1..N.png (one per beat) + contact.png (G1 artifact)
├── out/ # Stage 6-7 — draft.mp4 (G2 artifact), master.mp4 + master.gif
└── review/ # Review pack of the draft/master (motion-review), gitignored
Reference Guide
Concepts
| Topic |
Reference |
When to Consult |
| Brief lock |
brief-lock.md |
Stage 1 — the six blocks of the prompt-motion prompts mapped to our gates (<start> = G0), defaults, one still per beat, one-question rule |
| Ad genre |
ad-genre.md |
genre: ad — hook (0-3 s, the pain in their words) → pain → solution → ONE CTA, 2-6 words per hero beat, tempo grid, sound-off, durations |
| Reference styles |
reference-styles.md |
Turning "make it premium" into a named, checkable style |
| Beat map |
beat-map.md |
Stage 2 — timing every beat, deriving DURATION |
| Stage gates |
stage-gates.md |
G1/G2 enforcement, project.json contract, MOTION-APPROVE flow, deny messages, budget cap |
| Exit contract |
exit-contract.md |
Deciding Stop / Retry / Rollback / Ask / Escalate on a motion event |
Templates
| Template |
When to Use |
| brief.md |
Writing .motion/brief.md |
| beats.md |
Writing .motion/beats.md |
Sibling skills
| Skill |
Owns |
motion-art-direction |
G0: tone sketches, references board, .motion/look.md (dials) + key frames; the scene templates (composition-grid, kinetic-type, cut-rhythm) |
motion-craft |
Focus, holds, easing/springs, color/type, anti-slop rules |
motion-assets |
Real screenshots, masking, provenance |
motion-render |
Seek/capture/encode mechanics, determinism, stage flags — not the look of a scene |
motion-review |
Review pack, rubric, verdict |
fuse-design:design-motion |
UI motion tokens — pointed to, never copied |
Best Practices
DO
- Re-read
.motion/ on resume: an existing brief, beat map, or approval decides where the pipeline restarts.
- Show the contact sheet at G1 and the draft at G2 with the
MOTION-APPROVE <stage> <code> line the owner must type (code from the deny message).
- Report renders per stage and wall time at every stop (see exit-contract.md).
- Keep one owner decision per question; record each answer in the brief.
DON'T
- Start the scene before the beat map sums correctly, or before
look.md + the 3 key frames exist and the owner approved G0.
- Start a scene from a centered starter skeleton or a generic fade helper — start from the
motion-art-direction templates.
- Self-lock an ad brief or self-approve the G0 board.
- Render a draft "just to see" before G1, or a master before G2.
- Treat an approval as valid after the artifact changed — a new hash needs a new approval.
- Write client names or real spend figures into any
.motion/ file.