Agents plan the migration, rewrite every file, and run the suite until it passes. You approve once, at the end.
Selenium Python · Selenium Java · Cypress JavaScript

Old suites carry the same debt. Hard-coded sleep() calls that trade minutes for flake. XPath chains that shatter on any DOM change. Polling waits over race conditions. The suite is load-bearing, so nobody touches it.
Rewriting it by hand takes weeks. It is a thousand small judgment calls: rote for a person, routine for an agent.
Shiftwright does the rewrite and shows its reasoning as it works. Every failure is diagnosed on screen, from the pixels and the DOM.
Work moves agent to agent as a token you can watch. The sandbox and the knowledge base sit under every step.
ADK SequentialAgent · all four on gemini-3.5-flash over Vertex AI, the Diagnoser multimodal
Isolated sandbox driven over JSON-RPC — never your machine, never your branches. Every call carries an ID token.
What one test learns, every later test reuses — the reason healing effort trends down across a run. Verified repairs also persist to Vertex AI Memory Bank, so the next repository starts with what earlier ones worked out.
When a rewritten test fails, the Diagnoser reads the screenshot and the DOM at that instant. It names the root cause and patches the locator. You watch the model read the page.

Every verified locator, healing recipe and flake fix lands in a shared knowledge base. Later tests reuse it and pass first try, and the repairs carry to the next repository. The dashboard plots the trend.
The Planner takes the easy files first: fixtures, then leaf pages, then journeys. The knowledge base is rich by the time the hard tests run. 15 files, 2 sleeps and 1 raw XPath gone in the reference run.
Agents never push to your branches. The run pauses once, on a diff and the metrics. Approve, and a pull request opens from a bot branch.
The scanner picks the stack from what the repository holds. Every card links to the run its numbers came from.
All three are forks of public MIT suites, cloned read-only. Point it at your own repository and it runs the same way, opening its pull request wherever you control the repo. Speedups pair only tests that passed under both runners; each run record has the per-test timings.