(async()=>{ const b=await pw.chromium.launch({headless:true,args:['--no-sandbox']}); const pg=await b.newPage({viewport:{width:360,height:740}}); await pg.goto('http://127.0.0.1:8800/',{waitUntil:'load'}); await pg.waitForTimeout(3000); // wait for boot await pg.waitForFunction(()=>document.querySelector('#boot').classList.contains('done'),{timeout:8000}); await pg.evaluate(()=>{const cs=[...document.querySelectorAll('.cnt')];cs[cs.length-1].scrollIntoView({block:'center'})}); await pg.waitForTimeout(2500); console.log(await pg.evaluate(()=>[...document.querySelectorAll('.cnt')].map(c=>c.textContent).join(' | '))); console.log('intersection rects done'); await b.close(); })(); EOF node p2.js 0 | 0 | 0.00 | 0 | 0 | 22 | 20 | 21 intersection rects done  ← Edit index.html Index: /opt/lab/superprova/20260822-2110/kilo/index.html =================================================================== --- /opt/lab/superprova/20260822-2110/kilo/index.html +++ /opt/lab/superprova/20260822-2110/kilo/index.html @@ -1087,9 +1087,12 @@ const sep=LANG==='pt'||LANG==='es'?',':'.'; $$('.cnt').forEach(el=>{ const to=parseFloat(el.dataset.to),dec=+el.dataset.dec; const io=new IntersectionObserver(es=>es.forEach(e=>{ - if(!e.isIntersecting)return; + if(!e.isIntersecting){ + const r=e.target.getBoundingClientRect(); + if(r.top>=0)return; + } io.disconnect(); if(RM){el.textContent=to.toFixed(dec).replace('.',sep);return} const T=1100,t0=performance.now(); (function s(now){const p=clamp((now-t0)/T,0,1),o=1-Math.pow(1-p,3);  Causa raiz: com um salto de scroll, os cards intermediários cruzam a viewport sem nunca renderizar um frame interseptado — o IO nunca dispara. Vou tornar o contador robusto: se o elemento já passou do topo (rápido demais), conta mesmo assim. {"arreio":"kilo","modelo":"deepseek/deepseek-v4-flash","dur_ms":900457,"arquivos_tocados":2}