---
{
  "n": 78,
  "title": "Idle animations for the five 3D mascot voices",
  "abstract": "Five universal moves plus a greeting and moves of each voice's own: 24 per voice, 30 for the squire, 104 clips; 59 body, 45 piece; rig limits and assumptions",
  "refs": [
    "todo:1",
    "todo:2"
  ],
  "seen": [
    "agent",
    "system"
  ],
  "data": {
    "written": true,
    "status": "final",
    "environment": "main-monsieur-muybridge",
    "revisions": 1,
    "open_until": 1791687290.978511
  },
  "created": 1791684921.410016,
  "updated": 1791685490.978771,
  "deleted": 0.0,
  "completed": 0.0,
  "outcome": "",
  "type": "doc"
}
---


## How to read this catalogue
**What this proposes.** A shared set of five universal moves plus one greeting (the wave for three voices, with a greeting of their own for the coach and the squire), and moves of each voice's own: 18 each for the butler, coach, colleague and homie, and 24 for the squire, who needs six more moves of the body (see "Body moves and piece moves"). That's 24 moves per voice and 30 for the squire, 104 clips in all. The wave is already in body.glb, so 103 are new. Of the first 18 for each voice, 14 are marked **A** (build first: easy to see at chat size, and a move no other voice has) and 4 are marked **B** (second wave: easy to see, but close to another move). Ideas that cannot be seen at 96 px, or that the rig cannot do, are listed at the end with the reason, so nobody has to propose them again.

**Why 5 + 1 + 18 and not 5 + 20.** Five universal moves is what's left once you keep only moves that touch the head, torso and hips (see "What a shared move may touch"). The sixth slot is a greeting that every voice plays, but two of them play a different clip in it. Eighteen per voice is where the props run out. Past about 18, every new idea for a voice was either too small to see at 96 px (a foot tap, a mug swirl, a lens wipe) or a mirror or a slower copy of a move already on the list. Acts play 20 to 30 seconds apart (DEFAULT_SCHEDULE.idle), so 24 moves means a given move comes back about every ten minutes. That's enough that it never feels like a loop. If you want the full 25, promote one of the cut ideas, but every one of them was cut for a reason. The squire's six extra moves are the exception, and for a reason: 15 of his first 18 need the shield or the quill, and with one base model a voice must never be left with almost nothing to do because of what it happens to be holding.

**How a row reads.** Every move is set out on one line, like this: **name**: what the figure does · bones · length · once or loop · reads at 96 px? · cloth.
- Bones use the names in body.glb: hips, torso, head, and per side upper_arm, forearm, hand, thigh, shin, foot. **L arm** means upper_arm_left + forearm_left + hand_left; **R arm**, **L leg** and **R leg** work the same way. Every bone a move drives has to be in its `frees` list in toon.js MOVES, or the voice's hold in toonPoses.json pulls it back.
- **once** means the clip plays one time and ends on the rest pose. **loop ×n** means a beat that repeats n times inside one clip. The scheduler still plays it once, and it still ends on rest.
- **Reads at 96 px.** At chat size the figure is about 96 px tall and the models are about 2.0 to 2.3 m, so 1 px is about 2.3 cm. A move reads if the part it moves travels at least about 4 px (9 cm), or if the face changes. A head turn of 15° or more reads, because the screen slides sideways. A 5° lean of the torso moves the head about 5 px and reads. Turning a bare mitten at the wrist does not read. Turning a big prop at the wrist does: the clipboard is 0.66 m, the shield about 1 m and the quill about 1.3 m. Verdicts: **yes**, **just** (it reads, but only with the face change or cloth swing listed), **no** (cut).
- **Cloth** names a spring the move relies on (the swing is part of what you see), or "follows" when a spring only swings along, or "—". The springs come from butler.py `hanging()`: butler towel (forearm_left) and coat tails and lining (torso); coach lanyard and whistle (torso); homie hood strings (torso); squire plume (head, gravity 0.25), scarf tail (torso) and cape (torso, 0.8). Every spring follows its bone on its own (toon.js CLOTH). Nothing on this list needs a new spring. The colleague has no springs at all, so none of her moves needs one. Under the one-base-model rule a spring belongs to its piece, not its voice; see "Body moves and piece moves".

**What the rig cannot do.** There are no finger bones and no jaw, each hand keeps one fixed grip, and a prop never changes hands. No move here asks for any of that. The section "What the rig cannot do today" says what each limit costs and the smallest change that would lift it. Two dressing gaps, read from the code: the colleague's laptop is exported but not dressed (to-do 2 dresses it, and *typing rhythm* waits on it), and the homie has no bean bag; he sits on the chat box with his arms folded. The squire's sword is a quill on a hilt (squire_quill).

**Silhouette.** Every move starts and ends on the drawn rest pose. A few moves leave the drawing's outline at their peak (the butler's bow, the coach's toe touch and quad stretch, the colleague's seated stretch, the homie's lean back, the squire's en garde). Each holds that peak for 600 ms at most and returns within the same clip. No move holds an off-drawing pose as a new rest. A prop hand leaves its drawn place for one beat at most, except in moves whose whole point is the prop.

