Configuration settings
There is no per-deployment migration feature flag, no separate mutation to enable, and no per-cluster opt-in beyondfailoverEnabled. The settings that govern it are the data plane failover settings plus the new region model.
Cluster failover states
The cluster detail page shows a Failover field, which replaces the older binary “Failover Enabled.” Reading it is how you tell whether a cluster can participate in migration:
The underlying API fields are
Cluster.failoverEnabled (the control-plane-effective state) and Cluster.failoverUpgradeStatus (not_started, in_progress, complete, or null).
Cluster.failoverEnabled starts from what the data plane reports, but the control plane force-downgrades it to false whenever an eligibility check fails. It reflects reality, not intent. If you enabled the Helm value and the field is still false, something in the eligibility check is failing, and the Failover status tells you which.Failover-readiness shield states
The Deployments list shows a failover-readiness shield next to each Deployment name, on failover-capable clusters only. It uses one outline icon, distinguished by color, plus an exclamation badge for Attention. The API field behind it isDeployment.failoverReadiness.
Mission states
Selecting N Deployments creates N independent missions, one per Deployment. Each moves through the following states:CLEANUP_PENDING doesn’t occur in per-deployment migration. Migrations always run in controlled mode, so the Scavenger flight (source cleanup) must succeed before the Hyperjump flight is dispatched. Once the Hyperjump succeeds, the source is already cleaned and the mission goes straight to COMPLETED. If the Scavenger fails, the Hyperjump never runs and the mission is FAILED. This state arises only in a forced cluster failover, where the Hyperjump can cut over while source-side cleanup is still deferred or has failed — and even there it isn’t an error.Flight states
Each flight within a mission has its own state:AWAITING_DP_HEALTH is a wait, not a failure: the circuit breaker parked the flight because the data plane was unreachable. Fix the data plane and it resumes on its own.
Migration errors and skips
migrateDeployments has two failure modes. Whole-mutation errors are about the destination and reject the entire call, so nothing moves. Per-deployment skips pass over one Deployment and let the rest proceed.
Whole-mutation errors
These are evaluated in order, and the first match wins. Because cordon and in-flight-failover are checked before authorization, an unauthorized caller may see a health or cordon error first.Per-deployment skips
When a Deployment is skipped, the rest of the batch still migrates. Skips are safe to retry: re-issuingmigrateDeployments with just the skipped IDs is a normal workflow, because a skipped Deployment was never claimed and nothing is left in a partial state.
Cluster failover skipping a migrating Deployment
The exclusion runs both ways. If a cluster failover starts while one of your migration missions is in flight, the failover silently skips that Deployment rather than aborting, and records it inFailoverRequest.skippedDeployments. Each entry carries the Deployment ID, release name, mission ID, and reason. The skipped list is surfaced on the cluster detail page at reconcile finalization. Those Deployments weren’t failed over — once the migration mission completes, retry them explicitly.
GraphQL surface
Relevant fields
The data plane health signal the migration gate reads is an internal control plane column and isn’t exposed on the
Cluster GraphQL type. To confirm it from the API, use failoverTargetClusters, which already filters on it.