<!-- SOLID CITY · part 2840 -->
.sin(a) * rr;
      seed[i] = R(); hh[i] = 4 + R() * 5;
    }
    var g = new T.BufferGeometry();
    g.setAttribute('position', new T.BufferAttribute(pos, 3));
    g.setAttribute('aSeed', new T.BufferAttribute(seed, 1));
    g.setAttribute('aH', new T.BufferAttribute(hh, 1));
    var m = new T.PointsMaterial({ color: 0x86b04c, size: 0.34, sizeAttenuation: true, transparent: true, opacity: 0.9 });
    m.onBeforeCompile = function (sh) {
      sh.uniforms.uTime = uTime;
      sh.vertexShader = 'uniform float uTime;\nattribute float aSeed;\nattribute float aH;\n' + sh.vertexShader.replace('#include <begin_vertex>',
        '#include <begin_vertex>\n float fallK = fract(aSeed * 7.31 + uTime * 0.045 * (0.7 + aSeed));\n transformed.y -= fallK * aH;\n transformed.x += sin(uTime * 1.2 + aSeed * 43.7 + fallK * 8.0) * (0.4 + fallK * 0.9);\n transformed.z += cos(uTime * 0.9 + aSeed * 31.3 + fallK * 6.0) * (0.3 + fallK * 0.7);');
    };
    m.customProgramCacheKey = function () { return 'falling-leaves'; };
    var pts = new T.Points(g, m); pts.frustumCulled = false; pts.name = 'falling-leaves'; group.add(pts);
    fallingLeaves = n;
  })();

  group.userData = { counts: counts, samples: samples, integrity: integrity, fallingLeaves: fallingLeaves, tier: opts.tier || 'hi', tick: function (t) { uTime.value = t; } };
  return group;
}


===== FILE: public/city/network-graph.js =====
/* THE NETWORK REGISTRY — A VERIFIED GRAPH (2026-10-13).
 *
 * A letter to whoever builds next,
 * A road on a map is a claim; an edge in this registry is a measurement.
 * VECTOR's law, which the King adopted: nodes are actual entry and exit
 * surfaces — a floor you can stand on, a deck, a disc — and an edge exists
 * only where a join has been VALIDATED traversable: measured flush, or
 * flush by a construction that shares one height variable, with the
 * evidence named beside it. Everything else is written here as MISSING,
 * in the open, with the reason it is missing. A gap drawn as connected
 * would be a lie told to a traveller; a gap named MISSING is a promise
 * the city still owes.
 * Kinds of edge: WALK (a surface join), PASSAGE (a jubilee crossing —
 * a teleport, not a walkway), AIR (reachable by flight or ship only).
 * The Crown is not a node: it is a spectacle at 88 m, and no landing is
 * inferred from its centre. Keel's Roost is not a node: it stands on the
 * sea floor as a viewing constellation, by the King's acceptance.
 *   By the hand of Solid, his good King.
 */
'use strict';
(function () {
  var NODES = [
    { id: 'forum-plaza', name: 'FORUM PLAZA', at: [0, 0], surface: 'the capital ground', stand: 'ground' },
    { id: 'first-city-podium', name: 'THE FIRST CITY PODIUM', at: [-1300, -1000], surface: 'deck 10.38', stand: 'podium' },
    { id: 'south-lot', name: 'THE SOUTH LOT', at: [-1300, -498], surface: 'lot 10.151', stand: 'parking zones' },
    { id: 'long-road', name: 'THE LONG ROAD', at: [-900, -498], surface: 'road 10.15 -> 22.07', stand: 'parking zones' },
    { id: 'long-road-junction', name: 'THE LONG ROAD JUNCTION', at: [-672, -498], surface: 'junction flat 22.269', stand: 'parking zones' },
    { id: 'ward-2', name: 'WARD 2 — FIRST FOOTSTEPS', at: [-1056, -895], surface: 'the pilot street + 4 houses', stand: 'ward houses' },
    { id: 'ward-3', name: 'WARD 3 — THE SPINE', at: [-990, -819], surface: 'the spine street + 4 houses', stand: 'ward houses' },
    { id: 'ward-4', name: 'WARD 4 — LIVING EDGES', at: [-925, -790], surface: '2 gate houses', stand: 'ward houses' },
    { id: 'ward-5', name: 'WARD 5 — QUIET PRECISION', at: [-848, -985], surface: '2 houses', stand: 'ward houses' },
    { id: 'ward-6', name: 'WARD 6 — SOUTH CONNECTION', at: [-1126, -572], surface: 'the south ward path', stand: 'wards' },
    { id: 'ward-7', name: 'WARD 7 — SOUTHERN LANDSCAPE', at: [-1190, -384], surface: 'the southern path', stand: 'wards' },
    { id: 'skyway-deck', name: 'THE SKYWAY ISLAND', at: [-900, -760], surface: 'deck 48.000', stand: 'skyward contains()' },
    { id: 'jubilee-shoulder', name: 'JUBILEE — SHOULDER MOUTH', at: [-843, -705], surface: 'disc 15.70', stand: 'jubilee disc' },
    { id: 'jubilee-roadend', name: "JUBILEE — ROAD'S-END MOUTH", at: [-1158, -510], surface: 'disc 9.25', stand: 'jubilee disc' },
    { id: 'ancestors-homes', name: "THE ANCESTORS' HOMES", at: [0, -1600], surface: 'the ancestral roads', stand: 'mountain homes' },
    { id: 'village-mauna', name: 'KAUHALE MAUNA', at: [2000, 2000], surface: 'the village roads', stand: 'village' },
    { id: 'the-bore', name: 'THE BORE — THE MOUTH', at: [2000, 1880], surface: 'the tunnel floor', stand: 'tunnel bore' },
    { id: 'octa-terrace', name: 'THE OCTAHEDRON POOL TERRACE', at: [-420, 860], surface: 'the terrace', stand: 'octa pool' },
    { id: 'spaceport', name: 'THE ORBITAL SPACEPORT', at: [-380, 330], surface: 'the pad', stand: 'ground' }
  ];
  var EDGES = [
    { a: 'first-city-podium', b: 'south-lot', kind