Intent model
ciz treats intent as the desired-state layer. It captures the platform policy, environment defaults, component subscriptions, and discovery roots that define what should happen, not how steps should execute.
Inputs that make up intent
The planning boundary is built from four inputs:
intent.yaml- Discovered
component.yamlmanifests - Composition assets under the configured
--config-dir - Optional CLI scoping such as
--envor change-detection flags
The output of those inputs is a compiled plan.json.
Structure of the intent file
apiVersion: sourceplane.io/v1
kind: Intent
metadata:
name: microservices-deployment
discovery:
roots:
- services/
- infra/
- deploy/
groups:
platform:
policies:
isolation: strict
defaults:
namespacePrefix: platform-
environments:
production:
selectors:
domains: [platform]
defaults:
replicas: 3
policies:
requireApproval: "true"
discovery
Discovery roots are scanned recursively for component.yaml files relative to the location of the intent file.
groups
Groups define platform-owned defaults and policy domains. They are the right place for non-negotiable constraints and common defaults that should apply across many components.
environments
Environments define selectors, defaults, and policies for a target environment such as development, staging, or production.
components
Intent can also declare inline components. In practice, many teams combine inline components with discovered component manifests when they want both central declarations and repo-local ownership.
Discovered component manifests
Component manifests carry type-specific inputs and dependency edges:
apiVersion: sourceplane.io/v1
kind: Component
metadata:
name: web-app
spec:
type: helm
domain: platform
subscribe:
environments: [development, staging, production]
inputs:
chart: oci://mycompany.azurecr.io/helm/charts/default
overrides:
steps:
- name: verify
phase: post
order: 10
run: kubectl get deployment -n platform-web-app web-app
dependsOn:
- component: common-services
scope: same-environment
condition: success
Merge model
At compile time, ciz merges configuration in a stable order from lowest to highest precedence:
- Type defaults from the composition schema
- Job defaults from the job registry
- Group defaults
- Environment defaults
- Component inputs and overrides
Policies are not treated as ordinary defaults. They are enforced as platform constraints.
Why this split matters
- App teams can declare intent without owning runner details.
- Platform teams can evolve schemas and job registries independently.
- Reviewers can diff desired state separately from execution steps.
- The compiled plan remains deterministic because all implicit defaults are resolved before runtime.
Read compositions next to see how component types bind to executable jobs.