<!-- SOLID CITY · part 2053 -->
: 'GATE', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 30 },
    alias: 'gate ancestors solid approach arch braziers gold basalt north roads',
    text: 'Monumental gold-and-basalt arch on the north approach: twin pillars with gold trim, a gold lintel, twin braziers burning. Solid\u2019s honor gate before the Ancestral Roads. Never leave a wingmate.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._gateAncestors) return;
  var orig = r.build; r._gateAncestors = true;
  r.build = function () {
    var w = orig.apply(this, arguments), at = Math.min(2, w.length);
    w.splice(at, 0, { x: POS.x, z: POS.z + 70, y: M.gy + 60, v: 130, cap: { cap: 'GATE OF THE ANCESTORS', sub: 'Solid\u2019s approach \u00b7 twin braziers \u00b7 north of the roads', say: 'The Gate of the Ancestors, north of the roads: twin basalt pillars, gold trim, twin braziers burning \u2014 Solid\u2019s honor gate before the fifty-five.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround();
  var p; try { p = import('/city/gate-ancestors.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createGateAncestors || 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] Gate of the Ancestors 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 < 70 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>Gate of the Ancestors</b>: twin basalt pillars with gold trim, twin braziers burning. Solid\u2019s honor gate \u2014 the rings lie south of here.', 8); }
    else if (pd > 250) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#d8aa48', fl ? 3 : 5, fl ? '' : 'GATE'); }
window.CityGateAncestors = { update: update, radar: radar, pos: POS, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/gate-ancestors.js =====
/* SOLID CITY — GATE OF THE ANCESTORS (2026-10-11, Builder A / The Approach)
 * Monumental gold-and-basalt arch on the north approach to the Ancestral Roads.
 * Twin basalt pillars with gold trim bands, twin gold beams, twin gold braziers
 * with flames rising between the beams, and a name plate on both faces.
 * SOLID's honor: gold 0xd8aa48, basalt 0x141114.
 * Local frame: ground at y = 0, the road passes under the arch along +Z/-Z.
 *
 *   import { createGateAncestors } from '/city/gate-ancestors.js';
 *   const g = createGateAncestors({ THREE, position: {x, y, z} });
 *   // g.userData: footprint (two pillar AABBs), update(t) flickers the flames
 */
export function createGateAncestors(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'gate-ancestors'; root.position.set(P.x, P.y, P.z);
  var foot = [];

  var C = { gold: 0xd8aa48, goldDeep: 0x8a6a20, glowGold: 0xffe0a0, basalt: 0x141114, flame: 0xff9a30 };
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x2a1a04 });
  var basaltMat = new T.MeshLambertMaterial({ color: C.basalt });
  var glowGoldMat = new T.MeshBasicMaterial({ color: C.glowGold });
  var flameMat = new T.MeshBasicMaterial({ color: C.flame });
  var flameCoreMat = new T.MeshBasicMaterial({ color: C.glowGold });

  // Twin basalt pillars with gold trim — SOLID's honor
  var baseGeo = new T.BoxGeometry(5.4, 1.4, 5.4);
  var pilGeo = new T.BoxGeometry(3.2, 20, 3.2);
  var bandGeo = new T.BoxGeometry(3.7, 0.5, 3.7);
  var capGeo = new T.BoxGeometry(4.2, 0.8, 4.2);
  [-7, 7].forEach(function (px) {
    var base = new T.Mesh(baseGeo, basaltMat); base.position.set(px, 0.4, 0); root.add(base);
    var pil = new T.Mesh(pilGeo, basaltMat); pil.position.set(px, 11, 0); root.add(pil);
    [2.4, 8, 13.6, 19.2].forEach(function (hy) {
      var band = new T.Mesh(bandGeo, goldMat); band.position.set(px, hy, 0); root.add(band);
    });
    var cap = new T.Mesh(capGeo, goldMat); cap.position.set(px, 21.2, 0); root.add(cap);
    foot.push([px, 0, 4.2, 4.2, 0, 21.6, 0]);
  });

  // Twin gold beams spanning the pillars — open in the middle so the braziers breathe
  var beamGeo = new T.BoxGeometry(19.4, 