# Lifecycle Routes

**UNOFFICIAL/EXPERIMENTAL.** Generated by `scripts/generate-lifecycle-routes.mjs`.
Do not hand-edit. Regenerate with `npm run lifecycle:routes`.

This is a machine-readable answer to one question a Helm user asks when a chart
has a hook or hidden lifecycle behavior:

~~~text
Where does it go? Who executes it? What is the default? What are my off-ramps?
~~~

Render parity proves the desired non-hook objects. This contract is the separate
fact about the lifecycle behavior: its route, who runs it, and whether the
product runs it automatically (today, nothing does — see below).

The full field definitions and the deterministic mapping tables are in
[contract.md](./contract.md). The two data forms are
[routes.csv](./routes.csv) (spreadsheet) and [routes.json](./routes.json)
(stable interface for agents).

## What This Covers

53 route rows across 18 chart/version lifecycle behaviors,
joined from:

- [data/hook-disposition/top100-hook-dispositions.csv](../hook-disposition/summary.md)
- [data/hook-route-candidates/candidates.csv](../hook-route-candidates/summary.md)
- [data/hook-lifecycle-review/top100-source-hook-route-review.csv](../hook-lifecycle-review/summary.md)
- `data/hook-route-candidates/selected-routes/*.yaml`

It starts with hooks and existing routed hook candidates, and reaches the
adjacent Tier-1 lifecycle quirks those rows already touch (`crd-install`,
`target-facts`, `webhook-readiness`). Quirk classes with no per-chart route
data yet (for example generated-facts, lookup) are deliberately out of scope
until that data exists — a small correct contract, not a broad guess.

## The Honest Headline

0 of 53 rows are safe to show as automatic.

Nothing the catalog renders today is auto-executed by the cub installer. Every
route is `user-executes`, `target-owned` (a controller or GitOps engine runs
it), or `not-yet-executable`. That is the entire point of the contract: a
`routed` disposition means the route and its executor are named and an off-ramp
exists — **not** that the product silently runs it. `safe_as_automatic` only
becomes `yes` when `execution_mode` is `product-executes` and evidence proves
it.

## Distribution

| Disposition | Rows |
| --- | ---: |
| `observed` | 42 |
| `routed` | 5 |
| `todo` | 5 |
| `per-target` | 1 |

| Execution mode | Rows |
| --- | ---: |
| `user-executes` | 35 |
| `target-owned` | 10 |
| `not-yet-executable` | 8 |

| Quirk class | Rows |
| --- | ---: |
| `hook-phase` | 23 |
| `hook-delete-policy` | 8 |
| `crd-install` | 5 |
| `hook-test` | 4 |
| `hook-weight-ordering` | 4 |
| `target-facts` | 4 |
| `webhook-readiness` | 4 |
| `per-target-hook` | 1 |

## How To Read One Row

Take `route_name = preflight-or-presync`, `disposition = routed`,
`execution_mode = user-executes`:

- **quirk_class** — the kind of behavior (here a pre-install/upgrade hook phase).
- **disposition** — `routed`: the route is named but not yet proven live.
- **route_name / default_route** — where the behavior goes by default.
- **alternatives** — the named off-ramps for this quirk class.
- **execution_mode** — `user-executes`: you run it; the product does not.
- **human_offramp / agent_offramp** — how each picks a non-default route. A human
  selects a different recipe base/values; an agent enumerates and selects from
  [routes.json](./routes.json).
- **route_requirements** — what the route needs (target facts, conditions).
- **live_status / safe_as_automatic** — proven-ness, and the strict automatic
  flag (`no` until the product executes it with evidence).
- **evidence_or_next_action** — the receipt path if observed, else the next step.

## Rows

