<!-- SOLID CITY · part 3684 -->
 }
  const geometry=new T.BufferGeometry();
  geometry.setAttribute('position',new T.Float32BufferAttribute(verts,3));
  geometry.setIndex(indices);geometry.computeVertexNormals();
  const mesh=new T.Mesh(geometry,new T.MeshLambertMaterial({color,side:T.DoubleSide}));
  mesh.name='Measured connector ribbon';mesh.receiveShadow=true;
  return mesh;
}
export function measureConnector(mesh,groundAt,{lift=0.075}={}){
  mesh.updateMatrixWorld(true);
  const pos=mesh.geometry.getAttribute('position'),idx=mesh.geometry.getIndex();
  let count=0,sum=0,max=0,minSigned=Infinity,maxSigned=-Infinity,up=0,down=0;
  // No Three.js dependency needed for triangle measurements: mesh has a matrixWorld.
  const transform=(i)=>{
    const x=pos.getX(i),y=pos.getY(i),z=pos.getZ(i),e=mesh.matrixWorld.elements;
    return [e[0]*x+e[4]*y+e[8]*z+e[12],e[1]*x+e[5]*y+e[9]*z+e[13],e[2]*x+e[6]*y+e[10]*z+e[14]];
  };
  for(let t=0;t<idx.count;t+=3){
    const a=transform(idx.getX(t)),b=transform(idx.getX(t+1)),c=transform(idx.getX(t+2));
    const ny=(b[2]-a[2])*(c[0]-a[0])-(b[0]-a[0])*(c[2]-a[2]);
    if(ny>0)up++;else if(ny<0)down++;
    for(const [u,v,w] of [[1/3,1/3,1/3],[0.2,0.3,0.5],[0.5,0.2,0.3],[0.3,0.5,0.2]]){
      const x=u*a[0]+v*b[0]+w*c[0],z=u*a[2]+v*b[2]+w*c[2],y=u*a[1]+v*b[1]+w*c[1];
      const signed=y-groundAt(x,z),error=Math.abs(signed-lift);
      sum+=error;max=Math.max(max,error);count++;
      minSigned=Math.min(minSigned,signed);maxSigned=Math.max(maxSigned,signed);
    }
  }
  return {samples:count,meanAbsErrorFromLift:count?sum/count:null,maxAbsErrorFromLift:max,
    minSignedClearance:minSigned,maxSignedClearance:max,upFacingTriangles:up,downFacingTriangles:down};
}
export function createWardConnector({THREE,groundAt,isAllowed,name,line,width=3.2,step=1.5,
  lift=0.075,maxGrade=0.12,minY=0.5,maxY=11.5,allowEndpoint}={}){
  if(!THREE||typeof groundAt!=='function'||typeof isAllowed!=='function')throw Error('THREE, groundAt, isAllowed required');
  if(!Array.isArray(line)||line.length<2)throw Error('surveyed polyline required');
  const check=checkRoute(line,groundAt,isAllowed,{width,step:Math.min(step,1),maxGrade,minY,maxY,allowEndpoint});
  const group=new THREE.Group();group.name=name||'Proposed connector';
  if(!check.ok)return {group,accepted:false,check,mesh:null};
  const mesh=buildMesh(THREE,line,groundAt,{width,step,lift,color:0x9a9a91});group.add(mesh);
  const measure=()=>measureConnector(mesh,groundAt,{lift});
  return {group,accepted:true,check,mesh,measure,
    standSurface:{kind:'triangle-mesh',geometry:mesh.geometry,worldMatrix:mesh.matrixWorld,
      requiresEngineRegistration:true},
    status:'VISUAL GEOMETRY ONLY until stand/collision registry integrated'};
}
export function createShortWardJoins(args){
  return Object.fromEntries(Object.entries(PROPOSED_LINKS).map(([name,line])=>
    [name,createWardConnector({...args,name,line})]));
}
export const UNSURVEYED=Object.freeze({
  'W4-W5':'Need legal surveyed switchback points; direct line crosses high shoulder',
  'W6-SouthLot':'Need actual east gate coordinates and approved apron crossing',
  'W6-LongRoad':'Need actual Long Road tie-in point and corridor exemption',
  'W7-LongRoad':'Need surveyed corridor to disc (-672,-498), outside W7 envelope',
  'W2-FirstCity':'Need podium east-face gate coordinate, deck 10.38 and approach grades'
});


===== FILE: public/city/wards-place.js =====
/* ================================================================
   AN EPISTLE AT THE ROADSIDE — THE WARDS PLACER

   Traveler, east and south of the First City the nation now
   stands in six wards, raised by VECTOR's factories under Solid's
   verified mask (see wards.js, the letter that travels with it).
   This placer is their citizenship: it raises them in the world,
   gives their signs and trees their standing law, marks them on
   the traveler's glass, and speaks their names as you approach.

   Written by the hand of Solid, his good King — 2026-10-13.
   ================================================================ */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var NAMES = { 2: 'FIRST FOOTSTEPS', 3: 'THE SPINE', 4: 'LIVING EDGES', 5: 'QUIET PRECISION', 6: 'SOUTH CONNECTION', 7: 'SOUTHERN LANDSCAPE' };
var LINES = {
  2: '🪧 WARD 2 — FIRST FOOTSTEPS. The nation\'s first stones beyond the Ward. Step where the stepping stones step.',
  3: '🪧 WARD 3 — THE SPINE. One unbroken path, sampled from the land itself. Walk its line.',
  4: '🪧 WARD 4 — LIVING EDGES. Trees and benches now; the brown earth kept honest between them.',
  5: '🪧 WARD 5 — QUIET PRECISION. The fine-cut ward on the northern shelf. The land chose this line.',
  6: '🪧 WARD 6 — SOUTH CONNECTION. From the podium\'s shoulder down to the Long Road\'s verge.',
  7: '🪧 WARD 7 — SOUTHERN LANDSCAPE. The south band opens. The nation breathes here.'
};
var W = { root: null, signs: [] };

function radar(rg, blip, flying