Live Witness Normalization Rules

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.

This file records the normalization choices used by strict cub-scout live witness checks.

The rule is simple: every strict-witness BLOCK needs a route. It is either kept as a row in cub-scout-watchlist.csv, or it is covered by a named normalization rule here with a short justification.

Normalization is only for fields the Kubernetes API predictably drops or defaults after apply. If a field could be meaningful, target-specific, or version-specific, keep it on the watchlist until the route is clear.

Current Rules

The live witness helper writes a cub-scout desired manifest from the rendered objects before comparison. It currently prunes these API-dropped no-op fields:

RulePathsReason
probe-zero-delay*.livenessProbe.initialDelaySeconds, *.readinessProbe.initialDelaySeconds, *.startupProbe.initialDelaySeconds when the value is 0Kubernetes omits probe delay fields when the authored value is the default.
min-ready-seconds-zerospec.minReadySeconds when the value is 0Kubernetes omits this deployment-style default on live objects.
empty-ca-bundlewebhook clientConfig.caBundle and CRD conversion spec.caBundle when emptyControllers or the API server may omit an empty CA bundle. Non-empty CA bundles are preserved and compared.
empty-volume-mount-subpathspec.template.spec.containers[*].volumeMounts[*].subPath when emptyKubernetes omits empty subPath values on live container volume mounts. Non-empty subPath values are preserved and compared.
false-host-flagspod template hostIPC, hostNetwork, hostPID when falseKubernetes omits false host namespace flags after apply.
publish-not-ready-falsespec.publishNotReadyAddresses when falseKubernetes omits the false service default.
empty-security-context-listssecurityContext.supplementalGroups and securityContext.sysctls when emptyKubernetes omits empty optional security context lists.
empty-metadata-mapsempty metadata.annotations and metadata.labels mapsEmpty metadata maps are not preserved on live objects.

The helper deliberately does not prune every empty array. Some empty arrays are semantic, such as NetworkPolicy.spec.ingress: [].

Watchlist Decisions

Grafana static-passwords currently remains on the watchlist for empty RBAC rules: [] shape differences. The workload converges, but the rule has not yet been accepted as a general Kubernetes normalization across target profiles.

cert-manager and External Secrets selectable-field rows also remain on the watchlist. They are target-profile findings for Kubernetes 1.30 CRD behavior, not Helm-vs-installer semantic parity defects.