---
name: B-Roll Director
slug: b-roll-director
category: AI Engineering
description: B-Roll Director turns a complete SRT and design into shot truth, semantic chapters, a visual system, motion map, and representative-scene choices. Use it when planning B-roll structure and creative proposals before editing or rendering.
github: "https://github.com/erduo1998-cell/erduo-broll-loop-engineering/tree/main/erduo-broll-loop-engineering/stages/broll-director"
language: TypeScript
stars: 168
forks: 31
install: "npx degit https://github.com/erduo1998-cell/erduo-broll-loop-engineering/tree/main/erduo-broll-loop-engineering/stages/broll-director ~/.claude/skills/broll-director"
installs_to: ~/.claude/skills/broll-director
source_path: erduo-broll-loop-engineering/stages/broll-director/SKILL.md
collection_size: 14
category_size: 3670
collection_url: "https://dirskills.com/collections/erduo1998-cell/erduo-broll-loop-engineering"
added: 2026-09-08T05:34:13.372Z
last_synced: 2026-09-08T05:34:13.372Z
canonical_url: "https://dirskills.com/skills/b-roll-director"
---

# B-Roll Director

B-Roll Director turns a complete SRT and design into shot truth, semantic chapters, a visual system, motion map, and representative-scene choices. Use it when planning B-roll structure and creative proposals before editing or rendering.

**Install:**

```bash
npx degit https://github.com/erduo1998-cell/erduo-broll-loop-engineering/tree/main/erduo-broll-loop-engineering/stages/broll-director ~/.claude/skills/broll-director
```

## README

# B-roll Director

Own meaning, semantic shot boundaries, chapter suggestions, and whole-film
direction. Do not collect media, choose runtime APIs, author source, render, or
review the finished film.

Read the complete original SRT and original design before dividing the film.
Neither may be replaced by a Director summary. Also read the task constraints,
optional user-media index, and at most two selected references. Do not reopen
the Parent Skill, other stage Skills, generic craft references, schemas,
validators, or catalogs. The injected Director charter and this exact contract
are complete.

## Direct truth and creative freedom

Use SRT integer milliseconds as time truth. Cover zero through the final cue
end, including gaps. Divide by complete meaning, then recommend contiguous
semantic chapters. A normal shot is about 5–12 seconds; a shot over 15 seconds
needs a content-driven `durationRationale`. Never write `authoring.solo` or make
the unit decision. Mark only the two closed technical risks when they are true;
the Parent Planner owns grouping.

Write every Recipe in two layers:

- `truth` is immutable downstream: source cues, spoken facts, audience outcome,
  readable result, exact time, chapter, and incoming/outgoing seam.
- `creativeProposal` is a strong proposal, not a locked implementation. The
  Chapter Builder may revise metaphor, objects, composition, motion, material
  route, and key states when a better answer preserves `truth`.

For abstract claims, decide whether a person, recognizable object, real
interface, generated metaphor, or mixed material makes the truth clearer. Do
not default everything to native structure. Select exactly one proposed route:
`native`, `provided`, `search`, `generate`, or `mixed`. Select two to four
genuinely relevant `craftIntent` values; they guide invention and are never a
score, checklist, or backend-routing signal.

Use `motion-map.json` only to expose adjacent repetition in content relation,
composition, entry, rhythm, and primary action. It must not become a shot
template. Three representative scenes must cover opening, information-dense,
and late positions and three visibly different content relationships.

## Exact JSON contract

This is the complete authoring contract. Every object is closed; write only the
listed keys. Strings are non-empty. IDs match
`^[A-Za-z0-9][A-Za-z0-9._-]*$`. Milliseconds are integers and every end is
greater than its start. Do not write `identity`; identity is Parent-owned.
Parent runs the official `validate-motion-map.mjs --finalize <01-director>`
command after Director handoff. Never guess or hand-author a canonical hash.

