<!-- RUBY-BACKUP · part 28 -->
try{
      name = String(name||'').trim().toLowerCase();
      var all = loadCodes();
      if(all[name]){ delete all[name]; saveCodes(all); status('forgot "'+name+'"'); }
      else status('no code named "'+name+'"');
    }catch(e){}
  }

  /* ================= NODE PICK (tap-a-block) ================= */
  var picking = null; // {k}
  function armNodePick(k){
    try{
      picking = {k:k};
      // hide panel, show banner
      if(panelEl) panelEl.style.display = 'none';
      var b = document.createElement('div');
      b.id = 'cb-pickbanner';
      b.style.cssText = 'position:fixed;left:50%;bottom:90px;transform:translateX(-50%);z-index:30006;'
        +'background:rgba(10,8,4,0.95);border:2px solid #d8a920;border-radius:12px;'
        +'color:#ffd700;font-family:Georgia,serif;font-size:14px;padding:12px 16px;'
        +'display:flex;gap:12px;align-items:center;';
      b.innerHTML = '<span>TAP A BLOCK</span>'
        +'<span id="cb-pickx" style="color:#c0392b;font-size:18px;padding:4px 10px;cursor:pointer;">\u2715</span>';
      document.body.appendChild(b);
      function cx(e){ try{ if(e){ e.preventDefault(); e.stopPropagation(); } }catch(x){} cancelPick(); }
      var xel = document.getElementById('cb-pickx');
      if(xel){ xel.addEventListener('touchstart', cx, {passive:false}); xel.addEventListener('mousedown', cx); }
      document.addEventListener('touchstart', pickTap, true);
      document.addEventListener('mousedown', pickTap, true);
    }catch(e){ cancelPick(); }
  }
  function cancelPick(){
    picking = null;
    try{
      document.removeEventListener('touchstart', pickTap, true);
      document.removeEventListener('mousedown', pickTap, true);
      var b = document.getElementById('cb-pickbanner');
      if(b && b.parentNode) b.parentNode.removeChild(b);
      if(panelEl) panelEl.style.display = '';
    }catch(e){}
  }
  function pickTap(e){
    try{
      if(!picking) return;
      var t = e.touches && e.touches.length ? e.touches[0] : e;
      var sx = t.clientX, sy = t.clientY;
      // ignore taps on our own UI
      var tgt = e.target;
      if(tgt && tgt.closest && (tgt.closest('#cb-pickbanner') || tgt.closest('#codeBuilderPanel'))) return;
      var nid = raycastNode(sx, sy);
      try{ if(e.cancelable) e.preventDefault(); }catch(x){}
      try{ e.stopPropagation(); }catch(x){}
      if(nid){
        pendingVals[picking.k] = nid;
        status('picked '+shortId(nid));
      } else {
        status('no block there — tap a block');
        return; // stay armed
      }
      cancelPick();
      renderBody();
    }catch(e){ cancelPick(); }
  }
  function raycastNode(sx, sy){
    try{
      if(typeof THREE==='undefined' || !window.scene || !window.camera) return null;
      var ndc = new THREE.Vector2((sx/window.innerWidth)*2-1, -(sy/window.innerHeight)*2+1);
      var rc = new THREE.Raycaster();
      rc.setFromCamera(ndc, window.camera);
      var map = window.__nodeMap || {};
      var objs = [];
      for(var k in map){ try{ if(map[k] && map[k].obj) objs.push(map[k].obj); }catch(e){} }
      if(!objs.length) return null;
      var hits = rc.intersectObjects(objs, true);
      if(hits && hits.length){
        var o = hits[0].object;
        var guard = 0;
        while(o && guard < 12){
          if(o.userData && o.userData.nodeId) return o.userData.nodeId;
          o = o.parent; guard++;
        }
      }
      return null;
    }catch(e){ return null; }
  }

  /* ================= UI BUTTON ================= */
  function makeUIButton(){
    try{
      if(document.getElementById('builderBtn')) return;
      var b = document.createElement('div');
      b.id = 'builderBtn';
      b.innerHTML = '\u270E';
      b.style.cssText = 'position:fixed;right:12px;bottom:270px;width:52px;height:52px;'
        +'z-index:29999;background:radial-gradient(circle at 35% 30%, #ffe27a, #d8a920 55%, #8a6a1c);'
        +'border:2px solid #ffe27a;border-radius:50%;color:#3a2a08;'
        +'font-size:24px;display:flex;align-items:center;justify-content:center;'
        +'box-shadow:0 0 16px rgba(216,169,32,0.5);cursor:pointer;'
        +'-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none;';
      function tap(e){
        try{ if(e){ e.preventDefault(); e.stopPropagation(); } }catch(x){}
        openPanel();
      }
      b.addEventListener('touchstart', tap, {passive:false});
      b.addEventListener('mousedown', tap);
      document.body.appendChild(b);
    }catch(e){}
  }

  /* ================= runLine HOOK (loads last -> checked first) ================= */
  function hookRunLine(){
    try{
      var tries = 0;
      var iv = setInterval(function(){
        tries++;
        try{
          if(typeof window.runLine === 'function' && !window.runLine.__builderHooked){
            var orig = window.runLine;
            window.runLine = function(line){
              try{
                var tl = String(line||'').trim().toLowerCase();
     