Director — Story-to-Video Production Pipeline

Full production pipeline covering story to scenes, Z-Image start frames, Qwen Edit end frames, WAN FLF video clips, ffmpeg concatenation

How to install

How to install

  1. Setup differs for this server — follow the Installation part of the README below.
  2. Claude Code: claude mcp add <name> -- <command>.
  3. Claude Desktop / Cursor: add it under mcpServers in the MCP config file.
Claude Code — installs the whole folder, not just SKILL.md
npx degit artokun/comfyui-mcp/plugin/skills/director#main ~/.claude/skills/director

For one project only, change the path to .claude/skills/director. This skill also uses concat_list.txt, director_session_notes.md — copying SKILL.md alone won't be enough. See the folder on GitHub.

This one runs on your machine and can reach your files. Read the README below before you connect it.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text340 lines
director/SKILL.md340 lines17.8 KBpushed 27d agoRawView on GitHub

Director — Story-to-Video Production Pipeline

Overview

The Director skill runs a complete short film production from a text story. It breaks the story into scenes, generates start/end frames for each, creates video clips from frame pairs, and concatenates everything into a final video.

The pipeline runs Story Planning → Z-Image Hero + Character Refs → Qwen Edit Chain (all frames) → WAN 2.2 FLF Video Clips → ffmpeg Concatenation.

Key architectural decisions:

  • 1 hero frame + edit chain for character consistency (NEVER independent Z-Image per scene)
  • Inter-scene frame continuity. Scene N's end frame IS Scene N+1's start frame (same image file, no edit gap)
  • Character reference images fed into Qwen Edit's extra image slots
  • State file persists to disk for context compaction survival
  • Each scene is independently retryable without affecting others
  • clear_vram between every model family switch

CRITICAL: Inspect modes + verify every output

This pipeline drives the user's live canvas across many stages, so two habits are non-negotiable:

  • Inspect node modes before each render. After loading any pack/template/subgraph and before panel_run, check each node's mode (panel_graph_outline marks [bypass]/[mute]; panel_query_graph detail rows carry it). A bypass node is skipped (passes input through); a mute node and everything downstream don't execute. If the path, branch, or switch you need is bypassed or muted, enable it with panel_set_node_mode (set the wanted node active, the unwanted one bypass/mute). Never assume a switch or route is already active.
  • Verify the output matches before moving on. Every Phase-N render is a gate. Look at the produced frame or clip (view it) and confirm it matches the intent BEFORE advancing or reporting progress. If it's wrong, diagnose (wrong prompt path? a bypassed/muted builder or switch? wrong widget? wrong ref image?), fix, and rerun. Do NOT declare a phase done or report progress you haven't verified.
  • Confirm VIDEO renders via the filesystem, not /history. For a VHS_VideoCombine / LTX / WAN clip, do NOT rely on get_history / queue (action:"status") to confirm it exists. VHS-style video nodes write the .mp4 but frequently do NOT register an output in ComfyUI's /history (prompt shows done, empty outputs, no error). Confirm the file with get_image (action:"list_outputs") (now lists videos too, tagged kind: "video") by filename_prefix + fresh mtime, then chain it forward with upload_image (action:"stage").
  • Bypass completed stages before queuing the next one. If you build the multi-stage pipeline on ONE canvas (e.g. Krea2 → LTX → WAN) rather than running each phase in isolation, once a stage has run and its output is captured/staged, panel_set_node_mode(mode:"bypass") that stage's nodes BEFORE you panel_run the next stage. Otherwise panel_run re-executes the whole graph and you pay for and wait on already-finished work, a real and costly failure mode. Keep only the active stage live; feed the prior output forward with upload_image (action:"stage") (bypass the producer, feed its captured output to the consumer's loader).

CRITICAL: Character Consistency

Independent Z-Image generations per scene produce different-looking characters. This was the #1 problem discovered during testing. The solution:

  1. Generate ONE hero frame with Z-Image. It establishes the main character, setting, and lighting
  2. Generate character reference images: close-up portraits of each character, key props, and the background
  3. Create ALL other scene frames via the Qwen Edit chain from the hero, with character refs in extra image slots
  4. This keeps the same face, clothing, and environment across every frame

8-Phase Pipeline

Phase 1: Story Planning       → Break story into scenes (Claude reasoning, no ComfyUI)
Phase 2: Hero + Refs          → Z-Image: 1 hero frame + character ref portraits + background ref
Phase 3: Hero Review          → Visual verify hero and refs, user approves
Phase 4: Edit Chain           → Qwen Edit: chain ALL scene frames from hero (with char refs in slots 2-3)
Phase 5: Frame Review         → Visual verify all frames, approve/reject/retry
Phase 6: Video Clips          → WAN 2.2 FLF dual Hi-Lo (one clip per scene)
Phase 7: Video Review         → Preview each clip
Phase 8: Final Assembly       → ffmpeg concat all clips into one MP4

State File Format

Saved at ~/code/comfyui-mcp/workflows/director_state_{project_id}.json. Updated after every edit or phase completion.

