<!-- RUBY-BACKUP · part 65 -->
                if(typeof codeStatus === 'function') codeStatus('her chamber — she is here');
                return;
              }
              if(tl.indexOf('tellprovolta ') === 0){
                var words = raw.slice(13).trim();
                if(words){ tellHer(words); }
                else if(typeof codeStatus === 'function') codeStatus('tellprovolta <your words>');
                return;
              }
              if(tl === 'askprovolta'){
                window.pvAsk();
                return;
              }
              if(tl === 'pvpanel'){
                openPanel();
                return;
              }
            }catch(e){}
            return prev.apply(this, arguments);
          };
          window.runLine.__pvChamberHooked = true;
          return;
        }
      }catch(e){}
      if(tries < 60) setTimeout(hook, 500);
    }
    setTimeout(hook, 800);
  })();

  /* ---------- init ---------- */
  function init(){
    try{
      buildAvatar();
      startPoll();
      // initial catch-up
      setTimeout(function(){ try{ pollWords(); }catch(e){} }, 5000);
    }catch(e){}
  }
  if(document.readyState === 'complete'){ setTimeout(init, 2000); }
  else window.addEventListener('load', function(){ setTimeout(init, 2000); });
  // also try when scene appears
  (function waitScene(){
    var n = 0;
    function chk(){
      n++;
      try{
        if(window.scene && !avatar){ buildAvatar(); return; }
      }catch(e){}
      if(n < 60) setTimeout(chk, 1000);
    }
    setTimeout(chk, 3000);
  })();

  try{ console.log('[provolta-chamber] her room waits'); }catch(e){}
})();


===== FILE: public/ruby-backup/pulley-lab.js =====
/* ============================================================================
   PULLEY LAB — the five machines, built where you stand.
   ----------------------------------------------------------------------------
   Codes:  pulleylab        raise all five machines ahead of you
           pulleylabclear   take the lab down
   ----------------------------------------------------------------------------
   THE LAW: stones ARRIVE — they rise up from the ground into place, piece by
   piece. Platform first, then frame, then wheels, then rope, then load.
   Nothing teleports. Nothing fades. Linear rise, honest physics.
   Full lab assembles in ~2.6 seconds.
   ============================================================================ */
(function(){
'use strict';
if(typeof window==='undefined') return;
var T = window.THREE;
if(!T) return;

/* [dx, dz, heightAboveGround, rubies, shapeIdx, colorHex, phase]
   shapeIdx: 0=cube 1=cyl 2=torus | phase: 0=platform 1=frame 2=wheels 3=rope 4=load */
var SHAPES = ['cube','cyl','torus'];
var LAB = [[-40,0,0.645,8,0,"550000",0],[-20,0,0.644,10,0,"550000",0],[0,0,0.652,10,0,"550000",0],[20,0,0.648,16,0,"3a3a4a",0],[40,0,0.645,10,0,"550000",0],[-43,0,1.501,4,0,"8a2020",1],[-43,0,2.021,4,0,"8a2020",1],[-43,0,2.541,4,0,"8a2020",1],[-43,0,3.061,4,0,"8a2020",1],[-42,0,3.036,4,0,"8a2020",1],[-41,0,3.011,4,0,"8a2020",1],[-40,0,2.985,4,0,"8a2020",1],[-40,4,0.541,3,1,"8a2020",1],[-40,4,0.931,3,1,"8a2020",1],[-39,0,2.96,4,0,"8a2020",1],[-38,0,2.935,4,0,"8a2020",1],[-37,0,1.35,4,0,"8a2020",1],[-37,0,1.87,4,0,"8a2020",1],[-37,0,2.39,4,0,"8a2020",1],[-37,0,2.91,4,0,"8a2020",1],[-24,0,1.471,4,0,"8a2020",1],[-24,0,1.991,4,0,"8a2020",1],[-24,0,2.511,4,0,"8a2020",1],[-24,0,3.031,4,0,"8a2020",1],[-24,0,3.551,4,0,"8a2020",1],[-23,0,3.538,4,0,"8a2020",1],[-22,0,3.526,4,0,"8a2020",1],[-21,0,3.514,4,0,"8a2020",1],[-20,0,3.504,4,0,"8a2020",1],[-20,4,0.367,3,1,"8a2020",1],[-20,4,0.757,3,1,"8a2020",1],[-19,0,3.494,4,0,"8a2020",1],[-18,0,3.486,4,0,"8a2020",1],[-17,0,3.479,4,0,"8a2020",1],[-16,0,1.392,4,0,"8a2020",1],[-16,0,1.912,4,0,"8a2020",1],[-16,0,2.432,4,0,"8a2020",1],[-16,0,2.952,4,0,"8a2020",1],[-16,0,3.472,4,0,"8a2020",1],[0,4,0.536,3,1,"8a2020",1],[0,4,0.926,3,1,"8a2020",1],[18,0,1.435,2,0,"cc1122",1],[19,1,1.339,2,0,"cc1122",1],[19,-1,1.525,2,0,"cc1122",1],[20,2,1.241,2,0,"cc1122",1],[20,-2,1.542,2,0,"cc1122",1],[20,4,0.014,3,1,"8a2020",1],[20,4,0.404,3,1,"8a2020",1],[21,1,1.329,2,0,"cc1122",1],[21,-1,1.506,2,0,"cc1122",1],[22,0,1.406,2,0,"cc1122",1],[40,4,0.61,3,1,"8a2020",1],[40,4,1.0,3,1,"8a2020",1],[-40,0,2.985,10,2,"ffd700",2],[-21,0,2.344,8,2,"ffd700",2],[-20,0,3.504,10,2,"ffd700",2],[3,0,3.466,3,1,"ffd700",2],[17,0,1.433,8,2,"ffd700",2],[20,0,1.428,12,2,"cc1122",2],[23,0,1.39,16,2,"ffd700",2],[40,0,2.075,8,2,"ffd700",2],[40,0,3.115,6,2,"4a4a5a",2],[-41,0,2.101,1,0,"ff6060",3],[-41,0,2.231,1,0,"ff6060",3],[-41,0,2.361,1,0,"ff6060",3],[-41,0,2.491,1,0,"ff6060",3],[-41,0,2.621,1,0,"ff6060",3],[-41,0,2.751,1,0,"ff6060",3],[-41,0,2.881,1,0,"ff6060",3],[-39,0,1.66,1,0,"ff6060",3],[-39,0,1.79,1,0,"ff6060",3],[-39,0,1.92,1,0,"ff6060",3],[-39,0,2.05,1,0,"ff6060",3],[-39,0,2.18,1,0,"ff6060",3],[-39,0,2.31,1,0,"ff6060",3],[-39,0,2.44,1,0,"ff6060",3],[-39,0,2.57,1,0,"ff6060",3],[-39,0,2.7,1,0,"ff6060",3],[-39,0,2