Comfy Director
Story first, pictures second. Multi-shot AI films fail in the edit, not the
render: beats that don't cause each other read as a montage wearing a story's
clothes, no matter how good each clip looks.
REQUIRED BACKGROUND: the comfy skill (CLI mechanics + the recipe path —
apply/capture/foreach — for reusable multi-stage graphs). On any failed job,
comfy-debug.
Order of operations
- Concept — one idea a stranger can retell.
- Screenplay — before touching the pipeline. Deliver it to the user first.
- Shot list — each scene mapped to a continuity strategy.
- Audio design — against the screenplay's emotional beats, not after picture.
- Produce → conform → QC.
Skipping 2 and jumping to renders is the #1 cause of killed cuts.
Screenplay rules
- One protagonist the camera can follow. Recognizable in every shot.
- Causality test: every cut answers "and BECAUSE of that…" — never
"and then, somewhere else…". If a beat can be reordered without breaking
anything, it isn't a story yet.
- Stranger test: someone with zero context must retell the plot in two
sentences ("X wanted A, B stopped them, they did C, so D").
- Beats carry timings that sum to the target runtime.
Concept rules
- The brand/product is felt, not name-checked: argue its philosophy;
in-jokes and community lore quoted on screen read as fan-service.
- A technique the client mentions ("style transfer", a model name) is a
spark, not a mandate — use it only if the idea needs it. Building the
film around a technique is the tell of a vendor, not a director.
- Weirdness must compound: surprising subject AND object AND setting.
One weird element in a normal frame is decoration.
Prompting shots
- Photoreal shots: live-action cinematographer / film-stock language ONLY.
One illustrator/anime/comics name in a photoreal prompt poisons it.
Illustrated references belong only in deliberately stylized shots.
- Motion prompts describe HOW the scene moves, not what's in it (see
comfy
skill video gotchas — t2v/i2v model traps, SaveVideo, fps wiring).
Continuity toolkit
Pick per shot, in rough order of strength:
| Strategy |
Use for |
| Character/location reference image carried into each shot's i2v graph |
protagonist identity |
| Same identity, new framings via reference-image edit (one hero → N angles) |
recognizable face across cuts |
| Keyframe of shot N seeds shot N+1 (image-referenced restyle or end-frame) |
contiguous action |
| Talking head fed the EXACT audio that plays (KlingAvatar), cut between angles of the same lip-synced head — never B-roll over the VO |
dialogue that must feel real |
| Repeated wardrobe/light/lens lines verbatim in every prompt |
cheap baseline glue |
If a shot can't hold continuity, rewrite the screenplay so it doesn't
need that shot — don't ship the break.
Audio
- Score = short designed cues joined at story pivots; one long generation
will not follow a dynamic arc (it inverts exactly where you need the peak).
- Place VO by math: stem duration vs beat window, before mixing.
- Duck score under VO; loudness-normalize the final mix (~-14 LUFS).
- Dialogue must lip-sync by construction. Drive the mouth from the exact
audio that plays (KlingAvatar
sound_file) and cut between angles of the same
lip-synced head — B-roll over a continuous VO reads as a montage, and
i2v-invented mouths drift. "No lip-sync / doesn't feel real" is the classic
rejection. (Generate audio in-graph — cloud LoadAudio can't see uploads; see
comfy audio gotchas.)
- Lock voice & casting by EAR before the expensive renders. Voice/accent is
subjective and unreadable from a waveform — render a few cheap candidate TTS
takes of one line, have the user pick, THEN bake the winner into the costly,
transient_auth-prone avatar/lip-sync shots. Re-rendering all of them on a
rejected voice is the avoidable burn. Same logic for the protagonist's look:
approve the hero still before generating every shot from it.
- Verify the mix by measurement, not faith. You can't hear the render —
ffmpeg volumedetect each section: a "dead air" ending or a buried line shows
up as a window near -91 dB. Confirm every beat is present at level before
declaring it done.
Production ops
Append EVERY submit — shots, keyframes, audio stems, resubmits — to
job_ids.txt (<job_name> <prompt_id>) at submit time. Append-only:
a resubmit gets a new line (shot_s3_resubmit <id>), never an overwrite,
so dead prompt_ids keep their shot identity.
Keep LOG.md at the project root: an append-only event log, written at
event time, not session end — one line per submit/resubmit (+ failure
code), per QC verdict (+ re-roll reason), and per decision that invalidates
earlier work: recasts, prompt changes, which reference image or stem is now
canonical. Frame-by-frame findings live in qc/QC_LOG.md; LOG.md indexes them.
17:36 ERROR shot_s3 transient_auth -> RESUBMIT 27dd45b4 (same workflow, no re-login)
17:44 QC shot_s2 FAIL background-crawl -> re-roll (same kf, new seed); recut beat if 2nd fails
17:50 DECISION recast protagonist -> ref_ray.png canonical; vo2, vo6 stale, re-gen
Recovery contract: a successor agent with zero memory must resume from
disk alone: LOG.md (what happened, why) → job_ids.txt (which jobs) →
comfy jobs status (their states). A decision not in LOG.md dies with the
session — completed-but-stale jobs (an old casting's VO stems) otherwise
look identical to good ones.
ffprobe every downloaded clip; normalize off-spec duration/dimensions
before conform.
QC one frame from every clip against the screenplay before cutting.
Exact runtime: trim/retime per-beat in ffmpeg, don't hope.
Common mistakes (each killed a real cut)
| Mistake |
Result |
| Renders before screenplay |
"Eight handsome beats that don't cause each other" |
| Community lore on screen |
"Too direct, fan-service" |
| Client's mentioned technique as the concept |
"I said it to spark ideas" |
| No continuity plan |
Protagonist changes face every cut |
| One 40s music gen |
Arc inverts at the climax |
| B-roll over a continuous VO |
"Feels like a montage / audio doesn't match" |
| Baked the voice into N shots before the user heard it |
Re-render everything when they reject it |
| Butt-joined talking-head clips |
Voice drifts out of sync (avatar pads video past audio) |
1---2name: comfy-director3description: Use when asked to make a narrative video — an ad, brand film, short, trailer, music video, or any multi-shot clip that tells a story (not a single shot or loop). Also use when a video was rejected for "no story", "doesn't flow", "feels like a montage", or characters that change between shots.4---56# Comfy Director78Story first, pictures second. Multi-shot AI films fail in the edit, not the9render: beats that don't cause each other read as a montage wearing a story's10clothes, no matter how good each clip looks.1112**REQUIRED BACKGROUND:** the `comfy` skill (CLI mechanics + the recipe path —13`apply`/`capture`/`foreach` — for reusable multi-stage graphs). On any failed job,14`comfy-debug`.1516## Order of operations17181. **Concept** — one idea a stranger can retell.192. **Screenplay** — before touching the pipeline. Deliver it to the user first.203. **Shot list** — each scene mapped to a continuity strategy.214. **Audio design** — against the screenplay's emotional beats, not after picture.225. **Produce** → **conform** → **QC**.2324Skipping 2 and jumping to renders is the #1 cause of killed cuts.2526## Screenplay rules2728- **One protagonist** the camera can follow. Recognizable in every shot.29- **Causality test:** every cut answers "and BECAUSE of that…" — never30 "and then, somewhere else…". If a beat can be reordered without breaking31 anything, it isn't a story yet.32- **Stranger test:** someone with zero context must retell the plot in two33 sentences ("X wanted A, B stopped them, they did C, so D").34- Beats carry timings that sum to the target runtime.3536## Concept rules3738- The brand/product is **felt, not name-checked**: argue its philosophy;39 in-jokes and community lore quoted on screen read as fan-service.40- A technique the client mentions ("style transfer", a model name) is a41 **spark, not a mandate** — use it only if the idea needs it. Building the42 film around a technique is the tell of a vendor, not a director.43- Weirdness must compound: surprising subject AND object AND setting.44 One weird element in a normal frame is decoration.4546## Prompting shots4748- **Photoreal shots:** live-action cinematographer / film-stock language ONLY.49 One illustrator/anime/comics name in a photoreal prompt poisons it.50 Illustrated references belong only in deliberately stylized shots.51- Motion prompts describe HOW the scene moves, not what's in it (see `comfy`52 skill video gotchas — t2v/i2v model traps, SaveVideo, fps wiring).5354## Continuity toolkit5556Pick per shot, in rough order of strength:5758| Strategy | Use for |59|---|---|60| Character/location reference image carried into each shot's i2v graph | protagonist identity |61| Same identity, new framings via reference-image edit (one hero → N angles) | recognizable face across cuts |62| Keyframe of shot N seeds shot N+1 (image-referenced restyle or end-frame) | contiguous action |63| Talking head fed the EXACT audio that plays (KlingAvatar), cut between angles of the *same* lip-synced head — never B-roll over the VO | dialogue that must feel real |64| Repeated wardrobe/light/lens lines verbatim in every prompt | cheap baseline glue |6566If a shot can't hold continuity, **rewrite the screenplay** so it doesn't67need that shot — don't ship the break.6869## Audio7071- Score = **short designed cues joined at story pivots**; one long generation72 will not follow a dynamic arc (it inverts exactly where you need the peak).73- Place VO by math: stem duration vs beat window, before mixing.74- Duck score under VO; loudness-normalize the final mix (~-14 LUFS).75- **Dialogue must lip-sync by construction.** Drive the mouth from the exact76 audio that plays (KlingAvatar `sound_file`) and cut between *angles of the same77 lip-synced head* — B-roll over a continuous VO reads as a montage, and78 i2v-invented mouths drift. "No lip-sync / doesn't feel real" is the classic79 rejection. (Generate audio in-graph — cloud `LoadAudio` can't see uploads; see80 `comfy` audio gotchas.)81- **Lock voice & casting by EAR before the expensive renders.** Voice/accent is82 subjective and unreadable from a waveform — render a few cheap candidate TTS83 takes of one line, have the user pick, THEN bake the winner into the costly,84 `transient_auth`-prone avatar/lip-sync shots. Re-rendering all of them on a85 rejected voice is the avoidable burn. Same logic for the protagonist's look:86 approve the hero still before generating every shot from it.87- **Verify the mix by measurement, not faith.** You can't hear the render —88 `ffmpeg volumedetect` each section: a "dead air" ending or a buried line shows89 up as a window near -91 dB. Confirm every beat is present at level before90 declaring it done.9192## Production ops9394- Append EVERY submit — shots, keyframes, audio stems, resubmits — to95 `job_ids.txt` (`<job_name> <prompt_id>`) **at submit time**. Append-only:96 a resubmit gets a new line (`shot_s3_resubmit <id>`), never an overwrite,97 so dead prompt_ids keep their shot identity.98- Keep `LOG.md` at the project root: an append-only event log, written **at99 event time, not session end** — one line per submit/resubmit (+ failure100 code), per QC verdict (+ re-roll reason), and per decision that invalidates101 earlier work: recasts, prompt changes, which reference image or stem is now102 canonical. Frame-by-frame findings live in `qc/QC_LOG.md`; LOG.md indexes them.103104 ```105 17:36 ERROR shot_s3 transient_auth -> RESUBMIT 27dd45b4 (same workflow, no re-login)106 17:44 QC shot_s2 FAIL background-crawl -> re-roll (same kf, new seed); recut beat if 2nd fails107 17:50 DECISION recast protagonist -> ref_ray.png canonical; vo2, vo6 stale, re-gen108 ```109- **Recovery contract:** a successor agent with zero memory must resume from110 disk alone: `LOG.md` (what happened, why) → `job_ids.txt` (which jobs) →111 `comfy jobs status` (their states). A decision not in LOG.md dies with the112 session — completed-but-stale jobs (an old casting's VO stems) otherwise113 look identical to good ones.114- ffprobe every downloaded clip; normalize off-spec duration/dimensions115 before conform.116- QC one frame from every clip against the screenplay before cutting.117- Exact runtime: trim/retime per-beat in ffmpeg, don't hope.118119## Common mistakes (each killed a real cut)120121| Mistake | Result |122|---|---|123| Renders before screenplay | "Eight handsome beats that don't cause each other" |124| Community lore on screen | "Too direct, fan-service" |125| Client's mentioned technique as the concept | "I said it to spark ideas" |126| No continuity plan | Protagonist changes face every cut |127| One 40s music gen | Arc inverts at the climax |128| B-roll over a continuous VO | "Feels like a montage / audio doesn't match" |129| Baked the voice into N shots before the user heard it | Re-render everything when they reject it |130| Butt-joined talking-head clips | Voice drifts out of sync (avatar pads video past audio) |