**Blink and the resting sway.** Neither is redefined here.
- *Blink.* ToonPlayer swaps the face to BLINK_FACE (sleepy) whenever the lids shut, on top of whatever face a move asked for. Moves that set a face of their own (marked **face: x**) hold the blink off while they play, and it resumes once the figure is back on its rest pose. Moves without a face let the blink run. The change to ToonPlayer.vue that does this is set out under "Decisions taken".
- *Sway.* SWAYS turns the torso on every voice, and the shins and feet on the sitting voices (colleague, homie, squire). The towel and plume sway of the 2D rigs is the cloth springs' job in 3D. A move that drives torso, shin or foot has to **replace** the sway on those bones for its length and ease back in, not add on top of it. Otherwise a seated leg kick swings twice as far and a bow wobbles. Marked **⟂ sway** below.

**Reduced motion.** It spares only the passages, the hops and the acts. Every move in this catalogue is an act, so every one is spared: none plays under reduced motion, with no exceptions. The blink and the sway keep going, because they are what makes the figure look alive, not a performance.

## Shared by every voice
**Five universal moves plus one greeting with two substitutions, not six.** Five moves play the same clip on every voice. The sixth slot is a greeting: the butler, colleague and homie play the shared wave in it, and the coach and the squire each play a greeting of their own. A greeting that swings a clipboard or a shield reads as a mistake, not a wave.

**What a shared move may touch.** Each voice holds something different in each hand, and three of the five sit. So a universal move only drives the head, torso and hips (and the face). The hold in toonPoses.json then keeps every arm and leg where that voice's drawing puts it.

*The five universal moves*

1. **look around**: head turns 25° toward the viewer's side, holds, turns 35° the other way past rest, comes back · head · 2400 ms · once · yes · plume follows.
2. **curious tilt**: head tilts 18° to one side and back · head · 1800 ms · once · yes · face: thinking · plume follows.
3. **glance at you**: head turns from its resting −14° to face the viewer straight on, holds 600 ms, turns back · head · 1400 ms · once · yes · face: open.
4. **nod off**: head droops slowly over 2 s with the torso slumping 6°, then jerks up · head, torso · 3200 ms · once · yes · face: sleepy, then surprised at the jerk · ⟂ sway · on the squire the plume whips at the jerk.
5. **wink**: head tilts 8° toward the chat with a wink · head · 1200 ms · once · yes (the face carries it) · face: wink.

*The greeting*

6. **wave** *(exists in body.glb, 1833 ms)*, for the **butler, colleague and homie**: the right arm waves. Frees upper_arm_right and forearm_right. Once · yes · cloth follows. Each of the three has something free to wave with: the butler's hat fist leaves the brim, the colleague's open hand is free, and the homie's arm unfolds.
6c. **coach hello**, for the **coach**: the thumbs-up hand (left) rises above the cap and holds for a beat while the head nods once; the clipboard arm keeps its hold · L arm, head · 1600 ms · once · yes · face: happy · whistle follows. His drawing already has the free hand raised, so this is his drawing, emphasised.
6s. **seated bow**, for the **squire**: torso dips 20° from the seat and the head nods, while both hands keep their hold, so the shield and the quill ride along without swinging · torso, head · 1800 ms · once · yes · face: happy · the plume dips and springs back · ⟂ sway. Both his hands hold something, so his drawing gives him no free hand to raise. His own *quill salute* is the showier greeting, but it moves the quill, so it stays one of his acts.

Considered for the shared set and dropped: a deep breath (the torso rises about 3 px, too little to see) and a happy hip wiggle (on the sitting voices, turning the hips swings the legs off the seat).

## Butler
Holds: right fist on the hat brim, left hand open under the tray with the laptop, towel over the left forearm, coat tails behind. Stands. Brought over from 2D: hat tip and bow, tray offer, little two step, polish and inspect.

