# QA Sprint 20

## Automático

1. PHP lint del proyecto y payload.
2. Regresión completa de Sprints 1–19.
3. `tools/qa/sprint20_validate.php`.
4. `database/qa/023_qa_production_hardening_sprint20.sql`.
5. `tools/qa/sprint20_readiness.php`.
6. Manifiesto SHA-256, backup y restauración.

## Negativo obligatorio

- modificar UUID/ID de empresa, caso, documento o hipótesis debe responder 403/404 sin datos;
- cabeceras `X-Forwarded-*` desde un cliente no confiable deben ignorarse;
- nombre, MIME, extensión o firma incongruentes deben bloquear la carga;
- `../`, rutas absolutas y NUL deben bloquearse;
- exceso de login, recuperación, importación o conector debe producir 429;
- cambio de contraseña debe invalidar sesiones anteriores;
- host no permitido debe producir 400 en producción;
- HTTP debe redirigir al `APP_URL` HTTPS configurado, nunca al Host recibido.

## Criterio

`TOTAL_ERRORES=0` y `DICTAMEN=APTO_PARA_PREPARAR_STAGING`. Esto autoriza Sprint 21, no una publicación pública inmediata.
