Skip to main content
Configure services and stable settings through ordinary Step constructors. Pass per-run business values through typed arguments and results. StepContext contains metadata and is not an application context map.

Direct chaining and earlier values

The compiler passes Request to the first Step as a whole value. It then derives ReportInput from the committed Diff and original request. You do not author casts, binding lambdas or context keys. The exact effective input and its provenance are saved before execution and reused after recovery.

Scope and ambiguity

A child exposes its declared output, not its internal values. A parallel branch or fan-out item sees its own state and legal outer values, not siblings’ private state. The enclosing join publishes typed results. Exclusive continuing arms may provide a proven shared result role; non-returning arms contribute no normal result. Whole compatible values take precedence over record assembly. Independent same-typed candidates refuse when no structural role selects one. Use distinct domain records such as Quality and Backport for distinct roles. Do not rely on record component names, completion order or an arbitrary nearest earlier producer to disambiguate. Parameterized Lists retain their element types.

Object responsibilities

The workflow defines control flow and derived data dependencies. The registry supplies the exact Step objects used in that definition. Constructors own external services and configuration. Runtime policy bounds execution, while compatibility metadata identifies the application deployment. Step objects may serve concurrent runs; their thread safety remains the application’s responsibility. See the runnable progression.