Preflight Generalisation Ledger
Preflight · SO-101 · MuJoCo twin · updated 18 Oct 2026, 15:30 AEDT

Fifteen attempts to make a GR00T arm policy generalise. Two passed the gate; a new task can be taught, but not for free.

Every candidate runs the same six suites (12 scenes × 8 perturbed rehearsals, seed 42) and is compared with v5 scene by scene (paired McNemar). It is promoted only with a pooled gain and no suite significantly worse, a gate fixed before the first round was scored. Everything is simulation; the physical arm has not arrived.

483 / 576DAgger round 3, promoted (served)
438 / 576v5 baseline
61 / 96held-out objects, DAgger r3 (was 47–54)
6 → 86 / 96new task (basket) after 400 demos; the held-out ring stayed 0
0–1 / 50so101-benchmark, every policy

Scoreboard

DAgger rounds 2 and 3 each cleared the gate: 464, then 483 on the retrain (the first round-3 run scored 481). Rounds 4 and 5, with RL-expert recoveries at ×8 and ×2, dropped back to 471 and 455. Real co-training (v9) loses 65; FLUX, trained on the same demos for the same volume, collapses. Since then, calibrated co-training (v11) is neutral at 472, failure-state synthesis falls to 437, and Autopilot's first cycle (441) traded stacking for a new task. Colours compare with v5; only the gate decides promotion.

v5438v6 targeted demos421DAgger r1436DAgger r2464DAgger r3481v9 real co-training373DAgger r3 retrain483DAgger r4 (RL recoveries)471DAgger r5 (RL x2)455FLUX LoRA (fair)50v11 calibrated cotrain472Failure synthesis (r6)437Autopilot 1: multi-task441v5 = 438of 576

Where round 2 gained

Better on five of six suites, significant on one; held-out objects did not move.

Grey dot is v5, coloured dot is round 2. The labels count scenes where only one checkpoint succeeded.

40608096held_out_objects+12/−14 p=0.85seen_vocabulary+8/−7 p=1.0clean_many+7/−2 p=0.18clean_top_down_many+6/−4 p=0.75real_1_pomade_tin_many+14/−2 p=0.004in_path_pomade_tin_many+13/−5 p=0.1

How it fails

Two DAgger rounds cut no_contact from 57 to 24. Holding rose from 4 to 18 in round 2 and eased to 13 in round 3: the policy grasps but does not always let go on target.

Each bar is one checkpoint's failures, split by the label FailureWatch assigns. FLUX fails four times as often, mostly without touching the block.

v557342411138 failedDAgger r1454033139140 failedDAgger r233312618112 failedDAgger r324321713995 failedDAgger r3 retrain1835221393 failedDAgger r439192517105 failedDAgger r528323919121 failedFLUX LoRA358115526 failedv11 cotrain31262417104 failedSynthesis (r6)3534332412139 failedAutopilot 13534342110135 failedno_contactpusheddroppedholdingfell_offknocked_place

The DAgger loop

Each round rolls the current policy out, snapshots each failure, keeps the most uncertain within a balanced budget, and lets the scripted expert record a recovery from that exact state. Recoveries are weighted ×8 in training from round 2 on.

flowchart LR
  P["current policy"] -->|800 rollouts| F["failure snapshots"]
  F -->|"uncertainty band 5–80%, budget per type"| K["kept states"]
  K -->|scripted expert| R["recoveries"]
  R -->|"×8 + base demos"| T["fine-tune 4k steps"]
  T --> B["6 suites × 96 vs v5"]
  B -->|"pooled gain, no suite worse"| P
  

Each round the policy fails less and the script rescues only about 40% of kept states, so recoveries shrank 85 → 72 → 59. Rounds 4 and 5 swapped in the residual RL expert, which recovered 88 of 120 and 72 of 113, but the policy got worse.

Round 1 (v5)80045633020785Round 2 (v5)80049429618972Round 3 (r2)80057419714659Round 4 (r3, RL expert)80061416512088Round 5 (r3, RL x2)80061016011372rolloutssucceededrecoverablekeptexpert recovered

FLUX predicts well and acts badly

Open-loop the LoRA beats holding the pose three to one at 32 steps; closed-loop it succeeds 50 times in 576.

Mean action error on 60 held-out demo frames, each fed its 7 preceding frames. The quantile bridge sits inside this loop both ways, so the mapping is not the problem.

049fair LoRAzero-shot FLUXhold posesteps aheadmean |action error|

An RL expert to recover what the script cannot

A residual policy on top of the scripted expert recovers 74.0% of held-out failure snapshots; the expert alone recovers 45.9%.

Recovery from DAgger failure states the policy never trained on (W&B run fb6yv89f), with fresh scenes still at 100%. Shaped PPO from scratch stays near 6% training success and is not shown. The next DAgger round records recoveries with this expert.

050100scripted expert alone: 45.9%residual PPO on the scripted expertthousand env stepsheld-out recovery %

Autopilot: the loop that trains on what Preflight refuses

