Skip to main content
RunBook Academy

Git, CI/CD & GitOpsLXXIX · Sync StrategiesSyncStrategies

Manual sync — the default, the audit, and the discipline of waiting

Advanced⏱ ~22 mingitargocd

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

Not yet marked complete on this device.

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. 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.
  2. The diff is the audit. An operator invoking argocd app sync without reading argocd app diff is signing a contract they have not read.
  3. Manual sync is a per-Application decision. Clusters do not have a “manual fleet” or an “automated fleet”; Applications do.
  4. 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

  1. Q1. An Application is created with no syncPolicy. What does the controller do after rendering the manifests and detecting a diff?

  2. Q2. Manual sync is more than a delay; it is the audit step that converts a render into a deliberate apply.

  3. Q3. Name the four questions an operator should answer before invoking argocd app sync, and identify which one protects against a render surprise.

  4. 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.