<!-- SOLID CITY · part 3198 -->
'+s.gens+' / 4</b><span class="label">Generators</span></div><div class="stat"><span class="label">Phase 3</span><b>'+s.core+' / 1</b><span class="label">Core</span></div><div class="stat"><span class="label">Current</span><b>'+s.phase+' / 3</b><span class="label">Assault phase</span></div></div><p style="line-height:1.6;color:var(--muted);font-size:12px">Claiming one command never interrupts the others. AI admirals continue their work, while the claimed station rejects every command from its previous ownership epoch. Advisories remain visible but can never actuate your station.</p>';}
    if(which==='stats'){title.textContent='Event-Derived STATS';c.innerHTML='<div class="stats-grid"><div class="stat"><span class="label">Human destroys</span><b>'+s.humanKills+'</b></div><div class="stat"><span class="label">AI destroys</span><b>'+s.aiKills+'</b></div><div class="stat"><span class="label">Bombard hits</span><b>'+s.hits+'</b></div><div class="stat"><span class="label">Wing losses</span><b>'+s.losses+'</b></div><div class="stat"><span class="label">Handoffs</span><b>'+s.handoffs+'</b></div><div class="stat"><span class="label">Mean handoff</span><b>'+s.avgLatency.toFixed(2)+'</b><span class="label">milliseconds</span></div><div class="stat"><span class="label">Stale rejected</span><b>'+s.rejected+'</b></div><div class="stat"><span class="label">PD intercepts</span><b>'+s.intercepts+'</b></div><div class="stat"><span class="label">Measured render</span><b>'+(state?state.fps.toFixed(0):0)+'</b><span class="label">frames / second</span></div><div class="stat"><span class="label">Recorded events</span><b>'+s.events+'</b></div></div><p style="font-size:10px;color:var(--muted);line-height:1.5">All totals above are reduced from this session’s recorded events. Handoff latency is measured locally from claim input to committed ownership. No values persist after reload.</p>';}
    if(which==='events'){title.textContent='Coordination Events';var list=events.slice().reverse().slice(0,80).map(function(e){var detail=Object.keys(e).filter(function(k){return !['id','type','t','at','message'].includes(k)}).map(function(k){return k+': '+(typeof e[k]==='number'?Math.round(e[k]*100)/100:e[k])}).join(' · ');return '<div class="event"><span>'+fmt(e.t)+'</span><b>'+e.type.replaceAll('_',' ')+'</b><span>'+detail+'</span></div>'}).join('');c.innerHTML='<div class="event-list">'+(list||'<p>No events recorded yet.</p>')+'</div>';}}
  function endGame(won){if(!state.running)return;state.running=false;state.paused=false;state.ended=true;state.won=won;record(won?'SIEGE_WON':'SIEGE_LOST',{duration:state.time});document.getElementById('pauseGame').classList.add('hidden');document.getElementById('pauseOverlay').classList.add('hidden');var s=derived(),ov=document.getElementById('ending');document.getElementById('endEyebrow').textContent=won?'SIEGE COMPLETE':'FLEET WITHDRAWAL';document.getElementById('endTitle').innerHTML=won?'FORTRESS<br>BREACHED.':'ASSAULT<br>BROKEN.';document.getElementById('endCopy').textContent=(won?'Kheiron is open. ':'The fortress held. ')+'You completed '+Math.max(0,state.phase)+' full phases, recorded '+s.handoffs+' command handoffs, '+s.hits+' bombardment hits, and '+s.intercepts+' point-defense intercepts in '+fmt(state.time)+'.';ov.classList.remove('hidden');}
  canvas.addEventListener('pointerdown',function(e){if(!state||!state.running)return;var r=canvas.getBoundingClientRect(),x=(e.clientX-r.left)/r.width,y=(e.clientY-r.top)/r.height,best=null,dist=.08;state.targets.forEach(function(t){if(!t.alive)return;var d=Math.hypot(t.x-x,(t.y-y)*H/W);if(d<dist){dist=d;best=t}});if(best&&(tasks.bombard.owner==='HUMAN'||tasks.wings.owner==='HUMAN')){selectedTarget=best;state.lastInput=state.time;record('TARGET_DESIGNATED',{owner:'HUMAN',target:best.type,id:best.id});advise(best.type.toUpperCase()+' designated. Weapons await your command.');}});
  document.addEventListener('click',function(e){var b=e.target.closest('button');if(!b)return;if(b.dataset.task)claim(b.dataset.task);if(b.dataset.move){var v=b.dataset.move.split(',').map(Number);humanMove(v[0],v[1]);}if(b.dataset.action==='fire')fireBombard('HUMAN');if(b.dataset.action==='strike')strikeWings('HUMAN');if(b.dataset.action==='formation')toggleFormation();if(b.dataset.action==='aegis')aegisAction();if(b.dataset.drawer)openDrawer(b.dataset.drawer);});
  document.querySelector('.close').addEventListener('click',function(){document.getElementById('drawer').classList.remove('open');document.querySelectorAll('.tab').forEach(function(b){b.classList.remove('active')})});
  document.getElementById('begin').addEventListener('click',startGame);document.getElementById('pauseGame').addEventListener('click',pauseGame);document.getElementById('resumeGame').addEventListener('click',resumeGame);document.getElementById('restart').addEventListener('click',startGame);document.getElementById('endStats').addEventListener('click',function(){document.getElement