<!-- RUBY-BACKUP · part 567 -->
w.unanchorNode = function(nid){
    try{
      var sn = solidNodes[nid];
      if(!sn) return 'no such node';
      if(window.__nodeMap && window.__nodeMap[nid] && window.__nodeMap[nid].obj){
        window.__nodeMap[nid].obj.userData.deepAnchored = false;
      }
      sn.mode = 'solid';
      paintMode(nid);
      if(typeof codeStatus==='function') codeStatus('UNANCHORED ' + nid);
      return 'released';
    }catch(e){ return 'unanchor failed'; }
  };
  // guard: deep-anchored blocks skip span/rig/grab
  window.isDeepAnchored = function(obj){
    try{ return !!(obj && obj.userData && obj.userData.deepAnchored); }catch(e){ return false; }
  };

  /* ---- visuals ---- */
  function paintMode(nid){
    try{
      var sn = solidNodes[nid];
      if(!sn || !sn.platform) return;
      var colors = {portal:0x6a1fb0, switch:0x8a6a1c, sensor:0x7a1a1a, spring:0x1a7a2a, anchor:0x3a3a3a, solid:0xc9a227, latch:0x00d4ff};
      var c = colors[sn.mode] || 0xc9a227;
      sn.platform.material.color.setHex(c);
    }catch(e){}
  }
  function ringMode(nid, colorHex){
    try{
      var sn = solidNodes[nid];
      if(!sn || !sn.platform) return;
      // remove old ring
      if(sn.ring){ sn.platform.remove(sn.ring); sn.ring = null; }
      var rg = new THREE.RingGeometry(1.35, 1.55, 32);
      var rm = new THREE.MeshBasicMaterial({color: colorHex, transparent: true, opacity: 0.85, side: THREE.DoubleSide});
      var r = new THREE.Mesh(rg, rm);
      r.rotation.x = -Math.PI/2; r.position.y = 0.16;
      sn.platform.add(r);
      sn.ring = r;
      // pulse for sensor
      if(sn.mode === 'sensor' && !sn.pulsing){
        sn.pulsing = true;
        (function pulse(){
          try{
            if(!sn.ring || sn.mode !== 'sensor'){ sn.pulsing = false; return; }
            var s = 1 + Math.sin(Date.now()/300)*0.12;
            sn.ring.scale.set(s, s, 1);
            requestAnimationFrame(pulse);
          }catch(e){ sn.pulsing = false; }
        })();
      }
      // swirl for portal
      if(sn.mode === 'portal' && !sn.swirling){
        sn.swirling = true;
        (function swirl(){
          try{
            if(!sn.ring || sn.mode !== 'portal'){ sn.swirling = false; return; }
            sn.ring.rotation.z += 0.03;
            requestAnimationFrame(swirl);
          }catch(e){ sn.swirling = false; }
        })();
      }
    }catch(e){}
  }

  /* ---- master tick ---- */
  setInterval(function(){
    try{ portalTick(); switchTick(); sensorTick(); springTick(); }catch(e){}
  }, 120);

  /* ---- codes ---- */
  try{
    if(typeof window.runLine === 'function' && !window.runLine.__modeHooked){
      var prevRL = window.runLine;
      window.runLine = function(line){
        try{
          var tl = String(line||'').trim().toLowerCase();
          var rest = String(line||'').trim().slice(tl.split(' ')[0].length).trim();
          if(tl.indexOf('portal ')===0){
            var parts = rest.split(/\s+/);
            var r = window.portalPair(parts[0], parts[1]);
            if(typeof codeStatus==='function') codeStatus(r);
            return true;
          }
          if(tl.indexOf('switch ')===0){ var r2 = window.switchNode(rest.split(/\s+/)[0]); if(typeof codeStatus==='function') codeStatus(r2); return true; }
          if(tl.indexOf('sensor ')===0){ var r3 = window.sensorNode(rest.split(/\s+/)[0]); if(typeof codeStatus==='function') codeStatus(r3); return true; }
          if(tl.indexOf('spring ')===0){ var r4 = window.springNode(rest.split(/\s+/)[0]); if(typeof codeStatus==='function') codeStatus(r4); return true; }
          if(tl.indexOf('anchor ')===0 && tl.indexOf('unanchor')!==0){
            var _aid = rest.split(/\s+/)[0] || '';
            if(_aid.charAt(0)==='n'){ var r5 = window.anchorNode(_aid); if(typeof codeStatus==='function') codeStatus(r5); return true; }
          }
          if(tl.indexOf('unanchor ')===0){
            var _uid = rest.split(/\s+/)[0] || '';
            if(_uid.charAt(0)==='n'){ var r6 = window.unanchorNode(_uid); if(typeof codeStatus==='function') codeStatus(r6); return true; }
          }
          if(tl==='nodemodes'){
            if(typeof codeStatus==='function') codeStatus('PORTAL SWITCH SENSOR SPRING ANCHOR — plus SOLID LATCH');
            return true;
          }
        }catch(e){}
        return prevRL.apply(this, arguments);
      };
      window.runLine.__modeHooked = true;
    }
  }catch(e){}


  /* CAPTURE ALL + CONNECT ALL
     The King: "upgrade all of these with capture all and connect all"
     capture all — solidify every node on the map in one word.
     connect all — link every solid node into one living network. */

  window.captureAll = function(){
    try{
      if(typeof window.listNodes !== 'function') return 'nodes not ready';
      var ns = window.listNodes();
      var n = 0;
      for(var i=0;i<ns.length;i++){
        try{
          var r = window.solidifyNode(ns[i].id);
          if(r && r.indexOf('solidified')===0) n++;
    