A testing language
built for your application.

Plugins let you name application actions, such as shop.refund_order, and use them in a flow. Your agent can call the command without reading its implementation each time.

One command for
a business action.

Your agent defines commands, snapshots and comparisons in a plugin. A flow can then say “refund this order and check the balance” without repeating the browser steps, SQL and worker checks behind that action.

Each plugin defines which evidence it keeps and how to compare results. The agent can inspect a changed balance or missing entitlement alongside the code change.

Build your testing language
reflow / Custom Commerce pluginIllustrative example
refund-order.mdshop.refund_order customer="alex"
Customer balance$75.00$100.00$25.00 returned
Inventory9101 item returned
Snapshot deltaBeforeAfter
order.statuspaidrefunded
balance$75.00$100.00
stock910
shop.expect_balance customer="alex" amount=100shop.expect_stock count=102 assertions passed

Build across your whole application.

Browser

Run a user journey, capture the screen and compare it with an earlier snapshot. Your agent can check the visible difference against the change you intended.

See Browser in a flow
reflow / Team invitationsIllustrative example
Change Summary

Update invitation copy

1 changed screen
invite-memberPassed
team-invitation/settings/team
Beforemain
AcmeWorkspace Invite a teammate Add someone to your workspace. Email address sam@acme.test RoleEditor Send invitation
Afterthis change
AcmeWorkspace Invite a teammate Add someone to your workspace. Email address sam@acme.test Role selector removed Send invitation
The test passed. The screen changed.site.snapshot
Agent reviewOutside scope

The role selector disappeared.

This PR changes invitation copy. Owners still need to choose a role before sending an invitation.

team-invitationteam-access.md

Bash

Run your application’s own commands and keep their output for comparison. An exit code tells you the command finished; its result tells you what happened.

See Bash in a flow
Bash · fulfillment workerIllustrative example
fulfill-order.mdLocalBash
worker.bash
command="./bin/fulfill order-1042"

Your application command. Its result becomes a snapshot.

Beforeexit 0
stdout.txt order: 1042 status: dispatched tracking_number:
TRK-1042
stderr.txtempty
Afterexit 0
stdout.txt order: 1042 status: dispatched
tracking_numberMissing from output
stderr.txtempty
State and evidence changed
Exit code
0 → 0
Standard output
Changed

Both commands succeeded. The saved output differs.

Agent’s review note

“The worker still reports ‘dispatched’, but no longer returns a tracking number. Can the shipment notification still include a tracking link?”

Evidence: before + after / stdout.txt

SQL

Save query results as snapshots and compare them across runs. Your agent can inspect a changed balance or order status alongside the browser journey.

See SQL in a flow
reflow / PostgreSQL · refund checkIllustrative example
verify-refund.mddb: PostgreSQL
db.query sql="SELECT id, status, refunded
FROM orders ORDER BY id"
key="id" checkpoint="orders"
orders / rows.jsonEarlier runCurrent run
id keystatusrefunded
1041paid0.00
1042refunded25.0020.00
1043paid0.00
3 rows retained · amounts in USD
Retained before → after1042
refunded25.0020.00
Agent review · examplerefunds.md

Full refunds return the entire $25.00 payment.

The order says refunded. $5.00 is missing. The captured rows show $20.00 returned. Check the refund amount before merging.

Mailbox

Test signups, email codes and magic links with a remote inbox. Capture the address, code or link as a flow variable and continue the journey in the browser.

See Mailbox in a flow
reflow / Mailbox · email sign-inIllustrative example
Request a fresh codesign-in.md
capture before = inbox.cursor name="signup"
click role=button name="Send code"
New message after the cursorMatched
From
noreply@example.test
Subject
Sign-in code

Your verification code is 831204.

Captured variablecode = "831204"

The browser uses the code to continue the sign-in journey.

fill label="Verification code" ${code}

Keep the results
with the change.

Review evidence deltas