Saga Lara Flow, un paquete de Laravel de Andriy Karpishyn (discovery-ukraine), permite escribir procesos de negocio de larga duración como un único método handle(), sin encadenar jobs ni máquinas de estado. Cobrar la tarjeta, reservar stock, reservar el envío: todo como líneas secuenciales. El paquete registra cada paso completado en la base de datos. Cuando una ejecución se reanuda en un worker, el motor vuelve a ejecutar handle(), pero las llamadas a través de $this->action() devuelven los resultados guardados de los pasos ya terminados; cuando el replay alcanza código no ejecutado, continúa la ejecución normal. Si un paso lanza una excepción, las compensaciones de los pasos anteriores se disparan en orden inverso.

Las funciones clave incluyen compensaciones mediante compensateWith() (clase de acción o closure), señales con $this->signal() con plazos opcionales timeoutAfter() y AwaitSignalTimeoutException, bloques paralelos con política failFast() por defecto, flujos hijos con ChildClosePolicy (p. ej. Terminate) y sideEffect() para registrar valores no deterministas como UUID y mantener coherentes los replays. Las consultas por etiquetas (withTags(), $this->tag()) y los scopes running(), waiting() y failed() permiten localizar ejecuciones sin guardar IDs, por ejemplo para enviar una señal a todos los runs coincidentes.

Los workflows extienden la clase Workflow del paquete; las acciones son clases independientes resueltas desde el contenedor con sus propios ajustes de cola: $tries, $timeout y expiresAt(). Los reintentos agotados se manifiestan como ActionFailedException; un plazo superado como FlowExpiredException. Los pasos opcionales usan continueOnFailure()/optionalAction() con valores de respaldo. El builder $this->saga() agrupa pasos en una unidad de rollback con onCompensationFailure(CompensationFailurePolicy::Continue) y compensateInParallel(). Las ejecuciones se inician con la fachada SagaFlow: run() encola de forma asíncrona, runSync() ejecuta en el proceso, ideal para aserciones en tests. El fijado de versión (version('v2')) mantiene los runs en curso sobre su definición original.

El paquete requiere PHP 8.5 y Laravel 13, tiene licencia MIT y se instala con composer require discovery-ukraine/saga-lara-flow, seguido de migraciones y publicación de la configuración. Esta cubre conexión de base de datos, cola, bloqueos y hooks multi-tenant (closures capture/restore para el contexto del tenant). Comandos Artisan: make:workflow, make:action, saga-flow:list, saga-flow:signal, saga-flow:prune y saga-flow:monitor, que debe programarse cada minuto para vigilar los plazos. Documentación en sagalaraflow.dev; código fuente en GitHub bajo discovery-ukraine/saga-lara-flow.