<!-- SAGA-STAGING · part 9 -->
low — faint
  var rim = M(new THREE.TorusGeometry(0.2, 0.02, 6, 14, Math.PI), MAT.goldGlow);
  rim.position.set(0, 1.88, 0.1); rim.rotation.x = -0.3; g.add(rim);
  // Shoulder cape drape
  var cape = M(new THREE.PlaneGeometry(0.7, 0.8), MAT.tanCloth);
  cape.position.set(0, 1.4, -0.28); cape.rotation.x = 0.15;
  cape.material.side = THREE.DoubleSide; g.add(cape);

  g.userData.avatarId = 'nomad';
  g.userData.avatarName = 'THE NOMAD';
  g.userData.legL = legL; g.userData.legR = legR;
  g.userData.armL = armL; g.userData.armR = armR;
  return g;
}

/* ============================================================
   4. THE ORACLE — Slender mysterious figure
   Floating elements, luminous markings
   Height: ~2.1 units
   ============================================================ */
function buildOracle() {
  initMaterials();
  var g = new THREE.Group();

  // No visible boots — robed to ground, floats slightly
  // Robe — long, flowing, dark with luminous seams
  var robe = M(new THREE.CylinderGeometry(0.25, 0.45, 1.6, 12, 1, true), MAT.blackCloth);
  robe.position.y = 0.85; robe.material.side = THREE.DoubleSide; g.add(robe);
  // Luminous vertical seams
  for (var si = 0; si < 3; si++) {
    var ang = (si / 3) * Math.PI * 2;
    var seam = M(new THREE.BoxGeometry(0.015, 1.55, 0.015), MAT.whiteGlow);
    seam.position.set(Math.cos(ang)*0.34, 0.85, Math.sin(ang)*0.34);
    g.add(seam);
  }
  // Robe hem glow ring
  var hemGlow = M(new THREE.TorusGeometry(0.44, 0.02, 8, 24), MAT.cyanGlow);
  hemGlow.rotation.x = Math.PI/2; hemGlow.position.y = 0.06; g.add(hemGlow);

  // Slender torso
  var torso = M(new THREE.CylinderGeometry(0.2, 0.25, 0.5, 10), MAT.blackCloth);
  torso.position.y = 1.75; g.add(torso);
  // Luminous chest marking — eye shape
  var eyeMark = M(new THREE.SphereGeometry(0.06, 8, 8), MAT.whiteGlow);
  eyeMark.position.set(0, 1.8, 0.22); eyeMark.scale.set(1.4, 0.8, 0.5); g.add(eyeMark);

  // Thin arms — barely visible in sleeves
  var armL = new THREE.Group(); armL.position.set(-0.28, 1.9, 0);
  var sleeveL = M(new THREE.CylinderGeometry(0.07, 0.12, 0.65, 8), MAT.blackCloth);
  sleeveL.position.y = -0.32; armL.add(sleeveL);
  g.add(armL);
  var armR = new THREE.Group(); armR.position.set(0.28, 1.9, 0);
  var sleeveR = sleeveL.clone(); sleeveR.position.y = -0.32; armR.add(sleeveR);
  g.add(armR);
  // Hands — pale, elongated
  var handL = M(new THREE.SphereGeometry(0.06, 8, 8), MAT.skinTone);
  handL.position.y = -0.68; handL.scale.y = 1.5; armL.add(handL);
  var handR = handL.clone(); handR.position.y = -0.68; armR.add(handR);

  // Head — hooded shadow with glowing eyes
  var hoodTop = M(new THREE.ConeGeometry(0.24, 0.45, 10), MAT.blackCloth);
  hoodTop.position.y = 2.25; g.add(hoodTop);
  var faceVoid = M(new THREE.SphereGeometry(0.14, 10, 8), new THREE.MeshBasicMaterial({color: 0x000000}));
  faceVoid.position.set(0, 2.1, 0.06); g.add(faceVoid);
  // Two glowing eyes in the void
  var eyeL = M(new THREE.SphereGeometry(0.025, 8, 8), MAT.cyanGlow);
  eyeL.position.set(-0.06, 2.12, 0.16); g.add(eyeL);
  var eyeR = eyeL.clone(); eyeR.position.x = 0.06; g.add(eyeR);

  // FLOATING ELEMENTS — orbit slowly (animated via userData)
  var floaters = new THREE.Group();
  for (var fi = 0; fi < 5; fi++) {
    var fa = (fi / 5) * Math.PI * 2;
    var shard = M(new THREE.OctahedronGeometry(0.06), fi % 2 ? MAT.cyanGlow : MAT.whiteGlow);
    shard.position.set(Math.cos(fa)*0.55, 2.1 + Math.sin(fa*2)*0.15, Math.sin(fa)*0.55);
    shard.userData.orbitAngle = fa;
    shard.userData.orbitSpeed = 0.3 + fi * 0.05;
    shard.userData.orbitRadius = 0.55;
    shard.userData.baseY = 2.1;
    floaters.add(shard);
  }
  g.add(floaters);
  g.userData.floaters = floaters;

  // Shoulder wisps — small floating cloth pieces
  var wispL = M(new THREE.ConeGeometry(0.08, 0.3, 6), MAT.ghost);
  wispL.position.set(-0.35, 1.95, -0.1); wispL.rotation.z = 0.4; g.add(wispL);
  var wispR = wispL.clone(); wispR.position.x = 0.35; wispR.rotation.z = -0.4; g.add(wispR);

  // Legs hidden — stub groups for animation compatibility (no visible geometry)
  var legL = new THREE.Group(); legL.position.set(-0.12, 0.3, 0); g.add(legL);
  var legR = new THREE.Group(); legR.position.set(0.12, 0.3, 0); g.add(legR);

  g.userData.avatarId = 'oracle';
  g.userData.avatarName = 'THE ORACLE';
  g.userData.legL = legL; g.userData.legR = legR;
  g.userData.armL = armL; g.userData.armR = armR;
  return g;
}

/* ============================================================
   AVATAR REGISTRY + SWITCHER
   ============================================================ */

/* ============================================================
   5. THE FORGEMASTER — Heavy industrial builder (MACRO STAGE)
   Powerful silhouette, believable proportions, strong stance
   Height: ~2.3 units
   ============================================================ */
function buildForgemaster() {
  initMaterials();
  var g = new THREE.Group();

  /