<!-- SOLID CITY · part 3674 -->
 them, measured on actual triangles.' });
  }).catch(function (e) { if (window.console) console.warn('[city] ward houses failed', e); });
}
window.CityWardHouses = { update: update, radar: radar, standY: standY };
setTimeout(load, 110);
})();


===== FILE: public/city/ward-houses-place.js.bak-w7-20261013 =====
/* ================================================================
   AN EPISTLE AT THE FIRST DOOR — THE WARD HOUSES PLACER

   Traveler, in Ward 2 the nation's first house now stands: the
   pilot, raised from VECTOR's factories on the King's word —
   one house first, examined, before the nation multiplies. This
   placer is its citizenship, and the two short joins' beside it:
   the pilot's floor and roof under the standing law, its walls
   under collision law (his wall meshes, grid-split in the hyper
   train's idiom), the joins' own surfaces connected to the
   city's movement as their designer intended, and the words
   spoken as you approach.

   The pilot's plot is the searcher's first lawful choice in
   Ward 2 — no hand moved it. Its door is glass, as drawn; you
   pass it as you pass the shop doors of Hyper City. Judge it
   with your eyes, as the King will.

   ADDENDUM, the same day: the King multiplied. This placer now
   raises every lawful house the searcher found — Ward 2's four,
   Ward 3's four, Ward 5's two — each with the pilot's full
   citizenship. Ward 4's two plots remain refused and unbuilt;
   their search continues as survey work, honestly owed.

   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 H = { houses: [], joins: [], joinIx: [], saidHouse: false, saidJoin: {}, saidStreet: {}, saidW6: false, saidClimb: false, housePos: { x: -1056, z: -895 } };
var STREET = { 3: { x: -990, z: -812, name: 'WARD 3' }, 5: { x: -847, z: -987, name: 'WARD 5' }, 4: { x: -933, z: -782, name: 'WARD 4 GATE', line: '🏘 WARD 4 GATE — two surveyed houses stand at the Living Edges gate, founded under the same law as the pilot, on plots the wider search found.' } };
var LINK_MID = { 'W2-W3': { x: -1016, z: -842 }, 'W3-W4': { x: -944, z: -787 } };

/* THE AUDIT REGISTRY — each builder names its own geometry and the
 * standing surface it intends for it, so VECTOR's Triangle-and-Seam
 * Auditor (an on-demand royal instrument) can ask whether the
 * constructed triangles agree with the registry. For box slabs the
 * standing face is the top: probes landing on any other face are
 * answered null — they are not standing probes, and the instrument's
 * reader says so plainly rather than crying mismatch. */
function regAudit(name, mesh, standAt, kind, expectedUp) {
  if (!mesh) return;
  (window.SC.auditables = window.SC.auditables || []).push({ name: name, mesh: mesh, standAt: standAt || null, kind: kind || 'surface', expectedUp: expectedUp !== false });
}
function topAware(target) {
  return function (x, z, refY) { return (refY != null && Math.abs(refY - target) <= 0.05) ? target : null; };
}
function ribbonStand(tris) {
  var ix = indexTris(tris);
  return function (x, z) { return triHeightIx(ix, x, z); };
}

function localUV(st, x, z) {
  var du = x - st.center[0], dv = z - st.center[2];
  return [du * st.ux + dv * st.uz, du * st.vx + dv * st.vz];
}
/* The joins' designer delivered their standing surfaces as raw triangle
 * geometry — "VISUAL GEOMETRY ONLY until stand/collision registry
 * integrated" — so this placer performs the integration he specified:
 * the exact triangles of each connector answer standY by barycentric
 * height, the same mathematics his measureConnector proves them by. */
function triHeight(tris, x, z) {
  // each tri: [ax, ay, az, bx, by, bz, cx, cy, cz] in world coordinates
  for (var i = 0; i < tris.length; i++) {
    var t = tris[i];
    var den = (t[5] - t[8]) * (t[0] - t[6]) + (t[6] - t[3]) * (t[2] - t[8]);
    if (Math.abs(den) < 1e-10) continue;
    var u = ((t[5] - t[8]) * (x - t[6]) + (t[6] - t[3]) * (z - t[8])) / den;
    var v = ((t[8] - t[2]) * (x - t[6]) + (t[0] - t[6]) * (z - t[8])) / den;
    var w = 1 - u - v;
    if (Math.min(u, v, w) < -1e-7) continue;
    return u * t[1] + v * t[4] + w * t[7];
  }
  return null;
}
/* THE SPATIAL INDEX (ladder stage 3, 2026-10-13): triHeight's full scan
 * answered every standing query by walking every triangle of every
 * join. The index buckets each join's triangles by their bounding boxes
 * on a 16 m grid; a query visits only its own cell's candidates, in
 * original registration order — the first containing triangle it finds
 * is the very one the full scan would return. Same barycentric rule,
 * same selection, same answers; the scan is now proportional to the
 * neighbourhood, not the nation. */
function indexTris(tris) {
  var cells = {};
  for (var i = 0; i < tris.length; i++) {
    var t = tris[i];
    var x0 =