OmevraOmevra Run it live

Omevra · Product two

web-agent

An autonomous agent that operates web interfaces end to end — observe, act, verify, recover — measured with an ablation, not adjectives.

36/36Tasks passed with recovery on — the full evaluation set (95% CI 90.3–100%)
27/36Tasks passed with recovery off — the ablation control (95% CI 57.8–87.9%)
9/9 vs 0/9Adversarial tasks passed, recovery on vs off (95% CI 66.4–100% vs 0–33.6%)
27/27Control tasks passed both ways, recovery on and off

Results

The same agent, the same 36 tasks, run twice: once with the recovery half of its loop switched on, once with it switched off.

Twenty-seven of the tasks are controls — forms, tables, wizards, business workflows and portal navigation that a competent agent should pass either way. Nine are adversarial: the page mutates or obstructs mid-task — a button is renamed after a field is typed into, an overlay rises over the control, a same-label decoy appears. Every number on this page is computed from the raw run files of that evaluation (results/run_on.json and results/run_off.json); nothing is hand-entered.

CategoryTasksRecovery onRecovery off
Forms & wizards1010/10 (100.0%)10/10 (100.0%)
Tables, lists & cart66/6 (100.0%)6/6 (100.0%)
Adversarial recovery99/9 (100.0%)0/9 (0.0%)
Widgets & dialogs55/5 (100.0%)5/5 (100.0%)
Business workflows33/3 (100.0%)3/3 (100.0%)
Portal navigation33/3 (100.0%)3/3 (100.0%)

Recovery on passed all 36 tasks. Recovery off passed the 27 controls and failed all nine adversarial tasks — renamed targets were never found, covered buttons’ clicks timed out, and decoys failed their postconditions. At these sample sizes the intervals are wide (exact Clopper–Pearson 95% CIs): 36/36 is 90.3–100%, 27/36 is 57.8–87.9%, and the adversarial split is 9/9 at 66.4–100% against 0/9 at 0–33.6%.

The results, drawn

Pass rate by category — recovery on vs off

Forms & wizards — recovery on10/10 · 100%Forms & wizards — recovery off10/10 · 100%Tables, lists & cart — recovery on6/6 · 100%Tables, lists & cart — recovery off6/6 · 100%Adversarial recovery — recovery on9/9 · 100%Adversarial recovery — recovery off0/9 · 0%Widgets & dialogs — recovery on5/5 · 100%Widgets & dialogs — recovery off5/5 · 100%Business workflows — recovery on3/3 · 100%Business workflows — recovery off3/3 · 100%Portal navigation — recovery on3/3 · 100%Portal navigation — recovery off3/3 · 100%

The whole difference sits in one group. Controls pass either way; adversarial tasks go 9/9 with recovery on and 0/9 with it off.

What the outcomes are made of

Recovery on

36tasks
Passed, no recovery needed27 tasks
Passed after recovering9 tasks
Failed0 tasks

Recovery off

36tasks
Passed, no recovery needed27 tasks
Passed after recovering0 tasks
Failed9 tasks

Recovery on, every task passes — 27 without a single recovery, 9 after recovering. Recovery off, the 9 failures are exactly the adversarial nine.

The adversarial nine — attempts, both modes

adversarial_banner_reappears — off (fails)3 attempts · FAILadversarial_banner_reappears — on (passes)4 attempts · 1 recovery · PASSadversarial_decoy_button — off (fails)3 attempts · FAILadversarial_decoy_button — on (passes)4 attempts · 1 recovery · PASSadversarial_double_label_change — off (fails)2 attempts · FAILadversarial_double_label_change — on (passes)6 attempts · 2 recoveries · PASSadversarial_label_change — off (fails)3 attempts · FAILadversarial_label_change — on (passes)4 attempts · 1 recovery · PASSadversarial_late_overlay — off (fails)2 attempts · FAILadversarial_late_overlay — on (passes)3 attempts · 1 recovery · PASSadversarial_moved_button — off (fails)2 attempts · FAILadversarial_moved_button — on (passes)3 attempts · 1 recovery · PASSadversarial_overlay_move — off (fails)3 attempts · FAILadversarial_overlay_move — on (passes)4 attempts · 1 recovery · PASSadversarial_rename_under_overlay — off (fails)3 attempts · FAILadversarial_rename_under_overlay — on (passes)5 attempts · 2 recoveries · PASSadversarial_renamed_field — off (fails)2 attempts · FAILadversarial_renamed_field — on (passes)4 attempts · 1 recovery · PASS

