Shot plan — unified UI sketch (scaffold + direction)
Status: Deferred — keep Steps 9 and 10 separate (no in-step tabs). Step 10 display title is Shot direction only.
Goal: One place to work on shots without merging backend steps, locks, or APIs. (Not pursued.)
Problem
Steps 9 (Shot scaffold) and 10 (Shot direction) edit the same shot list but live on separate nav items. Users bounce between /project-plan/scaffold and /project-plan/prompts for one creative unit (“this cut”).
Backend separation stays valuable (structure vs brief, different regen scope, scaffold lock before brief batch). The fix is navigation + row UX, not one DB step.
Proposal: one nav item, two sub-modes, one row component
Sidebar (user-visible)
| Before | After |
|---|---|
| 9. Shot scaffold | 9. Shot plan |
| 10. Shot direction (brief + camera) | (absorbed into 9) |
| 11. Filming style | 10. Filming style (renumber labels only) |
Internal PlannerStepKey values can stay step_scaffold / step_prompts for migrations; only display and routing change in phase 1.
URL
Primary route (canonical):
/project-plan/shot-plan
/project-plan/shot-plan?tab=structure # default
/project-plan/shot-plan?tab=brief
Redirects (permanent or soft):
/project-plan/scaffold→shot-plan?tab=structure/project-plan/prompts→shot-plan?tab=brief
Optional deep link per shot (phase 2):
/project-plan/shot-plan/shot/s01?tab=brief
Page layout (wireframe)
┌─────────────────────────────────────────────────────────────────────────┐
│ Shot plan [How it works] │
│ Structure + generation briefs per cut on the song timeline. │
├─────────────────────────────────────────────────────────────────────────┤
│ STATUS STRIP (two chips, both always visible) │
│ ● Structure [in progress | locked] ● Briefs [3/42 | locked] │
├─────────────────────────────────────────────────────────────────────────┤
│ [ Structure ] [ Brief ] ← segmented control (tab) │
├─────────────────────────────────────────────────────────────────────────┤
│ TOOLBAR (tab-specific) │
│ Structure: [Generate scaffold] [Lock structure] │
│ Brief: [Generate all] [Generate missing] [Lock briefs] │
│ (disabled until structure locked — same gate as today) │
├─────────────────────────────────────────────────────────────────────────┤
│ ACT 01 — Verse [Regenerate act ▼] │
│ ┌────┬──────────────────────────────────────────────────────┬──────────┐ │
│ │ s01│ [structure pills / beat / framing] │ [Edit ▼] │ │
│ │ │ [brief preview OR “No brief yet” — grey] │ │ │
│ └────┴──────────────────────────────────────────────────────┴──────────┘ │
│ ... │
└─────────────────────────────────────────────────────────────────────────┘
Structure tab: same row body as today’s ScaffoldShotRow; Edit → existing ScaffoldShotEditModal only.
Brief tab: same as today’s PromptShotRow but remove duplicated collapsed scaffold block from every row (optional: one-line “s01 · wide · male · rooftop” + expand). Edit brief → ShotDirectionEditModal only (no vocal-performance fields).
Unified row (phase 2, optional): single list always shows:
- Timecode column
- Structure pills + beat line (always)
- Brief preview line or dashed “No brief” (always, muted until brief exists)
- Actions: Edit structure | Edit brief | Regen brief (brief actions disabled until structure locked)
Tabs then only change which toolbar actions are prominent, not which rows exist.
Locks and gates (unchanged semantics)
| User action | Session effect | Same as today |
|---|---|---|
| Lock structure | step_scaffold.status = approved | Step 9 approve |
| Unlock structure | in_progress | Step 9 unlock |
| Edit structure field after lock | scaffold → in_progress | scaffold-shot-camera |
| Generate briefs | requires structure locked | scaffoldStep10GateMessage |
| Lock briefs | step_prompts.status = approved | Step 10 approve |
| Filming style | requires briefs locked | unchanged |
Status strip makes both locks visible so “I locked the page” is unambiguous.
Approve / Next step: after locking briefs, advance to Filming style (same as current step 10 → 11). Locking structure alone does not auto-advance sidebar focus unless user chooses “Continue to briefs” (optional CTA).
Edit modals
| Modal | Fields | API |
|---|---|---|
| Edit structure | timing, location, camera class, scaffold camera-action tags, vocal performance | POST /api/planner/scaffold-shot-camera |
| Edit brief | prompt, action, negative, continuity, camera-action notes, regen notes | POST /api/planner/shot-direction-patch (prompt only) |
Phase 3 (optional): Edit shot combined modal with two sections and one Save that calls both APIs in sequence — only if product wants fewer clicks; not required for phase 1.
Component refactor (implementation map)
ShotPlannerPane
└─ StepShotPlanPanel (new)
├─ ShotPlanStatusStrip
├─ ShotPlanTabBar (structure | brief)
├─ ShotPlanStructureToolbar ← from StepScaffoldPanel header actions
├─ ShotPlanBriefToolbar ← from StepPromptsPanel header actions
└─ ShotPlanActList
└─ ShotPlanRow (phase 2) OR tab-specific rows (phase 1)
Phase 1: mount existing StepScaffoldPanel / StepPromptsPanel bodies behind tabs (minimal risk).
Phase 2: extract shared act grouping + merge row UI.
Phase 3: combined modal, deep links, docs/screenshots.
STEPS config change (display only)
{
key: "step_scaffold", // keep key
index: 9,
title: "Shot plan",
blurb: "Shot list on the timeline (structure), then per-shot generation briefs. Lock structure before generating briefs.",
},
// step_prompts: hidden from sidebar OR marked internal-only; tab=brief sets activeStep step_prompts for hooks
activeStep resolution:
- Route
shot-plan+tab=structure→ render structure toolbar + scaffold rows; hooks that today checkstep_scaffoldunchanged. - Route
shot-plan+tab=brief→ render brief toolbar + prompt rows;activeStepfor background jobs can remainstep_promptsvia internalplanTabstate.
Background jobs & polling
No change: jobKey("prompts", mixSrc) and scaffold generate still use existing endpoints. Tab switch must not clear in-flight brief jobs (already handled by background registry).
Docs & e2e
- User manual: one page Shot plan replacing scaffold + prompts; table of “structure vs brief” preserved.
- Screenshots: one full-page capture with brief tab selected showing mixed filled/empty briefs.
- E2e: navigate
/project-plan/shot-plan?tab=briefinstead ofprompts.
Out of scope (explicit)
- Merging
step_scaffold+step_promptsin Prisma / session schema - Single lock for both
- One LLM call for structure + brief
- Moving filming style before briefs
Rollout
- Phase 1 — New route + tabs + redirects; duplicate panels behind tabs; status strip. ~1–2 days.
- Phase 2 — Unified row, drop redundant scaffold collapse on brief tab. ~2–3 days.
- Phase 3 — Combined edit modal, shot deep links, sidebar renumber. Optional.
Open questions
- Default tab after opening Shot plan: structure until locked, then auto-switch to brief?
- Hide step 10 from sidebar entirely or show as disabled “Briefs (part of Shot plan)”?
- Renumber user-facing steps 10→14 in docs (Filming style becomes 10) — cosmetic but touches many markdown files.
