[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 59 [OK] Ruta POST protegida en línea 62 [OK] Ruta POST protegida en línea 64 [OK] Ruta POST protegida en línea 67 [OK] Ruta POST protegida en línea 69 [OK] Ruta POST protegida en línea 71 [OK] Ruta POST protegida en línea 72 [OK] Ruta POST protegida en línea 75 [OK] Ruta POST protegida en línea 79 [OK] Ruta POST protegida en línea 80 [OK] Ruta POST protegida en línea 86 [OK] Ruta POST protegida en línea 87 [OK] Ruta POST protegida en línea 88 [OK] Ruta POST protegida en línea 89 [OK] Ruta POST protegida en línea 90 [OK] Ruta POST protegida en línea 92 [OK] Ruta POST protegida en línea 93 [OK] Ruta POST protegida en línea 95 [OK] Ruta POST protegida en línea 97 [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 102 [OK] Ruta POST protegida en línea 103 [OK] Ruta POST protegida en línea 109 [OK] Ruta POST protegida en línea 110 [OK] Ruta POST protegida en línea 111 [OK] Ruta POST protegida en línea 114 [OK] Ruta POST protegida en línea 115 [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 124 [OK] Ruta POST protegida en línea 125 [OK] Ruta POST protegida en línea 126 [OK] Ruta POST protegida en línea 127 [OK] Ruta POST protegida en línea 132 [OK] Ruta POST protegida en línea 133 [OK] Ruta POST protegida en línea 135 [OK] Ruta POST protegida en línea 136 [OK] Ruta POST protegida en línea 139 [OK] Ruta POST protegida en línea 140 [OK] Ruta POST protegida en línea 141 [OK] Ruta POST protegida en línea 142 [OK] Ruta POST protegida en línea 146 [OK] Ruta POST protegida en línea 147 [OK] Ruta POST protegida en línea 148 [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 153 [OK] Ruta POST protegida en línea 154 [OK] Ruta POST protegida en línea 156 [OK] Ruta POST protegida en línea 157 [OK] Ruta POST protegida en línea 158 [OK] Ruta POST protegida en línea 159 [OK] Ruta POST protegida en línea 160 [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 170 [OK] Ruta POST protegida en línea 171 [OK] Ruta POST protegida en línea 172 [OK] Ruta POST protegida en línea 177 [OK] Ruta POST protegida en línea 180 [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 188 [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 197 [OK] Ruta POST protegida en línea 198 [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 203 [OK] Ruta POST protegida en línea 205 [OK] Ruta POST protegida en línea 206 [OK] Ruta POST protegida en línea 207 [OK] Ruta POST protegida en línea 212 [OK] Ruta POST protegida en línea 216 [OK] Ruta POST protegida en línea 217 [OK] Ruta POST protegida en línea 218 [OK] Ruta POST protegida en línea 219 [OK] Ruta POST protegida en línea 220 [OK] Ruta POST protegida en línea 224 [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 229 [OK] Ruta POST protegida en línea 232 [OK] Ruta POST protegida en línea 233 [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 242 [OK] Ruta POST protegida en línea 243 [OK] Ruta POST protegida en línea 244 [OK] Ruta POST protegida en línea 245 [OK] Ruta POST protegida en línea 246 [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 252 [OK] Ruta POST protegida en línea 253 [OK] Ruta POST protegida en línea 254 [OK] Ruta POST protegida en línea 255 [OK] Ruta POST protegida en línea 258 [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 266 [OK] Ruta POST protegida en línea 267 [OK] Ruta POST protegida en línea 268 [OK] Ruta POST protegida en línea 273 [OK] Ruta POST protegida en línea 274 [OK] Ruta POST protegida en línea 277 [OK] Ruta POST protegida en línea 279 [OK] Ruta POST protegida en línea 280 [OK] Ruta POST protegida en línea 281 [OK] Ruta POST protegida en línea 282 [OK] Ruta POST protegida en línea 283 [OK] Ruta POST protegida en línea 288 [OK] Ruta POST protegida en línea 289 [OK] Ruta POST protegida en línea 290 [OK] Ruta POST protegida en línea 292 [OK] Ruta POST protegida en línea 293 [OK] Ruta POST protegida en línea 295 [OK] Ruta POST protegida en línea 297 [OK] Ruta POST protegida en línea 298 [OK] Ruta POST protegida en línea 299 [OK] Ruta POST protegida en línea 300 [OK] Ruta POST protegida en línea 301 [OK] Ruta POST protegida en línea 302 [OK] Ruta POST protegida en línea 303 [OK] Ruta POST protegida en línea 304 [OK] Ruta POST protegida en línea 305 [OK] Ruta POST protegida en línea 314 [OK] Ruta POST protegida en línea 315 [OK] Ruta POST protegida en línea 316 [OK] Ruta POST protegida en línea 317 [OK] Ruta POST protegida en línea 318 [OK] Ruta POST protegida en línea 321 [OK] Ruta POST protegida en línea 322 [OK] Ruta POST protegida en línea 323 [OK] Ruta POST protegida en línea 326 [OK] Ruta POST protegida en línea 327 [OK] Ruta POST protegida en línea 328 [OK] Ruta POST protegida en línea 329 [OK] Ruta POST protegida en línea 330 [OK] Ruta POST protegida en línea 331 [OK] Ruta POST protegida en línea 332 [OK] Ruta POST protegida en línea 333 [OK] Ruta POST protegida en línea 334 [OK] Ruta POST protegida en línea 335 [OK] Ruta POST protegida en línea 336 [OK] Ruta POST protegida en línea 343 [OK] Ruta POST protegida en línea 344 [OK] Ruta POST protegida en línea 345 [OK] Ruta POST protegida en línea 346 [OK] Ruta POST protegida en línea 347 [OK] Ruta POST protegida en línea 348 [OK] Ruta POST protegida en línea 349 [OK] Ruta POST protegida en línea 352 [OK] Ruta POST protegida en línea 353 [OK] Ruta POST protegida en línea 354 [OK] Ruta POST protegida en línea 355 [OK] Ruta POST protegida en línea 363 [OK] Ruta POST protegida en línea 367 [OK] Ruta POST protegida en línea 370 [OK] Ruta POST protegida en línea 376 [OK] Ruta POST protegida en línea 377 [OK] Ruta POST protegida en línea 378 [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=249 TOTAL_ERRORES=1