# Hand poses — pre-ship staging for ariki-game Canonical hand-pose library. Poses live here first; when a pose is adopted for the game it is **copied** to `ariki-game/assets/quaternius/hand-poses/` (keep the two byte-identical — the runtime `HandPoseLayer` reads the game copy). ## Format `{"bones": {"": [x, y, z, w], ...}}` — glTF node-local quaternions on the **canonical Quaternius skeleton**, which is exactly Godot bone-pose space for these bodies. Apply directly: ```csharp skeleton.SetBonePoseRotation(skeleton.FindBone(name), new Quaternion(x, y, z, w)); ``` 40 bones per pose, including `*_04_leaf_*` tip bones. Some bodies lack the leaf bones — **skip bones `FindBone` returns -1 for**, never error. On non-canonical rigs (Mako) poses must be applied rest-relative; the runtime layer simply excludes those bodies instead. ## Poses | File | Source (Kevin packs) | Runtime status | |---|---|---| | `pose_flat.json` | harvested flat hand | **SHIPPED to layer 2026-08-17** — verified in the dance bed on exp01 | | `pose_relaxed.json` | `HandWave01` f0 | staged | | `pose_fist.json` | `AttackPunch01_R/L` f7, merged | blocked on Lena finger-weight repair (fist/grip shred on exp01–exp04) | | `pose_grip.json` | `CombatIdle1H01` f0, both hands | blocked, same repair | ## Verification (before shipping a pose) - `tools/handpose_bake_preview.py body.glb pose.json out.glb` — bake into rest rotations. - `tools/skin_displacement_check.py posed.glb original.glb` — Godot-exact LBS travel; cm-scale = sane, m-scale = broken. **Blind to fin tearing** — pair it with the edge-stretch check (`tools/edge_stretch.py`). - `tools/handpose_skin_to_obj.py` + `tools/handpose_render_objs.py` — the only honest visual check. Never judge by importing a baked-pose GLB into Blender (false shards).