[OK] Archivo requerido: app/Core/SafeMessage.php [OK] Archivo requerido: app/Core/RequestContext.php [OK] Archivo requerido: app/Core/ProductionGuard.php [OK] Archivo requerido: app/Core/RateLimiter.php [OK] Archivo requerido: app/Core/Middleware/RateLimitMiddleware.php [OK] Archivo requerido: config/security.php [OK] Archivo requerido: public/assets/js/theme-init.js [OK] Archivo requerido: database/migrations/022_sprint20_production_hardening.sql [OK] Archivo requerido: database/qa/023_qa_production_hardening_sprint20.sql [OK] Archivo requerido: docs/63_SPRINT_20_ENDURECIMIENTO_PRODUCCION.md [OK] Archivo requerido: docs/64_QA_SPRINT_20.md [OK] Archivo requerido: docs/65_DICTAMEN_PRE_STAGING.md [OK] Archivo requerido: tools/qa/sprint20_readiness.php [OK] Application contiene ProductionGuard::assertSafe [OK] Application contiene RequestContext::class [OK] Application contiene RateLimiter::class [OK] Application contiene productionRequestPreflight [OK] Application contiene correlation_id [OK] Cabeceras contienen script-src 'self' [OK] Cabeceras contienen frame-ancestors [OK] Cabeceras contienen Strict-Transport-Security [OK] Cabeceras contienen Cross-Origin-Opener-Policy [OK] Cabeceras contienen X-Request-ID [OK] CSP no permite JavaScript inline [OK] Layout externo de tema: app.php [OK] Layout sin JavaScript inline: app.php [OK] Layout externo de tema: auth.php [OK] Layout sin JavaScript inline: auth.php [OK] Layout externo de tema: portal.php [OK] Layout sin JavaScript inline: portal.php [OK] Layout externo de tema: public.php [OK] Layout sin JavaScript inline: public.php [OK] Vistas sin atributos JavaScript inline incompatibles con CSP [OK] Confirmaciones y autoenvío delegados en JavaScript externo [OK] Ruta POST protegida en línea 51 [OK] Ruta POST protegida en línea 54 [OK] Ruta POST protegida en línea 56 [OK] Ruta POST protegida en línea 59 [OK] Ruta POST protegida en línea 61 [OK] Ruta POST protegida en línea 63 [OK] Ruta POST protegida en línea 64 [OK] Ruta POST protegida en línea 67 [OK] Ruta POST protegida en línea 71 [OK] Ruta POST protegida en línea 72 [OK] Ruta POST protegida en línea 78 [OK] Ruta POST protegida en línea 79 [OK] Ruta POST protegida en línea 80 [OK] Ruta POST protegida en línea 82 [OK] Ruta POST protegida en línea 83 [OK] Ruta POST protegida en línea 85 [OK] Ruta POST protegida en línea 87 [OK] Ruta POST protegida en línea 89 [OK] Ruta POST protegida en línea 90 [OK] Ruta POST protegida en línea 91 [OK] Ruta POST protegida en línea 92 [OK] Ruta POST protegida en línea 93 [OK] Ruta POST protegida en línea 97 [OK] Ruta POST protegida en línea 98 [OK] Ruta POST protegida en línea 99 [OK] Ruta POST protegida en línea 100 [OK] Ruta POST protegida en línea 101 [OK] Ruta POST protegida en línea 105 [OK] Ruta POST protegida en línea 106 [OK] Ruta POST protegida en línea 107 [OK] Ruta POST protegida en línea 108 [OK] Ruta POST protegida en línea 109 [OK] Ruta POST protegida en línea 113 [OK] Ruta POST protegida en línea 114 [OK] Ruta POST protegida en línea 116 [OK] Ruta POST protegida en línea 117 [OK] Ruta POST protegida en línea 118 [OK] Ruta POST protegida en línea 123 [OK] Ruta POST protegida en línea 126 [OK] Ruta POST protegida en línea 127 [OK] Ruta POST protegida en línea 128 [OK] Ruta POST protegida en línea 129 [OK] Ruta POST protegida en línea 130 [OK] Ruta POST protegida en línea 134 [OK] Ruta POST protegida en línea 138 [OK] Ruta POST protegida en línea 139 [OK] Ruta POST protegida en línea 141 [OK] Ruta POST protegida en línea 142 [OK] Ruta POST protegida en línea 143 [OK] Ruta POST protegida en línea 144 [OK] Ruta POST protegida en línea 145 [OK] Ruta POST protegida en línea 147 [OK] Ruta POST protegida en línea 149 [OK] Ruta POST protegida en línea 150 [OK] Ruta POST protegida en línea 151 [OK] Ruta POST protegida en línea 156 [OK] Ruta POST protegida en línea 160 [OK] Ruta POST protegida en línea 161 [OK] Ruta POST protegida en línea 162 [OK] Ruta POST protegida en línea 163 [OK] Ruta POST protegida en línea 167 [OK] Ruta POST protegida en línea 168 [OK] Ruta POST protegida en línea 169 [OK] Ruta POST protegida en línea 170 [OK] Ruta POST protegida en línea 173 [OK] Ruta POST protegida en línea 175 [OK] Ruta POST protegida en línea 176 [OK] Ruta POST protegida en línea 177 [OK] Ruta POST protegida en línea 181 [OK] Ruta POST protegida en línea 182 [OK] Ruta POST protegida en línea 183 [OK] Ruta POST protegida en línea 184 [OK] Ruta POST protegida en línea 185 [OK] Ruta POST protegida en línea 186 [OK] Ruta POST protegida en línea 187 [OK] Ruta POST protegida en línea 188 [OK] Ruta POST protegida en línea 191 [OK] Ruta POST protegida en línea 192 [OK] Ruta POST protegida en línea 193 [OK] Ruta POST protegida en línea 194 [OK] Ruta POST protegida en línea 195 [OK] Ruta POST protegida en línea 196 [OK] Ruta POST protegida en línea 199 [OK] Ruta POST protegida en línea 200 [OK] Ruta POST protegida en línea 201 [OK] Ruta POST protegida en línea 206 [OK] Ruta POST protegida en línea 207 [OK] Ruta POST protegida en línea 210 [OK] Ruta POST protegida en línea 212 [OK] Ruta POST protegida en línea 213 [OK] Ruta POST protegida en línea 214 [OK] Ruta POST protegida en línea 215 [OK] Ruta POST protegida en línea 216 [OK] Ruta POST protegida en línea 221 [OK] Ruta POST protegida en línea 222 [OK] Ruta POST protegida en línea 223 [OK] Ruta POST protegida en línea 225 [OK] Ruta POST protegida en línea 226 [OK] Ruta POST protegida en línea 228 [OK] Ruta POST protegida en línea 230 [OK] Ruta POST protegida en línea 231 [OK] Ruta POST protegida en línea 232 [OK] Ruta POST protegida en línea 233 [OK] Ruta POST protegida en línea 234 [OK] Ruta POST protegida en línea 235 [OK] Ruta POST protegida en línea 236 [OK] Ruta POST protegida en línea 237 [OK] Ruta POST protegida en línea 238 [OK] Ruta POST protegida en línea 247 [OK] Ruta POST protegida en línea 248 [OK] Ruta POST protegida en línea 249 [OK] Ruta POST protegida en línea 250 [OK] Ruta POST protegida en línea 251 [OK] Ruta POST protegida en línea 254 [OK] Ruta POST protegida en línea 255 [OK] Ruta POST protegida en línea 256 [OK] Ruta POST protegida en línea 259 [OK] Ruta POST protegida en línea 260 [OK] Ruta POST protegida en línea 261 [OK] Ruta POST protegida en línea 262 [OK] Ruta POST protegida en línea 263 [OK] Ruta POST protegida en línea 264 [OK] Ruta POST protegida en línea 265 [OK] Ruta POST protegida en línea 266 [OK] Ruta POST protegida en línea 267 [OK] Ruta POST protegida en línea 268 [OK] Ruta POST protegida en línea 269 [OK] Ruta POST protegida en línea 274 [OK] Ruta POST protegida en línea 275 [OK] Ruta POST protegida en línea 276 [OK] Ruta POST protegida en línea 277 [OK] Ruta POST protegida en línea 278 [OK] Ruta POST protegida en línea 279 [OK] Ruta POST protegida en línea 280 [OK] Ruta POST protegida en línea 283 [OK] Ruta POST protegida en línea 284 [OK] Ruta POST protegida en línea 292 [OK] Ruta POST protegida en línea 296 [OK] Ruta POST protegida en línea 299 [OK] Ruta POST protegida en línea 305 [OK] Ruta POST protegida en línea 306 [OK] Ruta POST protegida en línea 307 [OK] Se revisaron rutas POST del sistema [OK] Rate limit configurado: auth.login [OK] Rate limit configurado: auth.register [OK] Rate limit configurado: auth.password_reset_request [OK] Rate limit configurado: research.connector_execute [OK] Rate limit configurado: research.import_upload [OK] Revocación de sesión contiene security_version [OK] Revocación de sesión contiene sessionIsValid [OK] Revocación de sesión contiene password_cambiado_en [OK] Middleware revalida cuenta y versión de sesión [OK] Sesión endurecida: use_strict_mode [OK] Sesión endurecida: idle_timeout_minutes [OK] Sesión endurecida: absolute_lifetime_minutes [OK] Sesión endurecida: bind_user_agent [OK] Sesión endurecida: session_regenerate_id [OK] Storage endurecido: assertBinarySignature [OK] Storage endurecido: assertSafeImage [OK] Storage endurecido: max_image_pixels [OK] Storage endurecido: normalizeRelativePath [OK] Storage endurecido: isInsideBase [OK] Importación endurecida: firma binaria del PDF [OK] Importación endurecida: datos binarios no permitidos [OK] Importación endurecida: Research Assistant 1.0 [OK] Importación endurecida: rejectSensitiveKeys [OK] Errores técnicos no se muestran al usuario [OK] No se confía en X-Forwarded-For sin proxy autorizado [OK] Proxy autorizado resuelve IP cliente [OK] Referer externo no genera redirección abierta [OK] Tabla Sprint 20: sec_rate_limites [OK] Columna de sesión: security_version [OK] Columna de sesión: password_cambiado_en [OK] Versiones de sesión válidas [OK] Personas vivas con privacidad conservadora [ERROR] Autopruebas de seguridad: La carga no fue recibida mediante un formulario válido. TOTAL_OK=209 TOTAL_ERRORES=1