- stagestub.js: removeEntity now fires onChange WITH the removed entity (real
Stage contract) so _mirror's getEntity(id)===null removal path is testable.
- timeline.js: setDuration(x) — clamps the playhead, keeps out-of-range keys
(lossless), notifies UI via onLoad. (Reviewed orchestrator's _mirror seam.)
- tlui.js: dur field → setDuration; snap-increment select (frame/0.1/0.25/1s);
keyable-param add via dblclick on a params lane (captures current param
values, skips 'type'/bool descriptors); params lane only when keys exist or
kind is camera/light (no empty lane for characters).
- timeline_test.mjs: _mirror lifecycle (add→keyframe→remove) + setDuration.
Verified in browser (throwaway harness, not committed): dock-adds mirror into
rows, param capture, setDuration clamp+bar refresh, snap-step math.
Co-Authored-By: Claude Opus 4.8 <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>
- dock: /assets/tree {name,path,formats,thumb}; +camera/+key/+ambient toolbar;
clip apply dispatches scenegod:clipdrop when timeline present (else preview);
drag-from-dock places onto the viewport (screenToFloor / entityAt)
- stage: PiP overlay from active camera; renderActiveCamera hardened as M3 target
+ pause()/resume(); backdrop rebuild-on-param; fire onChange on add+remove
(fixes tlui empty-names + a gizmo mouseUp id-vs-entity bug); set-active-camera
- verified in the integrated app (:8020, Lane B timeline mounted), zero console
errors. Found + logged the entity-mirror integration gap (timeline model isn't
seeded from live stage adds) for the orchestrator.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- timeline.js: onLoad hook (rebuilds rows + refreshes scene bar after load()),
scenegod:clipdrop handler (addClipDrop: block at playhead, out=clip duration,
auto 0.25 fade where it abuts a neighbour), crossfade now fade-IN + fade-OUT
(pre-roll pulls successor start earlier for continuous local time).
- tlui.js: reads tracks from the TIMELINE (authoritative) not the stage copy —
fixes post-load addKey/clipdrop not appearing. Params lanes (per-key color),
camera-cut lane add via dblclick, snap toggle, box-select + multi-drag +
Delete, selection highlight, fade wedge on blocks, grow-to-content height.
- timeline_test.mjs: + onLoad, addClipDrop duration, crossfade weight sum=1.
Verified in browser (throwaway harness, not committed): SYNC #3a/#3b repro
fixed, both clip blocks render, clipdrop/add-key show immediately, cut-add and
box-select multi-drag work.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>