Inspiration

A green build for a new application does not answer the question I care about before a database release: will the previous application still work after the schema changes? Old and new instances can coexist during a rolling release. If the application is rolled back, old code meets a database the new code may already have written. Rehearsal makes that path back inspectable before a person accepts a migration. This is my design motivation, not a claim that I experienced a production outage.

Try it in one minute

Open the public browser demo. Keep Breaking rename selected and press Run rehearsal. Open Inspect the failed first attempt: the new adapter passes, but the previous adapter cannot read or write the renamed column, and the application rollback check fails. The dashboard then selects a known bundled repair fixture and verifies the compatible shape at 12/12. Download the JSON receipt to inspect each check. This fixed browser scenario is separate from the recorded GitLab Duo repair.

What it does

Rehearsal executes a proposed SQL migration against a fresh, disposable SQLite database with fictional customers. It tests two versioned SQL adapters before and after migration, including writes by one version that the other must read. It then reverts the application to the previous adapter on the migrated database; it does not run a down migration.

The original candidate renamed customers.name to display_name. Its new-version path passed, while five old-version, cross-version and rollback checks failed: 7 pass / 5 fail. The repaired candidate retained name, added and backfilled display_name, and used three synchronization triggers while both adapters coexist. The unchanged candidate contract then passed 12/12. A separate prohibited-change scenario demonstrates the policy block.

How I built and verified it

The evaluator and browser service use Python's standard library and SQLite. GitLab CI validates configuration, runs 21 unit and HTTP tests, executes the fixed scenarios, checks the candidate contract, and packages source only after the required jobs pass.

The original GitLab pipeline preserves the red candidate gate and blocked package job. GitLab Duo Agent Platform's foundational developer/v1 Developer Flow investigated that failure. Its public workload job records a successful run; the full native session and workload trace may require GitLab access. The trace shows it reading a prewritten safe expansion example, changing fixtures/candidate.sql, pushing the repair branch and opening MR !2. This was a reference-assisted repair, not a blind invention or an execution of my prepared custom YAML.

The pinned base-to-repair comparison changes one SQL file. The evaluator, tests and CI configuration were not weakened in that repair. The independent repair pipeline passed all five jobs and reported 12/12 contract checks. A person controlled integration; MRs !1–!3 later merged into the public MIT-licensed Showcase source. Passing CI alone was not human approval.

What I learned and what comes next

The key lesson is to test the old adapter after the new one writes, not just whether the new app reads migrated rows. The preserved red result, exact one-file diff and green CI make the repair reviewable. The 2:11 public video opens with a continuous real browser run, then shows the separate Duo and CI evidence. The refined Render demo is deployed from merged Showcase main.

This is Path B / Bring Your Own: Supervised. The original MIT repository preserves the pre-repair baseline; Showcase contains the later automation evidence and merged repair. The demo uses sequential adapters and synthetic SQLite rows. It does not establish concurrent-client behavior, PostgreSQL safety, production traffic, database restoration or a custom Duo flow. No production migration is claimed. Earlier source/import/repair commits lack recognized DCO sign-off trailers in GitLab; I do not claim project-wide DCO compliance while that record remains unresolved.

Built With

Share this project:

Updates

Submission history