Skip to content
Browse the site

Deep Dives

AI: Claude and Codex patterns

ConfigHub: Deploy and manage

Configs
Stacks
Apps
Plugins
Guides
Docs

Before and after

See what the Gatekeeper Helm chart becomes

Plain helm template renders 21 objects, and 8 of them are Helm hooks that must never be applied with the rest. The Catalog's base holds the 30 objects to apply, including the 17 CRDs that helm template leaves out, and a plan of 4 steps.

What you need. helm, curl and cub with the Workshop plugin. No account and no cluster.

1. See what you have today

You have the Gatekeeper chart 3.22.2 with the values of the Catalog's default base, which are the chart's defaults. Helm renders it like this, and the Workshop's check reads the result.

before: plain helm template
$ helm template gatekeeper gatekeeper --repo https://open-policy-agent.github.io/gatekeeper/charts --version 3.22.2 --namespace default --kube-version 1.30.0 > before.yaml
$ cub config check before.yaml
Config: before
Inspecting local Kubernetes objects (static, no infrastructure)

Installs
  21 objects: 3 ClusterRole, 3 ClusterRoleBinding, 2 Deployment, 2 Job, 1 MutatingWebhookConfiguration, 1 PodDisruptionBudget, 1 ResourceQuota, 1 Role, 1 RoleBinding, 1 Secret, 1 Service, 3 ServiceAccount, 1 ValidatingWebhookConfiguration
  namespaces that must already exist: default

Lifecycle work
  [PASS] CRDs: 0
  [NOTE] Helm hooks: 8
  [NOTE] setup Jobs: 2
  [NOTE] admission webhooks needing a certificate: 2
  [PASS] images tagged latest or not tagged: 0

Schema
  [PASS] schema validation: 21 object(s) valid against the default and ecosystem catalogs (flux-schema/0.16.0); 1 quantity written as a number, which the API server accepts

  Free look before you install. Compose it into a cub stack, or run it as a cub app.

The 8 hook objects sit in the same file as everything else. Apply the file and they run at once, outside the order Helm gives them. The plan counts the 17 hook objects the chart's templates define, and these values turn on 8 of them.

KindNameHelm hook
ServiceAccountgatekeeper-update-namespace-labelpost-install
ServiceAccountgatekeeper-admin-upgrade-crdspre-install,pre-upgrade
ClusterRolegatekeeper-update-namespace-labelpost-install
ClusterRolegatekeeper-admin-upgrade-crdspre-install,pre-upgrade
ClusterRoleBindinggatekeeper-update-namespace-labelpost-install
ClusterRoleBindinggatekeeper-admin-upgrade-crdspre-install,pre-upgrade
Jobgatekeeper-update-namespace-labelpost-install
Jobgatekeeper-update-crds-hookpre-install,pre-upgrade

The file holds none of the chart's 17 CRDs. They sit in its crds folder, which helm template leaves out. Helm installs them on the first install only, and never upgrades them.

2. See what the Workshop gives you

The Catalog keeps the objects of its default base for this chart, and a plan for everything that is not an object to apply.

after: the default base
$ cub config check after.yaml
Config: after
Inspecting local Kubernetes objects (static, no infrastructure)

Installs
  30 objects: 1 ClusterRole, 1 ClusterRoleBinding, 17 CustomResourceDefinition, 2 Deployment, 1 MutatingWebhookConfiguration, 1 PodDisruptionBudget, 1 ResourceQuota, 1 Role, 1 RoleBinding, 1 Secret, 1 Service, 1 ServiceAccount, 1 ValidatingWebhookConfiguration
  namespaces that must already exist: default

Lifecycle work
  [NOTE] CRDs: 17 (apply and establish before any custom resource)
  [PASS] Helm hooks: 0
  [PASS] setup Jobs: 0
  [NOTE] admission webhooks needing a certificate: 2
  [PASS] images tagged latest or not tagged: 0

