<!-- SOLID CITY · part 2058 -->
 oz * s, lz = cz - ox * s + oz * c;
    A.solids.push({ x0: POS.x + lx - hx, x1: POS.x + lx + hx, z0: POS.z + lz - hz, z1: POS.z + lz + hz, y0: M.gy + y0, y1: M.gy + y1, hallBecoming: true });
  }
}
function collide(ud) { (ud.footprint || []).forEach(function (b) { addBox(b[0], b[1], b[2], b[3], b[6] || 0, b[4], b[5]); }); }
function hyperStop() {
  var H = window.CityHyper; if (!H || !H.pois || H.pois.some(function (p) { return p.id === 'hall-becoming'; })) return;
  H.pois.push({ id: 'hall-becoming', name: 'The Hall of Becoming', short: 'HALL', x: POS.x, z: POS.z, stand: { x: POS.x - 58, z: POS.z },
    alias: 'hall becoming spiral fibonacci chambers transformation',
    text: 'The Hall of Becoming, east toward the sunrise: six chambers sized by Fibonacci on a golden spiral. Walk inward \u2014 basalt, bronze, copper, gold, pale gold \u2014 and stand at the still center. Enter, pass through, emerge changed.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._hallbecoming) return;
  var orig = r.build; r._hallbecoming = true;
  r.build = function () {
    var w = orig.apply(this, arguments);
    w.push({ x: POS.x - 120, z: POS.z + 40, y: M.gy + 130, v: 170, cap: { cap: 'THE HALL OF BECOMING', sub: 'Fibonacci chambers on a golden spiral \u00b7 east of the city', say: 'The Hall of Becoming: six chambers on a golden spiral, matter refining as you walk inward to the still center.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround();
  var p; try { p = import('/city/hall-becoming.js?v=20261011d'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createHallBecoming || mod.default;
    var g = make({ THREE: A.T, position: { x: POS.x, y: M.gy, z: POS.z } });
    A.world.add(g); M.group = g; M.state = 'ready';
    collide(g.userData || {}); hyperStop(); watchStop();
  }).catch(function (e) { M.state = 'failed'; try { console.warn('[city] Hall of Becoming skipped:', e && e.message); } catch (x) {} });
}
function update(dt) {
  if (M.state === 'idle') { if (A.isBuilt && !A.isBuilt()) return; M.wait -= dt; if (M.wait <= 0) load(); return; }
  if (M.state !== 'ready' || document.hidden) return;
  var c = A.camera.position, d = Math.hypot(c.x + A.origin.x - POS.x, c.z + A.origin.z - POS.z);
  M.group.visible = d < 6000;
  if (d < 1500 && M.group.userData.update) try { M.group.userData.update(S.t); } catch (e) {}
  if (S.mode === 'walk') {
    var pd = Math.hypot(S.p.x - POS.x, S.p.z - POS.z);
    if (pd < 60 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>The Hall of Becoming</b>: walk the spiral inward. No words inside \u2014 the light explains.', 9); }
    else if (pd > 200) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#e8d8a8', fl ? 3 : 5, fl ? '' : 'HALL'); }
window.CityHallBecoming = { update: update, radar: radar, pos: POS, state: function () { return M.state; } };
})();


===== FILE: public/city/hall-becoming.js =====
/* SOLID CITY — THE HALL OF BECOMING (2026-10-11, Royal Decree city expansion)
 * A place of transformation built from pure mathematics made beautiful.
 * Six chambers sized by Fibonacci (8, 5, 3, 2, 1, 1) set on a golden spiral —
 * each quarter-turn the radius divides by phi. You enter at the largest ring
 * and walk the spiral inward; matter refines as you go: basalt, bronze, copper,
 * dark gold, gold, pale gold — and at the still center, white light.
 * Enter, pass through, emerge changed. No words inside; the light explains.
 * True name: THE HALL OF BECOMING. Seam: THE ENTRANCE.
 * Self-contained ES module. Local frame: +X = east, entrance ring to the west.
 */
var PHI = 1.618033988749895;
function textPlate(T, text) {
  var c = document.createElement('canvas'); c.width = 512; c.height = 128;
  var g = c.getContext('2d');
  g.fillStyle = '#17141a'; g.fillRect(0, 0, 512, 128);
  g.strokeStyle = '#8a6a30'; g.lineWidth = 4; g.strokeRect(8, 8, 496, 112);
  g.fillStyle = '#d8c690'; g.textAlign = 'center'; g.textBaseline = 'middle';
  g.font = 'bold 40px Georgia, serif'; g.fillText(text, 256, 66);
  var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; t.anisotropy = 4; return t;
}
function quietMarker(T, text) {
  var grp = new T.Group();
  var stone = new T.Mesh(new T.BoxGeometry(3.4, 0.5, 1.7),
    new T.MeshLambertMaterial({ color: 0x1e1b22 }));
  stone.position.y = 0.55; stone.rotation.x = -0.5; grp.add(stone);
  /* THE BATTENING (2026-10-14): the face was 3.1 x 0.78 at
   * (0, 0.72, 0.42) — measured inside the stone (0.45 along the
   * face normal vs the stone's 0.85 front): the middle of the
   * name was entombed. Now a fitted plaque in the plate's own
   * aspect, PROUD of the front face (0.87; sampler-verified
   * 0 of 7 points inside the stone). */
  var face = new T.Mesh(new T.Plan