01 · Which platform is this?
Flavour and platform come from authoritative signals.
The cluster-deployment scan asks the API server what it serves. The
config.openshift.io Infrastructure object means
OpenShift, and its status.platform says vSphere,
bare metal or Azure. harvesterhci.io will mean Harvester (roadmap).
RKE2 and k3s are read from node markers, AKS from its node-pool
labels.
Absence is not evidence. A cluster with no cloud labels is
unknown, not "bare metal", and a vSphere cluster running
another vendor's CSI driver is still vSphere.
02 · A runtime that cannot write
Read-only is a property of the code, not a flag.
The reach census runs in a separate, sealed runtime. Its import
graph does not contain the merge-request writer, the proposal store,
the chat notifier, the LLM engine or any credential loader, and a
test walks that graph on every change, with a planted violation it
must catch.
It reads a local clone at an immutable commit through plain git
plumbing. It never fetches, checks out or touches the working tree,
and no model sees your YAML during the census.
03 · Hub and spokes
A file's cluster is decided by its parent, not its path.
In a hub-and-spoke Flux layout, the hub reconciles everything and
reaches each spoke through a kubeConfig secret. Plain
objects under a Kustomization with spec.kubeConfig land
on the spoke. A HelmRelease patched to carry a
kubeConfig lives on the hub while its chart installs
into the spoke.
The graph resolves every file to a controller, object and workload
cluster, or to "unresolved". It never quietly assumes "local".
04 · Topology findings
The mistakes that only a topology can show.
Deterministic rules run over the graph: a HelmRelease inside a
spoke-applied layer (fatal: spokes have no HelmRelease CRD), a path
no Kustomization covers, a ${VAR} nobody declares, a
directory Flux will apply recursively because it has no
kustomization.yaml, a Namespace that a hub-render layer
quietly creates on the hub.
Where you already run your own render-based check, the graph is
compared against it, Kustomization by Kustomization. On the first real estate the two
agreed on every Kustomization.
05 · Who owns each object?
Ownership is per object, read from the hub's inventory.
Real estates are mixed. In one namespace, Flux may own the
Namespace, RBAC and Routes while the Deployments are applied by a
CI script. A namespace allowlist is only a ceiling.
With read-only access you grant during the session, the census
reads each Flux Kustomization's status.inventory on
the controller cluster and marks every object as in-inventory, not,
or abstain. Objects Flux does not own are listed as such, never assumed to be managed by git.
06 · How much can we actually analyse?
An unanalysed repository must never read as clean.
The coverage meter counts, per Flux root, files placed, files
unresolved, kustomize render inputs, and kinds the shipped agents
do not branch on yet: OpenShift Route,
EgressIP, MachineConfig, OLM
subscriptions, KubeVirt VirtualMachine.
Those are reported as "seen, not analysed", with the count, so a
quiet result is never mistaken for a healthy one. The number also
tells us which platform pack to build next.
07 · Argo CD Roadmap
The same questions, asked of a different controller.
Planned: Argo CD Application and
ApplicationSet graphs as a second reconciliation
source. The census already separates "which cluster does this file
land on" and "who owns this object" from the Flux specifics, which
is the seam an Argo CD reader plugs into.
08 · Below the cluster Roadmap
Terraform and OpenTofu: measured state versus declared state.
Planned: the same loop applied to cloud infrastructure code. Read
the declared resources and the provider's actual state, and propose
the minimal reviewed diff where they disagree, managing only what
the repository declares.
Nothing on this step exists yet. It is where the platform coverage
is heading.