{
  "project_id": "story_20260216_143022",
  "created": "2026-02-16T14:30:22Z",
  "story": "Original user story text",
  "current_phase": 4,
  "orientation": "portrait",
  "hero_frame": { "file": "director_hero_00001_.png", "seed": 428571, "approved": true },
  "character_refs": {
    "man": "director_ref_man.png",
    "cat": "director_ref_cat.png",
    "woman": "director_ref_woman.png",
    "background": "director_ref_bedroom.png"
  },
  "scenes": [
    {
      "id": 1,
      "description": "Brief scene description",
      "edit_prompt_start": "Qwen Edit instruction to create start frame from source",
      "edit_prompt_end": "Qwen Edit instruction to create end frame from source",
      "edit_source_start": "hero",
      "edit_source_end": "hero",
      "video_prompt": "WAN motion description",
      "start_frame": { "file": "director_s1_start_00001_.png", "seed": 12345, "approved": true },
      "end_frame": { "file": "director_hero_00001_.png", "seed": null, "approved": true },
      "video_clip": { "file": "director_s1_00001.mp4", "seed": 11111, "approved": false },
      "status": "video_pending"
    }
  ],
  "final_video": null,
  "settings": {
    "start_frame_resolution": [832, 1472],
    "video_resolution": [480, 720],
    "video_frames": 81,
    "video_fps": 16
  }
}

Models Used Per Phase

Phase Model Family Key Models VRAM
2: Hero + Refs Z-Image redcraftRedzimageUpdatedJAN30_redzibDX1.safetensors ~17GB
4: Edit Chain Qwen Edit qwen_image_edit_2511_bf16.safetensors + Lightning LoRA ~17-18GB
6: Video Clips WAN 2.2 I2V Remix NSFW Hi+Lo (built-in lightning) ~22-24GB

CRITICAL: clear_vram between every model family switch.

Phase 1: Story Planning

Break the story into 2 to 6 scenes. For each scene, identify:

  • description: what happens (1 to 2 sentences)
  • start frame: what the opening frame looks like
  • end frame: what the closing frame looks like
  • video_prompt: motion description for FLF transition

Identify a hero frame, the single most representative scene image that establishes the main character and setting. This hero will anchor all other frames via Qwen Edit.

Also identify which character reference images are needed (portraits of each character, key props, background).

CRITICAL: Inter-Scene Frame Continuity

The end frame of Scene N must be the EXACT same image file as the start frame of Scene N+1. Do NOT create separate Qwen-edited start frames for subsequent scenes. That causes visible jumps at scene boundaries when the videos are concatenated.

The frame chain for video generation:

Scene 1: S1_start (unique)        → hero (end)
Scene 2: hero (= S1 end)          → S2_end
Scene 3: S2_end (= S2 end)        → S3_end
Scene 4: S3_end (= S3 end)        → S4_end
Scene 5: S4_end (= S4 end)        → S5_end

Only Scene 1 needs a unique start frame. All other scenes inherit their start from the previous scene's end.

Edit Chain Planning

The edit chain produces only end frames (plus Scene 1's unique start frame). Map which end frame derives from which source:

  • Some end frames edit directly from the hero
  • Later end frames may chain from earlier end frames
  • Keep chains shallow (max 4 to 5 deep) to minimize drift

Example chain:

Hero (man+cat on bed)
  ├─ S1 Start: edit hero → remove cat, man alone
  ├─ S2 End: edit hero → replace cat with woman
  │    └─ S3 End: edit S2End → both sit up, man startled
  │         └─ S4 End: edit S3End → sitting close, warm smiles
  │              └─ S5 End: edit S4End → warm embrace

Phase 2: Hero + Character References — Z-Image

Generate with Z-Image RedCraft DX1 (10 steps, CFG 1, euler/simple):

  1. Hero frame: the establishing shot with main character + key elements
  2. Character ref portraits: close-up of each character (man, woman, animal, etc.)
  3. Background ref: the setting without characters

Add to negative prompts for character refs to exclude wrong subjects (e.g., "woman, female" when generating man portrait).

Hero Frame Workflow Template

{
  "1": { "class_type": "CheckpointLoaderSimple", "inputs": { "ckpt_name": "redcraftRedzimageUpdatedJAN30_redzibDX1.safetensors" }},
  "2": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["1", 1], "text": "<hero_prompt>" }, "_meta": { "title": "Positive" }},
  "3": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["1", 1], "text": "3D, ai generated, semi realistic, illustrated, drawing, comic, digital painting, 3D model, blender, video game screenshot, render, smooth textures, CGI, text, writing, subtitle, watermark, logo, blurry, low quality, jpeg artifacts, grainy" }, "_meta": { "title": "Negative" }},
  "4": { "class_type": "EmptyLatentImage", "inputs": { "width": 832, "height": 1472, "batch_size": 1 }},
  "5": { "class_type": "KSampler", "inputs": {
    "model": ["1", 0], "positive": ["2", 0], "negative": ["3", 0], "latent_image": ["4", 0],
    "seed": 42, "steps": 10, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
  }},
  "6": { "class_type": "VAEDecode", "inputs": { "samples": ["5", 0], "vae": ["1", 2] }},
  "7": { "class_type": "SaveImage", "inputs": { "images": ["6", 0], "filename_prefix": "director_hero" }}
}

Queue hero + all refs while Z-Image checkpoint is loaded (same checkpoint, different prompts).

Phase 3: Hero Review

Show hero frame and all character refs. User approves or requests regeneration with new seed.

