<!-- RUBY-BACKUP · part 24 -->
code:'music',    args:[{n:'node',t:'node'},{n:'note',t:'text'}], why:'sing a tone when stepped on'},
      {code:'painter',  args:[{n:'node',t:'node'}], why:'cycle colors on touch'},
      {code:'hider',    args:[{n:'node',t:'node'}], why:'vanish the block'},
      {code:'battery',  args:[{n:'node',t:'node'}], why:'store energy from crossings'},
      {code:'generator',args:[{n:'node',t:'node'}], why:'feed the nearest battery'},
      {code:'clearmode',args:[{n:'node',t:'node'}], why:'strip any mode back to solid'},
    ]},
    {title:'RIGGING', ic:'\u27BF', acts:[
      {code:'grab',     args:[], why:'pick it up and move it'},
      {code:'pulley',   args:[], why:'a wheel to redirect your pull'},
      {code:'rig',      args:[], why:'rope it and pull it'},
      {code:'lift',     args:[], why:'raise the ground here'},
      {code:'setdown',  args:[], why:'lower it back down'},
      {code:'flatten',  args:[], why:'flatten what was lifted'},
      {code:'diamond',  args:[], why:'pull corners into a diamond'},
      {code:'span',     args:[], why:'rope two objects, synced'},
      {code:'unspan',   args:[], why:'cut every span'},
      {code:'detach',   args:[], why:'cut one rope free'},
      {code:'unrig',    args:[], why:'clear every rope'},
      {code:'anchor',   args:[], why:'pin it — pulls reshape it'},
      {code:'capture all', args:[], why:'solidify every node at once'},
      {code:'connect all', args:[], why:'link every node, one network'},
    ]},
    {title:'MACHINES', ic:'\u2699', acts:[
      {code:'compound',     args:[], why:'chained pulleys, 2:1 to 4:1'},
      {code:'counterweight',args:[], why:'balance the load'},
      {code:'winch',        args:[], why:'crank to reel rope'},
      {code:'gearlink',     args:[], why:'turn gear, rope travels'},
      {code:'lever',       args:[], why:'3:1 effort to load'},
      {code:'codex',       args:[], why:'the whole system, mapped'},
    ]},
    {title:'SPIDER', ic:'\u2736', acts:[
      {code:'spider',   args:[], why:'weave a constellation'},
      {code:'spider',   args:[{n:'distance',t:'num'}], why:'weave, you choose density', fixed:'spider'},
      {code:'unspider', args:[], why:'dissolve the web'},
      {code:'warp',     args:[], why:'ride a thread'},
    ]},
    {title:'SEED', ic:'\u25B2', acts:[
      {code:'seed',      args:[], why:'make a machine seed block'},
      {code:'seed grow', args:[], why:'grow the whole machine'},
      {code:'seed stop', args:[], why:'halt the gears'},
      {code:'seed start',args:[], why:'resume the gears'},
      {code:'unseed',    args:[], why:'disassemble the machine'},
      {code:'salvage',   args:[], why:'make a salvage block'},
      {code:'inventory', args:[], why:'see collected parts'},
    ]},
    {title:'TIME', ic:'\u23F3', acts:[
      {code:'snapshot',     args:[{n:'name',t:'text'}], why:'freeze this moment'},
      {code:'rewind',       args:[], why:'step back one snapshot'},
      {code:'rewind to',    args:[{n:'name',t:'text'}], why:'jump to a named moment'},
      {code:'capture area', args:[{n:'name',t:'text'}], why:'save this region'},
      {code:'rebuild from', args:[{n:'name',t:'text'}], why:'raise the region again'},
      {code:'erase',        args:[], why:'wipe the systems (stones stay)'},
    ]},
    {title:'WORLD', ic:'\u25CB', acts:[
      {code:'day',   args:[], why:'light the world'},
      {code:'night', args:[], why:'darken the world'},
      {code:'fly',   args:[], why:'take to the sky'},
      {code:'land',  args:[], why:'come back down'},
      {code:'jump',  args:[], why:'leap'},
      {code:'speed', args:[{n:'0.1-10',t:'num'}], why:'how fast you move'},
    ]},
    {title:'BUILDER', ic:'\u270E', acts:[
      {code:'wait', args:[{n:'seconds',t:'num'}], why:'pause the chain here'},
    ]},
  ];

  var RESERVED = ('codebuilder mycodes forgetcode wait pyramid codes scroll install uninstall cancel installed '
    +'nodes stand solidify latch solid capture all connect all disconnect all network nodemodes clearmode '
    +'portal switch sensor spring anchor unanchor conveyor face elevator catapult blueprint welder crane '
    +'counter timer messenger music painter hider battery power generator grab pulley rig unrig detach lift '
    +'flatten setdown diamond delete duplicate fly land walk jump duck speed day night span unspan compound '
    +'uncompound counterweight unweight winch unwinch gearlink ungear lever unlever codex spider unspider '
    +'webs warp seed unseed salvage inventory snapshot rewind snapshots forget snapshot capture area areas '
    +'forget area erase erase all rebuild rebuild from sacred fixstation playa holomap whereami listall tp '
    +'solidfast bam again pulleylab ropedeform codex').split(' ');

  /* ================= STORE ================= */
  function loadCodes(){
    try{
      var raw = localStorage.getItem(STORE_KEY);
      if(!raw) return {};
      var o = JSON.parse(raw);
      return (o && typeof o==='objec