film-audit: no film goes out without these checks
Where the kit lives: run every command in this skill from the
reels-makerfolder (the clone of github.com/thativanng/reels-maker that holdstemplate/andtools/). If the project has none, set it up first by following that repo's SETUP.md.
The rule: a film goes to the person only when (1) the collision pass says NO COLLISIONS, (2) every "is X over a face" worry has a pixel number, and (3) an independent auditor has signed off with no MUST-FIX open. A 1-fps look by the person who built it is a sketch check, not a gate. A fix moves other things (moving a speech bubble once pushed it off the frame), so every fix round gets a narrow re-check of the windows it touched.
Gate 1 · Collisions in 3D (node tools/collide.mjs)
- The page exposes
window.collide(t). It compares the bounding boxes of every mesh in AUD_M (things that move) against AUD_S (things that stand) and against each other, after shrinking each box by 0.03. - Register every new mover and solid, or the check cannot see it. Thrown boxes, carried cups, passing cubes and floating viruses all count as movers.
- Contacts that are meant to happen (a cup in a hand) are excluded by name, in
HELD. - Meshes under 0.12 units tall (floor decals, road markings, thin plates) are skipped, so a flat thing can't raise a false alarm. A real thin mover needs its own check.
- Run it at 40 fps (
STEP=.025, the default). At 10 fps it missed two one-frame contacts: thrown boxes through two people's heads. - Output is one line per pair:
from–to s A × B depth (frames). Ship only onNO COLLISIONS.
Gate 2 · Pixels on screen (node tools/probe.mjs)
Some defects never touch in 3D. A bottle cap 3 m behind someone's head can still look like it's growing out of their hair. Measure the screen:
node tools/probe.mjs "4.4,4.6,4.8" "D.CUPS[0]" "head" # overlap of a cup and the hero's head, in pixels
node tools/probe.mjs "24.5,26" "head" "pill" # is the head behind the subtitle?
node tools/probe.mjs "3.0,3.5" "D.GUESTS[1].v.root" # one rectangle: is this person inside the frame?
- Read
overlap: [x, y](both > 0 means on top of each other),gapY, andinside(A sits wholly within B). - On any page, 2D included:
sel:<css selector>is what an element actually paints (its letters, measured line by line, plus any background, border or image) andsafeis the platform's keep-clear core (fromwindow.FILM.safe). Every word on screen must beinside: trueagainstsafeat every beat:node tools/probe.mjs --page reels/<name>/page.html --format 9:16 "2,6.4,10.4" "sel:.title,.line,.kicker,.handle,.cap" "safe" - To try a camera key without editing the file, pass
PRE(it runs before each time):PRE="window._CK.find(k => k[0] === 23.8)[1] = window._dbg.A(72.2, 10, 31, 72, 5.2, 1.5)" node tools/probe.mjs "25,28" "head". - Boxes are conservative (a bounding box is bigger than the shape), so a few px of overlap may be clear in reality. The auditor's crop decides.
Check every one of these with a number before you render:
- Every word, caption and logo inside the platform's keep-clear zone (
safe, from template/formats.json). On organic 9:16 reels that is the middle band (the app covers the bottom quarter and the right-hand button rail); on a paid reel, everything above the bottom 35% - Anything near a face: caps, screens behind the head (the halo), cubes passing, props at the mouth
- The hero against the subtitle pill during camera moves
- The speech bubble against the frame edge and nearby props
- People and vehicles against the frame edge (≥24 px is safe)
- Flying things (thrown boxes, coins, virus clusters) against every head they pass
Gate 3 · The independent auditor
Start a FRESH agent (never the builder, never one that saw the build) with references/auditor-brief.md.
- It reads the rendered MP4, not the live page:
ffmpeg -i out/film.mp4 -vf fps=2 …, then timestamped sheets (tools/sheet.py). - ≥2 fps for the whole film, ≥4 fps on every changed window, frame by frame (30 fps) at contact points such as a pick-up or a hand-off.
- It answers per item: FIXED / NOT FIXED / REGRESSED / NEW, ranked MUST-FIX / NICE-TO-FIX, then one line:
SIGN-OFForNOT. - A re-check after fixes is narrow: only the windows the fixes touched, plus a short regression look. It can be cheaper to start a fresh agent than to resume one that carries its whole history.
What auditors kept finding (look for these first)
- Something touching or behind a head: a bottle cap in the hair, map pins behind the head, a monitor glowing behind the head, a cube across a chin
- Things passing through things: trucks through buildings and through each other, a van parked under a desk
- Logic: a truck docking nose-first, the second truck overtaking the first, a cup left on a table's edge that should fall
- People: two people standing so close their heads fuse into one figure; someone half outside the frame
- Motion: a one-frame jump (teleport), things dropping through the floor in 0.1 s, the hero vanishing between scenes
- Words: text inside a zone the platform's buttons cover, Chinese broken in the middle of a word, a banner out of step with its scene, mixed UK/US spelling, a number nobody can defend, the subtitle covering the hero
- Sound: whooshes, a cue that's inaudible under the music, cues drifting after an inserted beat