reorg(characters): ship-time folders — lena_base_v01 ships, lane moves to work/lena

REGISTRY rewritten around the central rule: a character folder is born only
when a body ships to ariki-game (<character>_base_v<NN> = ship ordinal).
lena_nude dissolves accordingly:
- characters/female/lena_base_v01/ — SHIPPED 2026-08-10: AccuRig GLB carrier,
  T-pose/rig FBX + JSON, previews, frozen README
- characters/work/lena/ — the live lane: recipes 01-47 (incl. new 36-47:
  refill/sheets/clay/despeckle/musculature/spin/AccuRig export/graft/pose QC),
  masters (athletic_v04 blend + textures, accurig blend), lane-history README
- hires_claude/hires_work intermediates (blends, logs, probes) pruned

Supporting docs: AGENTS.md, working-files rule, rig-graft plan addendum,
originals README, prune_lane.py.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 07:17:15 -07:00
parent 4bbd1a1732
commit 3d8825f5a9
263 changed files with 3262 additions and 26313 deletions
+39 -3
View File
@@ -66,14 +66,50 @@ Census facts that shape the plan:
3. **AccuRig** (manual, Jeremy/Ozlem): rig the bait FBX. Export rigged FBX.
4. **Graft** (headless Blender): import rigged bait FBX + pristine GLB; snap rest
poses; transfer skeleton + skin weights decimated→full-res by nearest-surface
with tight max-distance; **hands get special handling** (per-finger masked
transfer or reduced distance + limit-totals + normalize) — this is where the
old hand mangling gets fixed. Export GLB: original mesh + original packed
with tight max-distance. Export GLB: original mesh + original packed
textures + new rig. FBX artifacts are discarded.
**Hands are no longer part of this step — see "Hands" below.**
5. **QC**: pose sweep incl. finger curls; then (if/when destined for game) the
existing AccuRig→Quaternius conversion (`ariki-game/tools/make_male_ib_quatskin_accurig.py`
lineage) picks it up.
## Hands: transplanted, not solved (RESOLVED 2026-08-07)
The hands come off the bait entirely and are transplanted from a body that already
ships working ones — `tools/graft_hands.py`, wrist-aligned. Three measurements
decided this:
- **There is nothing to solve.** The nude lane never touched the hands: hand-region
displacement from the Tripo original is mean **0.010 mm**, p50 exactly 0.000, only
0.06% beyond 1 mm (the 12.6% vertex churn there is micron jitter from the v03
despeckle pass). A donor's hand weights fit this mesh as-is.
- **A mitten rig would cost real animation.** Fingers move *relative to each other*
by up to **89°** over a clip (fertility 89.4°, taming 77.6°, nd_01 46.7°,
canoedismount 26.4°); only `war_dance_01` and `hakadance1_static` hold them still.
So four of six dances would visibly flatten. Rejected.
- **The bone list is not negotiable anyway.** 40 of the 65 joints are hands, every
clip carries tracks for all 40, and `tools/verify_body_variant.py` gates on "65
joints in identical order". A mitten could only ever have been a *skinning* choice.
`graft_hands.py` edits the glTF node graph directly rather than round-tripping the
armature through Blender, because Blender re-derives bone rest orientation from
edit-bone head/tail — the exact failure `ariki-game/tools/rig_pose_gate.py` exists to
catch. Validated: two self-tests (identity, and a 0.55× + 7° similarity) place every
hand joint to **5e-16 u** and recover 100% of donor weights; output passes
`verify_body_variant.py`; and `rig_pose_gate.py` reports **max error 0.000° over 260
(bone, clip, sample) comparisons** under the two most finger-heavy dances.
Two self-inflicted bugs the similarity test caught, worth not re-introducing: the
wrist scale gets applied **twice** if you compose the target's wrist matrix without
stripping its own scale first (the forearm ratio was measured in that same scaled
space), and the weight transfer must convert donor-local → world → target-local, not
compare raw POSITION arrays across two files.
**Still open on hands:** if AccuRig returns no wrist joint at all once the hands are
cut from the bait, `graft_hands.py` aborts — the `--wrist-from-forearm` fallback is
specified but not implemented, because what AccuRig actually returns is unknown until
step 3 runs.
## Naming + step 2 status (RESOLVED 2026-08-04, later same day)
Jeremy raised the hands budget and released the bait step. Built with
+1 -1
View File
@@ -50,7 +50,7 @@ head of the live chain. Unpin the head's parent once the head is accepted.
## Pruning
```
python tools/prune_lane.py characters/female/lena_nude --recursive # dry run
python tools/prune_lane.py characters/work/lena --recursive # dry run
python tools/prune_lane.py <lane> --apply # delete scratch
```