<!-- SOLID CITY · part 2464 -->
8cfb8,
        beak: 0x5d564e, legs: 0xb09a58, eye: 0x1a1512
      },
      proportions: { bodyLen: 0.52, bodyRad: 0.27, headRad: 0.105, tailLen: 0.10, legLen: 0.42, billLen: 0.20 },
      flight: null,
      ground: { walkSpeed: 0.55, hurrySpeed: 1.35, strideLengthM: 0.34, turnRateRad: 1.5 },
      surfaceSuitability: {
        minRadiusM: 0.45, maxSlopeDeg: 6, gripFeet: false,
        kinds: { branch: 0.0, rock: 0.15, rooftop: 0.0, ledge: 0.0, railing: 0.0, glass: 0.0, ground: 1.0 }
      },
      behavior: { fleeDistanceM: 1.3, alertDistanceM: 3.4, curiosity: 0.35, restlessness: 0.3, sociality: 0.25, decisionIntervalS: 3.5 },
      descriptions: {
        REST: [
          'The heavy-bodied bird stands at rest, its small wings tucked against its sides. It turns its great hooked bill slowly, inspecting its surroundings with an islander\u2019s patience.',
          'The dodo stands settled over its strong yellow legs, body still, breathing slow. Nothing in its world has ever required hurry.'
        ],
        WALK: [
          'The dodo advances with measured, alternating steps. Its body rocks subtly as the weight passes from one foot to the other. The small wings remain tucked against its sides.',
          'Step by deliberate step, the dodo walks — each scaly foot placed flat before the weight follows, the whole body swaying like a slow pendulum.'
        ],
        FORAGE: [
          'The dodo lowers its head and probes the ground with its hooked bill, shuffling forward a step at a time, searching for fallen fruit and seeds.'
        ],
        TURN: [
          'The dodo turns in place with small, careful steps, repositioning its bulk before setting off in the new direction.'
        ],
        ALERT: [
          'The dodo raises its head and stands very still, watching. Birds that evolved without predators are slow to fear — but it is watching, all the same.'
        ],
        HURRY: [
          'Disturbed, the dodo hurries away with quick rocking strides — as fast as a flightless bird can go. It will never fly; there is nowhere in its body for flight to come from.'
        ]
      }
    }
  };

  return {
    EVIDENCE: EVIDENCE,
    schemaVersion: 1,
    species: species,
    get: function (id) {
      var s = species[id];
      if (!s) throw new Error('Unknown species: ' + id);
      return s;
    },
    list: function () { return Object.keys(species); }
  };
});


===== FILE: public/city/monument-fallen.js =====
/* SOLID CITY — MONUMENT TO THE FALLEN WORLDS (2026-10-09)
 * Ordered by the King, 9 October 2026, 11:14 PM HST.
 * The nine worlds taken by the Twin Lightnings: /saga, /saga-solid, /saga-staging, /ruby, /ruby2,
 * /live, /playaspace, /playa, /soluv. They stay shut down; this only remembers them.
 *
 * A self-contained ES module. No downloads: canvas textures, merged geometry (6 draw calls).
 * City units are metres (avatar ~1.56 m, CITY_Y = 22). Height ~73 m to the gold apex.
 * THE LAW: every piece is at least 0.13 on its smallest side (see userData.pieces / checkLaw()).
 * Local frame: ground at y = 0, the front (stele + gate) faces +Z.
 *
 *   import { createFallenWorldsMonument } from '/city/monument-fallen.js';
 *   world.add(createFallenWorldsMonument({ THREE, curve, position: {x, y, z}, rotationY }));
 *
 * Collision, radar, no-build zone and tour stop are left to the city (Playa 2.0).
 * userData.footprint gives the solid boxes in local coords if wanted.
 */

export const FALLEN_WORLDS = ['/saga', '/saga-solid', '/saga-staging', '/ruby', '/ruby2', '/live', '/playaspace', '/playa', '/soluv'];
export const MINIMUM = 0.13;

const C = { black: 0x0d0b0e, stone: 0x17121a, gold: 0xc99a3a, goldGlow: 0xffd27a, red: 0xff2a40, redDim: 0x5a0410 };

function canvasTex(THREE, w, h, draw) {
  const c = document.createElement('canvas'); c.width = w; c.height = h; draw(c.getContext('2d'), w, h);
  const t = new THREE.CanvasTexture(c); t.encoding = THREE.sRGBEncoding; t.anisotropy = 4;
  return t;
}
function fitFont(g, text, weight, size, family, maxW) {
  let s = size; g.font = weight + ' ' + s + 'px ' + family;
  while (g.measureText(text).width > maxW && s > 8) { s -= 2; g.font = weight + ' ' + s + 'px ' + family; }
  return s;
}
const SERIF = 'Georgia, "Times New Roman", serif';

/* the stele: title, plaque line, the nine names, the King's order */
function steleTexture(THREE) {
  return canvasTex(THREE, 1024, 1024, function (g, W, H) {
    g.fillStyle = '#0b080c'; g.fillRect(0, 0, W, H);
    g.strokeStyle = '#c99a3a'; g.lineWidth = 14; g.strokeRect(18, 18, W - 36, H - 36);
    g.strokeStyle = '#7a1420'; g.lineWidth = 4; g.strokeRect(44, 44, W - 88, H - 88);
    g.textAlign = 'center'; g.textBaseline = 'middle';
    g.fillStyle = '#e8c36a'; fitFont(g, 'THE FALLEN WORLDS', '700', 104, SERIF, W - 140); g.fillText('THE FALLEN WORLDS', W / 2, 140);
    g.fillStyle = '#ff4d5e'; fitFont(g, 'taken by the Twin Lightnings', 'italic 400', 58, SERIF, W - 160); g.fillText