DEV Community

When It Runs
When It Runs

Posted on Originally published at whenitruns.substack.com

When an Argo CD App-of-Apps Wave Runs Past a Child With a Missing Resource

With the documented argoproj.io_Application health check, Argo CD v3.5.3 started wave 2 while a child missing a resource read Healthy; on v3.3.14 that child read Missing and the gate held.

When It Runs — Run Report #RR09 · Testing what infrastructure actually does.

Provider · Component: Argo CD · the sync-wave gate of an app-of-apps parent — what the parent waits for before it starts the next wave of child Applications, when it uses the Application health check from Argo CD's documentation

Versions tested: measured — Argo CD v3.5.3 (the latest release as of 2026-09-26; v3.5.4 and v3.5.5, released on 2026-10-06 and 2026-10-12, were not measured) and v3.3.14 (the latest 3.3 release as of 2026-09-26; v3.3.15 and v3.3.16, released on 2026-10-06 and 2026-10-12, were not measured), with identical inputs; both are supported releases. source-read — controller/health.go at both tags. The behavior change came in v3.4.0 (pull request #25962).

Config profile: a single-node kind cluster (node kindest/node:v1.33.4, digest-pinned; a Kubernetes version both releases list as tested), a fresh cluster per release, Argo CD installed from the release's official install.yaml; in argocd-cm, the documented argoproj.io_Application health check plus a health check registered for the kind that fails to apply; a local Git server holding one commit; a parent Application and three child Applications in sync waves 0, 1 and 2 (automated sync); the wave-1 child applies a Job (inner wave 0) and a custom resource whose CRD is not installed (inner wave 1, SkipDryRunOnMissingResource=true); 10-second polling for 10 minutes.

Verified on: 2026-10-13 (desk sources re-checked; v3.5.5 was the latest release and v3.3.16 the latest 3.3 release) · lab measured 2026-09-27 on v3.5.3 and v3.3.14.

Affects: Argo CD 3.4 and later (measured: v3.5.3) app-of-apps setups that gate sync waves on child Applications with the documented argoproj.io_Application health check: a child Application with a resource that failed to apply — of a kind that has a health check, with its dry run skipped — can report Healthy, and the parent can start the next wave. With the same inputs, v3.3.14 reports that child as Missing and holds the gate.

TL;DR: On Argo CD v3.5.3, an app-of-apps parent using the documented Application health check began creating its wave-2 child 6 seconds after the parent was created, while the wave-1 child reported Healthy with its custom resource (whose CRD is not installed) still unapplied; that resource failed to apply 36 milliseconds later, and the child stayed Healthy and OutOfSync for the rest of the 10-minute window. With the same inputs, v3.3.14 reported that child as Missing and held the gate for the whole window.

Full report: https://whenitruns.substack.com/p/when-an-argo-cd-app-of-apps-wave

Reproduction repo: https://github.com/whenitruns/when-an-argo-cd-app-of-apps-wave-runs-past-a-child-with-a-missing-resource

Top comments (0)