Scenes to Sequence

Given analyzed scenes and a style pack, the planner determines shot order, hold durations, transition types, and camera overrides — producing a deterministic sequence manifest with no LLM calls.

Overview

Given scenes with metadata from analyze_scene and a style pack name, plan_sequence determines how to assemble the shots into a cohesive video. The planner is rule-based and deterministic — no LLM calls, fully testable.

scenes[]+style packplanSequence()
4 planning stages
orderScenesassignDurationsselectTransitionsassignCameraOverrides
manifest + notes

The planner loads style pack definitions from catalog/style-packs.json and personality constraints from catalog/personalities.json at module level. Camera overrides are validated against each personality's allowed_movements — moves not permitted by the personality are downgraded to null.

Style packs

Ten style packs are available, each mapping to an animation personality with specific hold durations, transition rules, and camera behavior.

StylePersonalityTempoTransitionsCameraUse case
prestigeeditorialLonger (2.5–3.5s)Hard cuts + crossfade on weight change or emotional/heroSelective push_in/drift by content typeProduct showcases
energymontageShort (1.5–2.0s), 4s capHard cuts (70%) + whip-wipes every 3rd (30%)Always staticSizzle reels
dramaticcinematic-darkVariable (2.5–3.5s)Crossfade default, hard cut for same-weightpush_in for emotional/hero, drift for detailMarketing, drama
minimalneutral-lightUniform (3.0–4.0s)Hard cuts onlyAlways staticTutorials, docs
intimatecinematic-darkLonger (3.0–4.0s)Crossfade 800ms emotional, 500ms defaultpush_in 0.15 portrait/product, drift detailBrand narratives
corporateeditorialUniform (2.5–3.0s)Crossfade 300ms on weight change, hard cut defaultpush_in product, drift UIEnterprise demos
kineticmontageVery short (1.0–1.5s), 3s capWhip every 2nd (200ms), hard cut defaultAlways staticKeynotes, launches
fadeeditorialMedium (2.0–3.0s)All crossfade 500mspush_in 0.1 portrait/product onlyPhoto essays
analogeditorialLonger (2.5–4.0s)Crossfade on weight change (600ms), crossfade default (400ms)push_in portrait, drift productRetro brand stories
documentaryeditorialVery long (3.5–5.0s)Crossfade on weight change (600ms), crossfade default (500ms)Drift only for portrait/productObservational storytelling

Duration table by motion energy

motion_energyprestigeenergydramaticminimalintimatecorporatekineticfadeanalogdocumentary
static3.5s2.0s3.0s4.0s4.0s3.0s1.5s3.0s4.0s5.0s
subtle3.0s2.0s2.5s3.5s3.5s2.75s1.5s2.5s3.5s4.5s
moderate3.0s1.5s3.0s3.0s3.0s2.5s1.0s2.0s3.0s4.0s
high2.5s1.5s3.5s3.0s3.0s2.5s1.0s2.0s2.5s3.5s

Planning stages

The planner runs four stages in sequence.

1. Shot order

Intent-bucket approach with variety post-processing.

Bucketing: Each scene goes into a bucket by its highest-priority intent tag. Priority: closing > opening > hero > emotional > detail > informational > transition > untagged.

Assembly:

  1. Opening scenes first
  2. Hero scenes second
  3. Middle: interleave detail/informational/transition/untagged, distributing emotional scenes at even intervals
  4. Closing scenes last

Post-processing:

  • Variety rule — no consecutive same content_type. Swap with next different type (look-ahead up to 3).
  • Weight alternation — no 3+ consecutive same visual_weight. Swap to break runs.
  • Energy arc — don't start at peak energy unless tagged hero/opening.

2. Duration assignment

Each scene's duration_s comes from the style pack's hold_durations table, keyed by the scene's motion_energy. If max_hold_duration is set on the pack (energy: 4.0s, kinetic: 3.0s), it acts as a hard cap.

3. Transition selection

The first scene always gets null (no transition in). Subsequent scenes are evaluated through the style pack's transition rules.

4. Camera overrides

Camera overrides are evaluated through the style pack's camera_overrides rules, then validated against the personality's allowed_movements. Moves not allowed by the personality are downgraded to null. drift and static bypass validation.

