<!-- SOLID CITY · part 2650 -->
rk); pourSurf(built.curbR, solid, C.stoneDark);
        pourSurf(built.walk, solid, C.conc);
        pourSurf(built.goldL, glowB, 0xd8a833); pourSurf(built.goldR, glowB, 0xd8a833);
      }
      for (var i = 0; i < built.standTris.length; i++) standTris.push(built.standTris[i]);
      built.stations.forEach(function (s) { roadPts.push([s.x, s.z]); });
      smithRoads[name] = built;
      return built;
    }
    function surfSt(built, x, z) {
      var best = null, bd = 1e12;
      built.stations.forEach(function (s) { var d = (s.x - x) * (s.x - x) + (s.z - z) * (s.z - z); if (d < bd) { bd = d; best = s; } });
      return best;
    }
    var headIdx = ROAD_DEFS[1].findIndex(function (p) { return p[0] === 915 && p[1] === -1285; });
    // THE HEAD'S HEIGHT IS B2'S OWN: the traverse's natural first
    // height is probed first, and the climb is pinned to ARRIVE at
    // it — the junction pad stands on honest fill so the three
    // roads that meet here meet LEVEL, because the face east of
    // this shoulder forbids the traverse to dive to the climb.
    var probeB2 = smith.buildRoad({ points: ROAD_DEFS[1].slice(headIdx), width: 7.6, furniture: 'bench' });
    var nodeY = probeB2.stations[0].y;
    var bB1 = buildOne('B1', ROAD_DEFS[1].slice(0, headIdx + 1), 'bench', null, nodeY, null, null, { width: 5.6, over: 30 });
    var headSt = bB1.stations[bB1.stations.length - 1];
    var bB2 = buildOne('B2', ROAD_DEFS[1].slice(headIdx), 'bench', headSt.y, null, null, { width: 5.6, over: 30 });
    var hBC = surfSt(bB2, 945, -1487.5);
    buildOne('C', ROAD_DEFS[2], 'bench', hBC.y, null, hBC);
    // the spur is hosted by THE PAD: a junction is a level place,
    // and a guest leaving it should be held to the pad's own
    // plane — not to the arrival pitch of whichever road happened
    // to be built first. (Its host was the climb's last station,
    // and when the climb's line moved, the spur's first metres
    // were clamped to a falling plane: a 72% kink at the seam.)
    var headPad = { x: 915, z: -1285, y: headSt.y, grade: 0, bank: 0, fx: 0, fz: 1, rx: 1, rz: 0 };
    buildOne('S', ROAD_DEFS[3], 'bench', headSt.y, null, headPad);
    var hA = surfSt(bB1, 430, -1065);
    buildOne('A1', ROAD_DEFS[0].slice(1).reverse(), 'street', null, hA.y);
    buildOne('A2', [[430, -1065], [640, -1005]], 'street', hA.y, null, hA);
    apronAt(915, -1285, headSt);
    apronAt(945, -1487.5, hBC);
    apronAt(430, -1065, hA);
    // THE CLEARANCE OF SURFACES: the drive reads VOID at a
    // sample when the HIGHEST standing triangle there rises
    // above the world's gate — the road's own profile plus 1.6.
    // Where benches braid, an upper road's shoulder can be that
    // highest triangle over a lower road's line, and the lower
    // road is voided beneath a surface it cannot use. The law
    // therefore strikes the ARGMAX ONLY: the single highest
    // triangle at each voided sample, pass after pass, until no
    // centreline sample of any road is voided by a road's own
    // triangles. Nothing else is struck — a triangle that merely
    // rises over a neighbour's line is a bench, and benches are
    // the country these roads are built in. Struck triangles
    // remain in the eye; they are removed from the standing only.
    (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;
      }
      var samples = apronSamples.s