Review Loop (HyperFrames Version)
You cannot watch videos, but you can look at frames. Never report a video as complete without having seen the contact sheet from the current version.
Adapted from whaleyxbt/claude-motion's
review-loopskill (MIT, seeLICENSEin the same folder). The originalnpm run …commands have been replaced with kinocut MCP's HyperFrames tools and thescripts/sheet.pyin this folder. Sections marked "(New in this version)" are not part of the original.
The SHEET below refers to python "<this skill folder>/scripts/sheet.py" (e.g., ~/.claude/skills/review-loop/scripts/sheet.py). All paths must be absolute.
The Loop
- Run machine checks first (New in this version): Execute
hyperframes checkin the project folder. It runs lint, runtime, layout overflow, motion, and contrast checks in one pass (the officialvalidate/inspectcommands are deprecated; usecheckinstead). Fix any errors before proceeding. See the officialhyperframes-cliskill for details.- Mask reveals during entrance will inevitably report
container_overflow—this is intentional. Adddata-layout-allow-overflowto the mask container. But iftext_box_overflowpersists after settling, the container is too short and will clip text (especially Chinese and superscripts); increase the container height.
- Mask reveals during entrance will inevitably report
- Draft:
hyperframes_renderwithquality: "draft",output_pathset to<project>/out/draft.mp4. - Contact sheet:
SHEET --video <project>/out/draft.mp4 --timeline <project>/timeline.js --out <project>/out/sheetsCaptures one frame 0.3 seconds after each beat (once motion has settled), arranges them in 4×2 grids asout/sheets/beats-N.png, each labeled with beat name and time. Each frame defaults to 360 px wide—the actual width on mobile dynamic islands. - Use Read to open each sheet and inspect every cell against the checklist below.
- Zoom in on suspicious areas:
- Scan a transition:
SHEET --video … --from 3 --to 5 --every 0.2 --name scrub - Look at specific moments:
SHEET --video … --at 3.7,3.75,3.8 --name exact - View a single frame at full resolution:
hyperframes_still, setframeto the frame number (seconds × fps) - To avoid re-rendering, use
hyperframes_snapshotwithatto capture directly from the composition, then combine withSHEET --images … --labels ….
- Scan a transition:
- Fix issues and go back to step 0. Only stop when a full pass finds no problems.
- Final version:
hyperframes_renderwithquality: "high"to produce the final video, then run step 2 on it, followed by audio checks (see below).
Checklist
Composition
- Each frame has a single focal point. When two elements compete, one must wait.
- No unintentional collisions or overlaps, especially during transitions where exit and entry elements share the same space.
- Safe area: Important content should not be closer than ~60 px from the edges.
- Frame 0 shows the actual image, not black (it will be the thumbnail on social platforms).
Text
- Not clipped by masks, containers, or frame edges (unless intentional).
- When shrunk to mobile width (sheet cells), key information remains readable.
- Text is not moving when it should be read.
- (New in this version) Chinese: no typos; all characters are in Traditional Chinese script (no Simplified Chinese mixed in); punctuation uses full-width forms; no missing font glyphs (rendered as boxes or clearly different fonts).
Rhythm
- Each state that needs to be read stays on screen long enough (see section 4 of
motion-design). If text is still moving in the middle frames of a hold, the hold is too short. - Scenes overlap seamlessly, never cutting to a blank frame.
- Exits are faster than entrances.
Consistency
- Only use colors from the
:rootpalette; accent colors must highlight the key point in that frame. - The same element looks identical in every scene it appears.
Audio (only if there is sound)
- Waveform: Use
video_audio_waveformto check if peaks align with beats in theTL. - Loudness (New in this version, replaces the original
npm run wave):
ffmpeg -hide_banner -nostats -i <final video> -af ebur128=peak=true -f null -
Check the summary forIntegrated loudnessandTrue peak. Target: −14 LUFS ±1, true peak ≤ −1 dBFS. - For Chinese voiceover accent and emotion, the user must listen with their ears—do not substitute scores (New in this version).
Reporting
When finished, clearly state: what was checked, what was fixed, and which sheet shows the result. Never claim a fix was made without re-exporting and personally inspecting the result.