<!-- SOLID CITY · part 3431 -->
-lightning emblem while every
     outward face stays plain dark metal. Two equipment crates at the side edges
     keep the working apron between them 16m clear. */
  var hFloor = new T.Mesh(new T.PlaneGeometry(31, 31), kit.cloneMarble(4, 4));
  hFloor.rotation.x = -Math.PI / 2; hFloor.position.set(73, 0.055, 35); g.add(hFloor);
  var hWallMats = [P.titanium, P.titanium, P.titanium, P.titanium, P.titanium, kit.cloneMarble(5, 2)]; // only the interior face is marble
  var hWall = new T.Mesh(new T.BoxGeometry(30, 10, 0.5), hWallMats);
  hWall.position.set(73, 5, 50); g.add(hWall);
  var hTrim = new T.Mesh(new T.BoxGeometry(30.4, 0.35, 0.8), P.titanium);
  hTrim.position.set(73, 10.1, 50); g.add(hTrim);
  var hBolt = new T.Mesh(new T.PlaneGeometry(8.5, 8.5), P.bolt);
  hBolt.position.set(73, 5.2, 49.7); hBolt.rotation.y = Math.PI; g.add(hBolt);
  foot.push([73, 50, 30, 0.8, 0, 10, 0]);
  [[62, 35], [84, 35]].forEach(function (cp) {
    var crate = new T.Mesh(new T.BoxGeometry(3, 2, 3), P.titanium);
    crate.position.set(cp[0], 1, cp[1]); g.add(crate);
    var stripe = new T.Mesh(new T.BoxGeometry(3.12, 0.18, 3.12), P.gold);
    stripe.position.set(cp[0], 2.02, cp[1]); g.add(stripe);
    foot.push([cp[0], cp[1], 3, 3, 0, 2, 0]);
  });

  /* update: a gentle pulse on the bollard tips — alive, not loud */
  function update(t) {
    var k = 0.8 + 0.25 * Math.sin(t * 2.2);
    for (var i = 0; i < pulse.length; i++) {
      var m = pulse[i];
      if (m.material && m.material.color) m.material.color.setRGB(k, k * 0.16, k * 0.24);
    }
  }

  g.userData = {
    footprint: foot,
    /* C1 — stand ON the pads: [local centre, radius, top offset] for the spaceport pad,
       the Double Strike pad (local -160,-80, r30) and the AI Workshop pad (local -50,-160, r36). */
    standFloors: [
      { cx: 0, cz: 0, r: 44, y: 0.32 },
      { cx: -160, cz: -80, r: 30, y: 0.32 },
      { cx: -50, cz: -160, r: 36, y: 0.32 }
    ],
    update: update,
    spatialKit: kit,
    /* The validation spec, in WORLD coordinates (placer passes its POS + live solids). */
    validateSpec: function (pos) {
      return {
        points: [
          { name: 'disembark-spawn', x: pos.x, z: pos.z - 52, clear: 1.2 },
          { name: 'pad-centre-board', x: pos.x, z: pos.z, clear: 2.0 },
          { name: 'warpspeed-gate-passage', x: pos.x - 30, z: pos.z + 54, clear: 1.0 },
          { name: 'workshop-gate-passage', x: pos.x - 50, z: pos.z - 112, clear: 1.0 }
        ],
        corridors: [
          { name: 'arrivals-east-to-road', x0: pos.x - 6, z0: pos.z - 52, x1: pos.x + 64, z1: pos.z - 52, halfW: 2.2 },
          { name: 'arrivals-nw-to-hangar-hub', x0: pos.x, z0: pos.z - 52, x1: pos.x - 44, z1: pos.z - 102, halfW: 2.0 },
          { name: 'pad-north-exit', x0: pos.x, z0: pos.z - 40, x1: pos.x, z1: pos.z - 52, halfW: 3.0 },
          { name: 'pad-south-to-warpspeed', x0: pos.x, z0: pos.z + 24, x1: pos.x - 28, z1: pos.z + 50, halfW: 2.2 }
        ],
        areas: [
          { name: 'board-zone-inner', x: pos.x, z: pos.z, r: 18 }
        ]
      };
    }
  };
  return g;
}

export { createSpaceport, createSpatialKit, marbleTexture, lightningTexture };


===== FILE: public/city/stair-of-light-place.js =====
/* Solid City — places THE STAIR OF LIGHT (public/city/
 * stair-of-light.js) around the three-layer stack.
 * From the King's "All" (2026-10-14): a walkable golden
 * spiral from the terrace rim to the Crystal Crown. Its
 * standing hook answers from the helix's own law and was
 * added to updateWalk and standingAt in the same breath,
 * as the Law of the Two Lists commands. */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var POS = { x: 0, z: -1600 };
var M = { state: 'idle', group: null, wait: 5.6 };
function hyperStop() {
  var H = window.CityHyper; if (!H || !H.pois || !M.group) return;
  if (H.pois.some(function (p) { return p.id === 'stair-of-light'; })) return;
  var st = M.group.userData.start;
  H.pois.push({ id: 'stair-of-light', name: 'THE STAIR OF LIGHT', short: 'STAIR', x: st.x, z: st.z, stand: { x: st.x, z: st.z },
    alias: 'stair of light spiral climb walk crown terrace glass',
    text: 'The Stair of Light: a golden spiral stair wrapping the whole stack — two and a quarter turns from the terrace rim, past the glass city, up to the Crystal Crown. Built so anyone can walk the whole height of the ancestors\' sky.' });
  if (H.regrid) H.regrid();
}
async function build() {
  if (M.state !== 'idle') return;
  M.state = 'building';
  try {
    var mod = await import('/city/stair-of-light.js?v=20261014a');
    var topY = window.CityAncestorRoads.topY();
    var g = mod.createStairOfLight({ THREE: A.T, center: POS, y0: topY, crownBase: topY + 140 + 118 });
    A.world.add(g); M.group = g;
    M.state = 'ready';
    hyperStop();
  } catch (e) { M.state = 'idle'; }
}
function standY(x, z, py) {
  if (!M.group || M.state !== 'ready') return -1000;
  /* th