Las capturas de pantalla que circulan esta semana muestran todas lo mismo: php artisan dev con pestañas bonitas. Vale, se ve genial. Pero mi voto al cambio que de verdad merece titular en Laravel 13.25 va para un comando cuyo único propósito es que unos procesos no hagan nada durante un rato. queue:pause --all ataca un peligro de los deploys que la mayoría aprendimos a encogernos de hombros hace años, y lo hace con más cuidado que cualquier script de bash que yo haya escrito jamás para el mismo problema.

El peligro, por si has tenido la suerte de no toparte nunca con él: tu pipeline intercambia el código en disco, pero un worker de larga duración sigue teniendo las clases viejas cargadas en memoria, y los jobs que esperan en Redis fueron serializados contra la forma que tenía tu código ayer. Renombra un parámetro del constructor del job que genera las facturas mensuales, haz push a las 14:03, y un payload encolado a las 14:02 aterriza sobre una clase que ya no encaja con él. Te enteras por una tabla failed_jobs que no para de crecer mientras el pipeline sigue alegremente en verde. Hasta ahora tenías dos instrumentos muy toscos. El modo mantenimiento también echa a los visitantes que pagan, un daño colateral enorme para un problema de jobs en segundo plano. Y queue:restart nunca interrumpe nada, porque un worker solo comprueba esa señal cuando termina su job actual, así que el timing queda fuera de tus manos.

Laravel 13.25 te da el bisturí: ejecuta queue:pause --all antes de que salga la release, deja que los workers arranquen de nuevo con el código fresco, y luego queue:resume --all. Un job que ya está en plena ejecución llega a terminar, y el dispatching sigue funcionando todo el tiempo, así que el backlog simplemente se drena cuando reanudas. El detalle que me convenció de que alguien pensó esto a fondo: resumeAll() no toca una cola que fue pausada individualmente. Imagina a la compañera de guardia que pausó la cola de imports a las 3 de la madrugada porque un job envenenado la tiraba una y otra vez. Cuando tu script de deploy de las 9 de la mañana llama a Queue::resumeAll(), esa cola sigue parada, exactamente como debe ser. También hay un evento QueuesPaused, así que montar una alerta de Slack para "alguien congeló las colas de producción" te lleva unas cuatro líneas.

Ahora la parte vistosa, y quiero ser justo con ella. Desde 13.16, php artisan dev arranca todo el stack local desde una sola terminal: el servidor HTTP, queue:listen --tries=1 --timeout=0, Pail donde exista pcntl_fork, y tu build de frontend, ya corra sobre npm, pnpm, Yarn o Bun. Lo que añade 13.25 es @laravel/multiplex por debajo. Cada proceso vive en su propia pestaña, puedes reiniciar Vite sin llevarte por delante el listener de la cola, el modo stream por fin permite hacer scroll y buscar, y cuando no hay TTY, digamos en un contenedor, cae solo a la salida inline de siempre. Un proceso que se cae se reinicia automáticamente salvo que pases --no-restart. La pega: de momento solo macOS y Linux, Windows conserva el comportamiento antiguo basado en concurrently.

Aquí va la objeción que me tomo en serio: que un framework web incluya su propio multiplexor de terminal huele a scope creep. Existe tmux. Existe un fichero compose. Cada pieza móvil extra dentro del framework es algo que el equipo core tiene que mantener funcionando para siempre en todos los sistemas operativos y emuladores de terminal. Yo mismo he hecho ese argumento con otras funcionalidades. Lo que me hizo cambiar de opinión aquí es el onboarding. "Copia mi config de tmux" tiene una tasa de éxito de más o menos cero, y a los seis meses cada portátil del equipo ejecuta un stack local ligeramente distinto. Una llamada a DevCommands::artisan('horizon', 'queue') en AppServiceProvider, commiteada en el repo y reemplazando de raíz el worker por defecto, significa que tu setup local pasa por code review como todo lo demás, y dev:list le enseña a quien acaba de llegar exactamente qué va a correr antes de arrancar nada. Eso justifica algo de peso extra en el framework.

Para cerrar la tanda, el Installer v5.31.0 aprendió laravel package. Descarga el laravel/package-skeleton oficial, borra el historial de git del esqueleto, instala dependencias y luego te entrevista sobre lo que necesita el paquete, o se salta la entrevista por completo si pasas flags como --config, --facade y --vendor-namespace. Incluso detecta cuando lo maneja un agente de IA y se mantiene no interactivo en lugar de quedarse colgado en un prompt. Mi opinión es breve: la primera hora tediosa de extraer código compartido a un paquete decente acaba de volverse tan barata que "deberíamos empaquetar esto" quizá deje de ser una frase que solo decimos en las retros.

Da un paso atrás y fíjate en lo que ninguna de estas releases toca: routing, Eloquent, validación, el núcleo real del framework. Laravel está invirtiendo su energía en los minutos que rodean a tu código, en arrancar el stack, desplegarlo con seguridad, trocearlo. Creo que es la apuesta correcta en 2026, y queue:pause --all es la prueba, porque cierra un hueco que todos conocíamos y nadie priorizó. Así que dime: ¿vas a meter pause y resume en tu pipeline de deploy, o la ventana en la que un payload viejo se encuentra con código nuevo es un riesgo con el que tus clases de job son lo bastante estables como para convivir?