Transition rules

Transition rules are evaluated in strict priority order. The first matching rule wins.

PriorityRule typeDescription
1patternPositional — e.g., energy's every-3rd whip-wipe cycle
2on_same_weightFires when consecutive scenes share visual_weight
3on_weight_changeFires when visual_weight differs between scenes
4on_intentMatches incoming scene's intent_tags
5defaultFallback

Per-style transition behavior

  • Prestige — hard cut default. Crossfade (400ms) on weight change or emotional/hero intent.
  • Energy — every 3rd transition is a whip-wipe (cycling left/right/up/down), rest are hard cuts.
  • Dramatic — crossfade (400ms) default. Hard cut between same-weight scenes. 600ms crossfade for emotional intent.
  • Minimal — hard cuts only.
  • Intimate — crossfade 500ms default. 800ms crossfade for emotional intent.
  • Corporate — hard cut default. Crossfade 300ms on weight change.
  • Kinetic — every 2nd transition is a whip-wipe (cycling left/right, 200ms), rest are hard cuts.
  • Fade — all crossfade 500ms.

Camera overrides

Three camera rule types, evaluated in order:

Rule typeBehaviorUsed by
force_staticAll scenes get { move: 'static' }energy, minimal, kinetic
by_content_typeMaps content type to camera moveprestige, intimate, corporate, fade, analog, documentary
by_intentMaps intent tag to camera movedramatic, intimate

Per-style camera behavior

Styleportraitproduct_shotui_screenshotemotional/hero intentdetail intent
prestigepush_in 0.2push_in 0.2drift 0.2
dramaticpush_in 0.3drift 0.3
intimatepush_in 0.15push_in 0.15drift 0.15
corporatepush_in 0.15drift 0.15
fadepush_in 0.1push_in 0.1
energy/minimal/kineticstaticstaticstaticstaticstatic

Per-scene style blending

A single sequence can mix styles by setting metadata.style_override on individual scenes. The override affects that scene's durations, transitions, and camera while the rest uses the default style.

{
  "scenes": [
    { "scene_id": "sc_intro", "metadata": { "content_type": "typography", "style_override": "minimal" } },
    { "scene_id": "sc_hero", "metadata": { "content_type": "product_shot" } },
    { "scene_id": "sc_closing", "metadata": { "content_type": "brand_mark", "style_override": "fade" } }
  ],
  "style": "prestige"
}

In this example, sc_intro uses minimal (hard cut, static camera, longer hold), sc_hero uses prestige (sequence default), and sc_closing uses fade (crossfade 500ms, minimal camera).

The style_override travels with the scene through reordering. Unknown overrides throw in the planner. When overrides are used, notes.style_overrides_used lists the unique override names.

Output format

plan_sequence returns a manifest and editorial notes:

{
  "manifest": {
    "sequence_id": "seq_planned_1710000000",
    "resolution": { "w": 1920, "h": 1080 },
    "fps": 60,
    "style": "prestige",
    "scenes": [
      {
        "scene": "sc_brand_mark",
        "duration_s": 3.0,
        "transition_in": null,
        "camera_override": { "move": "drift", "intensity": 0.2 }
      },
      {
        "scene": "sc_product_ui",
        "duration_s": 3.0,
        "transition_in": { "type": "crossfade", "duration_ms": 400 },
        "camera_override": { "move": "push_in", "intensity": 0.2 }
      }
    ]
  },
  "notes": {
    "total_duration_s": 6.0,
    "scene_count": 2,
    "style_personality": "editorial",
    "ordering_rationale": "...",
    "transition_summary": { "crossfade": 1, "null": 1 }
  }
}

Style differentiation

The same 4 scenes produce measurably different manifests across styles:

Metricprestigeenergydramatic
Average duration~3.0s~1.7s~3.0s
Dominant transitionhard_cut + crossfadehard_cut + whipscrossfade
Camera overridesselectiveall staticselective
Total duration~11s~6s~10s

Try it

Try asking your AI:

Show me the prestige style pack — what are its transition rules and camera overrides?
Plan a sequence from these 6 scenes using the energy style. Show me the shot list and transition summary.
Plan this sequence with prestige as the default, but override the opening scene to use minimal and the closing to use fade.

Was this page helpful?