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>
19 lines
1.2 KiB
Markdown
19 lines
1.2 KiB
Markdown
# 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`](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:** M10–M12 acceptance passes (browser evidence for M11/M12 in your status file),
|
||
`pytest` ≥ 121 + your tests, merged to `main` with synthetic end-to-end intact.
|