Product / Plugins 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 plugin Illustrative example
Change Summary Agent review
refund-order.md shop.refund_order customer="alex"
Customer balance $75.00 $100.00 $25.00 returned
Inventory 9 10 1 item returned
Snapshot delta Before After
order.statuspaid refunded
balance$75.00 $100.00
stock9 10
shop.expect_balance customer="alex" amount=100shop.expect_stock count=102 assertions passed
Build across your whole application. 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 invitations Illustrative example
Change Summary Agent review
Change Summary
Update invitation copy 1 changed screen team-invitation/settings/team
Before main Acme Workspace Invite a teammate Add someone to your workspace. Email address sam@acme.test Role Editor Send invitation After this change Acme Workspace 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 review Outside scope The role selector disappeared. This PR changes invitation copy. Owners still need to choose a role before sending an invitation.
team-invitation team-access.md
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 worker Illustrative example
fulfill-order.md LocalBash
worker.bash command= "./bin/fulfill order-1042" Your application command. Its result becomes a snapshot.
Before exit 0
stdout.txt order: 1042 status: dispatched tracking_number:TRK-1042
stderr.txt empty
After exit 0
stdout.txt order: 1042 status: dispatched tracking_number Missing from output
stderr.txt empty
≠ 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 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 check Illustrative example
Change Summary Agent review
verify-refund.md db: PostgreSQL
db.query sql="SELECT id, status, refunded FROM orders ORDER BY id"key="id" checkpoint="orders" orders / rows.json Earlier run Current run
id key status refunded 1041 paid 0.00 1042 → refunded 25.00 20.00 1043 paid 0.00
3 rows retained · amounts in USD
Retained before → after 1042
refunded25.00 → 20.00
Agent review · example refunds.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.
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-in Illustrative example
Flow execution Agent review
Named inbox signup
signup-7k3@example.test Same address across reruns, until reset.
Request a fresh code sign-in.md
capture before = inbox.cursor name="signup" click role=button name="Send code" New message after the cursor Matched
From noreply@example.test
Subject Sign-in code Your verification code is 831204 .
Captured variable code = "831204"
The browser uses the code to continue the sign-in journey.
fill label="Verification code" ${code}