Optionalcontext: JobStateFlatten activity-level context paths into store-ready key/values
Write the dimensional address into the state payload
Flatten job-level context paths into store-ready key/values
Build the list of child activities to transition to
Resolve expire and persistent policies from config
Bootstrap $self, $job refs and output.metadata.au timestamp
Extract the job status from the last transaction result
Did the semaphore reach its threshold? (from transaction results)
Persist the full activity + job state in a single store call
Optionaltxn: ProviderTransactionIncrement/decrement the job semaphore
Optionaltxn: ProviderTransaction
Re-executes an ancestor activity in a new dimensional thread, enabling retry loops and iterative patterns without violating the DAG constraint. The
cycleactivity targets a specific ancestor (typically aHookwithcycle: true) and sends execution back to that point.Each cycle iteration runs in a fresh dimensional thread — individual activity state is isolated per iteration, while shared job state (
job.maps) accumulates across iterations. This pattern enables retries, polling loops, and iterative processing.YAML Configuration
Key Behaviors
ancestorfield must reference an activity withcycle: true.input.mapsoverride the ancestor's output data for the next iteration, allowing each cycle to pass different values.Execution Model
Cycle is a Category A (Leg 1 only) activity:
See
CycleActivity for the TypeScript interface