Self-improvement

Every run makes the next one better.

The policy acts, every attempt is recorded, a judge scores it, and the policy fine-tunes on its own best runs. Then it is tested on cubes it never saw.

An SO-101 arm in simulation lifts a white cube from a blue pad toward an orange pad; a translucent blue copy of the arm shows where its policy plans to be half a second later.
Recorded in the workbench: the SO-101 arm in the shipped pick-and-place world, in simulation.

One turn of the loop

The data is the runs themselves.

Each attempt is a simulated run of eval-pick-place/world.tsx. The dataset is read back from those run files, never from memory.

How the policy improves itselfThe policy acts in the simulated world with exploration noise. Each attempt is recorded as a run with its commands, its frames and its outcome. A rule judge with no model scores each attempt and writes a critique. The dataset is read back from the run files and weighted by the scores. The policy is fine-tuned on it, then judged on 50 held-out cubes with the same seeds every generation. The new policy acts next.Act64 attempts withnoiseRecordone simulated runeachJudgefacets, reward,critiqueFine-tuneweighted by thescoresEvaluate50 held-out cubesHow the policy improves itselfThe policy acts in the simulated world with exploration noise. Each attempt is recorded as a run with its commands, its frames and its outcome. A rule judge with no model scores each attempt and writes a critique. The dataset is read back from the run files and weighted by the scores. The policy is fine-tuned on it, then judged on 50 held-out cubes with the same seeds every generation. The new policy acts next.Act64 attempts with noiseRecordone simulated run eachJudgefacets, reward, critiqueFine-tuneweighted by the scoresEvaluate50 held-out cubes

Case study 1 · loop of 2026-10-29

From 0 to 40 of 50 cubes it never saw.

Six generations of 64 attempts each, every generation judged on the same 50 held-out cubes. The loop ran in 7 minutes on one core, with no paid service.

of 50 held-out cubes placed, generation 0 to 6
0 → 40
simulated runs recorded
742
dataset rows by generation 6, 153 of them passes
384
for all six fine-tunes together
under 1 s

Simulated

Held-out cubes placed after each generation
Os números
Held-out cubes placed after each generation
GenerationLoop of 2026-10-29Loop of 2026-10-30
000
11212
22424
33335
43842
54043
64046
ProvenanceFile cloud://global/worlds/eval-pick-place/world.tsxRun runs/loop-20261029082227Output case-studies/self-improvement/stats.jsonTool scripts/workbench/policy-loop.mjs, then scripts/sites/case-studies.mjs self-improvementRan on This computer (dell-gb10-1), one coreWhen

Case study 2 · loop of 2026-10-30

It got better, and smoother.

The second loop also weighs how the arm moves. Success rose to 46 of 50, and a pass got faster and gentler every generation.

of 50 held-out cubes placed at generation 6
46
for a pass, generation 1 to 6
9.92 → 9.35 s
rad/s³ of joint jerk, generation 1 to 6
295 → 110
for the whole loop, 742 runs
4 min 13 s

Simulated

Joint jerk of the held-out attempts, by generation
Os números
Joint jerk of the held-out attempts, by generation
GenerationJoint jerk
0543 rad/s³
1295 rad/s³
2217 rad/s³
3179 rad/s³
4164 rad/s³
5125 rad/s³
6110 rad/s³
ProvenanceFile cloud://global/worlds/eval-pick-place/world.tsxRun runs/loop-20261030113706Output case-studies/self-improvement/stats.jsonTool scripts/workbench/policy-loop.mjs --motion-ridge 0.4 --no-camerasRan on This computer (dell-gb10-1), one coreWhen

The same cube, six generations apart.

Held-out cube 900000 at generation 0 and at generation 6, as the judge (agent:feedback-judge, a rule judge with no model) wrote them in each run's conversation.

Every attempt here is a simulation. No real arm took part, and nothing on this page is physical evidence.

runs/20261029t082227z-9y8d and runs/20261029t082906z-u778, streams/chat@policy-loopreal records · simulated runs · 2026-10-29
08:22:28.262 note    agent:feedback-judge: Missed the grasp: the fixed jaw closed 20 mm from the cube's centre, 26 mm above it.
08:29:07.052 note    agent:feedback-judge: Clean pick and place in 9.0 s.

Give your robot a loop of its own.

Open the arm world, or run the loop on your computer with node scripts/workbench/policy-loop.mjs.