> ## Documentation Index
> Fetch the complete documentation index at: https://docs.superember.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow node reference

> Generated reference for every built-in SuperEmber workflow node.

This reference covers 28 built-in node types across 11 families. It is generated from the same descriptor catalog used by Workflow Studio, so configuration labels, output fields, and in-product guidance stay aligned.

For the authoring flow, see [Build a workflow](/guides/build-a-workflow). For the data model, see [Workflows](/concepts/workflows).

## Triggers

<a id="trigger-manual" />

### Manual trigger

`trigger.manual` · Version 1 · low risk

Start this workflow with a button click

#### What it does

Creates a run from a dashboard action, API call, or test-run command.

#### What it needs

An optional button label. The caller supplies the workflow input when it starts the run.

#### Configuration

| Key     | Label        | Type   | Required | Default | Description                                    |
| ------- | ------------ | ------ | -------- | ------- | ---------------------------------------------- |
| `label` | Button label | string | No       | —       | Short label shown for this manual start point. |

#### What it returns

The trigger source, the complete payload, and every payload field for later steps.

| Path             | Label           | Type   | Description                                           |
| ---------------- | --------------- | ------ | ----------------------------------------------------- |
| `triggerSource`  | Trigger source  | string | How the workflow run was started.                     |
| `triggerPayload` | Trigger payload | object | The complete normalized payload that started the run. |

#### Good to know

Test runs use the same node but report their trigger source as test.

***

<a id="trigger-webhook" />

### Webhook trigger

`trigger.webhook` · Version 1 · medium risk

Start when an outside service calls a URL

#### What it does

Creates a run from an authenticated workflow webhook registration.

#### What it needs

An active webhook registration configured separately for the published workflow version.

#### Configuration

This node has no node-specific configuration fields.

#### What it returns

The parsed body, safe headers, trigger source, and original normalized payload.

| Path             | Label           | Type                                                   | Description                                         |
| ---------------- | --------------- | ------------------------------------------------------ | --------------------------------------------------- |
| `triggerSource`  | Trigger source  | string                                                 | The webhook trigger source.                         |
| `triggerPayload` | Trigger payload | object                                                 | The normalized webhook payload.                     |
| `headers`        | Headers         | object                                                 | Webhook headers after sensitive values are removed. |
| `body`           | Body            | object \| array \| string \| number \| boolean \| null | The parsed webhook body as arbitrary JSON.          |

#### Good to know

Authorization, cookies, signatures, and configured secret headers are removed before the payload is stored.

***

<a id="trigger-schedule" />

### Schedule trigger

`trigger.schedule` · Version 1 · low risk

Start on a recurring schedule

#### What it does

Creates one workflow run for each occurrence of a published schedule.

#### What it needs

A cron schedule and, when needed, an IANA timezone such as Europe/Berlin.

#### Configuration

| Key        | Label    | Type   | Required | Default | Description                                 |
| ---------- | -------- | ------ | -------- | ------- | ------------------------------------------- |
| `cron`     | Schedule | string | Yes      | —       | Cron expression for the recurring schedule. |
| `timezone` | Timezone | string | No       | —       | IANA timezone used for schedule evaluation. |

#### What it returns

The scheduled timestamp, trigger source, and complete schedule payload.

| Path             | Label           | Type   | Description                                    |
| ---------------- | --------------- | ------ | ---------------------------------------------- |
| `triggerSource`  | Trigger source  | string | The schedule trigger source.                   |
| `triggerPayload` | Trigger payload | object | The complete schedule payload.                 |
| `scheduledAt`    | Scheduled at    | string | The ISO timestamp assigned to this occurrence. |

#### Good to know

Publishing creates an immutable version. Activate or update its durable schedule through trigger registration settings.

***

<a id="trigger-channel-message" />

### Channel message trigger

`trigger.channel_message` · Version 1 · medium risk

Start when a message arrives in a channel

#### What it does

Normalizes a registered channel event and creates a workflow run.

#### What it needs

A published channel-message registration and its channel binding.

#### Configuration

| Key       | Label   | Type   | Required | Default | Description                                                |
| --------- | ------- | ------ | -------- | ------- | ---------------------------------------------------------- |
| `channel` | Channel | string | No       | —       | Channel registration or binding that starts this workflow. |

