Data-grounded test automation

The toast said Saved.The numberwas wrong.

A passing UI test proves the screen looked right. VerifyBeyond reconciles it against the row your database actually holds — inside the same test. Any divergence fails the run.Prove the data behind the screen.

Request access

Drag the dial on the panel

Fig.01 · Policy #4821 · DB checkpointreconciling
Database · policiessource of truth
IDSTATUSPREMIUM
4819active980.00
4821active1,248.00
4823lapsed1,510.00
frozen · read-only · row id = {{extract.policy_id}}
POLICY #4821valid
Policyholder
Plan
Premium1,284.00
✓ Saved
drag to x-ray
✕ mismatch screen 1,284.00 ≠ db 1,248.00
frozen queryno LLM at runtimekeyed to this run’s row
Read-only guard · SELECT-onlyPostgreSQL · MySQL · API / ODataOn-prem connector · reads onlyMCP verification · same guardScheduled data-correctness monitorsForensic capture · every stepSelf-healing · with vision fallbackRead-only guard · SELECT-onlyPostgreSQL · MySQL · API / ODataOn-prem connector · reads onlyMCP verification · same guardScheduled data-correctness monitorsForensic capture · every stepSelf-healing · with vision fallback
A green check that proves nothingRow never landed · premium is nullCredentials leaving the networkSelector drift → a hard fail200 OK · data still wrongAI-written code, unverifiedA green check that proves nothingRow never landed · premium is nullCredentials leaving the networkSelector drift → a hard fail200 OK · data still wrongAI-written code, unverified

The break

A green check proves the pixels.
Not the record.

A test that asserts on a toast proves the toast. The eight rows below are what that gap costs — and what closing it looks like.

The pixel verdict
click  Save
assert toast == "Saved"
✓ passed

Looks right. Proves nothing about the data.

The data verdict
click  Save
assert toast == "Saved"
db     policies WHERE id = {{extract.id}}
✕ row never landed — premium is null in db.policies

Same run. Now it tells the truth.

Everyone stops hereVerifyBeyond proves it
one test run
assertA UI assertion on a toast or a label
01
Reconciles the screen against the real DB/API row, grounded in the live schema
screen == db.policies row
authorHand-written selectors you maintain
02
Generates the whole test from plain English, then calibrates it against your live app
plain-English → calibrated test
healA renamed element fails the test
03
Self-healing relocates the element — with an optional vision fallback — and keeps running
relocated · run continues
triageA stack trace to debug by hand
04
Data-aware triage: the DB write failed — a real bug, not a flake — with evidence
root cause + evidence
seedManual fixtures for test data
05
Scenario-aware seeding writes the exact row the test needs (opt-in, isolated, auto-cleaned)
exact row · auto-cleaned
monitorUptime monitors in production
06
Scheduled runs reconcile data in prod and alert on screen-versus-database mismatches
screen-vs-db in prod
connectorOn-prem data can’t leave the network
07
A customer-hosted connector reads only; credentials never leave your network
reads only · stays in-network
mcpAI-written code goes unverified
08
A governed MCP server lets coding agents verify real data through the same read-only guard
agents verify via guard
reconciled

The data checkpoint

Author-time is agentic.
Runtime is frozen.

Inside one functional test, a DB checkpoint reads the real row your flow just created and compares it to the screen. The AI proposes the query; runtime executes a frozen, parameterized, read-only query with no model in the loop.

AI · author-time
introspect schema
→
propose query + mapping
→
dry-run
frozen
No LLM · runtime
execute frozen read-only query
D-01Which row+

A value extracted during the flow — the id of the record this run just created — becomes the row-identity key. The checkpoint verifies that exact row, not “a” row.

extract.policyId   →   WHERE id = {{extract.policyId}}
D-02Sources & transports+

SQL (PostgreSQL, MySQL) and API / OData, read either directly or through the customer-hosted connector.

Direct
Connector
SQL · PostgreSQL, MySQL
✓
✓
API · OData
✓
✓
D-03Eventual consistency+

When the write lands a beat after the click, the read-only check polls with backoff before it decides — so async and microservice backends don’t flake.

pollpollmatch +
D-04Schema drift+

