Parent
#3515
Design update (supersedes original §3/§8): enable flags live in AplCluster.spec.apps (env/settings/cluster.yaml), not a dedicated env/settings/apps.yaml. See #3515 comment and ADR adr/2026-08-21-app-enable-flags-in-aplcluster.md.
What to build
The foundational tracer bullet for the "everything is an app" model: drive one always-installed pilot app (cert-manager) end-to-end through the new git-driven pipeline while every other core app stays on the legacy path.
End-to-end behavior:
- The pilot app's
enabled flag is read from AplCluster.spec.apps.<name> in env/settings/cluster.yaml — reusing the existing AplCluster file-map entry, no new file/kind. derived.gotmpl overlays .Values.cluster.apps onto .Values.apps and then unsets .Values.cluster.apps, so existing installed: helmfile expressions for the pilot (.Values.apps.<name>.enabled) keep working byte-for-byte unchanged, and bin/compare.sh stays a zero-delta oracle.
- The pilot app's chart values live at
env/values/<namespace>/<release>/values.custom.yaml (user-editable, vendor-shaped) and env/values/<namespace>/<release>/values.managed.yaml (operator-rendered cross-cutting/derived values). These are plain vendor YAML, outside the platform .Values merge.
- The operator writes both value files, then writes an ArgoCD
Application CR as a file to env/manifests/namespaces/argocd/applications/<namespace>-<release>.yaml, committing files before the CR references them. The CR uses ArgoCD multi-source form: chart source + a ref source to the values repo with helm.valueFiles: [values.managed.yaml, values.custom.yaml] (custom wins on overlap).
- A single bootstrap root app-of-apps
Application is server-side-applied during initial install and reconciles env/manifests/namespaces/argocd/applications/ recursively. After bootstrap, the pilot is fully git-driven.
- The
Application name/filename keep today's <namespace>-<release> convention (getAppName) so the pilot upgrades in place rather than being replaced.
The CR-shape + write-then-create ordering must be produced by a dependency-injectable function (extending today's getArgocdCoreAppManifest / createArgocdAppManifest), following the existing deps = {...} pattern used by addGitOpsApps and the pure-function assertion style of getArgocdGitopsManifest.
Acceptance criteria
Blocked by
None - can start immediately.
Parent
#3515
What to build
The foundational tracer bullet for the "everything is an app" model: drive one always-installed pilot app (
cert-manager) end-to-end through the new git-driven pipeline while every other core app stays on the legacy path.End-to-end behavior:
enabledflag is read fromAplCluster.spec.apps.<name>inenv/settings/cluster.yaml— reusing the existingAplClusterfile-map entry, no new file/kind.derived.gotmploverlays.Values.cluster.appsonto.Values.appsand then unsets.Values.cluster.apps, so existinginstalled:helmfile expressions for the pilot (.Values.apps.<name>.enabled) keep working byte-for-byte unchanged, andbin/compare.shstays a zero-delta oracle.env/values/<namespace>/<release>/values.custom.yaml(user-editable, vendor-shaped) andenv/values/<namespace>/<release>/values.managed.yaml(operator-rendered cross-cutting/derived values). These are plain vendor YAML, outside the platform.Valuesmerge.ApplicationCR as a file toenv/manifests/namespaces/argocd/applications/<namespace>-<release>.yaml, committing files before the CR references them. The CR uses ArgoCD multi-source form: chart source + arefsource to the values repo withhelm.valueFiles: [values.managed.yaml, values.custom.yaml](custom wins on overlap).Applicationis server-side-applied during initial install and reconcilesenv/manifests/namespaces/argocd/applications/recursively. After bootstrap, the pilot is fully git-driven.Applicationname/filename keep today's<namespace>-<release>convention (getAppName) so the pilot upgrades in place rather than being replaced.The CR-shape + write-then-create ordering must be produced by a dependency-injectable function (extending today's
getArgocdCoreAppManifest/createArgocdAppManifest), following the existingdeps = {...}pattern used byaddGitOpsAppsand the pure-function assertion style ofgetArgocdGitopsManifest.Acceptance criteria
enabledflag lives atAplCluster.spec.apps.<name>inenv/settings/cluster.yamland is projected onto.Values.apps.<name>.enabledviaderived.gotmpl(overlay-then-unset); legacyinstalled:expressions still resolve for the pilot.values.managed.yaml+ a startervalues.custom.yamland commits them before theApplicationCR file is created (ordering asserted in a unit test via injected deps, no real git/K8s).ApplicationCR is multi-source withvalueFileslisting managed then custom, named<namespace>-<release>.env/manifests/namespaces/argocd/applications/recursively.AplCluster.spec.apps.<name>.enabled(fromenv/settings/cluster.yaml) to decide whether to act.Blocked by
None - can start immediately.