#### What it returns

Message text and author, channel details, trigger source, and the complete normalized payload.

| Path             | Label           | Type   | Description                                        |
| ---------------- | --------------- | ------ | -------------------------------------------------- |
| `triggerSource`  | Trigger source  | string | The channel-message trigger source.                |
| `triggerPayload` | Trigger payload | object | The complete normalized channel payload.           |
| `message`        | Message         | object | Normalized message details.                        |
| `message.text`   | Text            | string | The message text.                                  |
| `message.author` | Author          | string | The channel user or author identifier.             |
| `message.id`     | Message id      | string | The external message identifier, when present.     |
| `channel`        | Channel         | string | The source channel or channel type.                |
| `text`           | Text            | string | The original top-level message text, when present. |
| `channelUserId`  | Channel user id | string | The source channel user identifier, when present.  |

#### Good to know

The original payload stays available even when a channel does not provide every normalized message field.

## Flow control

<a id="flow-condition" />

### Condition

`flow.condition` · Version 1 · low risk

Branch into true or false paths

#### What it does

Evaluates a value or comparison and activates the matching outgoing edge.

#### What it needs

A literal or upstream value, an operator, and a comparison value when the operator needs one.

#### Configuration

| Key         | Label        | Type                                                                                                                              | Required | Default  | Description                                             |
| ----------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | ------------------------------------------------------- |
| `condition` | Value        | string or number or boolean or null                                                                                               | Yes      | —        | Literal or upstream value evaluated by this condition.  |
| `operator`  | Comparison   | string (truthy, falsy, equals, not\_equals, contains, greater\_than, greater\_than\_or\_equal, less\_than, less\_than\_or\_equal) | No       | `truthy` | How the value is evaluated.                             |
| `compareTo` | Compare with | string or number or boolean or null                                                                                               | No       | —        | Literal or upstream value used by comparison operators. |

#### What it returns

The evaluated condition and the selected branch name.

| Path        | Label     | Type    | Description                        |
| ----------- | --------- | ------- | ---------------------------------- |
| `branch`    | Branch    | string  | The selected true or false branch. |
| `condition` | Condition | boolean | The evaluated boolean value.       |

#### Good to know

Only the selected branch runs. The other path is shown as skipped in run history.

***

<a id="flow-switch" />

### Switch

`flow.switch` · Version 1 · low risk

Route to one of several paths

#### What it does

Selects the outgoing edge whose port matches a configured branch value.

#### What it needs

A branch name or upstream value plus the named paths you want to expose.

#### Configuration

| Key      | Label  | Type   | Required | Default | Description                                                  |
| -------- | ------ | ------ | -------- | ------- | ------------------------------------------------------------ |
| `branch` | Branch | string | Yes      | —       | Branch name or upstream value used to select an output path. |
| `cases`  | Paths  | array  | No       | —       | Named output paths available on this switch.                 |

#### What it returns

The selected branch name.

| Path     | Label  | Type   | Description               |
| -------- | ------ | ------ | ------------------------- |
| `branch` | Branch | string | The selected branch name. |

#### Good to know

When no named edge matches, the default edge is used.

***

<a id="flow-merge" />

### Merge

`flow.merge` · Version 1 · low risk

Join branches back together

#### What it does

Waits until incoming paths converge and shallow-merges their available data.

#### What it needs

Incoming branches and any optional additional values.

#### Configuration

| Key      | Label             | Type   | Required | Default | Description                                              |
| -------- | ----------------- | ------ | -------- | ------- | -------------------------------------------------------- |
| `values` | Additional values | object | No       | —       | Optional values to add after the incoming branches join. |

#### What it returns

The merged workflow fields.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

When the same key appears more than once, the later value wins.

***

<a id="flow-stop" />

### Stop

`flow.stop` · Version 1 · low risk

End the workflow successfully

#### What it does

Completes the run immediately at this point in the graph.

#### What it needs

An optional final output object.

#### Configuration

| Key      | Label        | Type   | Required | Default | Description                                               |
| -------- | ------------ | ------ | -------- | ------- | --------------------------------------------------------- |
| `output` | Final output | object | No       | —       | Optional final fields returned by the completed workflow. |

