- PLAN §5 M5: shot sizes/angles/focals/light presets/blocking marks as
one-click deterministic presets (grammar.js data + presets.js solver,
Lane A), keyed at the playhead via scenegod:direct events (Lane B),
optional NL box -> POST /director -> tailnet Ollama with server-side op
validation (Lane C; m4pro serves qwen2.5:7b)
- rhubarb 1.14.0 built from John's source zip (JING5), installed arm64 at
~/.local/opt/rhubarb, symlinked /opt/homebrew/bin; happy path verified:
/rhubarb on a real spoken wav (assets/audio/test/vo.wav) returns mouthCues
- lane B unlocked to wire the lip-sync-from-audio button now
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- stage.js: applyState no longer skips camera/light entities (source
'upload' but no bytes needed) — loaded scenes were silently losing the
directing rig; PLAN schema adds source.type 'none' for the clean fix
- lane files: A session-3 + C M4 accepted; A→absorb hotfix + viseme lane
(M4-A), B→audio rows + Web Audio sync + morphs track (M4-B), C complete
Verified: 6/6 entities restored on scene load, PiP 178x99 capped+visible,
lady 26/26 textured, audio-muxed render h264+aac 8.000s both streams,
graft_limb --selftest green under Blender 5.0.1, node+server suites green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- timeline.js: _mirror — Timeline subscribes stage.onChange, upserts/removes
live stage entities into scene.entities (closes the dock-added-entity gap
both lanes flagged; keyframing now works without a scene load)
- lane files: M2/M3 accepted for all lanes; A→PiP sizing + lady.glb material
polish, B→absorb _mirror + test + setDuration mutator, C→M4 (audio mux,
graft_limb, MB proxy)
SYNC 2: lady+man+street+2cams+sunset built via live dock path, all
frame-exact (probes in transcript). SYNC 3: finalRender → 240 frames
1920x1080 → ffmpeg h264 8.000s, cuts + sunset verified in extracted frames.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>