| Chart | Base | Quirk | Route | Disposition | Execution | Auto |
| --- | --- | --- | --- | --- | --- | --- |
| airflow-helm/airflow@8.9.0 | chart fallback | hook-phase | `explicit-managed-action` | routed | not-yet-executable | no |
| apache-airflow/airflow@1.21.0 | chart fallback | hook-phase | `recipe-time-lifecycle-verification` | todo | not-yet-executable | no |
| argo-cd/argo-workflows@1.0.14 | chart fallback | crd-install | `preflight-or-presync-crd-apply` | todo | not-yet-executable | no |
| argo-cd/argo-workflows@1.0.14 | default | crd-install | `preflight-or-presync-crd-apply` | observed | user-executes | no |
| argo-cd/argo-workflows@1.0.14 | minimal-crds | crd-install | `self-contained-crd-base` | observed | target-owned | no |
| bitnami/contour@21.1.4 | legacy | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| bitnami/kafka@32.4.3 | chart fallback | hook-phase | `explicit-managed-action` | routed | not-yet-executable | no |
| bitnami/minio@17.0.21 | chart fallback | hook-phase | `explicit-managed-action` | routed | not-yet-executable | no |
| bitnami/thanos@17.3.1 | chart fallback | hook-phase | `explicit-managed-action` | todo | not-yet-executable | no |
| datadog/datadog@3.214.0 | chart fallback | per-target-hook | `target-class-preflight-and-upgrade-action` | per-target | user-executes | no |
| fluent/fluent-bit@0.57.6 | chart fallback | hook-delete-policy | `preserve-cleanup-policy` | observed | target-owned | no |
| fluent/fluent-bit@0.57.6 | chart fallback | hook-test | `explicit-test-check` | observed | user-executes | no |
| fluent/fluent-bit@0.57.6 | default | hook-test | `explicit-test-check` | observed | user-executes | no |
| gatekeeper/gatekeeper@3.22.2 | default | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| gatekeeper/gatekeeper@3.22.2 | default | hook-phase | `upgrade-action-with-receipt` | observed | user-executes | no |
| gitlab/gitlab@10.0.0 | chart fallback | hook-phase | `argocd-or-flux-lifecycle-hook` | todo | not-yet-executable | no |
| k8s-dashboard/kubernetes-dashboard@7.14.0 | chart fallback | hook-phase | `upgrade-action-with-receipt` | routed | user-executes | no |
| kedacore/keda@2.19.0 | no-crds | webhook-readiness | `webhook-readiness-observation` | observed | target-owned | no |
| kong/kong@3.2.0 | chart fallback | hook-phase | `upgrade-action-with-receipt` | routed | user-executes | no |
| kyverno/kyverno@3.8.1 | chart fallback | hook-delete-policy | `delete-cleanup-policy` | observed | target-owned | no |
| kyverno/kyverno@3.8.1 | chart fallback | hook-delete-policy | `preserve-cleanup-policy` | observed | target-owned | no |
| kyverno/kyverno@3.8.1 | chart fallback | hook-phase | `upgrade-action-with-receipt` | observed | user-executes | no |
| kyverno/kyverno@3.8.1 | chart fallback | hook-test | `explicit-test-check` | observed | user-executes | no |
| kyverno/kyverno@3.8.1 | chart fallback | hook-weight-ordering | `preserve-ordering` | observed | target-owned | no |
| kyverno/kyverno@3.8.1 | chart fallback | target-facts | `target-facts-or-preflight` | observed | user-executes | no |
| kyverno/kyverno@3.8.1 | default | hook-delete-policy | `delete-cleanup-policy` | observed | target-owned | no |
| kyverno/kyverno@3.8.1 | default | hook-phase | `upgrade-action-with-receipt` | observed | user-executes | no |
| kyverno/kyverno@3.8.1 | default | hook-test | `explicit-test-check` | observed | user-executes | no |
| projectcalico/tigera-operator@v3.32.0 | default | hook-delete-policy | `explicit-delete-cleanup-action` | observed | user-executes | no |
| projectcalico/tigera-operator@v3.32.0 | default | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | hook-delete-policy | `preserve-cleanup-policy` | observed | target-owned | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | hook-phase | `postsync-check-or-observation` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | hook-phase | `upgrade-action-with-receipt` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | hook-weight-ordering | `preserve-ordering` | observed | target-owned | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | target-facts | `target-facts-or-preflight` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.0 | chart fallback | webhook-readiness | `webhook-readiness-observation` | observed | target-owned | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | crd-install | `preflight-or-presync-crd-apply` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | hook-delete-policy | `preserve-cleanup-policy` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | hook-phase | `postsync-check-or-observation` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | hook-phase | `upgrade-action-with-receipt` | todo | not-yet-executable | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | hook-weight-ordering | `preserve-ordering` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | target-facts | `target-facts-or-preflight` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | default | webhook-readiness | `webhook-readiness-observation` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | crd-install | `preflight-or-presync-crd-apply` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | hook-delete-policy | `preserve-cleanup-policy` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | hook-phase | `postsync-check-or-observation` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | hook-phase | `preflight-or-presync` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | hook-phase | `upgrade-action-with-receipt` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | hook-weight-ordering | `preserve-ordering` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | target-facts | `target-facts-or-preflight` | observed | user-executes | no |
| prometheus-community/kube-prometheus-stack@85.3.3 | no-crds | webhook-readiness | `webhook-readiness-observation` | observed | user-executes | no |

## Boundaries

- Static join of committed CSVs and selected-route YAML receipts. No hook is executed, no cluster is
  touched, no ConfigHub state is changed, no `runs/` receipt is edited.
- A `routed` or `todo` row is a classification, not a proof. `observed` rows
  point at the committed receipt in `evidence_or_next_action`.
- The master matrix value `candidate-route` maps to `routed` here; the
  `source_disposition` column keeps the original value for traceability.
