
How rollouts get scored without a human in the room: simulator predicates, VLM judges and their real false positive rate, and why two published success rates almost never compare.
A rollout either worked or it did not. Turning that into a number sounds trivial until you have to do it two hundred times without a person in the room. Then it becomes a concrete engineering question: which piece of software decides, what exactly does it check, and how often is it wrong in a direction that flatters your policy?
This page is about that piece of software: the four places a success bit can come from, only three of which produce a number you can publish; what vision-based detectors actually score and at what precision; why a judge that is right 90 percent of the time bends a leaderboard in a predictable direction; and why two published success rates almost never measure the same thing. Every threshold below comes out of source code or a paper linked at the bottom.
What you need to know
- •A success rate is a measurement and every measurement has an instrument. In simulation it is a hand-written geometric predicate. On a real arm it is a human, or a classifier you trained yourself.
- •SIMPLER's grasp predicate counts a grasp held for 5 consecutive frames plus a 2 cm lift, and both relevant flags default to True, so it still scores a success if the policy puts the object back down.
- •LeRobot does the same one level up: lerobot_eval.py reduces the per-step is_success flags with an any, so an episode passes if the flag was ever true, not if it is true at the end.
- •AutoEval fine-tunes PaliGemma-3B into a per-scene yes/no classifier from about 1000 labelled images, ships it only above 95 percent accuracy on roughly 100 held-out images, and still had 3 of 50 trials go wrong on the sink scene.
- •Zero-shot VLM judging is weaker than assumed. GVL-SD reports 0.71 precision on six simulated bimanual ALOHA tasks; the SuccessVQA baseline in the same table reports 0.33.
- •An imperfect judge compresses differences. At sensitivity and specificity of 0.90 a true 10 point gap reads as 8 points; at 0.71 it shrinks to 4.2.
- •With 50 rollouts an observed 70 percent success rate carries a 95 percent Clopper-Pearson interval of 55.4 to 82.1 percent. Most published robot numbers sit in that regime.
- •AY-Robots trains and serves the policy. It does not score your rollouts, and the success criterion is still yours to write.
Where the success bit comes from
There are four mechanisms in common use, and only the first three produce something you can put on a leaderboard. Knowing which one produced a number is the first thing to ask about any published success rate, and it is almost never stated in the abstract.
| Mechanism | Works on | What it actually checks | Characteristic failure |
|---|---|---|---|
| Scene predicate in a simulator | Simulation only | Geometric state: object height, distance between poses, contact impulses, joint angles | Passes on a state the task designer never intended, or fails a state a human would accept |
| Human scorer watching the arm or the video | Real and sim | Whatever the rater has in mind that session | Drifts between raters and across a long session; nobody logs the criterion |
| Learned classifier over camera frames | Real and sim | One closed-set question about an image, or a progress curve over the clip | Confident yes on a near miss; no transfer to a scene it was not trained on |
| Runtime monitor on policy internals | Real and sim | Whether the policy is behaving consistently and making progress | Answers a different question than 'did the task get done' |
The fourth row is worth separating out early, because it gets conflated with the others constantly. A failure detector that fires when a diffusion policy starts oscillating is useful, but it is not a success detector and its output does not belong in a success column.
Simulator predicates: read the code, not the paper
In simulation the success bit is a pure function of scene state, written by hand by whoever built the task. SIMPLER, the real-to-sim evaluation suite from the VLA community, is a good place to look because the code is short. Here is the grasp predicate for the coke-can family of tasks, from grasp_single_in_scene.py in the ManiSkill2_real2sim repository.
is_grasped = self.agent.check_grasp(self.obj, max_angle=80)
if is_grasped:
self.consecutive_grasp += 1
else:
self.consecutive_grasp = 0
self.lifted_obj = False
# ... contact loop elided here: it sets flag = False while the object is still
# resting on a non-robot actor with a contact impulse above 1e-6 ...
consecutive_grasp = self.consecutive_grasp >= 5
diff_obj_height = self.obj.pose.p[2] - self.obj_height_after_settle
self.lifted_obj = self.lifted_obj or (flag and (diff_obj_height > 0.01))
lifted_object_significantly = self.lifted_obj and (diff_obj_height > 0.02)
if self.require_lifting_obj_for_success:
success = self.lifted_obj
else:
success = consecutive_grasp
if self.success_from_episode_stats:
# During evaluation, if policy puts down coke can in the end but has lifted it
# significantly before, it is still a success
# However, if you want to perform RL training on this environment,
# make sure to turn off this option
success = success or (self.episode_stats["n_lift_significant"] >= 5)Read what that says. A grasp counts if the gripper contact normal is within 80 degrees. It has to hold for 5 consecutive simulation frames. The object has to rise 1 cm above where it settled to arm the lift flag, and 2 cm for the lift to count as significant. And on the evaluation path, a rollout that lifts the can and then sets it back on the table is still a success.
Both require_lifting_obj_for_success and success_from_episode_stats default to True in the environment constructor, so a policy that lifts the object 2 cm, holds it for five frames and then puts it down scores exactly the same as one that lifts and holds. The source comment says so, and tells you to turn the option off for RL training. It is a defensible choice for ranking checkpoints offline. It is not the criterion a human watching the video would use, and not the one you want if the downstream job is a real picking cell.
The move-near task in the same repository is a conjunction of four conditions, every one carrying a constant that somebody chose.
- No other object dropped more than 2 cm below where it settled, and neither the source nor the target object fell more than 15 cm.
- The correct source object moved more than 0.03 m in the xy plane, and moved further than every other object in the scene.
- The source object ends up within the sum of the two objects' half bounding-box diagonals plus 0.10 m of the target.
- The source object is the closest object to the target, with a 0.01 m tolerance.
Change the 0.10 m to 0.05 m and every published number on that task moves. Nothing in the paper title tells you which constant was in effect. The same goes for the episode budget, which is part of the success criterion whether or not anyone calls it that. The widely copied OpenVLA evaluation script for LIBERO hard-codes a per-suite horizon derived from the longest training demonstration.
num_steps_wait: int = 10 # Number of steps to wait for objects to stabilize in sim
num_trials_per_task: int = 50 # Number of rollouts per task
if cfg.task_suite_name == "libero_spatial":
max_steps = 220 # longest training demo has 193 steps
elif cfg.task_suite_name == "libero_object":
max_steps = 280 # longest training demo has 254 steps
elif cfg.task_suite_name == "libero_goal":
max_steps = 300 # longest training demo has 270 steps
elif cfg.task_suite_name == "libero_10":
max_steps = 520 # longest training demo has 505 steps
elif cfg.task_suite_name == "libero_90":
max_steps = 400 # longest training demo has 373 stepsThat matters more than it looks. A policy with a 485 ms action step and one with a 20 ms action step are given the same number of steps, not the same number of seconds, so the horizon penalises hesitancy rather than latency. Check the per-step figures on the policy comparison page before reading anything into a horizon-limited benchmark.

Vision-based success detection on real hardware
On a real SO-100 there is no scene state to query. LeRobot's guide for adding a benchmark states that your environment must return info["is_success"] on every step() call, because that is how the evaluation loop knows the task was completed. The reduction matters too: lerobot_eval.py collapses the per-step flags with einops.reduce(..., "b n -> b", "any"), so an episode passes if the flag was ever true, not if it is true at the last step. The mean over episodes, times 100, is pc_success. Nothing on a physical arm produces that key.
# lerobot-eval works because the simulator supplies info["is_success"].
# EvalConfig defaults: n_episodes=50, batch_size=0 (auto-tuned from CPU cores).
# The seed lives one level up, on EvalPipelineConfig, and defaults to 1000.
lerobot-eval \
--policy.path=lerobot/diffusion_pusht \
--env.type=pusht \
--eval.batch_size=10 \
--eval.n_episodes=10 \
--policy.use_amp=false \
--policy.device=cudaSo you build the instrument. AutoEval, from Berkeley, is the most complete published recipe: a per-scene classifier fine-tuned from PaliGemma-3B as a yes/no visual question, plus a learned reset policy so the station runs unattended.
- 1Collect labelled images by teleoperating the scene
Drive the arm through the success state and the failure state, dumping frames into one pickle per label. AutoEval used roughly 1000 images per scene, under ten minutes of teleoperation.
bashpython scripts/teleop.py --ip <ROBOT_IP> --log_type pkl \ --log_dir ~/datasets/record-open_drawer.pkl python scripts/teleop.py --ip <ROBOT_IP> --log_type pkl \ --log_dir ~/datasets/record-close_drawer.pkl - 2Fine-tune PaliGemma as a yes/no VQA head
The question is closed-set and scene-specific: 'is the drawer open?', 'is the eggplant in the sink or in the basket?'. It is not a general 'did it succeed?' judge.
bashhuggingface-cli login # paligemma is a gated repo python scripts/ft_paligemma.py --working_dir ~/datasets/ --dataset_type drawer - 3Score it on a held-out set before you trust it
AutoEval evaluated on roughly 100 held-out images and only deployed a classifier above 95 percent accuracy. Below that, collect more data.
bashpython scripts/ft_paligemma.py --working_dir ~/datasets \ --model_id ~/datasets/checkpoints/... --eval - 4DAgger the classifier on its own mistakes
Run an evaluation with data saving on, relabel the frames the classifier got wrong, retrain. This is where most of the accuracy comes from.
bashpython run_eval.py --save_classifier_data python scripts/filter_images.py --input_folder ~/auto_eval_log/... \ --output_folder ~/datasets/ - 5Run the unattended evaluation
With a working classifier and a reset policy the station scores rollouts on its own. AutoEval cut human evaluator time by more than 99 percent.
bashpython run_eval.py --robot_ip <ROBOT_IP> \ --config scripts/configs/eval_config.py:open_drawer \ --policy_server_ip <POLICY_SERVER_IP> \ --policy_server_port <POLICY_SERVER_PORT>
The honest part of that paper is the error accounting. The authors walked through all 50 episodes of one AutoEval run on the "put eggplant in blue sink" task with the Open-pi0 policy. Three of the 50 produced a wrong result, in each case because the episode was misclassified as a success and the reset policy had failed. Motor failures were more frequent but get re-run automatically rather than scored. Aggregated over five tasks, six generalist policies and 50 rollouts per policy per task, agreement with human-run evaluation was a Pearson r of 0.942 and an MMRV of 0.015.
| Detector | What it scores | Reported number | Where it was measured |
|---|---|---|---|
| AutoEval classifier, PaliGemma-3B per scene | One closed-set yes/no question about the current frame | Deployed only above 95 percent accuracy on about 100 held-out images | 3 scenes, 5 tasks, WidowX arms, arXiv 2503.24278, March 2025 |
| AutoEval end to end vs human-run evaluation | Policy ranking, not absolute rates | Pearson r 0.942, MMRV 0.015; 3 of 50 trials mis-scored on the sink scene | 6 policies, 5 tasks, 50 rollouts per policy per task, same paper |
| GVL-SD zero-shot | The whole trajectory, via value-order correlation thresholded at 0.5 | accuracy 0.71, precision 0.71, recall 0.71 | 6 simulated bimanual ALOHA tasks, roughly half successes, arXiv 2411.04549, Nov 2024 |
| GVL-SD one-shot | Same, with one in-context example | accuracy 0.75, precision 0.85, recall 0.70 | Same table |
| SuccessVQA baseline in that table | The full video sequence, posed to the VLM as one visual question | accuracy 0.62, precision 0.33, recall 0.73 | Same table |
| Sentinel | Failure, not success: action inconsistency plus a VLM progress check | Detects 18 percent more failures than either half alone | Diffusion policies, sim and real, arXiv 2410.04640, CoRL 2024 |
AutoEval's numbers are for one drawer, one sink and one cloth, each with its own thousand labelled images and its own question string. They say nothing about your drawer. For a scene you have not labelled, the zero-shot row is the relevant one, and 0.71 precision means roughly three in ten of its yes answers are wrong. Budget a labelling day, not a prompt.
The false positive tax
A judge that is wrong 10 percent of the time does not add 10 percent of noise. It adds bias, in a predictable direction. If the true success rate is p and the judge has sensitivity s and specificity t, the rate you observe is s*p + (1-t)*(1-p). Two lines of arithmetic, and it changes how you read every automated leaderboard.
def observed(p_true, sensitivity, specificity):
"""What an imperfect judge reports when the real success rate is p_true."""
return sensitivity * p_true + (1.0 - specificity) * (1.0 - p_true)
# The gap between two policies is scaled by Youden's J = sensitivity + specificity - 1
for s in (0.99, 0.95, 0.90, 0.80, 0.71):
j = 2 * s - 1
print(f"sens=spec={s:.2f}: a true 10 point gap is measured as {j * 10:.1f} points")| True success rate | Judge at 0.99/0.99 | 0.95/0.95 | 0.90/0.90 | 0.80/0.80 |
|---|---|---|---|---|
| 20 percent | 20.6 | 23.0 | 26.0 | 32.0 |
| 40 percent | 40.2 | 41.0 | 42.0 | 44.0 |
| 60 percent | 59.8 | 59.0 | 58.0 | 56.0 |
| 80 percent | 79.4 | 77.0 | 74.0 | 68.0 |
Read the columns rather than the rows. A symmetric judge pulls every number toward 50 percent: weak policies look better than they are, strong ones look worse, and the gap shrinks by exactly Youden's J. At 0.90 sensitivity and specificity a real 10 point improvement shows up as 8 points. At the 0.71 GVL-SD reports zero-shot it shows up as 4.2, smaller than the sampling noise of a 50-rollout evaluation. You would be measuring your judge, not your policy.
This is why the false positive direction deserves more attention than the false negative one. A false negative costs you a rollout. A false positive tells you a broken checkpoint is fine, and you ship it. If you can only tune one threshold, tune for precision.
Runtime monitors answer a different question
Two lines of work get filed under success detection and should not be. They are worth running, just not worth averaging.
- Sentinel (CoRL 2024) splits failure into erratic behaviour, caught with a statistical measure of temporal action consistency at negligible compute cost, and task-progression failure, caught with a VLM. Combining the two detects 18 percent more failures than either alone, and it is built to warn mid-rollout, not to score afterwards.
- SAFE (NeurIPS 2025) reads the last-layer features of a vision-language-action model and emits one scalar failure likelihood, tested on OpenVLA, pi0 and pi0-FAST, with functional conformal prediction calibrating the threshold. Its headline metric is ROC-AUC over rollouts, a detector metric rather than a policy metric.
- Both are the right tool for stopping a rollout before the arm knocks something over. Neither produces a number comparable to a published success rate, because neither measures task completion.
How many rollouts you actually need
Even a perfect judge leaves a binomial sampling problem, and robot evaluations run in the regime where that problem dominates. The Clopper-Pearson interval is the conservative default; here it is on an observed 70 percent success rate at several trial counts.
from scipy.stats import beta
def clopper_pearson(k, n, alpha=0.05):
lo = 0.0 if k == 0 else beta.ppf(alpha / 2, k, n - k + 1)
hi = 1.0 if k == n else beta.ppf(1 - alpha / 2, k + 1, n - k)
return lo, hi
for n in (10, 20, 30, 50, 100, 200, 500):
k = round(0.7 * n)
lo, hi = clopper_pearson(k, n)
print(f"n={n:4d} observed 70.0% 95% CI [{lo*100:5.1f}, {hi*100:5.1f}]")| Rollouts | Observed | 95 percent Clopper-Pearson interval | Width | Fisher exact p for 80 vs 70 percent, n per arm |
|---|---|---|---|---|
| 10 | 70.0 percent | 34.8 to 93.3 | 58.6 pp | 1.000 |
| 20 | 70.0 percent | 45.7 to 88.1 | 42.4 pp | 0.716 |
| 30 | 70.0 percent | 50.6 to 85.3 | 34.7 pp | 0.552 |
| 50 | 70.0 percent | 55.4 to 82.1 | 26.7 pp | 0.356 |
| 100 | 70.0 percent | 60.0 to 78.8 | 18.7 pp | 0.141 |
| 200 | 70.0 percent | 63.1 to 76.3 | 13.1 pp | 0.028 |
| 500 | 70.0 percent | 65.8 to 74.0 | 8.2 pp | 0.0003 |
The STEP paper (Sequential Testing for Efficient Policy Comparison), from Toyota Research Institute and Princeton, is the most useful practical treatment. It starts from the constraint everyone works under, a feasible sample size of about 10 or 50 trials. On its bimanual FoldRedTowel task the two policies sat at 56 and 92 percent, a 36 point gap, and STEP stopped after 19 to 23 of the 50 available trials depending on the budget it was configured for. On the CarrotOnPlate comparisons, where the gaps were 59 against 68 percent and 68 against 76, the paper estimates 500 trials per policy would be needed to call a winner at the standard significance level. Against state-of-the-art sequential baselines it cuts the required trials by up to 32 percent.
You run 20 rollouts, the new checkpoint is ahead by a nose, so you run 20 more. That is p-hacking, and it inflates your false positive rate no matter how careful the rest of the protocol was. Either fix the trial count before you start, or use a sequential test designed to let you stop early. STEP exists because the temptation is universal. The same applies to re-labelling a rollout after you see which policy produced it.
Why two published success rates rarely compare
Put the pieces together and the reason is mechanical rather than mysterious. Seven independent knobs sit between a rollout and a percentage, and papers usually report none of them in the table caption.
| Knob | What it changes | A concrete instance |
|---|---|---|
| The success predicate | The definition of done | SIMPLER counts a 2 cm lift held 5 frames, and by default still passes a put-down afterwards |
| The reduction rule | Whether a mid-episode success latches | lerobot_eval.py marks an episode successful if is_success was ever true, using an any over the masked steps |
| The episode horizon | How much time the policy gets | libero_goal is capped at 300 steps plus 10 settling steps in the OpenVLA script |
| The trial count | The width of the error bar | 50 rollouts at 70 percent is 55.4 to 82.1 percent |
| The initial state distribution | How hard each individual trial is | SIMPLER's drawer task scores MMRV 0.027 under visual matching and 0.235 under variant aggregation for the same checkpoints |
| The instrument | Who or what decides | A human rater, a scene predicate, or a VLM judge at 0.71 precision |
| The fork | Action decoding and environment version | SimplerEnv has several public branches with different policy adapters, and its ManiSkill3 Bridge port runs 10 to 15 times faster than the ManiSkill2 one |
The most interesting response is to stop reporting absolute rates at all. RoboArena crowd-sources evaluation across a network of labs on DROID hardware, lets each evaluator pick their own task and scene, and requires only that comparisons be double-blind and pairwise. From more than 600 pairwise real-robot episodes across seven generalist policies at seven institutions, the aggregated preference ranking tracked real performance better than centralised evaluation did.
SIMPLER attacks the same problem from the simulation side, and its real-world reference numbers were not cheap: on the Google Robot setup, 75 pick-coke-can, 60 move-near, 54 drawer and 27 open-drawer-then-place-apple trials per policy across six open-source checkpoints, plus 24 real trials per Bridge task. Against those, visual matching reports a Pearson r of 0.976 with MMRV 0.031 on pick-coke-can and 0.942 with MMRV 0.027 on the drawer tasks. Good correlations for ranking, and still not a licence to quote a simulation percentage as a real-world one. If simulation is where you want to spend effort, the GPU simulation stack is a separate discussion.

Two ways to get a scored rollout
You own the whole loop: hardware, GPU, serving, and the judge. In simulation the environment gives you a success bit for free. On a real arm you get nothing, so you record rollouts as a LeRobot dataset and score them afterwards.
# lerobot[evaluation] is the eval framework only; the environment and policy
# extras are separate, so a pusht eval needs the pusht extra as well.
pip install -e '.[evaluation,pusht]'
# Simulation: the env supplies info["is_success"], lerobot-eval reports pc_success
lerobot-eval --policy.path=lerobot/diffusion_pusht --env.type=pusht \
--eval.n_episodes=50 --policy.device=cuda
# Real SO-100: no success bit exists. Record the rollouts, score them later.
lerobot-rollout \
--strategy.type=episodic \
--policy.path=user/my_policy \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--teleop.type=so100_leader \
--teleop.port=/dev/ttyACM1 \
--dataset.repo_id=user/rollout_episodic_data \
--dataset.num_episodes=20 \
--dataset.single_task="Grab the cube"- You still have to write the predicate, label a few hundred frames, and train the classifier if you want it automated.
- Repo names for rollout recordings must start with
rollout_, which keeps eval data from being mistaken for training data. - Budget the reset as seriously as the rollout. AutoEval LoRA fine-tuned OpenVLA on 50 to 100 teleoperated reset demonstrations per scene, and deployed only reset policies above 95 percent success.
The platform removes the parts around the measurement, not the measurement itself. You pick a model and a dataset on the training page, the backend rents a GPU on a spot market by required VRAM and writes checkpoints to object storage, and /api/inference/pod provisions a pod that serves the policy back to your robot client. Pods carry an idle watchdog and destroy themselves, so a forgotten evaluation session does not bill silently.
| Step | What you do | What is handled for you |
|---|---|---|
| Record | Drive the arm, record episodes with the desktop client from /download | LeRobot-format dataset with camera streams and joint states |
| Train | Pick model, dataset and hyperparameters | GPU rented by VRAM tier, trainer run, checkpoints stored |
| Serve | Point the robot client at the pod | Pod provisioning and idle shutdown |
| Score | Write the criterion, watch or classify the rollouts | Nothing. This part is yours. |
Where the platform does help is upstream of your own runs: the Arena lists 85 VLA models with 332 benchmark results and links every value to the paper or model card it came from, which is the practical way to check what predicate was behind a number. And the failure-mode pages cover what gets mislabelled as a low success rate when it is really a setup bug.
A scoring protocol you can run on an SO-100 this week
None of this needs a research budget. It needs writing things down before you run them, which is the part that gets skipped.
- 1Write the predicate in one sentence, before the first rollout
Not 'picks up the cube'. Something a stranger could apply from the video alone: 'the cube is off the table and inside the gripper when the episode ends'. If you cannot write it in one sentence, you have a demo, not a task.
textSUCCESS: at the final frame, the cube is fully inside the jaws and its lowest point is above the table surface. FAILURE: anything else, including a lift followed by a drop. VOID: the arm never moved because the port was wrong (re-run, do not score). - 2Fix the initial states and their order
Twenty numbered start positions marked on tape, in a seeded order identical for every checkpoint you compare. Most apparent policy differences are differences in which start poses got drawn.
pythonimport random rng = random.Random(1000) # lerobot's default seed, for what it is worth order = list(range(1, 21)) rng.shuffle(order) print(order) # use this exact order for every checkpoint - 3Record every rollout, do not score live
Live scoring is where rater drift enters. Record first, score later, from video, with the checkpoint name hidden.
bashlerobot-rollout --strategy.type=episodic \ --policy.path=user/my_policy \ --robot.type=so100_follower --robot.port=/dev/ttyACM0 \ --dataset.repo_id=user/rollout_eval_run7 \ --dataset.num_episodes=20 --dataset.single_task="Grab the cube" - 4Label twice and measure your own agreement
Have two people label the same clips independently and compute agreement before you trust any automated judge. If two humans disagree on 8 of 50 clips, no classifier trained on one person's labels will beat that.
pythonfrom sklearn.metrics import cohen_kappa_score print(cohen_kappa_score(labels_alice, labels_bob)) # below about 0.8 means the predicate is ambiguous, not that the raters are careless - 5Only then automate, and report both numbers
Calibrate the classifier against the human labels on the same clips, report its sensitivity and specificity beside the success rate, and keep the human labels for the runs that matter.
textACT ckpt-40000: 68% (34/50) auto-scored judge: sens 0.93 / spec 0.90 on 50 human-labelled clips 95% CI on the raw count: 53.3 to 80.5 percent
- It runs overnight. AutoEval cut human evaluator time by more than 99 percent, the difference between evaluating four checkpoints and forty.
- The criterion is written down and version-controlled instead of living in a rater's head, so a run from March is still comparable in August.
- It removes the strongest source of drift in long sessions: a tired human getting more generous after rollout 60.
- The same classifier can filter training data, not just score evaluations, which is what GVL was built for.
- It is per-scene. Roughly 1000 labelled images plus a DAgger round bought AutoEval one drawer, and it does not transfer to your drawer.
- It biases the leaderboard toward the middle. At 0.90/0.90 a true 10 point gap reads as 8 points, at 0.71 it reads as 4.2.
- Reset is the harder half. AutoEval's mis-scored trials were false positives caused by reset failures, not by the classifier.
- You maintain a second model. Move the camera 5 cm and the judge degrades silently, moving the success rate for no policy reason.

Where this platform does not help
AY-Robots has no automatic success detection. There is no scoring endpoint, no built-in classifier, no success column that fills itself in. Training, GPU rental, checkpoint storage and pod-based serving are handled; deciding what counts as done is not.
First, latency. Remote inference over the public internet adds round trips on top of a control loop that already costs 20 to 485 ms per action step depending on the model, so a policy that scores well when the GPU sits next to the servos can score badly when it does not. That is a measurement artefact, not a policy difference, and it lands in your success rate. Second, an automated judge tells you a rollout failed but not why. For that, work through the setup-dependence and loss-falls-but-nothing-moves pages, or the training docs.
If you have not run a policy on hardware yet, the first-policy walkthrough is the shorter path, and recording a dataset comes first. Data quality sets the ceiling your success rate is measured against, covered in the data collection guide. And ACT at 20 ms and SmolVLA at 245 ms per action step behave very differently under a fixed step budget: see ACT on SO-100 and GR00T N1.7 on SO-100.
Train the checkpoint you are about to score
Pick a model and an arm and get the exact guide: GPU tier, dataset format, the defaults the trainer really sends, and what a run costs on the spot market.
Open the training matrixCan a VLM score my rollouts zero-shot, without any labelling?▾
Roughly, and worse than you would like. GVL-SD, which prompts a frozen Gemini-1.5-Pro over shuffled frames and thresholds the value-order correlation at 0.5, reports accuracy, precision and recall of 0.71 zero-shot on six simulated bimanual ALOHA tasks; with one in-context example precision rises to 0.85. The SuccessVQA baseline in that table sits at 0.33 precision. Zero-shot judging is fine for filtering a training set, not for ranking two checkpoints 10 points apart.
How many rollouts do I need to say one checkpoint is better than another?▾
More than you are running. With 50 rollouts per arm, 80 percent versus 70 percent gives a Fisher exact p of about 0.36; you need around 200 per arm to get below 0.05. The STEP paper measured 8 to 9 point gaps on real hardware and estimated 500 trials per policy to call them at the standard significance level, an order of magnitude beyond current practice. That is the argument for sequential testing, or for reporting rankings instead of absolute rates.
Why does the same checkpoint get different success rates in different papers?▾
Seven things vary independently: the success predicate, the rule reducing per-step flags to one bit per episode, the episode horizon, the trial count, the initial state distribution, who or what scores, and which fork of the benchmark was used. SIMPLER's own drawer task scores MMRV 0.027 under visual matching and 0.235 under variant aggregation for the same checkpoints. Neither is wrong; they are different measurements.
Does AY-Robots score rollouts automatically?▾
No. The platform records datasets, trains on rented cloud GPUs and serves the trained policy back to the robot through an auto-provisioned pod with an idle watchdog. There is no automatic success detection and no scoring endpoint. The Arena at /arena is the closest thing: 85 models and 332 published benchmark results, each linked to its source so you can check the criterion behind it.
Is a failure detector like Sentinel or SAFE the same as a success detector?▾
No, and mixing them corrupts a leaderboard. Sentinel monitors temporal action consistency plus VLM-judged progress and detects 18 percent more failures than either half alone; SAFE reads a VLA's last-layer features and outputs a scalar failure likelihood scored by ROC-AUC, its threshold set by conformal prediction. Both exist to abort a bad rollout early. Neither answers whether the task was completed.
What is the single cheapest improvement to my evaluation?▾
Fix the initial states and their order, and use the identical seeded order for every checkpoint you compare. It costs nothing and removes the largest uncontrolled variable in a small-sample evaluation. At 20 trials the 95 percent Clopper-Pearson interval around an observed 70 percent runs from 45.7 to 88.1 percent, so two runs of the same checkpoint can differ by double digits with nothing changing but the draw.
Sources
- Evaluating Real-World Robot Manipulation Policies in Simulation (SIMPLER), Li et al., arXiv, 9 May 2024
- SimplerEnv repository: visual matching and variant aggregation setups, the ManiSkill3 Bridge port, MMRV and Pearson helpers in tools/calc_metrics.py
- ManiSkill2_real2sim: grasp_single_in_scene.py, the grasp and lift success predicate
- ManiSkill2_real2sim: move_near_in_scene.py, the four-condition move-near predicate
- AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World, Zhou et al., arXiv, 31 March 2025
- AutoEval repository: PaliGemma success classifier training, reset policy, run_eval.py
- Vision-Language Models as Success Detectors (SuccessVQA), Du et al., arXiv, 13 March 2023
- Vision Language Models are In-Context Value Learners (GVL), Ma et al., arXiv, 7 November 2024, Table 2 is the success-detection comparison
- Unpacking Failure Modes of Generative Policies: Runtime Monitoring of Consistency and Progress (Sentinel), Agia et al., CoRL 2024
- SAFE: Multitask Failure Detection for Vision-Language-Action Models, Gu et al., NeurIPS 2025
- Is Your Imitation Learning Policy Better than Mine? Policy Comparison with Near-Optimal Stopping (STEP), Snyder et al., RSS 2025
- RoboArena: Distributed Real-World Evaluation of Generalist Robot Policies, Atreya et al., arXiv, 22 June 2025
- LeRobot: lerobot_eval.py, the is_success any-reduction and the pc_success metric
- LeRobot docs: Adding a New Benchmark, the info["is_success"] contract
- OpenVLA: run_libero_eval.py, per-suite max_steps and 50 trials per task
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started