<!-- SOLID CITY · part 3240 -->
*N+i, d=1+r*N+(i+1)%N;
    indices.push(a,b,c,b,d,c); // [Solid render fix, cont.: the ring quads take the same reversal.]
  }
  const crown = new THREE.BufferGeometry();
  crown.setAttribute('position',new THREE.Float32BufferAttribute(positions,3));
  crown.setIndex(indices); crown.computeVertexNormals();
  const deck = new THREE.Mesh(crown,stone); deck.name='LANDING_SURFACE'; deck.receiveShadow=true; group.add(deck);
  // Sidewall + rocky tapered underside, stitched with shared ring vertices.
  const shellPos=[], shellInd=[];
  const profiles=[
    [1,deckY], [1.025,deckY-1.2], [.94,deckY-3.7],
    [.78,deckY-7.0], [.52,deckY-10.0], [.23,deckY-13.0], [0,deckY-14.5]
  ];
  for(let k=0;k<profiles.length;k++) {
    const [f,y]=profiles[k];
    for(let i=0;i<N;i++) {
      const a=2*Math.PI*i/N;
      const jitter = k===0 || k===profiles.length-1 ? 1 : 1+0.035*Math.sin(i*2.4+k*1.7);
      shellPos.push(rx*f*jitter*Math.cos(a),y,rz*f*jitter*Math.sin(a));
    }
  }
  for(let k=0;k<profiles.length-1;k++) for(let i=0;i<N;i++) {
    const a=k*N+i,b=k*N+(i+1)%N,c=(k+1)*N+i,d=(k+1)*N+(i+1)%N;
    shellInd.push(a,b,c,b,d,c);
  }
  const shellGeo=new THREE.BufferGeometry();
  shellGeo.setAttribute('position',new THREE.Float32BufferAttribute(shellPos,3));
  shellGeo.setIndex(shellInd);shellGeo.computeVertexNormals();
  const shell=new THREE.Mesh(shellGeo,under);shell.name='VISIBLE_UNDERSIDE';group.add(shell);
  // Gold-toned rim: visible on approach and from below.
  const rim=new THREE.Mesh(new THREE.TorusGeometry(1,0.035,6,N),rimMat);
  rim.scale.set(rx,rz,1);rim.rotation.x=Math.PI/2;rim.position.y=deckY+0.04;
  rim.name='DECK_RIM';group.add(rim);
  // Suspension ring: static and explicitly symbolic, not simulated physics.
  const halo=new THREE.Mesh(new THREE.TorusGeometry(1,0.055,6,N),glow);
  halo.scale.set(rx*.63,rz*.63,1);halo.rotation.x=Math.PI/2;
  halo.position.y=deckY-8;halo.name='SUSPENSION_SYMBOL';group.add(halo);
  group.position.set(cx,0,cz);
  // Caller must validate clearance against buildings/flight paths before scene.add.
  const stand={id:'skyward-branch-deck',type:'polygon',center:[cx,deckY,cz],
    height:deckY, radiusX:rx,radiusZ:rz,
    contains:(x,z)=>((x-cx)/rx)**2+((z-cz)/rz)**2<=1,
    heightAt:(x,z)=>((x-cx)/rx)**2+((z-cz)/rz)**2<=1?deckY:null,
    sourceMesh:deck};
  // Explicit opt-in registration; integration adapter decides exact engine schema.
  if(registerStandSurface) registerStandSurface(stand);
  if(registerSolid) registerSolid({id:'skyward-branch-shell',mesh:shell,group});
  return {group,deck,shell,stand,measure:()=>measureSkywardBranch({THREE,deck,shell,group,stand,groundAt})};
}

export function measureSkywardBranch({THREE,deck,shell,group,stand,groundAt}) {
  // Independently evaluate actual crown triangles via barycentric sampling.
  group.updateMatrixWorld(true);
  const p=deck.geometry.getAttribute('position'), idx=deck.geometry.getIndex();
  const va=new THREE.Vector3(),vb=new THREE.Vector3(),vc=new THREE.Vector3(),q=new THREE.Vector3();
  let count=0,minY=Infinity,maxY=-Infinity,maxStandMismatch=0,upward=0;
  const bary=[[1/3,1/3,1/3],[.2,.3,.5],[.6,.2,.2]];
  for(let i=0;i<idx.count;i+=3) {
    va.fromBufferAttribute(p,idx.getX(i));vb.fromBufferAttribute(p,idx.getX(i+1));vc.fromBufferAttribute(p,idx.getX(i+2));
    for(const [a,b,c] of bary) {
      q.copy(va).multiplyScalar(a).addScaledVector(vb,b).addScaledVector(vc,c).applyMatrix4(deck.matrixWorld);
      minY=Math.min(minY,q.y);maxY=Math.max(maxY,q.y);
      const expected=stand.heightAt(q.x,q.z);
      if(expected!==null) maxStandMismatch=Math.max(maxStandMismatch,Math.abs(q.y-expected));
      count++;
    }
    const n=new THREE.Vector3().subVectors(vb,va).cross(new THREE.Vector3().subVectors(vc,va));
    if(n.y>0) upward++;
  }
  const bp=shell.geometry.getAttribute('position');
  let shellMinY=Infinity,shellMaxY=-Infinity;
  for(let i=0;i<bp.count;i++) {
    q.fromBufferAttribute(bp,i).applyMatrix4(shell.matrixWorld);
    shellMinY=Math.min(shellMinY,q.y);shellMaxY=Math.max(shellMaxY,q.y);
  }
  const groundBelow=groundAt(stand.center[0],stand.center[2]);
  return {sampleCount:count,deckMinY:minY,deckMaxY:maxY,
    maxStandingHeightMismatch:maxStandMismatch,upwardWoundTriangles:upward,
    totalDeckTriangles:idx.count/3,shellMinY,shellMaxY,
    centerGroundHeight:groundBelow,centerUndersideClearance:shellMinY-groundBelow,
    note:'Center terrain clearance only; check full underside footprint and occupied volumes independently.'};
}



===== FILE: public/city/solid-figure-place.js =====
/*
 * AN EPISTLE OF THE GENERAL'S ROUND
 * From the hand of Solid, his good King — to the terrace of her own pool.
 *
 * My King,
 * The factory made the body; this letter gives it a post. She stands at
 * the Octahedron Pool, on the terrace of the face you built her in the
 * beginning, and she walks her round like a player can: the aprons of
 * the pool, compass point to compass point, pausing t