OSWorld vs WindowsAgentArena vs AndroidWorld vs BrowserGym: the verifier is the benchmark

These four get quoted as four measurements of the same ability, and they are four different objects. Two of them do not own a verifier at all: WindowsAgentArena vendors OSWorld's metric library wholesale, and BrowserGym is a harness that imports whatever the wrapped benchmark wrote. The axis that decides whether a score transfers is not the operating system or the task count — it is what the check reads. OSWorld compares a saved file against a gold copy after pressing Ctrl+S itself; AndroidWorld reads device state on a randomised instance no other run shares; BrowserGym's reward float carries a binary page check in one row and a token-bag F1 in the next.

By Agentic AI Wiki 14 min read

Two of these four do not own a verifier at all, which is the fact that makes their scores incomparable and the fact no comparison mentions. WindowsAgentArena vendors OSWorld's metric library wholesale; BrowserGym is a harness that imports whatever the wrapped benchmark wrote. So the axis that decides whether a number transfers to your product is not the operating system or the task count — it is what the check reads. Pick the benchmark whose verifier reads the same thing your definition of done reads, and ignore the rest of the comparison.

At a glance

Four projects that all get described as "GUI agent benchmarks", read against who wrote the check.

ProjectLicenceDefault suiteWho owns the verifier
OSWorld (xlang-ai)Apache-2.0368 tasks, 10 domainsItself — 225 metric functions
WindowsAgentArena (Microsoft)MIT154 tasks, 12 domainsOSWorld — the library is vendored
AndroidWorld (google-research)Apache-2.0116 hand-crafted tasks, 20 appsItself — one success function per task
BrowserGym (ServiceNow)Apache-2.08 benchmarks, incl. WebArena's 812Nobody — it imports each one's

Read the last column twice. It is the whole comparison. Three of these are environments, one is a harness, and of the three environments only two wrote their own grader — because the second one copied the first.

Where each GUI agent benchmark leans A four by four matrix. OSWorld owns its verifier, scores a file on disk, uses fixed task instances, and resets a VM snapshot. Windows Agent Arena vendors OSWorld's verifier library, also scores a file on disk, uses fixed instances, and resets a thirty-gigabyte Windows golden image. Android World owns a per-task success function, scores device state, randomises every task instance from a parameter schema, and resets an emulator. BrowserGym owns no verifier and imports each wrapped benchmark's own, so what it scores depends on the benchmark, instances are seeded, and reset means re-provisioning the web applications. The four axes that decide whether a score transfers Owns its verifier Success reads Task instance Reset unit OSWorld Yes, 225 funcs A file on disk Fixed VM snapshot WinAgentArena Vendors OSWorld's A file on disk Fixed 30 GB image AndroidWorld Yes, per task Device state Randomised Emulator BrowserGym No, imports it Benchmark decides Seeded Web apps Owns it outright Partly Delegated or fixed
The two rows that look most alike in a feature list — OSWorld and WindowsAgentArena — differ on almost nothing, because one is the other ported to Windows.

The question that sorts them

Who owns the verifier in each of the four projects Two lanes. In the upper lane, OSWorld owns a library of metric functions and Windows Agent Arena vendors that same library, so both score an artifact on disk — a saved file compared against a gold copy. Android World owns a per-task success function that reads device state after the run. In the lower lane, BrowserGym owns no verifier at all: it is a harness whose task interface returns a reward float, and for a WebArena task it imports the upstream WebArena evaluator router, while an AssistantBench task scores a typed answer with a token-bag F1. The same reward slot therefore carries a binary file comparison in one case and a partial-credit text score in another. Three projects own a verifier. One imports whoever wrote the benchmark. Owns its verifier OSWorld 225 metric functions 368 tasks, Ubuntu VM WindowsAgentArena vendors the same library 154 tasks, Win 11 VM AndroidWorld is_successful(env) per task 116 tasks, 20 apps reads: a saved file, compared byte for byte against a gold copy reads: device state, on a random instance Owns no verifier BrowserGym a harness, 8 benchmarks validate() -> reward float WebArena, 812 tasks imports evaluator_router upstream AssistantBench token-bag F1 on a typed answer one reward slot, two incompatible meanings: binary page state in one row, partial credit in the other
Upper lane: the project decides what counts as done. Lower lane: it provides the loop and inherits somebody else's definition.

Ask of any agent benchmark: when the run ends, what does the grader look at? Everything else follows from that. The four answers here are genuinely different kinds of thing — a file's bytes, a device's state, a web page plus a typed answer, and in one case a bag of normalised tokens scored for partial credit — and no amount of shared vocabulary ("success rate") makes them commensurable.

This is not a complaint about benchmark design. Each choice is right for what its authors were measuring. The problem is downstream: a leaderboard column headed "success rate" invites you to read 38% on one and 41% on another as a comparison, and it is not one, in the same way that a unit test pass rate and a customer-satisfaction score are both percentages.

