<!-- LIVE · part 6 -->
);
  btx.fillStyle = '#808080'; btx.fillRect(0, 0, size, size);

  var cx = size/2, cy = size/2;
  // Spiral streaks — curved radial lines suggesting rotation
  for(var i=0; i<48; i++){
    var a0 = (i/48)*Math.PI*2;
    var curve = 0.3 + rand()*0.4;  // How much the line curves (spin!)
    ctx.strokeStyle = i%2===0 ? '#a03040' : '#701020';
    ctx.lineWidth = size*0.006;
    ctx.beginPath();
    for(var r=0; r<=size*0.5; r+=size*0.02){
      var a = a0 + (r/(size*0.5))*curve;
      var x = cx + Math.cos(a)*r;
      var y = cy + Math.sin(a)*r;
      if(r===0) ctx.moveTo(x, y); else ctx.lineTo(x, y);
    }
    ctx.stroke();
    btx.strokeStyle = '#909090'; btx.lineWidth = size*0.006;
    btx.beginPath();
    for(var r2=0; r2<=size*0.5; r2+=size*0.02){
      var a2 = a0 + (r2/(size*0.5))*curve;
      var x2 = cx + Math.cos(a2)*r2;
      var y2 = cy + Math.sin(a2)*r2;
      if(r2===0) btx.moveTo(x2, y2); else btx.lineTo(x2, y2);
    }
    btx.stroke();
  }
  // Gold flecks — catching light as it spins
  for(var f=0; f<60; f++){
    var fa = rand()*Math.PI*2, fr = rand()*size*0.45;
    var fx = cx + Math.cos(fa)*fr, fy = cy + Math.sin(fa)*fr;
    ctx.fillStyle = '#c8a020';
    ctx.beginPath(); ctx.arc(fx, fy, size*0.003, 0, Math.PI*2); ctx.fill();
  }

  var ct = new THREE.CanvasTexture(cv); ct.anisotropy = 8;
  var bt = new THREE.CanvasTexture(bv);
  return {map: ct, bumpMap: bt};
}

function initMaterials() {
  if (MAT.done) return;
  // Metals
  MAT.darkMetal = new THREE.MeshStandardMaterial({color: 0x3a3a48, roughness: 0.45, metalness: 0.8});
  MAT.gunmetal = new THREE.MeshStandardMaterial({color: 0x3a3a45, roughness: 0.5, metalness: 0.7});
  MAT.chrome = new THREE.MeshStandardMaterial({color: 0xc0c0c8, roughness: 0.2, metalness: 0.95});
  MAT.gold = new THREE.MeshStandardMaterial({color: 0xd8a920, roughness: 0.3, metalness: 0.8});
  MAT.copper = new THREE.MeshStandardMaterial({color: 0xb87333, roughness: 0.4, metalness: 0.8});
  // Fabrics
  MAT.blackCloth = new THREE.MeshStandardMaterial({color: 0x1a1a1e, roughness: 0.9, metalness: 0.1});
  MAT.grayCloth = new THREE.MeshStandardMaterial({color: 0x4a4a52, roughness: 0.85, metalness: 0.1});
  MAT.brownCloth = new THREE.MeshStandardMaterial({color: 0x5a4030, roughness: 0.9, metalness: 0.05});
  MAT.tanCloth = new THREE.MeshStandardMaterial({color: 0x8a7050, roughness: 0.9, metalness: 0.05});
  MAT.crimsonCloth = new THREE.MeshStandardMaterial({color: 0x8a1a2a, roughness: 0.85, metalness: 0.1});
  MAT.goldCloth = new THREE.MeshStandardMaterial({color: 0xc8a020, roughness: 0.8, metalness: 0.2});
  // Glow
  MAT.redGlow = new THREE.MeshStandardMaterial({color: 0xcc0000, emissive: 0xff2222, emissiveIntensity: 1.5, roughness: 0.3});
  MAT.cyanGlow = new THREE.MeshStandardMaterial({color: 0x00ccff, emissive: 0x00aacc, emissiveIntensity: 1.5, roughness: 0.3});
  MAT.goldGlow = new THREE.MeshStandardMaterial({color: 0xffcc00, emissive: 0xffaa00, emissiveIntensity: 1.2, roughness: 0.3});
  MAT.whiteGlow = new THREE.MeshStandardMaterial({color: 0xffffff, emissive: 0xccccff, emissiveIntensity: 0.8, roughness: 0.4});
  // Organic
  MAT.skinTone = new THREE.MeshStandardMaterial({color: 0xc89878, roughness: 0.7, metalness: 0.0});
  MAT.leafGreen = new THREE.MeshStandardMaterial({color: 0x2a6a3a, roughness: 0.8, metalness: 0.1});
  // Special
  MAT.ghost = new THREE.MeshStandardMaterial({color: 0x8888aa, transparent: true, opacity: 0.4, roughness: 0.5});
  MAT.done = true;
}

function M(geo, mat) {
  var m = new THREE.Mesh(geo, mat);
  m.castShadow = true;
  return m;
}

/* ============================================================
   1. THE SENTINEL — Tall armored guardian
   Broad shoulders, narrow waist, substantial boots, red illumination
   Height: ~2.6 units
   ============================================================ */
function buildSentinel() {
  initMaterials();
  var g = new THREE.Group();

  // Boots — substantial, wide
  var bootL = M(new THREE.BoxGeometry(0.35, 0.5, 0.5), MAT.gunmetal);
  bootL.position.set(-0.25, 0.25, 0); g.add(bootL);
  var bootR = bootL.clone(); bootR.position.x = 0.25; g.add(bootR);
  // Boot trim — red glow strip
  var trimL = M(new THREE.BoxGeometry(0.37, 0.08, 0.52), MAT.redGlow);
  trimL.position.set(-0.25, 0.42, 0); g.add(trimL);
  var trimR = trimL.clone(); trimR.position.x = 0.25; g.add(trimR);

  // Legs — armored greaves
  var legL = new THREE.Group(); legL.position.set(-0.25, 0.5, 0);
  var shinL = M(new THREE.CylinderGeometry(0.14, 0.17, 0.7, 8), MAT.darkMetal);
  shinL.position.y = 0.35; legL.add(shinL);
  g.add(legL);
  var legR = new THREE.Group(); legR.position.set(0.25, 0.5, 0);
  var shinR = shinL.clone(); shinR.position.y = 0.35; legR.add(shinR);
  g.add(legR);

  // Narrow waist
  var waist = M(new THREE.CylinderGeometry(0.28, 0.32, 0.3, 10), MAT.blackCloth);
  waist.position.y = 1.3; g.add(waist);
  // Belt with red buckle
  var belt = M(new THREE.TorusGeometry(0.3, 0.05, 8, 16), MAT.gu