Universal Verifier paper: The Art of Building Verifiers for Computer Use Agents
CUAVerifierBench is an evaluation benchmark for verifiers of computer-using agents (CUAs) — i.e. judges that read an agent's trajectory (screenshots + actions + final answer) and decide whether the task was completed correctly. Where benchmarks like WebTailBench measure agents, CUAVerifierBench measures the judges that score those agents.
Each row pairs a Fara-7B agent trajectory with one human reviewer's verdict, plus the verdicts produced by the Universal Verifier (MMRubricAgent) and several legacy verifiers. Researchers can use the dataset to:
Both configs (trajectories, annotations) carry the same two splits:
| Split | Source | Trajectories | Annotation rows | Annotation stages |
|---|---|---|---|---|
fara7b_om2w_browserbase | Fara-7B trajectories on the Online-Mind2Web tasks executed via the Browserbase remote browser | 106 | 215 (≈2 reviewers/task) | UV-blind and UV-informed |
internal | Microsoft-internal task suite — heldout aurora-v2 task definitions evaluated with the same WebSurfer + verifier stack | 154 | 154 (1 reviewer/task) | UV-blind only |
The two splits share the same column schema. The internal split was annotated in a single UV-blind stage, so its informed_* fields and human_process_score are empty / null.
The dataset is exposed as two HuggingFace configs that are joinable on task_id:
| Config | Granularity | Contents |
|---|---|---|
trajectories | one row per task | The agent run — instruction, screenshots, web_surfer log, final answer, plus all verifier outputs and task-level human aggregates |
annotations | one row per (task, judge) | Free-text and structured human judgments from one reviewer |
Reviewer identities are anonymized as Judge1 … JudgeN using a single shared map across both splits — the same human always gets the same Judge ID.
Storing screenshots only in trajectories (rather than duplicating across judges) cuts the on-disk size roughly in half.
trajectories| Field | Type | Description |
|---|---|---|
task_id | string | PK. Online-Mind2Web task identifier (e.g. Adidas--11857213) |
instruction | string | Natural-language task given to the agent |
init_url | string | Starting URL |
start_timestamp, end_timestamp | string | Wall-clock bounds of the run |
final_answer | string | The agent's submitted answer (or <no_answer> if it never called terminate) |
is_aborted | bool | Whether the run was aborted before completion |
web_surfer_log | string | Full JSONL action/observation log from web_surfer.log |
screenshots | sequence of Image | Inline PNG screenshots in chronological order, decoded to PIL automatically |
n_screenshots | int32 | Length of the screenshots list |
gpt_eval_json | string | Raw JSON of the original Online-Mind2Web GPT judge verdict |
uv_rubric_score | float32 | Universal Verifier (current) rubric score in [0, 1] |
uv_outcome_success | int32 | Universal Verifier (current) binary outcome verdict |
mm_is_success | int32 | Legacy (deprecated) — verdict from the original WebTailBench multimodal grounded verifier (see note below) |
verifier_is_success | int32 | Legacy (deprecated) — verdict from the original WebTailBench text-only task verifier (see note below) |
final_human_outcome_label | int32 | Final adjudicated outcome label across all reviewers of this task |
final_human_process_label | int32 | Final adjudicated process label across all reviewers of this task |
median_human_rubric_score_agnostic | float32 | Median of UV-blind process scores across reviewers |
majority_human_outcome_vote | int32 | Majority vote of UV-blind outcome labels |
About the legacy verifiers.
mm_is_successandverifier_is_successcome from the original WebTailBench verifier suite used in the Fara-7B tech report (a 3-judge ensemble: text-only task verifier, multimodal grounded verifier, early rubric agent). The entire suite has since been deprecated and replaced by the Universal Verifier (MMRubricAgent) inmicrosoft/fara. They are included only for backwards-compatible analysis against numbers from the original Fara-7B paper. New work should useuv_rubric_score/uv_outcome_success.
annotations| Field | Type | Description |
|---|---|---|
task_id | string | FK → trajectories.task_id |
annotator | string | Anonymized reviewer (Judge1 … Judge6) |
human_judgement_outcome | string | UV-blind outcome label (Correct / Incorrect / etc.) |
human_judgement_process | string | UV-blind process label |
human_process_score | float32 | UV-blind continuous process score in [0, 1] |
outcome_comment | string | UV-blind free-text justification for the outcome label |
process_comment | string | UV-blind free-text justification for the process label |
informed_outcome_agreement | string | UV-informed: agreement with the Universal Verifier's outcome verdict |
informed_process_agreement | string | UV-informed: agreement with the Universal Verifier's process verdict |
informed_outcome_comment | string | UV-informed free-text justification |
informed_process_comment | string | UV-informed free-text justification |
UV-blind vs. UV-informed. Reviewers labeled each trajectory in two stages: first without seeing any verifier output (human_* and *_comment fields), then after being shown the Universal Verifier's verdict (informed_* fields).
Each config is loaded separately and joined on task_id. Pass either fara7b_om2w_browserbase or internal as the split:
from datasets import load_dataset
split = "fara7b_om2w_browserbase" # or "internal"
trajs = load_dataset("microsoft/CUAVerifierBench", "trajectories", split=split)
anns = load_dataset("microsoft/CUAVerifierBench", "annotations", split=split)
# Per-judge analysis: join in pandas
import pandas as pd
df = anns.to_pandas().merge(trajs.to_pandas(), on="task_id")
# Or look up trajectories on demand:
by_id = {r["task_id"]: r for r in trajs}
print(by_id[anns[0]["task_id"]]["screenshots"][0]) # PIL.Image
Trajectories were generated by running Fara-7B on the public Online-Mind2Web task set, executed inside a Browserbase-hosted Chromium instance. Each trajectory contains the screenshots the model saw, the structured actions it issued, and the final answer it submitted.
Each task was independently reviewed by ~2 human annotators in two stages:
Reviewer identities are anonymized as Judge1…Judge6.
For each trajectory we also include the verdicts of the Universal Verifier (code is released at https://github.com/microsoft/fara) and two legacy verifiers, so users can directly compute verifier–human agreement.
MIT License
If you use CUAVerifierBench in your research, please cite the Universal Verifier paper:
@article{UniversalVerifier2026,
title={The Art of Building Verifiers for Computer Use Agents},
journal={arXiv preprint arXiv:2604.06240},
year={2026},
url={https://arxiv.org/abs/2604.06240v1}
}
Created by Microsoft Research AI Frontiers.
15 commits
Universal Verifier paper: The Art of Building Verifiers for Computer Use Agents
CUAVerifierBench is an evaluation benchmark for verifiers of computer-using agents (CUAs) — i.e. judges that read an agent's trajectory (screenshots + actions + final answer) and decide whether the task was completed correctly. Where benchmarks like WebTailBench measure agents, CUAVerifierBench measures the judges that score those agents.
Each row pairs a Fara-7B agent trajectory with one human reviewer's verdict, plus the verdicts produced by the Universal Verifier (MMRubricAgent) and several legacy verifiers. Researchers can use the dataset to:
Both configs (trajectories, annotations) carry the same two splits:
| Split | Source | Trajectories | Annotation rows | Annotation stages |
|---|---|---|---|---|
fara7b_om2w_browserbase | Fara-7B trajectories on the Online-Mind2Web tasks executed via the Browserbase remote browser | 106 | 215 (≈2 reviewers/task) | UV-blind and UV-informed |
internal | Microsoft-internal task suite — heldout aurora-v2 task definitions evaluated with the same WebSurfer + verifier stack | 154 | 154 (1 reviewer/task) | UV-blind only |
The two splits share the same column schema. The internal split was annotated in a single UV-blind stage, so its informed_* fields and human_process_score are empty / null.
The dataset is exposed as two HuggingFace configs that are joinable on task_id:
| Config | Granularity | Contents |
|---|---|---|
trajectories | one row per task | The agent run — instruction, screenshots, web_surfer log, final answer, plus all verifier outputs and task-level human aggregates |
annotations | one row per (task, judge) | Free-text and structured human judgments from one reviewer |
Reviewer identities are anonymized as Judge1 … JudgeN using a single shared map across both splits — the same human always gets the same Judge ID.
Storing screenshots only in trajectories (rather than duplicating across judges) cuts the on-disk size roughly in half.
trajectories| Field | Type | Description |
|---|---|---|
task_id | string | PK. Online-Mind2Web task identifier (e.g. Adidas--11857213) |
instruction | string | Natural-language task given to the agent |
init_url | string | Starting URL |
start_timestamp, end_timestamp | string | Wall-clock bounds of the run |
final_answer | string | The agent's submitted answer (or <no_answer> if it never called terminate) |
is_aborted | bool | Whether the run was aborted before completion |
web_surfer_log | string | Full JSONL action/observation log from web_surfer.log |
screenshots | sequence of Image | Inline PNG screenshots in chronological order, decoded to PIL automatically |
n_screenshots | int32 | Length of the screenshots list |
gpt_eval_json | string | Raw JSON of the original Online-Mind2Web GPT judge verdict |
uv_rubric_score | float32 | Universal Verifier (current) rubric score in [0, 1] |
uv_outcome_success | int32 | Universal Verifier (current) binary outcome verdict |
mm_is_success | int32 | Legacy (deprecated) — verdict from the original WebTailBench multimodal grounded verifier (see note below) |
verifier_is_success | int32 | Legacy (deprecated) — verdict from the original WebTailBench text-only task verifier (see note below) |
final_human_outcome_label | int32 | Final adjudicated outcome label across all reviewers of this task |
final_human_process_label | int32 | Final adjudicated process label across all reviewers of this task |
median_human_rubric_score_agnostic | float32 | Median of UV-blind process scores across reviewers |
majority_human_outcome_vote | int32 | Majority vote of UV-blind outcome labels |
About the legacy verifiers.
mm_is_successandverifier_is_successcome from the original WebTailBench verifier suite used in the Fara-7B tech report (a 3-judge ensemble: text-only task verifier, multimodal grounded verifier, early rubric agent). The entire suite has since been deprecated and replaced by the Universal Verifier (MMRubricAgent) inmicrosoft/fara. They are included only for backwards-compatible analysis against numbers from the original Fara-7B paper. New work should useuv_rubric_score/uv_outcome_success.
annotations| Field | Type | Description |
|---|---|---|
task_id | string | FK → trajectories.task_id |
annotator | string | Anonymized reviewer (Judge1 … Judge6) |
human_judgement_outcome | string | UV-blind outcome label (Correct / Incorrect / etc.) |
human_judgement_process | string | UV-blind process label |
human_process_score | float32 | UV-blind continuous process score in [0, 1] |
outcome_comment | string | UV-blind free-text justification for the outcome label |
process_comment | string | UV-blind free-text justification for the process label |
informed_outcome_agreement | string | UV-informed: agreement with the Universal Verifier's outcome verdict |
informed_process_agreement | string | UV-informed: agreement with the Universal Verifier's process verdict |
informed_outcome_comment | string | UV-informed free-text justification |
informed_process_comment | string | UV-informed free-text justification |
UV-blind vs. UV-informed. Reviewers labeled each trajectory in two stages: first without seeing any verifier output (human_* and *_comment fields), then after being shown the Universal Verifier's verdict (informed_* fields).
Each config is loaded separately and joined on task_id. Pass either fara7b_om2w_browserbase or internal as the split:
from datasets import load_dataset
split = "fara7b_om2w_browserbase" # or "internal"
trajs = load_dataset("microsoft/CUAVerifierBench", "trajectories", split=split)
anns = load_dataset("microsoft/CUAVerifierBench", "annotations", split=split)
# Per-judge analysis: join in pandas
import pandas as pd
df = anns.to_pandas().merge(trajs.to_pandas(), on="task_id")
# Or look up trajectories on demand:
by_id = {r["task_id"]: r for r in trajs}
print(by_id[anns[0]["task_id"]]["screenshots"][0]) # PIL.Image
Trajectories were generated by running Fara-7B on the public Online-Mind2Web task set, executed inside a Browserbase-hosted Chromium instance. Each trajectory contains the screenshots the model saw, the structured actions it issued, and the final answer it submitted.
Each task was independently reviewed by ~2 human annotators in two stages:
Reviewer identities are anonymized as Judge1…Judge6.
For each trajectory we also include the verdicts of the Universal Verifier (code is released at https://github.com/microsoft/fara) and two legacy verifiers, so users can directly compute verifier–human agreement.
MIT License
If you use CUAVerifierBench in your research, please cite the Universal Verifier paper:
@article{UniversalVerifier2026,
title={The Art of Building Verifiers for Computer Use Agents},
journal={arXiv preprint arXiv:2604.06240},
year={2026},
url={https://arxiv.org/abs/2604.06240v1}
}
Created by Microsoft Research AI Frontiers.
15 commits