The Upgrade App Selenium Playwright Manual → AI Start a sprint →
CI · today ~10% of suite TestRail rows Cypress 2019 Selenium scripts BDD .features Wiki test plans Playwright POC Manual steps · PDFs VISIBLE 10% · AUTOMATED LIFT · SUBMERGED 90%
Reactivate your locked-up test IP

Your test suite is millions in pre-AI IP. Locked up — too costly to run, too brittle to maintain. Reactivated in a sprint.

Most QA orgs sit on thousands of test cases written by senior engineers over years — TestRail rows capturing learned edge cases, Selenium scripts encoding business knowledge, a half-finished Playwright suite, Cucumber .feature files, wiki pages of "click this, then this." Millions of dollars of accumulated IP. The Upgrade App is a fixed-price sprint that reactivates the highest-value portion of that IP — gets it running against your real site with our migration tools doing the heavy lifting, and tells you honestly which cases can't be automated. Every artifact we generate is yours to keep and modify — converted code, CI config, runnable specs, reports, the lot.

The problem

Every QA org has test debt — the folder of test cases nobody can run anymore but nobody is willing to delete. The manual "login then verify the cart" steps from 2019. The Selenium suite from when Python 2 was still a thing. The Playwright tests that depend on a CI image that was retired. The Cucumber features the BA wrote with the developer who left.

The cost of porting them by hand is what keeps the debt on the books. A senior automation engineer at fully-loaded $125/hour rewrites about 25 cases a day. The high-priority subset of a typical team's backlog is months of work at that rate. Most teams won't pay that bill; they'll keep the stuck tests, run a subset of new ones, and hope.

The Upgrade App is the alternative — a fixed-price sprint that targets the quickest wins in your backlog, converts them using the migration tools we've built (doing the mechanical work ~10× faster than rewriting by hand), runs each one against your real site, and hands back a runnable subset plus a prioritized triage list for the rest. Not every case ships in 30 days — but the ones that matter most do.

What this test debt actually is
Worth saying out loud: this test debt is millions of dollars of IP your team has built. Senior engineers wrote those tests pre-AI, baking in business knowledge, edge cases, and learned patterns it took years of incidents to discover. The reason it became "debt" isn't that the tests were wrong — it's that the cost to execute them, fix them when they broke, and analyze the results outpaced the perceived benefit. So they got shelved. The sprint reclaims that IP. You're not paying us to write new tests — you're paying us to reactivate the ones you already paid millions to create.

"Pick the tests worth running. Ship them in 30 days."

The model

How it works

Four stages in a line. Each one has a clear job; each can be inspected and re-run independently.

Import
TestRail · Xray · CSV · XML · BDD · markdown · test code in any language
Convert
Whatever shape came in, lifted to one common runnable format
Run
Each case executed against your real site, with auto-repair for broken selectors
Triage
Pass · Fail · Auto-Fixed · Needs human input — with a clarifying question for each one
The Upgrade App conversion workspace — file upload, format selectors, and converted-test preview
The conversion toolchain · workspace view

The middle stage — convert — is what makes this work. Every input format flattens to one common shape. Every output target reads from that same shape. Adding a new input language or a new output target is a small change, not a rewrite. That's the architectural bet: keep the complexity at the edges, keep the middle simple.

The run stage is where the surprises live. A converted test will sometimes reference a selector that doesn't quite match your real page — fields move, labels change, banners appear that weren't there when the test was written. The auto-repair loop catches the failure, takes a screenshot, figures out what was actually meant, and retries. About a quarter of otherwise-failing steps recover this way without any human intervention.

What's honest about it
Some test cases simply can't be automated. "Phone the support agent to verify escalation." "Wait for the marketing team to push the offer." The Upgrade App marks those clearly and asks a one-line clarifying question — instead of silently force-passing them with a mock the way most testing tools do.

What we support

The polyglot promise: anything reasonable as input, any common framework as output. If your tests are already in one of these, you don't have to translate before the sprint starts.

