← back

maze

2026

RL in simulated physical environments

a simulated apartment where a general multimodal agent is given a body and an objective, to test whether the loop that works on a codebase (look, try something, read what came back, change your mind) also works on a physical environment it has never seen. a frozen agent/environment contract lets a learned policy, a symbolic planner and a frontier model drive the exact same body through the exact same interface, so the comparison means something. the environment, the task generator and the measurement came first; the agent comes second.

what the gap between a planner and a learned agent is made of

  • reinforcement learning
  • imitation learning
  • dagger
  • ppo
  • behaviour cloning
  • embodied agents
  • world models
  • test-time search
  • evaluation
  • procedural generation
  • python

the questionWhich part of the gap is which

A planner that reads the scene graph solves 94.4% of the suite. A learned agent that sees 64 range rays, a memory map and a goal vector solves far less. The question was never whether these apartments are solvable, it was which part of that gap is observation, which is data, which is optimisation, and which is the benchmark itself.

Every comparison below is paired: the same scene and task handed to both arms, bootstrap intervals, a sign test. Where I got something wrong, the retraction sits next to the claim.

contact sheet of five oracle rollouts
five tasks, oracle rollouts, one frame per event. this is the whole observation the agent gets: 64 rays by 18 channels at 12 fps, no depth buffer and no object list.
success weighted by path length: S is success, L* the oracle's step count, L the agent's
oraclereads the scene graphprivilegedthe ruler, not a rivallearned policy64 rays, map, goalcloned, then RLthe thing under studylanguage modelan image and a descriptionobjective in Englishthe hypothesis
three agents, one body, one action space
oracle94.4%RL over gaze30.2%DAgger, round 229.4%RL fine-tune28.6%longer clone24.0%first PPO14.6%first clone12.0%random1.0%
success on the standard suite, where things landed

failuresCounting instead of watching

It started with a replay: asked for the yellow bottle, the policy carried something else for 300 steps. One episode is an anecdote, so every eval episode went into exactly one bucket, crossing how it ended with what it had done.

Two readings reordered the work. Most of what RL added over its clone was fewer false DONEs, and the one bucket that grew from clone to RL was holding the wrong object. A tenth of the suite could not be solved by the oracle either, and that has to be netted out of any claim.

0:00 / 0:00
a live PPO rollout at 4x: pick up the brown sponge. it succeeds in 207 steps at spl 0.23, and at step 105 it grabs the white cup instead — the red chip on the track. the counter scores this as a success. watching it is the only way to see it carried the wrong object for half the episode.
timed out, wrong object26.0%timed out, did nothing26.0%success17.6%false DONE, did nothing11.8%oracle can't solve it10.8%
how the first PPO policy's 500 episodes ended

identificationIt could not tell objects apart

When a privileged policy and a learned one disagree wildly, suspect the observation before the learner. At the first grasp the policy took the target 33.6% of the time, against 33.0% for an agent picking blindly among what was in reach, and 74% of wrong grasps were a different type and colour. The goal named the object; nothing the agent saw carried either.

A sensor that labels what the rays hit got the agent to the right object more often and then it still picked blind. The fix was wiring: the goal and the per-ray labels only met after all 64 bearings were pooled, so I added a per-ray match against the target before pooling. Crowding the demonstrations did nothing on its own and only helped once the network could compute the comparison.

kitchen scenethe same apartment at night
two generated apartments: daylight, and an evening fixture at 3200K. the generator varies lighting and materials per seed, so an object's colour channel is not stable across scenes, and colour was most of what the policy had to go on.
two match channels per ray: the one-hot label of what ray k hit, dotted with what the goal asks for, before the bearings are pooled
observationencodersmemoryheadsquery+2 ch19212864 raysrange, two bandsidentity per raytype and colourgoalverb, type, colourproprioceptionheading, holdingper-ray matchbefore poolingconv over bearingsa ring, 64 to 8state MLP128, 128recurrent core256, rooms searchedpolicy8 actions or gazevalueown branch, ablatable
the policy network, and where the match goes in
sensor + match+19.0 p<.001sensor + match + crowd+16.9 p<.001sensor only+9.5 p=.02crowd + sensor+3.2crowded demos only-1.1
held the right object, points over matched control
identity sensorlabels each ray's hitreaches the right objectfirst grasp still blindsensor + matchper-ray match to the goal+19 on the right objectthe only arm beating blind
labelling what you see vs being able to compare it

dead endsWhat did not work, and what I over-claimed

