Composition & Wiring
A component’s deploy is a composition over capabilities, expressed in the same grammar as Ops: phases run in order, steps in a phase run sequentially unless parallel, gate stops the run gated until the ledger carries its resolution, and onFailure compensates. Steps wire output to input so lint can check the graph before anything runs.
deploy: [ phase("Publish", [publishImage({ from: "archive", to: "$env.registry" })]), // → @Publish.digest phase("Apply", [cfnDeploy({ template: "archive:t.json", imageRef: "@Publish.digest" })]), phase("Verify", [waitSteadyState({ service: "api" })]),]Fan-out is composition, not orchestrator knowledge
Section titled “Fan-out is composition, not orchestrator knowledge”A single component can expand to many units — one CloudFormation stack per instance in a cluster, one host in a fleet. The fan-out is authored in the composition, never known by the driver.
A fan-out unit is itself a small composition. One EC2 instance is provision (cfn-deploy) + code deploy (code-deploy) + health. A component that fans out over N instances composes N such mini-compositions, sequenced seed-first then rolling with a health gate between:
deploy: [ phase("Seed", [cfnDeploy({ stack: "neo4j-az0-0", template: "archive:neo4j.template.json" }), codeDeploy({ instance: 0, revision: "$env.appBundle" }), waitClusterHealthy({ size: 1 })]), ...followers.map((n) => // Array.map over instance configs phase(`Node ${n}`, [cfnDeploy({ stack: `neo4j-${n}`, template: "archive:neo4j.template.json" }), codeDeploy({ instance: n, revision: "$env.appBundle" }), waitClusterHealthy({ quorum: true })]), ),]The driver never learns that a Neo4j cluster seeds first. If a composition ever needs an if component.name === … in the driver, the contract or a capability is missing expressiveness — fix it there, never in the driver.
For wiring one component’s data into another — cross-stack outputs and cross-component artifact references — see Wiring Components.
Read next
Section titled “Read next”- Wiring Components — cross-stack outputs and cross-component artifact outputs, the two ways components reference each other.
- Build Archive — where a producer’s artifact lives before it is published.
- Orchestration — how the graph order becomes a run.