#### What it returns

The configured final output fields.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

Steps after this node do not run.

***

<a id="flow-error" />

### Error

`flow.error` · Version 1 · low risk

End the workflow with an error

#### What it does

Fails the current run with a structured code and message.

#### What it needs

An optional error code and message.

#### Configuration

| Key       | Label         | Type   | Required | Default | Description                                            |
| --------- | ------------- | ------ | -------- | ------- | ------------------------------------------------------ |
| `code`    | Error code    | string | No       | —       | Stable code stored with the failed run.                |
| `message` | Error message | string | No       | —       | Plain-language explanation stored with the failed run. |

#### What it returns

No downstream data because the run ends in a failed state.

This node does not produce a successful downstream output.

#### Good to know

The error remains available in the run inspector for diagnosis.

## Data

<a id="data-set" />

### Set data

`data.set` · Version 1 · low risk

Store values for later steps

#### What it does

Adds or replaces a set of named workflow fields.

#### What it needs

One or more field names and values. Values can reference upstream outputs.

#### Configuration

| Key      | Label  | Type   | Required | Default | Description                               |
| -------- | ------ | ------ | -------- | ------- | ----------------------------------------- |
| `values` | Values | object | Yes      | —       | Fields to add or replace for later steps. |

#### What it returns

Exactly the configured fields.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

Later steps can insert these fields from this node by name.

***

<a id="data-map" />

### Map data

`data.map` · Version 1 · low risk

Reshape data from earlier steps

#### What it does

Creates a new object by assigning upstream values to the field names you choose.

#### What it needs

Mapping rows with a target name and a value, or a legacy items array.

#### Configuration

| Key        | Label    | Type   | Required | Default | Description                                                             |
| ---------- | -------- | ------ | -------- | ------- | ----------------------------------------------------------------------- |
| `mappings` | Mappings | object | No       | —       | Target fields and the upstream values assigned to them.                 |
| `items`    | Items    | array  | No       | —       | Legacy item-array passthrough used when no mapping rows are configured. |

#### What it returns

The mapped fields. Legacy item mode returns an items array.

| Path    | Label | Type  | Description                             |
| ------- | ----- | ----- | --------------------------------------- |
| `items` | Items | array | The mapped or passed-through item list. |

#### Good to know

Use mapping rows when later steps need clear, stable field names.

***

<a id="data-transform-expression" />

### Transform expression

`data.transform_expression` · Version 1 · medium risk

Compute a value from workflow data

#### What it does

Resolves an upstream variable or emits an explicit output object.

#### What it needs

A variable or text value, with optional named output fields.

#### Configuration

| Key          | Label         | Type   | Required | Default | Description                                 |
| ------------ | ------------- | ------ | -------- | ------- | ------------------------------------------- |
| `expression` | Value         | string | No       | —       | Upstream variable or text to emit as value. |
| `output`     | Output fields | object | No       | —       | Optional explicit output object.            |

#### What it returns

The explicit output fields, or the resolved value under value.

| Path    | Label | Type                                                   | Description                    |
| ------- | ----- | ------------------------------------------------------ | ------------------------------ |
| `value` | Value | string \| number \| boolean \| object \| array \| null | The resolved expression value. |

#### Good to know

This editor resolves workflow variables; it does not execute arbitrary JavaScript.

***

<a id="data-merge" />

### Merge data

`data.merge` · Version 1 · low risk

Combine data from multiple sources

#### What it does

Shallow-merges the run input, prior outputs, configured objects, and final values.

#### What it needs

Optional objects and final values to add to the available workflow data.

#### Configuration

| Key       | Label        | Type   | Required | Default | Description                              |
| --------- | ------------ | ------ | -------- | ------- | ---------------------------------------- |
| `objects` | Objects      | array  | No       | —       | Objects to merge in order.               |
| `values`  | Final values | object | No       | —       | Fields applied after the listed objects. |

#### What it returns

The merged fields.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

Later objects overwrite earlier keys; nested objects are not deep-merged.

***

<a id="data-pick" />

### Pick data

