<!-- SOLID CITY · part 1874 -->
sm.winUntil){
        sm.winHits[owner]=true;burst(e.x,e.y,ships[owner].color,8);
        if(sm.winHits[0]&&sm.winHits[1]){
          sm.finalHits++;sm.winHits=[false,false];sm.winUntil=0;sm.winT=PHI2;
          burst(e.x,e.y,'#fff2a8',40);burst(e.x,e.y,'#ffc84a',24);burst(e.x,e.y,'#44e1d0',24);
          notify(0,'DOUBLE STRIKE · '+sm.finalHits+' / 3',1200);notify(1,'DOUBLE STRIKE · '+sm.finalHits+' / 3',1200);
          ships[0].score+=150;ships[1].score+=150;
          logH('summit · double strike '+sm.finalHits+' / 3');
          if(sm.finalHits>=3)showSummitChoice();
        }
      }else burst(e.x,e.y,'#8a93a3',4);
    }else{
      if(now>sm.reflectNotice){sm.reflectNotice=now+1200;notify(0,'SEALED · BREAK THE PAIRS',900);notify(1,'SEALED · BREAK THE PAIRS',900)}
      burst(e.x,e.y,'#ffffff',5);
    }
  }
  function enterFinal(){
    var sm=progression.summit;sm.phase='final';sm.winT=1.4;sm.winUntil=0;sm.winHits=[false,false];
    enemies.forEach(function(e){if(e.pairId){e.enraged=false;e.mateFuse=0}});
    burst(sm.prime.x,sm.prime.y,'#fff2a8',60);burst(sm.prime.x,sm.prime.y,'#44e1d0',40);
    notify(0,'THE HEART IS BARE',1400);notify(1,'THE HEART IS BARE',1400);
    logH('summit · the Prime divided · the heart is bare');
  }
  function updateSummit(dt){
    var sm=progression.summit,now=performance.now(),cx=1200,cy=800;
    enemies.forEach(function(e){
      if(e.pairId&&e.mateFuse&&!e.enraged&&e.hull>0&&now>e.mateFuse){
        e.enraged=true;e.mateFuse=0;
        notify(0,'ASYMMETRY',800);notify(1,'ASYMMETRY',800);
        burst(e.x,e.y,'#ff5b66',14);logH('summit · a half remembers · enraged');
      }
    });
    if(sm.phase==='pairs'){
      var alive=enemies.filter(function(o){return o.pairId&&o.hull>0&&!o.pairDone}).length;
      if(sm.spawnedPairs<6&&alive<=1)spawnSummitPairs(2);
      objectiveEl.textContent='THE SUMMIT · PAIRS '+Math.min(6,sm.pairsResolved)+' / 6';
    }
    var p=sm.prime;if(!p)return;
    if(sm.phase!=='shock'){
      var mx=(ships[0].x+ships[1].x)/2,my=(ships[0].y+ships[1].y)/2;
      var tx=cx+(cx-mx)*PHI,ty=cy+(cy-my)*PHI;
      steer(p,tx,ty,dt,sm.phase==='final'?60:140);
      p.x=wrapX(p.x+p.vx*dt);p.y=wrapY(p.y+p.vy*dt);p.vx*=Math.pow(.96,dt*60);p.vy*=Math.pow(.96,dt*60);
      var rr=Math.hypot(p.x-cx,p.y-cy);if(rr>540){p.x=cx+(p.x-cx)/rr*540;p.y=cy+(p.y-cy)/rr*540}
    }
    p.a+=dt*(sm.phase==='final'?2.2:1.1);p.spin+=dt;
    if(sm.phase==='core'){
      objectiveEl.textContent='THE PRIME · '+Math.max(0,Math.ceil(p.hull))+' / '+p.maxHull+' · STRIKE AS ONE';
      sm.primeFire-=dt;
      if(sm.primeFire<=0){
        sm.primeFire=1.15;
        var tgt=distObj(p,ships[0])<distObj(p,ships[1])?ships[0]:ships[1];
        var base=Math.atan2(delta(tgt.y,p.y,WORLD.h),delta(tgt.x,p.x,WORLD.w));
        [-0.28,0,0.28].forEach(function(off){bolts.push({x:p.x,y:p.y,vx:Math.cos(base+off)*170,vy:Math.sin(base+off)*170,life:5})});
        burst(p.x,p.y,'#ff5b66',8);
      }
      sm.droneT-=dt;
      var field=enemies.filter(function(o){return !o.isPrime&&o.hull>0}).length;
      if(sm.droneT<=0&&field<6){
        sm.droneT=7;
        for(var k=0;k<2;k++){var a2=Math.random()*6.28;enemies.push({id:nextId++,x:wrapX(p.x+Math.cos(a2)*200),y:wrapY(p.y+Math.sin(a2)*200),vx:0,vy:0,a:0,hull:30+wave*4,fire:1+Math.random()*2,phase:Math.random()*6.2,targetIndex:-1,threatTargetIndex:-1,rescuePilot:-1,rescueBroke:false,lastHitBy:-1,lastHitAt:0,coordAt:0,pairId:null})}
      }
    }
    if(sm.phase==='final'){
      objectiveEl.textContent='THE LAST WINDOW · '+sm.finalHits+' / 3'+(now<sm.winUntil?' · OPEN':'');
      sm.winT-=dt;
      if(sm.winT<=0&&sm.winUntil===0){
        sm.winUntil=now+800;sm.winHits=[false,false];
        notify(0,'THE WINDOW OPENS',700);notify(1,'THE WINDOW OPENS',700);
      }
      if(sm.winUntil&&now>=sm.winUntil){
        sm.winUntil=0;sm.winT=PHI2;sm.winHits=[false,false];
        notify(0,'WINDOW MISSED',700);notify(1,'WINDOW MISSED',700);
        ships.forEach(function(s){
          if(!s.alive)return;
          var px=delta(s.x,p.x,WORLD.w),py=delta(s.y,p.y,WORLD.h),pl=Math.hypot(px,py)||1;
          s.vx+=px/pl*260;s.vy+=py/pl*260;
        });
        logH('summit · window missed · the heart pushes back');
      }
    }
    if(sm.phase==='shock'){
      sm.shockT+=dt;
      if(!sm.shockDone&&sm.shockT>=1.2){sm.shockDone=true;applyShockChoice()}
      if(sm.shockT>=2.8&&running)summitVictory();
    }
  }
  function showSummitBrief(){
    document.querySelector('#levelNo').textContent='DEPTH COMPLETE · THE SUMMIT';
    document.querySelector('#levelTitle').textContent='THE DIVIDED PRIME';
    document.querySelector('#levelCopy').textContent='The mirror of the pair. Single strikes reflect. Only the double strike — gold and teal as one weapon — wounds it.';
    document.querySelector('#continueLevel').textContent='FACE THE DIVIDED PRIME';
    document.querySelector('#levelCard').classList.add('future');levelBeat.dataset.next='