window.camperReleaseIntegrity=async function(){ const installed='2.0.0-build.113'; try{ const [rr,mr,ur]=await Promise.all([ fetch('/api/release',{cache:'no-store'}), fetch('/manifest.webmanifest?release='+encodeURIComponent(installed),{cache:'no-store'}), fetch('/actualizacion.json?release='+encodeURIComponent(installed),{cache:'no-store'}) ]); if(!rr.ok||!mr.ok||!ur.ok) throw new Error('release '+rr.status+' / manifest '+mr.status+' / update '+ur.status); const [release,manifest,update]=await Promise.all([rr.json(),mr.json(),ur.json()]); const versions=[release.version,release.releaseContract?.manifestVersion,release.releaseContract?.workerVersion,manifest.version,update.version,update.latest]; const expectedSw='cb-v49-build114'; const preflight=await checkReleasePreflight(); const contractOk=String(release.releaseContract?.frontendVersion||'')===installed&&String(release.releaseContract?.serviceWorkerCache||'')===expectedSw&&Number(release.schema||0)>=8&&preflight.ok; const coherent=versions.every(v=>String(v||'')===installed)&&contractOk; return {ok:coherent,installed,server:release.version||null,manifest:manifest.version||null,update:update.version||null,latest:update.latest||null,serviceWorker:release.releaseContract?.serviceWorkerCache||null,schema:release.schema||null,checked_at:new Date().toISOString()}; }catch(e){ return {ok:false,installed,server:null,manifest:null,update:null,latest:null,error:String(e),checked_at:new Date().toISOString()}; } };