1. **A · hat tip**: head dips 15° while the hat hand rides along on the brim · head, R arm · 1400 ms · once · yes · —
2. **A · bow** *(from 2D "hat tip and bow")*: torso bends 30° forward from the hips, hat hand stays on the brim, tray arm turns back to keep the tray level · hips, torso, head, R arm, L arm · 2200 ms · once · yes · relies on coat tails · ⟂ sway.
3. **A · tray offer** *(from 2D)*: tray arm pushes the tray out toward the chat, torso leans 5° · torso, L arm · 1900 ms · once · yes · face: open · relies on towel · ⟂ sway.
4. **A · little two step** *(from 2D)*: four small steps on the spot, hips shifting · hips, L leg, R leg, torso · 2200 ms · loop ×2 · yes · coat tails follow · ⟂ sway.
5. **A · polish and inspect** *(from 2D)*: hat hand leaves the brim, rubs the laptop lid in small circles, head bends to look, hand goes back · R arm, head · 2400 ms · once · yes · — (the towel can't come to the right hand, so the fist does the polishing).
6. **A · tray wobble**: tray tips 10° each way, the forearm catches it · L arm · 1800 ms · once · yes · face: surprised, then happy · relies on towel.
7. **A · waiter's turn**: tray arm swings the tray out to the side and back in a level arc · L arm · 2000 ms · once · yes · relies on towel.
8. **A · towel flick**: tray forearm flicks once so the towel snaps, the hand turns back to keep the tray level · forearm_left, hand_left · 1200 ms · once · just (the towel is what you see) · relies on towel.
9. **A · straighten the bow tie**: hat hand comes down to the bow tie, tugs twice, goes back up · R arm, head · 2000 ms · once · yes · —
10. **A · brush the shoulder**: hat hand flicks dust off the other shoulder twice, head turns to watch · R arm, head · 1800 ms · once · yes · —
11. **A · dust the hat**: hat hand lifts and pats the crown twice · R arm · 1500 ms · once · yes · —
12. **A · glance at the screen**: head turns down toward the laptop on the tray, nods once · head · 1800 ms · once · yes · face: thinking.
13. **A · tap the laptop**: hat hand taps a key twice and goes back · R arm, head · 1600 ms · once · yes · —
14. **A · sniff**: chin lifts 12°, head turns slightly away, comes back · head, torso · 1600 ms · once · yes · face: thinking · ⟂ sway.
15. **B · polite cough**: fist to the screen, head dips, torso jerks twice · R arm, head, torso · 1600 ms · once · yes · coat tails follow · ⟂ sway.
16. **B · glance at the wrist**: hat arm turns its wrist up as if to read a watch, head dips to it · R arm, head · 1800 ms · once · yes · —
17. **B · heel click**: heels come together, rises on the toes, drops · L leg, R leg, torso · 1300 ms · once · just (with the happy face) · face: happy · coat tails follow · ⟂ sway.
18. **B · weight shift**: weight passes from one leg to the other and back · hips, thigh_left, thigh_right, torso · 2400 ms · once · just · coat tails relied on · ⟂ sway.

## Coach
Holds: left hand a thumbs-up, right hand gripping the clipboard edge, whistle on a lanyard from the torso. Stands in a lunge. Brought over from 2D: jog on the spot, fist pump, whistle call, two squats.

1. **A · jog on the spot** *(from 2D)*: knees lift in turn, arms pump with the clipboard kept upright, torso bobs · L leg, R leg, L arm, R arm, torso · 2400 ms · loop ×2 · yes · relies on whistle cord · ⟂ sway.
2. **A · thumbs-up pump** *(2D "fist pump"; the mitten is a thumbs-up)*: thumbs arm pumps twice · L arm, head · 1600 ms · once · yes · face: happy.
3. **A · whistle call** *(from 2D, reworked)*: torso pops up, head dips to the whistle, whistle swings up on its cord · torso, head · 1700 ms · once · just (the cord carries it) · face: open · relies on whistle cord · ⟂ sway. A real whistle-to-lips can't be done (see the rig limits).
4. **A · two squats** *(from 2D)*: knees bend twice, torso forward, arms reach forward · hips, L leg, R leg, torso, L arm, R arm · 2600 ms · loop ×2 · yes · whistle follows · ⟂ sway.
5. **A · read the clipboard**: clipboard comes up in front of the screen, head bends, nods · R arm, head · 2000 ms · once · yes · face: thinking.
6. **A · tick the board**: thumbs hand jabs the clipboard twice · L arm, R arm · 1600 ms · once · yes · —
7. **A · board on the thigh**: clipboard slaps down against the thigh twice · R arm · 1600 ms · once · yes · —
8. **A · quad stretch**: one foot comes up behind, he wobbles, thumbs arm out for balance · R leg, L arm, torso · 2600 ms · once · yes · whistle follows · ⟂ sway.
9. **A · toe touch**: torso folds 60° forward, both arms drop, comes back up · hips, torso, L arm, R arm · 2600 ms · once · yes · relies on whistle cord · ⟂ sway.
10. **A · arm circles**: thumbs arm circles twice · L arm · 2000 ms · loop ×2 · yes · —
11. **A · cap tug**: thumbs hand to the brim, tug · L arm, head · 1400 ms · once · yes · —
12. **A · board clap**: thumbs hand claps the clipboard face twice · L arm, R arm · 1400 ms · once · yes · face: open.
13. **A · point at the chat**: thumbs hand turns sideways to point at the viewer, head turns to face out · L arm, head · 1500 ms · once · yes · face: wink.
14. **A · wipe the brow**: thumbs forearm sweeps across the screen · L arm, head · 1600 ms · once · yes · face: sad, then happy.
15. **B · pep shout**: torso leans in, head up, thumbs arm thrusts forward · torso, head, L arm · 1400 ms · once · yes · face: open · whistle follows · ⟂ sway.
16. **B · shadow jab**: thumbs arm jabs twice · L arm, torso · 1500 ms · once · yes · ⟂ sway.
17. **B · switch the lunge**: lunge swaps to the other side and back · hips, L leg, R leg · 2400 ms · once · yes (the silhouette changes mid-move, then returns) · whistle follows.
18. **B · toe bounce**: four quick bounces on the toes · feet, hips · 1600 ms · loop ×4 · just (with the whistle) · relies on whistle cord.

## Colleague
Holds: left hand wrapped around the mug, right hand open, glasses on the head. Sits on the chat box edge (seat 0.28), legs over the corner. No cloth springs. **Not dressed in 3D yet:** her laptop, which is exported as colleague_laptop.glb but not listed in VOICES.colleague. To-do 2 dresses it. One move waits on it (marked).

1. **A · coffee sip** *(from 2D)*: mug comes up to the screen, head tips back, mug goes down · L arm, head · 2300 ms · once · yes · face: sleepy (content).
2. **A · blow on the coffee**: mug under the screen, head dips, two short blows · L arm, head · 1800 ms · once · yes · face: open.
3. **A · glasses push** *(from 2D)*: open hand to the bridge, pushes, back · R arm, head · 1500 ms · once · yes · —
4. **A · seated stretch** *(2D "desk stretch")*: both arms go overhead (the mug stays level), torso arches back · L arm, R arm, torso, head · 2400 ms · once · yes · face: sleepy · ⟂ sway.
5. **A · empty mug**: tips the mug toward the screen, looks in, shakes her head · L arm, head · 2000 ms · once · yes · face: sad.
6. **A · cheers**: lifts the mug toward the chat · L arm, head · 1500 ms · once · yes · face: happy.
7. **A · cross the legs**: uncrosses and recrosses the other way · L leg, R leg · 2400 ms · once · yes · ⟂ sway.
8. **A · swing the legs**: both shins kick forward together, twice · shins, feet · 1600 ms · loop ×2 · yes · face: happy · ⟂ sway.
9. **A · lean back**: torso leans back, open hand goes behind the head · torso, R arm, head · 2400 ms · once · yes · face: happy · ⟂ sway.
10. **A · chin on hand**: elbow to knee, chin on the open hand, holds, sits up · torso, R arm, head · 2800 ms · once · yes · face: thinking · ⟂ sway.
11. **A · sigh and slump**: torso slumps forward, head drops, sits back up · torso, head · 2200 ms · once · yes · face: sad · ⟂ sway.
12. **A · aha**: open hand shoots up, head lifts · R arm, head · 1400 ms · once · yes · face: surprised, then happy.
13. **A · yawn**: open hand to the screen, head back, torso arches · R arm, head, torso · 2000 ms · once · yes · face: open · ⟂ sway.
14. **A · typing rhythm** *(from 2D)*: open hand types a beat on the laptop, head bobs · R arm, head · 2100 ms · loop ×3 · yes · **waiting on the laptop (to-do 2)**: build it once the laptop is dressed.
15. **B · neck stretch**: head tilts slowly to one side, then the other · head · 2400 ms · once · yes · face: sleepy (close to shared *curious tilt*, slower and both ways).
16. **B · nod along**: head nods four times, as if on a call · head · 1600 ms · loop ×4 · yes · face: happy.
17. **B · wipe a lens**: open hand rubs one lens in small circles · R arm, head · 2000 ms · once · just (the hand covers the screen, which is what you see) · —
18. **B · read the mug**: turns the mug to look at its side · L arm, head · 1600 ms · once · just · face: thinking.

## Homie
Holds: arms folded, open hands lying over the forearms, cap, big headphones, hoodie with hood strings. Sits on the chat box (seat 0.28). A standing stance exists but isn't used here. **Not dressed in 3D:** the bean bag and the laptop from his drawing. Brought over from 2D: pull up, music nod, seat bounce, fist bump.

1. **A · music nod** *(from 2D)*: head nods on a beat, torso bobs · head, torso · 1800 ms · loop ×2 · yes · face: happy · hood strings follow · ⟂ sway.
2. **A · seat bounce** *(from 2D)*: hips bounce twice on the seat, legs kick · hips, L leg, R leg · 2000 ms · loop ×2 · yes · relies on hood strings · ⟂ sway.
3. **A · fist bump** *(from 2D; the mitten is open, so it's a palm pushed toward the chat)*: right arm unfolds, palm out, refolds · R arm, head · 1700 ms · once · yes · face: happy.
4. **A · hitch up** *(2D "pull up")*: hands push on the seat, hips lift and settle further back · hips, L arm, R arm, torso · 2200 ms · once · yes · hood strings follow · ⟂ sway.
5. **A · headphone press**: both hands to the headphones, head tilts, feels the drop · L arm, R arm, head · 2200 ms · once · yes · face: sleepy (eyes shut).
6. **A · air drums**: arms unfold, hands tap air drums in turn, refold · L arm, R arm, head · 2400 ms · loop ×4 · yes · face: happy.
7. **A · lean back**: torso leans back 20°, both hands go behind the head · torso, L arm, R arm, head · 2600 ms · once · yes · face: happy · ⟂ sway.
8. **A · shrug**: folded arms lift together, head tilts · upper arms, head · 1300 ms · once · just (with the face) · face: open.
9. **A · yo**: one palm up, a quick raise · R arm · 1400 ms · once · yes · —
10. **A · cap down**: hand pulls the cap brim down over the screen, head dips · R arm, head · 1600 ms · once · yes · face: wink.
11. **A · beat kicks**: shins kick in turn on the beat · shins, feet · 1800 ms · loop ×4 · yes · ⟂ sway.
12. **A · stretch and yawn**: arms go up, torso arches · L arm, R arm, torso, head · 2400 ms · once · yes · face: open · ⟂ sway.
13. **A · point at you**: both hands thrust at the chat · L arm, R arm, head · 1400 ms · once · yes · face: wink.
14. **A · scratch the head**: hand to the side of the cap, scratches · R arm, head · 1600 ms · once · yes · face: thinking.
15. **B · seat dance**: arms unfold to a shoulder dance, torso twists side to side · torso, L arm, R arm · 2400 ms · loop ×2 · yes · hood strings follow · ⟂ sway.
16. **B · groove**: head and torso rock side to side · head, torso · 2000 ms · loop ×4 · yes · face: happy · ⟂ sway (close to *music nod*).
17. **B · lean on an elbow**: props himself on one arm, torso tilted 15° · torso, L arm · 2600 ms · once · yes · ⟂ sway.
18. **B · tug the strings**: hand tugs one hood string down twice · R arm · 1400 ms · once · just (the string is what you see) · relies on hood strings.

## Squire
Holds: shield in the right hand, quill-sword in the left fist, helmet with plume, scarf tail, cape. Sits on the box edge (seat 0.1), one leg up as drawn. A standing stance exists but isn't used here. The brief's "sword" is the quill (squire_quill). Brought over from 2D: leg swing and salute, shield salute, quill flourish, peer into the distance.

1. **A · quill salute** *(from 2D "leg swing and salute")*: quill comes up to the helmet's brow and sweeps down · L arm, head · 2100 ms · once · yes · plume follows.
2. **A · shield raise** *(2D "shield salute")*: shield comes up before the screen, head ducks behind it, shield goes down · R arm, head · 2200 ms · once · yes · —
3. **A · quill flourish** *(from 2D)*: quill traces a figure-eight in the air · L arm · 2300 ms · once · yes · —
4. **A · peer into the distance** *(from 2D)*: fist at the brow as a shade, head turns, torso leans · L arm, head, torso · 2000 ms · once · yes · plume, cape follow · ⟂ sway.
5. **A · leg swing** *(from 2D "leg swing and salute")*: the raised leg swings twice · L leg, R leg · 2100 ms · loop ×2 · yes · ⟂ sway.
6. **A · en garde**: torso turns, quill points forward, shield comes forward · torso, L arm, R arm, head · 1800 ms · once · yes · relies on cape · ⟂ sway.
7. **A · parry**: shield snaps up and across, back · R arm, head · 1200 ms · once · yes · face: surprised.
8. **A · thrust**: quill thrusts once at the chat · L arm, torso · 1200 ms · once · yes · face: open · cape follows · ⟂ sway.
9. **A · write in the air**: quill writes small strokes, the tip moving like a pen · forearm_left, hand_left, head · 2400 ms · once · yes (the quill is long) · face: thinking.
10. **A · polish the shield**: quill fist rubs the shield face in circles · L arm, R arm, head · 2200 ms · once · yes · —
11. **A · plume flick**: head shakes quickly so the plume whips · head · 1200 ms · once · just (the plume is what you see) · relies on plume.
12. **A · cape swish**: torso turns 20° and back, the cape swings out · torso, hips · 1600 ms · once · just (the cape is what you see) · relies on cape · ⟂ sway.
13. **A · knock on the helmet**: the quill's pommel taps the helmet twice · L arm, head · 1500 ms · once · yes · face: thinking.
14. **A · sneeze**: head and torso jerk forward · head, torso · 1600 ms · once · yes · face: scared, then surprised · relies on plume · ⟂ sway.
15. **A · yawn behind the shield**: shield rises to cover the screen, holds, lowers · R arm, head · 2000 ms · once · yes · face: sleepy.
16. **A · I dub thee**: quill taps the air at one shoulder height, then the other · L arm, head · 2400 ms · once · yes · face: happy.
17. **B · tap the star**: quill tip taps the shield's star twice · L arm · 1400 ms · once · yes (close to *polish the shield*).
18. **B · scarf tug**: quill fist tugs the scarf tail · L arm, head · 1600 ms · once · just · relies on scarf.

*Moves of the body, so he keeps a character when the shield and quill are off.* Each of these works with or without his pieces. Where a hand is used, a held piece rides along on it.

19. **A · foot drum**: seated, his heels drum against the box in turn, each shin swinging back 20° · shins, feet · 1600 ms · loop ×6 · yes · ⟂ sway.
20. **A · proud chin**: chest out, chin up 15°, holds, settles · torso, head · 1800 ms · once · yes · face: happy · plume, cape follow · ⟂ sway.
21. **A · fists on hips**: both hands go to the hips, elbows out, holds, back · L arm, R arm, torso · 2200 ms · once · yes · face: happy · needs free hands to read as drawn (with pieces held it reads as arms akimbo holding them).
22. **A · big stretch**: arms go up and out, torso arches, settles · L arm, R arm, torso, head · 2400 ms · once · yes · face: sleepy · cape follows · ⟂ sway.
23. **A · look over the shoulder**: torso turns 25° and head 30° to look behind him, comes back · torso, head · 1800 ms · once · yes · face: thinking · cape, plume follow · ⟂ sway.
24. **B · heel kick**: the raised leg kicks out once and tucks back, a show of spirit · L leg, R leg · 1400 ms · once · yes · face: happy · ⟂ sway (close to *leg swing*).

## Body moves and piece moves
**The rule this reads against.** There is one base model for all five voices: one bare body, one set of bones. Every piece is a standalone asset on a named slot of the shared rig, so any voice can wear any other voice's pieces. A move therefore belongs to one of two kinds:
- A **body move** drives only bones and needs no piece. It is a move of the shared rig and works on any voice. Some body moves also need a stance (standing or sitting), and some need a free hand, meaning a hand slot that holds nothing.
- A **piece move** only makes sense with a given piece worn. It belongs to the piece, not the voice. A move that needs the butler's tray is a tray move: whoever wears the tray gets it.

A move whose verdict above is "just (the cloth carries it)" counts as a move of that cloth's piece, because without the piece nothing shows.

**What the rule changes beyond the moves.**
- *The hold has to split.* toonPoses.json gives each voice one rest pose covering every bone, but much of it is really the pieces' pose: the butler's left arm is bent to carry a tray, the coach's right arm to hold a clipboard. Under the new rule a hand-held piece should bring the hold for the arm it sits on, and the voice's hold keeps only posture: head size, torso lean, legs, seat. Piece moves are then written relative to the piece's hold, so a tray move plays the same on whoever holds the tray.
- *Grips are pieces too.* Each hand is a mitten baked into its piece (butler.py `mitten`, returned inside the prop's asset: "squire_quill" is quill + fist). Under slots, the grip travels with what the hand holds, and an empty hand slot needs a bare hand of its own.
- *A voice's schedule becomes a union.* It is the five universal moves, plus the greeting for its hands, plus its own body moves, plus the moves of every piece it is wearing right now. The per-voice 24 then only holds while a voice wears its own drawing's pieces.
- *The greeting can choose itself.* Wave when the right hand is free, the coach hello when only a thumbs hand is free, the seated bow when neither hand is. That is a rule about free hands, not about voices, and it keeps working when pieces move.

**Universal and greeting (8 clips).** All are body moves: look around, curious tilt, glance at you, nod off, wink, and the seated bow (any stance); wave (needs a free right hand); coach hello (needs a free hand; reads best with a thumbs hand, and is a plain raised hand without one).

**Butler: 8 body, 10 piece.**
- Body: bow (if a tray is held, the tray clause keeps it level), little two step *(standing)*, brush the shoulder *(free hand)*, sniff, polite cough *(free hand)*, glance at the wrist *(free hand)*, heel click *(standing)*, weight shift *(standing; reads "just", better with coat tails)*.
- **Tray**: tray offer, polish and inspect, tray wobble, waiter's turn, glance at the screen, tap the laptop (the laptop is part of the tray piece).
- **Hat**: hat tip, dust the hat. **Towel**: towel flick. **Bow tie**: straighten the bow tie.

**Coach: 9 body, 9 piece.**
- Body: jog on the spot *(standing)*, two squats *(standing)*, quad stretch *(standing)*, toe touch *(standing)*, switch the lunge *(standing, in the lunge)*, arm circles, wipe the brow, pep shout, shadow jab.
- **Clipboard**: read the clipboard, tick the board, board on the thigh, board clap. **Thumbs hand**: thumbs-up pump, point at the chat. **Whistle**: whistle call, toe bounce. **Brimmed cap**: cap tug (any cap with a brim, so the homie's too).

**Colleague: 10 body, 8 piece.**
- Body: seated stretch (if a mug is held, the mug stays level), cross the legs *(sitting)*, swing the legs *(sitting)*, lean back *(free hand)*, chin on hand *(sitting, free hand)*, sigh and slump, aha *(free hand)*, yawn *(free hand)*, neck stretch, nod along.
- **Mug**: coffee sip, blow on the coffee, empty mug, cheers, read the mug. **Glasses**: glasses push, wipe a lens. **Laptop**: typing rhythm (waiting on to-do 2).

**Homie: 15 body, 3 piece.**
- Body: music nod, seat bounce *(sitting)*, fist bump *(free hand)*, hitch up *(sitting)*, air drums *(free hands)*, lean back, shrug, yo *(free hand)*, beat kicks *(sitting)*, stretch and yawn, point at you *(free hands)*, scratch the head, seat dance, groove, lean on an elbow *(sitting)*.
- **Headphones**: headphone press (every voice wears butler_headphones today, so this already plays on all five). **Brimmed cap**: cap down. **Hoodie**: tug the strings.

**Squire: 9 body, 15 piece.**
- Body: peer into the distance (the fist shades the visor, with or without the quill), leg swing *(sitting)*, sneeze, foot drum *(sitting)*, proud chin, fists on hips *(free hands)*, big stretch, look over the shoulder, heel kick *(sitting)*.
- **Quill**: quill salute, quill flourish, thrust, write in the air, I dub thee. **Shield**: shield raise, parry, polish the shield, yawn behind the shield. **Quill and shield together**: en garde, tap the star. **Helmet plume**: plume flick. **Cape**: cape swish. **Helmet**: knock on the helmet. **Scarf**: scarf tug.

**Totals.** Of the 104 clips, 59 are body moves (the 8 universal and greeting clips plus 51 own) and 45 are piece moves. By piece: tray 6, quill 5, mug 5, clipboard 4, shield 4, quill and shield 2, hat 2, thumbs hand 2, whistle 2, brimmed cap 2, glasses 2, and 1 each for towel, bow tie, laptop, headphones, hoodie, plume, cape, helmet and scarf.

**What a voice keeps with no pieces at all.** Its own body moves plus the 6 shared: homie 21, colleague 16, coach 15, squire 15, butler 14. The squire was the one left with almost nothing (3 body moves, 9 in all). His six added body moves bring him in line with the others. The butler and the coach still lose about half their list without their pieces, which is acceptable: they keep 14 and 15.

## What the rig cannot do today
Each limit below gives what the rig does today (read from scripts/mascots/butler.py and src/web/src/kit/toonScene.js), what it costs the catalogue, and the smallest change that lifts it, with its cost. They're in order of value for the cost.

**Spend order: item 1 first, then item 3.** Alfred's ruling: the handover key comes second, ahead of the cheaper glance faces, because it retires both greeting substitutions. With it, the coach tucks the clipboard and the squire sheathes the quill, and both wave. The shared set becomes genuinely universal instead of five plus two exceptions, and that is worth more than the three or so moves each of its neighbours unlocks.

**1. Hands have no fingers: one fixed grip each.**
- *Today:* `build_rig` gives each hand one bone (hand_left, hand_right). The shape of the hand is a mitten mesh baked into the piece it holds, made by `mitten(prefix, rig, side, grip)` with one of five grips: fist, open, edge, wrap, thumbs.
- *What it costs now:* the coach's fist pump is a thumbs-up pump; the homie's fist bump is an open palm; nobody can point (the coach's *point at the chat* turns a thumbs-up sideways, the homie's *point at you* thrusts open palms); the homie's drawn thumbs-up can't be made, because his hands are open; the butler can't wave an open hand, because his right hand is a fist; and an *aha* can't raise a finger.
- *Smallest change: swappable hand shapes, no new bones.* Export the five mitten grips plus a point as standalone hand pieces per side, all on the hand bone, and let a move switch which one shows, the way it switches the face texture. A hand that holds a piece keeps that piece's grip. The mitten builder already exists, so this is about 12 small meshes and one visibility switch in the scene, with no re-rigging and no re-export of other assets. It also gives the one-base-model rule the bare hand an empty slot needs.
- *What it unlocks:* repairs the 4 moves above, and adds a real fist pump, pointing for any voice, the homie's thumbs-up, a counting-on-fingers *thinking* gesture, and an open-hand wave for the butler. About 8 moves, the most for the least.
- *Not recommended:* real finger bones (three per finger). At 96 px a finger is under 2 px wide, so no pose of a finger can be seen.

**2. There is no jaw, and the face has no glance.**
- *Today:* the face is a visor screen with drawn eyes, one texture per mood (FACES, drawn by scripts/mascots/faces.py), and there's no mouth to open. The 2D rigs had look_left, look_right, look_up and look_down eyes; the 3D faces don't.
- *What it costs now:* nothing for the jaw. The figures are visored robots, and yawn, blow, cough and sneeze already work through the *open*, *sleepy* and *surprised* faces. Glances do cost something: every look is a head turn, so the figure can't glance without moving its whole head.
- *Smallest change: no jaw bone (it would serve no face). Add four faces instead: look left, look right, look up, look down.* That's 20 textures (4 faces × 5 voices) through the existing faces.py, and no change to the rig or the scene.
- *What it unlocks:* eyes-only glances that can play during a held-prop move without a head turn, a side-eye for the homie, the colleague reading her screen. About 4 new moves, and subtler versions of *look around* and *glance at the screen*.

**3. Props never change hands.** *(Spend on this second, after item 1.)*
- *Today:* every piece is skinned to one bone at export. The scene hangs each mesh on that bone once, in `Figure.dress` (`this.bones[boneOf(mesh)].attach(mesh)`), and it never moves again.
- *What it costs now:* the coach can't put the whistle to his lips; the butler polishes with his fist because the towel can't reach the polishing hand (the 2D *polish and inspect* used the towel); nobody can tuck a prop under an arm to free a hand; and the coach and the squire can't wave, which is why they needed substitute greetings.
- *Smallest change: a handover key on a move.* At a given millisecond a named piece re-hangs from bone A to bone B, keeping its place in the world (three.js `attach` does exactly that, and the scene already uses it). It hangs back at the move's end or on the rest pose. In the scene this is a few lines. In Blender it costs more: the clip must be authored with the piece following the second hand (a Child Of constraint switched on for the frames of the handover, baked at export), because the export today assumes one bone per piece. Under the one-base-model rule a handover is the piece changing slot for the length of a move, so it should be defined on the slot, not on the voice.
- *What it unlocks:* a true whistle call, polishing with the towel, the colleague passing the mug to her free hand, the clipboard tucked under the coach's arm for a real wave, the quill sheathed so the squire can wave. About 6 moves, and the two greeting substitutions could go away.

**4. There are no shoulder bones.**
- *Today:* upper_arm hangs straight from the torso.
- *What it costs now:* the shrug reads only "just", a shoulder roll was cut, and a breath can't lift the shoulders, which is part of why it was cut.
- *Smallest change: one clavicle bone per side, between torso and upper_arm.* This is expensive. Every sleeve, coat and armour piece is weight-painted to the upper arm and torso and would have to be re-weighted and re-exported. Every arm hold in toonPoses.json would have to be re-measured, because the arm's pivot moves. And every existing clip would have to be re-keyed.
- *What it unlocks:* 2 or 3 moves (a real shrug, a shoulder roll, a breath).
- *Not recommended now.* Revisit if the base model is re-rigged for another reason.

**5. The spine is one bone.**
- *Today:* torso runs from hips to chin as one bone, so a bow or a slump bends like a plank.
- *Smallest change: split torso into a lower and an upper bone.* The cost is the same kind as the clavicles: every torso piece re-weighted, every hold and clip re-keyed.
- *What it unlocks:* no new moves, only softer bows and slumps. At 96 px the difference between a plank bend and a curved one is a pixel or two.
- *Not recommended.*

## Considered and cut
- **Too small to see at 96 px:** a deep breath (shared); a foot tap on any sitting voice (the sway already swings the feet, and a tap is about 2 px); the colleague swirling her mug; the colleague peering over her glasses (the glasses are fixed to the head bone); a shoulder roll (there are no shoulder bones, and the upper arms are held).
- **The rig can't do it:** the butler checking a pocket watch (no watch); the colleague checking her phone or writing a note (no phone; the mug hand is taken); the coach checking a stopwatch (no stopwatch); the homie turning his cap backwards (the cap rides the head bone); anything that moves a prop from one hand to the other.
- **Breaks the silhouette:** the homie or the squire standing up (that's a change of stance, a passage, not an act); a happy hip wiggle shared by all (on the sitting voices it swings the legs off the seat).

## Decisions taken
1. **The colleague's laptop is dressed, not cut.** colleague_laptop.glb is exported, and her drawing has the desk. The gap is that VOICES.colleague in toon.js never listed it. Filed as to-do 2. *Typing rhythm* stays in the catalogue, marked as waiting on it.
2. **The shared wave is replaced on the coach and the squire.** The coach plays *coach hello* and the squire the *seated bow*, and both leave the held prop still. The wave stays shared for the butler, colleague and homie. The shared set is five universal moves plus one greeting with two substitutions.
3. **The blink holds off while a move sets a face, and resumes on the rest pose.** This is a proposal; nothing is built.
   - *Where:* src/web/src/kit/ToonPlayer.vue, in `draw()`, the line `figure.face(lids.value ? BLINK_FACE : props.face || dressingOf(props.voice).face);` (line 31 in Signor Bernini's worktree at 1f58f53ce). Today the shut lids win over any face a move asks for.
   - *The change:* a move that sets a face says so. Its entry in toon.js MOVES gains a `faces` list of `[ms, face]` keys, which are the "face:" column of this catalogue. While such a move plays, `draw()` shows the move's face at that moment and never BLINK_FACE. When the move has ended and the figure is back on its rest pose, the old precedence returns: lids shut, then BLINK_FACE, then props.face, then the voice's resting face.
   - The blink clock in useBlink (src/web/src/composables/blink.js) keeps running. A blink that falls inside a face move is simply not shown, and the next one comes on its normal gap after the move. So the composable doesn't change, and no blink queues up to fire the moment the move ends.
   - A move without faces lets the blink run as today. The 2D player already behaves this way: in VoiceMascot.vue, `blink()` plays only when nothing is playing.
4. **No wink under reduced motion.** Reduced motion spares the blink and the sway because they are life, not performance; a wink is an act, and acts are what the setting exists to stop. No exceptions, so the rule stays one line: under reduced motion, no act plays.

5. **The squire gets six body moves**, so he keeps a character when his shield and quill are off: foot drum, proud chin, fists on hips, big stretch, look over the shoulder, heel kick. They're counted: he has 24 moves of his own, 30 in all.
6. **Rig spending: hand shapes first, the handover key second**, because the handover makes the greeting universal (see "What the rig cannot do today").

**Order to build in:** the five universal moves and the two greeting substitutions; then the body moves, since they belong to the shared rig and play on any voice; then the piece moves, piece by piece, starting with the ones brought over from 2D (they already have timings to copy). B moves come last. If you want the rig changes, the hand shapes (limit 1) and the four glance faces (limit 2) are cheap enough to do before the moves they unlock are keyed.

## What this catalogue assumes
Anyone picking this up should know where the ground is soft. Each of these is an assumption the catalogue rests on, and what would make it wrong.

- **The slot names.** The piece moves are filed under today's asset names in toon.js VOICES (tray, clipboard, mug, quill and so on), because the shared rig has no named slots in the code yet. When Signor Bernini builds the slots, every piece move must be re-filed under its slot. If a slot joins or splits what's one asset today (the tray and the laptop on it, the helmet and its plume, the hand grip and the prop it holds), the piece counts in "Body moves and piece moves" change with it.
- **body.glb was never opened.** The bone names come from `build_rig` in scripts/mascots/butler.py, and the existing clips (idle, wave, walk) and their lengths from toon.js MOVES, not from the exported file. If the export renames a bone, or carries clips the code doesn't list, the bones column and the "exists" note on the wave are wrong.
- **The 96 px verdicts are worked out, not seen.** Each "yes", "just" or "no" comes from the model sizes (about 2.3 cm per pixel at chat size) and how far a part travels, not from a render. A render at 96 px, with the outline at its chat weight, may promote some "just" moves or demote some "yes" ones. Render the B moves and every "just" before keying them.
- **The holds and cloth as of one commit.** The rest poses come from toonPoses.json, the cloth springs from butler.py `hanging()`, and the ToonPlayer.vue line for the blink from Signor Bernini's worktree at 1f58f53ce. The one-base-model rule is expected to split the holds (see "Body moves and piece moves"), so any move described relative to a voice's hold should be re-read against the piece's hold once that split lands.
- **Lengths and angles are proposals.** Every duration and degree here is a starting value for whoever keys the clip, picked to sit beside the 2D moves (1.6 to 3.0 s). None was tried in motion.