`data.pick` · Version 1 · low risk

Keep only the fields you need

#### What it does

Copies selected fields from the current workflow data into a smaller object.

#### What it needs

A list of field names.

#### Configuration

| Key    | Label          | Type  | Required | Default | Description                                 |
| ------ | -------------- | ----- | -------- | ------- | ------------------------------------------- |
| `keys` | Fields to keep | array | Yes      | —       | Field names copied into this step's output. |

#### What it returns

Every selected field that exists when this step runs.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

Missing fields are omitted instead of being returned as null.

## Waits

<a id="wait-delay" />

### Delay

`wait.delay` · Version 1 · low risk

Pause for a set amount of time

#### What it does

Creates a durable timer and resumes the run after it elapses.

#### What it needs

A delay duration.

#### Configuration

| Key       | Label | Type   | Required | Default | Description                         |
| --------- | ----- | ------ | -------- | ------- | ----------------------------------- |
| `delayMs` | Delay | number | Yes      | —       | How long to pause, in milliseconds. |

#### What it returns

The wait id and delay-elapsed reason.

| Path              | Label            | Type   | Description                                   |
| ----------------- | ---------------- | ------ | --------------------------------------------- |
| `waitId`          | Wait id          | string | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object | The data supplied when the wait was resolved. |
| `reason`          | Reason           | string | Why the delay resumed.                        |

#### Good to know

The run is checkpointed while it waits, so no process needs to stay alive.

***

<a id="wait-external-callback" />

### External callback

`wait.external_callback` · Version 1 · medium risk

Wait for an outside system to call back

#### What it does

Parks the workflow until an external resolver supplies a payload.

#### What it needs

Callback context, with an optional expected-field schema and deadline.

#### Configuration

| Key            | Label            | Type   | Required | Default | Description                                          |
| -------------- | ---------------- | ------ | -------- | ------- | ---------------------------------------------------- |
| `prompt`       | Callback purpose | string | No       | —       | What the outside system is expected to provide.      |
| `expiresAt`    | Deadline         | string | No       | —       | Optional ISO timestamp after which the wait expires. |
| `resumeSchema` | Expected fields  | object | No       | —       | Optional schema for the callback payload.            |

#### What it returns

The wait id plus every field supplied by the callback.

| Path              | Label            | Type   | Description                                   |
| ----------------- | ---------------- | ------ | --------------------------------------------- |
| `waitId`          | Wait id          | string | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object | The data supplied when the wait was resolved. |

#### Good to know

A missed deadline expires the wait and fails the run instead of continuing with empty data.

***

<a id="wait-channel-reply" />

### Channel reply

`wait.channel_reply` · Version 1 · medium risk

Wait for a reply in a channel

#### What it does

Parks the run until a person supplies a channel reply.

#### What it needs

A reply request and, when needed, the channel, assignee, and deadline.

#### Configuration

| Key         | Label         | Type   | Required | Default | Description                                          |
| ----------- | ------------- | ------ | -------- | ------- | ---------------------------------------------------- |
| `prompt`    | Reply request | string | Yes      | —       | Question or instruction shown to the respondent.     |
| `channel`   | Channel       | string | No       | —       | Channel or binding where the reply is expected.      |
| `assignee`  | Assigned to   | string | No       | —       | Person or group expected to reply.                   |
| `expiresAt` | Deadline      | string | No       | —       | Optional ISO timestamp after which the wait expires. |

#### What it returns

The reply, resolver identity when available, wait id, and original resolved payload.

| Path              | Label            | Type   | Description                                   |
| ----------------- | ---------------- | ------ | --------------------------------------------- |
| `waitId`          | Wait id          | string | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object | The data supplied when the wait was resolved. |
| `reply`           | Reply            | string | The reply text.                               |
| `replied_by`      | Replied by       | string | The resolver identity, when available.        |

#### Good to know

Open replies appear in the workflow inbox while the run is waiting.

## Human steps

<a id="human-approval" />

### Human approval

`human.approval` · Version 1 · medium risk

Ask a person to approve or reject

#### What it does

Creates a durable approval item and pauses the run until someone decides.

#### What it needs

An approval question and, when needed, an assignee and deadline.