The test that actually decides which to use: write down, in one sentence, how your product knows a task succeeded. If the answer is "a row changed in a database", you want a state-reading verifier. If it is "the user got the right answer", you want an answer-scoring one. Then pick the benchmark that already does that, and treat the other three as evidence about a different question.

OSWorld — the verifier is a library, and it acts

The mechanism

A task is a JSON file with three parts: a config that sets up the machine, an instruction in natural language, and an evaluator naming a function plus its expected and actual inputs. desktop_env/evaluators/metrics/ holds 225 functions across fifteen modules — libreoffice.py, chrome.py, pdf.py, vlc.py, vscode.py and the rest. Across the task files, the most-used verifier is compare_table (56 tasks), then infeasible (26), compare_pptx_files (23) and check_include_exclude (15).

The part teams miss

The evaluator is not a read. It has a postconfig that operates the desktop first. Here is a real one, from a LibreOffice Calc task that asks the agent to add a maturity-date column:

activate_window  window_name: "MaturityDate.xlsx - LibreOffice Calc", strict: true
sleep            0.5
execute          python -c 'import pyautogui; pyautogui.hotkey("ctrl","s")'
sleep            0.5
func             compare_table
expected         cloud_file   # fetched from a HuggingFace dataset repo
result           vm_file      /home/user/MaturityDate.xlsx

Four things must go right before the agent's work is looked at: the window title must match exactly, no save dialog may intercept the keystroke, half a second must be enough for the write to land, and the gold file must download. A correct agent fails the task on any one of them. Across the suite the grading path issues execute 358 times, sleep 307 times, download 293 times and activate_window 200 times against 368 tasks — which puts a floor on the benchmark's own reliability that no published score reports. The general version of this problem is in when the check has to act.

The honest bits

test_infeasible.json carries 25 tasks whose correct answer is a refusal, which is a genuinely good design decision and one most suites skip. And OSWorld-Verified, announced in July 2025, fixed community-reported issues, added AWS parallelisation and re-ran model results — with the project explicitly telling you to compare against the new numbers rather than the old ones. Treat any OSWorld figure without a version as unidentified.

WindowsAgentArena — the same grader, a different machine

The mechanism

Microsoft's project is OSWorld ported to Windows 11, and it does not hide this. src/win-arena-container/client/desktop_env/evaluators/metrics/ is OSWorld's module list with edge.py added where chrome.py sits. The task-file vocabulary is the same: across its examples the funcs are exact_match (92), compare_table (48), infeasible (26), check_json_settings (20). test_all.json holds 154 tasks across 12 domains.

The part teams miss

There are two sets of task files, not one: examples/ and examples_noctxt/, 308 files for 154 tasks. That is the difficulty switch, added in November 2024 — set diff_lvl="hard" and the agent must find and open the right program itself rather than having the task config set the scene. This is the single most important thing to state alongside a WindowsAgentArena number, and it is a start_client.sh variable rather than a suite name, so it travels badly.

The cost shape

The reset unit is a 30 GB Windows 11 golden image you build yourself from an evaluation ISO, hosting a Python server that receives agent commands. The upside is that Azure ML parallelisation turns hundreds of tasks into minutes rather than days. The downside is that your results are a property of the image you built, and two teams' images are not the same artifact.

AndroidWorld — the only one where no two runs share a task

The mechanism

A task is a class with a template string, a JSON schema for its parameters, a generate_random_params() classmethod, and is_successful(env) -> float. The goal string is the template formatted with the params, so 116 hand-crafted tasks across 20 apps instantiate into what the project calls millions of unique variations. Success is read programmatically from device state after the run — 57 is_successful implementations across 96 task-eval modules. MiniWoB++ rides along inside the same harness.

The part teams miss

Randomised instantiation is the strongest anti-memorisation property in this group and the weakest reproducibility property, and it is the same design choice. A score is an average over instances nobody else drew, so two papers' AndroidWorld numbers are samples from the same distribution rather than results on the same test, and the variance that implies is not usually reported. That is a statistical-power question before it is a capability one.

The quiet parameter

Step budgets were recalibrated in November 2024 to roughly twice the human average completion time per task. That is a defensible choice, well documented, and it is also a dial: an agent that would have finished in 2.5× human time scores zero, and a suite tuned to a different multiple would rank systems differently. The budget belongs next to the score, the way it does in budget-matched evaluation.

BrowserGym — a harness, sold and read as a benchmark

The mechanism

Every task implements AbstractBrowserTask: setup(page), validate(page, chat_messages) -> (reward, done, message, info), an optional cheat(), and teardown(). Behind that interface sit eight benchmarks — MiniWoB (105 task classes), WebArena (812), WebArena-Verified (812), WebArena-Lite (165), VisualWebArena (910), WorkArena, AssistantBench and WebLINX — each installed as its own package.

The part teams miss

BrowserGym does not grade. Its WebArena task imports webarena.evaluation_harness.evaluators.evaluator_router from the upstream package and calls it; the package also pulls NLTK's punkt_tab tokenizer at import time, because WebArena's own scoring does text matching. So a "BrowserGym result" inherits every property of the benchmark underneath, including its scorer's quirks, and the uniform reward: float hides how different those are:

