Orchestration
The orchestrator runs a set of components in dependency order, dispatching each step to its capability. It contains no per-component code. There are two modes, and both make pipeline count independent of component count.
Interpret mode
Section titled “Interpret mode”chant generates one orchestrator Op that reads the declarations, orders them with chant graph --components (dependency order from each component’s dependsOn, plus parallel-safe waves), and drives each composition. No per-component pipeline files exist.
The orchestrator is an Op, so it runs local by default on the in-process executor. Phase sequencing, retries, activity profiles, and onFailure saga rollback all work locally with nothing installed.
Generate mode
Section titled “Generate mode”The same declarations synthesize plain CI YAML through the GitHub, GitLab, or Forgejo lexicon. Pipeline files still exist, but nobody maintains them by hand, and a cross-cutting change is one edit to the generator. The generated YAML is a thin trigger and runner; the deploy logic stays in the component, not the YAML.
The two compose: interpret mode behind a thin generated CI trigger.
Execution backends and the default profile
Section titled “Execution backends and the default profile”The orchestrator is a backend interface, not one engine. Two axes swap independently and a component definition does not change across them: the trigger/scheduler host (when and what to invoke) and the execution engine (how a run executes).
- General-consumption default. Plain CI (generated) for the trigger and runner, the local executor for one-shot deploys, native scheduling. Zero exotic dependencies — this is what keeps the model broadly adoptable rather than “requires our stack.”
- Cloud/k8s-native. Lean on what the platform already reconciles and schedules — CronJob/Jobs/Argo on k8s, native schedulers and CloudFormation
deployon AWS. - Opt-in advanced backends. Temporal as the durable execution engine for gated or crash-resumable components; Dagster or Airflow as a team-owned trigger host that invokes
chant run. Chosen when a team needs or owns them, never baseline.
Rollback comes free
Section titled “Rollback comes free”Because each capability declares its own compensation, the orchestrator gets saga rollback without a hand-written rollback pipeline: on failure it unwinds executed steps in reverse and calls each rollback. Native rollbacks are reused where the platform provides them — cfn-deploy triggers CloudFormation’s own rollback-stack, code-deploy triggers CodeDeploy’s own automatic rollback to the last known-good revision. Where a capability has no native rollback (ecs-update-service, lambda-deploy), it declares a best-effort compensation instead (re-apply the prior state); where a component needs a truer restore than that best-effort re-apply gives, it supplies its own component-level rollback phase (the ALB/ECS pilot does this with rollback-previous). Non-auto, non-compensable cases opt out with a stated reason (noRollback: "<reason>" on the step) rather than failing silently — the COMP003 lint rule requires the reason at author time, and the driver reports the same fact at run time: a step whose capability has no rollback gets its own rollback-opted-out record in the run result, carrying that reason, rather than being passed over without a trace.
What chant adds over hand-driving it
Section titled “What chant adds over hand-driving it”- Semantic lint on the composition. Publishes-but-never-applies, an
imageRefto a phase that does not exist, a mutating capability with no rollback and no opt-out, a gate in a local-executor component, a capability named after a component. These are the long-term entropy guards a plain JSON contract cannot enforce — see the Composition lint rules (COMP001–COMP007). - The graph and the generated driver.
chant graph/describeover components;chant buildemits the durable orchestrator.
Read next
Section titled “Read next”- Cloud-Agnostic Boundary — what ports across clouds and what does not.
- Local vs Temporal — the executor trade-off in depth.