Every Kyverno policy in the repository, wherever it lives: the kyverno
component's own policies and the ones storage components ship to describe
their classes. Deny blocks the apply; Warn records an audit warning
and lets it through, so a warn-only rule is invisible until something goes
wrong; Mutate changes the object on the way in; Delete runs on a
schedule against objects that already exist.
A flux.rbac.thaum.xyz/role label must name a ClusterRole the Kyverno background controller is allowed to bind -- currently only "cluster-admin". It grants that role to this namespace's flux-reconciler ServiceAccount through a RoleBinding, which confers only its namespaced rules and only here, so it can never reach outside this namespace. A namespace whose Flux objects install cluster-scoped resources cannot use this label at all; it belongs in k8s/namespaces// with a hand-written ClusterRoleBinding.
A group.rbac.thaum.xyz/ label must have the value "edit" or "view". It grants the pocket-id group oidc:k8s:group: that ClusterRole in this namespace; the group name comes from the label key, never from the value.
k8up.io/* annotations do not belong on unifi-nas. The class provisions each claim as a subdirectory of the NAS's own k8snfscsi share, which the UNAS already backs up offsite nightly, so a K8up backup here reads the NAS to write a restic repository back onto the same disk. Leave the claim unannotated, or move it to piraeus-r2 and back it up there.
The flux-reconciler ServiceAccount is the identity Flux impersonates to reconcile this namespace, not one a workload may run as; it is privileged by construction. Give the Pod its own ServiceAccount and grant that what it needs.
PersistentVolumeClaims on piraeus-r2-roaming are limited to 32Gi, because the volume is resynced across the node network every time its Pod moves to a node without a replica. Use piraeus-r2 for larger volumes; it pins the Pod to a replica instead.