<!-- SOLID CITY · part 2916 -->

        {id:'Morrow',x:555,y:410,hp:88,status:'adrift',stabilize:0,story:'Survey pilot Morrow · hull breach'},
        {id:'Kite',x:735,y:190,hp:74,status:'adrift',stabilize:0,story:'Courier Kite · power failing'}
      ],
      hazards:[{x:305,y:360,r:58,spin:0},{x:505,y:235,r:47,spin:1.7},{x:700,y:365,r:52,spin:2.4}],
      debris:Array.from({length:20},(_,i)=>({x:230+(i*197)%590,y:75+(i*83)%450,r:4+(i%5)*2,vx:-2+(i%4),vy:-1+(i%3)})),
      enemies:[],shots:[],rescued:0,lost:0,risk:0,missionEnd:false,extractHeld:false,stabilizeHeld:false,keys:{},
      advisory:'Corridor scan complete. Three life signs located.'
    });
    events=[]; elapsed=0; spawnTimer=0; finishTimer=0;
    coordination=new ControlCoordination(['navigation','extraction','protection','support'],recordEvent);
    updateStations(); updateUI(); renderLog();
  }

  function recordEvent(type,data={}){
    const ev={type,data,t:elapsed,real:performance.now()}; events.push(ev);
    if(events.length>250)events.shift();
    if(type==='handoff'){
      const n=data.to==='human'?'You claimed '+pretty(data.task):'AI resumed '+pretty(data.task);
      showToast(n+' · epoch '+data.epoch); updateStations();
    }
    if(type==='rescue') showToast(data.pod+' is safe inside the rescue gate.');
    if(type==='lost') showToast('Pod '+data.pod+' was lost.');
    renderLog(); updateStats();
  }
  function pretty(s){return s.charAt(0).toUpperCase()+s.slice(1)}
  function showToast(text){const el=$('#toast');el.textContent=text;el.classList.add('show');clearTimeout(toastTimer);toastTimer=setTimeout(()=>el.classList.remove('show'),1800)}
  function setAdvice(text){state.advisory=text;$('#advisory').innerHTML='<strong>AI crew</strong> '+text}

  function updateStations(){
    if(!coordination)return;
    let humans=0;
    $$('.station').forEach(btn=>{
      const task=btn.dataset.task,t=coordination.tasks[task];btn.dataset.owner=t.owner;
      btn.querySelector('.epoch').textContent='E'+t.epoch;
      btn.querySelector('.owner').textContent=t.owner==='human'?'You hold':'AI '+({navigation:'pilot',extraction:'operator',protection:'gunner',support:'engineer'}[task]);
      if(t.owner==='human')humans++;
    });
    $('#crewSplit').textContent=humans+' human · '+(4-humans)+' AI';
    const claimed=$$('.station[data-owner="human"]').map(x=>x.dataset.task);
    $$('.control-group').forEach(g=>g.classList.toggle('active',claimed.includes(g.dataset.controls)));
    $('#controlEmpty').style.display=claimed.length?'none':'block';
  }

  $$('.station').forEach(btn=>btn.addEventListener('click',()=>{
    const task=btn.dataset.task,t=coordination.tasks[task];
    if(t.owner==='ai')coordination.claim(task,'human');else coordination.release(task);
  }));

  function issue(task,owner,action,fn){
    const t=coordination.tasks[task];
    if(coordination.command(task,owner,t.epoch,action+':'+Math.floor(elapsed*10))){fn();return true}return false;
  }
  function humanAction(task,action,fn){if(coordination.owner(task)!=='human'){showToast('Claim '+pretty(task)+' first.');return}issue(task,'human',action,fn)}

  function dist(a,b){return Math.hypot(a.x-b.x,a.y-b.y)}
  function nearestPod(){return state.pods.filter(p=>p.status==='adrift').sort((a,b)=>dist(state.ship,a)-dist(state.ship,b))[0]||null}
  function nearestEnemy(){return state.enemies.filter(e=>e.hp>0).sort((a,b)=>dist(state.ship,a)-dist(state.ship,b))[0]||null}

  function update(dt){
    if(!running||state.missionEnd)return;
    elapsed+=dt; adviceTimer-=dt; spawnTimer-=dt;
    const s=state.ship;
    Object.keys(s).forEach(()=>{});
    updateNavigation(dt); updateExtraction(dt); updateProtection(dt); updateSupport(dt);
    s.x=Math.max(38,Math.min(W-34,s.x+s.vx*dt));s.y=Math.max(55,Math.min(H-35,s.y+s.vy*dt));
    s.vx*=Math.pow(.1,dt);s.vy*=Math.pow(.1,dt);if(Math.hypot(s.vx,s.vy)>3)s.angle=Math.atan2(s.vy,s.vx);
    s.fireCd=Math.max(0,s.fireCd-dt);s.repairCd=Math.max(0,s.repairCd-dt);s.pulse=Math.max(0,s.pulse-dt);
    s.shield=Math.min(100,s.shield+dt*(coordination.owner('protection')==='ai'?3.6:1.5));
    updateWorld(dt); updateRisk(dt); checkEnd(); updateUI();
  }

  function updateNavigation(dt){
    const s=state.ship;
    if(coordination.owner('navigation')==='human'){
      let ax=0,ay=0;const k=state.keys;if(k.left||k.a)ax--;if(k.right||k.d)ax++;if(k.up||k.w)ay--;if(k.down||k.s)ay++;const power=k.boost?155:105;s.vx+=ax*power*dt;s.vy+=ay*power*dt;
    } else {
      let target;
      if(s.cargo)target=state.gate;else target=nearestPod()||state.gate;
      const dx=target.x-s.x,dy=target.y-s.y,d=Math.max(1,Math.hypot(dx,dy));
      const stop=d<75?0.25:1;s.vx+=dx/d*72*dt*stop;s.vy+=dy/d*72*dt*stop;
      state.hazards.forEach(h=>{const hd=dist(s,h);if(hd<h.r+70){s.vx+=(s.x-h.x)/hd*145*dt;s.vy+=(s.y-h.y)/hd*145*dt}});
    }
  }

  function updateExtraction(dt){
    const p=nearestPod();if(!p||state.ship.cargo)return;
    const d=dist(state.ship,p),owner=coordination.owner('ext