Off, each trap task fails in 2–3 attempts. On, each passes in 3–6 — 11 recoveries spent across the nine, none anywhere else.

Attempts per task — the distribution

02468101113728113834435876–8229–122213+Attempts per task · green = recovery on · grey = recovery off

Total attempts: 185 with recovery on, 171 off. On the 27 control tasks the two modes spend identical attempts (148 each); every extra attempt sits in the adversarial group.

Steps against attempts

attempts = steps (no retries)02468101214160246810121416login — 3 steps, 3 attemptstable_filter — 2 steps, 2 attemptsmultistep_form — 7 steps, 7 attemptssettings_form — 4 steps, 4 attemptstodo_list — 5 steps, 5 attemptssort_table — 1 steps, 1 attemptsadversarial_label_change — 3 steps, 4 attemptsadversarial_overlay_move — 3 steps, 4 attemptscheckout_full — 11 steps, 11 attemptsvalidation_form — 10 steps, 10 attemptspaginated_table — 5 steps, 5 attemptsdependent_settings — 6 steps, 6 attemptsstacked_modals — 4 steps, 4 attemptsdelayed_render — 3 steps, 3 attemptsdate_picker — 2 steps, 2 attemptsautocomplete_select — 2 steps, 2 attemptswizard_backtrack — 7 steps, 7 attemptsdependent_dropdowns — 3 steps, 3 attemptscart_update — 3 steps, 3 attemptstabbed_panels — 6 steps, 6 attemptsaccordion_form — 7 steps, 7 attemptsinline_edit_table — 3 steps, 3 attemptsotp_code_entry — 5 steps, 5 attemptsadversarial_double_label_change — 4 steps, 6 attemptsadversarial_moved_button — 2 steps, 3 attemptsadversarial_banner_reappears — 3 steps, 4 attemptsadversarial_late_overlay — 2 steps, 3 attemptsadversarial_renamed_field — 3 steps, 4 attemptsadversarial_decoy_button — 3 steps, 4 attemptsadversarial_rename_under_overlay — 3 steps, 5 attemptscrm_record_update — 6 steps, 6 attemptsvendor_application — 14 steps, 14 attemptslead_entry — 16 steps, 16 attemptsportal_customer_drilldown — 3 steps, 3 attemptsportal_edit_and_verify — 6 steps, 6 attemptsportal_settings_flow — 4 steps, 4 attemptsSteps in the task (x) against attempts the agent needed (y), recovery on · green = control task · amber = adversarial task

9 of the 9 adversarial tasks needed more attempts than they have steps — the points above the line are retries spent recovering. Control tasks sit on the line in both modes.

Every task, both modes

