| name | film-setup |
| description | Initialise a new film production from an idea — refresh live pricing, run the intake interview including budget and quality tier, produce a costed plan, and scaffold only after approval. Trigger - /film-setup, once at the start of a new film. |
Film Setup
Turn an idea into a costed, structured production. Refresh pricing, ask, propose, confirm, then write. Never scaffold or generate before the user has seen the plan and the price.
STEP 0 — Refresh pricing FIRST
Before asking anything, run pricing-refresh.
node tools/refresh-cost-matrix.js
Costs nothing, takes a minute. Every number you are about to quote depends on it. Report anything that changed since the last project — a moved price changes the recommendation.
You cannot run the intake honestly without current numbers, because the budget question is a pricing question.
STEP 1 — The interview, in ONE message
Ask everything at once. Never interrogate across turns.
Creative
- The promise — in one sentence, what must the viewer believe afterwards?
- Format — explainer · ad · brand film · documentary · social
- Audience and region — be specific. This drives casting; getting it wrong means reshoots.
- Runtime — 30s · 60s · 2min · custom
- Aspect — 16:9 · 9:16 · both
- Languages — VO language(s), and on-screen text language
- Assets they already have — logos, product screenshots, real photography, an existing character or avatar
Commercial — ask these with live numbers attached
-
Quality tier. Present the refreshed prices as the actual choice, not an abstraction:
| Tier | Approach | 2-min film |
|---|
| Draft | Cheapest models, 480–720p, internal review only | ~175 cr |
| Standard | Cheap identity model + cheapest 1080p elsewhere | ~315 cr |
| Premium | Native 1080p on every shot showing a face | ~495 cr |
| Flagship | Top-tier model throughout | ~1,155 cr |
-
Budget ceiling in credits — and confirm the balance covers it (higgsfield account status)
-
Identity requirement — does a recurring, recognisable person appear across many shots? This single answer moves the budget more than anything else, because identity-preserving models cost 2.5–9 cr/s against 1.0 for the rest.
-
Delivery resolution — 720p is materially cheaper. If 1080p is required, does it need to be native, or is an upscale from 720p acceptable? Upscaling the cheap identity model is usually the best value in the whole matrix.
-
Music — there is no music model. Licensing is a real external cost. Do they have a licence, or should it go in the quote?
STEP 2 — Derive the spec
- Runtime → shot count, using the chosen model's clip length (5s or 8s)
- Script word count: ~1.5 Arabic words/sec, ~2.2 English words/sec — starting estimates only;
ffprobe is the truth
- Identify the recurring character and the signature visual device now — they drive every later phase
- Classify every shot as identity-critical / human / environment / abstract → this is what
model-select prices
STEP 3 — Present the costed plan
Show the recommendation and the alternative not taken, so the choice is visible:
24 shots · 2:00 · 16:9 · AR + EN · Standard tier
keyframes 24 × Nano Banana Pro 2k 2 = 48
identity (8) Seedance 2.0 Mini 720p 12.5 = 100
other (16) Kling 3.0 Turbo 1080p 10 = 160
voiceover ~12 auditions 0.15 = 2
post local ffmpeg = 0
────────────────────────────────────────────────────────
TOTAL ≈ 310 credits
+ external: music licence
Flagship alternative (Seedance 1080p throughout) ≈ 1,155
Saving ≈ 845 (73%)
State the balance and confirm it covers the plan with headroom for reshoots (budget ~10%).
STEP 4 — Confirm, then commit
Only after explicit approval, copy production-template/ into the working directory and populate shot_tracker.json with the spec, acts, shots, model plan and budget.
Nothing is written and nothing is generated before this point.
Output
{
"film_code": "F001", "shots": 24, "runtime": 120, "tier": "standard",
"pricing_refreshed_on": "2026-08-07",
"estimated_credits": 310, "flagship_alternative": 1155, "saving": 845,
"external_costs": ["music licence"],
"gates_pending": ["script_locked", "keyframes_approved", "voice_approved"],
"scaffolded": true
}