Saltar a contenido

ADR-0004 · Actualizar Payload a 3.88 y fijar Next en la serie 15.4

  • Estado: aceptado
  • Decisores: hquintero
  • Fecha de la decisión: 2026-08-26

Contexto y problema

El proyecto llevaba diez meses en Payload 3.61.1 (oct-2025) con Next 15.4.4. npm audit reportaba 68 vulnerabilidades, entre ellas cuatro críticas que aplican directo a este CMS: toma de cuenta pre-autenticación vía el recovery de contraseña (GHSA-hp5w-3hxx-vmwf), SQL injection en el adaptador Postgres (GHSA-xx6w-jxg9-2wh8) y RCE en el protocolo React flight de Next (GHSA-9qr9-h5gf-34mp). El panel /admin es público, así que la ventana de exposición era real.

La restricción que fuerza una decisión: Payload 3.88 declara como peer de Next >=15.4.11 <15.5.0 || >=16.2.6 <17.0.0 — no soporta la serie 15.5.

Opciones consideradas

  1. Payload 3.88.0 + Next 15.4.11 (último patch de la serie ya en uso).
  2. Payload 3.88.0 + Next 16.2.6+ (major nuevo, con sus breaking changes).
  3. No actualizar y mitigar por red (descartada: el admin es público y las correcciones existen aguas arriba).

Decisión

Opción 1: todo el ecosistema @payloadcms/* (14 paquetes en lockstep) a 3.88.0 y Next a 15.4.11, junto con react/react-dom 19.2.8 y sharp 0.35.4 (CVEs de libvips). El salto de Next 16 no se mezcla con el de Payload: cambiar dos majors a la vez impide atribuir regresiones. Queda como etapa propia, igual que la migración a React 19 estable en el storefront.

Verificación realizada: next build completo, servidor de producción arriba con los tres chequeos del runbook en verde, lint sin errores.

Consecuencias

Positivas

  • Las 4 vulnerabilidades críticas y la mayoría de las altas quedan cerradas (68 → 41 avisos, único crítico restante: fast-xml-parser, transitivo).
  • payload migrate:create generó la migración 20260826_184012: crea la tabla interna payload_kv y retira la relación payload_jobs de locked-documents. Debe aplicarse en producción antes de levantar la versión nueva, como ya exige el runbook.
  • El importMap regenerado movió SlugField de @payloadcms/ui a @payloadcms/next/client — regenerado y commiteado.

Negativas / deuda asumida

  • Next 15.4 ya no recibe todos los backports: npm audit sigue listando avisos altos (bypass de middleware, SSRF, DoS) cuyo fix solo existe en 15.5/16. La salida real es Next 16.2.6+, que Payload sí soporta; programarla como etapa aparte.
  • fast-xml-parser (crítico, transitivo vía @payloadcms/payload-cloud → aws-sdk) no tiene fix aguas arriba todavía. El plugin payloadCloudPlugin solo se activa en Payload Cloud, que no usamos: riesgo aceptado; reevaluar si se publica fix.
  • El test de integración (tests/int/api.int.spec.ts) ya fallaba en develop antes de este cambio — el schema push de dev corta con un error de cast sobre enum__pages_v_blocks_product_grid_filter_type. Verificado reinstalando las versiones viejas. No se arregló aquí para no mezclar alcances; queda como pendiente propio.