<!-- SOLID CITY · part 2726 -->
ngle is therefore
    // asked whose sheet it serves before it is struck: if at the
    // sample it stands within 0.75 m of SOME road's own profile,
    // and the sample lies within that road's corridor — its
    // half-width and a pace more — it is a working surface of its
    // own road, and the law strikes NOTHING at that sample. The
    // threshold itself does not move: 1.6 is this survey's
    // measure of a void, a build-time law of clearance, and is
    // NOT the walker's step gate that governs living feet.
    (function clearSurfaces() {
      var tris = [];
      for (var i = triBase; i < standTris.length; i += 9) {
        tris.push({ i: i, cx: (standTris[i] + standTris[i + 3] + standTris[i + 6]) / 3, cz: (standTris[i + 2] + standTris[i + 5] + standTris[i + 8]) / 3, drop: false });
      }
      var cell = 16, grid = {};
      tris.forEach(function (t) { var k = Math.floor(t.cx / cell) + ':' + Math.floor(t.cz / cell); (grid[k] = grid[k] || []).push(t); });
      function triYAtLocal(x, z) {
        var best = -Infinity, arg = null;
        var bx = Math.floor(x / cell), bz = Math.floor(z / cell);
        for (var a2 = -1; a2 <= 1; a2++) for (var b2 = -1; b2 <= 1; b2++) {
          var list = grid[(bx + a2) + ':' + (bz + b2)]; if (!list) continue;
          for (var q = 0; q < list.length; q++) {
            var t = list[q]; if (t.drop) continue;
            var ax = standTris[t.i], ay = standTris[t.i + 1], az = standTris[t.i + 2], bxx = standTris[t.i + 3], by = standTris[t.i + 4], bzz = standTris[t.i + 5], cx2 = standTris[t.i + 6], cy = standTris[t.i + 7], cz2 = standTris[t.i + 8];
            var d = (bzz - cz2) * (ax - cx2) + (cx2 - bxx) * (az - cz2);
            if (Math.abs(d) < 1e-9) continue;
            var w0 = ((bzz - cz2) * (x - cx2) + (cx2 - bxx) * (z - cz2)) / d;
            var w1 = ((cz2 - az) * (x - cx2) + (ax - cx2) * (z - cz2)) / d;
            var w2 = 1 - w0 - w1;
            if (w0 < -0.02 || w1 < -0.02 || w2 < -0.02) continue;
            var y = w0 * ay + w1 * by + w2 * cy;
            if (y > best) { best = y; arg = t; }
          }
        }
        return arg ? { y: best, t: arg } : null;
      }
      /* Whose sheet does a height serve? Every road's profile is
       * read at the point by nearest-segment interpolation — the
       * closest centreline distance, and the profile height and
       * half-width that travel with that segment. A height within
       * 0.75 m of a road's own profile, inside that road's
       * corridor (its half-width and 1.5 m more), is that road's
       * working surface: ownership, read from the land itself. */
      function servesOwnSheet(x, z, y) {
        var names = Object.keys(smithRoads);
        for (var ni = 0; ni < names.length; ni++) {
          var sts = smithRoads[names[ni]].stations;
          var bd = Infinity, bp = null, bhw = 0;
          for (var i3 = 0; i3 < sts.length - 1; i3++) {
            var A = sts[i3], B = sts[i3 + 1];
            var ex = B.x - A.x, ez = B.z - A.z;
            var L2 = ex * ex + ez * ez;
            var tt = L2 > 0 ? ((x - A.x) * ex + (z - A.z) * ez) / L2 : 0;
            if (tt < 0) tt = 0; else if (tt > 1) tt = 1;
            var px = A.x + ex * tt, pz = A.z + ez * tt;
            var dd = (x - px) * (x - px) + (z - pz) * (z - pz);
            if (dd < bd) { bd = dd; bp = A.y + (B.y - A.y) * tt; bhw = A.hw + (B.hw - A.hw) * tt; }
          }
          if (bp !== null && Math.sqrt(bd) <= bhw + 1.5 && Math.abs(y - bp) <= 0.75) return true;
        }
        return false;
      }
      var samples = apronSamples.slice();
      Object.keys(smithRoads).forEach(function (nm) {
        var sts = smithRoads[nm].stations;
        for (var i2 = 0; i2 < sts.length - 1; i2++) {
          var A = sts[i2], B = sts[i2 + 1];
          var segLen = Math.hypot(B.x - A.x, B.z - A.z), n = Math.max(1, Math.round(segLen / 0.5));
          for (var j = 0; j <= n; j++) { var t2 = j / n; samples.push([A.x + (B.x - A.x) * t2, A.z + (B.z - A.z) * t2, A.y + (B.y - A.y) * t2]); }
        }
      });
      for (var pass = 0; pass < 4; pass++) {
        var struck = 0;
        for (var si = 0; si < samples.length; si++) {
          var sm = samples[si], hit = triYAtLocal(sm[0], sm[1]);
          if (hit && hit.y - sm[2] > 1.6 && !servesOwnSheet(sm[0], sm[1], hit.y)) { hit.t.drop = true; struck++; }
        }
        if (!struck) break;
      }
      var kept = standTris.slice(0, triBase);
      tris.forEach(function (t) { if (t.drop) return; for (var v = 0; v < 9; v++) kept.push(standTris[t.i + v]); });
      standTris.length = 0;
      for (var w = 0; w < kept.length; w++) standTris.push(kept[w]);
    })();
    // street lights along the smith's stations: one every ~63 m of
    // travel, alternating sides, perched perpendicular — a lamp is a
    // post at the verge, never a ghost in the carriageway.
    ['B1', 'B2', 'C', 'S', 'A1', 'A2'].forEach(function (nm) {
      var sts = smit