RECOVERY ONRECOVERY OFFFORMS & WIZARDSlogin3 attempts3 attemptsmultistep_form7 attempts7 attemptssettings_form4 attempts4 attemptscheckout_full11 attempts11 attemptsvalidation_form10 attempts10 attemptsdependent_settings6 attempts6 attemptswizard_backtrack7 attempts7 attemptsdependent_dropdowns3 attempts3 attemptsaccordion_form7 attempts7 attemptsotp_code_entry5 attempts5 attemptsTABLES, LISTS & CARTtable_filter2 attempts2 attemptstodo_list5 attempts5 attemptssort_table1 attempts1 attemptspaginated_table5 attempts5 attemptscart_update3 attempts3 attemptsinline_edit_table3 attempts3 attemptsADVERSARIAL RECOVERYadversarial_label_change4 attempts · ↺ 13 attempts · FAILadversarial_overlay_move4 attempts · ↺ 13 attempts · FAILadversarial_double_label_change6 attempts · ↺ 22 attempts · FAILadversarial_moved_button3 attempts · ↺ 12 attempts · FAILadversarial_banner_reappears4 attempts · ↺ 13 attempts · FAILadversarial_late_overlay3 attempts · ↺ 12 attempts · FAILadversarial_renamed_field4 attempts · ↺ 12 attempts · FAILadversarial_decoy_button4 attempts · ↺ 13 attempts · FAILadversarial_rename_under_overlay5 attempts · ↺ 23 attempts · FAILWIDGETS & DIALOGSstacked_modals4 attempts4 attemptsdelayed_render3 attempts3 attemptsdate_picker2 attempts2 attemptsautocomplete_select2 attempts2 attemptstabbed_panels6 attempts6 attemptsBUSINESS WORKFLOWScrm_record_update6 attempts6 attemptsvendor_application14 attempts14 attemptslead_entry16 attempts16 attemptsPORTAL NAVIGATIONportal_customer_drilldown3 attempts3 attemptsportal_edit_and_verify6 attempts6 attemptsportal_settings_flow4 attempts4 attempts

All 36 tasks as one picture: the recovery-on column is green end to end; the recovery-off column turns red on exactly the nine adversarial rows. ↺ counts the recoveries a task used.

Method

The agent drives headless Chromium (Playwright) through the task suite. Each task is a sequence of steps, and every step carries an explicit postcondition written against the page. For each step the agent runs one loop:

OBSERVEGROUNDACTVERIFYRECOVER on any failure — recovery on only: re-ground, dismiss overlay, retry (at most 2 per step)

Observe and ground

Observe takes a fresh DOM snapshot: every interactive element with a reference, role, text, id, name, label, form and visibility. Ground matches the step’s semantic target — role plus text, label or name — against that snapshot. Act clicks, fills, selects or checks via the element’s locator recipe. Verify checks the step’s postcondition: visible text, row counts, field values, checked state.

Recover — re-grounding

When a step fails — target not found, an action error, or a postcondition not met — recovery first re-grounds: the target is looked up again in a fresh snapshot with fallback strategies instead of the exact text or id — for example the submit control of the named form, or the only visible element of that role in scope. That is what survives a button being renamed mid-task (“Pay now” → “Confirm payment”, new id) or moved in the page.

Recover — overlay dismissal and the retry budget

If the click error says another element intercepts pointer events, the agent finds the overlay’s dismiss control (Accept / Close / ×), clicks it, and retries. Retries are budgeted — at most 2 per step — then the task fails and the failure is reported as-is. Every observe, failure and recovery is written to the run log.

The ablation

Recovery off disables all three mechanisms: no re-grounding, no overlay dismissal, no retries — the first failure ends the task. The evaluation runs the identical suite in both modes, so the difference between the two columns on this page is the measured worth of the recovery half of the loop.

Scope

The evaluation runs against deterministic local fixture pages in headless Chromium — pages styled as real product surfaces (a CRM portal, a store checkout, settings and admin flows) rather than bare HTML. The live session operates the same pages. Seven adversarial tasks needed exactly one recovery with recovery on; the two double-mutation tasks needed two.

Live demo

The live application, embedded — the same fixture pages the evaluation runs on.

How to use

1 · Pick a task

Choose one of the 36 fixture tasks — a form, a checkout, a CRM or portal flow, or one of the nine adversarial tasks where the page mutates mid-task. In the live session you can also point the agent at a public page.

2 · Toggle recovery

Run the task with recovery on, then switch recovery off and run the same task again. Recovery off disables re-grounding, overlay dismissal and retries — the first failure ends the task.

