Ultimate Motion DesignUMD v0.10.0
Français
Menu

Quality checks

GroupDomains
StoryNAR brief and narrative · TIM rhythm and timing · LIF life and density · ART art direction
MotionMOT easing and choreography · TXT on-screen text · SAF motion safety · WEB animated web pages
SoundAUD audio · CAP captions
DeliveryREN render and encoding · LIC licences and rights

Every rule and check is detailed in docs/en/REFERENTIAL.md.

29 of the 64 checks are measured in code, without an agent (which ones apply depends on the profile):

  • output length and format;
  • cuts made on motion, never between two parked shots;
  • frozen frames, dead air and total near-still time (under 1 s per 30 s, end card excluded);
  • sounds landing on their picture, when the storyboard lists sound cues (umd sync);
  • black frames;
  • flashes, as a full-frame approximation of WCAG 2.3.1;
  • loudness and true peak;
  • silences and abrupt audio cuts;
  • render reproducibility, and how faithful the delivered encode is to the master (VMAF);
  • caption coverage, sync and reading speed;
  • for pages: smoothness, CLS and prefers-reduced-motion;
  • in the code: hard-coded durations, AI motion tells, remote fonts and assets, hollow wording;
  • asset inventory and licences.

The other checks are judged by the auditors, from the contact sheet and a few targeted frames.

Scoring

  • Each check is a blocker (5 points), major (3) or minor (1). Passed = all points, partial = half, failed or not checked = none.
  • A failed blocker caps its domain at 3/10 and the overall score at 5.9/10. Examples:
    • a dangerous flash;
    • text too short to read;
    • a render that is not reproducible;
    • stills not validated before animation;
    • a non-commercial asset in an ad.
  • The overall score weights the domains by profile: promo, presentation, explainer, social, film, logo or web. Domains that do not apply are ignored, such as captions for a logo or audio for a web page.
  • Thresholds can be tuned per project in the thresholds of .motion/project.json: −14 LUFS, 3 flashes per second, 3 s of dead air, VMAF 93… The dead-air, frozen-picture, near-still, cuts-on-motion, flash and loudness thresholds were checked with zero false alarm on 15 reference films scored 7 to 8 by an AI jury (docs/CALIBRATION.md). A rule that would have wrongly flagged 7 of these films (music dynamics) was dropped. The VMAF, caption and web ones remain conventions.

The full referential

Profiles and weights

NARTIMLIFARTMOTTXTSAFWEBAUDCAPRENLIC
promo Promo or product launch3323332·2233
presentation Presentation video (company, product, project)3213232·3323
explainer Explainer or educational video3212232·3322
social Vertical short for social media3322232·2322
film Narrative animated short3333212·3122
logo Logo animation or ident (2 to 8 s)1213312·1·32
web Animated web page or UI11133233···2

Default thresholds

loudness_lufs-14
loudness_tolerance_lu1
true_peak_dbtp-1
freeze_s1
hero_min_px170
dead_air_s3
motion_floor0.4
flashes_per_s3
flash_delta0.1
duration_tolerance0.1
vmaf_min93
caption_offset_ms100
caption_cps_max17
caption_coverage_min0.98
caption_lines_max2
text_min_s1.2
text_words_per_s3
web_smooth_frames_min0.95
web_cls_max0.1
hardcoded_motion_max3
ai_tells_max0
fonts_max2
black_frames_max_s0.1
silence_edge_max_s0.5
still_per_30s_max1
end_card_s2
sync_tolerance_ms45

NAR · Brief and narrative

One goal, one audience, a structure that holds and a script without AI phrasing.

Build rules

  • Write the goal, the audience and the expected action in BRIEF.md before any shot.
  • Structure: hook, development, payoff (or call to action). In film: the character wants something small, tries, something unexpected happens, it looks at the camera.
  • Every storyboard beat has a duration and a single intent, written at the end of the line.
  • Key information must be understood with the sound off: it is also on screen.
IDCheckSeverityMethodHow
NAR-01A written goal and audience, served by every scenemajorauditorBRIEF.md states goal, audience and expected action; every beat in storyboard.md maps to it.
NAR-02Complete structure: hook, development, payoffmajorauditorContact sheet and storyboard: the hook lands within the first 2 seconds (promo, social), the end resolves (CTA, punchline or look at camera).
NAR-03Every beat has a duration and an intentminorautomaticumd lint: storyboard.beats_missing_duration and beats_missing_intent are 0.
NAR-04Understandable with the sound offmajorauditorContact sheet without audio: the main message and the call to action are readable on screen.
NAR-05Script, on-screen text and voice-over without AI phrasingminorautomaticumd lint: slop.count is 0 in BRIEF.md, storyboard.md, the script and captions.

TIM · Rhythm and timing

No dead air, regular events, a duration that fits the format.

Build rules

  • Something new happens about every 2 seconds; never more than 3 seconds without meaningful motion.
  • Target duration set in the brief (social 15–60 s, promo 30–90 s, logo 2–8 s) and met within ±10%.
  • Key shots hold long enough to be read; no shot under 0.5 s unless a deliberate rapid montage.
  • With music: cut on the beats.
IDCheckSeverityMethodHow
TIM-01No dead air longer than 3 smajorautomaticumd analyze: dead_air has no segment longer than thresholds.dead_air_s (except intended holds noted in the storyboard).
TIM-02Something new about every 2 smajorauditorumd analyze motion timeline and contact sheet: regular peaks, no long flat stretch.
TIM-03Cuts and accents land on the musicminorauditorCompare scenes (umd analyze) with beats (beat_this or librosa if installed, otherwise listening): 2 frames apart at most.
TIM-04Duration matches the brief and the platformmajorautomaticumd analyze: probe.duration within ±thresholds.duration_tolerance of project.json duration_s.
TIM-05Shots long enough to be readminorauditorumd analyze scenes: no shot under 0.5 s outside a deliberate montage; text shots long enough (see TXT-01).
TIM-06Cuts land on motion, never between two parked shotsmajorautomaticumd analyze: seams.parked = 0 (mean motion below motion_floor in the 0.25 s before AND after a cut).

LIF · Life and density

Nothing is fully frozen, scenes vary, motions overlap.

Build rules

  • Nothing is ever fully still, even on the last shot: breathing, blinking, living light or particles.
  • Vary framing, composition and rhythm from scene to scene; never the same layout twice.
  • Characters: eyes react 6 to 10 frames before the body.
  • Offset elements (stagger, overlapping action): they never all move at once.
IDCheckSeverityMethodHow
LIF-01No frozen picture over 1 s, last shot includedmajorautomaticumd analyze: freezes has no segment longer than thresholds.freeze_s.
LIF-02Visual variety between scenesmajorauditorContact sheet: no two scenes with the same composition, framing and entrance.
LIF-03Eyes lead the body, breathing and blinksminorauditorFrames around a reaction (umd frames --at): gaze 6 to 10 frames before the body; blinks present.
LIF-04Offset motions, no mechanical unisonminorauditorCode (stagger, delays) and successive frames: elements of a group start and end at different times.
LIF-05Under 1 s of near-still picture per 30 s, end card excludedmajorautomaticumd analyze: stillness.per_30s ≤ thresholds.still_per_30s_max (0.5 s buckets below motion_floor, the last end_card_s seconds excluded).

ART · Art direction

A look validated on stills before animating, faithful to the brief, without an AI signature.

Build rules

  • Render key stills (umd still) and compare them with the reference before animating; correct for up to three rounds.
  • Colours and type come from the brief and motion-tokens.json; at most two font families.
  • No default purple gradient, glass everywhere, emoji as icons, generic 3D blobs or centred template layouts.
  • Respect the format's safe areas (title-safe 90%, platform UI zones in 9:16).
  • Logos and icons as vectors; no blurry upscaled asset.
IDCheckSeverityMethodHow
ART-01Key stills validated before animationblockerautomaticumd lint: stills.count ≥ 1 per scene in .motion/stills/ and storyboard.md has a dated "Stills validated" line.
ART-02Palette and type from the brief respectedmajorauditorumd lint (fonts.families ≤ thresholds.fonts_max, colours outside tokens) and frames: consistent with BRIEF.md.
ART-03No AI-signature visualsmajorauditorContact sheet against the list in references/craft/anti-slop.md.
ART-04Format safe areas respectedminorauditorKey frames: text and logo inside title-safe (90%) and outside the platform's UI zones (9:16).
ART-05Assets sharp at output resolutionmajorauditorFrames at 100%: logos, icons and photos sharp, no pixelation or upscale blur.
ART-06One idea, a hook and a hero moment at the target levelmajorauditorJury (agents/critic.md): concept_wow ≥ quality_target from project.json (default 8). A hook readable before 2 s, one identifiable hero moment (time), a satisfying end frame. Cite the times.
ART-07Typography finished to the target levelmajorauditorJury: design_typography ≥ quality_target. Tight tracking on large display, line breaks by meaning, no widow, one emphasis device per line, the right font loaded (no fallback). Cite the frame.
ART-08Colour and finish at the target levelmajorauditorJury: finish_texture ≥ quality_target. A palette per sequence that follows the story (colour script), motivated light, grain or dither against banding, no aliasing. Cite the frame.

MOT · Easing and choreography

Consistent durations and curves, a purpose for every motion, no AI motion tells.

Build rules

  • Durations and curves only from .motion/motion-tokens.json; no hard-coded values in components.
  • Every motion has a role: guide the eye, explain a change, give feedback, link two ideas.
  • Entrances ease-out, exits ease-in, on-screen moves ease-in-out; never linear on a spatial move.
  • One focal motion at a time; the others follow, offset.
  • Ban AI tells: pulsing dots, blur on every entrance, bouncy springs everywhere, everything fading up 20 px, infinite floating.
  • On the web, animate only transform and opacity; never transition: all.
IDCheckSeverityMethodHow
MOT-01Durations and curves come from motion tokensmajorautomaticumd lint: hardcoded_motion.count ≤ thresholds.hardcoded_motion_max outside the token file.
MOT-02No AI motion tellsmajorauditorumd lint (ai_tells) then successive frames: no infinite pulsing, systematic blur-in, springs everywhere or uniform fade-up.
MOT-03Every motion has a purposemajorauditorstoryboard.md: every noted animation has a role; no purely decorative looping animation.
MOT-04Easing matches the physics of the motionminorauditorumd lint (linear_moves) and code: entrances ease-out, exits ease-in, no linear on moves.
MOT-05One focal motion at a timeminorauditorSuccessive frames of a transition: one element leads, the others follow offset.
MOT-06Web: only transform and opacity, never transition: allmajorautomaticumd lint: layout_props.count and transition_all.count are 0.

TXT · On-screen text

Long enough to read, contrasted, never clipped or overlapping.

Build rules

  • Text display time: at least max(1.2 s, words ÷ 3 + 0.5 s).
  • Contrast ≥ 4.5:1 (≥ 3:1 for large text); over moving backgrounds add a scrim or stroke.
  • Minimum body text size: about 4% of frame height in video.
  • No overlap or overflow; everything stays inside title-safe.
IDCheckSeverityMethodHow
TXT-01Every text stays on screen long enough to be readblockerautomaticumd lint: storyboard.text_too_short is 0 (rule max(text_min_s, words ÷ text_words_per_s + 0.5)), confirmed with umd frames.
TXT-02Text contrasted, even over moving backgroundsmajorauditorFrames where text crosses a busy background: scrim, stroke or calm area; estimated contrast ≥ 4.5:1.
TXT-03No clipped, overlapping or out-of-zone textmajorauditorKey frames of each card: full text, no overlap, inside title-safe.
TXT-04Text size large enough for the formatminorauditorFrame at 100%: body text height ≥ 4% of frame height (more in 9:16).

SAF · Motion safety

No dangerous flashes, no nauseating motion without an alternative.

Build rules

  • Never more than 3 flashes per second (WCAG 2.3.1), including white cuts and strobes.
  • Limit fast zooms, spins and large parallax; on the web, turn them off with prefers-reduced-motion.
IDCheckSeverityMethodHow
SAF-01At most 3 flashes per secondblockerautomaticumd analyze: flashes.max_per_s ≤ thresholds.flashes_per_s (full-frame measure, approximation of WCAG 2.3.1).
SAF-02No aggressive vestibular motionminorauditorSuccessive frames: no fast, repeated full-screen zoom or spin, no long large parallax.

WEB · Animated web pages

Smooth, stable, respectful of prefers-reduced-motion and native scrolling.

Build rules

  • Every non-essential animation stops or shrinks with prefers-reduced-motion: reduce.
  • Budget: 95% of frames on time on a 4× throttled CPU; animate transform and opacity.
  • No animation shifts the layout (CLS < 0.1).
  • No scroll-jacking: scrolling stays native, with keyboard and trackpad.
  • Interactions: visible feedback within 100 ms, UI durations of 100 to 300 ms.
IDCheckSeverityMethodHow
WEB-01prefers-reduced-motion honouredblockerautomaticumd webperf: reduced_motion.respected is true (animations stopped or strongly reduced in reduce mode).
WEB-02Smooth animations, no dropped framesmajorautomaticumd webperf: smooth_ratio ≥ thresholds.web_smooth_frames_min with a 4× throttled CPU.
WEB-03No layout shift caused by animationmajorautomaticumd webperf: cls < thresholds.web_cls_max.
WEB-04Responsive, consistent interactionsmajorauditorHover, focus, click: feedback within 100 ms, same durations and curves everywhere.
WEB-05No scroll-jacking, keyboard navigation intactmajorauditorScroll with wheel, keyboard (Space, arrows) and trackpad: native speed, sections reachable by focus.
WEB-06will-change used sparinglyminorautomaticumd lint: will_change.count ≤ 5 permanent declarations.

AUD · Audio

Compliant loudness, a clear voice, music ducking under the voice, sounds in sync.

Build rules

  • Mix with umd mix (automatic ducking), then normalise with umd normalize (−14 LUFS, true peak ≤ −1 dBTP by default).
  • Sound lands 0 to 1 frame after the image it underlines, never before.
  • Fade in and out; no silence longer than 0.5 s at the start.
  • Voice: humanised script, brand names pronounced correctly, 140 to 170 words per minute.
  • Export 48 kHz stereo, AAC ≥ 192 kb/s (or Opus in WebM).
IDCheckSeverityMethodHow
AUD-01Compliant loudness and true peak under the ceilingblockerautomaticumd analyze: loudness.integrated within ±thresholds.loudness_tolerance_lu of thresholds.loudness_lufs and loudness.true_peak ≤ thresholds.true_peak_dbtp.
AUD-02Music ducks under the voicemajorauditorMix command (umd mix or sidechaincompress) in render.json or the logs, and listening to a spoken passage: the voice clearly dominates.
AUD-03Sound effects in sync, 0 to 1 frame after the imageminorauditorWith a "## Sound cues" section in the storyboard: umd sync measures each sound's attack against its event (±sync_tolerance_ms) and decides on its own. Without cues: watch the cuts and impacts; the sound lands 0 to 1 frame after the picture.
AUD-04No leading silence or abrupt cutmajorautomaticumd analyze: silence.leading_s and silence.trailing_s ≤ thresholds.silence_edge_max_s, and audio_end.abrupt is false.
AUD-05Clear, natural voice, names pronounced rightmajorauditorListening and transcript: no robotic artefacts, 140–170 words/min, brand names correct.
AUD-06Delivery audio formatminorautomaticumd analyze: probe.audio at 48 kHz, 2 channels, AAC ≥ 192 kb/s or Opus.
AUD-07Layered sound design at the target levelmajorauditorJury: sound_sync ≥ quality_target. At hero moments several layers (riser, impact, sub, detail), the music carved under the voice, silence used as an accent at least once; each effect on its picture (umd sync).

