Prune gap - does cub-direct prune removed resources on upgrade?

A repository document, rendered for the site. View source markdown.

Generated at: 2026-07-30T12:38:02.000Z UTC · source: committed helm-expt evidence for this rendered repository document.

UNOFFICIAL/EXPERIMENTAL. Live receipt generated by scripts/run-prune-gap-proof.mjs; do not hand-edit. Regenerate with npm run prune-gap:proof.

Claim. The cub-direct (no-controller) delivery path is kubectl apply, which does NOT prune resources removed between versions. An upgrade that drops a resource ORPHANS it - the cluster silently keeps an object no longer in desired state, breaking the config-as-data promise on this path. Argo and Flux prune natively; cub-direct must use kubectl apply --prune (label/allowlist) or a controller for clean upgrades.

config-as-data promises the cluster matches desired state. Argo and Flux reconcile and prune. The doctrine's third delivery path - cub-direct (pull the OCI bundle + kubectl apply) - uses plain apply, which only creates/updates the objects handed to it. Proven live on a throwaway kind cluster:

StepObservationResult
apply v1, then v2 (drops ConfigMap/extra-config)removed ConfigMap still present? trueorphaned (gap confirmed)
kubectl apply --prune -l app=pruneproofremoved? truepass

Overall: watch. Confirmed: the cub-direct path orphans removed resources on upgrade (plain kubectl apply does not prune). --prune removes them - so the doctrine must require --prune (or a controller) for the no-controller upgrade path. Argo/Flux are unaffected (they prune declaratively).