I was sent a brief for an AI "motion director": an agent that designs, animates, scores and checks a finished film entirely in code. It's one of the better prompts I've read, and not really because of the film part. It's a complete recipe for getting work you'd show a client out of an agent, and almost every rule in it maps onto how we already try to build software.
The brief was shared as a screenshot and I don't know its author. What follows is my reading and summary of it, plus how I'd run it here. None of this has been built yet.
The brief opens with the line that sets everything else up: a film with no bugs isn't finished; it's finished when it holds up next to the best work in its genre. That's a higher bar than most agent prompts set, and it's the right one. "It runs" is the floor. An agent that stops at the floor hands you something you then have to finish yourself, which is most of the work.
The same idea is in our testing standards: a 200 alone proves little. For a film, a clean render alone proves little.
Every project starts by filling in a short form: mode, subject, viewer, end state, length, frame rate, brand, facts, assets, style, sound, autonomy, toolchain and sign-off. Any blank the agent fills itself, writing down the choice and a one-line reason. That's section 1 of AGENTS.md ("state your assumptions out loud") turned into a form.
Two fields stand out. End state asks what the viewer should feel, know or do in the last second, which is the film's acceptance test. Autonomy is either unattended or gated, with gates after the storyboard, the style frames and the audio mix: the three points where a person's taste is cheap to apply and expensive to apply later.
It names four modes, each with its own pacing:
| Mode | What carries it | Rhythm |
|---|---|---|
| Showreel | The craft itself: one idea that keeps transforming, through type, UI, 3D, something organic and one transition worth rewinding | A new composition every 1 to 2.5 s |
| Product | The product: its real logo and real UI rebuilt as live components, ending on the name and URL | Every 1.4 to 3.5 s |
| Launch story | Characters: readable poses, holds on faces, funny timing, two or three treatments written and one picked | One or two facts at most, woven in |
| Explainer | One cause and effect: hook, familiar world, disruption, mechanism, discovery, consequence, recap | Narration at 125 to 145 words a minute |
Every claim on screen or in the voice-over goes into facts.json with its exact source sentence and
URL. No fake clients, logos or metrics. Anything generated is labelled as concept. This is the film version of our
rule that every claim in a proposal links to its source.
Assets follow the same honesty. Capture the real product at 2x, take the logo as SVG from the source, sample the real colours and fonts, and never redraw a logo. The rule I like most: never show a raw screenshot. Rebuild the panels, icons and text as live HTML or SVG so each part can move. A screenshot is a dead slab; a rebuilt UI is something the camera can fly into. Reference films are for study only, through frame-difference passes and contact sheets, never for copying footage, layouts or music.
The craft list reads like notes from a good motion designer. Condensed:
Rule 11 is section 2 of AGENTS.md in a different medium: no features nobody asked for. An effect that doesn't explain anything is speculative code.
Audio comes before animation. Music sits low and matches the energy; beats, the drop, voice in and out, and key
actions are detected and written to timing.json, and every animation reads its timing from that file.
Effects only mark real on-screen events: one soft whoosh per scene change, clicks and impacts on real actions. The
mix lands around −14 LUFS with true peak at or below −1 dBTP, and a music-only version is exported too.
Making the timing a file rather than numbers scattered through scenes is the data-structures-first idea from section 7: get the data right and the code mostly writes itself. Change the track and every scene re-syncs.
This is the technical heart of the brief. Everything lives on one timeline in code, with pinned local fonts and assets, rendered frame by frame and encoded with ffmpeg. No timers, no unseeded randomness. Each scene is a pure function: give it a frame number, get back exactly one picture.
That one constraint buys a lot:
The drawing itself has to happen in a browser engine, since that's where HTML, SVG, CSS and fonts render well, so the scenes are JavaScript (Remotion, or plain HTML with GSAP, are the toolchains the brief names). The orchestration around it is plain Ruby: read the brief and timing, drive a headless browser one frame at a time, and pipe the frames to ffmpeg.
// scene.js: a frame number in, one picture out
export function title(frame, t) {
const p = spring(frame - t.beats[0], { stiffness: 180, damping: 14 });
return { y: lerp(40, 0, p), opacity: p, scale: lerp(0.96, 1, p) };
}
# bin/render: frames from the browser, straight into ffmpeg
Open3.popen2("ffmpeg", "-y", "-f", "image2pipe", "-framerate", fps.to_s, "-i", "-",
"-i", "mix.wav", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-shortest", out) do |stdin, _|
(0...frame_count).each { |frame| stdin.write(browser.screenshot_at(frame)) }
end
Sketches, not working code. The brief also asks for a 3 to 5 second test rendered end to end before any real work, which is the cheapest way to find out the pipeline breaks.
The part that makes this more than a style guide is the critic loop. After the storyboard, after each scene and after each full render, a fresh critic agent that has seen none of the building pulls its own frames (every 0.2 s, denser around transitions), measures them, and returns ranked problems with timestamps, ending in "ship" or "one more pass". Every full render also gets:
timing.json.facts.json.The builder fixes the biggest problem first, re-renders, and a new critic rechecks every earlier item. Each round
goes in ledger.md with before and after numbers.
This is the rule from our testing standards, applied to taste: the same generation is never the only judge of its own correctness. A builder that has stared at a scene for an hour can't see it any more. A critic with no context sees what a viewer sees. Starting a fresh one each round matters too; a critic that watched the last round starts grading on effort.
The brief ends with a release gate, and most of it is numbers a script can check:
| Check | Measured how |
|---|---|
| Exact duration, size and frame rate | ffprobe on the output |
| Frame one finished; under 1 s frozen per 30 s, no still stretch over 0.5 s | Frame-difference pass |
| Text contrast at least 4.5:1, no collisions, inside safe margins | Sampled from rendered frames |
| Brand colours match in the render | Pixel sampling against the brand values |
| Cuts and hits within one frame of the beat | Scene-change detection against timing.json |
| Loudness around −14 LUFS, no clipping, effects below music and voice | ffmpeg's loudnorm analysis |
| Understood with the sound off | The silent contact-sheet critic |
| Every claim sourced; nothing invented; generated work labelled | Fact check against facts.json |
And one judged item: a critic would put it beside the references without it looking weaker. The measured checks keep the judgment honest; the judgment keeps the measured checks from becoming the goal.
The threads workspace we're building for Claude Code, Codex, Kimi and local models is a good home for this, because the brief is already shaped like our threads:
The bigger lesson isn't about video. Any job we hand to an agent gets better with the same five pieces: a written brief with decisions recorded, sources locked before work starts, output that's deterministic and inspectable, a critic that didn't do the building, and a bar with numbers on it. The brief also suggests saving the whole pipeline as a reusable skill once it works, and that's how I'd want every one of these to end.
Provided as is, for information only, with no warranty and no liability. Not legal or professional advice. Security and radio material is for authorized, lawful use only. Full disclaimer.
Visits are logged on our own server: IP address, browser and device details, and pages viewed. We use them to understand traffic and spot attacks, and never share or sell them.