<!-- SOLID CITY · part 2987 -->
 sitting), now the rail and its posts themselves
           * retire. The dirt shoulder remains — an old trail
           * keeps its edge in earth, not in iron. The rail and
           * posts surfaces stand empty as the record. */
        } else {
        var cA0 = edgePt(A, sd, 0.02, 0.02), cA1 = edgePt(A, sd, 0.32, 0.15);
        var cB0 = edgePt(B, sd, 0.02, 0.02), cB1 = edgePt(B, sd, 0.32, 0.15);
        quad(curb, cA0, cB0, cB1, cA1); standQuad(stand, cA0, cB0, cB1, cA1);
        var fA = [cA1[0], cA1[1] - 0.19, cA1[2]], fB = [cB1[0], cB1[1] - 0.19, cB1[2]];
        quad(curb, cA1, cB1, fB, fA, [sd * A.rx, sd * A.rz]);
        var gA0 = edgePt(A, sd, 0.05, 0.157), gA1 = edgePt(A, sd, 0.13, 0.157);
        var gB0 = edgePt(B, sd, 0.05, 0.157), gB1 = edgePt(B, sd, 0.13, 0.157);
        quad(gold, gA0, gB0, gB1, gA1);
        /* the sidewalk, on the uphill side: from the curb's outer edge */
        if (walkSide === sd) {
          var wA0 = edgePt(A, sd, 0.32, 0.14), wA1 = edgePt(A, sd, 1.95, 0.14);
          var wB0 = edgePt(B, sd, 0.32, 0.14), wB1 = edgePt(B, sd, 1.95, 0.14);
          quad(walk, wA0, wB0, wB1, wA1); standQuad(stand, wA0, wB0, wB1, wA1);
        }
        if (walkSide === sd) { out0 = 1.95; lift0 = 0.14; }
        } /* end street furniture */
        /* the skirt, and on the falling side THE BANK: from the built
         * edge a face at repose (0.55) marches outward until it meets
         * the land and tucks under it. It does not chase a cliff to
         * the bottom — a bank that meets the face and stops is the
         * bench's own line across the mountain, the line visible in
         * the King's photographs. On the rising side the same march
         * ends at once: the face there is the cut bank, standing at
         * the shoulder. */
        var eA = edgePt(A, sd, out0, lift0), eB = edgePt(B, sd, out0, lift0);
        var sk = sd < 0 ? skirtL : skirtR;
        var dCache = sd < 0 ? drapeCacheL : drapeCacheR;
        if (!dCache[i]) dCache[i] = drapeFrom(eA, A.rx * sd, A.rz * sd);
        if (!dCache[i + 1]) dCache[i + 1] = drapeFrom(eB, B.rx * sd, B.rz * sd);
        var pA = dCache[i].pts, pB = dCache[i + 1].pts;
        /* THE CLEAR BODY (the King's ruling, 2026-10-13 ~22:02)
         * named the brow the road's painted skin; THE SLAB PASS
         * (his next word, ~23:45: "no need for so many triangles
         * just big slope slabs") gives the brow its measure: the
         * drape's profile is still surveyed at every station (the
         * census reads its drops and meets as before, and standing
         * truth never rode the skirts), but the brow is no longer
         * PAINTED station by station — browSlabs() below pours it
         * in long slabs wherever the surveyed lines run true. */
        /* THE GRASS AMENDMENT (the King's word, minutes later):
         * an invisible inside shows as GAPS, and a gap reads as a
         * bug where a bank reads as a hillside. So the deep drape
         * returns — but as grass, not the full staircase of
         * segments, and the factory pours it with its lawn. The
         * grass itself is no longer emitted here, station by
         * station: THE ONE BLOCK (the King's next word) sweeps it
         * after the run is surveyed — see bankSweep below. */
        var dropA = eA[1] - pA[pA.length - 1][1], riseA = pA[pA.length - 1][1] - eA[1];
        if (sd < 0 && Math.max(dropA, riseA) > stats.maxSkirtL) stats.maxSkirtL = Math.max(dropA, riseA);
        if (sd > 0 && Math.max(dropA, riseA) > stats.maxSkirtR) stats.maxSkirtR = Math.max(dropA, riseA);
        if (sd === upSide) { if (riseA > stats.cutBank) stats.cutBank = riseA; }
        else { if (dropA > stats.bank) stats.bank = dropA; if (!dCache[i].met) stats.bankUnmet++; }
      }
    }
    /* THE ONE BLOCK (the King's design, 2026-10-13 ~22:15):
     * "finding the measurements of the clear area and set it to
     * one block instead of many." The clear area beneath each bank
     * is MEASURED from the drape the survey already walked — the
     * brow point and the foot point at every station — and built
     * as ONE swept grass strip per stretch. A station earns a kept
     * point only where the brow's true line strays more than half
     * a metre from the chord across it, or the stretch runs past
     * 24 stations: a straight bank becomes a few long blocks, a
     * curving bank keeps its points exactly where the land turns.
     * One block instead of many, measured before it is built. */
    function bankSweep(cache, sdSign) {
      var brow = [], foot = [];
      for (var i2 = 0; i2 < N; i2++) {
        var dc = cache[i2];
        if (dc && dc.pts.length - 1 > 2) { brow[i2] = dc.pts[2]; foot[i2] = dc.pts[dc.pts.length - 1]; }
        else { brow[i2] = null; foot[i2] = null; }
      }
      function dev3(p, a, b) {
        var abx = b[0] - a[0], aby = b[1] - a[1], abz = b[2] - a[2];
        var t = ((p[0] - a[0]) * abx + (p