| name | storyboard-review |
| description | Assemble generated keyframes into a contact sheet in running order and present them for approval BEFORE any video is generated. This is the production's hard cost gate. Trigger - /storyboard-review, after keyframe-generate and before clip-render. Always run this; never generate clips against unapproved keyframes. |
Storyboard Review — the hard gate
This is the single most valuable skill in the template. It stands between a 70-credit mistake and a 1,000-credit one.
Why this gate exists
A keyframe costs 2 credits. A 1080p clip costs 45 — 22× more. On a 24-shot film:
| Keyframes | Clips |
|---|
| Cost to redo the whole film | ~48 credits | ~1,080 credits |
Every look, casting, composition, lighting and brand decision is visible in a still. Settle all of them on stills.
Instructions
1. Verify every keyframe exists
Read 00_Production_Management/shot_tracker.json. Every shot in every act must have keyframe.file populated. Missing keyframes block the gate — do not present a partial sheet as if it were complete.
2. Build contact sheets in FINAL RUNNING ORDER
Not generation order. The client must read the film's argument, not your job queue.
cd 02_PreProduction/keyframes
i=0; for f in $ORDER; do i=$((i+1)); cp "$f.png" "$(printf 'seq_%02d.png' $i)"; done
ffmpeg -y -i "seq_%02d.png" \
-vf "scale=640:-1,tile=3x4:margin=12:padding=8:color=0x101010" \
-frames:v 1 ../storyboard/SHEET_A.png
Twelve frames per sheet (3×4) is the readable maximum. Split longer films across sheets.
3. Inspect before presenting
Read every sheet yourself first and check for:
- Cast consistency — does the recurring character read as the same person in every shot?
- Cast appropriateness — does the cast match the client's actual audience and region? (A generic Western cast in a film for a regional institution is a real failure mode — it happened on Laila v2 and needed a reshoot.)
- Brand fidelity — any logo or crest the model drew is an approximation. Flag it and plan a post composite.
- Stray text — models render garbled lettering on screens and signage. Flag every instance.
- Aspect consistency — a letterboxed frame among full-bleed frames breaks the cut.
- Tonal continuity — grade drift across shots.
Report what you find. Do not present a sheet you have not looked at and claim it passes.
4. Present and stop
Deliver the sheets with a numbered legend mapping each tile to its shot ID and intent. Then stop and wait. State plainly that no video has been generated and none will be until approval.
5. On approval
Set in shot_tracker.json:
"keyframes_approved": { "status": "approved", "approved_by": "<name>", "date": "<ISO>" }
Only then may clip-render run.
6. On rejection
Regenerate only the rejected keyframes — 2 credits each. Rebuild the sheet. Re-present. Iterate here freely; it is the cheapest place in the entire production to iterate.
Output
{
"sheets": ["SHEET_A.png", "SHEET_B.png"],
"shots_total": 24,
"keyframes_present": 24,
"issues_flagged": ["S004 cast not regionally appropriate", "S016 crest approximated — composite in post"],
"gate_status": "awaiting_approval",
"clips_generated": 0,
"credits_at_risk_if_skipped": 1080
}