- `narrative-envelope.json`: `{schemaVersion:"1.0.0", filmId, window:{startMs,endMs}, premise, audienceJourney:[string,...], chapters:[{chapterId,window:{startMs,endMs},purpose},...], terms:[{term,meaning,factStatus,sourceLocator?},...]}`. Chapters close the film contiguously. `factStatus` is `provided|verified|research-required`.
- `visual-system.json`: `{schemaVersion:"1.0.0", conceptAngle, visualWorld, paletteRoles:[{role,value,use},...], typographyRoles:[{role,family,weight,use,sourceLocator},...], materials:[string,...], depthPlan:{background,midground,foreground}, compositionFamilies:[enum,...], motifSemantics:[{role,value,use},...], rhythmCurve:[{startMs,endMs,character},...], prohibitedLazyDefaults:[string,...], safeAreaPolicy}`. Use at least three distinct composition families; rhythm windows close the film contiguously.
- Each `shot-recipes/<shotId>.json`: `{schemaVersion:"4.0.0", shotId, truth:{chapterId,srtWindowMs:{startMs,endMs},sourceCues:[id,...],spokenFacts:[string,...],audienceOutcome,requiredReadableResult,incomingSeam,outgoingSeam}, creativeProposal:{metaphor,objects:[string,...],composition,motionIdea,materialRoute,keyStates:[string,...],whyThisCouldWork}, craftIntent:[enum,...], technicalRisks?:[enum,...], requiredCapabilities?:[capabilityId,...], capabilityReasons?:[{capabilityId,contentReason},...], durationRationale?:string, craft?:{primary?:{entryId,semanticReason},transition?:{entryId,semanticReason}}, patternRef?:{cardId,styleKey,sourceRevision,semanticReason,fallback:{when,strategy,preserve?:[string,...]}}, notes?:[string,...]}`. `shotId` equals the filename and the source cues/time stay inside the named narrative chapter. If capabilities are present, reasons cover them exactly once.
- `motion-map.json` draft: `{schemaVersion:"1.0.0", shots:[{shotId,contentRelation,primaryAction,compositionFamily,entryFamily,rhythm,settleMs},...]}`. Map every Recipe once.
- `representative-scenes.json` draft: `{schemaVersion:"1.0.0", scenes:[{shotId,coverage,reason,concerns:[enum,...]}, {shotId,coverage,reason,concerns:[enum,...]}, {shotId,coverage,reason,concerns:[enum,...]}]}`. Use each coverage once and collectively include all concerns.

Fixed enums:

- `incomingSeam` / `outgoingSeam`: `cut`, `match`, `handoff`.
- `creativeProposal.materialRoute`: `native`, `provided`, `search`, `generate`, `mixed`.
- `craftIntent` (choose 2–4): `staging`, `anticipation`, `pose-to-pose`, `follow-through-overlap`, `slow-in-slow-out`, `arcs`, `secondary-action`, `timing`, `exaggeration`, `spatial-coherence`, `appeal`, `squash-and-stretch`.
- `technicalRisks`: `exclusive-3d-webgl-gpu`, `external-project-toolchain`.
- `compositionFamily`: `full-bleed-material`, `spatial-path-workflow`, `object-kinetic-type`, `comparison-selection`, `desktop-instrument-board`, `data-diagram-evidence`, `camera-depth-environment`, `sparse-hold-chapter-outro`.
- fallback `strategy`: `simplify-motion`, `use-stable-state`, `substitute-material`, `return-to-director`, `stop-unsupported`.
- motion `contentRelation`: `compare`, `process`, `state-change`, `spatial`, `character`, `other`; `rhythm`: `calm`, `progressive`, `impact`, `mixed`.
- representative `coverage`: `opening`, `information-dense`, `late`; `concerns`: `composition`, `text`, `material`, `motion`.

`requiredCapabilities` may contain only:
`effects.dom-pixel-postprocess`, `semantic.integer-ms-window`,
`semantic.visual-state-transition`, `semantic.readable-hold`,
`motion.frame-driven-multiphase`, `motion.particles-or-physics`,
`motion.camera-3d`, `motion.mask-or-geometry-morph`,
`layout.dom-css-editorial`, `runtime.remotion-react-source`,
`runtime.hyperframes-seekable-source`, and `interop.pre-rendered-media`.
Never use `runtime.ambient-react-state`.

## Deliver

Write the narrative envelope, visual system, concise shot plan, one Recipe v4
per shot, motion-map draft, material requests, representative-scenes draft, and
minimal handoff under `01-director/`. Run only the assignment's validation and
official finalize commands; never read validators or invent hashing/checking
tools. If validation names a content field, repair that field.

Complete only when every `truth` follows the original SRT, every proposal is
visually actionable without locking implementation, chapter boundaries and
seams close, material routes remain honest and open, adjacent motion-map rows
do not collapse into one pattern, and three representatives are genuinely
different. Return drafts to Parent for identity finalization and planning.
Return the validated artifacts to
the Parent. The Parent finalizes identities first, then runs
`scripts/plan-runtime.mjs` directly.
