Quality gates
The ladder of checks a video climbs before it ships, from schema validation to a vision gate that scores the rendered frames.
A static engine can produce a technically correct, visually generic video. The gates are the system that fights that. None of them need to run for a video to render, but together they are how you catch a broken frame, a repeated design, or a slop tell before you ship.
They form a ladder. Early gates are cheap and mechanical; later gates look at the rendered pixels.
validate
make validate D=formats/scene/my.jsonSchema conformance, no em-dashes in on-screen copy, inline theme keys resolved, and no un-expanded blocks or comps. The same validator runs at boot before the first frame, so a scene that fails here never renders.
critique
make critique D=formats/scene/my.jsonThe value gate. It flags beats that occupy time without earning it: placeholder words, unbacked claims (copy that says "22 shader stings" with no shader in the scene), static lists that should be animated, stings too fast to perceive, and thin or lonely beats. The test for every frame is simple: if you cut it, what does the viewer lose?
slop
make slop D=formats/scene/my.jsonAn anti-slop detector. It renders the real DOM at a frame and runs a 41-rule check for the usual tells: overused fonts, purple and blue gradients, cards inside cards, centered-by-default layouts. No language model, just rules. Reach past anything it flags.
audit
make audit M=sceneLayout and accessibility: overlap, clipped text, overflow, safe-zone violations, and WCAG contrast on every layer marked critical. It writes an overlay to /tmp/audit/<fmt>.png so you can see exactly what it caught.
beats
make beats D=formats/scene/my.json VS=<brand>The first, middle, and last frame of every beat on one sheet. With VS=<brand> it stacks each beat beside its source section, which is the fidelity check that a reflected video reads as the same brand as the site.
judge
make judge D=formats/scene/my.json VS=<brand>The vision gate. It renders the key frames of every beat into one labeled sheet and writes a rubric: the brand's house style plus seven craft dimensions (readability, hierarchy, composition, brand fidelity, asset fidelity, produced-not-generated, and value). Then a vision model reads the sheet against the rubric and returns a pass or fix verdict. It catches what the mechanical gates cannot see: a mis-anchored underline, a muddy frame, a lookalike asset. A pass means every frame clears every dimension.
ledger
make ledger D=formats/scene/my.json # check
make ledger-add D=formats/scene/my.json # log after shippingCross-video sameness memory. It fails if a design repeats one you have already shipped. Fix by changing at least two of the cut family, the beat structure, or the layout archetype. After the video is approved, ledger-add records it so future videos are checked against it.
Determinism and refactor gates
Three checks guard the engine itself rather than a single video:
make proberenders frames in scrambled order and proves they are byte-identical. See Determinism.make snapdiffs a per-frame DOM signature so a refactor can prove it did not change the picture.make lib-testruns pure-JS assertions on the motion primitives with no browser.make motionchecks the animation-over-time contract: the final frame holds, reveals are monotonic, payoffs settle before they exit, counters are sane, and typing completes.
The order to run them
While authoring: validate, then slop and beats to catch problems early. Before rendering the final: critique. After rendering: audit, then judge for the real quality read, then ledger to make sure it is not a repeat. make review bundles lib-test, audit, and a master sheet into one quick health snapshot.