Re-introspect and diff against the stored snapshot, so a dropped, renamed or retyped column a checkpoint depends on surfaces as a functional risk — not a silent runtime error.

policies.premium   numeric      kept
policies.status    text         renamed → state (−)
policies.agent_id  int → uuid   retyped (~)
D-05Never rewrites the answer+

Self-healing may relocate a drifted element. It will never rewrite an assertion’s expected value — the discipline that keeps the data verdict trustworthy.

D-06Opt-in · off by defaultWrite verification & seeding+

A separate, isolated writable identity — never the read credentials — can seed the exact scenario a test needs and verify the UI wrote the right values, then auto-tear-down.

writable identityseed rowauto-teardown

The connector · data residency

Your credentials never leave
your network.

The connector runs inside your network, holds the credentials locally, and dials outbound — nothing dials in. VerifyBeyond stores only a routing id, and every query is read-only by four independent layers.

Your network
DATABASEproduction
CONNECTOR🔒 credentials · held locally
VerifyBeyond
ROUTING ID+ enrollment identity — never the credentials
LayerWhat it enforcesIndependent
SELECT-only guardA single read-only SELECT; data-modifying and DDL verbs are rejected outright.✓ yes
Read-only roleThe database role itself has no write grants — it cannot write.✓ yes
default_transaction_read_onlyThe session cannot commit a write even if one were somehow issued.✓ yes
Statement timeout + row capNo long or unbounded query ever runs against production.✓ yes

Data-correctness monitoring

The same test, on a schedule,
against production.

The same test becomes a production monitor: scheduled runs execute the data checkpoints and alert on a screen-versus-database mismatch — not just uptime.

+
+
+
+
+
−
+
+
dailyweeklymonthly
✕Mismatch — screen shows 1,248.00, db.policies.premium holds 1,284.00
·Weekly run · production · emailed on failure, error and warning

Discovery & onboarding

Hand it a URL.
Get back the map.

Point VerifyBeyond at an application. It crawls it — authenticated logins included — describes every flow in plain English, correlates each flow’s real XHR/fetch calls to your schema, and proposes a read-only DB checkpoint per flow. Then it can generate runnable tests, checkpoints already inside.

#FlowData footprintProposed
01Sign insessions · refresh_tokens✓ checkpoint
02Create policypolicies · premiums✓ checkpoint
03Add beneficiarybeneficiaries · policies✓ checkpoint
04Process claimclaims · payouts · ledger✓ checkpoint

Authoring — the on-ramp

Describe the flow in English.
Run it pre-validated.

Describe the flow in plain English. VerifyBeyond drives the draft against your live app in a real browser before you ever run it, promotes the selector that actually worked, and demotes the guess to a fallback. You never run an untested test.

Draft · the AI’s guess

“log in as a sales rep and open the dashboard”

  1. Login field#login
  2. Navigationguessed route
  3. Dashboard loadfixed 3s wait
Calibrated · against your live app
  1. Login field#usernamefallback #loginresolved on the live DOM
  2. Navigationstate advanced — logged infallback guessed routereal app state advanced
  3. Dashboard loadwait → url '/dashboard'fallback fixed 3s waittiming gated on the real URL

Quality advisories

flaky test · degrading performance · fragile selectors · missing assertions · timing sensitivity · data dependency

each with severity · evidence · recommendation

AI test-data generation

valid · boundary · edge-case · user-type

covers every field; suggests which hardcoded values become parameterizable

Self-healing, with vision fallback

Relocates the element,
never the answer.

Self-healing is table stakes. The discipline is not: when a selector breaks at runtime VerifyBeyond sends a screenshot and the surrounding DOM to the AI, re-routes to a stable anchor, keeps the run going, and saves the fix — but it will never rewrite an assertion’s expected value.

Vision fallback · opt-in · cost-governed

When no selector can be found, an optional vision tier points at the element by sight on the screenshot. It is cost-governed and off unless enabled.

Reaches canvas, legacy and thick-client UIs where a stable selector may not exist.

Fig.02 · Self-healconnected
LEADS / NEWCOMPANYOWNERSTAGECANCELSAVE LEAD#btn-save
−selector: "#btn-save"
+