The first cycle taught a task the policy had never seen, 6 → 86 of 96, and transferred nothing to the task it held out (ring, 0 → 0). It also cost stacking (clean_many 88 → 76, real_1_pomade_tin 87 → 68), so the gate discarded it.

Every scene Preflight won't clear becomes a learning request. Autopilot ranks a fixed menu of tested recipes by the failures each could win back. Requests from real refusals rank first. Nemotron on Token Factory picks one of the top three; it never scores the result. The paired gate G3 judges it, and a human approves promotion. After cycle 1, Nemotron's proposed ring round was dropped as overtaken by the evidence. Cycle 4, a DAgger round answering four Preflight refusals, was discarded: no gain on new objects and both real-object suites worse. Live on the Autopilot Space.

flowchart LR
  PF["Preflight: RETRY / ASK_HUMAN"] -->|learning request| AP["Autopilot: rank menu"]
  BM["benchmark of served policy"] --> AP
  AP -->|top 3 eligible| N["Nemotron picks one"]
  N --> T["train on the A100"]
  T --> G{"G3: target gain, no suite worse"}
  G -->|pass| H["human approves"] --> PF
  G -->|fail| L["ledger: DISCARD / KEEP"]
  

Every experiment, with its verdict

DAgger round 2, recoveries ×8Pooled 464 vs 438, no suite worse. Served until round 3.
Kept
DAgger round 1436 vs 438. Recoveries were 3.5% of training, too diluted to matter.
DAgger round 3Retrained from the kept recoveries: 483 vs round 2's 464, pooled better, no suite worse; now served. The first run scored 481 with held_out_objects 61 (p=0.043); the retrain 57, above round 2 in both runs.
Kept
DAgger round 4, RL expert records recoveriesThe residual RL expert recovered 88 of 120 kept failure states (73%, vs the script's 40%), but the candidate scored 471 vs 483 (within noise) and no_contact rose from 18 to 39.
Rejected
DAgger round 5, RL recoveries weighted ×272 of 113 recovered; 160 RL recoveries at ×2 beside the scripted ×8. 455 vs 483 and held_out_objects 41 vs 57 (p=0.004): the RL-recovery line is closed.
Rejected
FLUX 3 Action LoRA (fair)Same 800 demos, same sample volume: 50 vs 438, worse on every suite (p < 0.001), 0/7 externally. Executing 16 instead of 32 actions per chunk did not help.
Kept
FLUX, current frame + absolute targetsSame demos at a quarter of the budget, action heads re-initialised: held_out_objects 21 vs 3 (p<0.001), clean_many 15 vs 9. The self-history and deltas caused most of the collapse; still far below round 3.
Flat
Targeted demos (v6)Staged-mistake recoveries plus lookalike decoys: 421 vs 438, within noise.
Rejected
Visual domain randomisation (v7)Lifts the Seeed wrist-mount scenes 15 → 53 but drops clean_many 81 → 58; 1/50 on so101-benchmark.
Kept
RL expert (residual PPO)74.0% held-out snapshot recovery vs the scripted expert's 45.9%. Plain PPO stopped at 1% after its reward paid hovering; shaped PPO from scratch stays near 6%.
Flat
Best-of-8 chunk consensusMedoid of 8 flow-matching samples on round 2: held_out_objects 55 vs 50 (p=0.41), clean_many 87 vs 86. Within noise at 8× inference cost.
Flat
DiVeR verifier, best-of-8 on round 3Trained on 300 round-3 rollouts, it ranks held-out steps at AUC 0.79, yet picking with it scores held_out_objects 54 vs 57 (p=0.66) and clean_many 85 vs 88. Best-of-N is closed.
Rejected
Real-data co-training (v9)400 ArmnetBench SO-101 teleop demos of new objects at 23% of samples: 373 vs 438, held_out_objects 48 vs 52 (no gain), significantly worse on three suites, 0/50 externally.
Kept
Calibrated co-training (v11)Joint offsets fitted to the twin cut real frames under the table from 99.7% to 4.2%. Round 3 with 87 calibrated block-stacking episodes at 9%: 472 vs 483, every suite within noise. Neutral in the twin; kept for the real arm.
Rejected
Failure-state synthesis (round 6)Expert recoveries recorded from jittered failure states: 437 vs 483, worse on held_out_objects (43), clean_many (76) and real_1_pomade_tin (75). The policy does not need recoveries from states it never reaches.
Rejected
Autopilot cycle 1: multi-task round, ring held out400 basket demos in 5 phrasings: basket 6 → 86/96 (+82/−2), ring 0 → 0. Stacking 441 vs 483, clean_many and real_1_pomade_tin significantly worse. Gate G3 discarded it.
Rejected
Autopilot cycle 4: DAgger round 7, answering Preflight's refusalsChosen by Nemotron for the objects and environments axes: 32 of 123 kept failure states recovered (26%). 461 vs 483; held_out_objects 59 (within noise) but both pomade-tin suites significantly worse. DAgger is near saturation on these failure modes.

What is not established