The AY-Robots Arena leaderboard showing a sortable table of 85 vision-language-action models with 332 benchmark results, each value linked to its source paper or model card
evaluationsuccess detectionbenchmarksvision-language-actionrobot learning

Automatic Success Detection for Robot Policy Rollouts

AY-Robots ResearchAugust 23, 202621 min read

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.

MechanismWorks onWhat it actually checksCharacteristic failure
Scene predicate in a simulatorSimulation onlyGeometric state: object height, distance between poses, contact impulses, joint anglesPasses on a state the task designer never intended, or fails a state a human would accept
Human scorer watching the arm or the videoReal and simWhatever the rater has in mind that sessionDrifts between raters and across a long session; nobody logs the criterion
Learned classifier over camera framesReal and simOne closed-set question about an image, or a progress curve over the clipConfident yes on a near miss; no transfer to a scene it was not trained on
Runtime monitor on policy internalsReal and simWhether the policy is behaving consistently and making progressAnswers 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.

python
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)
SIMPLER's grasp success predicate, from grasp_single_in_scene.py. Four magic numbers, one latching variable, and a comment that changes the meaning of the metric.

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.

The success that ends on the table

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.

python
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 steps
Episode budgets from experiments/robot/libero/run_libero_eval.py in the OpenVLA repository. A policy that would have finished libero_goal at step 320 is scored as a failure.

That 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.

The AY-Robots policy comparison table listing the five trainable policies with parameter count, required GPU, inference latency per action step and minimum episode count
The table on /policies. Under a fixed step budget the latency column is the one that misleads: every policy gets the same number of steps, not the same number of seconds.

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.

bash
# 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=cuda
The usage example from lerobot_eval.py. There is no real-robot equivalent, because there is no is_success on real hardware.

So 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.

  1. 1
    Collect 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.

    bash
    python 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
  2. 2
    Fine-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.

    bash
    huggingface-cli login   # paligemma is a gated repo
    python scripts/ft_paligemma.py --working_dir ~/datasets/ --dataset_type drawer
  3. 3
    Score 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.

    bash
    python scripts/ft_paligemma.py --working_dir ~/datasets \
        --model_id ~/datasets/checkpoints/... --eval
  4. 4
    DAgger 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.

    bash
    python run_eval.py --save_classifier_data
    python scripts/filter_images.py --input_folder ~/auto_eval_log/... \
        --output_folder ~/datasets/
  5. 5
    Run 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.

    bash
    python 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.

DetectorWhat it scoresReported numberWhere it was measured
AutoEval classifier, PaliGemma-3B per sceneOne closed-set yes/no question about the current frameDeployed only above 95 percent accuracy on about 100 held-out images3 scenes, 5 tasks, WidowX arms, arXiv 2503.24278, March 2025
AutoEval end to end vs human-run evaluationPolicy ranking, not absolute ratesPearson r 0.942, MMRV 0.015; 3 of 50 trials mis-scored on the sink scene6 policies, 5 tasks, 50 rollouts per policy per task, same paper
GVL-SD zero-shotThe whole trajectory, via value-order correlation thresholded at 0.5accuracy 0.71, precision 0.71, recall 0.716 simulated bimanual ALOHA tasks, roughly half successes, arXiv 2411.04549, Nov 2024
GVL-SD one-shotSame, with one in-context exampleaccuracy 0.75, precision 0.85, recall 0.70Same table
SuccessVQA baseline in that tableThe full video sequence, posed to the VLM as one visual questionaccuracy 0.62, precision 0.33, recall 0.73Same table
SentinelFailure, not success: action inconsistency plus a VLM progress checkDetects 18 percent more failures than either half aloneDiffusion policies, sim and real, arXiv 2410.04640, CoRL 2024
A per-scene classifier is not a general judge

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.

python
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")
Run this before you trust a ranking that was produced by a classifier.
True success rateJudge at 0.99/0.990.95/0.950.90/0.900.80/0.80
20 percent20.623.026.032.0
40 percent40.241.042.044.0
60 percent59.859.058.056.0
80 percent79.477.074.068.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.

python
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}]")
Reproducible in ten seconds. The output is the table below.
RolloutsObserved95 percent Clopper-Pearson intervalWidthFisher exact p for 80 vs 70 percent, n per arm
1070.0 percent34.8 to 93.358.6 pp1.000
2070.0 percent45.7 to 88.142.4 pp0.716
3070.0 percent50.6 to 85.334.7 pp0.552
5070.0 percent55.4 to 82.126.7 pp0.356
10070.0 percent60.0 to 78.818.7 pp0.141
20070.0 percent63.1 to 76.313.1 pp0.028
50070.0 percent65.8 to 74.08.2 pp0.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.

The trap that eats a day: adding trials until it looks right

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.

KnobWhat it changesA concrete instance
The success predicateThe definition of doneSIMPLER counts a 2 cm lift held 5 frames, and by default still passes a put-down afterwards
The reduction ruleWhether a mid-episode success latcheslerobot_eval.py marks an episode successful if is_success was ever true, using an any over the masked steps
The episode horizonHow much time the policy getslibero_goal is capped at 300 steps plus 10 settling steps in the OpenVLA script
The trial countThe width of the error bar50 rollouts at 70 percent is 55.4 to 82.1 percent
The initial state distributionHow hard each individual trial isSIMPLER's drawer task scores MMRV 0.027 under visual matching and 0.235 under variant aggregation for the same checkpoints
The instrumentWho or what decidesA human rater, a scene predicate, or a VLM judge at 0.71 precision
The forkAction decoding and environment versionSimplerEnv 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.

The Find your combination matrix on the AY-Robots training page, with five policy models as rows and four robot arms as columns, each cell linking to a specific training guide
The matrix on /train. Each cell is a guide for one model and one arm, which is also the granularity at which a success criterion has to be written.

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.

bash
# 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"
Both forms are the usage examples in the lerobot CLIs themselves. Per src/lerobot/rollout/strategies/episodic.py the episodic strategy runs the policy for dataset.episode_time_s, then gives you dataset.reset_time_s to put the scene back; right arrow ends an episode early, left arrow discards and re-records it. No success flag is written.
  • 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.

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.

  1. 1
    Write 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.

    text
    SUCCESS: 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).
  2. 2
    Fix 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.

    python
    import 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
  3. 3
    Record every rollout, do not score live

    Live scoring is where rater drift enters. Record first, score later, from video, with the checkpoint name hidden.

    bash
    lerobot-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"
  4. 4
    Label 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.

    python
    from 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
  5. 5
    Only 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.

    text
    ACT 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
Automating the success bit
Advantages
  • 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.
Trade-offs
  • 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.
The AY-Robots failure-mode index listing common robot policy problems such as arm not detected, gripper does not close and policy only works in one setup, each linking to a fix page
Before blaming a low success rate on the policy, rule out the setup. The index on /fix covers the failure modes that produce a zero percent score with a perfectly good checkpoint.

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.

Two other honest limits

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 matrix
Can 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

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started