<!-- SAGA-STAGING · part 16 -->
(new THREE.SphereGeometry(0.08, 8, 6), MAT.skinTone);
  handL.position.y = -0.65; handL.scale.set(1, 0.6, 1.2); armL.add(handL);
  g.add(armL);

  var armR = new THREE.Group(); armR.position.set(0.30, 0.35, 0.25);
  armR.rotation.x = 2.6; armR.rotation.z = -0.5;
  var upperR = upperL.clone(); upperR.position.y = -0.17; armR.add(upperR);
  var foreR = foreL.clone(); foreR.position.y = -0.45; armR.add(foreR);
  var handR = handL.clone(); handR.position.y = -0.65; armR.add(handR);
  g.add(armR);

  // Head — tilted back, face to the sky
  var neck = M(new THREE.CylinderGeometry(0.09, 0.10, 0.12, 8), MAT.skinTone);
  neck.position.set(0, 0.38, 0.45); neck.rotation.x = -0.4; g.add(neck);
  var head = M(new THREE.SphereGeometry(0.16, 12, 10), MAT.skinTone);
  head.position.set(0, 0.42, 0.58); head.rotation.x = -0.6; head.scale.set(0.95, 1.05, 0.95);
  // Eyes attached to head — they move together
  var eyeL = M(new THREE.SphereGeometry(0.025, 8, 6), MAT.blackCloth);
  eyeL.position.set(-0.06, 0.05, 0.14); head.add(eyeL);
  var eyeR = eyeL.clone(); eyeR.position.x = 0.06; head.add(eyeR);
  g.add(head);

  // A cloak spread beneath them like a blanket
  var cloak = M(new THREE.CylinderGeometry(0.55, 0.70, 0.06, 12), MAT.brownCloth);
  cloak.position.set(0, 0.05, -0.10); g.add(cloak);

  // === MESO: The stars they're watching ===
  // Small glowing points floating above — not part of the body,
  // but part of the moment. The reason for the pose.
  var starPositions = [
    [-0.5, 2.2, 0.3], [0.3, 2.5, -0.2], [0.8, 2.0, 0.5],
    [-0.2, 2.8, -0.5], [0.5, 2.4, 0.8], [-0.8, 1.9, -0.3],
  ];
  for(var si=0; si<starPositions.length; si++){
    var sp = starPositions[si];
    var star = M(new THREE.SphereGeometry(0.025, 8, 6), MAT.whiteGlow);
    star.position.set(sp[0], sp[1], sp[2]);
    g.add(star);
  }

  g.userData.avatarId = 'stargazer';
  g.userData.avatarName = 'THE STARGAZER';
  g.userData.legL = legL; g.userData.legR = legR;
  g.userData.armL = armL; g.userData.armR = armR;
  return g;
}

var BUILDERS = {
  sentinel: buildSentinel,
  architect: buildArchitect,
  nomad: buildNomad,
  oracle: buildOracle,
  forgemaster: buildForgemaster,
  courier: buildCourier,
  mender: buildMender,
  spinner: buildSpinner,
  keeper: buildKeeper,
  stargazer: buildStargazer,
};

var currentAvatarId = null;

function switchAvatar(id) {
  if (!BUILDERS[id]) { console.warn('[Avatars] Unknown:', id); return null; }
  // Remove old
  if (window.playerBody && window.playerBody.parent) {
    window.playerBody.parent.remove(window.playerBody);
  }
  // Build new
  var avatar = BUILDERS[id]();
  // Place at current king position
  if (typeof kingPos !== 'undefined' && kingPos) {
    avatar.position.set(kingPos.x, kingPos.y, kingPos.z);
  }
  if (typeof scene !== 'undefined' && scene) {
    scene.add(avatar);
  }
  // Update global references (no collision registration — visual only)
  window.playerBody = avatar;
  // playerBody is also a var in saga.js scope — try to update via window
  currentAvatarId = id;
  if (typeof say === 'function') say(avatar.userData.avatarName + ' stands');
  if (window.logBuild) window.logBuild('Avatar: ' + avatar.userData.avatarName);
  return avatar;
}

function listAvatars() {
  return Object.keys(BUILDERS).map(function(id) {
    var tmp = null;
    return {id: id, name: id.toUpperCase()};
  });
}

window.EPISTLES_AVATARS = {
  builders: BUILDERS,
  switch: switchAvatar,
  list: listAvatars,
  current: function() { return currentAvatarId; },
  count: function() { return Object.keys(BUILDERS).length; },
};

console.log('[Avatars] 4 loaded: sentinel, architect, nomad, oracle. Use EPISTLES_AVATARS.switch(id)');

/* URL param auto-switch for Eyes testing: ?avatar=sentinel */
(function(){
  try {
    var m = /[?&]avatar=([a-z]+)/.exec(window.location.search || '');
    if (m && BUILDERS[m[1]]) {
      setTimeout(function(){
        switchAvatar(m[1]);
        // Position camera for avatar inspection
        setTimeout(function(){
          try {
            if (typeof kingPos !== 'undefined' && window.camera) {
              // Place camera 6 units back, 2.5 up, looking at avatar chest height
              window.camera.position.set(kingPos.x + 3.5, kingPos.y + 2.5, kingPos.z + 5.5);
              window.camera.lookAt(kingPos.x, kingPos.y + 1.3, kingPos.z);
              // Disable auto camera follow temporarily
              window._avatarInspectMode = true;
            }
          } catch(e){}
        }, 300);
      }, 500);
    }
  } catch(e){}
})();

})();


===== FILE: public/saga-staging/index.html =====
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Coders100</title>
<style>
  /* ===== FOUNDATION ===== */
  html, body {
    margin: 0; padding: 0; height: 100%;
    overflow: hidden; background: #0b0906;
    font-family: Georgia, serif;
  }
