# MOCAPGOD progress ledger One lane per session. Tick on completion. See PLAN.md for acceptance checks. - [x] **Lane 0** — bootstrap. git + .gitignore, docs/LICENSES.md skeleton, spec/mixamorig_bones.json (65 bones, `mixamorig:` colon-prefixed). — 2026-07-17 - [x] **Lane A** — capture + ingest. docs/CAPTURE.md protocol, ingest.py (probe → 30fps normalize → rename → rsync to m3ultra queue → LEDGER.tsv). — 2026-07-17 - [ ] **Lane B** — pose engine. **Decision made 2026-07-17 (session 3): Path B** — engine = **HSMR → SKEL**, run local, ship rig-motion only, John accepts NC-licence risk (`docs/DECISIONS.md` Decision 1 RESOLVED). Env is 90% up in `.engine/HSMR` (uv venv, torch 2.13 **MPS verified green**, ungated weights pulled). **Still open before B ships:** (1) John downloads gated **SKEL v1.1.1** → `.engine/HSMR/data_inputs/body_models/skel/`; (2) fix the person-detector (detectron2 + chumpy failed to build — see gotchas); (3) real forward-pass smoke test on an HSMR demo image; then B2 (service-ize → BVH) + B3 (jitter). Lanes C and D remain blocked on B. - [ ] **Lane C** — retarget + cleanup (Blender). bvh → mixamorig FBX + QC turntable. - [ ] **Lane D** — clip factory. `mocap` CLI end-to-end; games + Unreal integration. - [ ] Lane E — ML upgrades (post-v1, gated). - [ ] Lane F — UX (optional). ## Notes for the next lane - **Lane D can't be started until B + C ship + test footage exists** — it's the CLI that wraps ingest → pose_engine.py → retarget.py, and the latter two don't exist yet. Session 3 (the "Lane D" session) correctly built nothing; it locked Decision 1 and de-risked MPS instead. - **SKEL version trap:** HSMR needs **v1.1.1** exactly (`changelog_v1.1.1.txt`); older = silent incompat. Source: `.engine/HSMR/docs/SETUP.md` (register skel.is.tue.mpg.de → download.php). - **Engine wiring + ARM bypasses live in `docs/B_ENGINE_SETUP.md`** — `smoke_test.py` already stubs the un-buildable detectron2 (full-frame bbox) and headless pyrender (QC → Blender), so the detector swap + real QC are B2 polish, **not** blockers for a centered demo clip. - **World-grounded gap (important):** HSMR is per-frame → root is camera-space `cam_t`, NOT the treaty's world-grounded trajectory. Fine for in-place DJ moves; walking/locomotion needs Lane C to derive root from foot-contact (or a grounding pass). Carry into Lane C design. - **HSMR is installed on ultra, not m3ultra** (PLAN Ground-Rule 1 puts the pose engine on m3ultra). Likely because m3ultra's disk reclaim waits on the reboot (Decision 2). Next B session decides: move it to m3ultra, or consciously host inference on ultra. - **VOID** (was: "MoCapAnything is BVH-direct, skip the retarget rig"). Reversed — the model is animal-only and not our engine. Whatever human model we pick emits **SMPL or SKEL, not mixamorig**, so **Lane C's constraint-retarget IS required** and `spec/{smpl,skel}_to_mixamorig.json` is back on the menu. HSMR's SKEL output (a biomechanical skeleton) is the likely source format if John goes SKEL. - **Check MPS + global-trajectory FIRST** for whichever human model John's decision unlocks (HSMR has an HF Space + demo to smoke-test before John's footage). These two risks are unchanged by the engine swap. - Ground-truth skeleton naming is **`mixamorig:`** (colon), armature object named `Armature`. Lane C's name-map must handle colon vs underscore variants (PLAN warned about this). - Blender headless entrypoint: `/Applications/Blender.app/Contents/MacOS/Blender --background --python