@milenyumai/film-kit 2.3.4 → 2.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +5 -2
  2. package/build/index.d.ts +1 -1
  3. package/build/lib/cli.js +1 -1
  4. package/build/lib/configure.js +14 -9
  5. package/build/lib/storyboard-reference/adapters/seedance20.js +5 -5
  6. package/build/lib/storyboard-reference/index.d.ts +1 -1
  7. package/build/lib/storyboard-reference/output-writer.js +6 -0
  8. package/build/lib/storyboard-reference/prompt-bundle-builder.js +68 -19
  9. package/build/lib/storyboard-reference/types.d.ts +25 -0
  10. package/build/lib/storyboard-reference/validators.js +4 -0
  11. package/build/lib/templates.js +1 -1
  12. package/content/skills/storyboard-reference/SKILL.md +7 -4
  13. package/content/workflows/generate-storyboard.md +7 -6
  14. package/package.json +1 -1
  15. package/packages/gpt-image-smart/content/skills/storyboard-reference/SKILL.md +7 -4
  16. package/packages/gpt-image-smart/content/workflows/generate-storyboard.md +7 -6
  17. package/packages/hybrid/content/skills/storyboard-reference/SKILL.md +7 -4
  18. package/packages/hybrid/content/workflows/generate-storyboard.md +7 -6
  19. package/packages/hybrid-smart/content/skills/storyboard-reference/SKILL.md +7 -4
  20. package/packages/hybrid-smart/content/workflows/generate-storyboard.md +7 -6
  21. package/packages/multi/build/lib/configure.js +4 -4
  22. package/packages/multi/build/lib/templates.js +9 -9
  23. package/packages/multi/content/skills/storyboard-reference/SKILL.md +7 -4
  24. package/packages/multi/content/workflows/generate-storyboard.md +7 -6
  25. package/packages/studio/content/skills/storyboard-reference/SKILL.md +7 -4
  26. package/packages/studio/content/workflows/generate-storyboard.md +7 -6
package/README.md CHANGED
@@ -183,6 +183,7 @@ npx @milenyumai/film-kit generate-storyboard \
183
183
  Outputs:
184
184
 
185
185
  - `outputs/storyboard-reference-plan.json`
186
+ - `outputs/storyboard-prompt.md`
186
187
  - `outputs/reference-prep/CHARACTER-SHEET-*.md`
187
188
  - `outputs/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md`
188
189
  - `outputs/prompt-bundles/SHOTNN.bundle.json`
@@ -196,8 +197,10 @@ Rules:
196
197
  - `@character1` is used once to create a 16:9 character sheet prompt with front, back, side, three-quarter, and face close-up views.
197
198
  - GPT Image 2 still prompts use `REFERENCE LOCK`, `Keep same`, `Change only`, and `Avoid` sections so character identity, wardrobe, props, and materials stay immutable unless explicitly changed.
198
199
  - Each `SHOTNN.md` includes a professional `GPT IMAGE 2 STORYBOARD PROMPT`; the generated shot storyboard controls composition, blocking, camera, timing, and editorial phase order only.
199
- - Storyboard prompts use production-board grammar: rough black-and-white pencil panels, strong silhouettes, visible body/camera momentum, and optional color-coded planning annotations. Seedance is instructed to follow the panel order while ignoring arrows, notes, labels, and timestamps in the rendered video.
200
+ - If no external storyboard image exists, Film-Kit still generates the GPT Image 2 storyboard bootstrap prompt and writes it to both `outputs/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md` and the convenience alias `outputs/storyboard-prompt.md`.
201
+ - Storyboard prompts use production-board grammar: 16:9 storyboard sheet, rough black-and-white pencil panels, strong silhouettes, visible body/camera momentum, cinematic camera variety, and optional color-coded planning annotations. Seedance is instructed to follow the panel order while ignoring arrows, notes, labels, and timestamps in the rendered video.
200
202
  - Seedance provider-facing tokens map generated character sheets first (`@Image1`, `@Image2`, ...) and the generated shot storyboard next. Legacy lowercase aliases remain documented in runtime text.
203
+ - `SHOTNN.bundle.json` includes `storyboard_creation` metadata with provider, prompt path, alias path, reading order, panel count, Seedance token, annotation policy, and prompt text.
201
204
  - Speaking shots must bind `Audio Plan.activeSpeakerKey` back to project-level `voiceCast`; broken voice bindings fail QA.
202
205
  - Public-figure, celebrity, likeness, logo, trademark, or brand references in the brief, dialogue metadata, or reference metadata are blocked unless safely anonymized first.
203
206
  - Phase budget: 4-6s uses 1-2 phases, 7-10s uses 2-3 phases, and 11-15s uses 3-4 phases.
@@ -216,7 +219,7 @@ CLI flags for direct storyboard bundle generation:
216
219
  | `--models` | Comma-separated target models: `veo31`, `seedance-2.0`, `kling-3.0` |
217
220
  | `--duration` | Duration in seconds per generated shot. Seedance provider range is 4-15 seconds |
218
221
  | `--aspect` | `16:9`, `9:16`, or `1:1` |
219
- | `--storyboard-panel-count-hint` | Optional total panel/phase hint. 5+ phases are split when overload splitting is enabled |
222
+ | `--storyboard-panel-count-hint` | Optional GPT Image 2 storyboard sheet panel count, `1-12`. This does not by itself split SHOT files |
220
223
  | `--max-storyboard-phases` | Upper bound per shot. Default: `4` |
221
224
 
222
225
  ## CLI