# same interface, incompatible semantics

WebArena task      -> reward from the upstream evaluator_router
                      (page state + answer matching, essentially pass/fail)

AssistantBench     -> reward from a token-bag F1 over normalised spans
                      (articles stripped, punctuation stripped, numbers
                       normalised, then per-span F1 aligned greedily)
                      -> 0.63 is a real value here, and meaningless above

Averaging across BrowserGym benchmarks is therefore averaging a pass rate with a partial-credit score. It is a reasonable thing for a harness to permit and an unreasonable thing to put in a headline.

What it is actually good for

One agent implementation against eight benchmarks, with the observation space (screenshot, accessibility tree, set-of-marks) configurable in one place. If you are building a web agent, that portability is worth more than any individual suite, and it is the right default. Just report per-benchmark numbers, never a BrowserGym average.

Task counts, and why the biggest bar is the least informative

Tasks in each default suite A horizontal bar chart of task counts read from each project's own registry. VisualWebArena has nine hundred and ten, WebArena eight hundred and twelve, OSWorld three hundred and sixty-eight, WebArena-Lite one hundred and sixty-five, Windows Agent Arena one hundred and fifty-four, Android World one hundred and sixteen hand-crafted tasks, and MiniWoB plus plus one hundred and five task classes. Four of the seven are reached through BrowserGym rather than being benchmarks of their own, and no two bars are scored by the same verifier. Tasks in the default suite counts read from each project's own task registry VisualWebArena 910 WebArena 812 OSWorld 368 WebArena-Lite 165 WindowsAgentArena 154 AndroidWorld 116 MiniWoB++ 105 A benchmark of its own Reached through BrowserGym
Seven suites, seven registries, and no two bars scored by the same verifier. The 910 and the 116 are not the same unit — one counts fixed instances, the other counts task families that instantiate randomly.

The temptation with a chart like this is to read task count as coverage. It is closer to a reset-cost budget. A 910-task web suite runs against re-provisioned web applications; a 154-task Windows suite runs against a 30 GB image; a 116-task Android suite runs against an emulator and draws fresh parameters each time. Those are different orders of infrastructure per task, which is why the big suites are web suites and will stay that way.

The number worth asking for instead is how many distinct verifiers produced the score, because that is what bounds how much a single grader bug can move it. OSWorld's 368 tasks resolve to a few dozen functions, with compare_table alone covering 56 of them — so a regression in one table comparator moves 15% of the suite.

When to pick which

If your product…PickBecause
Produces documents and filesOSWorld (Verified)Its verifiers compare artifacts, which is your definition of done.
Automates Windows line-of-business appsWindowsAgentArena, hardOnly suite on real Windows; the hard mode removes the task-config scaffolding.
Drives mobile apps, or needs anti-memorisationAndroidWorldRandomised instances, and state-reading verifiers that survive UI changes.
Is a web agentBrowserGymOne agent, eight benchmarks, one observation-space config — report per benchmark.
Needs a number for a slideNone of themNo two of these measure the same thing; build a suite over your own tasks.

And whichever you choose, add the gold-state self-test these suites do not ship: construct each task's correct end state by hand, run the verifier against it with no agent in the loop, and drop any task whose check fails there. Every verifier that fails on a hand-made success is a task you have been scoring as a model defect.

FAQ

Can I compare an OSWorld score with a WindowsAgentArena score?

More than you can compare either with the other two, because they share a verifier library and a task-file format. But not directly: the task sets differ (368 vs 154), the applications differ, and WindowsAgentArena has a difficulty switch that changes whether the agent has to set the task up itself. Treat them as the same measuring instrument applied to two different exams.

Is BrowserGym a benchmark?

No. It is a harness with a uniform task interface over eight benchmarks, and it owns no verifier — its WebArena task imports the upstream WebArena evaluator. A result is always a result on one of the wrapped benchmarks, and an average across them mixes pass rates with partial-credit scores.

Which of these has the most reliable scoring?

AndroidWorld's verifiers are the most passive — they read device state rather than operating the device to make state readable — so they have the fewest ways to fail on a machine where the agent succeeded. That is a different claim from being the most reproducible, where its randomised instantiation works against it.

Does AndroidWorld's "millions of variations" mean it cannot be gamed?

It raises the cost of memorising specific instances, which is real. It does not prevent fitting to the 116 task families, the 20 apps, or the template phrasings, and the step budget is still a fixed target to optimise against. Anti-memorisation is a property of the instance, not of the task distribution.

Why does OSWorld download files from the network during a task?

Because the initial state has to come from somewhere, and shipping fixtures inside the VM image would make the image enormous and unversioned. It is a defensible trade. It also means 293 download steps sit in the critical path of a scored run, and a CDN failure is reported as an agent failure unless you check.

Further reading

On this wiki:

Project sources: