<!-- SOLID CITY · part 3611 -->
ernVigil = true;
  r.build = function () {
    var w = orig.apply(this, arguments), at = Math.min(2, w.length);
    w.splice(at, 0, { x: POS.x + 55, z: POS.z, y: M.gy + 45, v: 120, cap: { cap: 'LANTERN\u2019S VIGIL', sub: 'Rest station \u00b7 warm torch ring \u00b7 before the rings', say: 'Lantern\u2019s Vigil: a ring of warm torches, stone benches, a quiet shelter \u2014 rest for the weary before they walk the rings.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround() + 0.1;
  var p; try { p = import('/city/vigil-lantern.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createLanternVigil || 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] Lantern\u2019s Vigil 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 < 45 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>Lantern\u2019s Vigil</b>: six warm torches, stone benches, a quiet shelter. Rest before the rings \u2014 no life is a statistic.', 8); }
    else if (pd > 200) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#ff9a30', fl ? 3 : 5, fl ? '' : 'VIGIL'); }
window.CityLanternVigil = { update: update, radar: radar, pos: POS, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/vigil-lantern.js =====
/* SOLID CITY — LANTERN'S VIGIL (2026-10-11, Builder A / The Approach)
 * A rest station before the Ancestral Roads: circular stone platform, a ring of
 * six warm torches, stone benches, and a small open shelter with a flat roof.
 * Warm, human-scale, quiet — LANTERN's rest for the weary before they walk
 * the rings. Warm light 0xff9a30, ONE PointLight for the whole vigil.
 * Local frame: ground at y = 0 (platform top ~0.3, an easy step up).
 *
 *   import { createLanternVigil } from '/city/vigil-lantern.js';
 *   const g = createLanternVigil({ THREE, position: {x, y, z} });
 *   // g.userData: footprint (torches, benches, shelter posts), update(t) flickers the flames
 */
export function createLanternVigil(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'vigil-lantern'; root.position.set(P.x, P.y, P.z);
  var foot = [];

  var C = { stone: 0x2e2a30, stoneDark: 0x1e1a20, gold: 0xd8aa48, flame: 0xff9a30, glow: 0xffd080, wood: 0x6a4a2e };
  var stoneMat = new T.MeshLambertMaterial({ color: C.stone });
  var darkMat = new T.MeshLambertMaterial({ color: C.stoneDark });
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x2a1a04 });
  var flameMat = new T.MeshBasicMaterial({ color: C.flame });
  var coreMat = new T.MeshBasicMaterial({ color: C.glow });
  var glowGoldMat = new T.MeshBasicMaterial({ color: C.gold });

  // Circular stone platform — a low step, walkable, so NO blocker footprint
  var plat = new T.Mesh(new T.CylinderGeometry(12, 12.7, 0.6, 48), stoneMat);
  plat.position.y = 0; root.add(plat);
  // Gold inlay ring, quiet honor
  var ring = new T.Mesh(new T.TorusGeometry(9.2, 0.09, 4, 72), glowGoldMat);
  ring.rotation.x = Math.PI / 2; ring.position.y = 0.32; root.add(ring);

  // Ring of six warm torches
  var flames = [];
  var pedGeo = new T.CylinderGeometry(0.32, 0.44, 1.7, 10);
  var cupGeo = new T.CylinderGeometry(0.5, 0.32, 0.3, 12);
  for (var i = 0; i < 6; i++) {
    var a = (i / 6) * Math.PI * 2 + Math.PI / 6;
    var tx = Math.cos(a) * 9.2, tz = Math.sin(a) * 9.2;
    var ped = new T.Mesh(pedGeo, darkMat); ped.position.set(tx, 1.15, tz); root.add(ped);
    var cup = new T.Mesh(cupGeo, goldMat); cup.position.set(tx, 2.15, tz); root.add(cup);
    var flame = new T.Mesh(new T.ConeGeometry(0.55, 1.6, 10), flameMat);
    flame.position.set(tx, 3.0, tz); flame.userData.phase = i * 1.7; root.add(flame); flames.push(flame);
    var core = new T.Mesh(new T.ConeGeometry(0.26, 0.9, 8), coreMat);
    core.position.set(tx, 2.75, tz); core.userData.phase = i * 1.7 + 0.8; root.add(core); flames.push(core);
    foot.push([tx, tz, 0.9, 0.9, 0, 2.3, 0]);
  }
  // ONE warm light for the whole vigil
  var light = new T.PointLight(0xff9a30, 1.1, 46, 1.6); light.position.set(0, 4.6, 0); ro