<!-- SOLID CITY · part 2723 -->
sy);
        if (i2 % 3 === 0) footprint(w / 2 + 2.5, sz, 0.3, 0.8, sy, sy + 1.0);
        if (i2 % 3 === 0) box(solid, 0.08, 1.0, 0.7, w / 2 + 2.5, sy + 0.5, sz, C.stoneDark);
      }
      // top landing ties into the corridor end
      stand(w / 2 + 1.35, d / 2 + 1.15, 2.4, 2.3, y0 + fh + 0.1);
    }
    // ground lobby: bench + mailbox row under the corridor, by the stair
    box(solid, 2.6, 0.09, 0.5, -4, 0.5, d / 2 - 0.7, C.lanaiWood);
    for (var mb = 0; mb < 6; mb++) box(solid, 0.42, 0.55, 0.18, 2.5 + mb * 0.5, 1.35, d / 2 - 0.3, mb % 2 ? C.stoneDark : C.gold);
    // parking strip in front + cars
    box(solid, w, 0.14, 5, 0, 0.03, d / 2 + 5.2, C.road);
    var carCols = [0xb8bcc2, 0x7a2e2e, 0x2e4a6a, 0xd8d3c3];
    for (var ci = 0; ci < 4; ci++) {
      BASE = M4(x, baseY, z, ry, 0, 0);
      var cp = wpt(-w / 2 + 4 + ci * 6.4, d / 2 + 5.2);
      BASE = M4(cp[0], groundAt(cp[0], cp[1]) + 0.12, cp[1], ry + (ci % 2 ? 0.06 : -0.04), 0, 0);
      car(carCols[ci]);
    }
    clearHome();
    var rec = { x: x, z: z, y: baseY, ry: ry, style: 'apartment', w: w, d: d, units: floors * 2 };
    homes.push(rec);
    return rec;
  }

  /* ================= ROADS (the ancestors' road network) ================= */
  var ROAD_DEFS = [
    // A: the south plain road — past the Gate, from the base flats to the shore flats (its corridor kept; the smith re-builds its surface)
    [[640, -1005], [430, -1065], [190, -1040], [30, -1022], [-180, -1045], [-420, -1100], [-650, -1155]],
    // B: the twisted east climb — the Southern Swing, the Razorback Column, the High Traverse, the Bench Pitches, High Benches
    [[430,-1065],[432.5,-1085],[440,-1115],[455,-1145],[470,-1175],[485,-1205],[500,-1235],[502.5,-1266.2],[515,-1295],[540,-1315],[565,-1330],[600,-1330],[633.8,-1330],[663.8,-1318.7],[682.5,-1303.7],[700,-1290],[712.5,-1322.5],[720,-1352.5],[705,-1382.5],[697.5,-1412.5],[697.5,-1446.2],[692.5,-1475],[690,-1506.2],[693.8,-1536.2],[720,-1527],[745,-1512],[772.5,-1487.5],[795,-1465],[802.5,-1450],[806.3,-1431.2],[828,-1420],[850,-1414],[867.5,-1417.5],[885,-1408.7],[896,-1390],[892,-1370],[900,-1350],[906,-1338],[916,-1328],[919,-1322],[914,-1306],[915,-1285],[945,-1360],[945,-1393.7],[945,-1427.5],[941.3,-1446.2],[937.5,-1450],[933.8,-1468.7],[933.8,-1472.5],[952.5,-1480],[945,-1487.5],[950,-1505],[960,-1520],[980,-1524],[990,-1525],[1012.5,-1547.5],[1027.5,-1577.5],[1012.5,-1600],[1018,-1618],[1010,-1638],[1037.5,-1625],[1053.8,-1626.2],[1065,-1637.5],[1075,-1626.7],[1084,-1610],[1072,-1602],[1065,-1592.5],[1065,-1585],[1080,-1588.7],[1080,-1577.5],[1098,-1568],[1112,-1562],[1126,-1550],[1136.3,-1547.5],[1155,-1543.7],[1170,-1543.7],[1182,-1538],[1197.5,-1550],[1200,-1555],[1218,-1549],[1222.5,-1547.5],[1237.5,-1558.7],[1250,-1552],[1263,-1547.9]],
    // C: the twisted north road — from the B junction over the Overlook pitches to the Far North
    [[945,-1487.5],[903.8,-1517.5],[892.5,-1513.7],[892.5,-1510],[851.3,-1536.2],[835,-1545],[835,-1552.5],[828.8,-1551.2],[820,-1552.5],[835,-1582.5],[862.5,-1600],[855,-1622.5],[896.3,-1663.7],[908,-1684],[904,-1702],[900,-1727.5],[918.8,-1731.2],[911.3,-1768.7],[903.8,-1787.5],[952.5,-1810],[963.8,-1858.7],[935,-1860],[890,-1897.5],[858.8,-1888.7],[836.3,-1903.7],[800,-1910],[791.3,-1903.7],[757.5,-1948.7],[757.5,-1997.5],[708.8,-2031.2],[650,-2015],[590,-2025],[547.5,-2057.5],[543.8,-2068.7],[525,-2125],[505,-2180],[480,-2230],[445,-2277.5],[436.3,-2336.2],[460,-2385]],
    // S: the East Plain Spur — from the column head to the East Plain 'ohana
    [[915,-1285],[915,-1281.2],[907.5,-1232.5],[907.5,-1221.2],[880,-1180]]
  ];
  var roadPts = [];
  var ROAD_SEGS = [];
  ROAD_DEFS.forEach(function (line) { for (var i = 0; i < line.length - 1; i++) ROAD_SEGS.push([line[i], line[i + 1]]); });
  function roadClear(x, z, lotR) {
    // THE ROAD'S VERGE (2026-10-13, on the King's report): no lot may reach
    // the carriageway — a home is sited only when its whole lot circle
    // clears every road segment by the road's half-width plus a verge.
    for (var i = 0; i < ROAD_SEGS.length; i++) {
      var a = ROAD_SEGS[i][0], b = ROAD_SEGS[i][1];
      var dx = b[0] - a[0], dz = b[1] - a[1], L2 = dx * dx + dz * dz;
      var t = L2 ? ((x - a[0]) * dx + (z - a[1]) * dz) / L2 : 0;
      t = Math.max(0, Math.min(1, t));
      if (Math.hypot(x - (a[0] + dx * t), z - (a[1] + dz * t)) < lotR + 4.6) return false;
    }
    return true;
  }
  /* ================= ROADS — THE ROAD SMITH (2026-10-13) =================
   * The old slab roads are REMOVED on the King's word and every road
   * in the district is built by the Road Smith (roads.js): one
   * station table per road, from which the mesh, the standing, and
   * the road points all read. Homes re-site by the verge law against
   * these very lines; driveways are served from the smith's
   * stations; lamps perch perpendicular to them. The Rim Step
   * demonstration is absorbed into Road B, whos