tatara-render 0.2.1

Env → IaC-platform-shaped manifests. The RENDER phase (THEORY §IV.3) of the eight-phase convergence loop. Each `Backend` impl is a morphism from the typescape (typed Rust resources in `tatara-env::Env`) to a target's native shape (Kubernetes CR YAML, Helm template, Terraform JSON, Pangea Ruby DSL). Adding a backend inherits every existing proof — proofs attach to the typescape types, not to the rendering code (THEORY §III.2).
Documentation

tatara-render — the RENDER phase morphism.

Where it sits

Phase 5 of the eight-phase convergence loop (THEORY §IV.3):

1. DECLARE    → tatara_env::compile_into_env  (Vec<Sexp> → Env)
2. SIMULATE   → tatara_env::validate
3. PROVE      → property tests on lattice laws
4. REMEDIATE  → declared ⊔ remediations  (right-bias)
5. RENDER     → tatara_render::Backend     ← THIS CRATE
6. DEPLOY     → tatara_rollout::diff_envs + apply
7. VERIFY     → observed ⊑ declared
8. RECONVERGE → drifts_from → GOTO DECLARE

What it produces

Each Backend impl turns a typed Env into a target-shaped manifest set. The target ranges from "raw Kubernetes CR YAML ready to apply" through "FluxCD Kustomization tree" to "Pangea Ruby DSL" to "Terraform JSON" — every place the existing pleme-io stack already accepts deployment input.

Today this crate ships the simplest member of the family: KubernetesYaml. It takes a typed env and produces, for each resource, a YAML document in the target's expected shape:

  • defgatewayGateway CR (gateway.networking.k8s.io/v1)
  • defciliumnetworkpolicyCiliumNetworkPolicy CR
  • defpodmonitorPodMonitor CR
  • defbpf-program / defbpf-map / defbpf-policy → ConfigMaps describing the BPF spec, plus a sibling reference to the substrate-built .bpf.o (the actual loader is a separate Job/DaemonSet outside this crate).

Every other backend (helm-chart-forge, pangea-forge, the existing iac-forge family) is one trait impl away.

Why a trait, not a function

Adding a new target inherits all existing proofs. The typescape types (Env, Resource) are where the invariants live — Backend impls are pure projections. The Synthesizer trait in arch-synthesizer is the same shape; this crate's Backend is a narrower, env-specific variant that lands faster than wiring through the full typescape layer (which it can grow into).