<!-- SOLID CITY · part 1987 -->
 M.park.x, z - M.park.z) < 3.4) return { kind: 'fleet', label: '🛹 RIDE THE HOVER BOARD' };
  return null;
}
function act() {
  if (M.riding) { stepOff(); return; }
  if (M.state !== 'ready' || !M.craft) return;
  if (Math.hypot(S.p.x - M.park.x, S.p.z - M.park.z) > 3.6) return;
  /* ADMISSION FIRST (the Rung 2 law): the ride begins, THEN the parked solid lifts. */
  M.craft.pos.x = M.park.x; M.craft.pos.z = M.park.z;
  M.craft.pos.y = supportHere(M.park.x, M.park.z) + 0.08;
  M.craft.yaw = M.park.yaw; M.craft.vx = 0; M.craft.vz = 0; M.craft.vy = 0; M.craft.mode = 'RIDE';
  M.riding = true;
  removeParkSolid();
  hopButton();
  A.help('🛹 THE HOVER BOARD — push the stick and she glides; she feeds herself under 6 m/s, carves with the stick, and HOP lifts her. Downhill is free speed. The action button steps you off.', 9);
}
function stepOff() {
  var c = M.craft; if (!c) return;
  var rx = Math.cos(c.yaw), rz = -Math.sin(c.yaw); // the board's right hand
  var sides = [[-rx, -rz], [rx, rz]];              // left first — the city's habit
  for (var i = 0; i < 2; i++) {
    var tx = c.pos.x + sides[i][0] * 1.15, tz = c.pos.z + sides[i][1] * 1.15;
    var gy = A.standingAt(tx, tz, c.pos.y);
    if (!isFinite(gy) || gy < c.pos.y - 1.28 || gy > c.pos.y + 1.6) continue;
    var blocked = false;
    for (var k = 0; k < A.solids.length; k++) {
      var s = A.solids[k];
      if (gy + 1 < s.y0 - 0.5 || gy + 1 > s.y1) continue;
      if (tx > s.x0 - 0.45 && tx < s.x1 + 0.45 && tz > s.z0 - 0.45 && tz < s.z1 + 0.45) { blocked = true; break; }
    }
    if (blocked) continue;
    S.p.x = tx; S.p.z = tz; S.p.y = gy;
    M.park.x = c.pos.x; M.park.z = c.pos.z; M.park.yaw = c.yaw;
    M.riding = false;
    addParkSolid();
    if (M.hopBtn) M.hopBtn.style.display = 'none';
    A.help('You step off. The board waits where you left her.', 5);
    return;
  }
  A.help('No room to step off here — glide somewhere clearer.', 5);
}
function active() { return M.riding; }
function stepDrive(dt) {
  if (!M.riding || !M.clock) return;
  var inp = A.input || {}, k = inp.keys || {};
  var sx = inp.sx || 0, sy = inp.sy || 0;
  if (k.KeyW || k.ArrowUp) sy -= 1; if (k.KeyS || k.ArrowDown) sy += 1;
  if (k.KeyA || k.ArrowLeft) sx -= 1; if (k.KeyD || k.ArrowRight) sx += 1;
  sx = Math.max(-1, Math.min(1, sx)); sy = Math.max(-1, Math.min(1, sy));
  var jump = M.jumpQ || !!k.Space; M.jumpQ = false;
  M.clock(dt, { x: -sx, y: -sy, jump: jump });
  var c = M.craft;
  S.p.x = c.pos.x; S.p.z = c.pos.z; S.p.face = c.yaw;
}
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') return;
  M.t += dt;
  var c = M.craft;
  if (M.riding && c) {
    S.p.y = c.pos.y + 0.10; // re-asserted after the walk tail's ease: the rider stands ON the deck
    M.boardMesh.position.set(c.pos.x, c.pos.y - 0.03, c.pos.z);
    M.boardMesh.rotation.set(0, c.yaw, c.roll || 0);
    if (M.hopBtn) M.hopBtn.style.display = 'block';
    var dHome = Math.hypot(S.p.x - HOME.x, S.p.z - HOME.z);
    if (!M.said && dHome > 30) { M.said = true; } // the narration is the mounting word; nothing more to say
  } else if (M.boardMesh) {
    var py = supportHere(M.park.x, M.park.z);
    M.boardMesh.position.set(M.park.x, py + 0.30 + Math.sin(M.t * 1.7) * 0.05, M.park.z);
    M.boardMesh.rotation.set(0, M.park.yaw, Math.sin(M.t * 0.9) * 0.03);
    if (M.hopBtn) M.hopBtn.style.display = 'none';
    var dx = S.p.x - HOME.x, dz = S.p.z - HOME.z;
    if (!M.said && dx * dx + dz * dz < 26 * 26) {
      M.said = true;
      A.help('🛹 THE HOVER BOARD waits at the spaceport — the first of the futuristic fleet. Walk up and ride her.', 8);
    } else if (dx * dx + dz * dz > 40 * 40) M.said = false;
  }
  if (M.rack && M.rack.userData.parts && M.rack.userData.parts.jewel) {
    M.rack.userData.parts.jewel.rotation.y += dt * 1.4;
  }
}
function radar(rg, blip, flying) {
  if (M.state !== 'ready') return;
  blip(M.park.x, M.park.z, '#2affd8', flying ? 3 : 6, flying ? '' : 'HOVER BOARD');
}
window.CityFleet = { update: update, radar: radar, actHere: actHere, act: act, active: active, stepDrive: stepDrive, pos: HOME, state: function () { return M.state; } };
})();


===== FILE: public/city/fleet-place.js.bak-ship-20261013 =====
/* ------------------------------------------------------------------
 * An epistle of placement, from Solid.
 *
 * Dear board,
 *
 * You wait at the Orbital Spaceport's apron, north-east of the pad
 * (-340, 292), on flat capital ground — the first of the futuristic
 * fleet the King declared from the research: the skateboard's soul,
 * taught to hover. Your physics is VECTOR's hover-board controller,
 * unmodified, thinking over the city's own standing fabric through
 * the adapter in fleet.js. I add only what a placer owes: a rack to
 * wait on, a name on the radar, a door in and a door out.
 *
 * The doors follow the law the cars learned o