Control ​
| Workflow | Type | Description |
|---|---|---|
| control.collection.distinct | Atomic | Drop duplicate elements (optionally by a field), preserving order |
| control.collection.filter | Atomic | Keep the list elements matching one comparison predicate |
| control.collection.flatten | Atomic | Flatten nested lists up to a given depth (-1 = fully flat) |
| control.collection.group_by | Atomic | Bucket list elements into an object keyed by a field path |
| control.collection.map | Atomic | Apply one unary transform (cast/case/abs/length…) to every list element |
| control.collection.match | Atomic | Match two record lists by exact or decimal-tolerance rules without guessing collisions |
| control.collection.pluck | Atomic | Extract one field (dotted path) from every element into a flat list |
| control.collection.reduce | Atomic | Aggregate a list with count/any/all/sum/min/max into one value |
| control.collection.slice | Atomic | Take a bounded window of a list (offset/limit; negative offset = from end) |
| control.collection.sort | Atomic | Sort a list (optionally by a field path), ascending or descending |
| control.flow.guard | Atomic | Assert a condition; pass through if it holds, else fail the branch with a reason |
| control.flow.wait | Linear | Pause for a bounded delay (seconds or until an epoch) before continuing |
| control.http.request | Atomic | Make a generic HTTP/REST request so integrations without a first-class workflow are reachable |
| control.math.compute | Atomic | Evaluate one arithmetic op (add/sub/mul/div/mod/pow/min/max/abs/neg/round) |
| control.policy.evaluate_matrix | Atomic | Evaluate a list of items against reusable policy rules and summarize compliance |
| control.poll.until | Linear | Poll a read-only probe workflow until a predicate on its output holds (or stop/deadline) |
| control.predicate.combine | Atomic | Combine a list of booleans with all/any/none into one result |
| control.predicate.compare | Atomic | Compare two values with one operator, emitting a boolean result |
| control.switch.select | Atomic | Map a value to a branch label via a cases table (with optional default) |
| control.text.extract_matches | Atomic | Extract regex matches from text into deterministic JSON row objects |
| control.text.join | Atomic | Join a list into a string with a separator (default empty) |
| control.text.replace | Atomic | Replace substrings in a string (literal or regex) |
| control.text.split | Atomic | Split a string into a list by a separator (default: whitespace) |
| control.time.now | Atomic | Emit the current UTC time (iso8601/date/epoch) as a value for downstream steps |
| control.value.build | Atomic | Build one object from a fields dict, with optional defaults and null-dropping |
| control.value.cast | Atomic | Coerce a value to a declared type (str/int/float/bool/json/list) |
| control.value.coalesce | Atomic | Return the first non-null value from an ordered candidate list |
| control.value.format | Atomic | Interpolate {0}..{7} placeholders in a template from positional arg0..arg7 — the composition-friendly form of control.value.template (each argN is a top-level input so a composition can bind a ref to it without nesting inside a values dict). |
| control.value.get | Atomic | Extract a nested value from an object/list by a dotted/indexed path |
| control.value.merge | Atomic | Merge two objects (overlay wins); deep (recursive) or shallow |
| control.value.set | Atomic | Set one key on an object to a value, composing objects across steps |
| control.value.template | Atomic | Interpolate a string template ({name} placeholders) from a values dict |
| control.version.lag_summary | Atomic | Aggregate version-lag evidence rows into a deterministic summary |
| control.version.select_latest | Atomic | Select the latest comparable version and compute current-version lag evidence |
