Build the safeguards
Eight explained steps, a source example and a checkpoint at each decision.
Read the tutorialDelivery / Database migrations / Infrastructure as code
Follow Safe Rollout Lab from its visible failure to a testable implementation. Each step names one decision and a checkpoint.
Step 1 of 8
The old client reads full_name; the new client reads display_name. Background jobs, exports and integrations can also be consumers. A migration plan should name those consumers and their compatibility requirements, not merely describe the desired final schema.
v1 -> full_name
v2 -> display_nameCheckpoint: Identify why deploying version two does not immediately remove version one.
Step 2 of 8
A direct rename is syntactically valid and immediately removes the old field name. The old client then fails even if its application binary has not changed. The lab runs that query and displays the actual database error rather than merely predicting it.
ALTER TABLE profiles RENAME COLUMN full_name TO display_name;Checkpoint: Find the first mixed-version read that returns 500.
Step 3 of 8
Add the new field while keeping the old one. This gives new code somewhere to read without breaking existing consumers. The right production DDL strategy also depends on locking, table size, defaults and the database version; this tiny table demonstrates compatibility only.
ALTER TABLE profiles ADD COLUMN display_name text;Checkpoint: Verify that version one can still read immediately after expansion.
Step 4 of 8
Copy existing values, then maintain both representations during the transition. A one-time backfill is insufficient if an old writer continues changing only the old field. This exercise’s compatible writer sets both fields; the extension challenge deliberately introduces an old writer.
UPDATE profiles SET display_name=full_name;
UPDATE profiles SET full_name=$1,display_name=$1 WHERE id=$2;Checkpoint: Explain how a post-backfill old write could make the new value stale.
Step 5 of 8
The readiness preset marks the canary unready. The browser models the traffic decision, while its data reads remain real. A production readiness probe must reflect the dependencies required to serve safely; a process merely listening on a port may not be sufficient.
if (!canaryReady) keepTrafficOnVersionOne();Checkpoint: Distinguish the modeled readiness result from an executed SQL result.
Step 6 of 8
The local exercise starts a real loopback HTTP service, switches its query to version two, then switches back after an injected readiness failure. It retains the expanded schema. Reverting an application does not automatically undo a migration or restore removed data.
activeVersion = 1; // retain the expanded schemaCheckpoint: Run the local exercise and inspect the successful post-rollback response.
Step 7 of 8
The old field may be removed only after old readers and writers are gone and backfill is complete. The gate explicitly checks all three. Production evidence may come from deployment inventory, job configuration and observability; the browser’s consumer count is a reviewed fixture.
oldReaders === 0 && oldWriters === 0 && backfillRemaining === 0Checkpoint: Run early contraction and verify that the safe path keeps the old field.
Step 8 of 8
The download’s Terraform exercise uses a built-in local resource and no cloud provider. Its precondition blocks an incompatible contract plan. Planning can review declared changes, but it cannot establish request success, backup restoration or safe DDL at production scale. Keep those checks in the release process.
terraform init -backend=false
terraform plan
terraform testCheckpoint: State what the local plan gate proves and what the HTTP and database checks add.
Use the experiment as an example. State the failure, explain the chosen boundary, show the test and name the tradeoff. Keep measured results separate from production assumptions.
Verantos emphasizes incremental infrastructure changes, trusted CI/CD and explicit validation and rollback plans.
Eight explained steps, a source example and a checkpoint at each decision.
Read the tutorialUnderstand where each pattern helps and which tradeoffs remain.
Compare approachesDownload the independent environment, run the native checks and try a specific extension.
Open the how-to guide