Verdicts you can trust

Every outcome carries a severity.

Every step outcome combines with a criticality to produce a run status — which is exactly what makes a fuzzy check safe to adopt.

soft
critical
pass
passed
passed
fail
passed_with_warnings
failed

Failure diagnosis

root cause
insert to policies did not commit
failing step
DB Validate · premium
suggested fix
check the save handler’s transaction
confidence
high
category
data_layer

The DB write failed — a real bug, not a flake.

AI Assert

For dynamic UI where an exact assertion is brittle, a step carries a natural-language criterion and an LLM judges the live page — wrapped in the severity model so a fuzzy verdict warns rather than breaks.

Natural-language criterion defaults to soft

“the confirmation clearly states the order was placed and shows an order number”

passfailuncertain

Execution engine

Seventeen action types,
real Chromium.

Tests run in real Chromium via Playwright — genuine clicks, form fills, navigation and network activity, not HTTP stubs. Three of the seventeen read or write your data.

Navigatego to a URL
Clickoverlay-aware fallback
Inputsecrets auto-masked
Selectchoose an option
Waittimed · selector · URL-gate
Assertcheck a condition
Scrollinto view
Uploada file to an input
Keyboardpress a key
Hoverreveal on hover
API Callwith auto-auth
Extractcapture a value for reuse
+DB Validatereconcile screen vs database
+AI AssertLLM-judge a criterion
+Opt-inDB Seedscoped write
Answer Allfill a whole questionnaire
Screenshotcapture the page
17 / 17

Assertions

targets visible · hidden · text · value · url · attribute · count

operators equals · contains · matches · greaterThan · lessThan

Templating

{{fieldName}} parameterized test data

{{credential.template.field}} encrypted stored credential

{{extract.key}} a value captured earlier — incl. a seeded row’s id

{{collab.key}} data passed from an earlier test

Forensic capture · every stepreplayable
before shotafter shotDOM snapshotnetworkconsole

Change detection

Every passing run
sets a baseline.

Later runs compare against it and flag screenshot and DOM drift — structure, content and attributes — each rated by severity. Built-in visual regression, no extra tooling.

baseline
current
  • lowScreenshotPixels changed in the header region
  • mediumDOM structureTwo elements added to the form
  • mediumDOM contentPrimary button label changed
  • lowDOM attributeClass renamed on the call-to-action

Collaborated workflows

Chain tests. Pass data forward.

Create a record in one test, verify it in another — the entity id threads between them. Choose what happens when a step fails.

Create policypassed
policyId = 4821
Verify policyfailed
stage = active
Update stagenot run

Signals vs proof

Scattered signals.
One reconciled record.

A run throws off a dozen loose signals — a toast, a row, an API call, a log line. On its own each proves nothing. VerifyBeyond reconciles them into a single record that says what actually happened to the data.

Before · scattered & unverified
toast: "Saved"UI · unverified
db.policies rownot checked
POST /api/policiesloose
run logdraft
screenshot.pngunfiled
Reconciled record · run #4821✓ proved
  • screen == db.policies row
  • premium 1,248.00 · matches
  • api 201 · row landed
  • evidence · immutable
scattered→reconciled→proved

Reports & the evidence trail

Ten report types.
One auditable trail.

Ten report types, each with an AI-written narrative, exportable to DOCX / XLSX / PDF with tokenized share links — plus a per-run evidence trail that records how every step was verified.

ReportWhat it answersExportShare
Execution SummaryPass/fail outcome of a runDOCX · XLSX · PDFtokenized link
Module CoverageWhich modules are testedDOCX · XLSX · PDFtokenized link
Environment HealthHow an environment is performingDOCX · XLSX · PDFtokenized link
ComparisonHow two runs differDOCX · XLSX · PDFtokenized link
Trend AnalysisResults over timeDOCX · XLSX · PDFtokenized link
Collaborated SetOutcome of a chained workflowDOCX · XLSX · PDFtokenized link
Self-Healing EffectivenessHow often healing fires and holdsDOCX · XLSX · PDFtokenized link
Test HealthFlakiness, duration and reliabilityDOCX · XLSX · PDFtokenized link
Failure Root-CauseWhy runs fail, categorizedDOCX · XLSX · PDFtokenized link
DB ReconciliationScreen-versus-database outcomes, per fieldDOCX · XLSX · PDFtokenized link