3 · Read the results panel and the trace

The results panel reports pass or fail against the task's step postconditions, with attempts and recoveries counted. The trace shows every step as it happens — observe, ground, act, verify, and each recovery — with screenshots along the way.

Evaluation v1.0 — 36-task suite

The current result set on this page is Evaluation v1.0: the full 36-task suite, both modes run. The raw outputs ship with this site as downloadable files, byte-identical to the project's own copies:

Changelog

v1.0 — the 36-task suite, in six categories:

Both modes run for every task: recovery on and recovery off, scored by the same step postconditions.

Full record

Every task, both modes — attempts and recoveries counted from the run files.

TaskCategoryAdversarialRecovery onAttempts (on)Recoveries (on)Recovery offAttempts (off)
loginForms & wizardsnoPASS30PASS3
multistep_formForms & wizardsnoPASS70PASS7
settings_formForms & wizardsnoPASS40PASS4
checkout_fullForms & wizardsnoPASS110PASS11
validation_formForms & wizardsnoPASS100PASS10
dependent_settingsForms & wizardsnoPASS60PASS6
wizard_backtrackForms & wizardsnoPASS70PASS7
dependent_dropdownsForms & wizardsnoPASS30PASS3
accordion_formForms & wizardsnoPASS70PASS7
otp_code_entryForms & wizardsnoPASS50PASS5
table_filterTables, lists & cartnoPASS20PASS2
todo_listTables, lists & cartnoPASS50PASS5
sort_tableTables, lists & cartnoPASS10PASS1
paginated_tableTables, lists & cartnoPASS50PASS5
cart_updateTables, lists & cartnoPASS30PASS3
inline_edit_tableTables, lists & cartnoPASS30PASS3
adversarial_label_changeAdversarial recoveryyesPASS41FAIL3
adversarial_overlay_moveAdversarial recoveryyesPASS41FAIL3
adversarial_double_label_changeAdversarial recoveryyesPASS62FAIL2
adversarial_moved_buttonAdversarial recoveryyesPASS31FAIL2
adversarial_banner_reappearsAdversarial recoveryyesPASS41FAIL3
adversarial_late_overlayAdversarial recoveryyesPASS31FAIL2
adversarial_renamed_fieldAdversarial recoveryyesPASS41FAIL2
adversarial_decoy_buttonAdversarial recoveryyesPASS41FAIL3
adversarial_rename_under_overlayAdversarial recoveryyesPASS52FAIL3
stacked_modalsWidgets & dialogsnoPASS40PASS4
delayed_renderWidgets & dialogsnoPASS30PASS3
date_pickerWidgets & dialogsnoPASS20PASS2
autocomplete_selectWidgets & dialogsnoPASS20PASS2
tabbed_panelsWidgets & dialogsnoPASS60PASS6
crm_record_updateBusiness workflowsnoPASS60PASS6
vendor_applicationBusiness workflowsnoPASS140PASS14
lead_entryBusiness workflowsnoPASS160PASS16
portal_customer_drilldownPortal navigationnoPASS30PASS3
portal_edit_and_verifyPortal navigationnoPASS60PASS6
portal_settings_flowPortal navigationnoPASS40PASS4

The nine failures, recovery off

With recovery on there are no failures to list. With it off, the run log records:

Methods and write-up

Methods library

Evaluation — the ablation design and the scoring rules. Calibration — isotonic calibration and per-gene reporting, worst first. Temporal evaluation — the freeze/test design behind the variant results.

The recovery ablation — article

The recovery ablation — what was measured, what recovery does mechanically, the nine recorded failures, and the limits.

Architecture

How the agent is built, from the code itself: the observe → ground → act → verify → recover state machine, the grounding rules, the retry budgets and timeouts, the failure taxonomy, and the safety rails that bound the public-page mode.

web-agent architecture ›

Evaluations

The standalone proof page for this product: Evaluations — Evaluation v1.0 in full, with the raw run files as downloads.