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.

Un brazo SO-101 en simulación levanta un cubo blanco de una base azul hacia una base naranja; una copia azul translúcida del brazo muestra dónde planea estar su política medio segundo después.
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
Los 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
ProcedenciaArchivo cloud://global/worlds/eval-pick-place/world.tsxEjecución runs/loop-20261029082227Resultado case-studies/self-improvement/stats.jsonHerramienta scripts/workbench/policy-loop.mjs, then scripts/sites/case-studies.mjs self-improvementSe ejecutó en This computer (dell-gb10-1), one coreCuándo

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
Los 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³
ProcedenciaArchivo cloud://global/worlds/eval-pick-place/world.tsxEjecución runs/loop-20261030113706Resultado case-studies/self-improvement/stats.jsonHerramienta scripts/workbench/policy-loop.mjs --motion-ridge 0.4 --no-camerasSe ejecutó en This computer (dell-gb10-1), one coreCuándo

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.