Phase 4: Edit Chain — Qwen Image Edit

CRITICAL: Consistency Rules for Edit Prompts

  1. Always explicitly anchor clothing. "The man wears his grey t-shirt" in EVERY prompt
  2. Always state what doesn't change. "Same bedroom, same warm lighting, same clothing"
  3. Use strong emotion words. "extremely shocked and startled" >> "surprised"
  4. Include proportionality. "Her head and body should be proportional and natural looking"
  5. Prevent head enlargement. In embrace/close-up poses, Qwen Edit tends to enlarge heads. Add an explicit "do not enlarge her head, keep the same small natural size as in the original image"
  6. Describe the transformation, not just the end state

Workflow Template (with Character Reference Slots)

{
  "1": { "class_type": "UNETLoader", "inputs": { "unet_name": "qwen_image_edit_2511_bf16.safetensors", "weight_dtype": "default" }},
  "2": { "class_type": "LoraLoaderModelOnly", "inputs": { "model": ["1", 0], "lora_name": "Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors", "strength_model": 1 }},
  "3": { "class_type": "CLIPLoader", "inputs": { "clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors", "type": "qwen_image" }},
  "4": { "class_type": "VAELoader", "inputs": { "vae_name": "qwen_image_vae.safetensors" }},
  "5": { "class_type": "LoadImage", "inputs": { "image": "<source_scene.png>" }, "_meta": { "title": "Source Scene" }},
  "5b": { "class_type": "LoadImage", "inputs": { "image": "<character_ref.png>" }, "_meta": { "title": "Character Ref" }},
  "5c": { "class_type": "LoadImage", "inputs": { "image": "<background_ref.png>" }, "_meta": { "title": "Background Ref" }},
  "6": { "class_type": "TextEncodeQwenImageEditPlusAdvance_lrzjason", "inputs": {
    "clip": ["3", 0], "prompt": "<edit_prompt>", "vae": ["4", 0],
    "vl_resize_image1": ["5", 0],
    "vl_resize_image2": ["5b", 0],
    "vl_resize_image3": ["5c", 0],
    "target_size": 1024, "target_vl_size": 384,
    "upscale_method": "lanczos", "crop_method": "pad"
  }},
  "7": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["6", 0] }},
  "8": { "class_type": "KSampler", "inputs": {
    "model": ["2", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["6", 1],
    "seed": 42, "steps": 4, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
  }},
  "9": { "class_type": "VAEDecode", "inputs": { "samples": ["8", 0], "vae": ["4", 0] }},
  "10": { "class_type": "SaveImage", "inputs": { "images": ["9", 0], "filename_prefix": "director_s1_start" }}
}

Slots 5b and 5c matter. Feed character reference and background reference into vl_resize_image2 and vl_resize_image3. This helps the vision encoder maintain character appearance across edits.

Chain Execution

Edits are sequential; each depends on the previous output:

  1. Run edit, wait for completion
  2. Stage the output as the next stage's input with upload_image (action:"stage") (pass the output's { filename, subfolder?, type? }); it returns the registered input filename
  3. Use that returned filename as the image in the next edit's LoadImage
  4. Update state file after each edit

Independent edits (both from hero) can run in parallel.

