El incidente principal fue una fuga de memoria en un servicio crítico (Firestarter) después de una migración de Node.js a Bun. La causa raíz fue una diferencia fundamental en el modelo HTTP de Bun en comparación con Node.js. En Bun, cada Promise<Response> devuelta por el handler fetch debe ser resuelta explícitamente para que Bun libere el contexto de la solicitud asociado. En Node.js, el servidor gestiona la limpieza del estado de la respuesta cuando el socket muere, independientemente de si res.end() fue llamado.
La fuga se manifestó cuando los clientes se desconectaban inesperadamente (ej. reinicios de pods, problemas de red). El handler abort de la señal de solicitud limpiaba el gestor de conexiones, pero no resolvía el Promise<Response> pendiente. Esto provocó que Bun retuviera el estado interno de la solicitud en memoria indefinidamente, causando un crecimiento constante del Resident Set Size (RSS).
Las salvaguardas fallaron porque el comportamiento de la gestión del ciclo de vida de la respuesta no fue completamente comprendido o documentado para el modelo HTTP de Bun, lo que llevó a una suposición incorrecta basada en la experiencia con Node.js. Aunque se realizaron extensas optimizaciones de rendimiento y profiling antes del despliegue, la fuga de memoria solo se hizo evidente en un entorno de producción con un patrón de desconexión de clientes realista. La reducción del idleTimeout de Bun a 120s inicialmente ralentizó la fuga al reducir la frecuencia de desconexiones prematuras, pero no abordó la causa raíz del problema de resolución de la promesa.