#### Configuration

| Key         | Label                | Type   | Required | Default | Description                                              |
| ----------- | -------------------- | ------ | -------- | ------- | -------------------------------------------------------- |
| `prompt`    | What are you asking? | string | Yes      | —       | Approval request shown to the reviewer.                  |
| `assignee`  | Who decides?         | string | No       | —       | Person or group responsible for the decision.            |
| `expiresAt` | Deadline             | string | No       | —       | Optional ISO timestamp after which the approval expires. |

#### What it returns

The approval boolean, decision, resolver identity, note, and original resolved payload.

| Path              | Label            | Type    | Description                                   |
| ----------------- | ---------------- | ------- | --------------------------------------------- |
| `waitId`          | Wait id          | string  | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object  | The data supplied when the wait was resolved. |
| `approved`        | Approved         | boolean | Whether the reviewer approved the request.    |
| `decision`        | Decision         | string  | approved or rejected.                         |
| `decided_by`      | Decided by       | string  | The resolver identity, when available.        |
| `note`            | Note             | string  | Optional note supplied with the decision.     |

#### Good to know

The workflow inbox is the source of truth for unresolved approval work.

***

<a id="human-input" />

### Human input

`human.input` · Version 1 · medium risk

Ask a person for information

#### What it does

Creates a durable input request and pauses the run until it is answered.

#### What it needs

A question, optional answer-field name, assignee, expected fields, and deadline.

#### Configuration

| Key            | Label             | Type   | Required | Default | Description                                             |
| -------------- | ----------------- | ------ | -------- | ------- | ------------------------------------------------------- |
| `prompt`       | What do you need? | string | Yes      | —       | Input request shown to the respondent.                  |
| `field`        | Answer field      | string | No       | —       | Name used for the returned answer.                      |
| `assignee`     | Who answers?      | string | No       | —       | Person or group responsible for the answer.             |
| `resumeSchema` | Expected fields   | object | No       | —       | Optional structured answer schema.                      |
| `expiresAt`    | Deadline          | string | No       | —       | Optional ISO timestamp after which the request expires. |

#### What it returns

The named answer fields, resolver identity when available, wait id, and original resolved payload.

| Path              | Label            | Type   | Description                                   |
| ----------------- | ---------------- | ------ | --------------------------------------------- |
| `waitId`          | Wait id          | string | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object | The data supplied when the wait was resolved. |
| `answered_by`     | Answered by      | string | The resolver identity, when available.        |

#### Good to know

The current workflow inbox is optimized for one required text answer, while advanced schemas remain available.

***

<a id="human-choice" />

### Human choice

`human.choice` · Version 1 · medium risk

Ask a person to pick an option

#### What it does

Creates a durable choice request and pauses the run until one option is selected.

#### What it needs

A question, allowed choices, and optionally an assignee and deadline.

#### Configuration

| Key         | Label                    | Type   | Required | Default | Description                                             |
| ----------- | ------------------------ | ------ | -------- | ------- | ------------------------------------------------------- |
| `prompt`    | What should they choose? | string | Yes      | —       | Choice request shown to the respondent.                 |
| `choices`   | Choices                  | array  | Yes      | —       | Allowed choice labels.                                  |
| `assignee`  | Who chooses?             | string | No       | —       | Person or group responsible for the choice.             |
| `expiresAt` | Deadline                 | string | No       | —       | Optional ISO timestamp after which the request expires. |

#### What it returns

The selected choice, resolver identity when available, wait id, and original resolved payload.

| Path              | Label            | Type   | Description                                   |
| ----------------- | ---------------- | ------ | --------------------------------------------- |
| `waitId`          | Wait id          | string | The durable wait that paused this run.        |
| `resolvedPayload` | Resolved payload | object | The data supplied when the wait was resolved. |
| `choice`          | Choice           | string | The selected option.                          |
| `chosen_by`       | Chosen by        | string | The resolver identity, when available.        |

#### Good to know

The inbox checks configured choices before it resolves the wait.

## Agents

<a id="agent-task" />

### Agent task

`agent.task` · Version 1 · medium risk · Governed side-effect capability

Give one of your agents a task

#### What it does