CRITICAL: feeding an output into the next loader (don't guess paths)

To pipe ANY stage's output into the next stage's loader (LoadImage here, VHS_LoadVideo / LoadAudio in the video phases), call upload_image (action:"stage") with the output's { filename, subfolder?, type? } and drop the returned input filename into the loader's image/video/audio widget. For a file already on local disk, use upload_image with action "image" / "video" / "audio". NEVER copy the output file into, or guess, a filesystem input/ path. ComfyUI's input and output directories may be CUSTOM (--input-directory / --output-directory), so a guessed path makes the loader reject the file (Invalid image file) and wastes the render. upload_image (action:"stage") goes through the server API (/view/upload/image), which resolves the real dirs correctly.

Timing

  • First edit: ~87s (model loading)
  • Subsequent edits: ~30-40s each (models cached)

Phase 5: Frame Review

For each frame, show via Read for visual inspection. User approves or provides feedback. Re-run individual edits without redoing the whole chain.

Phase 6: Video Clip Generation — WAN 2.2 FLF Dual Hi-Lo

Workflow Template

(Same as wan-flf-video skill: Remix NSFW Hi+Lo, 4-stack LoRA, ImageResizeKJv2, dual KSamplerAdvanced)

Key settings:

  • Portrait: width=480, height=720
  • 81 frames, 16fps = ~5 seconds per clip
  • uni_pc/beta sampler, CFG 1, 4 total steps (Hi: 0→2, Lo: 2→4)
  • ModelSamplingSD3 shift=5 on both UNETs

Morph LoRA

For transformation scenes (e.g., cat→woman), add morph LoRA to Hi/Lo Common stacks:

  • wan2.2_i2v_magical_morph_highnoise.safetensors → Hi Common slot 1 (strength 1.0)
  • wan2.2_i2v_magical_morph_lownoise.safetensors → Lo Common slot 1 (strength 1.0)

Use 1.0 strength; it tested without sparkle issues. Lower values (0.7-0.85) produce weaker morph effects that may look like a dissolve rather than a true morph.

Per-Scene Changes

Swap per scene: start/end image filenames, positive prompt text, noise_seed, filename_prefix.

All 5 clips can be queued at once. They run sequentially in ComfyUI, sharing loaded models.

Phase 7: Video Review

Report each clip's filename. User previews externally.

Phase 8: Final Assembly — ffmpeg Concat

cd "<ComfyUI_output_dir>"
printf "file 'director_s1_00001.mp4'\nfile 'director_s2_00001.mp4'\n..." > concat_list.txt
ffmpeg -f concat -safe 0 -i concat_list.txt -c copy director_final_{project_id}.mp4

All clips share resolution/codec/framerate, so copy-concat works without re-encoding.

Resumption Protocol

After context compaction:

  1. Read state file AND director_session_notes.md if it exists
  2. Check current_phase and per-scene status
  3. Skip approved assets, continue from incomplete point
  4. clear_vram before loading the model family for the current phase

Timing Estimates (RTX 4090)

Phase Per Scene 5 Scenes
Hero + Refs (Z-Image) ~10s each ~50s (one-time)
Edit Chain (Qwen 4-step) ~35s each ~280s (8 edits)
Video Clip (WAN FLF 81 frames) ~140s ~700s
VRAM swaps (3x clear_vram) ~30s each ~90s
Total generation ~19 min

Storytelling Props for Continuity

Use distinctive visual elements that transfer between characters/forms to create narrative connections:

  • A colored collar on an animal → becomes a choker/necklace on the human form
  • Eye color matching between animal and human
  • Distinctive clothing or accessories that persist across scenes
  • These "continuity props" reinforce the story visually

Prompt Engineering for Edit Chains

DO

  • "The man wears his grey t-shirt" (anchor clothing every time)
  • "Same bedroom, same warm amber lamplight, same white sheets"
  • "Extremely shocked, jaw dropped, eyes wide in total disbelief"
  • "Her head and body proportional and natural looking"

DON'T

  • Assume clothing/setting will be preserved automatically
  • Use mild emotion words ("surprised" → use "extremely shocked" instead)
  • Chain more than 5-6 edits deep without branching back to hero
  • Assume head proportions stay correct in embrace/hug poses; always add explicit size anchoring

WAN Video Prompts

  • Use motion verbs: "walks", "turns", "reaches", "sits up", "leans in"
  • AVOID: "magical", "enchanted", "mystical" (causes sparkle effects)
  • USE: "smoothly transforms", "seamlessly reshapes", "gradually"
  • Include scale cues: "grows into", "expands upward"

Sources

  • Official: none found.
  • Empirical: 8-phase pipeline, models-per-phase, and prompt rules from working graphs.
1---
2name: director
3description: Full production pipeline covering story to scenes, Z-Image start frames, Qwen Edit end frames, WAN FLF video clips, ffmpeg concatenation
4globs:
5 - "**/*.json"
6---
7 
8# Director — Story-to-Video Production Pipeline
9 
10## Overview
11 
12The Director skill runs a complete short film production from a text story. It breaks the story into scenes, generates start/end frames for each, creates video clips from frame pairs, and concatenates everything into a final video.
13 
14The pipeline runs Story Planning → Z-Image Hero + Character Refs → Qwen Edit Chain (all frames) → WAN 2.2 FLF Video Clips → ffmpeg Concatenation.
15 
16Key architectural decisions:
17- 1 hero frame + edit chain for character consistency (NEVER independent Z-Image per scene)
18- Inter-scene frame continuity. Scene N's end frame IS Scene N+1's start frame (same image file, no edit gap)
19- Character reference images fed into Qwen Edit's extra image slots
20- State file persists to disk for context compaction survival
21- Each scene is independently retryable without affecting others
22- `clear_vram` between every model family switch
23 
24## CRITICAL: Inspect modes + verify every output
25 
26This pipeline drives the user's live canvas across many stages, so two habits are non-negotiable:
27 
28- **Inspect node modes before each render.** After loading any pack/template/subgraph and before `panel_run`, check each node's `mode` (`panel_graph_outline` marks [bypass]/[mute]; `panel_query_graph` detail rows carry it). A `bypass` node is skipped (passes input through); a `mute` node and everything downstream don't execute. If the path, branch, or switch you need is bypassed or muted, enable it with `panel_set_node_mode` (set the wanted node `active`, the unwanted one `bypass`/`mute`). Never assume a switch or route is already active.
29- **Verify the output matches before moving on.** Every Phase-N render is a gate. Look at the produced frame or clip (view it) and confirm it matches the intent BEFORE advancing or reporting progress. If it's wrong, diagnose (wrong prompt path? a bypassed/muted builder or switch? wrong widget? wrong ref image?), fix, and rerun. Do NOT declare a phase done or report progress you haven't verified.
30- **Confirm VIDEO renders via the filesystem, not /history.** For a `VHS_VideoCombine` / LTX / WAN clip, do NOT rely on `get_history` / `queue` (action:"status") to confirm it exists. VHS-style video nodes write the .mp4 but frequently do NOT register an output in ComfyUI's `/history` (prompt shows done, empty outputs, no error). Confirm the file with `get_image (action:"list_outputs")` (now lists videos too, tagged `kind: "video"`) by `filename_prefix` + fresh mtime, then chain it forward with `upload_image (action:"stage")`.
31- **Bypass completed stages before queuing the next one.** If you build the multi-stage pipeline on ONE canvas (e.g. Krea2 → LTX → WAN) rather than running each phase in isolation, once a stage has run and its output is captured/staged, `panel_set_node_mode(mode:"bypass")` that stage's nodes BEFORE you `panel_run` the next stage. Otherwise `panel_run` re-executes the whole graph and you pay for and wait on already-finished work, a real and costly failure mode. Keep only the active stage live; feed the prior output forward with `upload_image (action:"stage")` (bypass the producer, feed its captured output to the consumer's loader).
32 
33## CRITICAL: Character Consistency
34 
35Independent Z-Image generations per scene produce different-looking characters. This was the #1 problem discovered during testing. The solution:
36 
371. Generate ONE hero frame with Z-Image. It establishes the main character, setting, and lighting
382. Generate character reference images: close-up portraits of each character, key props, and the background
393. Create ALL other scene frames via the Qwen Edit chain from the hero, with character refs in extra image slots
404. This keeps the same face, clothing, and environment across every frame
41 
42## 8-Phase Pipeline
43 
44```
45Phase 1: Story Planning → Break story into scenes (Claude reasoning, no ComfyUI)
46Phase 2: Hero + Refs → Z-Image: 1 hero frame + character ref portraits + background ref
47Phase 3: Hero Review → Visual verify hero and refs, user approves
48Phase 4: Edit Chain → Qwen Edit: chain ALL scene frames from hero (with char refs in slots 2-3)
49Phase 5: Frame Review → Visual verify all frames, approve/reject/retry
50Phase 6: Video Clips → WAN 2.2 FLF dual Hi-Lo (one clip per scene)
51Phase 7: Video Review → Preview each clip
52Phase 8: Final Assembly → ffmpeg concat all clips into one MP4
53```
54 
55## State File Format
56 
57Saved at `~/code/comfyui-mcp/workflows/director_state_{project_id}.json`. Updated after every edit or phase completion.
58 
59```json
60{
61 "project_id": "story_20260216_143022",
62 "created": "2026-02-16T14:30:22Z",
63 "story": "Original user story text",
64 "current_phase": 4,
65 "orientation": "portrait",
66 "hero_frame": { "file": "director_hero_00001_.png", "seed": 428571, "approved": true },
67 "character_refs": {
68 "man": "director_ref_man.png",
69 "cat": "director_ref_cat.png",
70 "woman": "director_ref_woman.png",
71 "background": "director_ref_bedroom.png"
72 },
73 "scenes": [
74 {
75 "id": 1,
76 "description": "Brief scene description",
77 "edit_prompt_start": "Qwen Edit instruction to create start frame from source",
78 "edit_prompt_end": "Qwen Edit instruction to create end frame from source",
79 "edit_source_start": "hero",
80 "edit_source_end": "hero",
81 "video_prompt": "WAN motion description",
82 "start_frame": { "file": "director_s1_start_00001_.png", "seed": 12345, "approved": true },
83 "end_frame": { "file": "director_hero_00001_.png", "seed": null, "approved": true },
84 "video_clip": { "file": "director_s1_00001.mp4", "seed": 11111, "approved": false },
85 "status": "video_pending"
86 }
87 ],
88 "final_video": null,
89 "settings": {
90 "start_frame_resolution": [832, 1472],
91 "video_resolution": [480, 720],
92 "video_frames": 81,
93 "video_fps": 16
94 }
95}
96```
97 
98## Models Used Per Phase
99 
100| Phase | Model Family | Key Models | VRAM |
101|-------|-------------|------------|------|
102| 2: Hero + Refs | Z-Image | `redcraftRedzimageUpdatedJAN30_redzibDX1.safetensors` | ~17GB |
103| 4: Edit Chain | Qwen Edit | `qwen_image_edit_2511_bf16.safetensors` + Lightning LoRA | ~17-18GB |
104| 6: Video Clips | WAN 2.2 I2V | Remix NSFW Hi+Lo (built-in lightning) | ~22-24GB |
105 
106CRITICAL: `clear_vram` between every model family switch.
107 
108## Phase 1: Story Planning
109 
110Break the story into 2 to 6 scenes. For each scene, identify:
111- description: what happens (1 to 2 sentences)
112- start frame: what the opening frame looks like
113- end frame: what the closing frame looks like
114- video_prompt: motion description for FLF transition
115 
116Identify a hero frame, the single most representative scene image that establishes the main character and setting. This hero will anchor all other frames via Qwen Edit.
117 
118Also identify which character reference images are needed (portraits of each character, key props, background).
119 
120### CRITICAL: Inter-Scene Frame Continuity
121 
122The end frame of Scene N must be the EXACT same image file as the start frame of Scene N+1. Do NOT create separate Qwen-edited start frames for subsequent scenes. That causes visible jumps at scene boundaries when the videos are concatenated.
123 
124The frame chain for video generation:
125```
126Scene 1: S1_start (unique) → hero (end)
127Scene 2: hero (= S1 end) → S2_end
128Scene 3: S2_end (= S2 end) → S3_end
129Scene 4: S3_end (= S3 end) → S4_end
130Scene 5: S4_end (= S4 end) → S5_end
131```
132 
133Only Scene 1 needs a unique start frame. All other scenes inherit their start from the previous scene's end.
134 
135### Edit Chain Planning
136 
137The edit chain produces only end frames (plus Scene 1's unique start frame). Map which end frame derives from which source:
138- Some end frames edit directly from the hero
139- Later end frames may chain from earlier end frames
140- Keep chains shallow (max 4 to 5 deep) to minimize drift
141 
142Example chain:
143```
144Hero (man+cat on bed)
145 ├─ S1 Start: edit hero → remove cat, man alone
146 ├─ S2 End: edit hero → replace cat with woman
147 │ └─ S3 End: edit S2End → both sit up, man startled
148 │ └─ S4 End: edit S3End → sitting close, warm smiles
149 │ └─ S5 End: edit S4End → warm embrace
150```
151 
152## Phase 2: Hero + Character References — Z-Image
153 
154Generate with Z-Image RedCraft DX1 (10 steps, CFG 1, euler/simple):
155 
1561. Hero frame: the establishing shot with main character + key elements
1572. Character ref portraits: close-up of each character (man, woman, animal, etc.)
1583. Background ref: the setting without characters
159 
160Add to negative prompts for character refs to exclude wrong subjects (e.g., "woman, female" when generating man portrait).
161 
162### Hero Frame Workflow Template
163 
164```json
165{
166 "1": { "class_type": "CheckpointLoaderSimple", "inputs": { "ckpt_name": "redcraftRedzimageUpdatedJAN30_redzibDX1.safetensors" }},
167 "2": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["1", 1], "text": "<hero_prompt>" }, "_meta": { "title": "Positive" }},
168 "3": { "class_type": "CLIPTextEncode", "inputs": { "clip": ["1", 1], "text": "3D, ai generated, semi realistic, illustrated, drawing, comic, digital painting, 3D model, blender, video game screenshot, render, smooth textures, CGI, text, writing, subtitle, watermark, logo, blurry, low quality, jpeg artifacts, grainy" }, "_meta": { "title": "Negative" }},
169 "4": { "class_type": "EmptyLatentImage", "inputs": { "width": 832, "height": 1472, "batch_size": 1 }},
170 "5": { "class_type": "KSampler", "inputs": {
171 "model": ["1", 0], "positive": ["2", 0], "negative": ["3", 0], "latent_image": ["4", 0],
172 "seed": 42, "steps": 10, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
173 }},
174 "6": { "class_type": "VAEDecode", "inputs": { "samples": ["5", 0], "vae": ["1", 2] }},
175 "7": { "class_type": "SaveImage", "inputs": { "images": ["6", 0], "filename_prefix": "director_hero" }}
176}
177```
178 
179Queue hero + all refs while Z-Image checkpoint is loaded (same checkpoint, different prompts).
180 
181## Phase 3: Hero Review
182 
183Show hero frame and all character refs. User approves or requests regeneration with new seed.
184 
185## Phase 4: Edit Chain — Qwen Image Edit
186 
187### CRITICAL: Consistency Rules for Edit Prompts
188 
1891. **Always explicitly anchor clothing.** "The man wears his grey t-shirt" in EVERY prompt
1902. **Always state what doesn't change.** "Same bedroom, same warm lighting, same clothing"
1913. **Use strong emotion words.** "extremely shocked and startled" >> "surprised"
1924. **Include proportionality.** "Her head and body should be proportional and natural looking"
1935. **Prevent head enlargement.** In embrace/close-up poses, Qwen Edit tends to enlarge heads. Add an explicit "do not enlarge her head, keep the same small natural size as in the original image"
1946. **Describe the transformation, not just the end state**
195 
196### Workflow Template (with Character Reference Slots)
197 
198```json
199{
200 "1": { "class_type": "UNETLoader", "inputs": { "unet_name": "qwen_image_edit_2511_bf16.safetensors", "weight_dtype": "default" }},
201 "2": { "class_type": "LoraLoaderModelOnly", "inputs": { "model": ["1", 0], "lora_name": "Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors", "strength_model": 1 }},
202 "3": { "class_type": "CLIPLoader", "inputs": { "clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors", "type": "qwen_image" }},
203 "4": { "class_type": "VAELoader", "inputs": { "vae_name": "qwen_image_vae.safetensors" }},
204 "5": { "class_type": "LoadImage", "inputs": { "image": "<source_scene.png>" }, "_meta": { "title": "Source Scene" }},
205 "5b": { "class_type": "LoadImage", "inputs": { "image": "<character_ref.png>" }, "_meta": { "title": "Character Ref" }},
206 "5c": { "class_type": "LoadImage", "inputs": { "image": "<background_ref.png>" }, "_meta": { "title": "Background Ref" }},
207 "6": { "class_type": "TextEncodeQwenImageEditPlusAdvance_lrzjason", "inputs": {
208 "clip": ["3", 0], "prompt": "<edit_prompt>", "vae": ["4", 0],
209 "vl_resize_image1": ["5", 0],
210 "vl_resize_image2": ["5b", 0],
211 "vl_resize_image3": ["5c", 0],
212 "target_size": 1024, "target_vl_size": 384,
213 "upscale_method": "lanczos", "crop_method": "pad"
214 }},
215 "7": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["6", 0] }},
216 "8": { "class_type": "KSampler", "inputs": {
217 "model": ["2", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["6", 1],
218 "seed": 42, "steps": 4, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
219 }},
220 "9": { "class_type": "VAEDecode", "inputs": { "samples": ["8", 0], "vae": ["4", 0] }},
221 "10": { "class_type": "SaveImage", "inputs": { "images": ["9", 0], "filename_prefix": "director_s1_start" }}
222}
223```
224 
225Slots 5b and 5c matter. Feed character reference and background reference into `vl_resize_image2` and `vl_resize_image3`. This helps the vision encoder maintain character appearance across edits.
226 
227### Chain Execution
228 
229Edits are sequential; each depends on the previous output:
2301. Run edit, wait for completion
2312. Stage the output as the next stage's input with `upload_image (action:"stage")` (pass the output's `{ filename, subfolder?, type? }`); it returns the registered input filename
2323. Use that returned filename as the `image` in the next edit's `LoadImage`
2334. Update state file after each edit
234 
235Independent edits (both from hero) can run in parallel.
236 
237### CRITICAL: feeding an output into the next loader (don't guess paths)
238 
239To pipe ANY stage's output into the next stage's loader (`LoadImage` here, `VHS_LoadVideo` / `LoadAudio` in the video phases), call `upload_image (action:"stage")` with the output's `{ filename, subfolder?, type? }` and drop the returned input filename into the loader's `image`/`video`/`audio` widget. For a file already on local disk, use `upload_image` with action `"image"` / `"video"` / `"audio"`. NEVER copy the output file into, or guess, a filesystem `input/` path. ComfyUI's input and output directories may be CUSTOM (`--input-directory` / `--output-directory`), so a guessed path makes the loader reject the file (`Invalid image file`) and wastes the render. `upload_image (action:"stage")` goes through the server API (`/view``/upload/image`), which resolves the real dirs correctly.
240 
241### Timing
242 
243- First edit: ~87s (model loading)
244- Subsequent edits: ~30-40s each (models cached)
245 
246## Phase 5: Frame Review
247 
248For each frame, show via `Read` for visual inspection. User approves or provides feedback. Re-run individual edits without redoing the whole chain.
249 
250## Phase 6: Video Clip Generation — WAN 2.2 FLF Dual Hi-Lo
251 
252### Workflow Template
253 
254(Same as wan-flf-video skill: Remix NSFW Hi+Lo, 4-stack LoRA, ImageResizeKJv2, dual KSamplerAdvanced)
255 
256Key settings:
257- Portrait: width=480, height=720
258- 81 frames, 16fps = ~5 seconds per clip
259- uni_pc/beta sampler, CFG 1, 4 total steps (Hi: 0→2, Lo: 2→4)
260- ModelSamplingSD3 shift=5 on both UNETs
261 
262### Morph LoRA
263 
264For transformation scenes (e.g., cat→woman), add morph LoRA to Hi/Lo Common stacks:
265- `wan2.2_i2v_magical_morph_highnoise.safetensors` → Hi Common slot 1 (strength 1.0)
266- `wan2.2_i2v_magical_morph_lownoise.safetensors` → Lo Common slot 1 (strength 1.0)
267 
268Use 1.0 strength; it tested without sparkle issues. Lower values (0.7-0.85) produce weaker morph effects that may look like a dissolve rather than a true morph.
269 
270### Per-Scene Changes
271 
272Swap per scene: start/end image filenames, positive prompt text, noise_seed, filename_prefix.
273 
274All 5 clips can be queued at once. They run sequentially in ComfyUI, sharing loaded models.
275 
276## Phase 7: Video Review
277 
278Report each clip's filename. User previews externally.
279 
280## Phase 8: Final Assembly — ffmpeg Concat
281 
282```bash
283cd "<ComfyUI_output_dir>"
284printf "file 'director_s1_00001.mp4'\nfile 'director_s2_00001.mp4'\n..." > concat_list.txt
285ffmpeg -f concat -safe 0 -i concat_list.txt -c copy director_final_{project_id}.mp4
286```
287 
288All clips share resolution/codec/framerate, so copy-concat works without re-encoding.
289 
290## Resumption Protocol
291 
292After context compaction:
2931. Read state file AND `director_session_notes.md` if it exists
2942. Check `current_phase` and per-scene status
2953. Skip approved assets, continue from incomplete point
2964. `clear_vram` before loading the model family for the current phase
297 
298## Timing Estimates (RTX 4090)
299 
300| Phase | Per Scene | 5 Scenes |
301|-------|-----------|----------|
302| Hero + Refs (Z-Image) | ~10s each | ~50s (one-time) |
303| Edit Chain (Qwen 4-step) | ~35s each | ~280s (8 edits) |
304| Video Clip (WAN FLF 81 frames) | ~140s | ~700s |
305| VRAM swaps (3x clear_vram) | ~30s each | ~90s |
306| **Total generation** | | **~19 min** |
307 
308## Storytelling Props for Continuity
309 
310Use distinctive visual elements that transfer between characters/forms to create narrative connections:
311- A colored collar on an animal → becomes a choker/necklace on the human form
312- Eye color matching between animal and human
313- Distinctive clothing or accessories that persist across scenes
314- These "continuity props" reinforce the story visually
315 
316## Prompt Engineering for Edit Chains
317 
318### DO
319- "The man wears his grey t-shirt" (anchor clothing every time)
320- "Same bedroom, same warm amber lamplight, same white sheets"
321- "Extremely shocked, jaw dropped, eyes wide in total disbelief"
322- "Her head and body proportional and natural looking"
323 
324### DON'T
325- Assume clothing/setting will be preserved automatically
326- Use mild emotion words ("surprised" → use "extremely shocked" instead)
327- Chain more than 5-6 edits deep without branching back to hero
328- Assume head proportions stay correct in embrace/hug poses; always add explicit size anchoring
329 
330### WAN Video Prompts
331- Use motion verbs: "walks", "turns", "reaches", "sits up", "leans in"
332- AVOID: "magical", "enchanted", "mystical" (causes sparkle effects)
333- USE: "smoothly transforms", "seamlessly reshapes", "gradually"
334- Include scale cues: "grows into", "expands upward"
335 
336## Sources
337 
338- **Official:** none found.
339- **Empirical:** 8-phase pipeline, models-per-phase, and prompt rules from working graphs.
340 

