It exists because the first real ad (fusengine.ch) was rejected as "trop simplet, horrible": a white ground, small blue tiles, centered text, fades and a slow camera drift. The fix that followed (depth-by-effect) was rejected as AI slop. The direction is now fixed: a film reads rich through value contrast (two large planes far apart in lightness, a full-bleed ink or accent field on one state in three), type as a large object (one word ≥ 4× its label, cropped by the frame), composition (flush-left, asymmetric, never centered) and rhythm (cuts and gestures on a tempo grid). The owner approved that still look and asked for more animation, after prompt-motion.com: so motion density — a purposeful gesture in progress at every moment (no span over 0.75 s without one, the final CTA still ≤ 1.2 s, beats every 0.5–1 s), type moving at letter and word level, one recurring geometric actor, animated objects, and 3D where the expert judges it serves. Decorative effects, fades and drift are banned outright.
The method mirrors fuse-design:design-method (dials, obligations, screen-holding floor,
Gate 0, absolute bans, slop test, blind sketches), transposed to film. This skill points
to those files instead of copying them.
Agent Workflow (MANDATORY)
Contract §8 order. It is the only order, in every fuse-motion file:
| Step | Who | What |
|---|---|---|
| Brief + beat map | motion-expert via motion-method |
.motion/brief.md (genre, register) + .motion/beats.md |
| 1 Sketches | motion-expert |
3 text-only tone candidates (gate-zero.md) |
| 2 Tone lock | fuse-ai-pilot:challenger |
Judges the 3 sketches blind and locks ONE tone |
| 3 Board | motion-expert + fuse-browser |
6 refs = 3 traits × 2 for the locked tone → board.png, refs.md (reference-board.md) |
| 4 Look | motion-expert |
Every field of templates/look.md + 3 key frames in words |
| 5 G0 | owner | Sees the key frames + look.md and approves in their own message |
| 6 Scene | motion-expert |
cut-rhythm → composition-grid → kinetic-type; motion-render gives mechanics only |
| Review | motion-critic via motion-review |
Frames vs look.md; hard-fail IDs live only in motion-review references/hard-fails.md |
| Scripts | fuse-ai-pilot:sniper |
Validation after scene code |
No .motion/scene/* file is written before look.md and the 3 key frames exist and the
owner has seen and approved the key frames. The harness does not enforce G0 yet: the
motion scope gates G1/G2 only, so this rule holds because the agent stops.
Overview
| Area | Core rule | Reference |
|---|---|---|
| Dials | 7 numbers, argued. VALUE_CONTRAST area-weighted ≥ 60 + full bleed on ⌈N/3⌉ states; TYPE_SCALE ≥ 4; largest type ≥ 180 px; HOLD ≥ 0.25 s/word; MOTION_DENSITY ≥ 1 gesture/s, ≤ 0.75 s gesture-free, CTA still ≤ 1.2 s. Equal to the critic floors | dials.md |
| Gate 0 | §8 order; every look.md field + key frames seen by the owner, or no scene code | gate-zero.md |
| Board | After the tone lock: 3 traits × 2, open/mid/end stills, one borrow / one don't | reference-board.md |
| Composition | 6-col flush-left grid, never centered, key word ≥ 4×, bleed, camera moves on a cut ≤ 2 beats | composition.md |
| Type | 2–4 words per beat, letter/word kinetics (stagger, slam, scale jump, split) rotated, frame 0 at full value | type-as-image.md |
| Objects | One recurring actor (travels, wipes, splits, floods, becomes the CTA); objects that stand for the product; 3D by judgment, justified | objects.md |
| Rhythm | Cuts and gestures on the tempo grid, a beat every 0.5–1 s, ≤ 0.75 s gesture-free, CTA built then still ≤ 1.2 s | rhythm.md |
| Prompt patterns | 10 prompt-motion.com prompts summarised; 6-block brief, state chains, density | prompt-patterns.md |
| Contrast | ink / paper / accent in OKLCH, planes ≥ 20 %, no mid-tones, accent as a plane | contrast.md |
| Bans | B1–B23 mapped from the canonical list to grep checks + critic IDs | bans.md |
Units everywhere: px at the 1080 px-wide output frame, OKLCH L 0–100.
Critical Rules
| # | Rule | Check |
|---|---|---|
| 1 | No file under .motion/scene/ before look.md + 3 key frames exist and the owner approved them |
look.md approval filled |
| 2 | Tone = one extreme, locked blind by the challenger over 3 text sketches written before the board | Quote in look.md |
| 3 | Area-weighted VALUE_CONTRAST ≥ 60 on every state; a lone paper plane fails | auditFrame().valueContrast |
| 4 | Ink or accent plane ≥ 50 % on ≥ ⌈N/3⌉ states | validateRhythm, auditFrame().fullBleed |
| 5 | Hero frame: TYPE_SCALE ≥ 4, largest type ≥ 180 px, flush-left, never centered | auditFrame() + still |
| 6 | Frame 0 shows the opening statement at full value | notOnFrame0 guard, still at t = 0 |
| 7 | A gesture in progress at every moment: ≤ 0.75 s gesture-free, final CTA still ≤ 1.2 s, ≥ 1 primary gesture/s; no drift | validateDensity (lib.js), MOVES guards |
| 8 | No crossfade, no dissolve, no opacity-only reveal; behaviours rotated, never twice in a row; one primary gesture at a time | Bans sweep, validateDensity |
| 9 | Cuts and gestures on the tempo grid ±1 frame; ≥ 0.25 s/word on screen; CTA built over ≥ 2 gestures | validateRhythm |
| 10 | Brand never before the pain | validateRhythm |
| 11 | Every ban B1–B23, no exception, no look.md override | Bans sweep |
| 12 | Everything a pure function of t (motion-render seek contract) |
Stills twice → same sha256 |
| 13 | Borrow grammar only — never logos, footage, music, copy, exact layouts | refs.md |
| 14 | One recurring actor; every 3D beat has a job and a style reason in look.md and the beat table | look.md actor, objects; validateRhythm (d3) |
Architecture
brief.md + beats.md (motion-method)
└── G0 3 text sketches → challenger (blind) locks the tone
→ reference-board.md → refs/NN-{open,mid,end}.png → board.png + refs.md
→ look.md (templates/look.md) + 3 key frames ← dials, contrast, composition,
type-as-image, rhythm, bans → owner sees key frames, approves
scene/ — classic scripts after motion-render's lib.js, each within the hook ceiling `FUSE_SOLID_MAX_LINES`
1 cut-rhythm.md rhythm.js: STATES (+ gestures) → CUTS → BEATS/DURATION/GESTURES/STILLS, validateRhythm + validateDensity, ground, showState
2 composition-grid.md grid.js: grid, .plane, #world + camera(t) + MOVES guards, auditFrame()
3 kinetic-type.md kinetic.js: letterStagger · slam · scaleJump · splitWord · maskReveal · pushReplace · swap · accentSwitch · safeBezier
(objects.md the actor and objects; motion-render timeline-seek / webgl-scene for CSS 3D and lit three.js)
→ stills G1 → draft + critic G2 → master
Reference Guide
Concepts
| Topic | Reference | When to Consult |
|---|---|---|
| Dials | dials.md | Writing the dials block; a still reads grey, uniform, empty or flat |
| Gate 0 | gate-zero.md | After the beat map; any look.md field missing |
| Reference board | reference-board.md | After the challenger lock |
| Composition | composition.md | Grid, key frames, camera |
| Type as image | type-as-image.md | Copy per state, kinetic set, easing |
| Objects | objects.md | The actor, the object vocabulary, transforms, 3D by judgment |
| Rhythm | rhythm.md | Tempo, density, cut table, CTA build and still |
| Prompt patterns | prompt-patterns.md | Writing the brief; planning the state chain; "it lacks animation" |
| Contrast | contrast.md | Colour roles, planes, full bleed, inversion |
| Bans | bans.md | Before look.md, before stills, any "add an effect" or "add a fade" reflex |
Templates (scene step order)
| Template | When to Use |
|---|---|
| look.md | Writing .motion/look.md for G0 |
| cut-rhythm.md | 1st scene block (rhythm.js): tempo map → states + gestures, rhythm + density validators, grounds, hard cuts |
| composition-grid.md | 2nd (grid.js): 6-col grid, planes, camera without drift, per-frame audit |
| kinetic-type.md | 3rd (kinetic.js): letter stagger, slam, scale jump, split, mask, push/replace, swap, accent switch |
Best Practices
DO
- Derive look.md from the locked tone field by field; argue every dial in one line.
- Describe the 3 key frames with grid positions, px sizes and planes before any code.
- Run
auditFrame()and the bans sweep on every still.
DON'T
- Fix a flat draft with an effect, a fade or a drift — fix value, scale, crop or rhythm.
- Fix an under-animated draft with ambient loops — add purposeful gestures (letters, the actor, objects, details).
- Add 3D without a job or without its reason in look.md.
- Spend the accent on small objects; a plane < 20 % does not count.
- Let the tempo slip "because it looked right" — snap to the grid.
Forbidden
- Scene code before the owner has seen and approved the key frames (G0).
- Any item of bans.md, whatever look.md says.
- Logo or brand before the pain; a centered, uniform-size, faded-in sentence as a state.
- Unseeded randomness, wall-clock time, rAF loops, CSS animations/transitions in a scene.
- Third-party logos, footage, music or exact layouts in the film;
board.pngshipped publicly. - Describing a reference from memory — open it or drop it.