diff --git a/logs/laneC.md b/logs/laneC.md index 2dd5601..2927530 100644 --- a/logs/laneC.md +++ b/logs/laneC.md @@ -64,3 +64,37 @@ BLOCKED/REQUESTS: NEXT: M4 is locked. When unlocked: ffmpeg audio mux (scene audio[]), /mb/submit MODELBEAST proxy, scripts/graft_limb.py. Meanwhile available to integration-test finalRender once Lane A's renderActiveCamera lands. + +## 2026-07-18 session 3 +DONE: M4 complete (unlocked after SYNC 3). Commit be65355. +- Audio mux: `/render/end` now accepts `{audio:[{path,start,gain}]}`, muxes via + ffmpeg adelay+volume+amix -> aac -shortest; audio paths path-guarded (400 on + missing). `render.js finalRender` passes `opts.audio` through. +- `scripts/graft_limb.py`: headless Blender (`blender -b -P ... -- --body B + --limb L --bone NAME --out O`). Align limb root head->target bone world head, + join armatures, parent limb root under target (keep offset), join meshes + (vgroup weights survive). Refusal: overlapping bones -> GraftRefused -> + exit 2 "re-skin, don't graft". No finish/decimate. `--selftest` builds + synthetic body/limb GLBs and verifies refusal + graft paths under Blender. +- `/mb/submit`: MODELBEAST proxy, SCENEGOD_MB=1 gated (503 otherwise), token + from ~/Documents/backnforth/.env at request time (never logged; errors + scrub it), /api/assets multipart -> /api/jobs, mirrors meshgod/ops.py. +- `test_server.py`: 8 groups green (added audio-stream assert, MB gating, + MB two-step contract via in-process mock — no farm jobs). +DECISIONS: +- Blender 5 glTF importer injects a stray unparented 42-vert icosphere on + every import; `_import` now keeps only rig-connected meshes (parented to + armature / has vgroups / armature modifier) and deletes strays. Right filter + for a graft tool regardless. +- graft refusal check: provides = limb bones - {limb root}; refuse if + provides ∩ body bones. Attach/root bone sharing the target name is expected. +- MB test uses a stdlib http.server mock + a 2nd scenegod instance; asserts + Bearer token forwarded, multipart upload, asset_id chained into job payload. +BLOCKED/REQUESTS: none. +BACKLOG (from orchestrator, not urgent): draft webm via MediaRecorder is +untested in the embedded preview (rAF suspension). Needs one verification in a +real Chrome window before calling draftRecord done — client-only, needs Lane A +stage running live; deferred. +NEXT: Lane C M1-M4 all shipped. Available for polish / integration support. +Blender binary here is /Applications/Blender.app/Contents/MacOS/Blender (not +on PATH as `blender` in this session, contrary to orchestrator note).