# Explicit execution and data

Source: https://openflow.run/en/docs/design/execution-model/
Language: en
Product version: 0.1.0-beta.77

Use separate control paths and input bindings to make workflow behavior inspectable.

A workflow declares when work can run and where its data comes from. Execution edges and input bindings answer these questions independently.

## Execution paths

A Run starts at one Trigger. An ordinary node waits for its direct predecessors in the current iteration to complete or be skipped, then runs if at least one incoming edge was selected. When every incoming path is skipped, it remains skipped.

Condition and waiting nodes select named execution paths. Their branch names are control signals, not ordinary business data outputs.

Condition compares the customer tier and selects the priority branch or its otherwise branch.

**Input**
The compared customer tier is "priority".

**Expected result**
Priority queue is selected. Changing the tier to another value selects Standard queue.

**Before running**
An Open Flow deployment is needed to execute or import this example. The preview itself runs offline.

[Download workflow](https://openflow.run/docs/examples/route-by-value.openflow.json)

## Data sources

A node reads fixed values, supported variables, or outputs available on its selected upstream paths. Connecting an execution edge does not create an input binding. Binding an output does not create an execution edge.

At a join, inputs can use the selected predecessor paths and their ancestors. A skipped path cannot supply an old value from an earlier invocation. The Run’s latest-result display does not determine input precedence.

Start supplies a name, Value supplies a prefix, Code combines them, and Outputs declares the workflow result.

**Input**
{"name":"Ada"}

**Expected result**
{"message":"Hello, Ada!"}

**Before running**
An Open Flow deployment is needed to execute or import this example. The preview itself runs offline.

[Download workflow](https://openflow.run/docs/examples/first-workflow.openflow.json)

## Loops

Back edges can open later iterations. Initial entry does not wait for recurrence edges, and execution budgets bound repeated work. Read explicit feedback through the current path’s available outputs rather than relying on whichever node last completed.

## Side effects

A Task commits a business result after output validation. External calls can take effect before a later step fails. Cancellation, publication rollback, or a failed Run does not reverse an email, API request, or other external write.

Unknown outcomes are preserved as unknown. Recovery must not automatically repeat an external operation whose result cannot be confirmed. See [errors and retries](https://openflow.run/en/docs/concepts/errors-and-retries/index.md).

## Sources

*   [docs/architecture.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/architecture.md#graph-execution-and-side-effects)
*   [docs/control/contracts/control-api.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/control-api.md#execution-graphs-and-input-sources)
