Skip to content
Staging URL in. Recorded Bugs out.

Know what broke.
Watch it break.

QAgents writes your Test Cases, runs them in a real browser and files every Bug with the recording.

A QAgents Run: the Test Case opens the shop, searches for mugs and adds Trail Mug to the cart. The cart badge shows 2 where the Test Case expects 1, on all 3 Attempts, so QAgents files a Bug with the recording attached.
Run #128
How it works

From a staging URL to your first Bug

  1. 1

    Connect your staging app

    Its URL and a test account. Add your specs or connect the repo if you have them; the Planner reads both.

    Environment
    staging.acme-shop.test
    Test account
    ada@acme.test · ••••••••
  2. 2

    Approve the Suite outline

    The Planner explores the live app and proposes Test Cases as Given / When / Check. You approve the outline; it writes the code.

    • Search finds a product by name
    • Adding a product updates the cart
    • Checkout rejects an expired card
    Approve 3 Test Cases
  3. 3

    Every Run, triaged

    Each Test Case gets a fresh browser and up to 3 Attempts. Every failure is judged before it reaches you.

    19 passed · 3 triaged

    • BugFiled, with the recording
    • Stale StepRepair waiting for you
    • FlakeRecorded, not filed
Evidence

Every failure comes with proof

After every Step: a screenshot and an accessibility snapshot. Around them: the Step log with the element the Executor chose, the session recording and the network log. Open the Bug and watch it happen.

Verdicts

A failure is not a Bug until it’s judged

Every failure gets up to 3 Attempts. Then it gets one of four Verdicts, and each one does something different.

Bug

Your app is wrong.

Filed with the steps to reproduce, expected vs actual, and the recording. Seen again, it's added to the same Bug. Fixed, it closes itself.

Stale Step

Your app changed on purpose.

QAgents proposes a Repair to the Test Case and proves it with a passing re-run. It's applied when you accept it.

Flake

It failed, then passed on a retry.

Recorded, not filed. A Test Case that flakes in 2 of its last 5 Runs is marked Flaky, so you can deal with it.

Environment

Your staging was down.

Not blamed on your app. After three of these in one Run, the rest of the Run is Blocked instead of piling up failures.

RepairCheckout button was renamed
−await act("click Checkout")
+await act("click Continue to payment")
await expect(page).toHaveURL(/pay/)

Verified by a passing re-run

No Expectation changed

Accept RepairReject

Nothing edits an Expectation without you. A Repair that touches an expect line waits for a Member to accept it, flagged Changes an Expectation.

Test Cases

Code asserts.
AI acts.

Every Test Case is a short TypeScript file you can read, edit and review. The model only chooses what to click; whether your app is right is plain Playwright.

act

The Executor picks the element

A renamed button doesn’t break the test. It reports its choice and a confidence, and warns you with Drift when it changes.

expect

Assertions stay deterministic

Playwright’s own expect. No model decides whether your cart shows 1.

%pw%

Credentials stay out of the prompt

Variables are filled in at action time. The Executor chooses where a value goes, never what it is.

cart/add-to-cart.tsTypeScript
1import { expect } from "@qa-hub/test"
2
3export default async ({ page, act, credential }) => {
4 const cart = page.locator("#cart-count")
5 await page.goto("/login")
6 await act("log in with %email%
and %pw%"
, {
7 variables: {
8 email: credential("ada", "username"),
9 pw: credential("ada", "password"),
10 },
11 })
12 await page.goto("/products")
13 await act("search for mugs")
14 await act("add Trail Mug to cart")
15 await expect(cart)
16 .toHaveText("1")
17}

Give it your staging URL

Add a test account, approve the Suite outline, and read your first Run’s Verdicts. No test code to write first.

Start testing your app
Run #122 Test Cases
  • BugCart badge shows 2, expected 1Filed with the recording
  • Stale StepCheckout button was renamedRepair verified, waiting for you
  • FlakeSearch results loaded latePassed on Attempt 2 · not filed

19 passed · 3 triaged