Dispatches one agent, checkpoints the workflow, and resumes when the structured result arrives.

#### What it needs

An agent, an instruction, optional return fields, and an optional timeout.

#### Configuration

| Key            | Label                     | Type    | Required | Default   | Description                                                         |
| -------------- | ------------------------- | ------- | -------- | --------- | ------------------------------------------------------------------- |
| `agentId`      | Agent                     | string  | Yes      | —         | Fleet agent or step agent that performs this task.                  |
| `instruction`  | What should the agent do? | string  | Yes      | —         | Instruction sent to the selected agent.                             |
| `outputSchema` | What should it return?    | object  | No       | —         | Named structured fields required from the agent.                    |
| `timeoutMs`    | Timeout                   | integer | No       | `3600000` | Maximum time to wait for the durable agent result, in milliseconds. |

#### What it returns

The agent result directly, using the return fields configured on this step.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

The run does not depend on one web request staying alive while the agent works.

***

<a id="agent-collaboration-group" />

### Agent collaboration group

`agent.collaboration_group` · Version 1 · high risk · Governed side-effect capability

Have several agents work together

#### What it does

Runs declared child tasks and asks a lead agent to synthesize their outputs.

#### What it needs

A lead agent, one or more child tasks, and optional synthesis return fields.

#### Configuration

| Key                 | Label                        | Type                   | Required | Default        | Description                                                     |
| ------------------- | ---------------------------- | ---------------------- | -------- | -------------- | --------------------------------------------------------------- |
| `parentAgentId`     | Lead agent                   | string                 | Yes      | —              | Agent that synthesizes the child results.                       |
| `parentInstruction` | Synthesis instruction        | string                 | No       | —              | Instruction given to the lead agent after child work completes. |
| `childTasks`        | Child tasks                  | array                  | Yes      | —              | Declared child-agent tasks owned by this workflow step.         |
| `joinPolicy`        | Join policy                  | string (all\_complete) | No       | `all_complete` | Child completion policy.                                        |
| `outputSchema`      | What should the lead return? | object                 | No       | —              | Structured fields required from the lead synthesis.             |

#### What it returns

The lead agent's synthesis directly.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

This version supports all-complete joins. Child steps and artifacts remain owned by the workflow run.

## Fleet

<a id="fleet-orchestrate" />

### Fleet orchestration

`fleet.orchestrate` · Version 1 · high risk · Governed side-effect capability

Coordinate a fleet of agents on one goal

#### What it does

Runs participant tasks and reduces their results according to the selected fleet mode.

#### What it needs

A mode, participants, and the manager, reviewer, quorum, cancellation, or timeout settings required by that mode.

#### Configuration

| Key                    | Label                  | Type                                                                                                         | Required | Default           | Description                                                          |
| ---------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------ | -------- | ----------------- | -------------------------------------------------------------------- |
| `mode`                 | Mode                   | string (fan\_out\_join, manager\_delegate, reviewer\_synthesizes, race\_first\_success, race\_with\_timeout) | Yes      | —                 | How participants are coordinated.                                    |
| `participants`         | Participants           | array                                                                                                        | Yes      | —                 | Agents and instructions that make up this fleet step.                |
| `managerAgentId`       | Manager agent          | string                                                                                                       | No       | —                 | Agent that delegates work in manager mode.                           |
| `managerInstruction`   | Manager instruction    | string                                                                                                       | No       | —                 | Instruction used to choose a delegated participant.                  |
| `reviewerAgentId`      | Reviewer agent         | string                                                                                                       | No       | —                 | Agent that synthesizes participant results in reviewer mode.         |
| `reviewerInstruction`  | Reviewer instruction   | string                                                                                                       | No       | —                 | Instruction used to synthesize participant results.                  |
| `reviewerOutputSchema` | Reviewer return fields | object                                                                                                       | No       | —                 | Structured fields required from the reviewer.                        |
| `joinPolicy`           | Join policy            | string (all\_complete, consensus, quorum)                                                                    | No       | `all_complete`    | Fan-out join policy.                                                 |
| `cancellationPolicy`   | Cancellation policy    | string (cancel\_siblings, keep\_running)                                                                     | No       | `cancel_siblings` | What happens to siblings after the join is satisfied.                |
| `quorum`               | Quorum                 | integer                                                                                                      | No       | —                 | Minimum successful child results required.                           |
| `timeoutMs`            | Timeout                | integer                                                                                                      | No       | —                 | Race timeout duration in milliseconds.                               |
| `outputSchema`         | Fleet output contract  | object                                                                                                       | No       | —                 | Optional schema used to validate the complete fleet result envelope. |

