Residue Families - what a non-green row actually means

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

When the master catalog matrix shows a row as watch or blocked instead of pass, the decision surfaces tag it with a residue category - the kind of gap that stopped the row from being green. This page is the plain-English vocabulary for those categories: what each family means for a Helm user, who has to fix it, the next action, and where the rows live.

It is reference only. The authoritative per-row classifications are generated into the decision surfaces - this page names the families behind them.

How to read a residue, honestly

The families

Family names are grouped by theme. The same theme can carry a slightly different category key (and a different owner) in the G/P-lane vs the K-lane, because the two lanes prove different things; both keys are listed.

FamilyWhat it means for a Helm userWho fixes itUsable today?Lane · category key
Target prerequisiteThe rendered objects matched regular Helm; a named prerequisite (Namespace, Secret, or CRD) is missing on the target. The prerequisite is missing, not the configuration.userYes, after you stage the prerequisiteG/P · target-prerequisite - K · target-prerequisite-crds / -secret / -namespace
Remote imageParity passed, but the chart references a container image the target cannot pull (removed/renamed tag, private or paid registry, rate-limited pull). The workload can't start until the image is reachable.catalog or image publisherWatch - until the image reference is resolvedG/P · remote-image
Render inputRequired Helm input values are missing, so the base renders incomplete or invalid objects. Regular Helm and ConfigHub block on the same validation.catalog (G/P: needs a better base) · user (K: supply values)No on the default base - until inputs are supplied or a better base is chosenG/P · render-input - K · render-input
Capability profileParity passed, but the base rendered for a Kubernetes capability the target does not serve (e.g. an APIService version a newer cluster dropped). A render-profile / base-selection issue, not a semantic diff.catalogDepends - use or promote the base rendered for the target's API setG/P · capability-profile - K · capability-profile-diff
Hook / lifecycleThe chart relies on a Helm hook or controller-populated lifecycle behavior (e.g. a certgen Job) that config-only delivery does not run. Needs a lifecycle route or staged equivalent.catalogNo - until a lifecycle route is decidedK · hook-lifecycle (see lifecycle-route-actions)
Platform target fitParity passed, but the target does not provide the platform shape required by the base (for example AWS/EKS metadata, provider identity, schedulable node count, or load-balancer behavior).user or catalogWatch - use a target that satisfies the base, or create a target-scoped baseG/P · target-fit
Target runtimeThe rendered config matched regular Helm, but the workload did not reach the expected runtime state on the target. Runtime residue to review.needs runtime reviewWatch - config correct, runtime unconfirmedG/P · target-runtime - K · target-runtime
GitOps controller healthSynced through ConfigHub OCI/Argo and converged, parity passed - but Argo's aggregate health reads Progressing, or a resource reads OutOfSync while Healthy.needs GitOps controller-health reviewWatch - synced and converged; aggregate health needs explanationG/P · gitops-runtime
Operate policyParity passed, but an operational readiness step (for example init/unseal) is required before the workload is fully ready.needs operate reviewWatch - needs an operational stepG/P · operate-policy
Model / semantic gapThe ConfigHub delivery did not match the live Helm result (a semantic/model difference, a missing target fact, or a render difference). Not a user action.catalogNo - needs catalog/model workG/P · semantic-model-gap - K · model-gap-render / model-gap-target-fact

Live counts per family change as the live lane runs; read the decision surfaces above for the current rows - this page deliberately does not hard-code numbers.

Remote image, in detail (worked example: Contour)

remote-image is the family a Helm user is most likely to hit first, because it looks like a chart failure but is really an image-availability problem on your target.

Worked example - bitnami/contour@21.1.4 (default and no-crds):

So the row is honest: parity is proven, but the chart can't run on a target that can't pull its image. The same family covers Apache, OpenSearch, and the Istio gateway rows.

What a user or the catalog can do - none of these is applied automatically:

This is a decision family, not a fix. Tagging a row remote-image does not make the image pullable; it tells you the parity question is already answered and the open question is image retention/access on your target.

Distinguish it from neighbours: target-runtime means the image pulled but the workload misbehaved; render-input means values were missing before any image mattered; hook/lifecycle means a hook action (not an image) is the gap.

Platform target fit, in detail (worked example: AWS EBS CSI)

Some charts need a specific platform identity rather than a generic Kubernetes target. The committed AWS EBS CSI receipt is the concrete example:

That is platform target fit, not a render defect. A useful base needs an AWS/EKS-like target profile, or an explicit target-scoped base/refusal for non-AWS clusters. The chart-local support artifact is target-topology.yaml.

From a non-green row to a support decision

A residue category answers why a row isn't green and who fixes it. It does not by itself decide whether a chart/base is production-supported. To move a chart/base from watch/todo toward supported, target-scoped support, rejected, or superseded, the residue has to be resolved or explicitly accepted for a named scope, backed by fresh evidence. That decision and its required evidence are recorded separately:

Boundaries