Data plane

Schema changes that don't take prod down.

Vadyl classifies every migration into one of eight risk levels and picks the right strategy. Add a NOT NULL column on a 50M-row table? Expand-then-backfill with checkpoint-resumable batches. Rename a field? Compatibility window with dual-write. Drop a destructive constraint? Approval-gated with explicit acknowledgment. Every transition is durable, resumable, and capability-aware.

Six canonical strategies

Vadyl picks the strategy. You pick the change.

TransitionStrategy is selected from the migration shape × the provider's DbCapabilities. No automatic fallback to a weaker strategy — if no strategy is viable, the transition is rejected before any DDL runs.

MetadataOnly

No physical change. Pure platform metadata mutation — entity rename, label change, annotation update. Instant. Always reversible.

NativeOnline

Provider supports the operation online without locking. SQL Server with ONLINE = ON, PostgreSQL CONCURRENTLY, MySQL INSTANT — Vadyl emits the right syntax per provider.

ExpandThenBackfill

Add the new column nullable. Backfill with checkpoint-resumable batches — pick up where you left off after a crash. Then constrain in a separate transition once data is consistent.

CompatibilityWindow

Old shape and new shape coexist. Application reads and writes both. Window stays open until every consumer cuts over. Then contract.

ShadowCopyCutover

Build a shadow table with the new shape. Live-replicate writes. Atomic swap when caught up — sequential rename for ZeroDowntime tier, brief blocking for the BriefBlocking tier.

BlockingMaintenanceWindow

When nothing else is viable, fall back to a maintenance-gated blocking DDL. Always opt-in via TransitionExecutionOptions.AllowBlocking. Never silent.

The state machine

Eight states, durable. Crash-resumable.

Every transition is a row in the control plane. State transitions are deterministic. Backfill checkpoints are persisted. A crash mid-run resumes exactly where it stopped.

Created
Classified, not yet validated
Validated
Plan accepted, ready to execute
Executing
DDL running
BackfillPending
DDL done, backfill queued
BackfillRunning
Checkpoint-resumable batches
Completed
All phases done, locked
Failed
Halted, durable, inspectable
Cancelled
Operator-aborted, audited
Graph-level evolution

Coordinated evolution across many entities.

When one transition depends on another — relation cutover, FK retargeting, cross-entity backfill — the EvolutionGraphCoordinator drives the whole graph. Topological tier execution. Cross-entity barriers. Recovery on restart.

Topological execution tiers

Kahn-sorted across RelationDependency edges. Independent entities migrate in parallel. Dependent entities wait at barriers.

Fail-closed on unviable

If any entity in the graph has no viable strategy under its provider's caps, the whole graph plan is rejected. No partial optimistic start.

Cutover boundaries

Nodes past CuttingOver are irreversible by construction. Vadyl marks the boundary and refuses rollback through it.

Recovery on restart

EvolutionRecoveryService is a hosted service. Active phases on a crashed run are marked Failed; paused phases are left as-is for the operator to resume.

8
States

Deterministic, durable, crash-resumable

6
Strategies

Vadyl picks. No silent fallback.

Resumable
Backfills

Checkpoint per batch

Graph
Evolution

Multi-entity coordination

Stop dreading migrations.

Define the new shape. Vadyl classifies the change, picks the strategy, drives the state machine, checkpoints the backfill. You watch the progress, ship when it's green.