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.goat both tags. The behavior change came in v3.4.0 (pull request #25962).
Config profile: a single-nodekindcluster (nodekindest/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 officialinstall.yaml; inargocd-cm, the documentedargoproj.io_Applicationhealth 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 documentedargoproj.io_Applicationhealth 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 reportHealthy, and the parent can start the next wave. With the same inputs, v3.3.14 reports that child asMissingand 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 reportedHealthywith its custom resource (whose CRD is not installed) still unapplied; that resource failed to apply 36 milliseconds later, and the child stayedHealthyandOutOfSyncfor the rest of the 10-minute window. With the same inputs, v3.3.14 reported that child asMissingand 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)