helm-expt Testing Strategy

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.

_The Coverage Ladder layer of the helm-expt test map._

This file explains when to run each class of test and what kind of claim each test can support. It complements npm-scripts.md, which lists the individual commands.

The goal is not to run every test after every edit. The goal is to keep claims matched to evidence:

static corpus check
-> render parity
-> ConfigHub proof
-> local Kubernetes proof
-> GitOps/OCI proof
-> strict live Helm-vs-ConfigHub parity
-> lifecycle observation
-> production support decision

Test Principles

Use scoped checks while working. Run the full repo gate only before broad merges, public review, or release-style claims.

Do not use npm run verify as a substitute for a live test. It proves committed artifacts and receipts are internally consistent. It does not create fresh live evidence.

Do not use a live test as a substitute for render parity. Live success can hide object drift. Render parity must still prove that regular Helm and cub installer produced the same intended object set under recorded inputs.

Commit live receipts when the claim depends on them. If a live run is not committed and indexed by the matching generated summary, do not claim the lane changed.

Separate semantic parity from target fit. A chart/base can have perfect object parity and still need a CRD, Secret, StorageClass, hook route, controller readiness check, or operating-policy decision.

Coverage Ladder

LevelEvidenceClaim
1Recipe, package, source lock, effective values, receipts, catalog mapThe chart/base is represented in the corpus.
2Helm template versus cub installer setup receiptThe base renders the same intended Kubernetes objects as regular Helm, with documented intentional differences.
3ConfigHub upload, scan, and safe-operation receiptsThe rendered objects can become ConfigHub Units and participate in ConfigHub review.
4Local kind observation receiptThe rendered objects work on the tested Kubernetes target.
5ConfigHub OCI plus Argo or Flux receiptThe ConfigHub artifact can be reconciled by a GitOps controller on the tested target.
6Strict live parity receiptRegular Helm and the cub installer path reached the recorded equivalent live outcome.
7Lifecycle observation receiptController-owned, hook-like, or post-apply behavior was observed fresh.
8Production disposition and target-scoped decisionThe chart is accepted for a named production support scope.

Use the narrowest true claim. For example, render parity is not the same as GitOps live, and production-review-ready is not the same as production-supported.

Current Corpus Shape

Top-20 is the public catalog lane. It has named base variants, broad proof coverage, live evidence, and production-disposition inputs. Exact status still depends on chart, base, and lane.

Top-100 is the maintained proof corpus. Every chart has recipe/package proof and render parity, but most rows still need catalog promotion review, useful variants, or selected live lanes.

Top-500 is source and catalog-planning reconnaissance. It shows where Helm pain appears across popular public charts. It is not an installable catalog.

Authoritative generated views:

NeedStart with
Current aggregate statusdata/status-dashboard/summary.md
Outcome and lane coveragedata/outcome-coverage/summary.md
Top-20 base readinessdata/top20-base-readiness/summary.md
Top-100 workabilitydata/top100-readiness/summary.md
Top-500 evidence mapdata/top500-catalog-analysis/summary.md
Live parity residuedata/live-parity-rerun-plan/summary.md
Hook and lifecycle boundarydata/lifecycle-boundary/summary.md
Test command detailstests/npm-scripts.md

When To Run What

WorkChecks
One manual doc editnpm run docs:verify
Command example editnpm run docs:verify and npm run installer:command-surface:verify
Generated data editThe owner *:verify, then npm run data:index:verify if CSVs were added, removed, renamed, or reclassified
Static site editnpm run site:verify
One curated chart proof edit<chart>:compare, <chart>:verify-proof, <chart>:verify-proof:self-test, <chart>:verify-package
Shared proof-kit editRepresentative chart checks for the changed hook, then all migrated top-20 proof/package checks before broad merge
Recipe/package graph or target factsChart-specific checks, npm run verify:artifact-chain, and npm run installer:target-facts:verify when facts changed
Broad proof-model changeFocused checks for each changed surface, then npm run verify
Fresh local Kubernetes evidenceThe lane runner that writes the receipt, followed by the lane summary and verifier
Fresh GitOps/OCI evidencetests/chart-install-test or tests/chart-install-sweep, followed by the runtime/GitOps summary verifier
Fresh strict live parity evidencenpm run kind-parity:run for one chart/base, or the top-20 variant runner for a campaign

Live Test Work Unit

The atomic live work unit is one chart/base row:

chart
base variant
target cluster or pair of clusters
commands run
rendered object digest
runtime observations
result: pass, watch, blocked, or fail
receipt path

Every receipt should explain non-pass rows. A watch or blocked row is useful when it separates:

Do not collapse those cases into a generic failure.

Strict Helm-vs-Installer Parity

The preferred parity test uses two identical vanilla kind clusters:

New to cub? Install the cub CLI first. You can pull and render public catalog packages without an account. Commands that save or change ConfigHub data require you to sign in.

What this command does. cub installer is a released, open-source plugin for the cub CLI. cub installer setup pulls a catalog package and writes its Kubernetes files locally. It does not apply those files to a cluster; use kubectl, Argo CD, or Flux for delivery. The generated scripts stop before doing any work when the plugin or kustomize is missing.

cluster A: regular Helm install
cluster B: cub installer setup + kubectl apply
compare intended objects and live outcomes

This keeps the parity question separate from ConfigHub delivery machinery. It does not require ConfigHub's cub cluster helper.

Use ConfigHub/OCI live tests for a different question:

Can ConfigHub Units be published or applied through OCI and reconciled by Argo
or Flux on a live target?

Both lanes matter. They prove different outcomes.

Run strict live parity serially unless a lock/guard prevents concurrent cleanup from deleting another run's kind clusters. Every kubectl command should pin the intended kubeconfig and context.

Chart Refresh Strategy

Do not replace a supported chart version just because upstream released a new one.

Use this path:

current supported version
-> latest candidate render/proof
-> diff, quirk, and gap review
-> live or lifecycle evidence where needed
-> production-disposition update if needed
-> catalog promotion decision

Older supported versions can remain valuable for patch, audit, and enterprise support. Keep old versions until the project has an explicit replacement or retirement decision.

Scaling Strategy

Scale by rows, not by narrative claims:

top20 chart/base rows
-> top100 proof rows
-> top500 promotion candidates

Parallel runs are appropriate for independent chart/base rows, but each live runner must own its cluster names, kubeconfigs, namespaces, ConfigHub spaces, and cleanup. Receipt aggregation should be mechanical: collect row receipts, regenerate summaries, then run the matching verifiers.

The desired end state is a catalog where every chart/base row has: