Expand · Migrate · Contract

Migration Flight Simulator

Change a live customer-name schema while old and new clients keep reading and writing. The simulator tracks what users see, not just whether the DDL succeeds.

Paused T+000s Manual flight
Requests 0 0 reads · 0 writes
Error rate 0.0% 0 failed requests
Stale / mismatch 0 / 0 0 stale responses · rows / replicas
Backfill lag target shape not expanded
Data-loss rows 0 no acknowledged value missing
Invariant checks 3 / 5 guardrails evaluating
0
Legacy only One required full_name field serves every request.
No destructive change
  1. 0Legacy
  2. 1Expand schema
  3. 2Dual write
  4. 3Backfill
  5. 4Switch reads
  6. 5Stop old writes
  7. 6Contract

Live data plane

Old v1 clients know full_name. New v2 clients expect given_name + family_name.

0 req/min
CLIENT V1 full_name CLIENT V2 given + family COMPATIBILITY WRITER legacy only read: legacy only LIVE RECORD legacy.full_name 48 current rows normalized.name column absent
Non-atomic write order1 leg

client → legacy → ACK

A second-leg failure leaves the first copy visible even though the request returns an error.

New-client read orderv2 offline

v2 query unavailable

Fallback happens only when a shape is missing or unavailable. A present-but-stale value still wins.

Expand the target shape before sending new-client traffic.
Record #1000 · expected version 1
Legacy shapeCURRENT

              
Normalized shapeABSENT

              
Expected valueACKNOWLEDGED

              

Compatibility matrix

What each client can do at the current stage.

2 clients
ClientReadWrite
Old v1 WorksReads full_name. WorksWrites full_name.
New v2 BlockedNormalized columns do not exist. BlockedNormalized columns do not exist.

Invariant & contract gate

The destructive step must prove these, not assume them.

Not armed

      Flight recorder

      Per-tick target lag and request errors, plus the decisions that changed them.

      100% 0%