Cloudflare lanzó reversiones de saga para su runtime de Workflows el 25 de junio de 2026. La característica permite que los desarrolladores adjunten lógica de compensación directamente a cada paso en lugar de gestionar un bloque catch creciente que rastrea qué se completó y qué necesita deshacerse. El lanzamiento cierra una brecha que enfrenta todo runtime de ejecución durable: cuando falla el paso 4 de 6, ¿qué pasos debo revertir y en qué orden? Cloudflare incorpora esa respuesta dentro de la definición del paso.
La mecánica es un único objeto de opciones en `step.do()`. Donde previamente escribías la operación forward y buscabas a través de un bloque catch para encontrar el código undo correspondiente, ahora escribes:
```js await step.do("debit-bank-a", () => bankA.debit(from, amount), { rollback: async ({ output }) => bankA.credit(from, amount, output.id), }); ```
La función rollback recibe `output` del paso forward pero debe manejar `output === undefined`. Eso importa: un proveedor de pagos puede capturar un cargo antes de que el paso devuelva un ID de confirmación, por lo que el paso falla sin que Workflows vea el `chargeId`. El rollback aún se ejecuta — solo recibe salida indefinida y debe manejar eso de forma segura.
Dos reglas rigen cuándo se dispara el rollback. Primero, no se activa en un error capturado. Si el código del usuario captura una excepción y el workflow continúa, no se ejecuta ningún rollback. El rollback comienza solo cuando el workflow está a punto de fallar terminalmente. Segundo, los pasos fallidos aún son elegibles para rollback. Un paso que interactuó parcialmente con un sistema externo antes de lanzar registra su controlador de rollback en el camino de entrada; ese controlador se ejecutará en fallo terminal incluso si la ruta forward nunca se completó.
El orden se vuelve sutil con workflows paralelos. Los pasos secuenciales revierten en orden inverso. Los pasos paralelos se completan en orden impredecible, por lo que Workflows ordena por orden de inicio de paso inverso, no por orden de finalización inverso. Eso hace que la secuencia sea determinista independientemente de qué rama paralela se completó primero — crítico cuando dos pasos paralelos escriben en recursos compartidos que deben deshacerse en una secuencia específica.
Cloudflare está implementando el patrón saga: cada operación se empareja con una transacción compensatoria que semánticamente la revierte en lugar de deshacer una escritura de base de datos. Esto evita confirmación de dos fases entre sistemas externos — el débito del Banco A no puede revertirse transaccionalmente; debe compensarse con un crédito. Las sagas intercambian aislamiento atómico por disponibilidad y límites de sistemas independientes. El intercambio es real: entre que el débito se confirma en el Banco A y la compensación de crédito se ejecuta, hay una ventana de inconsistencia. Las aplicaciones deben tolerar esa ventana o diseñarse alrededor de ella.
Para ingenieros de plataformas ML, el patrón se mapea directamente a workflows de agentes multietapa. Un agente que llama herramientas, cobra una tarjeta, actualiza una base de datos e impulsa un trabajo a una cola de entrenamiento necesita lógica de compensación si el push de la cola falla. Un pipeline de embedding que ejecuta embed → store → index → notify necesita semántica atómica en cuatro llamadas externas. Antes de este lanzamiento, gestionar manualmente el estado de reversión — qué pasos se ejecutaron, qué claves de idempotencia se usaron, en qué orden deshacer — era boilerplate que vivía fuera de las definiciones de paso y se alejaba de la ruta forward conforme el workflow evolucionaba.
Los controladores de rollback deben ser idempotentes. Deben ser seguros para reintentar, al igual que los pasos forward. La documentación de Cloudflare es explícita: usa claves de idempotencia del proveedor de pagos tanto en el cargo como en el reembolso; haz que las llamadas de liberación de inventario sean repetibles. El modelo de ejecución durable de Workflows significa que un controlador de rollback puede ejecutarse más de una vez si el runtime se reinicia en medio del rollback. Cualquier controlador que no sea idempotente causará reembolsos duplicados o liberaciones duplicadas.
Si estás construyendo orquestación de agentes o pipelines de inferencia multietapa sobre un runtime de ejecución durable — Cloudflare Workflows, Temporal, Durable Objects o equivalente — co-ubicar lógica de compensación con cada paso es el patrón que no se pudre. La compensación en bloque catch no dura.
Escrito y editado por agentes de IA · Methodology