Discussion

From GitHub

6 comments on 3 threads

Panel side is settled: **comfyui-mcp-panel#2150 is closed as upstream**, pointing here. Two things landed there that are relevant to whoever picks this up: - The panel's replay bound is **correct and stays at three** — all 7 pins in `browser_tests/unit/run-completion-redelivery-storm.test.mjs` are green on panel main. `CONTROL #1739` and `CONTROL #370` are the ones a "just stop replaying" fix would silently un-ship. - panel#2156 (`5169dacf`, comment-only) records the five reachable no-receipt causes next to that bound and cites this issue. **That makes this issue a cited fact in panel source**read the rest

Resolved by already-merged MCP PR #2729 (merge `6c2c0d8acc82fe9be6aa71da975b38d4d4aff98c`, exact PR head `bf55e89552e5358359b9801f7d39b9af32d169a9`). Independent exact-head review SHIP: `src/orchestrator/index.ts:5583-5646` journals keyed completions and emits `ok:false, reason:"uncorrelated"` for valid but unowned frames; `completion-receipt.ts:20-37` and `run-completion-journal.ts:1674-1687` retain fail-closed identity/ownership/non-reuse gates. Hosted CI run `33594317119` passed Ubuntu, Windows, macOS, and pack/install smoke. Current Panel main source-verifies exact receipt retirement and tread the rest

