Argo CD can synchronize (i.e. apply manifests) in order. The ordering is determined by phase, wave, resource kind (e.g. Namespace, Deployment), and name.
There are 3 phases:
PreSyncSyncPostSync
Within the Sync phase can be one or more waves, assigned to resources using the argocd.argoproj.io/sync-wave annotation, and has integer values, with the lower-numbered waves being applied first.
The question is - what's the purpose of sync phases when the ordering can already be achieved using sync waves? Or - what's the difference assigning a resource to the PreSync phase vs. assigning to a low-numbered sync wave?