<!-- SAGA2 · part 43 -->
,[0.6*ns,-1.3,6.05],[0.45*ns,-1.15,6.0]], iD);
    }
    // Nose tip — rounded definition
    for(var nt=0;nt<3;nt++){ var nty=-0.6-nt*0.2, ntp=[];
      for(var ntx=-0.5;ntx<=0.5;ntx+=0.1){
        ntp.push([ntx, nty - Math.pow(ntx/0.5,2)*0.25, 6.2-nt*0.05]);
      }
      L(ntp, nt==1?iG:iD);
    }
    // MOUTH — larger, more present
    L([[-1.8,-2.7,5.8],[-0.9,-2.55,6.0],[0,-2.5,6.05],[0.9,-2.55,6.0],[1.8,-2.7,5.8]], iG); // upper lip (wider)
    L([[-1.5,-3.1,5.7],[-0.7,-3.25,5.85],[0,-3.3,5.9],[0.7,-3.25,5.85],[1.5,-3.1,5.7]], iG); // lower lip (fuller)
    L([[-1.8,-2.7,5.8],[1.8,-2.7,5.8]], iD); // mouth line


    // STIPPLING — skin texture (dots where light hits, R5)
    function stipple(cx, cy, cz, r, n, mat){
      for(var sd=0;sd<n;sd++){
        var sa=(sd/n)*Math.PI*2 + 0.3, sr=r*(0.3+0.7*((sd*7)%5)/5);
        var sx=cx+Math.cos(sa)*sr, sy=cy+Math.sin(sa)*sr*0.7;
        // tiny dot as 3-point ribbon
        L([[sx-0.03,sy,cz],[sx,sy+0.03,cz],[sx+0.03,sy,cz]], mat);
      }
    }
    stipple(2.5, 0.5, 5.2, 1.2, 12, iC); // right cheek
    stipple(-2.5, 0.5, 5.2, 1.2, 12, iC); // left cheek
    stipple(0, 4.5, 5.5, 0.8, 8, iC); // forehead
    stipple(0, 1.5, 5.8, 0.5, 6, iC); // nose bridge

    // PHILTRUM — two lines nose to lip
    L([[-0.25,-1.5,6.1],[-0.25,-2.2,6.05]], iD);
    L([[0.25,-1.5,6.1],[0.25,-2.2,6.05]], iD);
    // LIPS — more defined (Cupid's bow, full lower)
    L([[-1.8,-2.7,5.8],[-0.9,-2.6,6.0],[-0.3,-2.45,6.1],[0,-2.5,6.12],[0.3,-2.45,6.1],[0.9,-2.6,6.0],[1.8,-2.7,5.8]], iG);
    // CHIN — mental crease + form
    L([[-0.8,-3.8,5.7],[0,-3.9,5.75],[0.8,-3.8,5.7]], iD); // crease under lip
    L([[-1.2,-4.5,5.5],[-0.5,-4.8,5.6],[0,-4.9,5.65],[0.5,-4.8,5.6],[1.2,-4.5,5.5]], iG); // chin curve
    ig.position.set(0, 14, 120);
    ig.rotation.y = Math.PI; // face toward camera
    for(var el=0;el<6;el++){var ely=5.5-el*0.4;L([[-3,ely,4.5],[-1,ely+0.2,4.8],[1,ely+0.2,4.8],[3,ely,4.5]],iD);}
    window.__builtHead = ig;
  })();

===== FILE: public/saga2/head-king.js =====
// test
  (function(){
    var ig = new THREE.Group();
    var iC = new THREE.LineBasicMaterial({color:0x66eeff, transparent:true, opacity:0.55});
    var iG = new THREE.LineBasicMaterial({color:0xffcc44, transparent:true, opacity:0.55});
    var iD = new THREE.LineBasicMaterial({color:0x226688, transparent:true, opacity:0.35});
    // Ribbon materials (match line colors, for meshes)
    var riC=new THREE.MeshBasicMaterial({color:0x00cccc,transparent:true,opacity:0.55,side:THREE.DoubleSide});
    var riG=new THREE.MeshBasicMaterial({color:0xffcc44,transparent:true,opacity:0.55,side:THREE.DoubleSide});
    var riD=new THREE.MeshBasicMaterial({color:0x008888,transparent:true,opacity:0.35,side:THREE.DoubleSide});
    function L(pts, mat){
      // King: lines → ribbons (width 0.05)
      var rm=riC; if(mat===iG) rm=riG; else if(mat===iD) rm=riD;
      ig.add(ribbon(pts, 0.05, rm));
    }
    // CRANIUM — 12 meridians (cut bloat, keep form)
    for(var i=0;i<12;i++){ var a=(i/12)*Math.PI*2, pts=[];
      for(var j=0;j<=16;j++){ var ph=(j/16)*Math.PI, r=5*Math.sin(ph);
        pts.push([Math.cos(a)*r, 5*Math.cos(ph)+2, Math.sin(a)*r*0.92]);
      }
      L(pts, i%3==0?iG:iC);
    }
    // CRANIUM — 10 latitude rings (skip front face, no grid over face)
    for(var k=0;k<10;k++){ var ly=7-k*1.4, lr=5*Math.sqrt(Math.max(0,1-Math.pow((ly-2)/5,2)));
      // Draw back 270 degrees only (skip front 90 where face is)
      var rp1=[], rp2=[];
      for(var n=0;n<=21;n++){ var an=(n/21)*Math.PI*1.5 + Math.PI*0.75; // back arc
        var px=Math.cos(an)*lr, pz=Math.sin(an)*lr*0.92;
        if(pz < 2.0 || Math.abs(px) > 3.5){ rp1.push([px, ly, pz]); } // skip face region
        else { if(rp1.length>1){ L(rp1, k%3==0?iG:(k%2?iC:iD)); rp1=[]; } }
      }
      if(rp1.length>1) L(rp1, k%3==0?iG:(k%2?iC:iD));
    }
    // BROW RIDGE — folds back onto cranium (continuous, no seam)
    for(var br=0;br<3;br++){ var bp=[];
      for(var bx=-5.5;bx<=5.5;bx+=0.25){
        var ax=Math.abs(bx);
        var by, bz;
        if(ax<=3.5){
          by=4.2+br*0.35 - Math.pow(bx/3.5,2)*0.8;
          bz=4.9 - ax*0.12 + br*0.05;
        } else {
          // fold back: curve around to meet cranium
          var t=(ax-3.5)/2.0; // 0 to 1
          by=4.2+br*0.35 - 0.8 - t*1.5; // drops as it goes back
          bz=4.9 - 3.5*0.12 - t*3.0; // recedes back
        }
        bp.push([bx, by, bz]);
      }
      L(bp, br==1?iG:iD);
    }
    // EYES — organic human (asymmetric, non-circular)
    var seed=7;
    function srand(){ seed=(seed*16807)%2147483647; return (seed-1)/2147483646; }
    var eyeL_x=-1.9+srand()*0.2-0.1, eyeR_x=1.9+srand()*0.2-0.1; // asymmetric positions
    var eyeL_y=2.0+srand()*0.15, eyeR_y=2.0+srand()*0.15;
    function intaglioEye(cx, cy, phase){
      // ALMOND outline (not oval) — wider at outer corner
      var ao=[];
      for(var aa=0;aa<=24;aa++){ var aan=(aa/24)*Math.PI*2;
        var