Lifecycle Route Action Contract

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.

UNOFFICIAL/EXPERIMENTAL. Field definitions and projection rules for actions.csv / actions.json, generated with the data from the same constants so they cannot drift. Machine schema: ../../schemas/lifecycle-route-action.schema.json.

Purpose

Turn each legible lifecycle route into a checkable plan a UI or agent can act on - phase, action kind, required facts, evidence required - while keeping the honest boundary that a known route is not an automatically executed one.

Columns

ColumnMeaning
chart / version / baseSubject.
quirk_class / route_nameThe route identity, from lifecycle-routes.
dispositionExecutability: observed, routed, per-target, not-run, blocked, refused.
source_disposition / source_live_statusThe raw lifecycle-routes values, for traceability.
lifecycle_phasepre-render, preflight, pre-apply, post-apply, observe, refuse.
action_kindWhat kind of step it is (see table).
execution_modeWho would run it: product-executes / user-executes / target-owned / not-yet-executable.
automatictrue only when execution_mode is product-executes AND evidence proves it. False otherwise.
required_target_factsWhat the target must supply.
human_commandA placeholder command (not verified). May be empty.
evidence_requiredWhat must exist before the row can advance to observed/supported.
source_driftNamed version drift vs the catalog; empty when none.
evidence_or_next_actionReceipt path when observed, else the next step.

actions.json adds alternatives (off-ramp routes) and agent_inputs (the stable selection block).

Invariants (enforced by --verify)

  1. Every routed/per-target lifecycle route has an action packet.
  2. No packet is automatic: true without committed evidence - and none is today.
  3. disposition / lifecycle_phase / action_kind never drift from the published vocabularies above.
  4. Version drift is named in source_drift, never hidden.

Source disposition crosswalk

lifecycle-routes disposition (+ live status) → action disposition:

SourceAction disposition
observedobserved
per-targetper-target
refusedrefused
todo (live_status=not-run)not-run
todo (other)blocked (no recipe/route built yet)
routed (live_status=blocked)blocked
routed (live_status=none/other)routed

Route → phase / action kind

route_namelifecycle_phaseaction_kind
recipe-time-lifecycle-verificationpre-renderverify-render
preflight-or-presyncpreflightrun-preflight
target-facts-or-preflightpreflightstage-target-facts
target-class-preflight-and-upgrade-actionpreflightrun-preflight
preflight-or-presync-crd-applypre-applyinstall-crd
preserve-orderingpre-applypreserve-ordering
self-contained-crd-basepre-applypreserve-ordering
upgrade-action-with-receiptpre-applyrun-job
explicit-managed-actionpost-applyrun-job
argocd-or-flux-lifecycle-hookpost-applygitops-sync-hook
postsync-check-or-observationpost-applyrun-check
explicit-test-checkobserverun-test
webhook-readiness-observationobserveobserve-webhook
preserve-cleanup-policyobserveaccept-target-policy
delete-cleanup-policyobserveaccept-target-policy
explicit-delete-cleanup-actionobserverun-job
explicit-post-install-checkobserverun-test
postsync-readiness-observationpost-applyrun-check

(For a refused route the phase is refuse.)

Determinism

A pure function of data/lifecycle-routes/routes.json and data/master-catalog-matrix/matrix.csv. No timestamps, no network, no cluster. Regenerate with npm run lifecycle:route-actions; verify byte-for-byte plus invariants with npm run lifecycle:route-actions:verify.