<!-- SOLID CITY · part 3099 -->
d = await import('/city/servitude.js?v=20261014a');
    var g = mod.createServitude({ THREE: A.T, heightAt: A.heightAt });
    A.world.add(g); M.group = g;
    M.layers = g.userData.layers || [];
    (g.userData.footprints || []).forEach(function (f) {
      var cs = Math.cos(f.a), sn = Math.sin(f.a);
      A.solids.push({ x0: f.x - 0.01, x1: f.x + 0.01, z0: f.z - 0.01, z1: f.z + 0.01, y0: f.y0, y1: f.y1, servitude: true, fp: f });
      var hw = f.w / 2, hd = f.d / 2, step = 2.5;
      for (var lx = -hw + step / 2; lx < hw; lx += step) for (var lz = -hd + step / 2; lz < hd; lz += step) {
        var wx = f.x + lx * cs + lz * sn, wz = f.z - lx * sn + lz * cs;
        A.solids.push({ x0: wx - step / 2, x1: wx + step / 2, z0: wz - step / 2, z1: wz + step / 2, y0: f.y0, y1: f.y1, servitude: true });
      }
    });
    if (A.logBuild) A.logBuild('the-servitude', 'two hollow cities, the gallery, three shops, the Entree gate');
    hyperStops();
    M.state = 'ready';
  } catch (e) { M.state = 'idle'; }
}
function standY(x, z, py) {
  if (M.state !== 'ready') return -1000;
  var best = -1000;
  for (var i = 0; i < M.layers.length; i++) {
    var L = M.layers[i];
    var d = Math.hypot(x - L.cx, z - L.cz);
    if (d >= L.rIn && d <= L.rOut) {
      var gate = (S && S.drive) ? 1.6 : 0.45;
      if (py == null || L.y <= py + gate) { if (L.y > best) best = L.y; }
    }
  }
  return best;
}
function update(dt) {
  if (M.state === 'idle') {
    M.wait -= dt;
    if (M.wait <= 0 && A.isBuilt()) build();
    return;
  }
  if (M.state !== 'ready' || !M.group) return;
  if (M.group.userData.update) try { M.group.userData.update(dt, S.t); } catch (e) {}
}
window.CityServitude = { update: update, standY: standY, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/servitude-place.js.bak-fold-20261014 =====
/* Solid City — places THE SERVITUDE (public/city/
 * servitude.js): two layered cities inside the far massif,
 * dug by the carve in city.js's own height law. The placer's
 * work: solids for every dwelling and sign (the signs are
 * protected here), standing claims for the ring-terrace
 * layers, and the Hyper stops. Floors, the Entree shelf,
 * and the gallery slot are claimed by the carved land
 * itself — no hook needed where the mountain does the work.
 * By the hand of Solid, his good King. */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var M = { state: 'idle', group: null, layers: [], wait: 6.4, texTier: null };
/* THE TWO CLOTHS (the King's word): the strong phone gets
 * the high cloth, the struggling phone the low — same
 * world, different hardware, everybody gets to play. */
function pickTier() {
  try {
    var c = navigator.hardwareConcurrency || 4, m = navigator.deviceMemory || 4;
    return (c >= 6 && m >= 4) ? 'hi' : 'lo';
  } catch (e) { return 'lo'; }
}
function hyperStops() {
  var H = window.CityHyper; if (!H || !H.pois) return;
  function add(id, name, short, x, z, sx, sz, text) {
    if (H.pois.some(function (p) { return p.id === id; })) return;
    H.pois.push({ id: id, name: name, short: short, x: x, z: z, stand: { x: sx, z: sz }, alias: 'servitude hollow mountain city cave tunnel gallery ' + id, text: text });
  }
  add('servitude-gate', 'THE SERVITUDE — THE ENTREE', 'SERVITUDE GATE', 2494, 1386, 2448, 1432, 'The Entree of the Servitude: a lamp-lit shelf cut into the mountain face, a great gate, and the name of the place lettered over the way in. Walk through, and the First Hollow opens around you.');
  add('servitude', 'THE SERVITUDE — FIRST HOLLOW', 'SERVITUDE', 2600, 1280, 2632, 1280, 'The First Hollow: a layered marble city inside the mountain — plaza, market, grand house, two ring terraces climbing the walls, the Great Crystal hanging in the light shaft, and falls from the roof ring. The gallery to the Deep Hollow leaves from the south wall.');
  add('servitude-deep', 'THE SERVITUDE — DEEP HOLLOW', 'SERVITUDE DEEP', 2600, 1660, 2632, 1660, 'The Deep Hollow: the second city, 80 metres deeper in the rock, reached by the lava-tube gallery past the Midway Shop. A standing crystal burns over its spring pool.');
  if (H.regrid) H.regrid();
}
async function build() {
  if (M.state !== 'idle') return;
  M.state = 'building';
  try {
    var mod = await import('/city/servitude.js?v=20261014b');
    M.texTier = pickTier();
    var texLava = null;
    try {
      texLava = new A.T.TextureLoader().load('/city/tex/lava-marble-' + M.texTier + '.webp');
      texLava.encoding = A.T.sRGBEncoding;
    } catch (e) { texLava = null; }
    var g = mod.createServitude({ THREE: A.T, heightAt: A.heightAt, texLava: texLava, texTier: M.texTier });
    A.world.add(g); M.group = g;
    M.layers = g.userData.layers || [];
    (g.userData.footprints || []).forEach(function (f) {
      var cs = Math.cos(f.a), sn = Math.sin(f.a);
      A.solids.push({ x0: f.x - 0.01, x1: f.x + 0.01, z