CAP · Captions

Every word present, on time, readable and spelled right.

Build rules

  • Known script: forced alignment (ctc-forced-aligner). Otherwise: word timestamps (faster-whisper, WhisperX).
  • Generate with umd captions, check with umd captions-check.
  • Two lines at most, 17 characters per second at most, inside the safe area, never hiding the key visual.
IDCheckSeverityMethodHow
CAP-01Every word, in syncblockerautomaticumd captions-check: coverage ≥ thresholds.caption_coverage_min and max_offset_ms ≤ thresholds.caption_offset_ms.
CAP-02Readable, well-placed captionsmajorauditorFrames with captions: two lines at most, strong contrast, inside the safe area, not hiding the subject.
CAP-03Reasonable reading speedminorautomaticumd captions-check: max_cps ≤ thresholds.caption_cps_max and max_lines ≤ thresholds.caption_lines_max.
CAP-04Names and brands spelled exactlyminorauditorCompare the caption file with the script and BRIEF.md (proper names, brands, figures).

REN · Render and encoding

A reproducible render, in the right format, with no visible loss or artefact.

Build rules

  • Time is driven by the frame number (umd capture, useCurrentFrame, timeline.seek); never by the clock.
  • Local fonts and assets (Fontsource): no network loading during render.
  • High-quality master, then delivery encode H.264 High yuv420p, constant frame rate, faststart.
  • Gradients: add grain or dithering against banding.
IDCheckSeverityMethodHow
REN-01Deterministic render: two identical rendersblockerautomaticumd compare on two renders (umd render --twice): identical is true, or ssim ≥ 0.999 if the encoder adds noise.
REN-02Output format matches the briefmajorautomaticumd analyze: probe.width, height and fps equal the brief, constant frame rate, yuv420p for MP4.
REN-03Delivered encode faithful to the mastermajorautomaticumd vmaf: vmaf ≥ thresholds.vmaf_min.
REN-04Local fonts and assetsmajorautomaticumd lint: remote_assets.count is 0 (no Google Fonts, image or video CDN loaded at render).
REN-05No unintended black framesminorautomaticumd analyze: black has no segment longer than thresholds.black_frames_max_s outside planned fades; the first frame is not blank.
REN-06No artefacts: banding, aliasing, flickermajorauditorFrames at 100% on gradients, thin lines and moving text.

LIC · Licences and rights

Every asset, model and dependency is allowed in the deliverable.

Build rules

  • Record every asset in .motion/assets.lock.json with its source and licence as soon as it enters the project.
  • Commercial deliverable: no non-commercial weights, no Tencent model in the EU, no embedded AGPL, no unlicensed asset.
  • Remotion: free up to 3 employees, company licence above; declare it in project.json.
  • Describe references in your own words; never have someone else's video copied.
IDCheckSeverityMethodHow
LIC-01No asset, model or dependency forbidden for commercial useblockerautomaticumd licenses: violations is 0 for the project.json policy.
LIC-02Remotion licence fits the teamblockerautomaticumd licenses: remotion.ok is true (project.json license_policy.remotion is individual, small-company, non-profit or company-license).
LIC-03Every asset is inventoried with its licencemajorautomaticumd licenses: unlisted_assets is 0 and every assets.lock.json entry has source and license.
LIC-04Required attributions presentminorauditorAssets marked attribution_required: credits in the video, the description or deliverables/credits.txt.
LIC-05No third-party trademark, likeness or work without rightsmajorauditorContact sheet and assets: third-party logos, real faces, music and clips under rights are justified; references described, not copied.