| DOM expuesto (visibility:hidden bypasseable) | Script síncrono en <head> + overlay bloqueante |
| .catch() en verificarSesion() daba acceso sin internet | jwtExpired() decodifica JWT localmente. Sin conexión solo si token no expiró |
| peddaleo_trial_start en localStorage (reseteable) | trial_days_remaining calculado en servidor, enviado en JWT |
| peddaleo_login_time en localStorage (manipulable) | Movido a sessionStorage — muere al cerrar pestaña |
| Sin verificación de expiración del JWT en cliente | jwtExpired() decodifica token y verifica exp localmente |