Browse Docs
Catalog
Config
Stacks
Operate
Docs

Helm Quirk Support Matrix

This page says, for each Helm quirk class, what happens to it at each of the seven lifecycle stages - and what is not claimed. Cells use cautious verbs: View source markdown.

UNOFFICIAL/EXPERIMENTAL

detected   the analysis stage records that the quirk exists
routed     the quirk is classified and sent down a named path
rendered   the quirk's output is part of the exact rendered object set
proven     a committed receipt or parity lane covers it
recorded   the requirement is written down with the package/variant
checked    a live lane verifies it against a cluster
manual     a human decision is required; the repo says so instead of guessing

The seven stages:

1 source/chart analysis    2 recipe/package creation   3 render parity
4 ConfigHub upload         5 derived variants          6 GitOps/OCI delivery
7 live observation / operations

The Matrix

Quirk1 Analysis2 Recipe/package3 Render parity4 Upload5 Derived variants6 Delivery7 Live
CRDsdetectedsplit into explicit bases (crds / no-crds)rendered + proven against the pinned capability profilestored as Unitsownership change routes back to a baseCRD owner is a recorded prerequisitepresence/established checked; capability mismatches become watchlist rows
Helm hooksdetected + phase classifiedrouted: desired objects, pre-install prerequisite, post-install lifecycle, controller-owned runtime, or unsupported/manualhook objects rendered when routed as desired objectsstored when routed as objectsno hook semantics added post-renderthe hook route decides what shipshook route receipts exist; hook execution receipts do not yet
Generated secrets/certs/passwordsdetectedrendered, then separated out of the publishable artifactsecret objects included in parityreferences recorded; secret material not uploadedreferences bind via target factsseparated secrets applied out-of-band firstpresence checked pre-flight; missing-secret false greens caught at runtime
lookupdetectedlifted into declared target facts; no live reads at renderdeterministic render proven (no hidden cluster reads)facts recorded with the packagefacts bound per targetfacts are recorded prerequisitesfacts checked live before reliance
.Capabilitiesdetectedpinned to a named capability profileproven against that profile onlyprofile recordedn/a post-rendertarget cluster must match the profile, or re-renderprofile mismatches surface as watch/blocked rows, not silent passes
tpldetectedrendered normally (render-time construct)covered by render paritystored like any objectsuser-payload tpl routes to extension-slot reviewships as reviewed outputno special live handling; field provenance through templates is not claimed
Raw manifests / extraObjects (extension slots)detectedempty slots stay in base; populating one creates a new reviewed basepopulated slot output enters paritystoredpopulating a slot post-render routes back to a baseships as reviewedclosed-world live check can flag unexpected extra objects
RBACdetectedrendered explicitly and reviewableproven, with server-normalization cases routed to the watchliststoredRBAC edits route back to a basecluster-permission review is a recorded prerequisitestrict witness compares rendered vs live RBAC
Webhooksdetectedrendered; cert/CA wiring classified as controller-owned runtime stateauthored fields proven; controller-populated fields excluded by designstoredn/awebhook/cert readiness is a recorded prerequisitecontroller-owned behavior demonstrated by lifecycle observations on selected charts
Storage / PVCsdetectedstorage choices are base variants; StorageClass is a target factprovenstoredclass/size binding via facts where the base exposes themStorageClass is a recorded prerequisitePVC binding checked at runtime
External dependencies / target factsdetectedrecorded as installer requirements and variant target factsparity covers references, not the external thing itselfrequirements recorded; no external material storedbound per targetrecorded prerequisiteschecked live pre-flight

What Is Proven Versus Routed, Per Quirk

Honest status, with the evidence trail:

  • Hooks are classified and routed, not solved. Five of five maintained hook-bearing top-100 charts have hook route receipts; zero have hook execution or observation receipts. The routes are: desired objects, pre-install prerequisites, post-install lifecycle, controller-owned runtime state, or unsupported/manual. See Hook Lifecycle Strategy and data/hook-lifecycle.
  • .Capabilities claims are profile-bounded. Parity is proven against the pinned Kubernetes capability profile, currently 1.30. The strict witness caught real consequences: cert-manager and External Secrets CRDs author selectableFields, which the 1.30 API drops - routed as watchlist rows, and parity for that profile is not claimed. A follow-up live witness proves the same rendered CRDs preserve selectableFields on the kind-kubernetes-1.35 profile, so the route is capability-profile-specific evidence rather than silent normalization. See What We Refuse To Claim.
  • Generated secrets never hide in the artifact. They are rendered for parity, separated out of the publishable set, recorded as expected external references, and verified live pre-flight. The missing-secret silent-false-green class is caught at runtime by the strict witness. See Why Synced Is Not Working.
  • lookup is removed, not emulated. Charts that read the cluster at render time are re-expressed with declared target facts so renders stay deterministic; the facts are then checked against the real cluster before anyone relies on them.
  • RBAC and server normalization are watch material, not silent passes. Where the API server normalizes authored RBAC (for example, empty rules), the strict witness blocks and the row is routed to the watchlist until the behavior is modeled or accepted.
  • Webhook CA wiring is deliberately out of the authored claim. Controller-populated fields are classified as controller-owned runtime state; lifecycle observations on cert-manager and External Secrets demonstrate the pattern. That demonstrates the observation pattern, not universal webhook support.
  • tpl and template provenance: rendered output is fully covered by parity, but tracing a live field back to the template line or values key that produced it is not claimed.
  • Extension slots are a routing rule, not a feature claim. Leaving a slot empty stays inside a supported base; populating one creates a new install shape that must re-enter review. See Extension Slots.

How To Read A Gap

A quirk cell that says routed, recorded, or manual is not a euphemism for "works." It means the repo knows about the case, has a named path for it, and will not silently pretend it passed. The generated status pages say which charts currently sit on which path: top-100 user readiness, the watchlist, and current proof status.

Generated from the committed markdown file docs/reference/helm-quirk-support-matrix.md. The source file is the authoritative version.