<!-- SAGA-STAGING · part 13 -->
; g.add(neck);
  var head = M(new THREE.SphereGeometry(0.17, 12, 10), MAT.skinTone);
  head.position.set(0, 2.62, 0.02); head.scale.set(0.95, 1.05, 0.95); g.add(head);
  // Simple circlet (not a crown — a healer's band)
  var circlet = M(new THREE.TorusGeometry(0.17, 0.025, 8, 16), MAT.copper);
  circlet.rotation.x = Math.PI/2 - 0.15; circlet.position.set(0, 2.68, 0.02); g.add(circlet);

  // === MESO: Healer's working gear ===

  // Medicine belt — soft cloth with hanging pouches
  var belt = M(new THREE.TorusGeometry(0.30, 0.045, 8, 16), MAT.brownCloth);
  belt.rotation.x = Math.PI/2; belt.position.y = 1.45; g.add(belt);
  // Herb pouches (3, asymmetric — a healer's kit is personal)
  var pouch1 = M(new THREE.SphereGeometry(0.09, 8, 6), MAT.leafGreen);
  pouch1.position.set(-0.28, 1.35, 0.18); pouch1.scale.set(1, 1.2, 0.7); g.add(pouch1);
  var pouch2 = M(new THREE.SphereGeometry(0.07, 8, 6), MAT.brownCloth);
  pouch2.position.set(0.25, 1.32, 0.20); pouch2.scale.set(1, 1.1, 0.7); g.add(pouch2);
  var pouch3 = M(new THREE.SphereGeometry(0.06, 8, 6), MAT.tanCloth);
  pouch3.position.set(0.05, 1.30, -0.28); pouch3.scale.set(1, 1.3, 0.7); g.add(pouch3);

  // Cloth arm wraps (not bracers — soft bandages, the mender's own)
  // Added AFTER armL/armR are defined, at the forearm positions
  

  // Satchel — hangs at hip, the mender's kit
  var satchel = M(new THREE.BoxGeometry(0.28, 0.32, 0.14), MAT.brownCloth);
  satchel.position.set(0.32, 1.15, -0.10); satchel.rotation.y = 0.2; g.add(satchel);
  var satchelStrap = M(new THREE.BoxGeometry(0.05, 0.70, 0.02), MAT.brownCloth);
  satchelStrap.position.set(-0.10, 1.80, -0.28); satchelStrap.rotation.z = 0.45; g.add(satchelStrap);

  g.userData.avatarId = 'mender';
  g.userData.avatarName = 'THE MENDER';
  g.userData.legL = legL; g.userData.legR = legR;
  g.userData.armL = armL; g.userData.armR = armR;
  return g;
}


/* ============================================================
   8. THE SPINNER — Dancer caught mid-twirl (MACRO)
   Light, centrifugal presence. Fabric flies outward.
   Height: ~1.8 units (compact, coiled energy)
   Who you become: Someone who remembers how to feel light
   ============================================================ */
function buildSpinner() {
  initMaterials();
  var g = new THREE.Group();

  // === MACRO: Coiled, centrifugal masses ===

  // Feet — one planted, one lifted (mid-spin)
  var footL = M(new THREE.BoxGeometry(0.20, 0.10, 0.32), MAT.skinTone);
  footL.position.set(-0.15, 0.05, 0.05); footL.rotation.y = 0.3; g.add(footL);
  var ankletL = M(new THREE.TorusGeometry(0.09, 0.02, 6, 12), MAT.goldCloth);
  ankletL.position.set(-0.15, 0.18, 0.02); ankletL.rotation.x = Math.PI/2; g.add(ankletL);
  // footR is part of legR group (no separate mesh)

  // Legs — dynamic, one supporting, one extended
  var legL = new THREE.Group(); legL.position.set(-0.15, 0.10, 0);
  var shinL = M(new THREE.CylinderGeometry(0.09, 0.11, 0.65, 8), MAT.skinTone);
  shinL.position.y = 0.32; legL.add(shinL);
  var thighL = M(new THREE.CylinderGeometry(0.11, 0.10, 0.55, 8), MAT.skinTone);
  thighL.position.y = 0.85; legL.add(thighL);
  g.add(legL);
  var legR = new THREE.Group(); legR.position.set(0.20, 0.35, -0.05);
  legR.rotation.z = -0.6; legR.rotation.x = 0.3;  // Lifted and extended
  var shinR = M(new THREE.CylinderGeometry(0.09, 0.11, 0.65, 8), MAT.skinTone);
  shinR.position.y = 0.32; legR.add(shinR);
  var thighR = M(new THREE.CylinderGeometry(0.11, 0.10, 0.55, 8), MAT.skinTone);
  thighR.position.y = 0.85; legR.add(thighR);
  var footRin = M(new THREE.BoxGeometry(0.18, 0.09, 0.30), MAT.skinTone);
  footRin.position.set(0, 0.05, 0.08); legR.add(footRin);
  g.add(legR);

  // Hips — wrapped in flowing fabric
  var pelvis = M(new THREE.CylinderGeometry(0.24, 0.30, 0.30, 10), MAT.crimsonCloth);
  pelvis.position.set(0, 1.25, 0); g.add(pelvis);

  // Torso — fitted, showing the coil of the spin
  var torso = M(new THREE.CylinderGeometry(0.22, 0.26, 0.70, 10), MAT.skinTone);
  torso.position.set(0, 1.75, 0); torso.rotation.y = 0.4; torso.rotation.z = 0.12; g.add(torso);

  // Flowing skirt with radial motion texture (Spinner MICRO)
  var spinTex = generateRadialMotion({size: 1024, seed: 99});
  var skirtMat = new THREE.MeshStandardMaterial({
    map: spinTex.map, bumpMap: spinTex.bumpMap, bumpScale: 0.008,
    roughness: 0.8, metalness: 0.1, side: THREE.DoubleSide
  });
  var skirt = new THREE.Mesh(new THREE.ConeGeometry(0.55, 0.50, 12, 1, true), skirtMat);
  skirt.position.set(0, 1.10, 0); g.add(skirt);
  // Waist sash — tied, ends flying
  var sashWaist = M(new THREE.TorusGeometry(0.27, 0.04, 8, 16), MAT.goldCloth);
  sashWaist.rotation.x = Math.PI/2; sashWaist.position.y = 1.32; g.add(sashWaist);
  var sashEnd1 = M(new THREE.BoxGeometry(0.10, 0.45, 0.01), MAT.goldCloth);
  sashEnd1.position.set(0.35, 1.15, -0.15); sashEnd1.rotation.z = -0.9; sashEnd1.rotation.y = 0.4; g.add(sashEnd1);
  var sashEnd2 = M(new THRE