- Directed: dependencies flow in one direction.
- Acyclic: cycles are not allowed — a task cannot depend on another task that eventually depends back on the original (prevents infinite loops).

- Make complex dependencies explicit and easy to read.
- Enable parallel execution of independent tasks, improving throughput.
- Prevent infinite loops by design.
- Allow more efficient scheduling and faster end-to-end completion by running independent tasks concurrently.
Classic fan-out / fan-in example
In this pattern:
- Task A runs first.
- When A succeeds, tasks B and C run in parallel (fan-out).
- Task D runs only after both B and C finish successfully (fan-in).
- Task A starts first (no dependencies).
- After A completes, the controller starts B and C in parallel.
- Task D waits until both B and C have succeeded.
depends expressions
Argo supports a depends expression (string) that lets you specify boolean logic and check node outcomes such as Succeeded, Failed, Skipped, Error, Omitted, and Deemed. This is useful when you need conditional execution beyond simple “all predecessors succeeded”.
Example using boolean depends expressions:
- A and B run in parallel. If A succeeds and B fails:
- C (
A.Succeeded || B.Succeeded) evaluates to true and runs. - D (
A.Succeeded && B.Succeeded) evaluates to false and is skipped.
- C (
dependencies array -> depends expression
You cannot use dependencies (array) and depends (expression) on the same task. To convert an array-style dependency to a depends expression, join the nodes with the operator you need.
Example:
- Original (array-style):
- Equivalent
dependsexpression (all must succeed):
&& with || or build more complex expressions with parentheses and NOT as needed.
The
depends field is a string expression evaluated by the controller. It is mutually exclusive with the dependencies array — use one or the other.failFast flag on the DAG. Set failFast: false when you want independent branches to keep running even if another branch fails.
Example showing failFast (default behavior shown as true here):
- Use false for environments where long-running independent branches must complete (e.g., batch processing), and you prefer to gather results even if one branch fails.
- Official Argo Workflows docs: https://argoproj.github.io/argo-workflows/
- Argo Workflows DAG docs: https://argoproj.github.io/argo-workflows/workflow-types/dag/
- Kubernetes Concepts: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/