diff --git a/logs/laneB.md b/logs/laneB.md index 0ba3693..bc4058d 100644 --- a/logs/laneB.md +++ b/logs/laneB.md @@ -59,3 +59,47 @@ NEXT: Hold at M1 boundary. At SYNC 1 the stub swaps for the real Stage (one-line change in the page import) and tldev.html/stagestub.js get deleted. M2 (locked): clip crossfade polish, params/cut lane UI, snapping config, undo Ctrl+Z already stubbed, box-select multi-drag. + +## 2026-07-18 session 2 (M2) +DONE: M2 per orchestrator update. SYNC findings fixed first, then polish. + - SYNC1 #3a/#3b: added `Timeline.onLoad(cb)`; `load()` fires it → + TimelineUI rebuilds rows + refreshes name/duration fields. Verified with + the exact repro (UI built against empty stage, then `load()` a 2-entity + scene → rows now appear, scene bar updates). + - SYNC1 #4 clipdrop: `scenegod:clipdrop {id,path,clipIndex}` → `addClipDrop` + drops a block at the playhead, `out = clip.duration` (from preload), auto + `fade:0.25` where it abuts a neighbour. Verified via dispatched event. + - Crossfade fade-IN (was fade-OUT only): a predecessor's fade pre-rolls the + successor's playback start earlier by `pred.fade` so local time is + continuous across the boundary; weights ramp 1→0 / 0→1 and sum to 1 + (asserted in test). + - Params lanes (per-key hue), camera-cut lane add via dblclick on Cameras + row (uses active cam / first camera), snap toggle in scene bar (Alt still + = free), box-select + multi-drag + Delete of keys, selection highlight, + fade wedge drawn on clip blocks, panel grows to content height (was fixed + 200px → clipped the Cameras row once params rows were added). + - timeline_test.mjs extended: onLoad fires once, addClipDrop out=duration, + crossfade weights sum to 1. All green. +DECISIONS / BUG: + - **tlui reads tracks from the TIMELINE, not the stage entity.** Found mid- + verify: `load()` structuredClones the scene, so timeline.scene.entities and + stage entities are SEPARATE objects. Drawing from stage meant clipdrop/ + addKey (which mutate the timeline copy) never appeared. Repointed all draw + methods to `_te(id) = tl.scene.entities.find(id)`. Rows now built from the + timeline list merged with any stage-only (dock-added, not-yet-keyframed) + entities. Per PLAN the timeline owns tracks — this is the correct source. + - Grow-to-content height, no scroll yet (ponytail: add max-height+scroll only + if a scene ever has enough entities to dominate the viewport). +BLOCKED/REQUESTS: + - Gap for the orchestrator/Lane A to note: there's no bridge for a + dock-added stage entity to enter `timeline.scene.entities`, so a freshly + dropped character can't be keyframed until a scene load. tlui shows it as a + row (empty tracks) but mutators need the entity present. If Lane A's dock + should register new entities with the timeline, we need a + `timeline.addEntity(desc)` (or the dock calls `stage.captureState()` → + `timeline.load`). Flagging for SYNC 2 — not building it uninvited. + - Verified with a throwaway harness (`_check.html`) served on :8099; deleted, + NOT committed (orchestrator removed the M1 tldev.html deliberately). +NEXT: Hold at M2. Remaining M2 polish if a session 3 is granted: undo already + wired to Ctrl+Z; could add snapping increment config + keyable-param add UI + (currently params keys come from Lane A capture/inspector). Await SYNC 2. diff --git a/logs/shots/m2-cameras-lights-dome.png b/logs/shots/m2-cameras-lights-dome.png new file mode 100644 index 0000000..473136b Binary files /dev/null and b/logs/shots/m2-cameras-lights-dome.png differ