<!-- SOLID CITY · part 2459 -->
ll, membrane hangs down
    J.lids = [];
    [1, -1].forEach(function (sd) {
      var lidG = new THREE.Group();
      lidG.position.set(sd * P.headRad * 0.72, P.headRad * 0.38, P.headRad * 0.42);
      var lidM = mesh(SPHERE(), mat(C.head), 0, -P.headRad * 0.30, P.headRad * 0.05);
      lidM.scale.set(P.headRad * 0.30, P.headRad * 0.62, P.headRad * 0.30);
      lidG.add(lidM);
      J.head.add(lidG);
      J.lids.push(lidG); hi.push(lidG);
    });
    // toe claws — small dark cones at the toe tips
    [J.legL, J.legR].forEach(function (L) {
      for (var tI = -1; tI <= 1; tI++) {
        var claw = plume(L.foot, 0x2e2a24, tI * 0.012, 0.002, P.bodyLen * 0.30, 0.006, 0.016, 0.006, Math.PI / 2 - 0.35, tI * 0.38, 0);
        hi.push(claw);
      }
    });
    if (sp.id === 'carolina-parakeet') {
      // primary feather fans at the wrists (mid)
      [1, -1].forEach(function (sd) {
        var W = sd > 0 ? J.wingL : J.wingR;
        var outerLen = sp.size.wingspanM * 0.24;
        for (i = 0; i < 5; i++) {
          var pf = plume(W.wrist, i % 2 ? C.wingTip : C.wing,
            sd * (outerLen * 0.75 + i * 0.016), -0.002, -0.035 - i * 0.024,
            0.030, 0.105 - i * 0.008, 0.005, 0, sd * (0.06 + i * 0.09), sd * -Math.PI / 2);
          mid.push(pf);
        }
        // covert rows over the inner wing (hi)
        for (var r = 0; r < 2; r++) for (var c = 0; c < 4; c++) {
          var cv = plume(W.shoulder, r ? C.wing : C.belly,
            sd * (0.03 + c * 0.032), 0.008 + r * 0.004, -0.005 - r * 0.038,
            0.034, 0.055, 0.006, -0.25, 0, sd * -Math.PI / 2);
          hi.push(cv);
        }
        // yellow-green shoulder patch (documented marking) (mid)
        var patch = mesh(SPHERE(), mat(0xa8c256), sd * P.bodyRad * 1.05, P.bodyRad * 1.02, P.bodyLen * 0.18);
        patch.scale.set(0.016, 0.030, 0.045);
        J.body.add(patch); mid.push(patch);
      });
      // tail fan: side feathers around the central streamer (mid)
      [-2, -1, 1, 2].forEach(function (k) {
        var tf = plume(J.tail, C.tail, k * 0.009, -0.006, -P.tailLen * (0.44 - Math.abs(k) * 0.03),
          0.020, P.tailLen * (0.92 - Math.abs(k) * 0.07), 0.005, -Math.PI / 2 + 0.18, k * 0.05, 0);
        mid.push(tf);
      });
      // breast scallops (hi)
      for (var r2 = 0; r2 < 3; r2++) for (var c2 = -2; c2 <= 2; c2++) {
        var sc = mesh(SPHERE(), mat(r2 % 2 ? C.belly : C.body), c2 * 0.020, P.bodyRad * (0.30 - r2 * 0.22), P.bodyLen * (0.34 - r2 * 0.03));
        sc.scale.set(0.013, 0.010, 0.008);
        J.body.add(sc); hi.push(sc);
      }
    } else if (sp.id === 'dodo') {
      // neck ruff of loose feathers (mid)
      for (i = 0; i < 7; i++) {
        var a = (i / 7) * Math.PI * 2;
        var rf = plume(J.neck, C.belly, Math.cos(a) * P.headRad * 0.62, -P.headRad * 0.15, Math.sin(a) * P.headRad * 0.62,
          0.045, 0.075, 0.012, Math.PI / 2 + 0.4, 0, a);
        mid.push(rf);
      }
      // bill ridge + nostril swell (hi)
      var ridge = mesh(BOX(), mat(0x776d60), 0, P.headRad * 0.34, P.billLen * 0.28);
      ridge.scale.set(P.headRad * 0.30, P.headRad * 0.16, P.billLen * 0.42);
      J.head.add(ridge); hi.push(ridge);
      // feather edging along the tucked wings (mid)
      [1, -1].forEach(function (sd) {
        for (var wI = 0; wI < 4; wI++) {
          var wf = plume(J.body, C.wingTip, sd * P.bodyRad * 1.48, P.bodyRad * (0.42 - wI * 0.02), -P.bodyLen * (0.02 + wI * 0.055),
            0.030, 0.075, 0.010, 0.5, 0, sd * 0.5);
          mid.push(wf);
        }
      });
      // breast scallops, coarse (hi)
      for (var r3 = 0; r3 < 2; r3++) for (var c3 = -1; c3 <= 1; c3++) {
        var sc3 = mesh(SPHERE(), mat(r3 ? C.belly : C.body), c3 * 0.07, P.bodyRad * (0.25 - r3 * 0.25), P.bodyLen * 0.30);
        sc3.scale.set(0.045, 0.035, 0.03);
        J.body.add(sc3); hi.push(sc3);
      }
    }
    bird.detail = { hi: hi, mid: mid };
    bird.setLOD(bird.lodLevel != null ? bird.lodLevel : 2);
    return bird.detail;
  }

  return {
    clamp: clamp, lerp: lerp, ease: ease, angDiff: angDiff, angLerp: angLerp, mulberry32: mulberry32,
    SpatialWorld: SpatialWorld, createHabitatWorld: createHabitatWorld,
    buildBirdModel: buildBirdModel, buildDetailHi: buildDetailHi, lodForDistance: lodForDistance,
    AnimationController: AnimationController, LocomotionController: LocomotionController,
    BehaviorController: BehaviorController, BirdEntity: BirdEntity, Observation: Observation,
    PARAKEET_FSM: PARAKEET_FSM, DODO_FSM: DODO_FSM
  };
});


===== FILE: public/city/lost-wings/lost-wings-grove.js =====
/* Solid City — LOST WINGS GROVE (public/city/lost-wings/lost-wings-grove.js)
 * The reference habitat of Operation Lost Wings, living IN the world by order
 * of the King ("build it in truth and light"): a leveled grove clearing on the
 * coastal bench south-west of the capital. Two birds the world lost — the
 * Carolina Parakeet and the Dodo — live here under the shared 