festifun/plan/lane-E-director.md
m3ultra 545f7a347d Plan: Phase 5 spec + directives round 4 (M10-M17, lanes E/F/G)
plan/20-phase5.md is the phase-5 canonical spec: M10 beats/onsets,
M11 auto-director, M12 cinematic export (lane E); M13 anchor manager +
friend tags, M14 photo mode, M15 moment FX (lane F); M16 server-side
camera paths, M17 static memory-capsule export (lane G). foundation2
freezes the new contracts (beats.json, camPath JSON, paths table,
PATCH anchors, __F4D_API_BASE__ / manifest.capsule, transport/scene3d
hooks) and pre-wires all UI so parallel lanes never touch shared files.

DIRECTIVES Round 4 records the fresh-eyes upgrades (FFT caching,
WebAudio master clock, spatial audio; suite floor now 121), ratifies
the additive contract amendments, and sets run order:
foundation2 -> E, G, F (own worktrees, mandatory) -> integration2
(real-footage field test, v0.2.0 proposal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 17:08:44 +10:00

1.2 KiB
Raw Permalink Blame History

Lane E — Director & export (branch lane/e-director)

Scope: phase-5 milestones M10 + M11 + M12 (beats/onsets, auto-director, cinematic export) — see 20-phase5.md.

  • Owned files: backend/festival4d/audio_features.py, backend/festival4d/director.py, backend/tests/test_audio_features.py, backend/tests/test_director.py, frontend/src/director.js, frontend/src/exportVideo.js. Nothing else.
  • Fill the stub bodies foundation2 left; signatures, routes, and CLI dispatch already exist.
  • Contracts you consume (frozen): beats.json shape, camPath JSON (quat [x,y,z,w], Three.js space — convert COLMAP poses via geometry.colmap_to_threejs, never inline), transport.captureAudioStream().
  • Build order M10 → M11 → M12: the director consumes beats; export consumes the director's path. Each milestone is independently mergeable — don't hold M10/M11 hostage to M12.
  • Degradation: no beats → director skips beat-snapping; no poses → director returns a clear error body, never a crash; export with no path → button stays disabled.

Done when: M10M12 acceptance passes (browser evidence for M11/M12 in your status file), pytest ≥ 121 + your tests, merged to main with synthetic end-to-end intact.