package/build/index.d.ts CHANGED
@@ -4,4 +4,4 @@ export { buildStoryboardReferencePromptBundles, normalizeVideoPromptRequest, ren
4
4
  export { assertModelAllowed, getModel, getModelAdapterKey, getModelDisplayName, getReplacementModel, isActiveModelId, isDeprecatedModelId, isImageModelId, isKnownModelId, isModelSupportedByPreset, isRemovedModelId, isVideoModelId, listActiveModels, listActiveVideoModelIds, listImageModels, listModels, listModelsForPreset, listModelsForReferenceMode, listRunnableVideoModelIds, listRunnableVideoModels, listVideoModels, requireModel, validateModelAllowed } from "./lib/model-registry/index.js";
5
5
  export type { AgentConfigOptions, ConfigureFilmKitResult, ConfigureResult, FilmKitConfigFile, FilmKitConfigOptions, FilmKitPreset, GptImageFormat, GptImageQuality, GptImageSize, HybridAspectRatio, KlingPreset, NanoBananaImageSize, ReferenceMode, StoryboardReferenceConfig, SupportedModel, SupportedPlatform } from "./lib/types.js";
6
6
  export type { ActiveModelId, AudioModelId, DeprecatedModelId, ImageModelId, KnownModelId, ModelAdapterKey, ModelAllowedContext, ModelAllowedResult, ModelCapabilities, ModelLifecycleStatus, ModelModality, ModelRegistryEntry, MultimodalModelId, RemovedModelId, VideoModelId } from "./lib/model-registry/index.js";
7
- export type { CharacterReferenceSheetPrompt, ModelPromptOutput, ModelRouteMetadata, PromptBundle, ProviderAssetMappingEntry, ProviderFileLimitReport, ProviderReferenceTokenPolicy, ReferenceAsset, ReferenceAssetRequirement, SeedanceContinuityMode, ShotHandoffNote, StoryboardImagePrompt, StoryboardPhaseBudget, StoryboardReferenceBuildResult, StoryboardReferencePolicy, StoryboardReferenceWriteResult, VideoPromptRequest } from "./lib/storyboard-reference/index.js";
7
+ export type { CharacterReferenceSheetPrompt, ModelPromptOutput, ModelRouteMetadata, PromptBundle, ProviderAssetMappingEntry, ProviderFileLimitReport, ProviderReferenceTokenPolicy, ReferenceAsset, ReferenceAssetRequirement, SeedanceContinuityMode, ShotHandoffNote, StoryboardCreationMetadata, StoryboardImagePrompt, StoryboardPhaseBudget, StoryboardReferenceBuildResult, StoryboardReferencePolicy, StoryboardReferenceWriteResult, VideoPromptRequest } from "./lib/storyboard-reference/index.js";
package/build/lib/cli.js CHANGED
@@ -542,7 +542,7 @@ generate-storyboard flags:
542
542
  --dialogue Repeatable "Speaker: exact line" value
543
543
  --audio-intent SFX/ambience direction
544
544
  --style-intent Visual style direction
545
- --storyboard-panel-count-hint Panel/phase count hint; 5+ panels split into multiple SHOTNN files
545
+ --storyboard-panel-count-hint GPT Image 2 storyboard sheet panel count, 1-12; does not split SHOT files by itself
546
546
  --max-storyboard-phases Upper bound per SHOTNN storyboard phase count
547
547
 
548
548
  Install:
@@ -160,6 +160,7 @@ description: Generate storyboard-reference prompt bundles from character referen
160
160
  \`\`\`text
161
161
  ${vars.outputDir}/
162
162
  ├── storyboard-reference-plan.json
163
+ ├── storyboard-prompt.md
163
164
  ├── reference-prep/
164
165
  │ └── CHARACTER-SHEET-*.md
165
166
  ├── storyboard-prompts/
@@ -187,18 +188,21 @@ ${vars.outputDir}/
187
188
  - \`maxStoryboardPhases: ${vars.maxStoryboardPhases}\`
188
189
  - \`voiceCast\` when dialogue or narration exists
189
190
  - \`visual_world\` for camera, lens, lighting, scale, reflection, physics, screen direction, and continuity anchors
190
- 4. Split the scenario into shots by dramatic beat. Use this phase budget:
191
+ 4. Split the scenario into shots by dramatic beat. Use this video phase budget:
191
192
  - 4-6 seconds: 1-2 phases
192
193
  - 7-10 seconds: 2-3 phases
193
194
  - 11-15 seconds: 3-4 phases
194
- - 5+ distinct phases: split into separate \`SHOTNN.md\` files
195
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into separate \`SHOTNN.md\` files
196
+ - GPT Image 2 storyboard sheets may use 1-12 panels; 5-12 storyboard sheet panels alone do not force a split
195
197
  5. For each shot, write a GPT Image 2 storyboard prompt:
196
198
  - use character sheets as the only identity source
197
199
  - use optional storyboard guides only for staging and timing
200
+ - use raw black-and-white rough pencil storyboard panels, strong silhouettes, visible motion, cinematic camera variety, and color-coded planning annotations
198
201
  - include previous-shot handoff and next-shot handoff
199
202
  - preserve shared \`visual_world\`, lighting, screen direction, and action rhythm
200
203
  6. Build model-ready video prompt bundles:
201
204
  - Seedance: character sheet tokens first, generated shot storyboard token next
205
+ - Seedance: follow storyboard panels left-to-right/top-to-bottom as visual/action/camera source, but never render arrows, labels, annotations, timestamps, or panel borders
202
206
  - Veo: visual planning prompt with full audio direction
203
207
  - Kling: block-structured storyboard route, not a mandatory Start+End frame route
204
208
  7. Keep coverage inside the same \`SHOTNN.md\`; coverage uses storyboard planning prompts and does not request separate start/end still prompts.
@@ -351,13 +355,14 @@ description: Finalize storyboard-reference prompt packages after storyboard QA p
351
355
  ## Validate Files
352
356
 
353
357
  1. \`${vars.outputDir}/storyboard-reference-plan.json\` exists.
354
- 2. \`${vars.outputDir}/reference-prep/\` contains character sheet prompt files.
355
- 3. \`${vars.outputDir}/storyboard-prompts/\` contains per-shot GPT Image 2 storyboard prompts.
356
- 4. \`${vars.outputDir}/prompt-bundles/\` contains model prompt bundles.
357
- 5. Every \`${vars.outputDir}/shots/SHOTNN.md\` contains the required storyboard-reference sections.
358
- 6. Coverage stays in the same \`SHOTNN.md\`.
359
- 7. No generated shot contains forbidden start/end frame sections or exact first-frame reuse instructions.
360
- 8. \`storyboard_reference_status\` and \`storyboard_handoff_status\` are pass.
358
+ 2. \`${vars.outputDir}/storyboard-prompt.md\` exists as the storyboard bootstrap alias.
359
+ 3. \`${vars.outputDir}/reference-prep/\` contains character sheet prompt files.
360
+ 4. \`${vars.outputDir}/storyboard-prompts/\` contains per-shot GPT Image 2 storyboard prompts.
361
+ 5. \`${vars.outputDir}/prompt-bundles/\` contains model prompt bundles with \`storyboard_creation\` metadata.
362
+ 6. Every \`${vars.outputDir}/shots/SHOTNN.md\` contains the required storyboard-reference sections.
363
+ 7. Coverage stays in the same \`SHOTNN.md\`.
364
+ 8. No generated shot contains forbidden start/end frame sections or exact first-frame reuse instructions.
365
+ 9. \`storyboard_reference_status\` and \`storyboard_handoff_status\` are pass.
361
366
 
362
367
  ## Final Summary
363
368
 
@@ -47,8 +47,8 @@ export class Seedance20PromptAdapter extends BaseVideoModelPromptAdapter {
47
47
  const storyboardEntry = this.getMappingEntries(input, "storyboard_plan")[0];
48
48
  const storyboardToken = storyboardEntry?.token ?? "@Image2";
49
49
  const continuityInstruction = input.continuityMode === "continuous-shot"
50
- ? "No scene cuts throughout, one continuous shot."
51
- : `Follow the generated storyboard panels in ${storyboardToken} left-to-right, top-to-bottom as the exact visual beat order. Do not reinterpret actions, poses, camera angles, emotional progression, frame variety, or the final pose. Compress the planned sequence into the full duration as concise motion snapshots; use only storyboard-motivated cuts, match cuts, whip transitions, or camera moves, and do not add unplanned cuts, extra scene jumps, or new locations.`;
50
+ ? `Use the generated storyboard reference ${storyboardToken} as the complete visual, action, camera, and choreography source for this ${input.request.durationSeconds}-second video. Follow the single storyboard beat exactly. No scene cuts throughout, one continuous shot.`
51
+ : `Use the generated storyboard reference ${storyboardToken} as the complete visual, action, camera, and choreography source for this ${input.request.durationSeconds}-second video. Follow all ${input.storyboardImagePrompt.panelCount} beats sequentially from left-to-right, top-to-bottom as the exact visual beat order. Do not reinterpret actions, poses, camera angles, emotional progression, frame variety, movement logic, shot order, or the final pose. Compress the full ${input.storyboardImagePrompt.panelCount}-beat sequence into the full duration as fast readable motion snapshots, not full-length actions. Use urgent rhythm, storyboard-motivated cuts, quick cuts, match cuts, whip transitions, or motivated camera moves only when the storyboard supports them. Do not add unplanned cuts, extra scene jumps, duplicate performers, or new locations.`;
52
52
  const characterEntries = this.getMappingEntries(input, "character_identity");
53
53
  const characterTokenText = characterEntries.map(entry => entry.token).join(", ") || "@Image1";
54
54
  const promptText = `${this.formatCharacterRoleLine(input)}
@@ -69,13 +69,13 @@ ${input.request.brief}
69
69
  ${formatPhaseLines(input.interpretation.phases)}
70
70
 
71
71
  [GPT IMAGE 2 STORYBOARD SOURCE]
72
- Use the generated storyboard image from ${input.storyboardImagePrompt.outputPath} as ${storyboardToken}. It has ${input.storyboardImagePrompt.panelCount} panel(s), follows the shot handoff, and is not an identity source. Treat colored arrows, panel labels, and lens notes as planning annotations only; never render arrows, notes, labels, timestamps, or storyboard text into the video.
72
+ Use the generated storyboard image from ${input.storyboardImagePrompt.outputPath} as ${storyboardToken}. It has ${input.storyboardImagePrompt.panelCount} panel(s), follows the shot handoff, and is not an identity source. Treat colored arrows, panel labels, lens notes, and framing marks as planning annotations only; never render arrows, annotation marks, notes, labels, timestamps, panel borders, or storyboard text into the video.
73
73
 
74
74
  [CAMERA]
75
75
  ${input.interpretation.cameraPlan.framing}, ${input.interpretation.cameraPlan.movement}, ${input.interpretation.cameraPlan.lens}, ${input.interpretation.cameraPlan.stabilization}. Preserve ${input.interpretation.cameraPlan.screenDirection}.
76
76
 
77
77
  [PERFORMANCE]
78
- Visible acting stays concrete and restrained: gaze, breathing, posture, hand behavior, and facial tension evolve from the brief without changing identity.
78
+ Keep the same performer identity from ${characterTokenText}; do not duplicate the character. Visible performance must include breath, mouth movement when dialogue or singing is present, body strain, fabric motion, floor or prop contact, and emotional escalation while preserving exact identity. Acting stays concrete and physically grounded: gaze, breathing, posture, hand behavior, and facial tension evolve from the brief without changing wardrobe or body design.
79
79
 
80
80
  [AUDIO]
81
81
  Dialogue: ${buildDialogueTranscript(input)}.
@@ -86,7 +86,7 @@ Music: NONE.
86
86
  [CONTINUITY]
87
87
  Identity reference stays locked to ${characterTokenText}. Storyboard ${storyboardToken} controls staging, shot order, pose logic, camera variety, emotional progression, and visual rhythm only. Character design, wardrobe, accessories, and visible props cannot be inherited from the storyboard. Storyboard text, panel borders, arrows, colored marks, lens notes, watermark, logo, and alternate character design are never identity sources and must not appear in the rendered video.
88
88
 
89
- Avoid: identity drift, face drift, outfit drift, storyboard text, panel borders, colored arrows, annotation marks, lens notes, timestamps, watermark, logo, distorted hands, rubbery motion, flicker, unnatural camera jumps.`;
89
+ Avoid: identity drift, face drift, outfit drift, duplicated performer, storyboard text, annotations, panel borders, colored arrows, annotation marks, lens notes, timestamps, watermark, logo, distorted hands, rubbery motion, flicker, unnatural camera jumps. No text, no annotations, no timestamps, no watermark.`;
90
90
  const output = {
91
91
  model: this.model,
92
92
  displayName: getDisplayName(this.model),
@@ -4,4 +4,4 @@ export { resolveAssetRoles } from "./asset-role-resolver.js";
4
4
  export { interpretStoryboard } from "./storyboard-interpreter.js";
5
5
  export { renderShotMarkdown, writeStoryboardReferenceOutputs } from "./output-writer.js";
6
6
  export { assertSafeStoryboardReferenceRequest, assertStoryboardReferenceBuildPass, validateModelPromptOutput, validatePromptBundle, validateResolvedAssetRoles } from "./validators.js";
7
- export type { AdapterInput, AudioPlan, CameraPlan, CharacterReferenceSheetPrompt, ContinuityAnchors, DialogueLine, ModelPromptOutput, ModelPromptQa, ModelRouteMetadata, NormalizedVideoPromptRequest, PromptBundle, PromptBundleQa, ProviderAssetMappingEntry, ProviderFileLimitReport, ProviderReferenceTokenPolicy, ReferenceAsset, ReferenceAssetRequirement, ReferenceAssetRole, ReferenceLockStrength, ResolvedAssetRoles, SeedanceContinuityMode, ShotHandoffNote, StoryboardImagePrompt, StoryboardInterpretation, StoryboardPhase, StoryboardPhaseBudget, StoryboardReferenceBuildResult, StoryboardReferencePlan, StoryboardReferencePolicy, StoryboardReferenceWriteResult, VideoModelPromptAdapter, VideoPromptRequest, VisualWorld, VoiceCastEntry } from "./types.js";
7
+ export type { AdapterInput, AudioPlan, CameraPlan, CharacterReferenceSheetPrompt, ContinuityAnchors, DialogueLine, ModelPromptOutput, ModelPromptQa, ModelRouteMetadata, NormalizedVideoPromptRequest, PromptBundle, PromptBundleQa, ProviderAssetMappingEntry, ProviderFileLimitReport, ProviderReferenceTokenPolicy, ReferenceAsset, ReferenceAssetRequirement, ReferenceAssetRole, ReferenceLockStrength, ResolvedAssetRoles, SeedanceContinuityMode, ShotHandoffNote, StoryboardCreationMetadata, StoryboardImagePrompt, StoryboardInterpretation, StoryboardPhase, StoryboardPhaseBudget, StoryboardReferenceBuildResult, StoryboardReferencePlan, StoryboardReferencePolicy, StoryboardReferenceWriteResult, VideoModelPromptAdapter, VideoPromptRequest, VisualWorld, VoiceCastEntry } from "./types.js";
@@ -169,6 +169,9 @@ ${bundle.storyboardImagePrompt.promptText}
169
169
  \`\`\`
170
170
  `;
171
171
  }
172
+ function renderStoryboardPromptAlias(result) {
173
+ return result.bundles.map(renderStoryboardPromptFile).join("\n---\n\n");
174
+ }
172
175
  function renderQaReport(result) {
173
176
  const models = result.request.targetModels.join(", ");
174
177
  const rows = result.bundles
@@ -219,6 +222,7 @@ export async function writeStoryboardReferenceOutputs(result, rootDir = process.
219
222
  const written = [];
220
223
  const planPath = join(outputRoot, "storyboard-reference-plan.json");
221
224
  const projectInfoPath = join(outputRoot, "project-info.md");
225
+ const storyboardPromptAliasPath = join(outputRoot, "storyboard-prompt.md");
222
226
  const qaPath = join(outputRoot, "reports", "STORYBOARD-REFERENCE-QA.md");
223
227
  await writeText(planPath, `${JSON.stringify(result.plan, null, 2)}\n`);
224
228
  written.push(planPath);
@@ -234,6 +238,8 @@ export async function writeStoryboardReferenceOutputs(result, rootDir = process.
234
238
  - Safety context: ${result.request.safetyContext}
235
239
  `);
236
240
  written.push(projectInfoPath);
241
+ await writeText(storyboardPromptAliasPath, renderStoryboardPromptAlias(result));
242
+ written.push(storyboardPromptAliasPath);
237
243
  for (const prompt of result.characterReferenceSheetPrompts) {
238
244
  const promptPath = resolve(rootDir, prompt.outputPath);
239
245
  await writeText(promptPath, renderCharacterSheetPrompt(prompt));
@@ -42,10 +42,16 @@ function resolvePromptAdapter(model) {
42
42
  }
43
43
  return adapter;
44
44
  }
45
- function getStoryboardPanelCount(request, phaseBudget) {
46
- return request.storyboardPanelCountHint
47
- ?? request.shotCountHint
48
- ?? phaseBudget.recommendedMaxPhases;
45
+ const MAX_STORYBOARD_SHEET_PANELS = 12;
46
+ function getStoryboardSheetPanelCount(request, phaseBudget) {
47
+ const panelCount = request.storyboardPanelCountHint ?? phaseBudget.recommendedMaxPhases;
48
+ if (panelCount > MAX_STORYBOARD_SHEET_PANELS) {
49
+ throw new Error(`Invalid storyboardPanelCountHint. Expected 1-${MAX_STORYBOARD_SHEET_PANELS} panels for one GPT Image 2 storyboard sheet.`);
50
+ }
51
+ return panelCount;
52
+ }
53
+ function getVideoPhaseCount(request, phaseBudget) {
54
+ return request.shotCountHint ?? phaseBudget.recommendedMaxPhases;
49
55
  }
50
56
  function buildShotId(index) {
51
57
  return `SHOT${String(index + 1).padStart(2, "0")}`;
@@ -172,37 +178,37 @@ function buildStoryboardImagePrompt(input) {
172
178
  ? `Use external storyboard guide tokens ${assets.storyboards.map(storyboard => storyboard.token).join(", ")} only for composition, blocking, camera direction, timing, and action rhythm.`
173
179
  : "No external storyboard guide is required; infer the board from the screenplay brief, continuity notes, and visual world.";
174
180
  const phaseDirection = interpretation.phases
175
- .map(phase => `Panel ${phase.index}: ${phase.job}; ${phase.subjectAction}; camera behavior: ${phase.cameraBehavior}; background behavior: ${phase.backgroundBehavior}.`)
181
+ .map(phase => `Phase ${phase.index}: ${phase.job}; ${phase.subjectAction}; camera behavior: ${phase.cameraBehavior}; background behavior: ${phase.backgroundBehavior}.`)
176
182
  .join(" ");
177
183
  const continuityStyle = interpretation.phases.length <= 1
178
184
  ? "Because this is a single uninterrupted beat, show one decisive action moment with a clear entry pose, motion direction, and final body intention inside the same panel."
179
- : "Read panels left-to-right, top-to-bottom as a planned visual beat sequence. Each panel must show a distinct body pose, camera size/angle, movement logic, and emotional escalation, not decorative micro-poses.";
185
+ : `Read panels left-to-right, top-to-bottom as a planned visual beat sequence. Create ${input.storyboardSheetPanelCount} distinct beat snapshot${input.storyboardSheetPanelCount === 1 ? "" : "s"} distributed across the video phases. Each panel must show a distinct body pose, camera size/angle, movement logic, and emotional escalation, not decorative micro-poses.`;
180
186
  return {
181
187
  shotId,
182
188
  outputPath: `${request.outputDir}/storyboard-prompts/${shotId}-GPT-IMAGE-2-STORYBOARD.md`,
183
189
  provider: "gpt-image-2",
184
190
  aspectRatio: "16:9",
185
- panelCount: interpretation.panelCount,
191
+ panelCount: input.storyboardSheetPanelCount,
186
192
  style: "professional-production-storyboard",
187
193
  characterSheetIds,
188
194
  externalStoryboardGuideIds,
189
195
  previousShotHandoff: input.previousShotHandoff,
190
196
  nextShotHandoff: input.nextShotHandoff,
191
- promptText: `REFERENCE LOCK: Use the generated character sheet reference${characterReferenceSheetPrompts.length === 1 ? "" : "s"} (${sheetRefs}) as the only source for character identity, face, hair, body proportions, wardrobe, accessories, material behavior, and visible props.
197
+ promptText: `REFERENCE LOCK: Use the generated character sheet reference${characterReferenceSheetPrompts.length === 1 ? "" : "s"} (${sheetRefs}) as the only source for character identity, face, hair, skin texture, body proportions, wardrobe, accessories, material behavior, and visible props.
192
198
 
193
199
  Keep same: every character identity detail from the character sheet${characterReferenceSheetPrompts.length === 1 ? "" : "s"}, the declared visual world, screen direction, environmental continuity, lighting direction, prop continuity, and shot handoff logic. Storyboard text, arrows, labels, panel borders, watermarks, logos, and alternate character designs are never identity sources.
194
200
 
195
- Change only: create a professional 16:9 production storyboard page for ${shotId} with exactly ${interpretation.panelCount} cinematic panel${interpretation.panelCount === 1 ? "" : "s"}. The storyboard controls composition, blocking, camera direction, timing, phase order, action rhythm, and emotional progression only. ${externalGuideText}
201
+ Change only: create a raw cinematic storyboard sheet for ${shotId}. 16:9 storyboard sheet, exactly ${input.storyboardSheetPanelCount} cinematic panel${input.storyboardSheetPanelCount === 1 ? "" : "s"}. The storyboard controls composition, blocking, camera direction, timing, phase order, action rhythm, and emotional progression only. ${externalGuideText}
196
202
 
197
- Storyboard drawing style: raw contemporary film storyboard, black-and-white rough pencil linework for the artwork only, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished choreography-previsualization feel, not polished concept art or final render.
203
+ Storyboard drawing style: raw contemporary film storyboard with black-and-white rough pencil linework. The actual storyboard drawings must be black-and-white only: rough pencil lines, minimal detail, fast gesture drawing energy, simple anatomy construction, strong silhouette readability, lightweight unfinished choreography previs, not polished concept art or final render.
198
204
 
199
205
  Panel direction: ${continuityStyle} The scene brief is: ${request.brief} Previous handoff: ${input.previousShotHandoff}. Next handoff: ${input.nextShotHandoff}. Planned panel actions: ${phaseDirection}
200
206
 
201
- Camera and staging: show ${interpretation.cameraPlan.framing}, ${interpretation.cameraPlan.movement}, ${interpretation.cameraPlan.lens}; preserve ${interpretation.cameraPlan.screenDirection}. Use cinematic camera variety only when motivated by the beat: handheld energy, push-in, orbit, overhead, low angle, side silhouette, insert, aggressive close-up, long-lens compression, or extreme negative space. Maintain the same environment, lighting, atmosphere, foreground, midground, and background continuity: ${interpretation.visualWorld.environment}; ${interpretation.visualWorld.lighting}; ${interpretation.visualWorld.foreground}; ${interpretation.visualWorld.midground}; ${interpretation.visualWorld.background}; ${interpretation.visualWorld.atmosphere}.
207
+ Camera and staging: show ${interpretation.cameraPlan.framing}, ${interpretation.cameraPlan.movement}, ${interpretation.cameraPlan.lens}; preserve ${interpretation.cameraPlan.screenDirection}. Use cinematic arthouse camerawork with handheld energy, whip pans, orbit movement, overhead shots, low angles, side silhouettes, aggressive close-ups, long lens compression, inserts, and extreme negative space whenever motivated by the beat. Maintain the same environment, lighting, atmosphere, foreground, midground, and background continuity: ${interpretation.visualWorld.environment}; ${interpretation.visualWorld.lighting}; ${interpretation.visualWorld.foreground}; ${interpretation.visualWorld.midground}; ${interpretation.visualWorld.background}; ${interpretation.visualWorld.atmosphere}.
202
208
 
203
209
  Annotation color system: red arrows for body movement, blue arrows for camera movement, green marks for framing/composition, orange marks for lighting direction, purple marks for vocal or emotional emphasis when relevant, black text only for very short lens notes and panel labels. No timestamps.
204
210
 
205
- Every panel must contain visible momentum or clear behavioral change: gaze shift, breath, weight transfer, contact with ground/prop, fabric motion, hand tension, or a readable pose transition. Keep the location minimal and readable.
211
+ Every panel must contain visible momentum. Every panel must contain visible motion, strong body momentum, or clear behavioral change: gaze shift, breath, weight transfer, contact with ground/prop, fabric motion, hand tension, floor contact, hair or clothing motion, or a readable pose transition. Avoid static standing poses unless explicitly required by the beat. Keep the location minimal and readable. End with one overwhelming final readable movement pose or composition that preserves the shot's emotional endpoint.
206
212
 
207
213
  Avoid: identity drift, face drift, hair drift, wardrobe drift, prop drift, material drift, alternate character design, static standing poses unless explicitly required by the beat, timestamps, long text notes, storyboard text becoming scene text, new characters, new locations, logos, watermarks, decorative borders, broken perspective, impossible contact or weight, inconsistent screen direction, inconsistent light direction, photorealistic final-render polish, cartoon style, anime style, CGI look, unsafe public-figure likeness, trademarked branding.`
208
214
  };
@@ -291,6 +297,45 @@ function buildProviderReferenceTokens(providerAssetMapping) {
291
297
  audioReference: "@audio1"
292
298
  };
293
299
  }
300
+ function buildStoryboardCreationMetadata(request, storyboardImagePrompt, providerAssetMapping) {
301
+ const storyboardEntry = Object.values(providerAssetMapping)
302
+ .find(entry => entry.role === "storyboard_plan");
303
+ return {
304
+ provider: "gpt-image-2",
305
+ prompt_path: storyboardImagePrompt.outputPath,
306
+ alias_path: `${request.outputDir}/storyboard-prompt.md`,
307
+ source_mode: storyboardImagePrompt.externalStoryboardGuideIds.length > 0
308
+ ? "generated-with-external-guide"
309
+ : "generated",
310
+ panel_count: storyboardImagePrompt.panelCount,
311
+ reading_order: "left-to-right, top-to-bottom",
312
+ character_sheet_ids: storyboardImagePrompt.characterSheetIds,
313
+ external_storyboard_guide_ids: storyboardImagePrompt.externalStoryboardGuideIds,
314
+ seedance_token: storyboardEntry?.token ?? "@Image2",
315
+ annotation_policy: {
316
+ rendered_in_video: false,
317
+ color_system: {
318
+ red: "body movement",
319
+ blue: "camera movement",
320
+ green: "framing / composition",
321
+ orange: "lighting direction",
322
+ purple: "vocal / emotional emphasis",
323
+ black: "short lens notes and panel labels"
324
+ },
325
+ forbidden_in_video: [
326
+ "arrows",
327
+ "annotation marks",
328
+ "lens notes",
329
+ "panel labels",
330
+ "timestamps",
331
+ "panel borders",
332
+ "watermark",
333
+ "logo"
334
+ ]
335
+ },
336
+ prompt_text: storyboardImagePrompt.promptText
337
+ };
338
+ }
294
339
  function buildStoryboardReferencePolicy(request, phaseBudget, providerFileLimits, bundles, providerReferenceTokens, maxPhases, splitRequired) {
295
340
  const continuityModes = Array.from(new Set(bundles.map(bundle => bundle.continuityMode)));
296
341
  return {
@@ -325,9 +370,9 @@ function buildStoryboardReferencePolicy(request, phaseBudget, providerFileLimits
325
370
  provider: "gpt-image-2",
326
371
  generated_per_shot: true,
327
372
  aspect_ratio: "16:9",
328
- max_panels_per_shot: maxPhases,
373
+ max_panels_per_shot: MAX_STORYBOARD_SHEET_PANELS,
329
374
  panel_budget: phaseBudget.policy,
330
- professional_prompt_target_words: "160-240 words per shot storyboard prompt"
375
+ professional_prompt_target_words: "240-420 words per shot storyboard prompt"
331
376
  },
332
377
  role_separation: {
333
378
  character_identity: `${providerReferenceTokens.characterIdentities.join(", ")} control identity, face, hair, body proportions, wardrobe, accessories, and visible props.`,
@@ -376,15 +421,16 @@ export function buildStoryboardReferencePromptBundles(input) {
376
421
  const voiceCast = buildVoiceCast(request);
377
422
  const phaseBudget = buildStoryboardPhaseBudget(request.durationSeconds, request.storyboardReferenceMode.maxStoryboardPhases);
378
423
  const providerFileLimits = buildProviderFileLimitReport(request, characterReferenceSheetPrompts.length + 1);
379
- const panelCount = getStoryboardPanelCount(request, phaseBudget);
424
+ const storyboardSheetPanelCount = getStoryboardSheetPanelCount(request, phaseBudget);
425
+ const videoPhaseCount = getVideoPhaseCount(request, phaseBudget);
380
426
  const maxPhases = phaseBudget.effectiveMaxStoryboardPhases;
381
- const splitRequired = panelCount > maxPhases;
427
+ const splitRequired = videoPhaseCount > maxPhases;
382
428
  if (splitRequired && !request.storyboardReferenceMode.splitStoryboardOverload) {
383
- throw new Error(`Storyboard has ${panelCount} phases, which exceeds maxStoryboardPhases=${maxPhases}. Enable splitStoryboardOverload or split the storyboard manually.`);
429
+ throw new Error(`Storyboard has ${videoPhaseCount} video phases, which exceeds maxStoryboardPhases=${maxPhases}. Enable splitStoryboardOverload or split the storyboard manually.`);
384
430
  }
385
431
  const phaseCounts = splitRequired && request.storyboardReferenceMode.splitStoryboardOverload
386
- ? getSplitPhaseCounts(panelCount, maxPhases)
387
- : [Math.min(panelCount, maxPhases)];
432
+ ? getSplitPhaseCounts(videoPhaseCount, maxPhases)
433
+ : [Math.min(videoPhaseCount, maxPhases)];
388
434
  const generatedAt = new Date().toISOString();
389
435
  const bundles = [];
390
436
  let previousShotHandoff = "Project opening: start from the screenplay's first visual beat.";
@@ -402,11 +448,13 @@ export function buildStoryboardReferencePromptBundles(input) {
402
448
  assets,
403
449
  shotId,
404
450
  interpretation,
451
+ storyboardSheetPanelCount,
405
452
  characterReferenceSheetPrompts,
406
453
  previousShotHandoff,
407
454
  nextShotHandoff: handoffNote.exitHandoff
408
455
  });
409
456
  const providerAssetMapping = buildProviderAssetMapping(assets, characterReferenceSheetPrompts, storyboardImagePrompt);
457
+ const storyboard_creation = buildStoryboardCreationMetadata(request, storyboardImagePrompt, providerAssetMapping);
410
458
  const referenceAssetRequirements = buildReferenceAssetRequirements(providerAssetMapping);
411
459
  const modelPrompts = buildModelPrompts(request, {
412
460
  assets,
@@ -431,6 +479,7 @@ export function buildStoryboardReferencePromptBundles(input) {
431
479
  providerFileLimits,
432
480
  handoffNote,
433
481
  storyboardImagePrompt,
482
+ storyboard_creation,
434
483
  referenceAssetRequirements,
435
484
  providerAssetMapping,
436
485
  qa: { verdict: "pass", checks: {}, issues: [], splitRequired },
@@ -135,6 +135,30 @@ export interface StoryboardImagePrompt {
135
135
  nextShotHandoff: string;
136
136
  promptText: string;
137
137
  }
138
+ export interface StoryboardCreationMetadata {
139
+ provider: "gpt-image-2";
140
+ prompt_path: string;
141
+ alias_path: string;
142
+ source_mode: "generated" | "generated-with-external-guide";
143
+ panel_count: number;
144
+ reading_order: "left-to-right, top-to-bottom";
145
+ character_sheet_ids: string[];
146
+ external_storyboard_guide_ids: string[];
147
+ seedance_token: string;
148
+ annotation_policy: {
149
+ rendered_in_video: false;
150
+ color_system: {
151
+ red: "body movement";
152
+ blue: "camera movement";
153
+ green: "framing / composition";
154
+ orange: "lighting direction";
155
+ purple: "vocal / emotional emphasis";
156
+ black: "short lens notes and panel labels";
157
+ };
158
+ forbidden_in_video: string[];
159
+ };
160
+ prompt_text: string;
161
+ }
138
162
  export type ProviderAssetMappingRole = "character_identity" | "storyboard_plan" | "style_reference" | "camera_reference" | "action_reference" | "prop_reference";
139
163
  export interface ProviderAssetMappingEntry {
140
164
  token: string;
@@ -254,6 +278,7 @@ export interface PromptBundle {
254
278
  providerFileLimits: ProviderFileLimitReport;
255
279
  handoffNote: ShotHandoffNote;
256
280
  storyboardImagePrompt: StoryboardImagePrompt;
281
+ storyboard_creation: StoryboardCreationMetadata;
257
282
  referenceAssetRequirements: ReferenceAssetRequirement[];
258
283
  providerAssetMapping: Record<string, ProviderAssetMappingEntry>;
259
284
  qa: PromptBundleQa;
@@ -113,6 +113,10 @@ export function validatePromptBundle(bundle, assets, voiceCast = []) {
113
113
  hasCharacterReference: assets.characters.length >= 1,
114
114
  hasStoryboardReference: assets.storyboards.length >= 1 || Boolean(bundle.storyboardImagePrompt),
115
115
  hasStoryboardImagePrompt: Boolean(bundle.storyboardImagePrompt?.promptText.trim()),
116
+ hasStoryboardCreationMetadata: Boolean(bundle.storyboard_creation?.prompt_text.trim())
117
+ && bundle.storyboard_creation?.prompt_path === bundle.storyboardImagePrompt.outputPath
118
+ && bundle.storyboard_creation?.panel_count === bundle.storyboardImagePrompt.panelCount
119
+ && bundle.storyboard_creation?.annotation_policy.rendered_in_video === false,
116
120
  storyboardPromptHasReferenceLockStructure: hasGptImageStillPromptContract(bundle.storyboardImagePrompt?.promptText ?? ""),
117
121
  hasAvoidLineEverywhere: Object.values(bundle.modelPrompts).every(output => Boolean(output) && hasAvoidOrNegativePrompt(output.promptText)),
118
122
  storyboardPromptHasAvoidLine: hasAvoidOrNegativePrompt(bundle.storyboardImagePrompt?.promptText ?? ""),
@@ -35,7 +35,7 @@ function buildStoryboardPlatformGuard(config) {
35
35
  - Do not generate main-shot \`ILK FRAME\`, \`İLK FRAME\`, or \`SON FRAME\` sections.
36
36
  - Do not use exact first-frame reuse instructions, \`SHOTNN_START\`, \`SHOTNN_END\`, or mandatory Start+End transition fields.
37
37
  - If no character reference is available through the user, an in-context image, \`--character-ref\`, or \`refs/character.png\`, stop and request one.
38
- - Required storyboard outputs: \`${config.outputDir}/storyboard-reference-plan.json\`, \`${config.outputDir}/reference-prep/\`, \`${config.outputDir}/storyboard-prompts/\`, \`${config.outputDir}/prompt-bundles/\`, \`${config.outputDir}/shots/SHOTNN.md\`, and \`${config.outputDir}/reports/STORYBOARD-REFERENCE-QA.md\`.
38
+ - Required storyboard outputs: \`${config.outputDir}/storyboard-reference-plan.json\`, \`${config.outputDir}/storyboard-prompt.md\`, \`${config.outputDir}/reference-prep/\`, \`${config.outputDir}/storyboard-prompts/\`, \`${config.outputDir}/prompt-bundles/\`, \`${config.outputDir}/shots/SHOTNN.md\`, and \`${config.outputDir}/reports/STORYBOARD-REFERENCE-QA.md\`.
39
39
  `;
40
40
  }
41
41
  function buildSeedanceProfile(active, storyboardReferenceActive = false, maxStoryboardPhases = 4) {
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milenyumai/film-kit",
3
- "version": "2.3.4",
3
+ "version": "2.3.5",
4
4
  "description": "Single-package Film-Kit distribution with preset-driven cinematic runtime setup for OpenAI Codex App, Claude Code, Cursor, Copilot, and Antigravity.",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.
@@ -205,7 +205,7 @@ function buildStoryboardReferencePolicyJson(config) {
205
205
  aspect_ratio: "16:9",
206
206
  panel_budget: "4-6s: 1-2, 7-10s: 2-3, 11-15s: 3-4",
207
207
  max_panels_per_shot: config.storyboardReferenceMode.maxStoryboardPhases,
208
- target_words: "160-240 words per shot storyboard prompt"
208
+ target_words: "240-420 words per shot storyboard prompt"
209
209
  },
210
210
  material_roles: {
211
211
  "character_sheet_tokens": "identity, face, body proportions, wardrobe, accessories, and visible props",
@@ -253,7 +253,7 @@ function buildShotFileOutputContract(config) {
253
253
  return `1. main shot blocks: \`MODEL CONTROL\`, \`INPUT ASSET ROLES\`, \`REFERENCE ASSET REQUIREMENTS\`, \`GPT IMAGE 2 STORYBOARD PROMPT\`, \`STORYBOARD PLAN\`, \`AUDIO PLAN\`, \`SEEDANCE VIDEO PROMPT\`, and coverage
254
254
  2. \`INPUT ASSET ROLES\` must declare generated character sheet tokens (\`@Image1...\`, legacy \`@image1...\`) as identity/wardrobe/props only
255
255
  3. \`INPUT ASSET ROLES\` must declare the generated shot storyboard token (next \`@Image\` after character sheets, legacy lowercase alias such as \`@image2\` for one character) as composition/blocking/camera/timing only
256
- 4. \`GPT IMAGE 2 STORYBOARD PROMPT\` must be 16:9, professional production storyboard style, 160-240 words, and use character sheets as the only identity source
256
+ 4. \`GPT IMAGE 2 STORYBOARD PROMPT\` must be 16:9, professional production storyboard style, 240-420 words, use character sheets as the only identity source, and may use 1-12 storyboard sheet panels without forcing SHOT split
257
257
  5. \`STORYBOARD PLAN\` must include timeline phases for this shot, capped at ${config.storyboardReferenceMode.maxStoryboardPhases} phases
258
258
  6. every phase must derive from the shared \`team-plan.json -> visual_world\` and include its handoff from the previous shot and handoff to the next shot
259
259
  7. 2-3 coverage sub-shots stay in the same file
@@ -285,9 +285,9 @@ function buildSeedanceStoryboardContract(config) {
285
285
  - declare character sheet tokens (\`@Image1...\`, legacy \`@image1...\`) as identity, face, body proportions, wardrobe, accessories, and visible props
286
286
  - declare the generated shot storyboard token (next \`@Image\` after character sheets, legacy lowercase alias such as \`@image2\` for one character) as composition, blocking, camera direction, timing, and action progression only
287
287
  - never let storyboard text, panel borders, watermark, logo, alternate character design, or storyboard character design override the identity reference
288
- - write one \`GPT IMAGE 2 STORYBOARD PROMPT\` per shot before the Seedance prompt; it must be 16:9, professional, 160-240 words, and continuity-aware
288
+ - write one \`GPT IMAGE 2 STORYBOARD PROMPT\` per shot before the Seedance prompt; it must be 16:9, professional, 240-420 words, continuity-aware, and written as the storyboard bootstrap prompt when no external storyboard image exists
289
289
  - write per-shot timeline phases under \`STORYBOARD PLAN\`, capped at ${config.storyboardReferenceMode.maxStoryboardPhases} phases
290
- - follow duration budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases; split 5+ phases into separate \`SHOTNN.md\` files
290
+ - follow video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases; split 5+ real video phases, scene changes, or location/action blocks into separate \`SHOTNN.md\` files; 5-12 storyboard sheet panels alone do not force a split
291
291
  - use \`No scene cuts throughout, one continuous shot.\` only when that shot's storyboard plan is a single uninterrupted camera move
292
292
  - for multi-phase storyboard shots, describe the planned phase changes directly instead of forcing continuous-shot wording
293
293
  - when continuing a source clip, use \`Extend @video1 by [N]s\` and still preserve storyboard handoff continuity`;
@@ -21,7 +21,7 @@ function buildReferenceModeSummary(config) {
21
21
  return `- Reference mode: \`storyboard-reference\`
22
22
  - Storyboard reference mode: enabled
23
23
  - Max storyboard phases per shot: ${config.storyboardReferenceMode.maxStoryboardPhases}
24
- - Recommended phase budget: 4-6s = 1-2, 7-10s = 2-3, 11-15s = 3-4; split 5+ phases
24
+ - Recommended video phase budget: 4-6s = 1-2, 7-10s = 2-3, 11-15s = 3-4; split 5+ real video phases, not 5-12 storyboard sheet panels
25
25
  - Provider reference tokens: generated character sheet tokens first, generated shot storyboard token next
26
26
  - Start/end frame chaining contract: disabled for Seedance storyboard-reference`;
27
27
  }
@@ -58,7 +58,7 @@ Seedance 2.0 responds best when you assign **explicit multimodal control roles**
58
58
  ${storyboardReferenceActive
59
59
  ? `- Storyboard-reference mode is active: generate one 16:9 GPT Image 2 character sheet prompt per character first; those sheet images lock identity/wardrobe/props
60
60
  - Each SHOTNN.md includes a GPT IMAGE 2 STORYBOARD PROMPT plus a per-shot STORYBOARD PLAN; the generated storyboard token controls only composition, blocking, camera direction, timing, and action progression
61
- - Duration budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases; split 5+ phases into separate SHOTNN.md files
61
+ - Duration budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases; split 5+ real video phases into separate SHOTNN.md files, while 5-12 storyboard sheet panels may remain one shot
62
62
  - Storyboard text, panel borders, watermark, logo, and alternate character design are never identity sources
63
63
  - Do not require ILK FRAME / SON FRAME sections or exact first-frame reuse text in Seedance storyboard-reference mode
64
64
  - Use "No scene cuts throughout, one continuous shot." only when the shot's storyboard plan is actually one uninterrupted camera move`
@@ -313,8 +313,8 @@ export function buildMultiProjectFiles(config) {
313
313
  - \`storyboard_reference.enabled\`: ${storyboardReferenceActive ? "true" : "false"}
314
314
  - \`storyboard_reference.max_storyboard_phases\`: ${config.storyboardReferenceMode.maxStoryboardPhases}
315
315
  - \`storyboard_reference.character_reference_sheets\`: ${storyboardReferenceActive ? "GPT Image 2, 16:9, generated once per character" : "n/a"}
316
- - \`storyboard_reference.storyboard_prompt_policy\`: ${storyboardReferenceActive ? "GPT Image 2, 16:9, generated per shot, 160-240 words" : "n/a"}
317
- - \`storyboard_reference.recommended_phase_budget\`: ${storyboardReferenceActive ? "`4-6s: 1-2`, `7-10s: 2-3`, `11-15s: 3-4`, split 5+ phases" : "n/a"}
316
+ - \`storyboard_reference.storyboard_prompt_policy\`: ${storyboardReferenceActive ? "GPT Image 2, 16:9, generated per shot, 240-420 words, 1-12 sheet panels" : "n/a"}
317
+ - \`storyboard_reference.recommended_phase_budget\`: ${storyboardReferenceActive ? "`4-6s: 1-2`, `7-10s: 2-3`, `11-15s: 3-4`, split 5+ real video phases" : "n/a"}
318
318
  - \`storyboard_reference.provider_reference_tokens\`: ${storyboardReferenceActive ? "generated character sheet tokens first; generated shot storyboard token next" : "n/a"}
319
319
  - \`storyboard_reference.continuity_mode\`: ${storyboardReferenceActive ? "`continuous-shot` or `multi-shot-storyboard`" : "n/a"}
320
320
  - \`storyboard_reference.provider_file_limits\`: ${storyboardReferenceActive ? "9 images, 3 videos, 3 audio, 12 total files, 4-15s duration" : "n/a"}
@@ -353,7 +353,7 @@ SPATIAL PRIORITY: [who looks at what, which plane dominates, shared light source
353
353
  SEMANTIC WORLD: [camera height, lens family, horizon/vanishing logic, camera movement strategy, light source, shadow direction, scale map, reflection risk, physics constraints]
354
354
  RESPECT LOCKED SHOT COUNT: Do not create any shot outside SHOT[X]-SHOT[Y]
355
355
  KLING DEFAULT: single-transition first; custom storyboard only for 2-4 meaningful phases, max 4
356
- ${storyboardReferenceActive ? `SEEDANCE STORYBOARD-REFERENCE: Each SHOTNN.md includes INPUT ASSET ROLES, REFERENCE ASSET REQUIREMENTS, GPT IMAGE 2 STORYBOARD PROMPT, STORYBOARD PLAN, AUDIO PLAN, SEEDANCE VIDEO PROMPT, and coverage. Do not require ILK FRAME / SON FRAME. Max storyboard phases per shot: ${config.storyboardReferenceMode.maxStoryboardPhases}. Character sheet tokens lock identity; generated shot storyboard token controls staging only.` : ""}
356
+ ${storyboardReferenceActive ? `SEEDANCE STORYBOARD-REFERENCE: Each SHOTNN.md includes INPUT ASSET ROLES, REFERENCE ASSET REQUIREMENTS, GPT IMAGE 2 STORYBOARD PROMPT, STORYBOARD PLAN, AUDIO PLAN, SEEDANCE VIDEO PROMPT, and coverage. Do not require ILK FRAME / SON FRAME. Max video phases per shot: ${config.storyboardReferenceMode.maxStoryboardPhases}. Character sheet tokens lock identity; generated shot storyboard token controls staging only and may contain up to 12 sheet panels.` : ""}
357
357
  ONE FILE PER SHOT: Each SHOTNN.md contains main shot + all coverage.
358
358
  FILE OWNERSHIP: Write only your assigned SHOT files and your own batch report.
359
359
  VOICE CONTRACT: Reuse ${config.outputDir}/team-plan.json -> \`voiceCast\` and keep one active speaker per shot.
@@ -421,7 +421,7 @@ ${storyboardReferenceActive
421
421
  ? `- Main shot contains: \`MODEL CONTROL\`, \`INPUT ASSET ROLES\`, \`REFERENCE ASSET REQUIREMENTS\`, \`GPT IMAGE 2 STORYBOARD PROMPT\`, \`STORYBOARD PLAN\`, \`AUDIO PLAN\`, \`SEEDANCE VIDEO PROMPT\`, and coverage
422
422
  - \`INPUT ASSET ROLES\` declares generated character sheet tokens (\`@Image1...\`, legacy \`@image1...\`) as identity/wardrobe/props
423
423
  - \`INPUT ASSET ROLES\` declares generated shot storyboard token (next \`@Image\`, legacy lowercase alias such as \`@image2\` for one character) as composition/blocking/camera/timing only
424
- - \`GPT IMAGE 2 STORYBOARD PROMPT\` is 16:9, 160-240 words, professional storyboard style, and uses character sheets as the only identity source
424
+ - \`GPT IMAGE 2 STORYBOARD PROMPT\` is 16:9, 240-420 words, professional storyboard style, supports 1-12 sheet panels, and uses character sheets as the only identity source
425
425
  - \`STORYBOARD PLAN\` includes per-shot timeline phases capped at ${config.storyboardReferenceMode.maxStoryboardPhases}
426
426
  - Shot storyboard plans must derive from one shared \`${config.outputDir}/team-plan.json -> visual_world\`
427
427
  - Do not require \`ILK FRAME\` / \`SON FRAME\` assets or exact first-frame reuse text in this mode`
@@ -1004,8 +1004,8 @@ Run the Film-Kit Multi pipeline with maximum throughput while preserving ${isSee
1004
1004
  - set \`storyboard_reference.enabled\` to ${isSeedanceStoryboardReference(config) ? "true" : "false"}
1005
1005
  ${isSeedanceStoryboardReference(config) ? ` - set \`storyboard_reference.max_storyboard_phases\` to ${config.storyboardReferenceMode.maxStoryboardPhases}
1006
1006
  - set \`storyboard_reference.character_reference_sheets\` to GPT Image 2, 16:9, generated once per character
1007
- - set \`storyboard_reference.storyboard_prompt_policy\` to GPT Image 2, 16:9, generated per shot, 160-240 words
1008
- - set \`storyboard_reference.recommended_phase_budget\` to 4-6s=1-2, 7-10s=2-3, 11-15s=3-4, split 5+
1007
+ - set \`storyboard_reference.storyboard_prompt_policy\` to GPT Image 2, 16:9, generated per shot, 240-420 words, 1-12 sheet panels
1008
+ - set \`storyboard_reference.recommended_phase_budget\` to 4-6s=1-2, 7-10s=2-3, 11-15s=3-4, split 5+ real video phases
1009
1009
  - set \`storyboard_reference.provider_reference_tokens\` to generated character sheet tokens first and generated shot storyboard token next
1010
1010
  - set \`storyboard_reference.continuity_mode\` per shot as continuous-shot or multi-shot-storyboard
1011
1011
  - set \`storyboard_reference.provider_file_limits\` to 9 images, 3 videos, 3 audio, 12 total files, 4-15s duration
@@ -1062,7 +1062,7 @@ OUTPUT DIR: ${config.outputDir}/shots/
1062
1062
  REPORT FILE: ${config.outputDir}/reports/BATCH-REPORT-B[NN].md
1063
1063
  SPATIAL PRIORITY: [who looks at what, which plane dominates, shared light source]
1064
1064
  SEMANTIC WORLD: [camera height, lens family, horizon/vanishing logic, camera movement strategy, light source, shadow direction, scale map, reflection risk, physics constraints]
1065
- ${isSeedanceStoryboardReference(config) ? `SEEDANCE STORYBOARD-REFERENCE: Declare generated character sheet tokens (@Image1..., legacy @image1...) for identity and the generated shot storyboard token (next @Image, legacy lowercase alias such as @image2 for one character) for staging only. Include GPT IMAGE 2 STORYBOARD PROMPT and per-shot STORYBOARD PLAN phases, max ${config.storyboardReferenceMode.maxStoryboardPhases}. Do not require ILK FRAME / SON FRAME.` : ""}
1065
+ ${isSeedanceStoryboardReference(config) ? `SEEDANCE STORYBOARD-REFERENCE: Declare generated character sheet tokens (@Image1..., legacy @image1...) for identity and the generated shot storyboard token (next @Image, legacy lowercase alias such as @image2 for one character) for staging only. Include GPT IMAGE 2 STORYBOARD PROMPT with 1-12 sheet panels and per-shot STORYBOARD PLAN phases, max ${config.storyboardReferenceMode.maxStoryboardPhases}. Do not require ILK FRAME / SON FRAME.` : ""}
1066
1066
  RESPECT LOCKED SHOT COUNT: do not create extra shots outside the assigned range
1067
1067
 
1068
1068
  Generate only assigned SHOT files.
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.
@@ -13,7 +13,7 @@ Use this skill when the user provides:
13
13
  - a video brief or scenario text
14
14
  - optional external storyboard guide images
15
15
 
16
- The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. The generated shot storyboard is the staging reference for the final video model prompt.
16
+ The output is a production workflow, not only a video prompt. First create one reusable GPT Image 2 character sheet prompt per reference character. Then create one GPT Image 2 storyboard prompt per `SHOTNN.md`. If no external storyboard image is supplied, this generated prompt is the mandatory storyboard bootstrap step. The generated shot storyboard is the staging reference for the final video model prompt.
17
17
 
18
18
  ## Reference Prep
19
19
 
@@ -36,9 +36,10 @@ For each shot, generate a professional GPT Image 2 storyboard prompt:
36
36
 
37
37
  - provider: `gpt-image-2`
38
38
  - aspect ratio: `16:9`
39
- - panel budget: 4-6s = 1-2 panels, 7-10s = 2-3 panels, 11-15s = 3-4 panels
40
- - hard cap: max 4 panels/phases per shot unless the configured project cap is lower
41
- - split policy: 5+ distinct phases must become separate chained `SHOTNN.md` files
39
+ - storyboard sheet panel budget: default follows the duration-aware phase budget, but an explicit storyboard panel hint may request 1-12 panels in one GPT Image 2 storyboard sheet
40
+ - video phase budget: 4-6s = 1-2 phases, 7-10s = 2-3 phases, 11-15s = 3-4 phases
41
+ - hard cap: max 4 video phases per shot unless the configured project cap is lower
42
+ - split policy: 5+ distinct real video phases, scene changes, or location/action blocks must become separate chained `SHOTNN.md` files; 5-12 storyboard sheet panels alone do not force a split
42
43
  - target detail: dense professional storyboard direction, concrete blocking and camera language, no decorative prose
43
44
  - storyboard art grammar: black-and-white rough pencil drawings, minimal detail, rapid gesture energy, simple anatomy construction, strong silhouette readability, unfinished previsualization feel
44
45
  - annotation grammar: red arrows = body movement, blue arrows = camera movement, green marks = framing/composition, orange marks = lighting direction, purple marks = vocal/emotional emphasis, black text = very short lens notes and panel labels
@@ -108,6 +109,7 @@ Each shot file contains:
108
109
  - provider reference tokens
109
110
  - GPT Image 2 storyboard prompt
110
111
  - storyboard interpretation
112
+ - storyboard_creation metadata in `SHOTNN.bundle.json`
111
113
  - audio plan
112
114
  - prompt bundle for requested models
113
115
  - QA verdict
@@ -116,6 +118,7 @@ Generated files:
116
118
 
117
119
  ```text
118
120
  $OUTPUT_DIR/storyboard-reference-plan.json
121
+ $OUTPUT_DIR/storyboard-prompt.md
119
122
  $OUTPUT_DIR/reference-prep/CHARACTER-SHEET-*.md
120
123
  $OUTPUT_DIR/storyboard-prompts/SHOTNN-GPT-IMAGE-2-STORYBOARD.md
121
124
  $OUTPUT_DIR/prompt-bundles/SHOTNN.bundle.json
@@ -33,11 +33,12 @@ description: Generate character sheet prompts, per-shot GPT Image 2 storyboard p
33
33
  - exact identity, wardrobe, accessories, and visible props
34
34
  - no labels, text, logos, watermarks, alternate designs, or extra characters
35
35
  3. Confirm target models: `veo31`, `seedance-2.0`, `kling-3.0`, or a user-provided subset.
36
- 4. Select shot storyboard panel budget:
37
- - 4-6 seconds: 1-2 panels/phases
38
- - 7-10 seconds: 2-3 panels/phases
39
- - 11-15 seconds: 3-4 panels/phases
40
- - 5+ distinct phases: split into multiple `SHOTNN.md` files
36
+ 4. Select video phase budget and storyboard sheet panel count:
37
+ - 4-6 seconds: 1-2 video phases
38
+ - 7-10 seconds: 2-3 video phases
39
+ - 11-15 seconds: 3-4 video phases
40
+ - GPT Image 2 storyboard sheet may contain 1-12 panels
41
+ - 5+ distinct real video phases, scene changes, or location/action blocks: split into multiple `SHOTNN.md` files
41
42
  5. Build `visual_world`:
42
43
  - environment
43
44
  - lighting
@@ -89,7 +90,7 @@ npx @milenyumai/film-kit generate-storyboard \
89
90
  - Missing character reference: stop and request a valid reference.
90
91
  - Empty brief: stop and request a brief.
91
92
  - Public figure / real-person likeness / trademark risk: stop or safely anonymize before prompt generation.
92
- - 5+ storyboard phases: do not compress into one prompt; split shots.
93
+ - 5+ real video phases: do not compress into one prompt; split shots. 5-12 storyboard sheet panels alone do not force a split.
93
94
  - Missing GPT Image 2 character sheet prompt: output is invalid.
94
95
  - Missing GPT Image 2 per-shot storyboard prompt: output is invalid.
95
96
  - Missing `Avoid` / negative prompt: output is invalid.