Skip to main content

Migrating a workspace

Migration is a planned failover. It moves a workspace to a new home without changing its identity or address, so the user keeps their inbox and feed and every reference that points at the workspace keeps resolving. This runbook covers when to migrate (versus clone), the in-org sequence, failing back, and the extra gates when the destination is in another organization.

It builds on the workspace mobility concepts; read that first for the clone/migrate/failover distinction.

Prerequisites
  • A distinct destination cell or node, a migrate on a single-cell deployment refuses (nothing to move to).
  • The destination can satisfy the workspace's protection policy (replication factor / erasure width / anti-affinity) and its residency constraint.
  • A governance net-gain guard for a real (non-dry-run) run, without one, the migrate refuses.

First: do you want a clone or a migrate?​

You want to…UseWhy
Keep the user's inbox/feed and move where the data livesMigrateIdentity and address are preserved; the source is retired
Branch an environment to experiment, keeping the originalCloneA new identity and address; the source stays live
Recover after the source was lostFailoverUnplanned promotion of a standby

If you need the original to keep existing, you want a clone, stop here and use the cloning runbook. The rest of this page is the migrate path.

The in-org migrate sequence​

A migrate runs as a fail-closed, resumable saga. The order is what makes it safe: bytes move before the source is fenced, and the source is retired only after the destination is proven complete and healthy.

Figure: the migrate saga. The move asserts the identity-preserving plan first (a plan that would mint a new address is rejected outright), then moves bytes while the source still serves, gates on a fail-closed completeness reconcile, fences the source (aborting on a bad epoch to avoid split-brain), repoints resolvers to the new home, drains in-flight work, and releases (retires) the source only after the destination is confirmed healthy, otherwise it rolls back inside the fenced window and refuses.

Table equivalent

StepWhat happensOn failure
Assert identityVerify the plan preserves id + addressRefuse: "a clone wearing a migrate label"
Move bytesCopy planes to the destination while the source still servesSource intact and serving; retry
ReconcileFail-closed completeness gate: destination must hold a complete snapshotAbort; source never fenced
FenceFence the source home (verified epoch required)Abort on a non-positive epoch
RepointSwing resolvers to the new home: shard primaries first, then the home switch, then followersOrdered so a resolve is never blackholed mid-cutover
DrainHeld inbox messages re-delivered on the new home; running agents re-anchoredRe-anchor is best-effort
ConfirmDestination health checkIf unhealthy → roll back
ReleaseRetire the sourceOnly reached once destination is complete and healthy

The move is recorded on the hash-chained mobility activity ledger after cutover, the release is irreversible, so the record follows the fact.

Failing back​

Failback is the same operation with source and destination swapped. If you need to return a workspace to its original home, run the migrate in reverse; it takes the same completeness and health gates, and the same net-gain guard. Because a migrate retires its source, a failback is a fresh planned move back, not an undo of a retained copy.

Cross-organization migrate​

Moving to a different organization runs the same saga with the destination in another org, wrapped in the cross-org trust overlay. Every overlay gate is checked deny-closed before any byte crosses:

Figure: the cross-org migrate gate ladder. The amber gates (consent, egress, residency, protection placement) are all deny-closed and run before any byte crosses; the key is resealed under the destination organization's cell key (cyan); only then does the same migrate saga run; and the operation seals a signed manifest into both organizations' audit chains (green). Any gate that fails refuses, nothing moves.

Table equivalent

GatePasses whenOn failure
ConsentOwner auth (workspace) / N-of-M all collaborators (clean room)Refuse
EgressEvery resource class is permitted (default-deny)Refuse
ResidencyThe destination org's cells are admittedRefuse
Protection placementDestination cells satisfy RF / EC / anti-affinityRefuse: never collapse onto one cell
Key resealKey material re-wraps under the destination org's cell keyAbort before the source is fenced
AuditSigned manifest seals into both orgs' chainsFail-closed if neither observer seals

On a cross-org migrate the workspace's identity is preserved for the user, but its principals are remapped to target-org principals, and cross-org trust paths (SSH keys, federated identity links) and source-org secrets are not carried, a move across a trust boundary does not smuggle the old organization's trust with it.

Across the deployment matrix​

CornerMigrate behavior
Single-cellRefuses: no distinct target
Multi-cell (same org)Full saga; residency and protection choose the target
Cross-organizationSame saga plus the deny-closed trust overlay; dual-audited
Air-gappedPlane bundles and the signed manifest move by physical media and store-and-forward, verified at the destination