The goal vector never named a room, so 93% of the clone's go-to episodes ended in a false DONE. A room sensor fixed nothing: the longer-trained clone fixed it without the sensor by learning never to call DONE on that verb at all. Sensors a clone has to learn to ignore cost more than they give.

RL fine-tuning learned to quit. In failed episodes trying cost about 15 in reward against 2 for quitting, so I built a reward where quitting is never cheaper, and it scored 28.4% against the shipped reward's 28.6% with neither policy quitting. The critic and the starting clone had also changed in that pair, so the arithmetic is consistent with the behaviour but not shown to cause it, and I have left the claim visible.

training runs with success rate, spl, return and episode length
four runs on one axis, including the no-shaping ablation. the ablation is the red line, and it is the one that did not separate.
the shipped reward: potential shaping on geodesic distance to the current subgoal
PPO from the clone, leashed to it by a KL term that halves every 600k steps; epsilon 0.2, gamma 0.995, lambda 0.95
keep trying60 failed attemptsabout -15 per episodesuccess +10 at ~20%call DONEone false claimabout -2cheaper in 88% of failures
why a weak agent's rational move is to give up
room sensor+7 goto, -10 findtarget memorybelow controlroute plannerbelow controlcrowded demos-0.3 alonedense gaze headbest loss, 22.2%greedy decoding12.8 vs 12.6
null to negative at the same training budget

gazeLook at the path, then walk

The agent hit walls, and people do not steer that way: gaze lands a step or two ahead and the body follows as a reflex. So the action became one of the 64 bearings in view, turned into movement by a fixed reflex, which means walking into a wall is not an action the policy has.

It changed the failure mode reliably and the failure rate only marginally. The dominant bucket for every strong agent is now search, never reaching the first subgoal, and a per-step reflex cannot fix that.

left / right / forward22.6% success7.6% collision frames9 episodes wedged31.8% never startedgaze target24.6% success4.7% collision frames0 episodes wedged27.6% never started
same demos, same training, different action space

free expertWhat you can do when the expert is free and the world resets

Robotics and LLM labs are bound by two facts: expert labels are expensive and the world does not reset. Here the expert is a scene-graph query and a reset is a copy of a document, so methods that are usually too costly become cheap.

DAgger, where the expert labels the states the learner actually reaches, took imitation alone past the best RL fine-tune. Rehearsal, trying the policy's top three actions in a snapshot before committing, doubled success on the same policy: not a deployable agent, but the ceiling on what planning inside a world model is worth, and a sign the proposals already contain the right action. Rollouts from resets also beat the learned critic at judging states.

0:00 / 0:00
a generated apartment, 5 rooms and 30 pieces of furniture from one seed. the same seed rebuilds it exactly, which is why an expert costs nothing and why a rollout can be replayed from the frame it went wrong on.
DAgger: the learner drives, the oracle labels every state it reaches; beta 0.3 in round one, 0.5 in round two
rehearsal: each of the top three actions is tried in a restored copy of the world and followed by the policy for 25 steps
value from K rollouts after a reset, scored by explained variance against a held-out return
1demos only22.6%2round 124.0%3round 229.4%, p = .003
DAgger rounds, success on the suite
nowsnapshotrehearsecommitreturncurrent statepolicy proposestop 3 actionscopy the worlda JSON documentcandidate 125 steps, x2candidate 225 steps, x2candidate 325 steps, x2best mean returntake that actionrestore the worldnothing leaked
rehearsal: search with the simulator as a perfect world model
reactive38.7% 0.4 s/eprehearse, 1 rollout79.3% 62 s/eprehearse, 2 rollouts80.7% 86 s/ep
rehearsal on the first 150 episodes, same policy
learned critic0.178 rollouts from reset0.42
how much of a state's value each estimate explains

where it standsThe benchmark, and what is still open

Before asking whether rankings survive a change to the simulator, I checked whether they survive resampling. Two halves of the same suite agree at Kendall tau 0.73 with 250 episodes each and 0.54 with 50, and 81% of neighbouring policies are within 2 points: the suite separates the top from the bottom and cannot order the middle.

So nothing that mattered here was a rank, and every claim above is a paired difference. What is left is mostly search, and a learned value or world model that buys a third of the rehearsal gain would be the biggest step available.

Kendall tau between the policy rankings from two disjoint halves of the suite: C concordant pairs, D discordant, n = 22 policies
250 episodes a halftau 0.7350 episodes a halftau 0.54
do two halves of one suite rank policies the same?
close to settledidentification, with matchingwrong object 39% to 4%DAgger beats RL fine-tuneranks are noise mid-tableopenthe gap is now searchdoes it survive RLis the weak critic the shared trunka learned world model's share
settled, and open