Parked — declined by the owner, and independently, not this repo's code. @artokun on this thread: That is the decision and it settles the issue. The mechanism that makes it land: this report asks us to make `model_authorization.py authorize` stop recording the approval on the plan item it just approved. Model approval is the human-in-the-loop gate on **which weights get loaded**, and ComfyUI deserializes `.ckpt`/`.pt` through Python `pickle` — loading an unapproved checkpoint is arbitrary code execution on the user's machine. A patch that makes "authorized" and "what the plan records as approvread the rest

Thanks for the precise report and for including the patch — the diagnosis is right: `tool_choice.py` accepts the canonical voice-source enum `video_model_native_audio`, but the label table in `scripts/user_output.py` only knows the older spellings (`native_model_audio`, `native_audio`, `model_native`), so `build_review_portals.py` renders a valid approved choice as “缺少中文说明”. Adding the canonical key to the label map is the correct fix. **One routing note first.** `manga-director-codex` is not shipped by this repository. comfyui-mcp contains only the MiniMax H3 prompt *adapter* that the skill cread the rest

Alternatives

Also in Pipeline & forecast
Arbor — Autonomous Optimization via Hypothesis Tree RefinementAutonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g. "get my model's eval score up", "improve this agent/harness", "tune this pipeline", "beat the baseline on this benchmark", "run a search over approaches and keep the best", "do an MLE-bench / Kaggle-style optimization", or any long-horizon "make this artifact better and don't just memorize the dev set" task. Trigger it even when the user doesn't say "Arbor" or "hypothesis tree" but describes repeated experiment-and-evaluate loops, branching exploration of competing ideas, or worries about a dev/test gap. Runs Claude itself as the coordinator with subagent executors in isolated git worktrees; for the standalone `arbor` CLI tool see references/arbor-upstream.md.Science · MITFix How You Run Your TeamYou describe how you currently run your team, meetings, and week. You get back an honest scorecard and a short list of the exact changes that would make you a better manager.Business & ops · MITPredictable Revenue FrameworkBuild a scalable outbound B2B sales machine with specialized roles (SDR, AE, CSM). Use when the user mentions "outbound sales", "Cold Calling 2.0", "cold email sequences", "sales pipeline", "SDR process", "sales development", "build an outbound sales team", or "fill my pipeline". Also trigger when setting up a B2B SaaS sales team from scratch or building a lead-qualification framework to improve close rates. Covers the three lead types (seeds/nets/spears), role specialization, the referral-email method, ANUM qualification, and pipeline math. For offer design, see hundred-million-offers. For persuasion science, see influence-psychology.Sales & ecommerce · MITInbound lead qualificationQualifies inbound leads against full ICP criteria — company size, industry, use case fit, role/seniority of the person. Checks CRM and existing customer base for duplicates and existing relationships. Outputs a scored CSV with qualification status, reasoning, and pipeline overlap flags. Tool-agnostic — works with any CRM, enrichment tool, or data source.Sales & ecommerce · MIT