Dependencies and outputs
Use an output expression when one resource needs a value created by another:
resources: { network: { apiVersion: "praxis.io/alpha" kind: "VPC" metadata: {name: "payments", labels: {}} spec: { region: "us-west-2" cidrBlock: "10.42.0.0/16" tags: {} } }
appSubnet: { apiVersion: "praxis.io/alpha" kind: "Subnet" metadata: {name: "app-a", labels: {}} spec: { region: "us-west-2" vpcId: "${resources.network.outputs.vpcId}" cidrBlock: "10.42.10.0/24" availabilityZone: "us-west-2a" tags: {} } }}The expression establishes a graph edge from network to appSubnet. Praxis provisions the VPC first, reads its vpcId output, injects the typed value into the subnet specification, and then dispatches the subnet.
Expression form
Section titled “Expression form”${resources.<resource-name>.outputs.<field>}An expression must occupy the entire string value. This lets Praxis preserve the output type instead of performing text substitution.
Scheduling
Section titled “Scheduling”Praxis builds a directed acyclic graph from all output expressions. Resources with no unresolved dependencies can run concurrently. A failed resource prevents its transitive dependents from running and records the causal chain in the deployment result.
Cycles and references to unknown resources or outputs fail during evaluation, before provisioning begins.