Inputs we accept

  • TestRail rows · CSV / XML / JSON exports
  • Xray exports · JSON
  • Manual steps · plain text · markdown
  • BDD / Gherkin · .feature
  • Selenium · Python · Java · JavaScript · C#
  • Playwright · TypeScript · Python
  • Cypress · JavaScript · TypeScript

Outputs we generate

  • Playwright · TypeScript · Python · Java · C#
  • Selenium · Java · Python · C# · JavaScript · Ruby
  • BDD / Gherkin · .feature with step defs in your framework
  • Cypress · TypeScript · JavaScript
  • Plain runnable JSON · for our own AI runner
  • Any other framework or language · ask · we add it during the sprint
  • Side-by-side report · per-case verdict + screenshots
  • Triage list · cases that need human input

Most teams pick the framework they already have in CI so the converted suite drops straight in. Teams that want to migrate frameworks at the same time pick the new one and use the sprint as the cutover.

Where AI ends and your team starts

AI converts the test logic easily — the navigation, the assertions, the data flow, the order of operations. The shape of the test is preserved across languages because the shape was never language-specific to begin with.

Where it stops being easy is when the conversion spans languages or hits your internal utilities. A Selenium-Python test that pulls in a custom helper from your team's shared library, a Playwright spec that wires into a TypeScript page-object pattern your team built, calls into helpers/auth.ts / fixtures/db_seed.py / cypress/support/commands.js that live in your repo — those framework-specific calls, library imports, and internal utility wrappers often need a manual pass after the sprint. Sometimes a one-line tweak. Sometimes a small refactor of an internal helper. Either way, it's work your team does faster than anyone external — they have the source, the build, and the environment.

This is by design, not a limitation. The sprint hands you converted runnable code and a triage list of the cross-language adjustments worth looking at — short, targeted, easy to walk through in a morning. Nothing is hidden; nothing is silently rewritten in a way you'd struggle to review.

Why we don't try to auto-do the last mile
Library-specific code (your team's helpers, your CI's environment, your project-internal page-objects) lives in your repo for a reason. The team that owns it can adjust it confidently in minutes. The team that doesn't own it (us) would take hours guessing — and might guess wrong. That said, we don't disappear at the line — the sprint includes paired work with your team on the translation + wrapper bits that need shared context. We don't auto-do it; we collaborate on it. The sprint draws the right line and helps you cross it.

What the AI flags as missing

Test code and manual cases describe the happy path. They rarely describe what the page actually looks like, what the data flow assumes, or what state the user is in. The AI runs into those gaps constantly and is built to ask, not to guess.

Before the sprint runs the tests — during conversion — the AI flags ambiguities it can't resolve from the source alone. A Selenium test that calls helpers.login(user) without showing the helper's signature, a manual case that says "verify the dashboard shows today's orders" without saying what "today's" means in this timezone, a Cypress spec that references cy.fixture('customer.json') with a fixture that wasn't in the upload — all flagged as questions for your team, not silently guessed.

During the burn-in — when the converted test runs against your real site — the AI catches a different class of gap. A selector misses because a button moved, but the test description doesn't tell the AI what to look for instead. A login flow needs an MFA code that's not in the test data. An assertion looks for "the success banner" but two banners are visible. Each one becomes a clarifying question with a screenshot of the page state and a one-line ask.

These questions are the most valuable artifact of the sprint after the runnable suite itself. They surface gaps in your test code, your manual cases, and your documentation that nobody noticed because a human tester would just figure it out and move on. Now they're written down. Your team answers each one in a sentence, the suite re-burns, and the documentation gets better as a side effect.

Connect to what you have

Tests live in lots of places. We connect to the ones you already use, and we run against environments your public internet can't reach.

TR

TestRail import

Connect with an API key and pull cases by project, suite, or section. Cases come in with their steps, expected results, and metadata intact.

Xr

Xray import

Direct connect to Xray (Cloud or Server) for Jira-hosted tests. Includes the same metadata mapping as TestRail so the downstream report still cross-references your tickets.

File upload

Drop a folder. We accept Selenium / Playwright / Cypress source, BDD .feature files, plain markdown test plans, CSV / XML / JSON exports — almost any test case definition we've seen lives in one of those shapes.

Reverse-proxy connection

For staging or internal sites behind a firewall, we stand up a one-way reverse proxy that lets the test runner reach your environment without us touching your network. You configure once, run the sprint, tear it down. No VPN, no shared credentials.

If you have something that looks like a test case definition and it isn't on this list, send a sample — odds are it already imports cleanly, and if it doesn't we'll add it. The polyglot importer was designed to accept almost anything that describes a test in a structured way.

$10K
Fixed-price sprint
30 days
From kickoff to delivery
~10×
Faster than hand-rolling
Far less
Ongoing maintenance cost

Beyond the test conversion

Test migration is the headline of the sprint, but it's not the only thing the sprint delivers. The AI-driven assessment runs alongside the conversion — broader coverage, more recommendations, and an overall AI-strategy read for your QA practice.

What runs alongside the conversion

More coverage than test migration alone
You hire the sprint for the test conversion. You also walk out with a benchmarked quality assessment, an issue list across dimensions your old tests never looked at, and a written AI-strategy recommendation for what to do next. The conversion gets your suite running; the assessment shapes what to test for in the next twelve months.

The ROI math

Three buckets, not one. The sprint pays for itself on the conversion alone — but the maintenance and execution-time savings over the suite's life are typically larger.

Bucket 1 — Conversion savings (one-time)

A senior automation engineer at $125/hour fully-loaded rewrites about 25 cases a day. The high-priority subset of a typical backlog is roughly $10,000 of hand-work for one engineer over a month if that's all they do (in practice it stretches to 6–8 weeks). The sprint matches the cost, beats the wall-clock, and leaves you with the toolchain warm for the long tail.

Bucket 2 — Maintenance savings (annual, compounding)

Classic Selenium and Playwright suites cost ~$9,000/year per ~100-case suite just to keep green — selectors rot as the page changes, new browser versions break old waits, deprecated APIs need swapping. Modernized output from the sprint cuts that materially (cleaner locators, autowait, role-based selectors). AI-first execution cuts it further still — the runner adapts to drift rather than failing on it. Conservatively a 40–70% drop in test-maintenance cost over three years, depending on which output target you land on.

Bucket 3 — Manual execution savings (per release, compounding)

The biggest hidden cost is the time spent running tests by hand before each release. A typical 100-case smoke pass is 30–60 minutes per case for a manual tester if you include setup, teardown, and writing up the result — call it 40 minutes average. At $75/hour for a manual tester, that's $3,000–$5,000 per full pass. Monthly releases = ~$45,000/year on manual execution alone. Automated execution is essentially free per run.

Three-year picture for a typical team

$10,000 sprint · ~$15,000 saved in conversion vs hand-rolling · ~$20,000 saved in maintenance vs classic suites · ~$120,000 saved in manual execution vs running by hand monthly. The conversion is the visible payoff. The execution + maintenance savings are where the real money is.

Every artifact ships to you
The converted code · every CI config (GitHub Actions / Jenkins / Azure / CircleCI) · runnable specs in your framework · every per-case verdict, screenshot, and trace · the triage list · the benchmarked quality assessment · the AI-strategy write-up. All yours. Check it into your repo, modify it, run it long after the sprint ends. No vendor lock-in, no "subscription required to keep using it."
What you actually get
~100 high-value cases running in 30 days · multiple senior QA people running the engagement (not a self-serve dashboard) · our migration tools doing the mechanical work ~10× faster than hand-rolling · honest triage of cases that can't be automated, so nothing is silently force-passed · a runnable subset you can check into the CI you already have · a prioritized backlog for the rest · a benchmarked quality assessment + AI-strategy recommendation as a bonus deliverable.

If your stack is one of these

The general sprint covers any mix. Three sibling articles go deeper on the specific flows our customers ask about most.

Ready to pay down the test debt?

A 30-minute scoping call covers what's in your backlog, where you'd want the output to land, and whether the sprint fits this quarter.

Book a scoping call →