Skip to content
Browse Docs

Deep Dives

AI: Claude and Codex patterns

ConfigHub: Deploy and manage

Docs
Configs
Stacks
Apps
Plugins
Guides

Residue Families - what a non-green row actually means

This guide explains why a catalog matrix row is marked watch or blocked, who can fix it, and what to do next. The generated decision pages remain authoritative for each row. You can also view this as a markdown file.

UNOFFICIAL/EXPERIMENTAL

How to read a residue, honestly

  • A watch row is known evidence with a named residue. The semantic Helm-vs-ConfigHub parity already passed - the delivered objects match regular Helm - but a runtime, controller-health, image, or operational condition still needs review. It is not a pass and not a failure.
  • A blocked row did not reach the lane result. Its residue names why and who owns the fix.
  • A residue category never turns a watch into a pass or a failure. It explains the gap and routes the fix. Nothing here is automatic or "solved" by tagging it - a family is a decision, not a repair.

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):

  • Regular Helm itself blocks: the pre-install certgen Job can't start because the pinned docker.io/bitnami/contour image is not pullable (ImagePullBackOff).
  • ConfigHub direct apply and ConfigHub OCI/Argo preserve semantic parity - the delivered objects match regular Helm - but the row stays watch because the hook-generated TLS Secrets (contourcert, envoycert) are absent and the pods do not become ready. (That second half is a hook/lifecycle residue layered on top - see the hook/lifecycle family.)

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:

  • Catalog refresh - move the base to a currently-published image tag.
  • Digest pin - pin a digest that is still retained in the registry.
  • Registry mirror / pull secret - point the target at a mirror, or supply an imagePullSecret for a private/paid registry.
  • Image override - override the image reference to one your target can pull.
  • Registry policy - accept a private/paid-registry requirement as a scoped support boundary.

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:

  • Regular Helm, ConfigHub direct apply, and ConfigHub OCI/Argo all preserve semantic object parity.
  • The workloads crash-loop on vanilla kind because the driver cannot read AWS instance metadata (IMDS), cannot find an AWS instance id in node providerID, and has no AWS region.
  • Argo pulls and applies the ConfigHub OCI payload, then reports the application as Synced / Degraded because the workload cannot run on that target.

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

  • Reference only. The per-row classifications are generated into the decision surfaces; this page names the vocabulary behind them and does not assert any row's state itself.
  • A residue family is a routed decision, never an automatic repair, and never a reclassification of a watch as a pass.

Generated from the committed markdown file docs/reference/residue-families.md. The source file is the authoritative version.