Skip to content

Lifecycle Models

Every infrastructure tool takes a position on the lifecycle — how infrastructure is created, changed, reconciled, and retired — usually implicitly, and usually welded to the compiler so you can’t take one without the other. chant declines that bet: pluggable lexicons in, pluggable lifecycles out, pure synthesis in the middle. Bring your own lifecycle, and chant makes it durable.

This page makes the axes explicit so the rest of the docs can point here instead of re-deriving the argument. For the cost side of the trade — what an authoritative state file actually buys and charges — see State and Governance.

Any lifecycle model is a point in a three-dimensional space.

Truth lives in…CalledExamples
A state fileAuthoritativeTerraform, Pulumi
The live systemObservationalquery the cloud, diff against a snapshot
The source codeSource-as-truthGitOps reconcilers
DirectionNameWhat it does
code → cloudApplypush declared source into the live system
cloud → codeSyncpull live reality back into source (open PRs)
noneObservereport drift, change nothing
Answered byMechanism
A trusted state filethe tool consults its own record
A live ownership markera tag/label on the cloud resource
Nobodythe tool escalates rather than guessing

This third axis is the one most tools collapse into the first: they answer “is this mine?” from the same state file they host. chant separates them on purpose.

  • Truth is the live system. chant reads the cloud directly. The snapshot it stores is evidence for diffing, never a source of truth.
  • Reconciliation direction is a per-environment choice. A dev environment might only observe; staging might reconcile cloud → code; production might apply code → cloud behind a gate. Same project, different dial positions.
  • Ownership is answered by live markers. A chant-managed resource carries a marker — a standard tag or label — that records the stack identity on the resource itself. “Is this mine?” is answered by reading that marker, never by a record chant has to lock.

The three axes collapse, in practice, into one dial chosen per environment:

observe → reconcile → authoritative
(report) (cloud→code (code→cloud
PRs) apply)
  • observechant lifecycle diff --live / WatchOp. Detect drift, change nothing.
  • reconcileReconcileOp. Open PRs that pull live reality back into source.
  • authoritativeApplyOp. Push declared source into the cloud, deleting owned orphans.

You turn the dial up per environment as trust and tooling allow. Nothing forces an environment past the position you chose for it.

There is exactly one rule that prevents this model from quietly becoming the thing it avoids:

The projection reads ownership from the live marker, never from the snapshot.

The moment a mutation trusts the snapshot — uses it to decide what to create, update, or delete — the snapshot becomes load-bearing, and you have rebuilt an authoritative state file under a different name, with all its costs. chant’s change set (chant lifecycle plan) reads ownership only from the live resource. The snapshot can be deleted between runs with no change in behavior. That is the test, and chant holds to it by construction.