Repository navigation
Description
Parent
What is missing
Chapter 20 says the ClusterState Collector is an Application of the delivery project: a CronJob whose ServiceAccount may get and list PersistentVolumes, PersistentVolumeClaims and pods. The Collector now exists (JorisJonkers-dev/delivery#10), and the model cannot declare it. Three gaps, each a decision about what spec/v1 means:
-
No schedule. A Process's
lifecycleisapplication,joborprepare. None runs on a schedule, so no project file can declare aCronJob. -
No cluster-wide read. Nothing in Project Intent grants a Process
getandliston cluster-scoped or all-namespace resources. The grant the Collector is held to is hand-written indeploy/collector/rbac.yamlin the delivery repository, and an envtest case there proves it is exactly get and list on the three kinds. -
No namespace on a snapshot fact. A binding is
{claim, node}and a placement is{process, node}.placementOfinsrc/resolve/process.tsmatches a binding by claim name alone, so:- two Projects with a claim of the same name read each other's binding;
- whoever can create a claim, or a pod labelled
app.kubernetes.io/managed-by: deploy-kit, in any namespace can state a binding or a placement under another Project's name, and so hold that Project's Process to a node or raiseE_DISK_BINDING_CONFLICTfor it.
The Collector records what the schema can hold: every bound claim in the cluster, and every pod carrying the render's labels.
What to decide
- How a scheduled Process is declared, and what it renders to.
- How a Process is granted a cluster-wide read, and how narrow that grant is kept (the Collector needs three kinds and two verbs).
- Whether a snapshot fact carries its namespace (or its Project), and how resolution matches on it. This changes
cluster-state-snapshot.schema.json, so the delivery repository's generated type and the Collector'sCaptureandWritefollow. - Until then: whether the Collector is deployed outside the model, or not at all. Composition runs with the empty snapshot meanwhile, which chapter 20 says is valid.
Acceptance criteria
- The decision is recorded, and
spec/v1says how the Collector is declared. -
deploy/delivery.project.ymlin the delivery repository declares the Collector, and the render carries itsCronJoband its grant. - Two Projects with a claim of the same name each resolve against their own binding.
- Both implementations and the oracle files move together.
Activity
ExtraToast commentedon Oct 5, 2026
Two of the three questions here are settled, both by the maintainer on 2026-10-04, in #245:
apirules with a reason, and the Platform document admits its Application inapiAccess.holders(0092). The Collector declaresgetandliston three kinds.What is left of this ticket is the third: a namespace on snapshot facts.
ExtraToast commentedon Oct 9, 2026
The first gap, the missing schedule, was decided on the map in Decide how the model meets the live needs no chapter covers, item 13. A new
lifecycle: scheduledis added, the Process authors its own cronschedule, and it renders as a CronJob that never runs twice at once. The cluster-wide read is covered by item 4: anapirule gains a scope, either the Process's own namespace or the cluster. The spec change lands with the rewrite.ExtraToast commentedon Oct 9, 2026
Re-scoped by Decide the fate of the open work that predates the map
Gap 1 (a scheduled lifecycle) is decided by #351 (
lifecycle: scheduled), and gap 2 (the cluster-wide read) by #351's Platform-admitted namespacedapi. This issue now covers gap 3 only: a namespace on snapshot facts. TypeScript only, afteremf/is deleted (#99).