#### What it returns

A join envelope with selected participant results plus manager or reviewer output when applicable.

| Path             | Label     | Type    | Description                               |
| ---------------- | --------- | ------- | ----------------------------------------- |
| `mode`           | Mode      | string  | The orchestration mode used for this run. |
| `join`           | Join      | object  | The result of the join decision.          |
| `join.satisfied` | Satisfied | boolean | Whether the join condition was met.       |
| `join.reason`    | Reason    | string  | Why the join completed.                   |
| `results`        | Results   | array   | Selected participant results.             |
| `manager`        | Manager   | object  | Manager-delegation output, when used.     |
| `synthesis`      | Synthesis | object  | Reviewer synthesis, when used.            |

#### Good to know

Participant work is stored as child workflow steps, so direct conversations never become workflow state.

## Workflows

<a id="workflow-subworkflow" />

### Sub-workflow

`workflow.subworkflow` · Version 1 · medium risk · Governed side-effect capability

Run another workflow as a step

#### What it does

Executes a published child workflow and returns its completed output to the parent.

#### What it needs

A child workflow and, optionally, a specific published version.

#### Configuration

| Key                    | Label               | Type               | Required | Default     | Description                                                                        |
| ---------------------- | ------------------- | ------------------ | -------- | ----------- | ---------------------------------------------------------------------------------- |
| `workflowDefinitionId` | Workflow            | string             | Yes      | —           | Published child workflow to execute.                                               |
| `workflowVersionId`    | Version             | string             | No       | —           | Optional published child version. The latest published version is used when empty. |
| `parentClosePolicy`    | Parent close policy | string (terminate) | No       | `terminate` | Synchronous child close policy.                                                    |

#### What it returns

Child run identifiers, the complete child output, and each child output field at the top level.

| Path                   | Label        | Type   | Description                         |
| ---------------------- | ------------ | ------ | ----------------------------------- |
| `childRunId`           | Child run id | string | Run created for the child workflow. |
| `workflowDefinitionId` | Workflow id  | string | Child workflow definition id.       |
| `workflowVersionId`    | Version id   | string | Child workflow version id.          |
| `output`               | Output       | object | Complete child workflow output.     |

#### Good to know

This version is synchronous. A child that enters a waiting state is terminated because async joins are not implemented yet.

## Code

<a id="code-user-runner" />

### User code runner

`code.user_runner` · Version 1 · high risk · Governed side-effect capability

Run custom code in a sandbox

#### What it does

Executes user-authored code through the isolated code-runner boundary.

#### What it needs

Code, explicit mapped input, an optional timeout, and optional non-executing environment or secret policy metadata.

#### Configuration

| Key         | Label                             | Type    | Required | Default | Description                                                                                                                    |
| ----------- | --------------------------------- | ------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `code`      | Code                              | string  | Yes      | —       | User-authored code executed by the isolated runner.                                                                            |
| `timeoutMs` | Timeout                           | integer | No       | `30000` | Maximum runner duration in milliseconds.                                                                                       |
| `env`       | Environment policy (not injected) | object  | No       | —       | Primitive policy metadata retained and validated with the step; the current runner does not inject these values.               |
| `secrets`   | Secret policy (not injected)      | object  | No       | —       | User-owned secret references and allowed hosts retained as policy metadata; the current runner does not receive secret values. |

#### What it returns

The runner's explicit output object.

The concrete fields are dynamic. Configure an output schema when the node supports one, or inspect a test run for the exact shape.

#### Good to know

Logs, errors, and artifacts stay available to the run inspector. The current runner does not inject configured environment variables or secret values into user code.

## Actions

<a id="action-send-message" />

### Send message

`action.send_message` · Version 1 · medium risk · Governed side-effect capability