Schema
  [PASS] schema validation: 30 object(s) valid against the default and ecosystem catalogs (flux-schema/0.16.0); 1 quantity written as a number, which the API server accepts

  Free look before you install. Compose it into a cub stack, or run it as a cub app.

The plan has 4 steps.

StepWhat it isWhat it says
preflight-or-presynca step of the applyCRD and admission-webhook prerequisites must be checked before apply.
upgrade-action-with-receipta step of the applyThe pinned rendered CRD route must be recorded as a target-aware operation before stronger upgrade claims.
crd-orderinga step of the applyWithout an ordering declaration, per-file Units apply in no guaranteed order, so a custom resource can reach the cluster before the definition that gives it meaning. Apply the 17 CustomResourceDefinition objects first. Wait until every named definition reports the Established condition. Then apply the other 13 objects.
lifecyclea step of the applyThe chart defines 17 hook object(s) that do not travel in a flattened bundle, so the work they do has to happen some other way. A recorded run installed this base without them and watched that work happen as the ordered actions below. The ordered stages are cub-installer-setup, kubectl-apply-separated-secrets, kubectl-apply-manifests, crds-established, controller-manager-ready, audit-ready, webhook-service-endpoints, webhook-secret-populated, webhook-configurations-routed, admission-server-dry-run, pre-upgrade-crd-route-apply, pre-upgrade-crds-established, pre-upgrade-webhook-configurations-routed, pre-upgrade-admission-server-dry-run.

3. See what changed

Before, helm templateAfter, the default base
Objects2130
Helm hook objects in the file80
CRDs017
Objects that are the same on both sides1313
Plan stepsnone4

4. Try it yourself, with no account

Install cub and the Workshop plugin first.

# before: render the chart as Helm does
$ helm template gatekeeper gatekeeper --repo https://open-policy-agent.github.io/gatekeeper/charts --version 3.22.2 --namespace default --kube-version 1.30.0 > before.yaml

$ cub config check before.yaml

# after: fetch the objects the Catalog keeps for this base
$ curl -fsSL -o after.yaml https://raw.githubusercontent.com/confighub/helm-expt/main/recipes/gatekeeper/gatekeeper/3.22.2/revisions/default/r001/rendered/release-objects.yaml

$ cub config check after.yaml

The entry page shows the plan and every other base of this chart.

See it live in ConfigHub

Everything above runs on your own machine with no account. To see the same example in ConfigHub, load it into your own organization with the commands below.

With your own account

Here is what the command does. cub installer is an open-source plugin for the cub CLI. cub installer setup pulls a catalog package and writes its Kubernetes files locally, leaving delivery to kubectl, Argo CD or Flux. The generated scripts stop before doing any work when the plugin or kustomize is missing.

# render the base from the signed package
$ cub installer setup --pull oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/gatekeeper-gatekeeper:3.22.2@sha256:ce4877c260225419e22d820f9d15652ad48ed5f205117099e88abb3f590241a5 --base default --work-dir ./gatekeeper-gatekeeper-3-22-2-default --non-interactive --namespace default

# sign in to your organization
$ cub auth login

# load the objects as a Space of Units, under names you choose
$ cub installer upload --work-dir ./gatekeeper-gatekeeper-3-22-2-default --space <your-space> --component <your-component>

# list what was loaded
$ cub unit list --space <your-space>

What it looks like in ConfigHub

ConfigHub showing the Gatekeeper controller-manager Deployment, at its image line
The helm-catalog organization on 2026-10-25, showing the Gatekeeper controller-manager Deployment, at its image line. It was loaded as this panel describes.

5. Technical notes and disclaimers

  • Both checks ran on 2026-10-26 with cub v0.9.0, Workshop plugin 0.6.61 and helm v4.1.4+g05fa379. The recorded files and their receipt hold every input and output on this page.
  • Both sides render for Kubernetes 1.30.0, as the Catalog does, so only the handling differs.
  • No step of the plan has been run on a cluster for this page. The plan says what a delivery workflow must do, and nothing runs it automatically.