helm-expt: the robust sceptic plan

A repository document, rendered for the site. View source markdown.

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.

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.

Generated at: 2026-07-30T12:38:02.000Z UTC · source: committed helm-expt evidence for this rendered repository document.

Planning doc. Status: active adversarial test plan. Companion to the serverless design doc and the verify-commercial doc.

1. Purpose and posture

Assume helm-expt gets the audience it wants. Then it gets the audience that comes with it: Helm maintainers defending their project, security people probing the trust claims, practitioners with a quirky chart that breaks the model, and the standard internet pattern of finding the one overclaim and using it to dismiss the rest.

The posture that wins is to turn every attack into a fixture. A sceptic with a breaking chart is useful adversarial QA, and the correct response to "your model breaks on X" is a public receipt that either passes X or refuses X with a named reason. The repo's existing discipline (every claim narrow, every exception visible, every strict BLOCK routed to a watchlist row or a named rule) is the right foundation. This doc is the threat model on top of it: who attacks what, what already defends, what tests are missing, and where we are honestly still weak.

2. What already defends

Inventory of existing defenses, so the plan builds rather than duplicates:

This is more than most projects have. The gaps are specific, and section 4 names them as tests. T1 through T4 now have committed machinery; they are still coverage-growing work, not finished proof of the full product. T5 through T8 remain open proof work.

2a. Product Frontiers

The sceptic work should keep these product boundaries visible. Passing render parity or a live row does not close these frontiers by itself.

FrontierCurrent status
Field-complete provenanceBlast-radius prediction is scored by a generated accuracy harness: 13 measured cases, 13 passing, 0 failing, and 0 unmeasured value-source rows. The claim remains per measured case; not every rendered field in every chart has provenance.
Full change authorityConfigHub can record and gate operations, but the repo does not yet prove a complete per-field authority model for every agent or user.
Reverse live-to-desired flowLive observations are recorded. Authorized live fixes flowing back into desired state are future product work.
Universal hook executionHooks are inventoried, routed, observed, refused, or marked per-target. This is not a claim that every Helm hook in the top-100 runs automatically.
Fleet-wide bounded propagationDerived variants, blast-radius cases, and promotion examples exist, but a complete fleet propagation product is still being built.
Signatures as trustThe claims register enforces this as reviewer discipline: no evidence means no current claim, partial stays partial, and refused claims stay visible. Signatures still prove integrity and transport only within a named signer, authority, and verification context.

3. The attack taxonomy

Grouped by which claim is attacked. Each entry: the attack, the current defense, and a status (HELD, PARTIAL, WEAK).

A. Attacks on the render claim ("your render equals Helm's")

B. Attacks on the values-space claim ("you proved points, not the space")

C. Attacks on the lifecycle claim ("hooks are the install; you skipped the install")

D. Attacks on the provenance and edges claim (the newest, least-tested layer)

E. Attacks on freshness and coverage

F. Attacks on trust and security

G. Positioning and social attacks

4. The adversarial test plan

Eight tests, ordered by leverage. T1 and T2 first: T1 is cheap and converts every other test into a public scoreboard; T2 covers the weakest high-value claim.

T1. Claims register. The generated register lives at data/claims-register/summary.md. It maps public claims to status, evidence, verification commands, and limits. Anything claimed without a receipt, route, or explicit planning status should be re-scoped or removed. The ongoing task is to keep this register current as new proof lanes and product claims are added.

T2. Blast-radius prediction accuracy harness. The decisive test for the edges layer. For each chart and variant: mutate one input value, predict the affected objects and fields from the inheritance graph and value-source map, then actually re-render and diff. Score predicted-versus-actual (misses and phantoms), publish accuracy per chart per axis. The generated scoreboard at data/blast-radius-accuracy/summary.md measures committed base-pair diffs plus recorded single-value rerender receipts (scripts/record-blast-radius-case.mjs), each rescored offline against the committed value-source-map. That is a growing benchmark, not a general claim. Whole-release identity paths (namespace, releaseName) are measured with rename-aware object pairing and currently fail: the source maps under-predict paths that reach every object through labels, selectors, and embedded names. Failing rows are published with their changed-field evidence, and the route is to make the source maps honest about whole-release scope, then re-record.

T3. Synthetic torture suite. [BUILT 2026-06, growing] Lives at data/torture-suite/: charts written to break the model (randomness in selector labels, lookup in a spec field, sprig env access, tpl self-recursion, subchart alias collisions with hardcoded names, import-values chains, install-vs-upgrade branching), each landing in a named pass, refusal, or route, recording hard-fails on silence, so a new breaker chart fails the build until it is classified. Found along the way: helm v4 rewrites aliased subcharts' .Chart.Name (defending alias-derived names), blocks sprig env at parse, and blows the goroutine stack on tpl self-recursion, all recorded as named outcomes. Future fixtures: a hook that mutates non-hook resources (needs live semantics), dry-run detection. Public problem-chart intake is open through the GitHub issue template; a reported chart still has to become a fixture, receipt, named refusal, or routed gap before it is claimed.

T4. Environment determinism matrix. The recorded matrix lives at data/environment-matrix/summary.md: the proof-grade corpus rendered across timezone and locale variations and flag profiles, each cell rendered twice for per-cell determinism, with digests recorded per flag profile. Open columns, other operating systems, architectures, and Helm versions, are intended to ride on CI runners rather than bespoke local infrastructure. A divergent cell is recorded, not hidden.

T5. Cluster matrix. Capability profiles and admission on/off across kind versions: verify that facts and capability profiles catch every divergence, and that each webhook mutation lands as a named normalization rule with its justification. This is what makes attack C's "etcd is not what you applied" answerable line by line.

T6. External reproduction. Execute the independent-review brief with outsiders: CI on public runners reproducing the proofs, plus at least one named third party rerunning the verification end to end. Publish the failure budget (what failed to reproduce and why). Single-party verification is a structural weakness no internal test can fix.

T7. Time-travel re-verification. Re-run six-month-old receipts: are the artifacts still pullable, signatures still valid, proofs still green. Exercises key rotation and registry durability before a customer does.

T8. Upgrade gauntlet. The install-versus-upgrade divergent charts exercised live on kind: upgrade applied, divergence observed, rollback receipts produced. Converts the weakest lifecycle status from captured to exercised.

5. Where we are still weak (the honest register)

Stated plainly so nobody inside the project is surprised by an outsider saying it:

  1. Lifecycle proof (hooks, weights, delete policies) is the least mature link; today it is classification and refusal more than proof.
  2. CRD upgrade is a per-chart decision, not a mechanism.
  3. The values space is point-covered by construction; the proof travels (local render-verify) but the catalog claim is and will remain per-variant.
  4. Blast-radius prediction accuracy is measured on a small case set. The current known miss is whole-release identity propagation, where source maps under-predict labels, selectors, checksums, DNS names, and immutable identity paths.
  5. Reach and live-freshness links are partial; the chain of proof must be claimed only as far as it holds.
  6. Authority capture does not exist; nothing should imply it does.
  7. The refresh SLA is unproven at top-100 scale, and the staleness attack is only answered by an SLA actually met.
  8. Signing infrastructure (key ceremony, transparency log) is not in place; commercial security claims wait on it.
  9. Most verification to date is still internal to this project. External reproduction remains a separate proof step.
  10. Catalog economics: the abandonment question has a commercial answer or no answer.

6. Response playbook

Rules for the public conversation, matching the existing tone discipline: