Every surface you touch, from first click to filed bug.
Map a flow, it becomes code, the code runs, failures become bugs.
Mapping sessions
- Drive it by hand — click, drag, type — each step lands on the timeline with a screenshot. Reorder, remove, then save as a named flow.
- Or type a goal, like
Go to {site} and sign in with {email}/{password}— the operator drives it via OCR, stamped withdecided_byand cost. Credentials fill in at run time, never stored in the flow.
Flows
Every saved session becomes a flow — name, site, steps, status. Replay it, send it to Automate, or run its test.
| Flow | Site | Steps | Test code | Last run |
|---|---|---|---|---|
| Sign in with email + password Go to {site} and sign in with {email}/{password} | app.example.com | 7 | generated | passed |
| Add item to cart and checkout | shop.example.com | 12 | generated | failed |
Illustrative — not a customer flow.
Automate job
Flow: Sign in with email + password
Status: running → done
File: src/sign-in-with-email-password.spec.js
Assertions by: deepseek/deepseek-chat
Automate jobs
An Automate job turns a flow into real Playwright test code — navigation, fills, clicks, assertions — with the proposing model recorded on the job. It opens in the IDE to read, edit, or hand to chat.
IDE
A file tree and code editor next to the chat agent. Generated tests are ordinary .spec.js files — open, edit, save, nothing locked behind the UI.
- "Run this test" executes the open file, like a flow's Run test button.
- Ask the agent to explain, fix the last failure, or iterate until it passes.
test('sign in with email + password', async ({ page }) => {
await page.goto(env.baseUrl);
await page.getByLabel('Email').fill(params.email);
await page.getByLabel('Password').fill(params.password);
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByText('Welcome back')).toBeVisible();
});
Runs
A run records status, duration, and error, plus a screenshot and trace to scrub through — not just a red dot.
| Run | Flow | Env | Status | Duration | Error |
|---|---|---|---|---|---|
| run_2f81 | Sign in with email + password | staging | passed | 4s | — |
| run_2f82 | Add item to cart and checkout | staging | failed | 9s | Timeout waiting for "Order confirmed" |
Illustrative. Runs report three states, not two — see why UNMEASURED exists.
Bugs
A failed run auto-files a bug — title, flow, environment, error, link to screenshot and trace. Triage starts from evidence, not a report to reproduce.
Checkout: "Order confirmed" not visible
run_2f82 · staging · open
Timeout waiting for "Order confirmed" — 30000ms exceeded.
Maintenance
Every flow whose last run failed shows up here, linked to its test. Empty list means everything passed.
1 flow needs maintenance — last run failed:
- Add item to cart and checkout — open test
Environments
Pick a named environment — staging, prod, or custom — from a dropdown next to every "Run test" action. Base URLs and parameters live here, so the same flow runs anywhere.
A running total, not a mystery invoice.
Every screen shows spend and model — the same number the product header keeps live. Calls are logged, not estimated after the fact.
Illustrative — cost accrues per model call.