Git, CI/CD & GitOpsLXXIX · Sync StrategiesSyncStrategies
Manual sync — the default, the audit, and the discipline of waiting
What you'll learn
- Recognise manual sync as the default syncPolicy when an Application is created
- Describe what the operator reviews before invoking argocd app sync
- Identify the failure mode manual sync prevents that automated sync does not
- Choose manual sync for production Applications whose diff has not been audited
Prerequisites
Verified against Git 2.55.x teaching target; 2.40+ minimum · GitHub Actions continuous service; Aug 2026 documentation baseline · Argo CD v3.5.x teaching target; v3.0+ minimum · Flux v2.9.x · Sigstore Cosign v3.1.x · SLSA v1.2 · OCI Distribution Specification v1.1 · Git LFS v3.7.1 · Kubernetes (cross-course target) 1.36.x
When an Application is created with no syncPolicy, the
controller treats it as manual. The reconcile loop runs, the
controller renders the manifests, computes the diff, updates
status.sync.status to OutOfSync, and stops. Nothing is applied
to the cluster until an operator runs argocd app sync NAME.
Manual sync is the default because the controller has no opinion
about whether a given diff is safe; the human does.
What manual sync means
In manual mode the controller is a detector, not an actor. It performs every step of reconciliation up to and including the apply, then halts:
flowchart LR
A["Git commit"] --> R["Render manifests"]
R --> D["Compare to live state"]
D -->|"diff empty"| S["Synced"]
D -->|"diff present"| O["OutOfSync"]
O --> H["Wait for argocd app sync NAME"]
H --> AP["Apply diff"]
AP --> S
The operator sees the diff before the apply. The command:
argocd app diff payment-api
prints the same diff the controller computed. The operator reads it. If the diff is correct, the operator runs:
argocd app sync payment-api
The apply then proceeds, and status.sync.status returns to
Synced.
The audit before the apply
A manual sync is not a delay; it is an audit step. The operator
asks four questions before invoking argocd app sync:
- Is the diff what the commit promised? The render and the live state are both visible in the diff; an unexpected resource is a render surprise.
- Is the diff scoped to one concern? A diff that touches unrelated resources is a PR that bundled unrelated changes; the PR review should have caught it, but the sync is the last line of defence.
- Are the resources safe to apply now? Some resources are destructive on apply (a ConfigMap overwrite can drop a custom resource definition’s last-applied configuration). The audit gates those.
- Is there a rollback plan? A sync that cannot be rolled back is a sync that needs an explicit decision.
Why manual sync is still the right answer for some Applications
The argument for manual sync is not “humans are smarter than controllers”. The argument is that the cost of an unscheduled apply is higher than the cost of waiting for the operator. The cases where that is true:
- Workloads with side effects on apply. A CronJob whose first run deletes data is an apply that must be timed. Manual sync lets the team choose the moment.
- Workloads under active incident response. A controller applying a diff during an incident is a controller competing with the on-call engineer for the cluster’s state. Manual sync pauses the competition.
- Workloads whose diff is hard to review. A Helm chart with thirty templates produces a diff the operator cannot read in five minutes. Manual sync with a longer review window is correct; automated sync removes the window.
Manual sync in a busy fleet
The objection to manual sync at scale is real: a team with five hundred Applications cannot review every diff. The response is not “automate everything”; the response is to segment the fleet by risk. Manual sync for the workloads that justify it; automated sync for the workloads whose diff is well understood. The decision is per-Application, not per-cluster, and it changes over time as the chart matures.
Production discipline
- Manual sync is the default for any Application whose diff has not been audited in its current shape. The first three syncs of a new chart are learning syncs.
- The diff is the audit. An operator invoking
argocd app syncwithout readingargocd app diffis signing a contract they have not read. - Manual sync is a per-Application decision. Clusters do not have a “manual fleet” or an “automated fleet”; Applications do.
- Manual sync during an incident is a feature, not a delay. The controller waits; the on-call engineer owns the apply.
Cross-course references
- Git, CI/CD & GitOps for Infrastructure Engineers - Part LXXVII-04 (Sync policies and windows) introduces the policy this lesson deepens; Part LXXV (Drift) is the failure mode manual sync gates against.
- Kubernetes for Production Sysadmins - Part XVI (Operators and Controllers) covers the reconcile loop that manual sync interrupts at the apply step.
Quiz
Knowledge check · 4 questions
Q1. An Application is created with no syncPolicy. What does the controller do after rendering the manifests and detecting a diff?
Q2. Manual sync is more than a delay; it is the audit step that converts a render into a deliberate apply.
Q3. Name the four questions an operator should answer before invoking argocd app sync, and identify which one protects against a render surprise.
Q4. Diagnose why the production Application synced during the incident and recommend a fix.
A team is responding to a production incident. The on-call engineer has just scaled a Deployment manually with kubectl scale to add capacity. The Application for that Deployment is in manual sync mode, but the controller still re-renders on the next reconcile. The next Git commit (an unrelated docs change) lands during the incident. The on-call engineer is still holding the manual scale when a colleague invokes argocd app sync without reading the diff, because the diff looks small. The manual scale is reverted.
Passing score: 75%. Answers are checked in this browser.