Antes de empezar
- Un workflow en estado
draft. Solo un workflow en draft acepta una edición, así que escribe el trigger antes de activarlo. Consulta Primeros pasos con Flowker para el camino de creación y activación. - El binario worker en ejecución con el scheduler habilitado.
SCHEDULER_ENABLEDse resuelve comotruea menos que lo pongas enfalse, y la cola necesitaSCHEDULER_REDIS_HOST: sin host, el binario worker no arranca y ningún workflow programado se dispara. Revisa esa variable primero cuando tus schedules nunca se disparan. Consulta Variables del scheduler. - El permiso
readsobre el recursoworkflowspara listar ocurrencias y conteos, yupdatesobre el mismo recurso para ejecutar o descartar una.
Paso 1: Escribe el node del trigger de schedule
Los triggers vienen incluidos. Los descubres en el catálogo y nunca creas uno. Obtener un trigger del catálogo devuelve el JSON Schema del trigger de schedule desde la instancia en ejecución:
type: "trigger" y estos campos en su data:
Qué acepta la expresión cron
Cinco campos separados por espacios. Cada campo acepta*, un valor, una lista (0,30), un rango (9-17) o un paso (*/15, 9-17/2). El día de la semana va de 0 a 7, donde 0 y 7 significan domingo. Cuando restringes el día del mes y el día de la semana a la vez, el schedule se dispara en un día que coincide con cualquiera de los dos campos: 0 9 13 * 5 se dispara el día 13 y todos los viernes.
Un minuto es la cadencia más fina que una expresión de 5 campos puede expresar. Para algo más rápido, atiende la llamada en el momento en que llega con un trigger de webhook.
Flowker verifica la expresión cuando guardas el workflow y otra vez cuando lo activas, y responde FLK-0117 cuando no se sostiene. Estas formas no se sostienen:
- Una expresión de seis campos, como
*/30 * * * * *. - Una macro, como
@dailyo@every 5m. - Un día o un mes con nombre, como
MON,MON-FRIosun. - Un token
Lo#, como0 9 L * *o0 9 * * 5#2. - Un valor fuera del rango de su campo, como
60minutos,24horas, día del mes0o32, mes13o día de la semana8. - Un paso
/0.
Cómo funciona la zona horaria
Los campos del cron son hora de reloj de pared en la zona que nombras, y cada hora que devuelve la API es UTC. Un schedule0 9 * * * en America/Sao_Paulo reporta 12:00Z. Una zona que observa horario de verano mantiene la hora de reloj de pared a través del cambio: la misma expresión en America/New_York reporta 14:00Z en invierno y 13:00Z en verano.
Paso 2: Activa el workflow y lee la cadencia
1
Guarda el workflow
Envía el node con el resto de tu workflow a Crear un workflow, o a Actualizar un workflow si el draft ya existe. Flowker valida el cron aquí.
2
Revisa la cadencia antes de comprometerte con ella
Listar próximas ocurrencias programadas calcula los próximos disparos directamente desde el trigger, así que puedes leerlos mientras el workflow todavía es un draft.
limit acepta de 1 a 50 y por defecto es 10. Un valor fuera de ese rango responde FLK-0304.3
Actívalo
Llama a Activar un workflow. En menos de un minuto el engine registra la próxima ocurrencia y la encola para su horario.
Paso 3: Mira qué ocurrencias no se ejecutaron
Una ocurrencia queda retenida cuando el engine llega a ella más de un minuto después de su horario y nadie ha pedido que ese horario se ejecute: el servicio estaba caído, la cola venía atrasada, el proceso se reinició. Flowker nunca ejecuta una ocurrencia retenida por su cuenta: la guarda para tu decisión, en el estado
pending-review. Retener es el único resultado que no es terminal: una ocurrencia retenida sigue accionable hasta que la ejecutes o la descartes.
Flowker nunca rellena un horario que pasó. Así que la lista de retenidas guarda los disparos que Flowker ya había registrado y no pudo ejecutar — no una entrada por cada horario que pasó durante una caída — y la cadencia misma se reanuda desde el próximo horario futuro.
Una ocurrencia queda omitida cuando el engine la tomó y la cerró sin ejecutar el workflow. Una ocurrencia omitida es terminal y lleva un skipReason:
Las dos clases no se separan por el momento del disparo. Una cosa sí la decide ese momento: un horario tardío que nunca pediste ejecutar aparece en la lista de retenidas, nunca en la de omitidas. Después de que pides que un horario retenido se ejecute, su antigüedad deja de detenerlo. El engine lo toma entonces como cualquier otra ocurrencia, y los tres motivos de arriba pueden cerrarlo. Así que un
scheduledFor muy antiguo es normal en la lista de omitidas, y no significa que el horario se disparó a tiempo. El Paso 4 cubre en qué puede terminar tu propia ejecución.
Tres lecturas cubren el panorama completo:
1
Lista las ocurrencias retenidas de un workflow
Listar ocurrencias programadas retenidas las devuelve de la más antigua a la más reciente.
scheduledFor es el horario que representa la ocurrencia, y status es lo que decide si puedes actuar sobre ella.Esta ruta no acepta limit ni cursor de paginación, y devuelve como máximo 100 ocurrencias. Planea una recuperación masiva con eso en mente: trabaja las filas que recibes y vuelve a leer la lista. El conteo de más abajo informa el total real. Descartar la lista completa también cubre todas las ocurrencias pendientes de revisión, no solo las 100 que muestra una sola lectura.2
Lista las ocurrencias omitidas
Listar ocurrencias programadas omitidas las devuelve de la más antigua a la más reciente, cada una con su Una serie de omisiones
skipReason. limit acepta de 1 a 50.active-run significa que el workflow tarda más que el intervalo entre dos disparos. Amplía la cadencia o haz que el workflow termine más rápido.3
Cuenta lo que espera en todos los workflows
Contar ocurrencias pendientes de revisión responde por todo el tenant en una sola llamada, que es lo que consultas para un badge de revisión. El mapa es disperso: un workflow sin nada en espera no aparece en él.Agrega
?workflowIds=<id>,<id> para limitar los conteos a los workflows que te interesan.200 con un arreglo occurrences vacío para un id de workflow que tu tenant no posee, así que una lista vacía significa “nada que revisar aquí”.
Paso 4: Ejecuta o descarta una ocurrencia retenida
Ejecutar y descartar actúan sobre una ocurrencia cuyo
status es pending-review. Cualquier otro estado responde FLK-0755, lo que también vuelve segura una llamada repetida: la segunda es rechazada en lugar de actuar dos veces. Tu propia ejecución deja la ocurrencia en uno de esos otros estados: sale de pending-review de inmediato.
Una ejecución que pides sale de la lista de retenidas al instante, y la antigüedad del horario ya no la detiene. No promete que el workflow se ejecute:
- El workflow se ejecuta. La ejecución aparece en Listar ejecuciones para ese workflow.
- El engine cierra la ocurrencia como omitida. Sale de la lista de retenidas hacia la de omitidas con uno de los tres motivos de arriba.
active-runsignifica que otra ejecución del workflow todavía estaba en curso.workflow-gonesignifica que el workflow no estaba activo cuando tu ejecución llegó al engine.execution-duplicatesignifica que el trabajo de ese horario ya se había ejecutado.
FLK-0755. Lee las dos listas antes de concluir algo sobre un horario que intentaste recuperar. La fila omitida puede registrar el rechazo de tu recuperación, no del disparo original.
Mantén el workflow activo mientras trabajas la lista. Una ejecución recarga el workflow, y un workflow que no está activo cierra la ocurrencia como una omisión workflow-gone en lugar de ejecutarla.
1
Ejecuta una ocurrencia
Ejecutar una ocurrencia retenida la mueve a La ejecución cubre ese único horario. No desplaza la cadencia: el próximo disparo sigue siendo el que el engine ya planeó.
queued y la entrega al mismo camino de ejecución que usa un disparo programado. Arranca en uno o dos segundos.2
Descarta una ocurrencia
Descartar una ocurrencia retenida la mueve a
discarded, que es terminal. La ocurrencia nunca se ejecuta y sale de la lista de retenidas.3
Limpia toda la lista de retenidas de un workflow
Descartar todas las ocurrencias retenidas descarta, en una sola escritura, todas las ocurrencias de ese workflow que están pendientes de revisión, y reporta cuántas movió.Sin nada pendiente de revisión responde
200 con "discarded": 0, así que una llamada repetida es segura.Confirma que funcionó
- La cadencia está sana cuando Listar próximas ocurrencias programadas devuelve horarios futuros y la lista de retenidas se mantiene corta.
- Una ejecución funcionó cuando la ocurrencia salió de la lista de retenidas y la ejecución aparece en Listar ejecuciones para ese workflow.
- Un descarte funcionó cuando la ocurrencia salió de la lista de retenidas y el conteo de pendientes de revisión de ese workflow bajó.
Cambia o pausa una cadencia
Solo un workflow en draft acepta una edición, así que un cambio de cadencia son cuatro llamadas:
- Desactiva el workflow. Flowker deja de registrar nuevas ocurrencias para él.
- Muévelo a draft.
- Actualiza el workflow con el nuevo valor de
cron,timezoneoenabled. - Actívalo. En menos de un minuto el engine registra la próxima ocurrencia de la nueva cadencia.
Una ocurrencia que Flowker registró antes del cambio sigue pendiente. Lee la lista de retenidas después de un cambio de cadencia y limpia lo que ya no quieras.
Cuando algo falla
Dos fallas no responden ningún código de error:
- Las próximas ocurrencias se listan, pero nada se ejecuta nunca. La API calcula la cadencia por su cuenta, mientras que el binario worker es el que la dispara. Confirma que el worker está en ejecución y que
SCHEDULER_REDIS_HOSTestá definido. Consulta Variables del scheduler. - No se registra nada nuevo para un workflow activo. Revisa
enableden el node trigger:falsemantiene el workflow activo y su schedule en silencio.
Qué sigue
Configurar un trigger de webhook
Inicia el mismo workflow desde una llamada HTTP entrante en lugar de una cadencia.
Guía de diseño de workflows
Construye el resto del grafo al que entra el trigger.

