# AI ANIMATION GUIDE — generate Quaternius UAL animations from a text request

**Audience: an AI agent.** Given a request like *"make a tired idle"*, *"a three-hit sword combo"* or *"a zombie that stumbles when shot"*, you write one JSON **spec**. The kit compiles it into a clip on the 65-bone UAL skeleton, validates it against the measured style of the Quaternius library, shows a contact sheet, and exports a GLB that drops into Unity, Unreal, Godot, Blender or three.js like any UAL clip.

You never touch quaternions, bone axes or three.js. You pick real UAL poses by name, adjust bones in plain words (`"upperarm_r": {"fwd": 40}`), set timing in frames, and let the kit handle the rest.

```
request ──► spec.json ──► UALKit.compile ──► UALKit.validate ──► contact sheet ──► fix ──► export .glb
            (you)          (kit)              (kit: fails/warns)   (forge.html)     (you)   (kit)
```

Working examples live in `anim-specs/`. They all compile, pass validation and have been checked by eye. **Copy the closest one before writing from scratch.**

**Creatures (spiders, animals):** see `CREATURE-ANIMATION-GUIDE.md`. They have their own kit (`scripts/creature-kit.js`) and viewer (`creatureLab.html`).

## Paste-in prompt (give this to any AI together with this file)

> You generate animations for the Quaternius UAL mannequin. Read AI-ANIMATION-GUIDE.md. For the request below:
> 1. Classify it (§9 step 1) and copy the nearest example spec (§11).
> 2. Write ONE spec JSON with an `intent` sentence. Use real poses (§5, Appendix A), offsets (§4), eases (§6) and the frame timings (§7).
> 3. Compile and validate it (Forge `forge.compile(spec)` or the headless snippet in §9). Fix every fail; fix or declare every warn (§8).
> 4. Look at the contact sheet (`forge.sheetOnly(true)` then screenshot, or `forge.sheetPNG()`). Score the rubric (§9 step 10) with one line of evidence each. Anything ≤ 2 goes back to step 2.
> 5. Return the final spec, its report, and your rubric scores.
>
> Request: <what the user asked for>

---

## 0. Files

| file | what |
|---|---|
| `scripts/ual-anim-kit.js` | the compiler, validator and GLB writer. Pure JS, no dependencies. |
| `data/ual-poses.json` | **100 named poses** taken from real UAL frames, 6 hand shapes, the per-bone range table |
| `anim-specs/*.json` | the example specs; `index.json` lists what the Forge loads |
| `anim-specs/_reports.json` | the validation report for every example |
| `forge.html` | compile, preview, contact sheet, report, export. `?spec=Name` opens one spec. |
| `data/library/UAL_Generated.glb` | all examples baked onto the mannequin. `animate.html` loads it automatically. |
| `research/` | the measurements behind every number here (`09-how-ual-is-built.md`, `10-recipes.md`) |

---

## 1. The ten rules (why UAL looks good; follow them)

1. **Build on a base.** Start from a real UAL pose or clip and change only what the request is about. Keep untouched limbs identical to the base.
2. **Few key poses.** 3–5 per second of action; idles ≈1 per 0.6 s. Never closer than 3 frames apart.
3. **One ease.** Default `inOut`. `out`/`snap` only for launches, strikes and reactions (fast start); `in`/`hit` only for moves that arrive on a target.
4. **Strikes land on one frame.** Put the whole body's accent on one key; only the hand trails (`drag` 1–2 frames).
5. **Overlap in the settle.** Keep the action tight; put `drag` and `spring` on the head and hands for the recovery.
6. **Level head in locomotion.** `lookLock` on every walk, run and crouch.
7. **Gaits are timed by events.** Use a UAL gait clip as `base` and layer on top; don't author legs by hand.
8. **Sets connect exactly, one-shots come home.** Last key = first key's pose (or the family's idle).
9. **Hands hold one shape.** Set `hands` once; never animate fingers.
10. **One rhythm, never frozen, always balanced.** `breathe` on held idles; `plant` or `keepFeet` whenever the pelvis moves and the feet shouldn't.

Asymmetry: left and right should differ 10–40°. Contrast: strikes ≥ 6, idles ≤ 2.5.

---

## 2. Coordinates and bones

- Up **+Y**; the character faces **+Z**; the character's **left is +X**. Metres. 30 fps. Frame 0 is the first frame; a clip with `frames: 31` lasts 1.0 s.
- Rest (T-pose) pelvis height 0.917 m; the idle pelvis sits at 0.873 m. Mesh height 1.83 m.

The 65 joints:

```
root (never animated)
└ pelvis (the only bone that translates)
  ├ spine_01 (never animated) └ spine_02 └ spine_03
  │   ├ neck_01 └ Head
  │   ├ clavicle_l └ upperarm_l └ lowerarm_l └ hand_l └ {thumb,index,middle,ring,pinky}_01_l … _04_leaf_l
  │   └ clavicle_r └ … mirror
  ├ thigh_l └ calf_l └ foot_l └ ball_l └ ball_leaf_l
  └ thigh_r └ … mirror
```

**Group names** work anywhere a bone name does (in `set`, `mask`, `drag`, `spring`):

| group | bones |
|---|---|
| `pelvis` | pelvis |
| `spine` | spine_02, spine_03 |
| `head` | neck_01, Head |
| `torso` | pelvis, spine_02, spine_03 |
| `arm_l` / `arm_r` | clavicle, upperarm, lowerarm, hand |
| `arms` | both arms |
| `leg_l` / `leg_r` | thigh, calf, foot, ball |
| `legs` | both legs |
| `upper` | spine + head + arms |
| `body` | everything except fingers and leaf tips |
| `fingers_l` / `fingers_r` | all finger bones of one hand (mask only) |
| `all` | every bone (mask only) |

**Never** put `twist` on `upperarm_*`, `thigh_*` or any `*_01_*` finger bone, and never touch `root` or `spine_01`. The compiler refuses these with a message saying what to use instead.

---

## 3. Spec reference

```jsonc
{
  "name": "Sword_Spin_Slash",          // required. Category_Action[_Variant][_Loop]
  "intent": "one sentence: who, what, how it feels",   // for you and reviewers; ignored by the compiler
  "loop": false,                       // true: last frame = first frame, drag/spring wrap around
  "duration": 1.6,                     // seconds (→ frames = duration*30+1) — or "frames": 49
                                       // omitted with a base clip → the base clip's length / speed
  "base": "sword_idle",                // the layer under everything: a pose name…
  // "base": { "clip": "Walk_Loop", "speed": 0.8, "offset": 0 },   // …or a UAL clip, sampled per frame
  "keys": [ /* layer 0, override mode, see §3.1 */ ],
  "mask": "all",                       // which bones layer 0 drives (default all)
  "drag": { "Head": 2, "hand_r": 1 },  // per-bone lag in frames for layer 0 (group names allowed)
  "additive": false,                   // layer 0 as offsets on the base instead of full poses
  "layers": [ { "mask": "arm_r", "keys": [], "drag": {}, "additive": false } ],   // more layers, applied in order
  "hands": { "l": "fist", "r": "sword_grip" },   // hold a hand shape for the whole clip
  "breathe": { "cycles": 2, "amp": 1, "lag": 2 },  // or true; one UAL-style breathing rhythm
  "plant": "all",                      // or { "l": "all", "r": [[0,4],[30,40]], "blend": 3 }: pin feet (IK)
  "keepFeet": true,                    // or "l" / "r": feet stay where the BASE put them each frame (IK)
  "ground": true,                      // default on: lift any foot that dips below the floor (IK)
  "lookLock": { "weight": 1, "pitch": 0 },   // or true: hold the head's world orientation
  "spring": [ { "bones": ["Head"], "freq": 3, "damping": 0.45 } ],   // follow-through overshoot
  "mirror": false,                     // true: swap left/right (make the _R version of a clip)
  "expect": { "snap": true }           // declare intent so the validator doesn't warn (§8)
}
```

### 3.1 Keys

```jsonc
{ "f": 12,                         // frame (integer, 0-based)
  "pose": "jab_hit",               // a pose name (§5), "~name" for its mirror, or "UALClip@frame"
  "blend": { "pose": "guard", "w": 0.3 },   // optional: mix 30% of another pose in
  "set": { "spine_03": { "yaw": 10 }, "pelvisPos": { "y": -0.04 } },   // offsets (§4)
  "ease": "out"                    // the ease of the segment ARRIVING at this key (§6)
}
```

- **Keys interpolate** per bone with the ease of the arriving key. Before the first key the first key holds; after the last key the last holds. In a loop the last key blends back into key 0.
- **A key without `pose`** starts from the **anchor**: the most recent key that named a pose, *including that key's `set`*. So its `set` is relative to the anchor, not cumulative. Use `"from": "prev"` to build on the previous key instead. A key with only `f` repeats the anchor exactly (a hold).
- **`"UALClip@frame"`** reads any bundled UAL clip directly. The frame can be a number, `first`, `last`, `peak` (farthest from frame 0), `low` (pelvis lowest) or `high`. This needs the UAL clips loaded, which Forge does.

### 3.2 Layers

- **Override layer** (default): for the bones in `mask`, the layer's keyed poses replace whatever is below. Use it to replace one arm while the base clip keeps idling (`Emote_Wave`), or to hold an arm pose over a walk (`Walk_Wounded_Loop`).
- **Additive layer** (`"additive": true`): keys carry only `set` offsets, interpolated and applied on top of the frame below. Use it to lean a whole walk forward (`Walk_Sneak_Loop`), to add head turns to an idle (`Idle_LookAround_Loop`), or to add a tremble (`Spell_Charge_Release`). An additive key with no `set` means "no offset".
- Layers apply in order: base → layer 0 (top-level `keys`) → `layers[0]` → `layers[1]` …
- Then the post passes run in a fixed order: **hands → breathe → plant → ground → lookLock → spring → rules → mirror → loop close**. `keepFeet` runs per frame straight after the layers.

### 3.3 Advanced: custom poses, transitions, sets, variants, root motion

**Custom poses inside a spec.** Build a named pose once, then key it anywhere in the spec:
```json
"poses": { "axe_raised": { "from": "chop_windup", "set": { "upperarm_l": {"aim": [0.12, 0.92, -0.2]}, "upperarm_r": {"aim": [-0.12, 0.92, -0.2]} } } },
"keys": [ {"f": 0, "pose": "idle"}, {"f": 14, "pose": "axe_raised"} ]
```
`from` is any pose (or `"Clip@frame"`); `set`, `blend` and `mirror` work as they do on keys. (`Axe_Chop_Overhead`, `Kneel_Pray_Set`)

**Base sequences: transitions between clips and poses.** `"base": { "seq": [...], "blend": 8 }`. Each entry (`pose` or `clip` with `speed`/`offset`) starts at frame `at` and crossfades in over `blend` frames. Requires `duration`.
```json
"base": { "seq": [ {"pose": "idle", "at": 0}, {"clip": "Walk_Loop", "at": 6, "offset": 6, "blend": 12} ] }
```
To hand over to a loop seamlessly, choose `offset` so the clip's LAST frame lands on the loop's frame 0 (`offset = loopLength − (duration − at)`). (`Walk_Start`, `Walk_Stop`)

