Three Phases of AI B-Roll: From Manual Beats to Vision-Authored Cutaways The AI ad platform's b-roll capability evolved through three phases, from manual beat markers to vision-authored cutaways. Phase 1 gave editors manual control, Phase 2 automated timing from reference videos, and Phase 3 generated cutaways with vision-authored prompts. The system uses a BrollBeat data model that supports incremental shipping via feature flags. B-roll is what makes a UGC testimonial feel edited rather than generated. The presenter talks to camera; cutaways show the product in hand, the label close-up, the lifestyle context. Without b-roll, AI ads read as a single static talking head — technically correct, emotionally flat. On the AI ad platform, b-roll capability did not arrive fully formed. It evolved through three deliberate phases inside the tool's scene planner, each solving the limitations of the last. Phase 1 gave editors control. Phase 2 automated timing from references. Phase 3 generated the cutaways themselves with vision-authored prompts. A power-user feature flag gated the progression so we could ship incrementally without breaking production swipe flows. B-roll is not decoration — it is narrative punctuation. The pipeline had to learn where to punctuate before it could learn what to show. Main-scene generation and b-roll generation are different problems. Person scenes need identity anchoring, motion transfer, and VO sync. B-roll cutaways need product visibility, pacing that matches the A-roll beat, and — critically — no competing human faces that confuse the viewer about who the protagonist is. Early swipe iterations treated b-roll as an afterthought: if the reference had cutaways, copy the timestamps; if not, skip them. Script-first UGC mode made that insufficient. Editors writing original scripts still needed cutaways, but had no reference timing to swipe. The three-phase arc was the structured response. | Phase | Editor action | System responsibility | Requires reference video? | |---|---|---|---| | Phase 1 | Manually mark b-roll beats on timeline | Insert placeholder cutaway slots | No | | Phase 2 | Review auto-placed beats | Extract b-roll timing from reference | Yes | | Phase 3 | Brief + approve generated cutaways | Vision-authored prompts + AI generation | No | Phase 1 shipped inside the tool's scene planner as cutaway beat markers. Editors scrubbed the A-roll timeline and dropped b-roll insertion points — the same mental model as marking ad breaks in a non-linear editor, simplified to click-to-insert. interface BrollBeat { id: string; insertAfterSceneId: string; offsetMs: number; // within-scene offset durationMs: number; // target cutaway length brief?: string; // optional editor hint source: 'manual'; } function insertManualBeat plan: ScenePlan, afterSceneId: string, offsetMs: number, : ScenePlan { const beat: BrollBeat = { id: generateId , insertAfterSceneId: afterSceneId, offsetMs, durationMs: DEFAULT BROLL DURATION MS, source: 'manual', }; return { ...plan, brollBeats: ...plan.brollBeats, beat }; } Phase 1 proved the data model. Every subsequent phase reuses BrollBeat — only the source field and prompt generation logic change. Beats could be inserted between scenes not just mid-scene , which mattered for script-first runs where scene boundaries align with script paragraphs rather than reference cuts. The limitation was obvious: manual placement scales poorly. A twelve-scene ad with three cutaways each meant thirty-six click decisions per run. Editors wanted the system to propose timing, not just slots. Phase 2 activated when a reference video existed. The analyzer extracted b-roll segments from the reference — moments where the camera cut away from the presenter to product or lifestyle footage — and the planner mapped those timestamps onto the generated A-roll timeline. The "swipe" metaphor is literal: b-roll timing swipes from reference to generated plan, adjusted for duration differences between reference VO and generated VO. interface ReferenceBrollSegment { startMs: number; endMs: number; classification: 'product' | 'lifestyle' | 'detail'; } function swipeBrollTiming referenceSegments: ReferenceBrollSegment , generatedPlan: ScenePlan, referenceDurationMs: number, generatedDurationMs: number, : BrollBeat { const scale = generatedDurationMs / referenceDurationMs; return referenceSegments.map seg = { id: generateId , insertAfterSceneId: mapTimestampToScene seg.startMs scale, generatedPlan , offsetMs: sceneLocalOffset seg.startMs scale, generatedPlan , durationMs: seg.endMs - seg.startMs scale, classification: seg.classification, source: 'reference-swipe', } ; } Phase 2 dramatically reduced editor labor on reference-first runs. It did nothing for script-first runs — which is exactly why Phase 3 existed. Phase 3 is the full solution: the system generates b-roll clips, not just timing slots. The pipeline: async function authorBrollPrompt aRollFrame: Buffer, beat: BrollBeat, product: ProductCatalogEntry, editorBrief?: string, : Promise