Alfred, the splits are in (e3c969c41), and `toonAssets.json` is now read by both the build and the viewer. That is the point you asked to hear about before you choose what doc 79 models first.

**How a piece declares itself now.** Every piece has one entry in `src/web/src/domain/toonAssets.json`: its `slot`, `sleeves` (required for any torso piece) and `hides` (the slots it covers). The build checks each piece and stops on any of these:
- a piece the catalogue does not declare;
- a torso piece that does not say whether it brings sleeves;
- a part hung on a bone its slot does not give it. Each slot in `toonSlots.json` lists its bones, so a coat cannot carry shoes and a hat cannot carry hands.

The viewer dresses a voice from a map of slot to piece, so an ears piece replaces rather than stacks: one key, one piece. It also refuses a piece worn on a slot it was not declared for, and it leaves out whatever another worn piece hides. Today `butler_hat`, `coach_cap`, `homie_cap` and `squire_helmet` declare `hides: ["hair"]`.

**What the splits took apart** (40 pieces now, none bundled):
- **Shoes** out of `butler_coat`, `coach_tracksuit`, `colleague_shirt`, `homie_hoodie` and `squire_armour`, now `butler_shoes`, `coach_shoes`, `colleague_shoes`, `homie_shoes` and `squire_boots`.
- **Sleeves** out of every torso piece: `butler_sleeves` (with his cuffs), `coach_sleeves` (with the arm stripes), `colleague_sleeves`, `homie_sleeves`, and `squire_vambraces`. Every torso piece declares `sleeves: false`.
- **Trousers** out of the coach's tracksuit (`coach_trousers`) and the squire's armour (`squire_greaves`). His belt is `squire_belt` on the new hips slot.
- **Headphones:** one shared `headphones` piece in place of `butler_headphones`. The squire's own pair came out of his helmet as `squire_headphones`, and the homie's round-the-neck pair stays on the neck slot. For the record, the squire never wore the shared pair, and the homie's are on his neck, not his ears, so no ears piece had actually stacked. The rule now makes stacking impossible.
- **Hands out of props:** found while in there, and the same kind of bundle. `coach_hands` (the thumb and the clipboard grip, formerly `coach_thumb`), `colleague_hands` (out of `colleague_mug`), and `squire_hands` (out of the shield and quill).

**The laptop is back, built properly.** `laptop()` is one builder shared by the butler's tray and the colleague. `colleague_laptop` is declared on a new lap slot and is placed across her thighs from her posed rig, its lid toward the viewer as in the desk scene. I have NOT put it on her in the drawn pose, because the 2D rest drawing she is judged against shows no laptop: wearing it would cost overlap against that drawing. It is one line in her wardrobe (`lap: "colleague_laptop"`) the moment to-do 4278 wants it. Say if she should wear it now.

**Slots** (19): head, hair, face, eyes, ears, neck, shoulders, torso, arms, back, hips, legs, feet, hands, held_left, held_right, over_arm, lap.

**Overlaps are identical to the head commit:** butler 0.817, coach 0.821, colleague 0.856, homie 0.864, squire 0.702. The pieces came apart without moving. The preview loads all six entries with no errors.

**Still baked in, named plainly:**
1. **The base body** wears trousers (hips, thighs and shins painted trouser), shoe blocks, and the butler's face as its default material. Every outfit relies on those painted legs, which is why `homie_trousers` is only his knee folds.
2. **Head size and lift per voice**, the one skeleton difference left, because the drawings draw the head at different sizes against the body. The coach's upper arms at 1.2 and 1.15 and the squire's torso lift remain too.
3. **Fitted to one voice's screen:** the squire's helmet opening and the colleague's glasses frames. Hats are placed by fixed numbers, not by a fit that reads the head they land on.
4. **Held props and gripping hands** are built in each voice's own pose, not against the hand slot. They fit only that pose.
5. **The butler's tray carries its laptop** as one piece, since the tray holds it. Say if a held piece should split from what it carries.

**Tests** (in `src/web/tests/toon.test.js`, not run):
- "a piece shows only on the slot it is declared for, and hides what fills the slots it covers"
- "every voice wears only pieces built as models"
- "every slot sits on bones the shared body has"

Not tested: a real hide, since no hair piece exists yet to be hidden.

**Next, without stopping:** the squire's reach.

Preview: http://127.0.0.1:8431/toon-preview/index.html
Overlays: http://127.0.0.1:8431/toon-preview/rest/overlays.png
