<!-- SOLID CITY · part 2462 -->
 var dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
      b.setLOD(Eng.lodForDistance(dist / lensZoom));
    }
  }

  group.userData = {
    update: update,
    birds: birds, world: world,
    setLens: function (z) { lensZoom = Math.max(1, Math.min(20, z || 1)); },
    standFloors: [{ cx: -3.5, cz: -10.5, r: 1.9, y: 0.38 }],
    footprint: [
      [8, -6, 1.0, 1.0, 0, 4.6, 0], [0, 2, 1.9, 1.9, 0, 3.42, 0],
      [-9, 8.75, 14.6, 0.5, 0, 5.2, 0], [-9, 13.25, 14.6, 0.5, 0, 5.2, 0],
      [-16.25, 11, 0.5, 5.0, 0, 5.2, 0], [-1.75, 11, 0.5, 5.0, 0, 5.2, 0],
      [-10, -8, 0.44, 0.44, 0, 3.12, 0],
      [-9.0, -8.1, 0.18, 0.18, 0, 2.5, 0], [-6.0, -8.1, 0.18, 0.18, 0, 2.5, 0],
      [-9.0, -5.9, 0.18, 0.18, 0, 2.5, 0], [-6.0, -5.9, 0.18, 0.18, 0, 2.5, 0],
      [30, -20, 0.85, 0.85, 0, 3.4, 0], [-26, -24, 0.85, 0.85, 0, 3.4, 0],
      [-33, 12, 0.85, 0.85, 0, 3.4, 0], [24, 26, 0.85, 0.85, 0, 3.4, 0], [4, 35, 0.85, 0.85, 0, 3.4, 0]
    ]
  };
  return group;
}

export default createGrove;


===== FILE: public/city/lost-wings/species-registry.js =====
/* OPERATION LOST WINGS — Species Registry
 * Part VII module: SpeciesRegistry. Data-driven species definitions.
 * Every trait carries an evidence class: DOCUMENTED | INFERRED | SPECULATIVE.
 * No live internet is needed at runtime; this file IS the catalog.
 * UMD: browser global (LostWings.Registry) + Node require for headless tests.
 */
(function (root, factory) {
  var api = factory();
  if (typeof module !== 'undefined' && module.exports) module.exports = api;
  root.LostWings = root.LostWings || {};
  root.LostWings.Registry = api;
})(typeof self !== 'undefined' ? self : this, function () {
  'use strict';

  var EVIDENCE = { DOCUMENTED: 'DOCUMENTED', INFERRED: 'INFERRED', SPECULATIVE: 'SPECULATIVE' };

  /* Schema (v1):
   * id, commonName, scientificName, family, extinctYear, lastRecordNote,
   * evidence: { traitName: {class, note} },
   * size: { lengthM, heightM, wingspanM, massKg },
   * capabilities: { canFly, canPerch, canSwim, canDive, gait: 'walk'|'hop'|'stride',
   *                 flightStyle: 'flap-glide'|'soar'|'burst'|null },
   * colors: { body, belly, head, face, wing, wingTip, tail, beak, legs, eye },
   * proportions: model knobs consumed by the shared model factory,
   * flight: { cruiseSpeed, maxSpeed, approachSpeed, wingbeatHz, turnRateRad,
   *           maxBankRad, glideSinkMps, climbRateMps } | null  (null = flightless),
   * ground: { walkSpeed, hurrySpeed, strideLengthM, turnRateRad },
   * surfaceSuitability: { minRadiusM, maxSlopeDeg, gripFeet,
   *           kinds: { branch, rock, rooftop, ledge, railing, glass, ground } 0..1 },
   * behavior: { fleeDistanceM, alertDistanceM, curiosity, restlessness,
   *             sociality, decisionIntervalS },
   * descriptions: { STATE: [variant, ...] } — must match live sim states.
   */
  var species = {

    'carolina-parakeet': {
      id: 'carolina-parakeet',
      commonName: 'Carolina Parakeet',
      scientificName: 'Conuropsis carolinensis',
      family: 'Psittacidae (true parrots)',
      extinctYear: 1918,
      lastRecordNote: 'Last captive bird, Incas, died at Cincinnati Zoo in 1918; unconfirmed wild reports into the 1930s.',
      evidence: {
        identity:   { 'class': 'DOCUMENTED', note: 'The only parrot species native to the eastern United States.' },
        coloration: { 'class': 'DOCUMENTED', note: 'Green body, yellow head, orange face — from museum specimens and Audubon-era plates.' },
        size:       { 'class': 'DOCUMENTED', note: '~30-35 cm length incl. long tail, wingspan ~55 cm, from specimens.' },
        flight:     { 'class': 'INFERRED',   note: 'Described historically as swift and direct; flap-glide pattern inferred from living conures of similar build.' },
        gait:       { 'class': 'INFERRED',   note: 'Ground movement (sidling walk, short hops) inferred from living Aratinga conures.' },
        behavior:   { 'class': 'DOCUMENTED', note: 'Strongly social; historical accounts describe large, noisy flocks and birds returning to fallen flockmates.' },
        vocalization:{ 'class': 'SPECULATIVE', note: 'No recording exists (extinct before audio recording of the species). This simulation is silent rather than inventing a call.' }
      },
      size: { lengthM: 0.33, heightM: 0.14, wingspanM: 0.55, massKg: 0.28 },
      capabilities: { canFly: true, canPerch: true, canSwim: false, canDive: false, gait: 'hop', flightStyle: 'flap-glide' },
      colors: {
        body: 0x58a83c, belly: 0x7cc24f, head: 0xf2c230, face: 0xe86f1e,
        wing: 0x479233, wingTip: 0x2f6e2c, tail: 0x3f8f4f,
        beak: 0xe9dfc8, legs: 0x9a8a70, eye: 0x14100c
      },
      proportions: { bodyLen: 0.17, bodyRad: 0.052, headRad: 0.034, tailLen: 0.17, legLen: 0.075, billLen: 0.022 },
      flight: {
        cruiseSpeed: 10.5, maxSpeed: 14, approachSpeed: 3.2,
        wingbeatHz: 8.5, turnRateRad: 2.4, maxBankRad: 0.95,
        glideSinkMps: 0.9,