0
No destructive change
Legacy only
One required full_name field serves every request.
- 0Legacy
- 1Expand schema
- 2Dual write
- 3Backfill
- 4Switch reads
- 5Stop old writes
- 6Contract
Live data plane
Old v1 clients know full_name. New v2 clients expect given_name + family_name.
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
Compatibility matrix
What each client can do at the current stage.
| Client | Read | Write |
|---|---|---|
| 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.
Flight recorder
Per-tick target lag and request errors, plus the decisions that changed them.