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¶
- Payload 3.88.0 + Next 15.4.11 (último patch de la serie ya en uso).
- Payload 3.88.0 + Next 16.2.6+ (major nuevo, con sus breaking changes).
- 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:creategeneró la migración20260826_184012: crea la tabla internapayload_kvy retira la relaciónpayload_jobsde locked-documents. Debe aplicarse en producción antes de levantar la versión nueva, como ya exige el runbook.- El importMap regenerado movió
SlugFieldde@payloadcms/uia@payloadcms/next/client— regenerado y commiteado.
Negativas / deuda asumida¶
- Next 15.4 ya no recibe todos los backports:
npm auditsigue 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 pluginpayloadCloudPluginsolo 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 endevelopantes de este cambio — el schema push de dev corta con un error de cast sobreenum__pages_v_blocks_product_grid_filter_type. Verificado reinstalando las versiones viejas. No se arregló aquí para no mezclar alcances; queda como pendiente propio.