Prepare a message for a channel

#### What it does

Records a governed message intent using fully resolved workflow data.

#### What it needs

A target channel, message body, and execution mode.

#### Configuration

| Key       | Label   | Type                          | Required | Default   | Description                        |
| --------- | ------- | ----------------------------- | -------- | --------- | ---------------------------------- |
| `channel` | Channel | string                        | Yes      | —         | Target channel or channel binding. |
| `body`    | Message | string                        | Yes      | —         | Message body sent to the channel.  |
| `mode`    | Mode    | string (dry\_run, test, live) | No       | `dry_run` | Action execution mode.             |

#### What it returns

A dry-run intent envelope containing the resolved message configuration.

| Path       | Label     | Type    | Description                                                      |
| ---------- | --------- | ------- | ---------------------------------------------------------------- |
| `dryRun`   | Dry run   | boolean | Whether the action was recorded without an external side effect. |
| `mode`     | Mode      | string  | The configured action execution mode.                            |
| `nodeType` | Node type | string  | The action node type that produced this intent.                  |
| `intent`   | Intent    | object  | The fully resolved action configuration.                         |

#### Good to know

The current executor records intent only. It does not send the external message yet.

***

<a id="action-http-request" />

### HTTP request

`action.http_request` · Version 1 · high risk · Governed side-effect capability

Prepare an external API request

#### What it does

Records a governed HTTP request intent using fully resolved workflow data.

#### What it needs

A URL plus optional method, headers, body, and execution mode.

#### Configuration

| Key       | Label   | Type                                   | Required | Default   | Description               |
| --------- | ------- | -------------------------------------- | -------- | --------- | ------------------------- |
| `method`  | Method  | string (GET, POST, PUT, PATCH, DELETE) | No       | `GET`     | HTTP method to use.       |
| `url`     | URL     | string                                 | Yes      | —         | Request URL.              |
| `headers` | Headers | object                                 | No       | —         | Optional request headers. |
| `body`    | Body    | string                                 | No       | —         | Optional request body.    |
| `mode`    | Mode    | string (dry\_run, test, live)          | No       | `dry_run` | Action execution mode.    |

#### What it returns

A dry-run intent envelope containing the resolved request configuration.

| Path       | Label     | Type    | Description                                                      |
| ---------- | --------- | ------- | ---------------------------------------------------------------- |
| `dryRun`   | Dry run   | boolean | Whether the action was recorded without an external side effect. |
| `mode`     | Mode      | string  | The configured action execution mode.                            |
| `nodeType` | Node type | string  | The action node type that produced this intent.                  |
| `intent`   | Intent    | object  | The fully resolved action configuration.                         |

#### Good to know

The current executor records intent only. It does not perform the network request yet.

## Connected apps

<a id="connector-action" />

### Connector action

`connector.action` · Version 1 · high risk · Governed side-effect capability

Prepare an action in a connected app

#### What it does

Records a governed connected-app action intent using resolved workflow data.

#### What it needs

A connector, action name, optional action fields, and execution mode.

#### Configuration

| Key         | Label         | Type                          | Required | Default   | Description                                |
| ----------- | ------------- | ----------------------------- | -------- | --------- | ------------------------------------------ |
| `connector` | Connected app | string                        | Yes      | —         | Connector binding id.                      |
| `action`    | Action        | string                        | Yes      | —         | Connector action name.                     |
| `input`     | Action fields | object                        | No       | —         | Values passed to the connected-app action. |
| `mode`      | Mode          | string (dry\_run, test, live) | No       | `dry_run` | Action execution mode.                     |

#### What it returns

A dry-run intent envelope containing the resolved connector configuration.

| Path       | Label     | Type    | Description                                                      |
| ---------- | --------- | ------- | ---------------------------------------------------------------- |
| `dryRun`   | Dry run   | boolean | Whether the action was recorded without an external side effect. |
| `mode`     | Mode      | string  | The configured action execution mode.                            |
| `nodeType` | Node type | string  | The action node type that produced this intent.                  |
| `intent`   | Intent    | object  | The fully resolved action configuration.                         |

#### Good to know

The current executor records intent only. It does not invoke the connector yet.