Verify AI-written code

A coding agent that can
check its own data.

A standalone MCP server lets a coding agent verify real data while it writes code, through the same read-only guard as the product.

A standalone MCP server lets a coding agent — Claude Code, Cursor — verify real data while it writes code. It holds only a scoped, read-only API key; every check runs through the same read-only guard as the product, and for on-prem sources it is answered inside the customer network by the connector.

Governed verification loop

  1. coding agentdiscovers sources · reads schema · runs a check
  2. MCP serverscoped, read-only API key
  3. read-only guardthe same guard as the product
  4. your datadirect — or in-network via the connector
✓ verifiedthe value matches the screen

Scale & structure

Organized from the app
down to a single step.

A clean hierarchy, multi-tenant by design, with environments and named data sets at every level.

Applicationenvironments — URL + encrypted credentials, one-click Test Connection
Productgroups related modules
Modulea testable area of the app
Test Caseclone · run against any environment · test data & data sets (CSV in/out)
Stepsordered actions — 17 action types, templating, assertions

Trust & governance

Security and transparency
are the foundation.

Built for teams that answer to auditors — isolation, access control, and a complete trail, stated as guarantees rather than badges.

Multi-tenancy

Full isolation via PostgreSQL row-level security, on a non-superuser app role

Access control

Four roles — Admin, Manager, Tester, Viewer — enforced on API and UI

Encrypted credentials

At rest, with automatic masking as •••••• — never written to logs

Audit log

A full, immutable trail of tenant activity

Rate limiting

Per-tenant AI limits with complete token and usage accounting

Platform administration

Tenant management with suspend enforcement

Real-time updates

Runs and results stream live over WebSockets

Under the hood

Colophon.

AI engine
Anthropic Claude
Browser
Playwright / Chromium
Data adapters
PostgreSQL · MySQL · API/OData
Transports
Direct · customer-hosted connector
MCP server
Standalone service
Web
React + Vite
API
Node.js + Express
Workers
BullMQ on Redis
Database
PostgreSQL (row-level security)
Realtime
Socket.IO
Deployment
Docker · cloud-hosted

How it works

From a sentence
to proof.

Ten steps, end to end. Watch it — or click through — from a line of plain English to a record you can hand an auditor.

app.example.com
/login/dashboard/policies/policies/new/claims
Crawls the app, describes each flow, maps its data footprint.

“create a policy for a new client and confirm the premium saved”

→ open /policies/new→ fill client · premium→ click Save · assert toast
Plain English becomes a structured, credential-aware test.
#login→#username✓
guessed route→state: logged-in✓
fixed 3s wait→url '/dashboard'✓
Every guess resolved against the live DOM — nothing left to chance.
policies.premium numericpolicies.status textpolicies.client_id uuid
DB checkpoint · SELECT premium FROM policies WHERE id = {{extract.id}}
Read-only checkpoints proposed straight from the real schema.
✓ calibrated against the live app✓ data checkpoint · read-only✓ credentials · from the vault
Activate testLIVE
Approve the test and its checks — it’s ready to run.
running · real Chromium
✓ open /policies/new✓ fill client · premium✓ click Save● assert + reconcile…
Runs in a real browser; every step streams in with forensic capture.
On screenpremium 1,248.00
==
db.policies row1,248.00
✓ proved screen reconciled against the real record · run #4821
The whole point: the screen is checked against the row your database actually holds.
SAVE LEAD ✕ renamed
#btn-save→[data-testid='submit']
SUBMIT ✓ relocated
A drifted element is relocated — the run keeps going, the fix is saved.
daily · 06:00 · production
✕ mismatch — premium 1,284.00 ≠ db 1,248.00emailed
The same test, on a schedule — alerting on screen-versus-database drift.
PDFDOCXXLSXshare link✓ auditable evidence trail
An AI-narrated report and an immutable trail you can hand an auditor.
01/10

From a sentence to a test that proves the data.

No trial, no credit card, no sign-up — a conversation, and access when you’re ready.

Request access