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.

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.
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
In the loop of 2026-10-29, the policy placed 0 of 50 held-out cubes at generation 0, then 12, 24, 33, 38, 40 and 40. In the loop of 2026-10-30, with its motion tuned too, it placed 0, 12, 24, 35, 42, 43 and 46.
Os números
| Generation | Loop of 2026-10-29 | Loop of 2026-10-30 |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 12 | 12 |
| 2 | 24 | 24 |
| 3 | 33 | 35 |
| 4 | 38 | 42 |
| 5 | 40 | 43 |
| 6 | 40 | 46 |
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
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.
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.