📻 Versión en audio: si prefieres escuchar en vez de leer, el resumen del artículo está justo aquí arriba.
Gran parte de mi automatización diaria corre sobre GLM: crons que curan noticias y resumen, confiando en que cuando la API responde, esa respuesta es mía y de nadie más. Cloudflare acaba de publicar un post-mortem que rompe esa suposición: respuestas con el contexto de otra persona, entregadas con HTTP 200 y todo aparentemente bien.
Qué pasó
El modelo GLM 5.3 que Cloudflare ofrece en Workers AI se sirve con SGLang, un motor open source de inferencia, en modo desagregado: unas GPU hacen el prefill del prompt y producen un objeto llamado KV cache, y otras GPU hacen el decode, recibiendo ese cache por red. La ventana de contexto anunciada es de 1.048.576 tokens, pero el pool de KV cache en las GPU de prefill solo tenía espacio para 681.280. Cloudflare lo sabía antes de lanzar y siguió de todas formas, porque las pruebas devolvían respuestas bien formadas.
El motor, ante un prompt que no cabía en el pool, lo marcaba como rechazado y lo reemplazaba por un placeholder de un token. En un nodo único ahí termina la historia: el cliente recibe su error. Pero en modo desagregado el código revisaba si el pedido estaba terminado, no si estaba rechazado, y un rechazado se reportaba como vivo. Resultado: el nodo de decode reservaba páginas de memoria, el prefill solo le traspasaba una, y la atención del modelo leía el resto con lo que requests anteriores habían dejado ahí: prompts y respuestas parciales de otros clientes. La respuesta salía coherente, más rápido de lo que debiera, y el cliente se llevaba un 200.
Entre el 27 de agosto y el 9 de septiembre de 2026, 155 respuestas llevaron datos de otras sesiones, todas a prompts de más de 681.280 tokens. Gadi Evron, de la empresa Knostic, lo reportó el 8 de septiembre vía HackerOne. Cloudflare bajó el modelo en 40 minutos, agrandó el pool a unos 2 millones de tokens —el doble de la ventana— y parchó la ruta de rechazo; el fix ya está en SGLang 0.5.21.
Lección uno: el código de respuesta no es la respuesta
El post-mortem admite la parte más incómoda: sus pruebas de contexto largo validaban códigos HTTP y rendimiento, pero nadie miró si el texto generado era coherente. Un 200 con stream limpio se interpretó como todo en orden. Es la señalización barata usada como proxy de la señalización costosa: yo he visto sistemas calificados con «el script salió con exit 0» donde nadie revisó el resultado. Lo que corre sola —un cron, un batch nocturno— termina validado por su señal más barata disponible, y esa señal casi nunca es el contenido.
Lección dos: los dos números que nada obliga a igualar
Lo más citable del reporte: el pool de KV cache ni siquiera es un valor de configuración —SGLang lo calcula desde la memoria GPU que sobra tras cargar los pesos—, la ventana de contexto es un parámetro del modelo, y nada fuerza a que esos dos números se pongan de acuerdo. Es la clase de mismatch que muerde a cualquiera que administre VPS: se dimensiona con la memoria que dice el software, no con la que realmente ocupa.
Qué hago distinto desde hoy
Mis crons de GLM no se acercan ni cerca de 681 mil tokens y mi infraestructura no es la de Cloudflare: el bug no me tocó. Pero la lección aplica igual: en un servicio de IA compartido, el límite de contexto de la página del proveedor es una promesa, y la única verificación que vale es mirar la salida. Ahora tengo en el checklist un spot-check de contenido en cada pipeline automatizado: revisar al azar que la respuesta sea de mi sesión y hable de mi tema. Cuesta nada y cubre la clase de fallo que no tira error, la peor que existe.
Y ojalá más proveedores hicieran post-mortems así: línea de tiempo, parches upstream con número de PR, qué supusieron mal. La transparencia de Cloudflare acá es de las mejores del año, aunque signifique admitir doce días de bug activo.
Fuente: Cross-request KV cache exposure in the GLM-5.3 Workers AI model, and our remediation with SGLang, del blog de Cloudflare.
Fuente de inspiración: Cross-request KV cache exposure in the GLM-5.3 Workers AI model, and our remediation with SGLang