# Helm Render Intents

**UNOFFICIAL/EXPERIMENTAL.** Generated by `scripts/generate-helm-render-intents.mjs`; do not hand-edit. Regenerate with `npm run helm-render-intents`.

This report connects the full helm-expt chain to the shorter ConfigHub model. A render intent is one reviewed base-variant path: chart, version, values profile, namespace, capability profile, source lock, package base, installer package OCI ref, evidence lanes, lifecycle routes, and target prerequisites.

The generator emits files only for real base rows in the master matrix. Candidate and custom-discussion rows stay visible in the matrix, but they are not emitted as runnable render-intent configs yet.

## Snapshot

| Measure | Count |
| --- | ---: |
| Real base rows in the matrix | 199 |
| Generated HelmRenderIntent objects | 199 |
| Candidate/custom-discussion rows skipped | 67 |
| Intents with lifecycle routes attached | 14 |
| Intents whose routes name the Argo CD and Flux handling | 14 |
| Intents with target facts declared by the base variant | 67 |
| Intents with action records from observed prerequisite failures | 27 |
| Lifecycle contract gaps named for follow-up | 3 |
| Target-prerequisite reviews still missing | 132 |

## Contract Coverage

Every render intent now states whether its lifecycle and target-prerequisite contract is attached, explicitly unnecessary, or still missing. A missing contract stays in the generated gap list; it is not treated as proof that the chart needs no extra work.

| Lifecycle state | Intents |
| --- | ---: |
| `actionable-gap` | 3 |
| `attached` | 12 |
| `no-route-required` | 184 |

| Target-prerequisite state | Intents |
| --- | ---: |
| `actionable-gap` | 132 |
| `attached` | 56 |
| `attached-with-observed-actions` | 11 |

Open [contract-gaps.md](./contract-gaps.md) for the exact bases that still need a route or target-prerequisite review.

## By Catalog Layer

| Layer | Intents |
| --- | ---: |
| F2a | 95 |
| F2b | 104 |

## Model

Simple view:

```text
Component
  base variants: the named render choices for Helm
    render variants: the captured Kubernetes output for one base
  managed variants: how ConfigHub operates the rendered config
```

Full helm-expt view:

```text
chart/version
  recipe
    base variant
      render intent
        render variant / rendered revision
          package base
            ConfigHub Units
              managed variants
                promotions / targets / observations
```

A render intent keeps two kinds of prerequisite information separate. `targetFacts.requirements` normalizes what the base says must exist and when it must be checked again. `targetFacts.actions` contains follow-up records derived from observed prerequisite failures. Lifecycle routes separately show the direct, Argo CD, and Flux implementations, and say whether each one has evidence or is only mapped.

## Render Variant Examples

A render variant is the captured output of one base render. Open `rendered/release-objects.yaml` for the full Kubernetes YAML. That file is the object output, not the whole record. The render intent, `variant-revision`, lifecycle routes, target facts, and receipts explain the inputs, checksums, hooks, CRDs, setup work, and prerequisites around that output.

| Component | Base variant | Render intent | Full rendered YAML | Package OCI | Other render records | Why it exists |
| --- | --- | --- | --- | --- | --- | --- |
| bitnami/redis 25.5.3 | `default` | [bitnami-redis-25-5-3-default](./intents/bitnami-redis-25-5-3-default.yaml) | [release-objects.yaml](../../recipes/bitnami/redis/25.5.3/revisions/default/r001/rendered/release-objects.yaml) | `oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/bitnami-redis:25.5.3` | [revision](../../recipes/bitnami/redis/25.5.3/revisions/default/r001/variant-revision.yaml) and [package base](../../packages/bitnami/redis/25.5.3/bases/default) | The Redis default render. Use it to compare with the existing-secret render. |
| bitnami/redis 25.5.3 | `reuse-existing-secret` | [bitnami-redis-25-5-3-reuse-existing-secret](./intents/bitnami-redis-25-5-3-reuse-existing-secret.yaml) | [release-objects.yaml](../../recipes/bitnami/redis/25.5.3/revisions/reuse-existing-secret/r001/rendered/release-objects.yaml) | `oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/bitnami-redis:25.5.3` | [revision](../../recipes/bitnami/redis/25.5.3/revisions/reuse-existing-secret/r001/variant-revision.yaml) and [package base](../../packages/bitnami/redis/25.5.3/bases/reuse-existing-secret) | A Redis render that points at an existing Secret instead of using generated password material. |
| argo-cd/argo-cd 9.5.15 | `no-crds` | [argo-cd-argo-cd-9-5-15-no-crds](./intents/argo-cd-argo-cd-9-5-15-no-crds.yaml) | [release-objects.yaml](../../recipes/argo-cd/argo-cd/9.5.15/revisions/no-crds/r001/rendered/release-objects.yaml) | `oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/argo-cd-argo-cd:9.5.15` | [revision](../../recipes/argo-cd/argo-cd/9.5.15/revisions/no-crds/r001/variant-revision.yaml) and [package base](../../packages/argo-cd/argo-cd/9.5.15/bases/no-crds) | An Argo CD render that keeps CRDs out of this base so CRD ordering can be handled explicitly. |
| prometheus-community/kube-prometheus-stack 85.3.3 | `no-crds` | [prometheus-community-kube-prometheus-stack-85-3-3-no-crds](./intents/prometheus-community-kube-prometheus-stack-85-3-3-no-crds.yaml) | [release-objects.yaml](../../recipes/prometheus-community/kube-prometheus-stack/85.3.3/revisions/no-crds/r001/rendered/release-objects.yaml) | `oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/prometheus-community-kube-prometheus-stack:85.3.3` | [revision](../../recipes/prometheus-community/kube-prometheus-stack/85.3.3/revisions/no-crds/r001/variant-revision.yaml) and [package base](../../packages/prometheus-community/kube-prometheus-stack/85.3.3/bases/no-crds) | A kube-prometheus-stack render with CRDs owned outside the base and seven recorded lifecycle routes. |
| prometheus-community/prometheus 29.8.0 | `server-only-ephemeral` | [prometheus-community-prometheus-29-8-0-server-only-ephemeral](./intents/prometheus-community-prometheus-29-8-0-server-only-ephemeral.yaml) | [release-objects.yaml](../../recipes/prometheus-community/prometheus/29.8.0/revisions/server-only-ephemeral/r001/rendered/release-objects.yaml) | `oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/prometheus-community-prometheus:29.8.0` | [revision](../../recipes/prometheus-community/prometheus/29.8.0/revisions/server-only-ephemeral/r001/variant-revision.yaml) and [package base](../../packages/prometheus-community/prometheus/29.8.0/bases/server-only-ephemeral) | A Prometheus render for the server path without the extra default components. |

## Files

- [`intents.csv`](./intents.csv) - one row per generated render intent.
- [`intents.json`](./intents.json) - all generated render intents in one object.
- [`intents/`](./intents/) - one YAML file per generated render intent.
- [`contract.md`](./contract.md) - what the generated object claims and refuses to claim.
- [`contract-gaps.md`](./contract-gaps.md) and [`contract-gaps.csv`](./contract-gaps.csv) - bases whose route or target-prerequisite contract is still incomplete.

## Regenerate

```sh
npm run helm-render-intents
npm run helm-render-intents:verify
```
