# Sprint 20 — Endurecimiento integral previo a staging

## Objetivo

Reducir la superficie de ataque y emitir un dictamen verificable antes de desplegar GeneaCase en staging. Este sprint no habilita producción pública por sí solo.

## Cambios principales

- sesiones estrictas con expiración inactiva/absoluta, rotación periódica y revocación por `security_version`;
- limitación persistente de solicitudes sensibles sin almacenar IP, correo o token en claro;
- IP real solo desde proxies explícitamente confiables;
- correlación de solicitudes y auditoría con metadatos sensibles redactados;
- errores 500 genéricos y mensajes técnicos sanitizados;
- host permitido, HTTPS forzado y preflight obligatorio en `APP_ENV=production`;
- cabeceras CSP, HSTS, COOP, CORP, Permissions-Policy y no-store;
- carga privada con extensión, MIME, firma binaria, tamaño, dimensiones y SHA-256;
- importaciones CSV/PDF/JSON reforzadas y rechazo de datos binarios o campos sensibles;
- JavaScript de tema externo para eliminar scripts inline;
- QA de seguridad, datos, permisos, rutas y preparación de staging.

## Principios conservados

- aislamiento por `id_empresa` y `id_caso`;
- ninguna IA confirma parentescos o hechos automáticamente;
- las personas vivas requieren privacidad conservadora;
- no se realiza DELETE físico de evidencias activas;
- originales inmutables y almacenamiento fuera de `public`.
