Skip to content

Operating from behold

behold renders a chant project’s graph and overlays what is live. This repo binds the local environment to its k3d cluster, so behold can read the deployed estate rather than only the source graph:

From the behold repo, with this project already up (just up):

Terminal window
kubectl config use-context k3d-fountain-local
FOUNTAIN_ENV=local npm run dev -- serve /path/to/fountain-ops --env local

Every declared resource comes back observed, plus the running pods as runtime nodes. On a clean just up that is eleven good and four runtime:

/api/overlay → nodes: 11 _status: {"good":11}
good Apps::Deployment flociDeployment
good Core::Service flociService

serve is the command, not preview. preview renders the declared source graph; serve is the one that adds the live overlay, /api/ops and the substrate strip.

Only local is bound. dev and everything else stay unbound on purpose, so nothing here can point a read at a cluster this repo knows nothing about. Bring your own profile:

k8s: { profiles: { staging: { context: "your-context" } } }

Two more things behold finds by convention, which turn the picture into a control plane:

ops/fountain-apply.op.tsan ApplyOp, so Run streams Build → Plan (a live diff) → Apply
scripts/local/local-up.shso the k3d substrate pill offers Bring up from cold

Both are thin. The scripts delegate to just cluster-up and just down rather than being a second way to create a cluster, and the Op is bound to local with delete: "owned-only": prune is scoped to the ownership marker, so it removes what this project stopped declaring and never touches anything it did not put there.

fountain-apply is not gated. A gated apply needs Temporal for the durable approval wait, and gating belongs on the Ops that can destroy something (#3, #8) rather than on one that applies a Deployment to a laptop.