**Sets: several clips that chain exactly.** A spec file with `"parts": [spec, spec, …]` compiles to one clip per part. Each part can use the pose `"@prev"` (the previous part's last frame). With `"join": true` (the default) the part's frame 0 is forced to be exactly `@prev`; set `"join": false` for a deliberate break (a landing that starts in the impact pose). (`Jump_Big_Set`, `Kneel_Pray_Set`)

**Variants: one spec, several clips.** `"variants": [ {"suffix": "_L", "mirror": true}, {"suffix": "_Heavy", "timeScale": 1.35, "amp": 1.1}, {"suffix": "_Root", "override": {"travel": "auto"}} ]`. `timeScale` stretches every frame number (keys, drag, plant spans, base speed); `amp` scales every numeric offset; `override` replaces top-level fields; `hands`/`intent` can be set per variant. `_Loop` stays at the end of the name. (`Kick_Front`, `Punch_Combo_Jab_Cross_Hook`, `Walk_Sneak_Loop`)

**Root motion.** `"travel": {"speed": 1.2, "dir": [0, 0, 1]}` moves the `root` bone forward at that speed; `"travel": "auto"` uses the gait's implied speed (the speed at which the planted foot stays still: `Walk_Loop` ≈ 0.9 m/s, sneak 0.64). UAL itself is in place, so ship root motion as a `_Root` variant next to the in-place clip. Every locomotion report includes `impliedSpeed`, the speed a game's character controller should move at.

**Blend check.** For one-shots the report measures `entryDeg`/`exitDeg`: how far the first and last frames are from `blendWith` (default: the base pose). Above 20° warns, because a crossfade will pop. Set `"blendWith": "idle"` when the clip returns to a different stance than it starts from; mirrored variants are compared against the mirrored pose automatically.

---

## 4. Offsets: moving a bone in plain words

All values are degrees except `pelvisPos` (metres). Offsets are applied in the character's frame **at the pose they're applied to**, so they mean the same thing whatever the limb is doing.

| key | meaning | + direction |
|---|---|---|
| `fwd` | swing the bone's tip toward the character's front | forward |
| `up` | swing the tip toward the sky | up (shortest path; see the traps) |
| `left` | swing the tip toward the character's left (+X) | left |
| `out` | swing the tip away from the midline (`_l` → left, `_r` → right) | outward |
| `yaw` | turn about vertical | turn to the character's **left** |
| `lean` | tilt about the forward axis | top toward the character's **left** |
| `aim` | `[x, y, z]`: point the bone's tip along this character-frame direction (shortest rotation; `aimW` 0–1 for part of the way) | **the most reliable way to place an upper arm or thigh** |
| `bend` | flex the hinge about its own axis: **elbow = `lowerarm`, knee = `calf`, toes = `ball`** | the natural flexion direction |
| `twist` | roll about the bone's own axis (forearm pronation: `lowerarm` ±70–80) | right-hand rule about the bone |
| `pelvisPos` | `{x, y, z}` move the pelvis in metres (x left, y up, z forward) | — |

### Cookbook (measured on the mannequin)

| to get | write | notes |
|---|---|---|
| arm forward (front raise) | `upperarm_r: {fwd: 80}` | 0 = hanging (≈24° off vertical in idle). 90 ≈ horizontal. UAL max ≈ 91. |
| arm out to the side | `upperarm_r: {out: 66}` | 66 ≈ horizontal from idle; 130–140 ≈ straight up (inside UAL's range) |
| arm back | `upperarm_l: {fwd: -30}` | UAL max back ≈ 32; `Run_Ninja_Loop` goes to −55 with `expect.rom`. |
| bend the elbow | `lowerarm_r: {bend: 60}` | **total** flexion = idle's 30 + bend; keep the total ≤ 120 |
| forearm vertical over a sideways arm (wave) | `upperarm_r: {out: 66, fwd: 18}, lowerarm_r: {up: 80}` | `up` works when the bone isn't already vertical |
| side-to-side wave | keys alternating `lowerarm_r: {lean: -20}` / `{lean: 20}` | relative to the raised anchor |
| arms overhead in a V (cheer) | `upperarm_l: {aim: [0.42, 0.88, 0.2]}, upperarm_r: {aim: [-0.4, 0.89, 0.22]}, lowerarm: {bend: -20}` | `Emote_Cheer`. `aim` points the bone exactly; `bend -20` straightens idle's 30° elbow |
| point the arm straight ahead | `upperarm_r: {aim: [-0.1, 0.05, 1]}, lowerarm_r: {bend: 5}` | `Interact_Press` |
| straighten the elbow | `lowerarm: {bend: -25}` | idle already has ≈30° of elbow flex |
| hand on chest | `upperarm_r: {fwd: 24, out: -14}, lowerarm_r: {bend: 100}` | `Emote_Bow` |
| hold the ribs | `upperarm_l: {fwd: 18, out: -10}, lowerarm_l: {bend: 75}` | `Walk_Wounded_Loop` |
| palms up (shrug) | `lowerarm_l: {bend: 82, twist: -80, out: 32}`, mirror for r | `Emote_Shrug` |
| shrug the shoulders | `clavicle_l: {up: 12}, clavicle_r: {up: 12}` | clavicles move little in UAL (±25) |
| lean the chest forward | `spine_02: {fwd: 8}, spine_03: {fwd: 10}` | spread over both spine bones |
| lean back (dodge) | `spine_03: {fwd: -22}, spine_02: {fwd: -12}, Head: {fwd: 14}, pelvisPos: {z: -0.15, y: -0.08}` + `plant` | the head counters to stay level |
| turn the chest | `spine_03: {yaw: 20}, spine_02: {yaw: 10}` | torso separation |
| look left | `Head: {yaw: 22}, neck_01: {yaw: 10}, spine_03: {yaw: 5}` | head leads, chest follows at a quarter |
| look up / down | `Head: {fwd: -14}` / `{fwd: 12}` | |
| head tilt | `Head: {lean: 8}` | |
| crouch lower | `pelvisPos: {y: -0.13}` + `keepFeet` (over a clip) or `plant` (over a pose) | the IK bends the knees for you |
| knee up (chamber) | `thigh_r: {fwd: 70}, calf_r: {bend: 95}` | + `plant: {l: "all"}` |
| leg extended forward (kick) | `thigh_r: {fwd: 78}, calf_r: {bend: 6}` | shift weight: `pelvisPos: {x: 0.05}` over the standing foot |
| lift the toes | `foot_r: {up: 15}` | the foot points forward-down, so `up` raises the toe |
| weight onto the left foot | `pelvisPos: {x: 0.03}` + `plant` | |
| bounce | alternate `pelvisPos: {y: -0.035}` / `{y: 0}` + `plant` | `Idle_Guard_Loop` |

---

## 5. Poses (100, real UAL frames)

Every pose is a full-body snapshot of a real UAL frame, so any pose you start from is on-style. Use the name in `pose` or `base`; prefix `~` for the mirror image (`"~jab_hit"` = the jab with the other hand). The full list with sources is at the end of this guide (Appendix A).

The ones you'll use most:

| family | start from | action poses |
|---|---|---|
| standing idle | `idle` | `idle_fold_arms`, `idle_talk`, `idle_phone`, `yes_nod` |
| unarmed | `guard` | `jab_hit`, `cross_start`, `cross_hit`, `hook_start`, `hook_hit`, `hook_lunge` |
| sword | `sword_idle` | `sword_a_windup`, `sword_a_hit`, `sword_a_end`, `sword_b_hit`, `sword_b_end`, `sword_c_hit`, `sword_block`, `sword_attack_windup`, `sword_attack_hit`, `sword_dash_hit` |
| shield | `shield_idle` | `shield_bash` |
| pistol | `pistol_idle` | `pistol_aim`, `pistol_aim_up`, `pistol_aim_down`, `pistol_recoil`, `pistol_reload` |
| magic | `spell_idle` | `spell_cast` |
| throw | `idle` | `throw_windup`, `throw_release`, `throw_end` |
| reactions | `idle` | `hit_chest`, `hit_head`, `knockback_air`, `knockback_down`, `death_buckle`, `death_down` |
| jump | `idle` | `jump_load`, `jump_air`, `jump_land`, `land_absorb`, `ninja_air` |
| low | `crouch_idle` | `kneel`, `plant_seed`, `harvest`, `sit`, `lay` |
| gait keys | — | `walk_contact_l/down_l/up_l/contact_r/down_r/up_r`, `jog_*`, `sprint_*`, `crouch_step_l/r`, `zombie_step_l/r` |

**Poses carry their own feet.** Blending between two poses whose feet differ (`guard` → `hook_lunge`) moves the feet across the floor: a step. That's right for combat (UAL does it: 0.5–1 m of foot travel in sword attacks) and wrong for anything meant to stand still. Pick poses from the same family, or use `plant`.

### Hands

`fist` (UAL default, ≈78° per joint), `sword_grip`, `pistol_grip`, `open` (spell), `relaxed` (seated), `flat` (T-pose). Written as `"hands": {"l": "fist", "r": "sword_grip"}`. The shape is held on every frame and overrides the fingers from the poses.

---

## 6. Eases

| ease | speed peaks at | use for | UAL example |
|---|---|---|---|
| `inOut` (default) | 50%, ~10% slow at each end | almost everything | 80% of all UAL segments |
| `out` | 18% | the start of a strike, a reaction, a launch | Jump_Start 0.23 |
| `snap` | 4% | the fastest accents: impact, block, recoil | Sword_Block 0.05 |
| `in` | 67% | a wind-up that accelerates into the release | Punch_Cross 0.58 |
| `hit` | 82% | accelerating into contact | Shield_OneShot 0.71 |
| `soft` | 50%, longer slow ends | a slow gentle move | — |
| `linear` | flat | mechanical motion only | — |
| `hold` | jumps at the end | stepped poses | — |
| `overshoot` | passes the target and comes back | a cartoony settle (prefer `spring`) | — |

---

## 7. Timing cheat sheet (frames at 30 fps, from UAL)

| move | frames |
|---|---|
| quick jab: guard → contact | 5 |
| power punch / slash: wind-up → contact | 4–6 wind-up, 3–5 strike |
| recovery after a strike | 15–25 |
| hit reaction: impact → peak | 3 (Hit_Chest peaks at frame 3–4 of 11) |
| hit reaction total | 10–33 |
| heavy wind-up (telegraph) | 12–20 |
| emote one-shot total | 45–80 |
| idle loop | 40–90 (1.3–3 s), one breathing cycle per 1.25 s |
| walk cycle | 40 (Walk_Loop); contact at 0 and 20, down 2 frames after each |
| jog / sprint cycle | 28 / 20 |
| minimum between two keys | 3 |

---

## 8. Validation: what the report says and how to fix it

`UALKit.validate(clip, lib, spec)` → `{ ok, fails[], warns[], metrics{} }`. **Fails must be fixed.** Warns must be fixed or declared with `expect`.

| message | cause | fix |
|---|---|---|
| `twist … on upperarm/thigh` | a twist crept onto a no-twist bone | the compiler strips it; move the twist to `lowerarm`/`hand` or `calf`/`foot` |
| `calf/lowerarm bends backwards` | `bend` negative, or a `fwd` that hyperextends | use `bend` ≥ 0 |
| `outside UAL range: bone axis N° vs UAL a…b` | past the library's 1–99% envelope by > 25° | reduce the offset; for stylised moves add `expect.rom: <extra degrees>` |
| `near edge of UAL range` | 10–25° past the envelope | usually fine; check it by eye |
| `loop seam` | loop doesn't close | set `loop: true` (the compiler closes it); check a key isn't sitting at the last frame |
| `fast frame N°/frame` | > 60°/frame | intended for impacts → `expect.snap`; otherwise add frames between the keys |
| `feet sink / dip` | a foot went below the floor | `ground` is on by default; if it persists, a pose pair has very different pelvis heights: add a middle key |
| `feet off the floor N%` | airborne clip | `expect.airborne` (jumps, swims, falls) |
| `planted feet slide` | a foot on the floor travels | `plant` (standing), `keepFeet` (over a clip), or `expect.slide` for in-place gaits and stepping combat |
| `centre of mass outside the feet` | leaning past balance | move `pelvisPos` over the standing foot, or `expect.offBalance` (falls, lunges) |
| `completely still` | a frozen frame | `breathe`, or `expect.still` (death, single poses) |
| `left and right nearly identical` | twinning | offset one side by 5–15° or 1–2 frames, or `expect.symmetric` |
| `contrast < N` | a strike reads soft | shorten the strike segment to 3–5 frames with `out`/`snap`, and lengthen the holds around it |
| `head swings N° in world` | with `expect.headStable` | add `lookLock` |

Metrics worth reading: `contrast` (peak ÷ median body speed; strikes ≥ 6), `peakAt` (0–1, early for strikes), `asymmetryDeg` (10–40), `headWorldRangeDeg` (≤ 6 in locomotion), `plantedSlide`, `comOutsideCm`.

---

## 9. The loop an agent runs

1. **Classify the request** as idle, idle variant, emote, unarmed strike, weapon attack, spell or throw, hit reaction, locomotion variant, interaction, transition, or loop gesture.
2. **Copy the template** (§10) and the nearest example (§11).
3. **Write `intent`** in one sentence.
4. **Choose the base.** A UAL clip if the body should keep doing something (walking, idling); a pose if the clip holds a stance.
5. **Key the story poses.** Real poses first, then `set` offsets. 3–5 keys per second of action.
6. **Time it** with §7. Put the accent early in one-shots. Every clip ends on its base pose (or a named end pose for sets).
7. **Add life:** `drag` on the head and hands (1–2), `spring` on the head, `breathe` on long holds, `hands`.
8. **Ground it:** `plant` or `keepFeet` when the pelvis moves; `lookLock` on locomotion.
9. **Compile and validate.** Fix every fail, fix or declare every warn.
10. **Look at the contact sheet** (front and side for every key). Score the rubric in `research/08-what-looks-good.md` §Critique; anything ≤ 2 goes back to step 5.
11. **Export**: Forge → *Export this .glb* or *Export all*, or `UALKit.writeGLB`. To ship it with the app, add the spec's name to `anim-specs/index.json`.

Headless (any JS sandbox, no browser page needed):

```js
eval(await readFile('quaternius/scripts/ual-anim-kit.js')); const K = window.UALKit;   // or require()
const g    = K.readGLB(await (await readFileBinary('quaternius/data/library/UAL1_Standard.glb')).arrayBuffer());
const skel = K.skeleton(g);
const P    = JSON.parse(await readFile('quaternius/data/ual-poses.json'));
const lib  = { skel, poses: P.poses, hands: P.hands, rom: P.rom,
               clips: Object.assign(K.clipsFromGLB(g, skel) /* + UAL2 for its clips */) };
const clip = K.compile(spec, lib);
const rep  = K.validate(clip, lib, spec);          // read rep.fails / rep.warns
const glb  = K.writeGLB(g, [clip], skel);          // ArrayBuffer: mannequin + clip
```

The contact sheet has one extra column, **paths**: every frame's hand (L orange, R blue) and foot positions drawn over the middle pose, front and side. Read it for arcs (straight lines on a swing are a problem), reach, and feet that wander.

In a browser, `forge.html` exposes `window.forge`: `forge.sheetPNG()` returns the sheet as a PNG data URL; `forge.critique()` returns the report plus the rubric headings to score; `forge.compile(spec)` returns the report and shows the sheet; `forge.open(name)`; `forge.sheetOnly(true)` shows only the contact sheet, for a screenshot; `forge.reports()`; `forge.glb()`.

## 9b. Continuity: from OK to good

A first pass with 4–5 keys (start, wind-up, hit, recover) passes every check and still looks like a mannequin switching poses. What made the difference on the reworked `Punch_Uppercut`, `Emote_Beckon` and `Hammer_Ground_Slam` (12–15 story beats each):

1. **Write the action as a sentence of beats first**, then make one custom pose per beat in `poses`: *bounce → coil → deeper coil → hips fire → arm rises → contact → overshoot → recoil → settle low → settle up → guard*. Each beat is a pose you could draw.
2. **Split every big move into the order the body does it.** The hips move before the shoulder, the shoulder before the fist (`hips_fire` at f14, `arm_rise` f16, `contact` f18). Two frames apart is enough to read.
3. **Two efforts for heavy things.** The hammer goes up to the chest (`heave1`), pauses, then goes overhead (`top`), then *hangs* 5 frames before coming down. Weight shows in the pauses, not the speed.
4. **Never end on arrival.** After the accent: an overshoot key (bigger than the hit), a recoil, then a settle that dips past the rest pose and comes back (`settle_low` → `settle_up` → `guard`).
5. **Hold on purpose, with life.** A hold is two keys with the same pose and a tiny offset between them (`smug` at f52 and f68 with a 2° head yaw), plus `breathe`.
6. **Give the free limbs a job.** The beckon's other hand goes to the hip; the uppercut's lead hand stays in guard with `drag` + `spring` so it reacts to the body.
7. **Put the accent ease only on the accent** (`snap`/`hit` into contact or impact; `in` on the frames that lead up to it; `out` after).
8. **Check it on a dense sheet.** Forge now fills gaps longer than 6 frames, so the sheet shows 12–18 frames. Every neighbouring pair should look like the same moment a split second apart; a jump between two tiles is a missing beat.

---

## 10. Templates

**Idle loop (a stance with a mood)**
```json
{ "name": "Idle_<Mood>_Loop", "loop": true, "duration": 2.5, "intent": "…",
  "base": "idle",
  "keys": [{ "f": 0, "pose": "idle", "set": { "spine_03": {"fwd": 0}, "Head": {"fwd": 0}, "pelvisPos": {"y": 0} } }],
  "keepFeet": true, "breathe": { "cycles": 2, "amp": 1 }, "hands": { "l": "fist", "r": "fist" } }
```

**Idle variant (base idle + one limb)**
```json
{ "name": "Idle_<Thing>_Loop", "loop": true, "base": { "clip": "Idle_Loop" },
  "layers": [{ "mask": "arm_r", "keys": [{ "f": 0, "pose": "idle", "set": { "upperarm_r": {"fwd": 40}, "lowerarm_r": {"bend": 50} } }] }],
  "hands": { "r": "open" } }
```

**Emote one-shot (from idle, back to idle)**
```json
{ "name": "Emote_<X>", "duration": 2.0, "base": "idle",
  "keys": [ {"f": 0, "pose": "idle"}, {"f": 10, "pose": "idle", "ease": "out", "set": {}}, {"f": 30, "pose": "idle", "set": {}}, {"f": 60, "pose": "idle"} ],
  "drag": {"Head": 2, "hand_l": 1, "hand_r": 2}, "plant": "all" }
```

**Strike or combo (guard or stance family)**
```json
{ "name": "<Style>_<Attack>", "duration": 1.2, "base": "guard",
  "keys": [ {"f": 0, "pose": "guard"}, {"f": 4, "pose": "cross_start", "ease": "in"}, {"f": 8, "pose": "cross_hit", "ease": "snap"}, {"f": 30, "pose": "guard"} ],
  "drag": {"Head": 1, "hand_r": 1}, "spring": {"bones": ["Head"], "freq": 3.5, "damping": 0.5},
  "expect": {"snap": true, "contrast": 6} }
```

**Hit reaction (ends exactly on idle)**
```json
{ "name": "Hit_<Where>", "duration": 1.0, "base": "idle",
  "keys": [ {"f": 0, "pose": "idle"}, {"f": 3, "pose": "hit_chest", "ease": "snap"}, {"f": 8, "pose": "hit_chest", "ease": "out", "set": {"spine_03": {"fwd": -12}}}, {"f": 30, "pose": "idle"} ],
  "plant": "all", "spring": [{"bones": ["Head"], "freq": 3, "damping": 0.35}], "expect": {"snap": true} }
```

**Locomotion variant (a UAL gait + a layer)**
```json
{ "name": "Walk_<Style>_Loop", "loop": true, "base": { "clip": "Walk_Loop", "speed": 1.0 },
  "layers": [{ "additive": true, "keys": [{ "f": 0, "set": { "spine_03": {"fwd": 10}, "pelvisPos": {"y": -0.05} } }] }],
  "keepFeet": true, "lookLock": { "weight": 0.8 }, "expect": { "slide": true } }
```
Locomotion bases: `Walk_Loop`, `Walk_Formal_Loop`, `Walk_Carry_Loop`, `Jog_Fwd_Loop`, `Sprint_Loop`, `Crouch_Fwd_Loop`, `Zombie_Walk_Fwd_Loop`, `Push_Loop`, `Swim_Fwd_Loop`. `speed` < 1 slows the cycle; in-place speed drops with it (walk ≈ 0.95 m/s × speed).

**Set (Start → Loop → End)**: write three specs. The Start's last key is the Loop's pose; the Loop's key 0 is that pose; the End's key 0 is that pose again and its last key is `idle`.

---

## 11. Worked examples: request → decisions → spec

The specs are in `anim-specs/`, full text in Appendix B. What each one teaches:

| request | spec | decisions that matter |
|---|---|---|
| "a tired idle" | `Idle_Tired_Loop` | a single pose + offsets; `keepFeet` because the pelvis drops; slow deep `breathe` (1 cycle, amp 2.4); `relaxed` hands |
| "wave hello" | `Emote_Wave` | base = the real `Idle_Loop` clip so the body keeps living; an override layer on `arm_r` only; the wave as `lean` alternating ±20 on the forearm relative to the raised anchor; hand `drag` 2; a small additive head tilt |
| "jab, cross, hook combo" | `Punch_Combo_Jab_Cross_Hook` | pure UAL poses in sequence; `out` into every hit; `guard` between hits; `expect.slide` because the poses pivot the feet |
| "ninja run" | `Run_Ninja_Loop` | base `Jog_Fwd_Loop`; an arms override from `idle` with `fwd: -55` (beyond UAL, so `expect.rom: 60`); additive spine lean; `lookLock` with pitch −10 |
| "sneak" | `Walk_Sneak_Loop` | base `Walk_Loop` at 0.7 speed; one additive key lowers the pelvis 13 cm and leans forward; **`keepFeet`** re-solves the legs so the stride survives |
| "heavy sword lunge" | `Sword_Lunge_Heavy` | wind-up with an `in` ease, then a `snap` 4 frames later, a held follow-through, a long recovery; head `spring` |
| "front kick" | `Kick_Front` | offsets on `guard`: `thigh fwd` + `calf bend` for the chamber, `bend: 6` to extend; plant the standing foot for the whole clip and the kicking foot only at the ends; pelvis over the standing foot |
| "dodge back" | `Dodge_Back` | pelvis back and down + spine lean back + head countering; `plant: "all"` pins both feet |
| "get hit hard" | `Hit_Stagger` | a 3-frame `snap` into `hit_chest`, an exaggerated follow-through, back to `idle` exactly; low-damping springs on the head and forearms |
| "bow" | `Emote_Bow` | a hip bend spread across spine_02/03 + neck + head; the right hand to the chest; a long hold; `breathe` during the hold |
| "cheer" | `Emote_Cheer` | arms placed with `aim` (a single `out` rotation doesn't reach overhead from UAL's asymmetric idle arms); `bend -20` straightens the elbows; two pumps with the pelvis dipping |
| "shrug" | `Emote_Shrug` | clavicles up, forearm `twist` ±80 to turn the palms up, `open` hands |
| "charge and release a spell" | `Spell_Charge_Release` | a 26-frame `in` gather, an additive tremble layer (alternating ±3–4° every 2 frames), a `snap` release, contrast 32 |
| "boxer bounce" | `Idle_Guard_Loop` | a loop on the guard pose; the pelvis dips twice per cycle with a side shift; `plant: "all"` turns the dips into knee bends |
| "two sword slashes" | `Sword_Combo_Double` | UAL `_a` / `_b` poses chained, each hit on `snap` |
| "look around" | `Idle_LookAround_Loop` | base `Idle_Loop` (loops twice in 5 s); an additive head-leads yaw split Head 22 / neck 10 / chest 5 |
| "wounded walk" | `Walk_Wounded_Loop` | an override on `arm_l` holding the ribs + an additive lean toward the wound, over a 0.75× walk |
| "throw a grenade" | `Throw_Grenade` | UAL throw poses re-timed: 14-frame `in` wind-up, 4-frame `snap` release |
| "press a button" | `Interact_Press` | an override on arm + spine + head over the idle clip; the reach placed with `aim` straight ahead, a small push, hold, return |
| "fire twice" | `Pistol_Double_Tap` | UAL aim + recoil poses, each shot a 2-frame `snap`; the recoil exaggerated with `hand up` + `bend` so it reads; contrast 140 |
| "point over there" | `Emote_Point` | the head leads (`drag` −2 on the head = it arrives *early*), the arm follows; a long hold with `breathe` |
| "shield takes a hit" | `Shield_Block_Impact` | pushed back 6–7 cm with both feet planted; a `snap` in 3 frames, absorb, recover |
| "get shot and die" | `Death_Collapse` | UAL death poses re-timed; `hit` ease into the ground; hands and head `spring` so limbs flop and settle; `expect.still` for the end |
| "sword idle, scanning" | `Idle_Sword_Ready_Loop` | base `Sword_Idle` looping twice; an additive head sweep with the chest at a quarter and the blade tip drifting |
| "zombie lunges and grabs" | `Zombie_Lunge_Grab` | rear back (`in`), lunge (`snap`), then clutch with `bend` 55–60 and fists; back to `zombie_idle` |

| "a bigger jump, as a set" | `Jump_Big_Set` | `parts`: Start (load → air), Loop (`@prev`-based drift), Land (`join: false`, impact → absorb → idle) |
| "start walking / stop walking" | `Walk_Start`, `Walk_Stop` | `base.seq` crossfades idle ↔ `Walk_Loop`; Start's offset makes its last frame land on the loop's frame 0 |
| "two-handed axe chop" | `Axe_Chop_Overhead` | custom `poses` built from UAL chop frames with `aim` overhead; `inOut` raise, `snap` drop |
| "drunk walk" | `Walk_Drunk_Loop` | an additive sway (lean ±6, pelvis ±3 cm) at one cycle per stride pair over a 0.8× walk; low-damping springs on head and hands |
| "kneel and pray" | `Kneel_Pray_Set` | a three-part set with custom prayer pose; the loop part is just `@prev` + `breathe` |
| "impatient idle" | `Idle_Impatient_Loop` | written blind from this guide: `Idle_FoldArms_Loop` base + additive toe-tap (`foot_r up`) + head-glance layers |
| "facepalm" | `Emote_Facepalm` | written blind: the hand placed with `aim`, `bend` kept under the elbow limit (trap 4 caught it) |
| "turn 90° left in place" | `Turn_Left_90` (+ `_R`) | pelvis `yaw` keys with the head leading and the chest following; feet step round through `plant` windows (planted → free with an additive lift → replanted where they land); ends facing +X, so the game applies a 90° root turn |
| "draw and loose a bow" | `Bow_Draw_Release` | three custom poses (ready, draw, release) placed with `aim`; the chest turns side-on (`yaw −38`); a 2-frame `snap` release with springs on the string hand |
| "hold a rifle at low ready" | `Rifle_Idle_Loop` | a custom two-hand pose: rear hand at the hip, front hand forward under the barrel, `pistol_grip` on both hands; breathe + scan layer |
| "uppercut" | `Punch_Uppercut` (+ `_L`) | built blind as a proof. The first compile failed (elbow 165°: `guard` is already bent, so `bend` stacked). The forearm was then placed with `aim` on `lowerarm_r` itself, because a forward-raised upper arm folds a `bend` across the face |
| "come here" | `Emote_Beckon` | proof: palm up via forearm `twist 70`, two beckons as `hand fwd 25` keys over the anchor |
| "warhammer ground slam" | `Hammer_Ground_Slam` | proof: the first compile sank the feet 43 cm (pelvis −16 cm under `plant`); fixed at −5 cm with the bend moved into the spine. A breakdown key (arms forward) keeps the swing on an arc. Arms straight up together are beyond UAL, so `expect.rom 40` is declared |
| "a god displaying its power" | `God_Power_Display` (7.2 s, 17 beats) | levitation is just `pelvisPos.y` with the feet unplanted (toes pointed via `foot up −30…−40`); arms placed by `aim` in the character's side plane (z ≈ 0.05–0.15, or they read as zombie arms); the power is the contrast between a slow soft build and a 3-frame `snap` detonation, followed by an additive tremble layer that decays over 20 frames; `plant` only at the start and end |
| "the god, floating" | `God_Hover_Loop` | a hover pose 45 cm up, a slow tidal bob in 4 keys, and big `drag` on hands and feet so the extremities drift behind the body |
| "summon something from the earth" | `God_Summon_Rise` | a strain beat = a held pose plus an additive tremble layer (±2° every 2 frames); a two-stage haul (mid → high) before the triumph; the crouch depth lives in the spine because `plant` limits the pelvis drop (trap 14 hit on the first compile: feet sank 42 cm) |
| "divine judgment" | `God_Judgment` | the head leads by 14 frames, chest then hips follow; 20 frames of stillness before a 4-frame clench-and-drop; the free arm flings back for balance |
| "ascend into the sky" | `God_Ascend` | starts from the `kneel` pose, `plant` only until push-off; heavy `drag` on feet and calves so the legs trail as it rises |
| (variants) | `Kick_Front_Heavy`, `Kick_Front_L`, `Punch_…_Southpaw`, `Walk_Sneak_Root_Loop` | `timeScale`/`amp`, `mirror`, root motion from one spec each |

---

## 12. Traps (each one cost an iteration while building the examples)

1. **Keys without `pose` are relative to the anchor, not cumulative.** Writing the same absolute values on every key of an arms layer *doubled* them (arms swung overhead instead of back). Either give every key a `pose`, or write per-key deltas relative to the anchor.
2. **Offsets use the pose they're applied to.** `upperarm fwd -55` on a jog pose (arm already swinging) is not the same as on `idle` (arm hanging). Anchor limb overrides on `idle` unless you want the motion underneath.
3. **Use `bend` for elbows and knees.** `up`/`fwd` on a vertical forearm has no unique direction and can swing it sideways.
4. **The total elbow is idle's 30° + your bend.** `bend: 105` is 135° total: outside UAL and a fail. Keep the total ≤ 120.
5. **`keepFeet` against stepping poses contorts the legs.** It pins the feet where the *base* has them; if the keyed poses step, the legs fight. Use it over a base clip or a single pose, not across a stance change.
6. **`plant` over big pelvis moves can overbend the legs.** Keep pelvis moves under ~15 cm, or plant only the standing foot.
7. **Blending between poses with different pelvis heights dips the feet.** `ground` fixes it automatically; if a clip still sinks, add a middle key.
8. **The elbow hinge follows the upper arm's twist-free swing from the T-pose.** Raising the arm *forward* to horizontal (`fwd` 90) leaves the elbow hinge vertical, so `bend` then folds the forearm *across the chest*, not up. For forearms up, raise the arm *sideways* (`out`) and bend, or go overhead with `out` 120–140 (inside UAL's range). The arm can't be twisted to fix this: UAL never twists the upper arm.
9. **Some UAL frames aren't what the name suggests.** `Sword_Attack` is a lunging slash, not an overhead chop; `Melee_Hook@8` is a deep lunge. Look at a pose on the sheet (`?ref=Clip`) before building on it.
10. **`fwd`/`out` rotate about one axis chosen from where the bone points now.** UAL's idle arms hang unevenly (the right one further back), so the same `out` value raises the two arms differently. When the destination matters, use `aim` with an explicit direction.
11. **The idle elbow is already bent 30°.** Arms that should read straight need `bend: -20…-25`.
12. **Turning in place = stepping with `plant` windows.** Planting a foot for a whole 90° turn twists the leg 90°. Plant each foot, free it for 6–8 frames with an additive lift (`thigh fwd 20–24`, `calf bend 28–34`), and replant it; a free foot rotates with the pelvis, so it lands facing the new direction. (`Turn_Left_90`)
13. **`aim` works on forearms too.** When the upper arm is raised forward, place the forearm with `lowerarm: {aim: [...]}` instead of `bend`. The validator still stops a backward elbow.
14. **Big pelvis drops under `plant` sink or buckle the legs.** Keep it under ~6 cm and put the rest of the bend in `spine_02`/`spine_03`.
15. **Keep loops loop-shaped.** `loop: true` plus a first key of the same pose. The drag, spring and breathe passes wrap around the seam by themselves.

## 13. Checked on the female mannequin

Every example was also compiled and validated on `UAL2_Female.glb` (narrower shoulders, different arm rest angle): all pass (`anim-specs/_reports_female.json`). Poses are local rotations, so they transfer. The IK passes (plant, keepFeet, ground) re-solve per body. The one issue found, an elbow hyperextending by 8° on the female cross punch, is now clamped for every body (knees and elbows stop at −3°).

## 14. Limits

- In place only (like UAL): no root motion. Travel speed is implied by the gait clip you build on.
- Leg IK is analytic two-bone: it holds feet on a flat floor, not on stairs or slopes.
- Fingers come from hand shapes; there's no per-finger animation.
- Mesh-level problems (twist collapse on the stock mannequin skin) aren't the kit's job; keep inside the ranges and they don't show.

---

## Appendix A — pose catalog

`pelvis y` is the pelvis height in metres (idle 0.873). The source is the UAL clip and frame the pose was read from; open it in Forge with `?ref=<Clip>`.

### neutral

| pose | source | pelvis y | notes |
|---|---|---|---|
| `tpose` | A_TPose@0 | 0.917 | bind pose, arms out |

### idle

| pose | source | pelvis y | notes |
|---|---|---|---|
| `idle` | Idle_Loop@0 | 0.877 | the base: soft knees, hips yawed, loose fists |
| `idle_fold_arms` | Idle_FoldArms_Loop@0 | 0.877 | arms folded |
| `idle_talk` | Idle_Talking_Loop@peak | 0.872 | mid gesture |
| `idle_lantern` | Idle_Lantern_Loop@0 | 0.877 | right hand holds a lantern out |
| `idle_torch` | Idle_Torch_Loop@0 | 0.877 | left hand raises a torch |
| `idle_phone` | Idle_TalkingPhone_Loop@0 | 0.876 | hand at the ear |
| `idle_rail` | Idle_Rail_Loop@0 | 0.923 | leaning on a rail |
| `yes_nod` | Yes@peak | 0.882 | nod gesture peak |
| `zombie_idle` | Zombie_Idle_Loop@0 | 0.743 | hunched, knees bent, arms hanging |
| `crouch_idle` | Crouch_Idle_Loop@0 | 0.469 | low crouch |
| `sit` | Sitting_Idle_Loop@0 | 0.542 | seated on a chair-height surface |
| `sit_talk` | Sitting_Talking_Loop@peak | 0.542 | seated gesture |
| `kneel` | Fixing_Kneeling@low | 0.398 | one knee down, working |

### ground

| pose | source | pelvis y | notes |
|---|---|---|---|
| `lay` | LayToIdle@0 | 0.044 | lying on the back |

### walk

| pose | source | pelvis y | notes |
|---|---|---|---|
| `walk_contact_l` | Walk_Loop@0 | 0.871 | left heel strikes |
| `walk_down_l` | Walk_Loop@2 | 0.865 | weight drops onto left |
| `walk_up_l` | Walk_Loop@12 | 0.918 | high point, right leg passing |
| `walk_contact_r` | Walk_Loop@20 | 0.871 | right heel strikes |
| `walk_down_r` | Walk_Loop@22 | 0.865 | weight drops onto right |
| `walk_up_r` | Walk_Loop@32 | 0.918 | high point, left leg passing |
| `crouch_step_l` | Crouch_Fwd_Loop@0 | 0.47 | crouched, left planted |
| `crouch_step_r` | Crouch_Fwd_Loop@29 | 0.465 | crouched, right planted |
| `zombie_step_l` | Zombie_Walk_Fwd_Loop@0 | 0.814 | zombie, left planted |
| `zombie_step_r` | Zombie_Walk_Fwd_Loop@20 | 0.808 | zombie, dragging right |
| `carry` | Walk_Carry_Loop@0 | 0.792 | arms holding a box, leaning back |
| `push` | Push_Loop@0 | 0.724 | leaning into a push, arms locked |

### run

| pose | source | pelvis y | notes |
|---|---|---|---|
| `jog_contact_l` | Jog_Fwd_Loop@1 | 0.772 | left contact |
| `jog_down_l` | Jog_Fwd_Loop@3 | 0.701 | load on left |
| `jog_flight_l` | Jog_Fwd_Loop@9 | 0.946 | airborne after left push |
| `jog_contact_r` | Jog_Fwd_Loop@15 | 0.772 | right contact |
| `jog_down_r` | Jog_Fwd_Loop@17 | 0.701 | load on right |
| `jog_flight_r` | Jog_Fwd_Loop@23 | 0.946 | airborne after right push |
| `sprint_contact_l` | Sprint_Loop@0 | 0.867 | left contact, trunk 35° forward |
| `sprint_down_l` | Sprint_Loop@2 | 0.795 |  |
| `sprint_flight_l` | Sprint_Loop@6 | 0.933 |  |
| `sprint_contact_r` | Sprint_Loop@10 | 0.867 |  |
| `sprint_down_r` | Sprint_Loop@12 | 0.795 |  |
| `sprint_flight_r` | Sprint_Loop@16 | 0.933 |  |

### swim

| pose | source | pelvis y | notes |
|---|---|---|---|
| `swim` | Swim_Fwd_Loop@0 | -0.077 | horizontal stroke |
| `swim_tread` | Swim_Idle_Loop@0 | -0.329 | treading water |

### seated

| pose | source | pelvis y | notes |
|---|---|---|---|
| `drive` | Driving_Loop@0 | 0.539 | hands on a wheel |

### unarmed

| pose | source | pelvis y | notes |
|---|---|---|---|
| `guard` | Punch_Jab@0 | 0.825 | boxing guard |
| `jab_hit` | Punch_Jab@5 | 0.827 | lead hand fully extended |
| `cross_start` | Punch_Cross@0 | 0.825 | guard, rear hand loaded |
| `cross_hit` | Punch_Cross@7 | 0.852 | rear hand extended, hips turned through |
| `hook_start` | Melee_Hook@2 | 0.663 | hook loading |
| `hook_hit` | Melee_Hook@5 | 0.626 | standing hook at contact |
| `hook_end` | Melee_Hook_Rec@last | 0.825 | recovered |
| `hook_lunge` | Melee_Hook@8 | 0.456 | hook that drops into a deep lunge |

### sword

| pose | source | pelvis y | notes |
|---|---|---|---|
| `sword_idle` | Sword_Idle@0 | 0.728 | sword stance, deep knees |
| `sword_a_windup` | Sword_Regular_A@3 | 0.719 |  |
| `sword_a_hit` | Sword_Regular_A@8 | 0.577 | slash A at contact |
| `sword_a_end` | Sword_Regular_A@last | 0.572 | end of slash A = start of A_Rec |
| `sword_b_hit` | Sword_Regular_B@8 | 0.536 | slash B at contact |
| `sword_b_end` | Sword_Regular_B@last | 0.544 |  |
| `sword_c_hit` | Sword_Regular_C@20 | 0.652 |  |
| `sword_block` | Sword_Block@3 | 0.693 | blade up, guarding |
| `sword_attack_windup` | Sword_Attack@10 | 0.773 | overhead windup |
| `sword_attack_hit` | Sword_Attack@14 | 0.54 | overhead strike |
| `sword_dash_hit` | Sword_Dash@9 | 0.497 | lunge |

### shield

| pose | source | pelvis y | notes |
|---|---|---|---|
| `shield_idle` | Idle_Shield_Loop@0 | 0.877 | shield raised on the left arm |
| `shield_bash` | Shield_OneShot@6 | 0.835 | bash at contact |

### pistol

| pose | source | pelvis y | notes |
|---|---|---|---|
| `pistol_idle` | Pistol_Idle_Loop@0 | 0.877 | two-hand low ready |
| `pistol_aim` | Pistol_Aim_Neutral@0 | 0.877 | aim level |
| `pistol_aim_up` | Pistol_Aim_Up@0 | 0.877 |  |
| `pistol_aim_down` | Pistol_Aim_Down@0 | 0.877 |  |
| `pistol_recoil` | Pistol_Shoot@peak | 0.877 | recoil peak |
| `pistol_reload` | Pistol_Reload@peak | 0.877 | mid reload |

### magic

| pose | source | pelvis y | notes |
|---|---|---|---|
| `spell_idle` | Spell_Simple_Idle_Loop@0 | 0.877 | casting stance |
| `spell_cast` | Spell_Simple_Shoot@5 | 0.873 | release |

### throw

| pose | source | pelvis y | notes |
|---|---|---|---|
| `throw_windup` | OverhandThrow@5 | 0.83 | arm cocked back |
| `throw_release` | OverhandThrow@12 | 0.63 | release |
| `throw_end` | OverhandThrow@last | 0.877 |  |

### reaction

| pose | source | pelvis y | notes |
|---|---|---|---|
| `hit_chest` | Hit_Chest@4 | 0.864 | hit in the chest |
| `hit_head` | Hit_Head@4 | 0.875 | head snapped back |
| `knockback_air` | Hit_Knockback@11 | 0.038 | thrown back, airborne |
| `knockback_down` | Hit_Knockback@last | 0.057 | landed on the back |
| `death_buckle` | Death01@12 | 0.699 | knees buckling |
| `death_down` | Death01@last | 0.063 | dead on the ground |
| `zombie_scratch` | Zombie_Scratch@peak | 0.603 | zombie swipe |

### jump

| pose | source | pelvis y | notes |
|---|---|---|---|
| `jump_load` | Jump_Start@low | 0.523 | deep load before takeoff |
| `jump_air` | Jump_Loop@0 | 0.868 | airborne |
| `jump_land` | Jump_Land@0 | 0.927 | touchdown |
| `land_absorb` | Jump_Land@low | 0.431 | absorbing the landing |
| `ninja_air` | NinjaJump_Idle_Loop@0 | 0.878 | tucked airborne |

### traversal

| pose | source | pelvis y | notes |
|---|---|---|---|
| `roll_tuck` | Roll@peak | 0.803 | tucked in a roll |
| `climb_reach` | ClimbUp_1m@0 | 0.829 | hands on a ledge |
| `slide` | Slide_Loop@0 | 0.048 | baseball slide |

### work

| pose | source | pelvis y | notes |
|---|---|---|---|
| `interact_reach` | Interact@15 | 0.869 | reaching forward to press/use |
| `pickup_reach` | PickUp_Table@peak | 0.887 | reaching down to a table |
| `chest_open` | Chest_Open@peak | 0.822 | lifting a lid |
| `consume` | Consume@peak | 0.877 | hand at the mouth |
| `harvest` | Farm_Harvest@peak | 0.714 | bent to the ground |
| `plant_seed` | Farm_PlantSeed@low | 0.38 | crouched at the soil |
| `water` | Farm_Watering@peak | 0.869 | pouring |
| `chop_windup` | TreeChopping_Loop@0 | 0.786 | axe raised |
| `chop_hit` | TreeChopping_Loop@4 | 0.773 | axe strike |

### dance

| pose | source | pelvis y | notes |
|---|---|---|---|
| `dance_a` | Dance_Loop@0 | 0.896 |  |
| `dance_b` | Dance_Loop@15 | 0.911 |  |

### hands

`fist` · `sword_grip` · `pistol_grip` · `open` · `relaxed` · `flat`

### UAL clips usable as `base.clip` or `"Clip@frame"`

Every clip in UAL1_Standard.glb and UAL2_Standard.glb: see `research/02-clip-catalog.md`.

---

## Appendix B — the example specs, in full

Each file compiles, and every clip it produces passes validation on the standard and the female mannequin. The warnings listed are known and were judged fine by eye on the contact sheet.

### Punch_Uppercut

*rear uppercut, read as one continuous action: a small bounce in guard, drop and coil onto the back leg, hips fire first, then shoulder, then the fist rises under the chin as the body rises onto the toes; overshoot, recoil, settle back into guard with the weight rocking*

`Punch_Uppercut`: pass · contrast 8.2 · 1.6 s · warns: near edge of UAL range: thigh_r x 45° vs UAL -114.2…30.5 (f21)  
`Punch_Uppercut_L`: pass · contrast 8.2 · 1.6 s · warns: near edge of UAL range: thigh_l x 45° vs UAL -121…20.9 (f21)

```json
{
 "name": "Punch_Uppercut",
 "duration": 1.6,
 "intent": "rear uppercut, read as one continuous action: a small bounce in guard, drop and coil onto the back leg, hips fire first, then shoulder, then the fist rises under the chin as the body rises onto the toes; overshoot, recoil, settle back into guard with the weight rocking",
 "base": "guard",
 "poses": {
  "bounce": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": 0.012
    },
    "Head": {
     "fwd": -2
    }
   }
  },
  "coil1": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.045,
     "x": -0.02,
     "z": -0.01
    },
    "spine_03": {
     "fwd": 8,
     "yaw": -14,
     "lean": -4
    },
    "spine_02": {
     "yaw": -6
    },
    "pelvis": {
     "yaw": -6
    },
    "upperarm_r": {
     "aim": [
      -0.28,
      -0.8,
      0.52
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.05,
      0.35,
      0.94
     ]
    },
    "Head": {
     "fwd": 6,
     "yaw": 4
    }
   }
  },
  "coil2": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.075,
     "x": -0.03,
     "z": -0.015
    },
    "spine_03": {
     "fwd": 12,
     "yaw": -22,
     "lean": -6
    },
    "spine_02": {
     "yaw": -10
    },
    "pelvis": {
     "yaw": -10
    },
    "upperarm_r": {
     "aim": [
      -0.32,
      -0.85,
      0.42
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.08,
      0.2,
      0.97
     ]
    },
    "Head": {
     "fwd": 8,
     "yaw": 6
    }
   }
  },
  "hips_fire": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.05,
     "x": 0
    },
    "spine_03": {
     "fwd": 9,
     "yaw": -8,
     "lean": -2
    },
    "spine_02": {
     "yaw": -2
    },
    "pelvis": {
     "yaw": 10
    },
    "upperarm_r": {
     "aim": [
      -0.3,
      -0.82,
      0.48
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.05,
      0.3,
      0.95
     ]
    },
    "Head": {
     "fwd": 6
    }
   }
  },
  "arm_rise": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.01,
     "x": 0.02
    },
    "spine_03": {
     "fwd": 0,
     "yaw": 10
    },
    "spine_02": {
     "yaw": 6
    },
    "pelvis": {
     "yaw": 14
    },
    "upperarm_r": {
     "aim": [
      -0.12,
      -0.45,
      0.88
     ]
    },
    "lowerarm_r": {
     "aim": [
      0.05,
      0.8,
      0.6
     ]
    },
    "Head": {
     "fwd": 0
    }
   }
  },
  "contact": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": 0.035,
     "x": 0.035
    },
    "spine_03": {
     "fwd": -12,
     "yaw": 24,
     "lean": 3
    },
    "spine_02": {
     "yaw": 12
    },
    "pelvis": {
     "yaw": 16
    },
    "upperarm_r": {
     "aim": [
      -0.05,
      -0.15,
      0.99
     ]
    },
    "lowerarm_r": {
     "aim": [
      0.12,
      0.93,
      0.35
     ]
    },
    "hand_r": {
     "fwd": -10
    },
    "Head": {
     "fwd": -6
    }
   }
  },
  "overshoot": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": 0.04,
     "x": 0.04
    },
    "spine_03": {
     "fwd": -16,
     "yaw": 28,
     "lean": 4
    },
    "spine_02": {
     "yaw": 14
    },
    "pelvis": {
     "yaw": 17
    },
    "upperarm_r": {
     "aim": [
      -0.02,
      0,
      1
     ]
    },
    "lowerarm_r": {
     "aim": [
      0.15,
      0.95,
      0.25
     ]
    },
    "hand_r": {
     "fwd": -14
    },
    "Head": {
     "fwd": -9
    }
   }
  },
  "recoil": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": 0.01,
     "x": 0.02
    },
    "spine_03": {
     "fwd": -4,
     "yaw": 12
    },
    "spine_02": {
     "yaw": 6
    },
    "pelvis": {
     "yaw": 8
    },
    "upperarm_r": {
     "aim": [
      -0.2,
      -0.55,
      0.8
     ]
    },
    "lowerarm_r": {
     "aim": [
      0,
      0.7,
      0.7
     ]
    },
    "Head": {
     "fwd": -2
    }
   }
  },
  "settle_low": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.022,
     "x": 0.008
    },
    "spine_03": {
     "fwd": 4
    },
    "Head": {
     "fwd": 3
    }
   }
  },
  "settle_up": {
   "from": "guard",
   "set": {
    "pelvisPos": {
     "y": 0.006
    }
   }
  }
 },
 "keys": [
  {
   "f": 0,
   "pose": "guard"
  },
  {
   "f": 4,
   "pose": "bounce"
  },
  {
   "f": 8,
   "pose": "coil1",
   "ease": "inOut"
  },
  {
   "f": 12,
   "pose": "coil2",
   "ease": "out"
  },
  {
   "f": 14,
   "pose": "hips_fire",
   "ease": "in"
  },
  {
   "f": 16,
   "pose": "arm_rise",
   "ease": "in"
  },
  {
   "f": 18,
   "pose": "contact",
   "ease": "snap"
  },
  {
   "f": 21,
   "pose": "overshoot",
   "ease": "out"
  },
  {
   "f": 26,
   "pose": "recoil",
   "ease": "inOut"
  },
  {
   "f": 34,
   "pose": "settle_low",
   "ease": "inOut"
  },
  {
   "f": 40,
   "pose": "settle_up"
  },
  {
   "f": 47,
   "pose": "guard"
  }
 ],
 "drag": {
  "Head": 2,
  "hand_r": 1,
  "hand_l": 2,
  "lowerarm_l": 1
 },
 "plant": "all",
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 3,
   "damping": 0.45
  },
  {
   "bones": [
    "hand_l",
    "lowerarm_l"
   ],
   "freq": 3,
   "damping": 0.5
  }
 ],
 "variants": [
  {
   "suffix": "_L",
   "mirror": true
  }
 ],
 "expect": {
  "snap": true,
  "contrast": 6
 }
}
```

### Emote_Beckon

*cocky "come at me": weight drops onto one hip, the free hand goes to the hip, the other palm comes up; two finger-curl beckons, the second bigger with a chin flick; a smug hold, then it all comes back down in overlap*

`Emote_Beckon`: pass · contrast 4.1 · 3.2 s

```json
{
 "name": "Emote_Beckon",
 "duration": 3.2,
 "intent": "cocky \"come at me\": weight drops onto one hip, the free hand goes to the hip, the other palm comes up; two finger-curl beckons, the second bigger with a chin flick; a smug hold, then it all comes back down in overlap",
 "base": "idle",
 "poses": {
  "hip_shift": {
   "from": "idle",
   "set": {
    "pelvisPos": {
     "x": -0.035,
     "z": -0.01
    },
    "pelvis": {
     "lean": -4,
     "yaw": 6
    },
    "spine_02": {
     "lean": 3
    },
    "spine_03": {
     "lean": 4,
     "yaw": -4
    },
    "Head": {
     "lean": -3
    }
   }
  },
  "hand_on_hip": {
   "from": "hip_shift",
   "set": {
    "upperarm_l": {
     "out": 28,
     "fwd": -8
    },
    "lowerarm_l": {
     "bend": 70
    },
    "hand_l": {
     "fwd": 12
    }
   }
  },
  "palm_up": {
   "from": "hand_on_hip",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.3,
      -0.3,
      0.9
     ]
    },
    "lowerarm_r": {
     "bend": 45,
     "twist": 75
    },
    "hand_r": {
     "fwd": 6
    },
    "spine_03": {
     "fwd": -5,
     "yaw": 6
    },
    "Head": {
     "fwd": -8,
     "lean": -4
    }
   }
  },
  "curl": {
   "from": "palm_up",
   "set": {
    "lowerarm_r": {
     "bend": 18
    },
    "hand_r": {
     "fwd": 32
    }
   }
  },
  "curl_big": {
   "from": "palm_up",
   "set": {
    "lowerarm_r": {
     "bend": 26
    },
    "hand_r": {
     "fwd": 40
    },
    "Head": {
     "fwd": -14,
     "lean": -6
    },
    "spine_03": {
     "fwd": -8
    }
   }
  },
  "smug": {
   "from": "palm_up",
   "set": {
    "Head": {
     "fwd": -12,
     "lean": -7,
     "yaw": 4
    },
    "spine_03": {
     "fwd": -7
    }
   }
  }
 },
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 10,
   "pose": "hip_shift",
   "ease": "inOut"
  },
  {
   "f": 18,
   "pose": "hand_on_hip"
  },
  {
   "f": 26,
   "pose": "palm_up",
   "ease": "out"
  },
  {
   "f": 32,
   "pose": "curl",
   "ease": "in"
  },
  {
   "f": 37,
   "pose": "palm_up",
   "ease": "out"
  },
  {
   "f": 43,
   "pose": "curl_big",
   "ease": "in"
  },
  {
   "f": 48,
   "pose": "palm_up",
   "ease": "out"
  },
  {
   "f": 52,
   "pose": "smug"
  },
  {
   "f": 68,
   "pose": "smug",
   "set": {
    "Head": {
     "yaw": 2
    }
   }
  },
  {
   "f": 78,
   "pose": "hand_on_hip",
   "ease": "inOut"
  },
  {
   "f": 86,
   "pose": "hip_shift"
  },
  {
   "f": 96,
   "pose": "idle"
  }
 ],
 "drag": {
  "hand_r": 2,
  "Head": 2,
  "lowerarm_l": 1,
  "hand_l": 2
 },
 "plant": "all",
 "breathe": {
  "amp": 0.7
 },
 "hands": {
  "r": "open",
  "l": "fist"
 },
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 2.5,
   "damping": 0.45
  },
  {
   "bones": [
    "hand_r"
   ],
   "freq": 3,
   "damping": 0.4
  }
 ]
}
```

### Hammer_Ground_Slam

*two-handed warhammer, heavy: sink and grip, heave it up in two efforts (to the chest, then overhead, rising onto the toes and arching back), a hang at the top, then the whole body pulls it down; impact, a small rebound, a tired settle, and a laboured drag back to standing*

`Hammer_Ground_Slam`: pass · contrast 5.3 · 2.8 s

```json
{
 "name": "Hammer_Ground_Slam",
 "duration": 2.8,
 "intent": "two-handed warhammer, heavy: sink and grip, heave it up in two efforts (to the chest, then overhead, rising onto the toes and arching back), a hang at the top, then the whole body pulls it down; impact, a small rebound, a tired settle, and a laboured drag back to standing",
 "base": "idle",
 "poses": {
  "grip": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.1,
      -0.8,
      0.58
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.1,
      -0.8,
      0.58
     ]
    },
    "lowerarm_l": {
     "bend": 10
    },
    "lowerarm_r": {
     "bend": 12
    },
    "spine_03": {
     "fwd": 12
    },
    "spine_02": {
     "fwd": 6
    },
    "pelvisPos": {
     "y": -0.035
    }
   }
  },
  "heave1": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.12,
      0.1,
      0.99
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.12,
      0.1,
      0.99
     ]
    },
    "lowerarm_l": {
     "aim": [
      0.05,
      0.9,
      0.4
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.05,
      0.9,
      0.4
     ]
    },
    "spine_03": {
     "fwd": -6
    },
    "spine_02": {
     "fwd": -3
    },
    "pelvisPos": {
     "y": -0.01
    }
   }
  },
  "top": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.12,
      0.96,
      -0.15
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.12,
      0.96,
      -0.15
     ]
    },
    "lowerarm_l": {
     "aim": [
      0.05,
      0.97,
      -0.22
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.05,
      0.97,
      -0.22
     ]
    },
    "spine_03": {
     "fwd": -15
    },
    "spine_02": {
     "fwd": -8
    },
    "Head": {
     "fwd": -6
    },
    "pelvisPos": {
     "y": 0.02,
     "z": -0.02
    }
   }
  },
  "top_hang": {
   "from": "top",
   "set": {
    "spine_03": {
     "fwd": -4
    },
    "pelvisPos": {
     "y": 0.004
    }
   }
  },
  "pull": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.1,
      0.75,
      0.65
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.1,
      0.75,
      0.65
     ]
    },
    "lowerarm_l": {
     "aim": [
      0.05,
      0.6,
      0.8
     ]
    },
    "lowerarm_r": {
     "aim": [
      -0.05,
      0.6,
      0.8
     ]
    },
    "spine_03": {
     "fwd": 0
    },
    "Head": {
     "fwd": -4
    },
    "pelvisPos": {
     "y": 0
    }
   }
  },
  "swing": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.1,
      0.35,
      0.93
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.1,
      0.35,
      0.93
     ]
    },
    "lowerarm_l": {
     "bend": -10
    },
    "lowerarm_r": {
     "bend": -8
    },
    "spine_03": {
     "fwd": 14
    },
    "spine_02": {
     "fwd": 7
    },
    "pelvisPos": {
     "y": -0.02
    }
   }
  },
  "impact": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.08,
      -0.55,
      0.83
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.08,
      -0.55,
      0.83
     ]
    },
    "lowerarm_l": {
     "bend": -15
    },
    "lowerarm_r": {
     "bend": -12
    },
    "spine_03": {
     "fwd": 34
    },
    "spine_02": {
     "fwd": 22
    },
    "thigh_l": {
     "fwd": 14
    },
    "thigh_r": {
     "fwd": 10
    },
    "Head": {
     "fwd": -8
    },
    "pelvisPos": {
     "y": -0.055,
     "z": -0.03
    }
   }
  },
  "rebound": {
   "from": "impact",
   "set": {
    "spine_03": {
     "fwd": -5
    },
    "upperarm_l": {
     "fwd": 6
    },
    "upperarm_r": {
     "fwd": 6
    },
    "pelvisPos": {
     "y": 0.012
    }
   }
  },
  "slump": {
   "from": "impact",
   "set": {
    "spine_03": {
     "fwd": 3
    },
    "Head": {
     "fwd": 10
    },
    "pelvisPos": {
     "y": -0.005
    }
   }
  },
  "drag_up": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.1,
      -0.85,
      0.5
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.1,
      -0.85,
      0.5
     ]
    },
    "lowerarm_l": {
     "bend": 6
    },
    "lowerarm_r": {
     "bend": 8
    },
    "spine_03": {
     "fwd": 20
    },
    "spine_02": {
     "fwd": 12
    },
    "Head": {
     "fwd": 4
    },
    "pelvisPos": {
     "y": -0.03,
     "z": -0.015
    }
   }
  }
 },
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 10,
   "pose": "grip",
   "ease": "inOut"
  },
  {
   "f": 14,
   "pose": "grip",
   "set": {
    "pelvisPos": {
     "y": -0.045
    }
   }
  },
  {
   "f": 22,
   "pose": "heave1",
   "ease": "out"
  },
  {
   "f": 25,
   "pose": "heave1",
   "set": {
    "pelvisPos": {
     "y": -0.02
    }
   }
  },
  {
   "f": 33,
   "pose": "top",
   "ease": "out"
  },
  {
   "f": 38,
   "pose": "top_hang"
  },
  {
   "f": 41,
   "pose": "pull",
   "ease": "in"
  },
  {
   "f": 43,
   "pose": "swing",
   "ease": "in"
  },
  {
   "f": 45,
   "pose": "impact",
   "ease": "hit"
  },
  {
   "f": 48,
   "pose": "rebound",
   "ease": "out"
  },
  {
   "f": 53,
   "pose": "slump",
   "ease": "inOut"
  },
  {
   "f": 62,
   "pose": "slump",
   "set": {
    "Head": {
     "fwd": 6
    }
   }
  },
  {
   "f": 72,
   "pose": "drag_up",
   "ease": "inOut"
  },
  {
   "f": 84,
   "pose": "idle",
   "ease": "inOut"
  }
 ],
 "drag": {
  "Head": 2,
  "hand_l": 1,
  "hand_r": 1
 },
 "plant": "all",
 "hands": {
  "l": "fist",
  "r": "fist"
 },
 "breathe": {
  "amp": 0.5
 },
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 2.5,
   "damping": 0.4
  },
  {
   "bones": [
    "spine_03"
   ],
   "freq": 3,
   "damping": 0.6
  }
 ],
 "expect": {
  "snap": true,
  "rom": 40
 }
}
```

### Idle_Tired_Loop

*exhausted after a fight: shoulders dropped, head hanging, slow heavy breaths*

`Idle_Tired_Loop`: pass · contrast 3.3 · 3 s

```json
{
 "name": "Idle_Tired_Loop",
 "loop": true,
 "duration": 3,
 "intent": "exhausted after a fight: shoulders dropped, head hanging, slow heavy breaths",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle",
   "set": {
    "spine_03": {
     "fwd": 10
    },
    "spine_02": {
     "fwd": 4
    },
    "neck_01": {
     "fwd": 6
    },
    "Head": {
     "fwd": 12,
     "lean": -4
    },
    "clavicle_l": {
     "up": -5
    },
    "clavicle_r": {
     "up": -4
    },
    "upperarm_l": {
     "fwd": 4
    },
    "upperarm_r": {
     "fwd": 7
    },
    "lowerarm_l": {
     "fwd": -6
    },
    "pelvisPos": {
     "y": -0.015
    }
   }
  }
 ],
 "keepFeet": true,
 "breathe": {
  "cycles": 1,
  "amp": 2.4,
  "lag": 3
 },
 "hands": {
  "l": "relaxed",
  "r": "relaxed"
 }
}
```

### Emote_Wave

*friendly wave with the right hand while the body keeps idling*

`Emote_Wave`: pass · contrast 3.2 · 2.6 s · warns: near edge of UAL range: lowerarm_r z -85° vs UAL -61.6…51.2 (f29)

```json
{
 "name": "Emote_Wave",
 "duration": 2.6,
 "intent": "friendly wave with the right hand while the body keeps idling",
 "base": {
  "clip": "Idle_Loop"
 },
 "layers": [
  {
   "mask": "arm_r",
   "drag": {
    "hand_r": 2,
    "lowerarm_r": 1
   },
   "keys": [
    {
     "f": 0,
     "pose": "idle"
    },
    {
     "f": 12,
     "pose": "idle",
     "ease": "out",
     "set": {
      "upperarm_r": {
       "out": 66,
       "fwd": 18
      },
      "lowerarm_r": {
       "up": 80
      },
      "hand_r": {
       "fwd": -8
      }
     }
    },
    {
     "f": 20,
     "set": {
      "lowerarm_r": {
       "lean": -20
      }
     }
    },
    {
     "f": 28,
     "set": {
      "lowerarm_r": {
       "lean": 20
      }
     }
    },
    {
     "f": 36,
     "set": {
      "lowerarm_r": {
       "lean": -20
      }
     }
    },
    {
     "f": 44,
     "set": {
      "lowerarm_r": {
       "lean": 20
      }
     }
    },
    {
     "f": 52
    },
    {
     "f": 78,
     "pose": "idle"
    }
   ]
  },
  {
   "mask": "head",
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 12,
     "set": {
      "Head": {
       "lean": -6,
       "yaw": -5
      }
     }
    },
    {
     "f": 52,
     "set": {
      "Head": {
       "lean": -6,
       "yaw": -5
      }
     }
    },
    {
     "f": 78
    }
   ]
  }
 ],
 "hands": {
  "r": "open"
 }
}
```

### Punch_Combo_Jab_Cross_Hook

*three-hit boxing combo from guard, back to guard*

`Punch_Combo_Jab_Cross_Hook`: pass · contrast 3.5 · 1.6 s · warns: near edge of UAL range: lowerarm_l x 121° vs UAL -1.1…107.3 (f28); contrast 3.5 < 4 — action reads soft; shorten the strike or lengthen the holds  
`Punch_Combo_Jab_Cross_Hook_Southpaw`: pass · contrast 3.5 · 1.6 s · warns: near edge of UAL range: lowerarm_l x 120° vs UAL -1.1…107.3 (f5); contrast 3.5 < 4 — action reads soft; shorten the strike or lengthen the holds

```json
{
 "name": "Punch_Combo_Jab_Cross_Hook",
 "duration": 1.6,
 "intent": "three-hit boxing combo from guard, back to guard",
 "base": "guard",
 "keys": [
  {
   "f": 0,
   "pose": "guard"
  },
  {
   "f": 5,
   "pose": "jab_hit",
   "ease": "out"
  },
  {
   "f": 11,
   "pose": "guard"
  },
  {
   "f": 17,
   "pose": "cross_hit",
   "ease": "out"
  },
  {
   "f": 23,
   "pose": "hook_start"
  },
  {
   "f": 28,
   "pose": "hook_hit",
   "ease": "out"
  },
  {
   "f": 48,
   "pose": "guard"
  }
 ],
 "drag": {
  "Head": 1,
  "hand_l": 1,
  "hand_r": 1
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 4,
  "damping": 0.5
 },
 "expect": {
  "contrast": 4,
  "snap": true,
  "slide": true
 },
 "variants": [
  {
   "suffix": "_Southpaw",
   "mirror": true
  }
 ]
}
```

### Run_Ninja_Loop

*jog with both arms trailing straight back, torso pitched forward, eyes on the target*

`Run_Ninja_Loop`: pass · contrast 1.9 · 0.933 s

```json
{
 "name": "Run_Ninja_Loop",
 "loop": true,
 "intent": "jog with both arms trailing straight back, torso pitched forward, eyes on the target",
 "base": {
  "clip": "Jog_Fwd_Loop"
 },
 "layers": [
  {
   "mask": [
    "arms"
   ],
   "keys": [
    {
     "f": 0,
     "pose": "idle",
     "set": {
      "upperarm_l": {
       "fwd": -55,
       "out": 12
      },
      "upperarm_r": {
       "fwd": -55,
       "out": 12
      },
      "lowerarm_l": {
       "fwd": -5
      },
      "lowerarm_r": {
       "fwd": -5
      },
      "hand_l": {
       "fwd": -15
      },
      "hand_r": {
       "fwd": -15
      },
      "clavicle_l": {
       "up": -4
      },
      "clavicle_r": {
       "up": -4
      }
     }
    },
    {
     "f": 7,
     "set": {
      "upperarm_l": {
       "fwd": -58,
       "out": 14
      },
      "upperarm_r": {
       "fwd": -52,
       "out": 10
      },
      "lowerarm_l": {
       "fwd": -5
      },
      "lowerarm_r": {
       "fwd": -5
      },
      "hand_l": {
       "fwd": -15
      },
      "hand_r": {
       "fwd": -15
      },
      "clavicle_l": {
       "up": -4
      },
      "clavicle_r": {
       "up": -4
      }
     },
     "pose": "idle"
    },
    {
     "f": 14,
     "set": {
      "upperarm_l": {
       "fwd": -55,
       "out": 12
      },
      "upperarm_r": {
       "fwd": -55,
       "out": 12
      },
      "lowerarm_l": {
       "fwd": -5
      },
      "lowerarm_r": {
       "fwd": -5
      },
      "hand_l": {
       "fwd": -15
      },
      "hand_r": {
       "fwd": -15
      },
      "clavicle_l": {
       "up": -4
      },
      "clavicle_r": {
       "up": -4
      }
     },
     "pose": "idle"
    },
    {
     "f": 21,
     "set": {
      "upperarm_l": {
       "fwd": -52,
       "out": 10
      },
      "upperarm_r": {
       "fwd": -58,
       "out": 14
      },
      "lowerarm_l": {
       "fwd": -5
      },
      "lowerarm_r": {
       "fwd": -5
      },
      "hand_l": {
       "fwd": -15
      },
      "hand_r": {
       "fwd": -15
      },
      "clavicle_l": {
       "up": -4
      },
      "clavicle_r": {
       "up": -4
      }
     },
     "pose": "idle"
    }
   ]
  },
  {
   "mask": "spine",
   "additive": true,
   "keys": [
    {
     "f": 0,
     "set": {
      "spine_02": {
       "fwd": 8
      },
      "spine_03": {
       "fwd": 10
      }
     }
    }
   ]
  }
 ],
 "lookLock": {
  "weight": 1,
  "pitch": -10
 },
 "hands": {
  "l": "flat",
  "r": "flat"
 },
 "expect": {
  "slide": true,
  "airborne": true,
  "rom": 60,
  "snap": true
 }
}
```

### Walk_Sneak_Loop

*sneaking: crouched lower, torso forward, arms held out for balance, head up*

`Walk_Sneak_Loop`: pass · contrast 2.3 · 1.9 s  
`Walk_Sneak_Root_Loop`: pass · contrast 2.3 · 1.9 s

```json
{
 "name": "Walk_Sneak_Loop",
 "loop": true,
 "intent": "sneaking: crouched lower, torso forward, arms held out for balance, head up",
 "base": {
  "clip": "Walk_Loop",
  "speed": 0.7
 },
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0,
     "set": {
      "spine_02": {
       "fwd": 10
      },
      "spine_03": {
       "fwd": 12
      },
      "Head": {
       "fwd": -14
      },
      "neck_01": {
       "fwd": -6
      },
      "upperarm_l": {
       "out": 14,
       "fwd": 16
      },
      "upperarm_r": {
       "out": 14,
       "fwd": 16
      },
      "lowerarm_l": {
       "fwd": 30
      },
      "lowerarm_r": {
       "fwd": 30
      },
      "hand_l": {
       "fwd": -20
      },
      "hand_r": {
       "fwd": -20
      },
      "pelvisPos": {
       "y": -0.13,
       "z": -0.03
      }
     }
    }
   ]
  }
 ],
 "keepFeet": true,
 "lookLock": {
  "weight": 0.6
 },
 "hands": {
  "l": "relaxed",
  "r": "relaxed"
 },
 "expect": {
  "slide": true
 },
 "variants": [
  {
   "suffix": "_Root",
   "override": {
    "travel": "auto"
   }
  }
 ]
}
```

### Sword_Lunge_Heavy

*heavy lunging slash: long wind-up with the blade drawn back, explosive lunge, held follow-through, recover to stance*

`Sword_Lunge_Heavy`: pass · contrast 13.2 · 2 s · warns: near edge of UAL range: spine_03 y 56° vs UAL -33.1…37 (f25)

```json
{
 "name": "Sword_Lunge_Heavy",
 "duration": 2,
 "intent": "heavy lunging slash: long wind-up with the blade drawn back, explosive lunge, held follow-through, recover to stance",
 "base": "sword_idle",
 "keys": [
  {
   "f": 0,
   "pose": "sword_idle"
  },
  {
   "f": 16,
   "pose": "sword_attack_windup",
   "ease": "in",
   "set": {
    "spine_03": {
     "fwd": -6
    }
   }
  },
  {
   "f": 21,
   "pose": "sword_attack_windup",
   "set": {
    "spine_03": {
     "fwd": -9
    }
   }
  },
  {
   "f": 25,
   "pose": "sword_attack_hit",
   "ease": "snap",
   "set": {
    "spine_03": {
     "fwd": 8
    }
   }
  },
  {
   "f": 33,
   "pose": "sword_attack_hit",
   "set": {
    "spine_03": {
     "fwd": 10
    }
   }
  },
  {
   "f": 60,
   "pose": "sword_idle",
   "ease": "inOut"
  }
 ],
 "drag": {
  "hand_r": 1,
  "hand_l": 1,
  "Head": 2
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 2.5,
  "damping": 0.55
 },
 "hands": {
  "r": "sword_grip"
 },
 "expect": {
  "snap": true,
  "slide": true
 }
}
```

### Kick_Front

*rear-leg front kick from guard: chamber, snap out, re-chamber, back to guard*

`Kick_Front`: pass · contrast 6.6 · 1.2 s  
`Kick_Front_Heavy`: pass · contrast 6.7 · 1.633 s · warns: ends 20.8° from guard — a crossfade back will pop; end on guard or declare expect.exit  
`Kick_Front_L`: pass · contrast 6.6 · 1.2 s · warns: near edge of UAL range: lowerarm_l x 119° vs UAL -1.1…107.3 (f0)

```json
{
 "name": "Kick_Front",
 "duration": 1.2,
 "intent": "rear-leg front kick from guard: chamber, snap out, re-chamber, back to guard",
 "base": "guard",
 "keys": [
  {
   "f": 0,
   "pose": "guard"
  },
  {
   "f": 7,
   "pose": "guard",
   "ease": "inOut",
   "set": {
    "thigh_r": {
     "fwd": 70
    },
    "calf_r": {
     "bend": 95
    },
    "spine_03": {
     "fwd": -8
    },
    "spine_02": {
     "fwd": -4
    },
    "pelvisPos": {
     "y": 0.02,
     "x": 0.05
    }
   }
  },
  {
   "f": 10,
   "pose": "guard",
   "ease": "snap",
   "set": {
    "thigh_r": {
     "fwd": 78
    },
    "calf_r": {
     "bend": 6
    },
    "spine_03": {
     "fwd": -16
    },
    "spine_02": {
     "fwd": -6
    },
    "Head": {
     "fwd": 8
    },
    "pelvisPos": {
     "y": 0.03,
     "z": -0.02,
     "x": 0.05
    }
   }
  },
  {
   "f": 14,
   "pose": "guard",
   "set": {
    "thigh_r": {
     "fwd": 70
    },
    "calf_r": {
     "bend": 95
    },
    "spine_03": {
     "fwd": -9
    },
    "spine_02": {
     "fwd": -4
    },
    "pelvisPos": {
     "y": 0.02,
     "x": 0.05
    }
   }
  },
  {
   "f": 36,
   "pose": "guard"
  }
 ],
 "drag": {
  "Head": 2,
  "arms": 1
 },
 "plant": {
  "l": "all",
  "r": [
   [
    0,
    2
   ],
   [
    32,
    36
   ]
  ]
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3,
  "damping": 0.5
 },
 "expect": {
  "snap": true,
  "contrast": 5,
  "slide": true
 },
 "variants": [
  {
   "suffix": "_Heavy",
   "timeScale": 1.35,
   "amp": 1.1
  },
  {
   "suffix": "_L",
   "mirror": true
  }
 ]
}
```

### Dodge_Back

*sway back out of reach from guard, feet stay planted, return*

`Dodge_Back`: pass · contrast 4.9 · 1 s · warns: near edge of UAL range: calf_r z -57° vs UAL -46.5…11.7 (f11)

```json
{
 "name": "Dodge_Back",
 "duration": 1,
 "intent": "sway back out of reach from guard, feet stay planted, return",
 "base": "guard",
 "keys": [
  {
   "f": 0,
   "pose": "guard"
  },
  {
   "f": 5,
   "pose": "guard",
   "ease": "out",
   "set": {
    "spine_03": {
     "fwd": -22
    },
    "spine_02": {
     "fwd": -12
    },
    "Head": {
     "fwd": 14
    },
    "pelvisPos": {
     "y": -0.08,
     "z": -0.15
    }
   }
  },
  {
   "f": 11,
   "pose": "guard",
   "set": {
    "spine_03": {
     "fwd": -24
    },
    "spine_02": {
     "fwd": -13
    },
    "Head": {
     "fwd": 16
    },
    "pelvisPos": {
     "y": -0.09,
     "z": -0.16
    }
   }
  },
  {
   "f": 30,
   "pose": "guard"
  }
 ],
 "drag": {
  "Head": 2,
  "arms": 1
 },
 "plant": "all",
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3.5,
  "damping": 0.5
 }
}
```

### Hit_Stagger

*heavy hit to the chest: snap back, head whips, settle and return to idle*

`Hit_Stagger`: pass · contrast 5.7 · 1.1 s

```json
{
 "name": "Hit_Stagger",
 "duration": 1.1,
 "intent": "heavy hit to the chest: snap back, head whips, settle and return to idle",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 3,
   "pose": "hit_chest",
   "ease": "snap"
  },
  {
   "f": 8,
   "pose": "hit_chest",
   "ease": "out",
   "set": {
    "spine_03": {
     "fwd": -18
    },
    "spine_02": {
     "fwd": -8
    },
    "pelvisPos": {
     "z": -0.05,
     "y": -0.02
    },
    "Head": {
     "fwd": -10
    }
   }
  },
  {
   "f": 33,
   "pose": "idle",
   "ease": "inOut"
  }
 ],
 "drag": {
  "Head": 1,
  "hand_l": 2,
  "hand_r": 2
 },
 "plant": "all",
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 3,
   "damping": 0.35
  },
  {
   "bones": [
    "lowerarm_l",
    "lowerarm_r"
   ],
   "freq": 2.5,
   "damping": 0.4
  }
 ],
 "expect": {
  "snap": true
 }
}
```

### Emote_Bow

*polite bow: right hand to the chest, bend from the hips, hold, rise*

`Emote_Bow`: pass · contrast 2.4 · 2.4 s · warns: near edge of UAL range: lowerarm_r x 140° vs UAL -1.2…120.1 (f20)

```json
{
 "name": "Emote_Bow",
 "duration": 2.4,
 "intent": "polite bow: right hand to the chest, bend from the hips, hold, rise",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 20,
   "pose": "idle",
   "set": {
    "spine_02": {
     "fwd": 18
    },
    "spine_03": {
     "fwd": 20
    },
    "neck_01": {
     "fwd": 6
    },
    "Head": {
     "fwd": 10
    },
    "upperarm_r": {
     "fwd": 24,
     "out": -14
    },
    "lowerarm_r": {
     "bend": 100
    },
    "hand_r": {
     "fwd": -5
    },
    "upperarm_l": {
     "fwd": -6
    },
    "pelvisPos": {
     "z": -0.05
    }
   }
  },
  {
   "f": 42,
   "pose": "idle",
   "set": {
    "spine_02": {
     "fwd": 20
    },
    "spine_03": {
     "fwd": 22
    },
    "neck_01": {
     "fwd": 7
    },
    "Head": {
     "fwd": 12
    },
    "upperarm_r": {
     "fwd": 24,
     "out": -14
    },
    "lowerarm_r": {
     "bend": 100
    },
    "hand_r": {
     "fwd": -5
    },
    "upperarm_l": {
     "fwd": -6
    },
    "pelvisPos": {
     "z": -0.055
    }
   }
  },
  {
   "f": 72,
   "pose": "idle"
  }
 ],
 "drag": {
  "Head": 3,
  "hand_r": 2
 },
 "plant": "all",
 "breathe": {
  "amp": 0.6
 },
 "hands": {
  "r": "open"
 }
}
```

### Emote_Cheer

*victory cheer: both fists thrown up overhead in a V, pumped twice with a little bounce*

`Emote_Cheer`: pass · contrast 5.7 · 2 s

```json
{
 "name": "Emote_Cheer",
 "duration": 2,
 "intent": "victory cheer: both fists thrown up overhead in a V, pumped twice with a little bounce",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 8,
   "pose": "idle",
   "ease": "out",
   "set": {
    "upperarm_l": {
     "aim": [
      0.42,
      0.88,
      0.2
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.4,
      0.89,
      0.22
     ]
    },
    "lowerarm_l": {
     "bend": -22
    },
    "lowerarm_r": {
     "bend": -18
    },
    "clavicle_l": {
     "up": 8
    },
    "clavicle_r": {
     "up": 7
    },
    "spine_03": {
     "fwd": -6
    },
    "Head": {
     "fwd": -16
    },
    "pelvisPos": {
     "y": 0.015
    }
   }
  },
  {
   "f": 14,
   "pose": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.78,
      0.45,
      0.42
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.76,
      0.46,
      0.46
     ]
    },
    "lowerarm_l": {
     "bend": 30
    },
    "lowerarm_r": {
     "bend": 36
    },
    "clavicle_l": {
     "up": 8
    },
    "clavicle_r": {
     "up": 7
    },
    "spine_03": {
     "fwd": -6
    },
    "Head": {
     "fwd": -10
    },
    "pelvisPos": {
     "y": -0.03
    }
   }
  },
  {
   "f": 20,
   "pose": "idle",
   "ease": "out",
   "set": {
    "upperarm_l": {
     "aim": [
      0.38,
      0.9,
      0.2
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.36,
      0.91,
      0.21
     ]
    },
    "lowerarm_l": {
     "bend": -22
    },
    "lowerarm_r": {
     "bend": -18
    },
    "clavicle_l": {
     "up": 8
    },
    "clavicle_r": {
     "up": 7
    },
    "spine_03": {
     "fwd": -6
    },
    "Head": {
     "fwd": -18
    },
    "pelvisPos": {
     "y": 0.02
    }
   }
  },
  {
   "f": 27,
   "pose": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.78,
      0.45,
      0.42
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.76,
      0.46,
      0.46
     ]
    },
    "lowerarm_l": {
     "bend": 30
    },
    "lowerarm_r": {
     "bend": 36
    },
    "clavicle_l": {
     "up": 8
    },
    "clavicle_r": {
     "up": 7
    },
    "spine_03": {
     "fwd": -6
    },
    "Head": {
     "fwd": -10
    },
    "pelvisPos": {
     "y": -0.03
    }
   }
  },
  {
   "f": 60,
   "pose": "idle"
  }
 ],
 "drag": {
  "hand_l": 1,
  "hand_r": 2,
  "Head": 2
 },
 "plant": "all",
 "hands": {
  "l": "fist",
  "r": "fist"
 }
}
```

### Emote_Shrug

*"I dunno": shoulders up, palms turn up and out, head tilts*

`Emote_Shrug`: pass · contrast 4.5 · 1.6 s

```json
{
 "name": "Emote_Shrug",
 "duration": 1.6,
 "intent": "\"I dunno\": shoulders up, palms turn up and out, head tilts",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 10,
   "pose": "idle",
   "ease": "out",
   "set": {
    "clavicle_l": {
     "up": 14
    },
    "clavicle_r": {
     "up": 15
    },
    "upperarm_l": {
     "out": 10,
     "fwd": 12
    },
    "upperarm_r": {
     "out": 11,
     "fwd": 14
    },
    "lowerarm_l": {
     "bend": 82,
     "twist": -80,
     "out": 32
    },
    "lowerarm_r": {
     "bend": 85,
     "twist": 80,
     "out": 34
    },
    "Head": {
     "lean": 8
    },
    "spine_03": {
     "fwd": -3
    }
   }
  },
  {
   "f": 24,
   "pose": "idle",
   "set": {
    "clavicle_l": {
     "up": 14
    },
    "clavicle_r": {
     "up": 15
    },
    "upperarm_l": {
     "out": 10,
     "fwd": 12
    },
    "upperarm_r": {
     "out": 11,
     "fwd": 14
    },
    "lowerarm_l": {
     "bend": 82,
     "twist": -80,
     "out": 32
    },
    "lowerarm_r": {
     "bend": 85,
     "twist": 80,
     "out": 34
    },
    "Head": {
     "lean": 9
    },
    "spine_03": {
     "fwd": -3
    }
   }
  },
  {
   "f": 48,
   "pose": "idle"
  }
 ],
 "drag": {
  "hand_l": 1,
  "hand_r": 2,
  "Head": 2
 },
 "plant": "all",
 "hands": {
  "l": "open",
  "r": "open"
 }
}
```

### Spell_Charge_Release

*gather energy with both hands, trembling, then blast it forward and recover*

`Spell_Charge_Release`: pass · contrast 33.8 · 2.6 s · warns: near edge of UAL range: upperarm_r z 96° vs UAL -74.5…74.1 (f26)

```json
{
 "name": "Spell_Charge_Release",
 "duration": 2.6,
 "intent": "gather energy with both hands, trembling, then blast it forward and recover",
 "base": "spell_idle",
 "keys": [
  {
   "f": 0,
   "pose": "spell_idle"
  },
  {
   "f": 26,
   "pose": "spell_idle",
   "ease": "in",
   "set": {
    "upperarm_l": {
     "fwd": 40,
     "out": -6
    },
    "upperarm_r": {
     "fwd": 42,
     "out": -6
    },
    "lowerarm_l": {
     "bend": 45
    },
    "lowerarm_r": {
     "bend": 48
    },
    "spine_03": {
     "fwd": -8
    },
    "Head": {
     "fwd": 6
    },
    "pelvisPos": {
     "y": -0.04
    }
   }
  },
  {
   "f": 31,
   "pose": "spell_cast",
   "ease": "snap",
   "set": {
    "spine_03": {
     "fwd": 6
    },
    "pelvisPos": {
     "z": 0.03
    }
   }
  },
  {
   "f": 40,
   "pose": "spell_cast",
   "ease": "out",
   "set": {
    "spine_03": {
     "fwd": -4
    }
   }
  },
  {
   "f": 78,
   "pose": "spell_idle"
  }
 ],
 "layers": [
  {
   "mask": [
    "hand_l",
    "hand_r",
    "lowerarm_l",
    "lowerarm_r"
   ],
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 12
    },
    {
     "f": 14,
     "set": {
      "lowerarm_l": {
       "up": 3
      },
      "lowerarm_r": {
       "up": -3
      }
     }
    },
    {
     "f": 16,
     "set": {
      "lowerarm_l": {
       "up": -3
      },
      "lowerarm_r": {
       "up": 3
      }
     }
    },
    {
     "f": 18,
     "set": {
      "lowerarm_l": {
       "up": 3
      },
      "lowerarm_r": {
       "up": -3
      }
     }
    },
    {
     "f": 20,
     "set": {
      "lowerarm_l": {
       "up": -4
      },
      "lowerarm_r": {
       "up": 4
      }
     }
    },
    {
     "f": 22,
     "set": {
      "lowerarm_l": {
       "up": 4
      },
      "lowerarm_r": {
       "up": -4
      }
     }
    },
    {
     "f": 24,
     "set": {
      "lowerarm_l": {
       "up": -4
      },
      "lowerarm_r": {
       "up": 4
      }
     }
    },
    {
     "f": 26
    }
   ]
  }
 ],
 "drag": {
  "Head": 2,
  "hand_l": 1,
  "hand_r": 1
 },
 "plant": "all",
 "hands": {
  "l": "open",
  "r": "open"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3,
  "damping": 0.45
 },
 "expect": {
  "snap": true
 }
}
```

### Idle_Guard_Loop

*boxer bouncing on the balls of the feet in guard, weight rocking side to side*

`Idle_Guard_Loop`: pass · contrast 1.5 · 1 s

```json
{
 "name": "Idle_Guard_Loop",
 "loop": true,
 "duration": 1,
 "intent": "boxer bouncing on the balls of the feet in guard, weight rocking side to side",
 "base": "guard",
 "keys": [
  {
   "f": 0,
   "pose": "guard"
  },
  {
   "f": 7,
   "pose": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.035,
     "x": 0.012
    },
    "spine_03": {
     "lean": -2
    },
    "Head": {
     "lean": 1
    }
   }
  },
  {
   "f": 15,
   "pose": "guard"
  },
  {
   "f": 22,
   "pose": "guard",
   "set": {
    "pelvisPos": {
     "y": -0.03,
     "x": -0.012
    },
    "spine_03": {
     "lean": 2
    },
    "Head": {
     "lean": -1
    }
   }
  }
 ],
 "drag": {
  "Head": 2,
  "hand_l": 1,
  "hand_r": 2
 },
 "plant": "all"
}
```

### Sword_Combo_Double

*two quick slashes from sword stance, each on its own accent, recover to stance*

`Sword_Combo_Double`: pass · contrast 12.4 · 1.9 s · warns: near edge of UAL range: pelvis y 121° vs UAL -79…104.2 (f14)

```json
{
 "name": "Sword_Combo_Double",
 "duration": 1.9,
 "intent": "two quick slashes from sword stance, each on its own accent, recover to stance",
 "base": "sword_idle",
 "keys": [
  {
   "f": 0,
   "pose": "sword_idle"
  },
  {
   "f": 5,
   "pose": "sword_a_windup",
   "ease": "in"
  },
  {
   "f": 9,
   "pose": "sword_a_hit",
   "ease": "snap"
  },
  {
   "f": 14,
   "pose": "sword_a_end"
  },
  {
   "f": 21,
   "pose": "sword_b_hit",
   "ease": "snap"
  },
  {
   "f": 28,
   "pose": "sword_b_end"
  },
  {
   "f": 56,
   "pose": "sword_idle"
  }
 ],
 "drag": {
  "Head": 1
 },
 "hands": {
  "r": "sword_grip"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3,
  "damping": 0.5
 },
 "expect": {
  "snap": true,
  "slide": true
 }
}
```

### Idle_LookAround_Loop

*standing idle, glancing left then right: head leads, neck follows, chest barely turns*

`Idle_LookAround_Loop`: pass · contrast 2.3 · 5 s

```json
{
 "name": "Idle_LookAround_Loop",
 "loop": true,
 "duration": 5,
 "intent": "standing idle, glancing left then right: head leads, neck follows, chest barely turns",
 "base": {
  "clip": "Idle_Loop"
 },
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 20,
     "set": {
      "Head": {
       "yaw": 22,
       "fwd": -3
      },
      "neck_01": {
       "yaw": 10
      },
      "spine_03": {
       "yaw": 5
      }
     }
    },
    {
     "f": 56,
     "set": {
      "Head": {
       "yaw": 24,
       "fwd": -2
      },
      "neck_01": {
       "yaw": 10
      },
      "spine_03": {
       "yaw": 5
      }
     }
    },
    {
     "f": 78,
     "set": {
      "Head": {
       "yaw": -26,
       "fwd": 2
      },
      "neck_01": {
       "yaw": -11
      },
      "spine_03": {
       "yaw": -6
      }
     }
    },
    {
     "f": 112,
     "set": {
      "Head": {
       "yaw": -24,
       "fwd": 3
      },
      "neck_01": {
       "yaw": -10
      },
      "spine_03": {
       "yaw": -6
      }
     }
    },
    {
     "f": 150
    }
   ]
  }
 ]
}
```

### Walk_Wounded_Loop

*slow walk holding the left side of the ribs, torso bent toward the wound, head down*

`Walk_Wounded_Loop`: pass · contrast 1.5 · 1.767 s

```json
{
 "name": "Walk_Wounded_Loop",
 "loop": true,
 "intent": "slow walk holding the left side of the ribs, torso bent toward the wound, head down",
 "base": {
  "clip": "Walk_Loop",
  "speed": 0.75
 },
 "layers": [
  {
   "mask": "arm_l",
   "keys": [
    {
     "f": 0,
     "pose": "idle",
     "set": {
      "upperarm_l": {
       "fwd": 18,
       "out": -10
      },
      "lowerarm_l": {
       "bend": 75
      },
      "hand_l": {
       "fwd": 10
      }
     }
    }
   ]
  },
  {
   "additive": true,
   "keys": [
    {
     "f": 0,
     "set": {
      "spine_03": {
       "lean": 7,
       "fwd": 10
      },
      "spine_02": {
       "lean": 3,
       "fwd": 4
      },
      "Head": {
       "fwd": 12
      },
      "upperarm_r": {
       "out": 6
      }
     }
    }
   ]
  }
 ],
 "lookLock": {
  "weight": 0.4
 },
 "hands": {
  "l": "relaxed"
 },
 "expect": {
  "slide": true
 }
}
```

### Throw_Grenade

*overhand throw from idle: cock the arm back, whip, follow through, back to idle*

`Throw_Grenade`: pass · contrast 82.2 · 1.8 s

```json
{
 "name": "Throw_Grenade",
 "duration": 1.8,
 "intent": "overhand throw from idle: cock the arm back, whip, follow through, back to idle",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 14,
   "pose": "throw_windup",
   "ease": "in"
  },
  {
   "f": 18,
   "pose": "throw_release",
   "ease": "snap"
  },
  {
   "f": 28,
   "pose": "throw_end",
   "ease": "out"
  },
  {
   "f": 54,
   "pose": "idle"
  }
 ],
 "drag": {
  "hand_r": 2,
  "lowerarm_r": 1,
  "Head": 1
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3,
  "damping": 0.5
 },
 "expect": {
  "snap": true,
  "slide": true
 }
}
```

### Interact_Press

*reach forward and press a button at chest height, hold, return*

`Interact_Press`: pass · contrast 1.9 · 1.4 s

```json
{
 "name": "Interact_Press",
 "duration": 1.4,
 "intent": "reach forward and press a button at chest height, hold, return",
 "base": {
  "clip": "Idle_Loop"
 },
 "layers": [
  {
   "mask": [
    "arm_r",
    "spine",
    "head"
   ],
   "drag": {
    "hand_r": 1
   },
   "keys": [
    {
     "f": 0,
     "pose": "idle"
    },
    {
     "f": 12,
     "pose": "idle",
     "set": {
      "upperarm_r": {
       "aim": [
        -0.12,
        0.02,
        1
       ]
      },
      "lowerarm_r": {
       "bend": 16
      },
      "hand_r": {
       "fwd": -12
      },
      "spine_03": {
       "fwd": 5,
       "yaw": 6
      },
      "Head": {
       "fwd": 6
      }
     }
    },
    {
     "f": 15,
     "pose": "idle",
     "ease": "out",
     "set": {
      "upperarm_r": {
       "aim": [
        -0.1,
        0.06,
        1
       ]
      },
      "lowerarm_r": {
       "bend": 4
      },
      "hand_r": {
       "fwd": -18
      },
      "spine_03": {
       "fwd": 7,
       "yaw": 7
      },
      "Head": {
       "fwd": 6
      }
     }
    },
    {
     "f": 22,
     "pose": "idle",
     "set": {
      "upperarm_r": {
       "aim": [
        -0.11,
        0.04,
        1
       ]
      },
      "lowerarm_r": {
       "bend": 10
      },
      "hand_r": {
       "fwd": -14
      },
      "spine_03": {
       "fwd": 6,
       "yaw": 6
      },
      "Head": {
       "fwd": 6
      }
     }
    },
    {
     "f": 42,
     "pose": "idle"
    }
   ]
  }
 ],
 "hands": {
  "r": "open"
 }
}
```

### Pistol_Double_Tap

*raise from low ready, fire twice with recoil, lower back to ready*

`Pistol_Double_Tap`: pass · contrast 192.8 · 1.4 s

```json
{
 "name": "Pistol_Double_Tap",
 "duration": 1.4,
 "intent": "raise from low ready, fire twice with recoil, lower back to ready",
 "base": "pistol_idle",
 "keys": [
  {
   "f": 0,
   "pose": "pistol_idle"
  },
  {
   "f": 6,
   "pose": "pistol_aim",
   "ease": "out"
  },
  {
   "f": 8,
   "pose": "pistol_recoil",
   "ease": "snap",
   "set": {
    "hand_r": {
     "up": 14
    },
    "hand_l": {
     "up": 10
    },
    "lowerarm_r": {
     "bend": 10
    },
    "lowerarm_l": {
     "bend": 8
    },
    "spine_03": {
     "fwd": -3
    },
    "Head": {
     "fwd": -3
    }
   }
  },
  {
   "f": 12,
   "pose": "pistol_aim"
  },
  {
   "f": 14,
   "pose": "pistol_recoil",
   "ease": "snap",
   "set": {
    "hand_r": {
     "up": 14
    },
    "hand_l": {
     "up": 10
    },
    "lowerarm_r": {
     "bend": 10
    },
    "lowerarm_l": {
     "bend": 8
    },
    "spine_03": {
     "fwd": -3
    },
    "Head": {
     "fwd": -3
    }
   }
  },
  {
   "f": 19,
   "pose": "pistol_aim"
  },
  {
   "f": 28,
   "pose": "pistol_aim"
  },
  {
   "f": 42,
   "pose": "pistol_idle"
  }
 ],
 "drag": {
  "Head": 1
 },
 "plant": "all",
 "hands": {
  "r": "pistol_grip"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3.5,
  "damping": 0.5
 },
 "expect": {
  "snap": true
 }
}
```

### Emote_Point

*point at something ahead and to the right, head looks first, then the arm*

`Emote_Point`: pass · contrast 9.3 · 2 s

```json
{
 "name": "Emote_Point",
 "duration": 2,
 "intent": "point at something ahead and to the right, head looks first, then the arm",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 12,
   "pose": "idle",
   "ease": "out",
   "set": {
    "upperarm_r": {
     "fwd": 84,
     "out": 18
    },
    "lowerarm_r": {
     "bend": 4
    },
    "hand_r": {
     "fwd": -6
    },
    "spine_03": {
     "yaw": -8
    },
    "Head": {
     "yaw": -14,
     "fwd": -4
    }
   }
  },
  {
   "f": 40,
   "pose": "idle",
   "set": {
    "upperarm_r": {
     "fwd": 82,
     "out": 18
    },
    "lowerarm_r": {
     "bend": 6
    },
    "hand_r": {
     "fwd": -6
    },
    "spine_03": {
     "yaw": -8
    },
    "Head": {
     "yaw": -14,
     "fwd": -4
    }
   }
  },
  {
   "f": 60,
   "pose": "idle"
  }
 ],
 "drag": {
  "hand_r": 2,
  "lowerarm_r": 1,
  "Head": -2
 },
 "plant": "all",
 "breathe": {
  "amp": 0.5
 },
 "hands": {
  "r": "flat"
 }
}
```

### Shield_Block_Impact

*shield up, take a heavy blow: pushed back a step-width, absorb, recover*

`Shield_Block_Impact`: pass · contrast 9.9 · 1 s

```json
{
 "name": "Shield_Block_Impact",
 "duration": 1,
 "intent": "shield up, take a heavy blow: pushed back a step-width, absorb, recover",
 "base": "shield_idle",
 "keys": [
  {
   "f": 0,
   "pose": "shield_idle"
  },
  {
   "f": 3,
   "pose": "shield_idle",
   "ease": "snap",
   "set": {
    "pelvisPos": {
     "z": -0.06,
     "y": -0.03
    },
    "spine_03": {
     "fwd": -8
    },
    "spine_02": {
     "fwd": -4
    },
    "upperarm_l": {
     "fwd": -10
    },
    "Head": {
     "fwd": 6
    }
   }
  },
  {
   "f": 9,
   "pose": "shield_idle",
   "ease": "out",
   "set": {
    "pelvisPos": {
     "z": -0.07,
     "y": -0.05
    },
    "spine_03": {
     "fwd": -4
    },
    "upperarm_l": {
     "fwd": -5
    },
    "Head": {
     "fwd": 3
    }
   }
  },
  {
   "f": 30,
   "pose": "shield_idle"
  }
 ],
 "plant": "all",
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 3,
   "damping": 0.4
  },
  {
   "bones": [
    "lowerarm_r",
    "hand_r"
   ],
   "freq": 2.5,
   "damping": 0.4
  }
 ],
 "expect": {
  "snap": true
 }
}
```

### Death_Collapse

*shot: flinch, knees buckle, crumple onto the back and stop*

`Death_Collapse`: pass · contrast 20.1 · 2.2 s · warns: near edge of UAL range: lowerarm_l z 92° vs UAL -41.3…81.9 (f30); ends 130° from idle — a crossfade back will pop; end on idle or declare expect.exit

```json
{
 "name": "Death_Collapse",
 "duration": 2.2,
 "intent": "shot: flinch, knees buckle, crumple onto the back and stop",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 3,
   "pose": "hit_chest",
   "ease": "snap"
  },
  {
   "f": 14,
   "pose": "death_buckle",
   "ease": "in"
  },
  {
   "f": 30,
   "pose": "death_down",
   "ease": "hit"
  },
  {
   "f": 36,
   "pose": "death_down",
   "set": {
    "Head": {
     "yaw": 8
    }
   }
  },
  {
   "f": 66,
   "pose": "death_down",
   "set": {
    "Head": {
     "yaw": 10
    }
   }
  }
 ],
 "spring": [
  {
   "bones": [
    "Head"
   ],
   "freq": 2.5,
   "damping": 0.4
  },
  {
   "bones": [
    "hand_l",
    "hand_r"
   ],
   "freq": 2,
   "damping": 0.45
  }
 ],
 "hands": {
  "l": "relaxed",
  "r": "relaxed"
 },
 "expect": {
  "snap": true,
  "still": true,
  "slide": true,
  "offBalance": true,
  "airborne": true
 }
}
```

### Idle_Sword_Ready_Loop

*sword stance, scanning for the next opponent: head sweeps, chest follows a little, blade tip drifts*

`Idle_Sword_Ready_Loop`: pass · contrast 2.3 · 3.333 s

```json
{
 "name": "Idle_Sword_Ready_Loop",
 "loop": true,
 "duration": 3.333,
 "intent": "sword stance, scanning for the next opponent: head sweeps, chest follows a little, blade tip drifts",
 "base": {
  "clip": "Sword_Idle"
 },
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 30,
     "set": {
      "Head": {
       "yaw": 14
      },
      "neck_01": {
       "yaw": 5
      },
      "spine_03": {
       "yaw": 3
      },
      "hand_r": {
       "lean": 3
      }
     }
    },
    {
     "f": 50,
     "set": {
      "Head": {
       "yaw": 12
      },
      "neck_01": {
       "yaw": 5
      },
      "spine_03": {
       "yaw": 3
      },
      "hand_r": {
       "lean": 2
      }
     }
    },
    {
     "f": 78,
     "set": {
      "Head": {
       "yaw": -12
      },
      "neck_01": {
       "yaw": -5
      },
      "spine_03": {
       "yaw": -3
      },
      "hand_r": {
       "lean": -3
      }
     }
    },
    {
     "f": 92,
     "set": {
      "Head": {
       "yaw": -10
      },
      "neck_01": {
       "yaw": -4
      },
      "spine_03": {
       "yaw": -2
      },
      "hand_r": {
       "lean": -2
      }
     }
    },
    {
     "f": 100
    }
   ]
  }
 ],
 "hands": {
  "r": "sword_grip"
 }
}
```

### Zombie_Lunge_Grab

*zombie rears back, lunges forward with both arms, clutches, sags back to its idle*

`Zombie_Lunge_Grab`: pass · contrast 11.3 · 1.8 s

```json
{
 "name": "Zombie_Lunge_Grab",
 "duration": 1.8,
 "intent": "zombie rears back, lunges forward with both arms, clutches, sags back to its idle",
 "base": "zombie_idle",
 "keys": [
  {
   "f": 0,
   "pose": "zombie_idle"
  },
  {
   "f": 12,
   "pose": "zombie_idle",
   "ease": "in",
   "set": {
    "spine_03": {
     "fwd": -10
    },
    "spine_02": {
     "fwd": -6
    },
    "upperarm_l": {
     "fwd": -8
    },
    "upperarm_r": {
     "fwd": -12
    },
    "Head": {
     "fwd": -8
    },
    "pelvisPos": {
     "z": -0.04
    }
   }
  },
  {
   "f": 18,
   "pose": "zombie_idle",
   "ease": "snap",
   "set": {
    "spine_03": {
     "fwd": 16
    },
    "spine_02": {
     "fwd": 8
    },
    "upperarm_l": {
     "fwd": 78,
     "out": 6
    },
    "upperarm_r": {
     "fwd": 84,
     "out": 4
    },
    "lowerarm_l": {
     "bend": 10
    },
    "lowerarm_r": {
     "bend": 6
    },
    "Head": {
     "fwd": -18
    },
    "pelvisPos": {
     "z": 0.08,
     "y": -0.03
    }
   }
  },
  {
   "f": 24,
   "pose": "zombie_idle",
   "set": {
    "spine_03": {
     "fwd": 18
    },
    "spine_02": {
     "fwd": 8
    },
    "upperarm_l": {
     "fwd": 70,
     "out": -4
    },
    "upperarm_r": {
     "fwd": 74,
     "out": -6
    },
    "lowerarm_l": {
     "bend": 55
    },
    "lowerarm_r": {
     "bend": 60
    },
    "Head": {
     "fwd": -14
    },
    "pelvisPos": {
     "z": 0.08,
     "y": -0.04
    }
   }
  },
  {
   "f": 54,
   "pose": "zombie_idle"
  }
 ],
 "drag": {
  "Head": 2,
  "hand_l": 2,
  "hand_r": 1
 },
 "plant": "all",
 "hands": {
  "l": "fist",
  "r": "fist"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 2.5,
  "damping": 0.4
 },
 "expect": {
  "snap": true
 }
}
```

### Jump_Big_Set

*a bigger, heavier jump as a Start / Loop / Land set that plays back seamlessly*

`Jump_Big_Start`: pass · contrast 5.4 · 0.8 s  
`Jump_Big_Loop`: pass · contrast 1.4 · 1 s  
`Jump_Big_Land`: pass · contrast 9.1 · 1.2 s · warns: near edge of UAL range: thigh_l x -135° vs UAL -121…20.9 (f4)

```json
{
 "name": "Jump_Big_Set",
 "intent": "a bigger, heavier jump as a Start / Loop / Land set that plays back seamlessly",
 "parts": [
  {
   "name": "Jump_Big_Start",
   "duration": 0.8,
   "base": "idle",
   "keys": [
    {
     "f": 0,
     "pose": "idle"
    },
    {
     "f": 10,
     "pose": "jump_load",
     "ease": "in",
     "set": {
      "pelvisPos": {
       "y": -0.04
      },
      "spine_03": {
       "fwd": 6
      }
     }
    },
    {
     "f": 14,
     "pose": "jump_load",
     "set": {
      "pelvisPos": {
       "y": -0.05
      },
      "spine_03": {
       "fwd": 8
      }
     }
    },
    {
     "f": 20,
     "pose": "jump_air",
     "ease": "snap"
    },
    {
     "f": 24,
     "pose": "jump_air",
     "set": {
      "upperarm_l": {
       "out": 10
      },
      "upperarm_r": {
       "out": 12
      },
      "Head": {
       "fwd": -6
      }
     }
    }
   ],
   "drag": {
    "Head": 2,
    "arms": 1
   },
   "expect": {
    "airborne": true,
    "snap": true,
    "exit": true,
    "slide": true,
    "offBalance": true
   }
  },
  {
   "name": "Jump_Big_Loop",
   "loop": true,
   "duration": 1,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 15,
     "pose": "@prev",
     "set": {
      "upperarm_l": {
       "out": 5
      },
      "upperarm_r": {
       "out": 4
      },
      "spine_03": {
       "fwd": -3
      },
      "Head": {
       "fwd": 3
      },
      "thigh_l": {
       "fwd": 4
      },
      "thigh_r": {
       "fwd": -3
      }
     }
    }
   ],
   "expect": {
    "airborne": true,
    "symmetric": true,
    "slide": true,
    "offBalance": true
   }
  },
  {
   "name": "Jump_Big_Land",
   "duration": 1.2,
   "join": false,
   "base": "jump_land",
   "keys": [
    {
     "f": 0,
     "pose": "jump_land"
    },
    {
     "f": 4,
     "pose": "land_absorb",
     "ease": "out",
     "set": {
      "pelvisPos": {
       "y": -0.05
      },
      "spine_03": {
       "fwd": 8
      },
      "Head": {
       "fwd": 6
      }
     }
    },
    {
     "f": 10,
     "pose": "land_absorb",
     "set": {
      "pelvisPos": {
       "y": -0.03
      }
     }
    },
    {
     "f": 36,
     "pose": "idle"
    }
   ],
   "plant": {
    "l": [
     [
      0,
      14
     ]
    ],
    "r": [
     [
      0,
      14
     ]
    ]
   },
   "spring": [
    {
     "bones": [
      "Head"
     ],
     "freq": 2.5,
     "damping": 0.4
    },
    {
     "bones": [
      "arms"
     ],
     "freq": 2.5,
     "damping": 0.5
    }
   ],
   "blendWith": "idle",
   "expect": {
    "snap": true,
    "entry": true,
    "slide": true
   }
  }
 ]
}
```

### Walk_Start

*from idle into the walk: the body leans into the first step and hands over to Walk_Loop at its frame 0*

`Walk_Start`: pass · contrast 1.3 · 1.333 s

```json
{
 "name": "Walk_Start",
 "duration": 1.333,
 "intent": "from idle into the walk: the body leans into the first step and hands over to Walk_Loop at its frame 0",
 "base": {
  "seq": [
   {
    "pose": "idle",
    "at": 0
   },
   {
    "clip": "Walk_Loop",
    "at": 6,
    "offset": 6,
    "blend": 12
   }
  ]
 },
 "blendWith": "idle",
 "expect": {
  "slide": true,
  "exit": true
 }
}
```

### Walk_Stop

*from the walk to idle: the stride shortens and the weight settles back*

`Walk_Stop`: pass · contrast 1.4 · 1.2 s

```json
{
 "name": "Walk_Stop",
 "duration": 1.2,
 "intent": "from the walk to idle: the stride shortens and the weight settles back",
 "base": {
  "seq": [
   {
    "clip": "Walk_Loop",
    "at": 0
   },
   {
    "pose": "idle",
    "at": 14,
    "blend": 16
   }
  ]
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 2,
  "damping": 0.5
 },
 "blendWith": "idle",
 "expect": {
  "slide": true,
  "entry": true
 }
}
```

### Axe_Chop_Overhead

*two-handed axe chop: raise overhead, a heavy drop through the target, recover*

`Axe_Chop_Overhead`: pass · contrast 9.3 · 1.5 s

```json
{
 "name": "Axe_Chop_Overhead",
 "duration": 1.5,
 "intent": "two-handed axe chop: raise overhead, a heavy drop through the target, recover",
 "poses": {
  "axe_raised": {
   "from": "chop_windup",
   "set": {
    "upperarm_l": {
     "aim": [
      0.12,
      0.92,
      -0.2
     ]
    },
    "upperarm_r": {
     "aim": [
      -0.12,
      0.92,
      -0.2
     ]
    },
    "lowerarm_l": {
     "bend": 28
    },
    "lowerarm_r": {
     "bend": 30
    },
    "spine_03": {
     "fwd": -12
    },
    "spine_02": {
     "fwd": -6
    },
    "Head": {
     "fwd": -6
    },
    "pelvisPos": {
     "y": 0.02
    }
   }
  },
  "axe_hit": {
   "from": "chop_hit",
   "set": {
    "spine_03": {
     "fwd": 18
    },
    "spine_02": {
     "fwd": 10
    },
    "pelvisPos": {
     "y": -0.06
    }
   }
  }
 },
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 14,
   "pose": "axe_raised",
   "ease": "inOut"
  },
  {
   "f": 18,
   "pose": "axe_raised",
   "from": "prev",
   "set": {
    "spine_03": {
     "fwd": -3
    }
   }
  },
  {
   "f": 22,
   "pose": "axe_hit",
   "ease": "snap"
  },
  {
   "f": 26,
   "pose": "axe_hit"
  },
  {
   "f": 45,
   "pose": "idle"
  }
 ],
 "drag": {
  "Head": 1,
  "hand_l": 1,
  "hand_r": 1
 },
 "plant": "all",
 "hands": {
  "l": "fist",
  "r": "fist"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 2.5,
  "damping": 0.45
 },
 "expect": {
  "snap": true,
  "rom": 30
 }
}
```

### Walk_Drunk_Loop

*drunk walk: whole body sways side to side over two steps, head lolls against it, arms loose and out*

`Walk_Drunk_Loop`: pass · contrast 1.3 · 1.667 s

```json
{
 "name": "Walk_Drunk_Loop",
 "loop": true,
 "intent": "drunk walk: whole body sways side to side over two steps, head lolls against it, arms loose and out",
 "base": {
  "clip": "Walk_Loop",
  "speed": 0.8
 },
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0,
     "set": {
      "spine_02": {
       "lean": 5
      },
      "spine_03": {
       "lean": 6,
       "yaw": 4
      },
      "Head": {
       "lean": -9,
       "fwd": 6
      },
      "upperarm_l": {
       "out": 14
      },
      "upperarm_r": {
       "out": 10
      },
      "pelvisPos": {
       "x": 0.03
      }
     }
    },
    {
     "f": 25,
     "set": {
      "spine_02": {
       "lean": -5
      },
      "spine_03": {
       "lean": -6,
       "yaw": -4
      },
      "Head": {
       "lean": 9,
       "fwd": 8
      },
      "upperarm_l": {
       "out": 10
      },
      "upperarm_r": {
       "out": 14
      },
      "pelvisPos": {
       "x": -0.03
      }
     }
    }
   ]
  }
 ],
 "keepFeet": true,
 "spring": {
  "bones": [
   "Head",
   "hand_l",
   "hand_r"
  ],
  "freq": 1.8,
  "damping": 0.35
 },
 "hands": {
  "l": "relaxed",
  "r": "relaxed"
 },
 "expect": {
  "slide": true
 }
}
```

### Kneel_Pray_Set

*kneel down, pray in a breathing loop, stand back up*

`Kneel_Down`: pass · contrast 2.3 · 1.3 s · warns: near edge of UAL range: lowerarm_l x 132° vs UAL -1.1…107.3 (f28)  
`Kneel_Pray_Loop`: pass · contrast 1.7 · 3 s · warns: near edge of UAL range: lowerarm_l x 132° vs UAL -1.1…107.3 (f0)  
`Kneel_Stand_Up`: pass · contrast 2.3 · 1.3 s · warns: near edge of UAL range: lowerarm_l x 132° vs UAL -1.1…107.3 (f0)

```json
{
 "name": "Kneel_Pray_Set",
 "intent": "kneel down, pray in a breathing loop, stand back up",
 "parts": [
  {
   "name": "Kneel_Down",
   "duration": 1.3,
   "base": "idle",
   "poses": {
    "kneel_pray": {
     "from": "kneel",
     "set": {
      "upperarm_l": {
       "aim": [
        0.3,
        -0.45,
        0.84
       ]
      },
      "upperarm_r": {
       "aim": [
        -0.28,
        -0.45,
        0.85
       ]
      },
      "lowerarm_l": {
       "bend": 75
      },
      "lowerarm_r": {
       "bend": 78
      },
      "Head": {
       "fwd": 22
      },
      "spine_03": {
       "fwd": 6
      }
     }
    }
   },
   "keys": [
    {
     "f": 0,
     "pose": "idle"
    },
    {
     "f": 14,
     "pose": "kneel_pray",
     "blend": {
      "pose": "idle",
      "w": 0.45
     },
     "ease": "in"
    },
    {
     "f": 28,
     "pose": "kneel_pray",
     "ease": "out"
    },
    {
     "f": 39,
     "pose": "kneel_pray"
    }
   ],
   "hands": {
    "l": "open",
    "r": "open"
   },
   "expect": {
    "exit": true,
    "offBalance": true,
    "slide": true
   }
  },
  {
   "name": "Kneel_Pray_Loop",
   "loop": true,
   "duration": 3,
   "breathe": {
    "cycles": 2,
    "amp": 1.4
   },
   "hands": {
    "l": "open",
    "r": "open"
   },
   "expect": {
    "symmetric": true,
    "offBalance": true,
    "slide": true
   }
  },
  {
   "name": "Kneel_Stand_Up",
   "duration": 1.3,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 12,
     "pose": "@prev",
     "blend": {
      "pose": "idle",
      "w": 0.5
     },
     "ease": "in"
    },
    {
     "f": 39,
     "pose": "idle",
     "ease": "out"
    }
   ],
   "hands": {
    "l": "fist",
    "r": "fist"
   },
   "blendWith": "idle",
   "expect": {
    "entry": true,
    "offBalance": true,
    "slide": true
   }
  }
 ]
}
```

### Idle_Impatient_Loop

*impatient: arms folded, right toe tapping twice per cycle, head tilting and glancing aside*

`Idle_Impatient_Loop`: pass · contrast 2.7 · 2.5 s

```json
{
 "name": "Idle_Impatient_Loop",
 "loop": true,
 "intent": "impatient: arms folded, right toe tapping twice per cycle, head tilting and glancing aside",
 "base": {
  "clip": "Idle_FoldArms_Loop"
 },
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 5,
     "set": {
      "foot_r": {
       "up": 14
      },
      "ball_r": {
       "bend": -4
      }
     }
    },
    {
     "f": 10
    },
    {
     "f": 15,
     "set": {
      "foot_r": {
       "up": 14
      },
      "ball_r": {
       "bend": -4
      }
     }
    },
    {
     "f": 20
    },
    {
     "f": 75
    }
   ]
  },
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 25,
     "set": {
      "Head": {
       "yaw": -14,
       "lean": -6
      },
      "neck_01": {
       "yaw": -5
      }
     }
    },
    {
     "f": 50,
     "set": {
      "Head": {
       "yaw": -12,
       "lean": -7
      },
      "neck_01": {
       "yaw": -5
      }
     }
    },
    {
     "f": 75
    }
   ]
  }
 ],
 "plant": {
  "l": "all"
 },
 "expect": {}
}
```

### Emote_Facepalm

*exasperated facepalm: right hand comes up to the face, head drops into it, a sigh, hand comes down*

`Emote_Facepalm`: pass · contrast 7.3 · 2.2 s

```json
{
 "name": "Emote_Facepalm",
 "duration": 2.2,
 "intent": "exasperated facepalm: right hand comes up to the face, head drops into it, a sigh, hand comes down",
 "base": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 14,
   "pose": "idle",
   "ease": "out",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.3,
      0.32,
      0.9
     ]
    },
    "lowerarm_r": {
     "bend": 88
    },
    "hand_r": {
     "fwd": -18
    },
    "Head": {
     "fwd": 14
    },
    "neck_01": {
     "fwd": 6
    },
    "spine_03": {
     "fwd": 6
    },
    "clavicle_r": {
     "up": 4
    }
   }
  },
  {
   "f": 20,
   "pose": "idle",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.3,
      0.32,
      0.9
     ]
    },
    "lowerarm_r": {
     "bend": 88
    },
    "hand_r": {
     "fwd": -18
    },
    "Head": {
     "fwd": 20
    },
    "neck_01": {
     "fwd": 8
    },
    "spine_03": {
     "fwd": 9
    },
    "clavicle_r": {
     "up": 3
    },
    "clavicle_l": {
     "up": -3
    }
   }
  },
  {
   "f": 44,
   "pose": "idle",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.3,
      0.32,
      0.9
     ]
    },
    "lowerarm_r": {
     "bend": 88
    },
    "hand_r": {
     "fwd": -18
    },
    "Head": {
     "fwd": 18
    },
    "neck_01": {
     "fwd": 7
    },
    "spine_03": {
     "fwd": 8
    },
    "clavicle_r": {
     "up": 3
    }
   }
  },
  {
   "f": 66,
   "pose": "idle"
  }
 ],
 "drag": {
  "Head": 2,
  "hand_r": 1
 },
 "plant": "all",
 "breathe": {
  "amp": 0.8
 },
 "hands": {
  "r": "open"
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 2.5,
  "damping": 0.5
 }
}
```

### Turn_Left_90

*turn 90° left in place: head leads, chest follows, hips last; right foot steps round, left pivots and resets*

`Turn_Left_90`: pass · contrast 3.9 · 1.1 s · warns: near edge of UAL range: foot_l z 59° vs UAL -7.8…44.2 (f19)  
`Turn_Left_90_R`: pass · contrast 3.9 · 1.1 s · warns: near edge of UAL range: foot_r y -36° vs UAL -17.6…33.1 (f19)

```json
{
 "name": "Turn_Left_90",
 "duration": 1.1,
 "intent": "turn 90° left in place: head leads, chest follows, hips last; right foot steps round, left pivots and resets",
 "base": "idle",
 "blendWith": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 8,
   "pose": "idle",
   "ease": "in",
   "set": {
    "Head": {
     "yaw": 28
    },
    "neck_01": {
     "yaw": 8
    },
    "spine_03": {
     "yaw": 10
    },
    "pelvis": {
     "yaw": 10
    },
    "pelvisPos": {
     "y": -0.015
    }
   }
  },
  {
   "f": 18,
   "pose": "idle",
   "set": {
    "Head": {
     "yaw": 14
    },
    "neck_01": {
     "yaw": 4
    },
    "spine_03": {
     "yaw": 8
    },
    "pelvis": {
     "yaw": 60
    },
    "pelvisPos": {
     "y": 0.01
    }
   }
  },
  {
   "f": 26,
   "pose": "idle",
   "ease": "out",
   "set": {
    "Head": {
     "yaw": 2
    },
    "spine_03": {
     "yaw": 2
    },
    "pelvis": {
     "yaw": 88
    },
    "pelvisPos": {
     "y": -0.01
    }
   }
  },
  {
   "f": 33,
   "pose": "idle",
   "set": {
    "pelvis": {
     "yaw": 90
    }
   }
  }
 ],
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 6
    },
    {
     "f": 12,
     "set": {
      "thigh_r": {
       "fwd": 24
      },
      "calf_r": {
       "bend": 34
      },
      "foot_r": {
       "up": -10
      }
     }
    },
    {
     "f": 18
    },
    {
     "f": 20
    },
    {
     "f": 24,
     "set": {
      "thigh_l": {
       "fwd": 20
      },
      "calf_l": {
       "bend": 28
      },
      "foot_l": {
       "up": -8
      }
     }
    },
    {
     "f": 29
    }
   ]
  }
 ],
 "plant": {
  "l": [
   [
    0,
    19
   ],
   [
    29,
    33
   ]
  ],
  "r": [
   [
    0,
    6
   ],
   [
    18,
    33
   ]
  ],
  "blend": 2
 },
 "drag": {
  "hand_l": 2,
  "hand_r": 2
 },
 "spring": {
  "bones": [
   "Head"
  ],
  "freq": 3,
  "damping": 0.5
 },
 "variants": [
  {
   "suffix": "_R",
   "mirror": true
  }
 ],
 "expect": {
  "slide": true,
  "exit": true
 }
}
```

### Bow_Draw_Release

*archer: raise the bow, draw the string to the cheek, hold, release with the string hand flying back, lower*

`Bow_Draw_Release`: pass · contrast 4.1 · 2.4 s

```json
{
 "name": "Bow_Draw_Release",
 "duration": 2.4,
 "intent": "archer: raise the bow, draw the string to the cheek, hold, release with the string hand flying back, lower",
 "poses": {
  "bow_ready": {
   "from": "idle",
   "set": {
    "upperarm_l": {
     "aim": [
      0.55,
      -0.55,
      0.63
     ]
    },
    "lowerarm_l": {
     "bend": -15
    },
    "upperarm_r": {
     "aim": [
      -0.2,
      -0.7,
      0.68
     ]
    },
    "lowerarm_r": {
     "bend": 40
    },
    "spine_03": {
     "yaw": -10
    }
   }
  },
  "bow_draw": {
   "from": "idle",
   "set": {
    "spine_03": {
     "yaw": -38
    },
    "spine_02": {
     "yaw": -14
    },
    "Head": {
     "yaw": 40,
     "fwd": 4
    },
    "neck_01": {
     "yaw": 10
    },
    "upperarm_l": {
     "aim": [
      0.98,
      0.08,
      0.12
     ]
    },
    "lowerarm_l": {
     "bend": -20
    },
    "hand_l": {
     "up": 10
    },
    "upperarm_r": {
     "aim": [
      -0.92,
      0.34,
      -0.18
     ]
    },
    "lowerarm_r": {
     "bend": 92
    },
    "clavicle_r": {
     "fwd": -6
    },
    "pelvisPos": {
     "x": 0.02
    }
   }
  },
  "bow_release": {
   "from": "bow_draw",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.85,
      0.3,
      -0.45
     ]
    },
    "lowerarm_r": {
     "bend": -55
    },
    "hand_r": {
     "fwd": -20
    }
   }
  }
 },
 "base": "idle",
 "blendWith": "idle",
 "keys": [
  {
   "f": 0,
   "pose": "idle"
  },
  {
   "f": 12,
   "pose": "bow_ready"
  },
  {
   "f": 24,
   "pose": "bow_draw",
   "blend": {
    "pose": "bow_ready",
    "w": 0.25
   }
  },
  {
   "f": 34,
   "pose": "bow_draw",
   "ease": "inOut"
  },
  {
   "f": 52,
   "pose": "bow_draw",
   "set": {
    "lowerarm_r": {
     "bend": 4
    }
   }
  },
  {
   "f": 54,
   "pose": "bow_release",
   "ease": "snap"
  },
  {
   "f": 60,
   "pose": "bow_release"
  },
  {
   "f": 72,
   "pose": "idle"
  }
 ],
 "drag": {
  "Head": 1,
  "hand_r": 1
 },
 "plant": "all",
 "hands": {
  "l": "fist",
  "r": "relaxed"
 },
 "spring": [
  {
   "bones": [
    "hand_r",
    "lowerarm_r"
   ],
   "freq": 3,
   "damping": 0.4
  }
 ],
 "expect": {
  "snap": true,
  "rom": 25
 }
}
```

### Rifle_Idle_Loop

*holding a rifle at low ready across the body with both hands, breathing, eyes scanning a little*

`Rifle_Idle_Loop`: pass · contrast 3.2 · 2.5 s

```json
{
 "name": "Rifle_Idle_Loop",
 "loop": true,
 "duration": 2.5,
 "intent": "holding a rifle at low ready across the body with both hands, breathing, eyes scanning a little",
 "poses": {
  "rifle_low": {
   "from": "idle",
   "set": {
    "upperarm_r": {
     "aim": [
      -0.32,
      -0.9,
      0.28
     ]
    },
    "lowerarm_r": {
     "bend": 50
    },
    "hand_r": {
     "fwd": -8
    },
    "upperarm_l": {
     "aim": [
      -0.08,
      -0.5,
      0.86
     ]
    },
    "lowerarm_l": {
     "bend": 30
    },
    "hand_l": {
     "fwd": -10
    },
    "spine_03": {
     "yaw": -10,
     "fwd": 5
    },
    "spine_02": {
     "yaw": -4
    },
    "Head": {
     "yaw": 8
    }
   }
  }
 },
 "base": "rifle_low",
 "layers": [
  {
   "additive": true,
   "keys": [
    {
     "f": 0
    },
    {
     "f": 30,
     "set": {
      "Head": {
       "yaw": 10
      },
      "neck_01": {
       "yaw": 4
      }
     }
    },
    {
     "f": 45,
     "set": {
      "Head": {
       "yaw": 9
      },
      "neck_01": {
       "yaw": 4
      }
     }
    },
    {
     "f": 75
    }
   ]
  }
 ],
 "keys": [
  {
   "f": 0,
   "pose": "rifle_low"
  }
 ],
 "keepFeet": true,
 "breathe": {
  "cycles": 2,
  "amp": 1
 },
 "hands": {
  "l": "pistol_grip",
  "r": "pistol_grip"
 }
}
```
