Same harness, same tasks, same seeds. The only difference is whether the agent read an action plan extracted from demonstration video before writing its program.
| metric | Control — no demonstration | Demonstration-conditioned |
|---|---|---|
| Trials run | 19 | 27 |
| Successes | 11 | 11 |
| Seeds solved | 5/5 | 5/5 |
| Mean fixes to first success | 5.2 | 4.6 |
| Agent tokens | 5,924,706 | 3,120,230 |
| VLM tokens | 20,159 | 0 |
| Median trial wall time | 21.3s | 20.2s |
| Total wall time | 28.3 min | 28.4 min |
| Time in perception | 61% | 48% |
Fixes-to-first-success counts only seeds that were solved.
Agent tokens are self-reported by each session via
scripts/agent_tokens.py and exclude cache reads.
What the demonstration-conditioned agent read before writing any program.
demo00000_trimmed.mp4
# Demonstration-derived action plan Task: `open_microwave_handle` Extracted from demonstration video by `scripts/extract_demo_plan.py`. This describes how the task was done in a demonstration — it is a prior, not ground truth. Locating the objects in *your* scene is still your job, and the demonstration may differ from your seed's layout. *demo00000_trimmed.mp4, 16.44s, read as native video @ 6.0 fps* **Task.** Open Microwave Door **Object.** Microwave door **Goal.** Microwave door open past 0.8 rad and stationary. **Strategy.** Grasp door handle to unlatch and pull open slightly, release handle, reposition end-effector behind door, and push inner surface outward to swing door fully open. **Steps.** | # | time | category | primitive | contact | what happens | state after | |---|---|---|---|---|---|---| | 1 | 00:00 - 00:01 | Preparation | grasp | rigid grasp on Door handle | Parallel-jaw gripper closes onto the vertical microwave handle. | Handle firmly grasped | | 2 | 00:01 - 00:04 | Primary Action | pull | rigid grasp on Door handle | Robot arm pulls outward, unlatching and opening door partially. | Door partially open (~0.3 rad) | | 3 | 00:04 - 00:05 | **Micro-Adjustment** | release | none on Door handle | Gripper opens and releases handle contact. | Door partially open, ungrasped | | 4 | 00:05 - 00:08 | **Micro-Adjustment** | reposition | none on Inner surface of door | Arm moves gripper into interior space behind the open door edge. | Gripper positioned inside door arc | | 5 | 00:08 - 00:11 | Primary Action | push | single-surface push on Inner door face | Pushes inner door surface outward to widen opening angle. | Door fully open (>0.8 rad) | | 6 | 00:11 - 00:16 | Preparation | retract | none on none | Arm pulls back gripper clear of microwave door. | Door stationary at >0.8 rad; robot disengaged | **Changes in how force was applied.** - Switched from rigid handle pulling (grasp contact) to pushing the inner door panel (surface push) to avoid joint kinematic limits when opening wider. **Releases and repositions.** - At 00:04, released handle grasp, backed off, and repositioned end-effector inside the door frame. **What copying the obvious strategy would get wrong.** - Attempting to pull door fully open using only handle grasp without regrasping/repositioning, causing kinematic singularity or collision. **Cautions.** - Avoid colliding gripper with door edge during internal repositioning. - Ensure initial pull force unlatches door fully before switching to push motion. **Not visible in the demo.** - Exact joint torques during latch release are not directly determinable.
demo00000_trimmed.mp4
demo00001_trimmed.mp4
# Demonstration-derived action plan Task: `open_microwave_handle2` Extracted from demonstration video by `scripts/extract_demo_plan.py`. This describes how the task was done in a demonstration — it is a prior, not ground truth. Locating the objects in *your* scene is still your job, and the demonstration may differ from your seed's layout. ## Demonstration 1 *demo00000_trimmed.mp4, 18.76s, read as native video @ 6.0 fps* **Task.** open_microwave_door **Object.** microwave door **Goal.** microwave door opened wide (>= 0.8 rad) and remaining stationary after robot retreat **Strategy.** Grasp handle, pull door partially open, release handle, re-approach door edge, push door open wider to ensure it stays open past threshold, then retreat. **Steps.** | # | time | category | primitive | contact | what happens | state after | |---|---|---|---|---|---|---| | 1 | 00:00 - 00:01 | Preparation | grasp | bilateral grasp on door handle | Gripper moves to and grasps the microwave door handle. | handle grasped, door closed | | 2 | 00:01 - 00:07 | Primary Action | pull | bilateral pull on door handle | Pulls handle along an arc to swing the door open. | door partially open (~0.6 rad) | | 3 | 00:07 - 00:10 | **Micro-Adjustment** | release | none on none | Opens gripper and retreats backward away from handle. | door stationary, partially open | | 4 | 00:10 - 00:13 | Preparation | approach | none on none | Re-approaches towards the inner surface/edge of the open door. | door stationary, gripper near inner door panel | | 5 | 00:13 - 00:15 | **Correction** | push | single-point push on inner door panel | Pushes the inner edge of the door outward to increase opening angle. | door fully open (> 0.8 rad) | | 6 | 00:15 - 00:18 | Preparation | retreat | none on none | Breaks contact and moves arm back to home pose. | door remains open (> 0.8 rad) | **Changes in how force was applied.** - Switched from a two-finger grasp on handle to a single-point pushing contact on the inner door surface. **Releases and repositions.** - Released handle contact at 00:07, backed off, then re-contacted door inner surface at 00:13. **What copying the obvious strategy would get wrong.** - Assuming pulling handle once opens door sufficiently without needing a secondary push step. **Cautions.** - Door hinge spring/friction may cause door to rebound if not pushed past critical angle threshold. **Not visible in the demo.** - Exact angle values and hinge joint resistance force. ## Demonstration 2 *demo00001_trimmed.mp4, 8.96s, read as native video @ 6.0 fps* **Task.** Open microwave door **Object.** Microwave oven door **Goal.** Microwave door opened beyond 0.8 rad with arm fully retracted **Strategy.** Approach handle, grasp it securely, pull in a curved arc to swing the door open, release handle, and retract arm. **Steps.** | # | time | category | primitive | contact | what happens | state after | |---|---|---|---|---|---|---| | 1 | 00:00 - 00:01 | Preparation | approach | none on door handle | Move open gripper toward the door handle. | Door closed, gripper aligned with handle | | 2 | 00:01 - 00:02 | Primary Action | grasp | rigid grasp on door handle | Close gripper fingers firmly around handle. | Door closed, handle firmly grasped | | 3 | 00:02 - 00:03 | Primary Action | pull | rigid pull on door handle | Pull handle along circular trajectory to open door. | Door fully open (>1.5 rad) | | 4 | 00:03 - 00:04 | Preparation | release | none on door handle | Open gripper fingers to unclamp handle. | Door fully open, handle unclasped | | 5 | 00:04 - 00:08 | Preparation | retract | none on none | Retract arm back to home position. | Door remains fully open | **Changes in how force was applied.** - Transitioned from non-contact approach to rigid grasp on handle. - Transitioned from rigid pulling to complete release. **Releases and repositions.** - Contact released once door reached maximum open position. **What copying the obvious strategy would get wrong.** - Pulling straight back in Cartesian space instead of following arc, causing trajectory jams. **Cautions.** - Ensure arc motion matches door hinge radius to prevent excessive joint torque or slipping. **Not visible in the demo.** - Exact latch mechanism resistance before opening.
The agent is given only the task prompt and the curated API.
| seed | attempt | fixes | outcome | reward | wall | diagnosis | status codes |
|---|---|---|---|---|---|---|---|
| 51 | 1 | fail | 0.498 | 679.5s | KINEMATICS | {'SUCCESS': 360, 'IK_FAIL': 11, 'MOTION_INCOMPLETE': 8} | |
| 51 | 2 | success | 0.969 | 671.7s | PERCEPTION | {'SUCCESS': 506, 'MOTION_INCOMPLETE': 5, 'NO_DETECTION': 4, 'IK_FAIL': 8} | |
| 51 | 3 | 0 | fail | -0.0 | 15.7s | KINEMATICS | {'SUCCESS': 83, 'IK_FAIL': 1} |
| 51 | 4 | 1 | fail | 0.286 | 17.4s | KINEMATICS | {'SUCCESS': 228, 'IK_FAIL': 3} |
| 51 | 5 | 2 | fail | -0.0 | 14.7s | MOTION | {'SUCCESS': 58, 'MOTION_INCOMPLETE': 6} |
| 51 | 6 | 3 | fail | 0.57 | 21.5s | KINEMATICS | {'SUCCESS': 396, 'IK_FAIL': 2} |
| 51 | 7 | 4 | fail | 0.281 | 28.3s | KINEMATICS | {'SUCCESS': 426, 'IK_FAIL': 5} |
| 51 | 8 | 5 | fail | -0.0 | 37.1s | KINEMATICS | {'SUCCESS': 365, 'MOTION_INCOMPLETE': 95, 'IK_FAIL': 4} |
| 51 | 9 | 6 | success | 0.907 | 22.8s | MOTION | {'SUCCESS': 314, 'MOTION_INCOMPLETE': 2} |
| 52 | 1 | 6 | success | 0.977 | 21.3s | COLLISION | {'SUCCESS': 347} |
| 53 | 1 | 6 | success | 0.928 | 23.9s | MOTION | {'SUCCESS': 353, 'MOTION_INCOMPLETE': 1} |
| 54 | 1 | 6 | success | 0.877 | 22.7s | MOTION | {'SUCCESS': 319, 'MOTION_INCOMPLETE': 2} |
| 55 | 1 | 6 | fail | 0.638 | 21.4s | MOTION | {'SUCCESS': 319, 'MOTION_INCOMPLETE': 2} |
| 55 | 2 | 7 | success | 0.891 | 16.6s | MOTION | {'SUCCESS': 320, 'MOTION_INCOMPLETE': 1} |
| 51 | 10 | 7 | success | 0.907 | 16.6s | COLLISION | {'SUCCESS': 316} |
| 52 | 2 | 7 | success | 0.977 | 16.9s | COLLISION | {'SUCCESS': 347} |
| 53 | 2 | 7 | success | 0.928 | 18.2s | MOTION | {'SUCCESS': 353, 'MOTION_INCOMPLETE': 1} |
| 54 | 2 | 7 | success | 0.877 | 16.9s | MOTION | {'SUCCESS': 320, 'MOTION_INCOMPLETE': 1} |
| 55 | 3 | 7 | success | 0.891 | 16.8s | MOTION | {'SUCCESS': 320, 'MOTION_INCOMPLETE': 1} |
solve_ik failed on 11 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
4 of 16 perception calls returned nothing (25%). The prompts used did not name anything the model recognises in this scene; the segmentation overlays show what it did see.
third-person rollout
solve_ik failed on 1 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
solve_ik failed on 3 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
6 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
solve_ik failed on 2 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
solve_ik failed on 5 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
solve_ik failed on 4 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
140 primitive(s) ran with the arm already intersecting the scene.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
123 primitive(s) ran with the arm already intersecting the scene.
third-person rollout
140 primitive(s) ran with the arm already intersecting the scene.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
The agent reads an action plan extracted from demonstration video before writing any program.
| seed | attempt | fixes | outcome | reward | wall | diagnosis | status codes |
|---|---|---|---|---|---|---|---|
| 51 | 1 | fail | 0.24 | 555.6s | PERCEPTION | {'SUCCESS': 135, 'NO_DETECTION': 5, 'MOTION_INCOMPLETE': 3} | |
| 51 | 2 | 0 | fail | 0.006 | 20.2s | MOTION | {'SUCCESS': 120, 'MOTION_INCOMPLETE': 7} |
| 51 | 3 | 1 | fail | -0.0 | 22.0s | KINEMATICS | {'SUCCESS': 115, 'MOTION_INCOMPLETE': 8, 'IK_FAIL': 1} |
| 51 | 4 | 2 | fail | 0.0 | 6.1s | PROGRAM_ERROR | {'SUCCESS': 1, 'EXCEPTION': 1} |
| 51 | 4 | fail | 0.347 | 271.8s | KINEMATICS | {'SUCCESS': 190, 'MOTION_INCOMPLETE': 4, 'IK_FAIL': 56, 'EXCEPTION': 1} | |
| 51 | 6 | 2 | fail | 0.292 | 16.2s | PROGRAM_ERROR | {'SUCCESS': 96, 'MOTION_INCOMPLETE': 1, 'IK_FAIL': 1} |
| 51 | 7 | 3 | success | 1.214 | 24.2s | MOTION | {'SUCCESS': 257, 'MOTION_INCOMPLETE': 1} |
| 52 | 1 | 3 | fail | 0.013 | 24.1s | MOTION | {'SUCCESS': 257, 'MOTION_INCOMPLETE': 1} |
| 53 | 1 | 3 | fail | -0.0 | 21.4s | MOTION | {'SUCCESS': 251, 'MOTION_INCOMPLETE': 2} |
| 54 | 1 | 3 | fail | 0.731 | 18.5s | MOTION | {'SUCCESS': 219, 'MOTION_INCOMPLETE': 4} |
| 55 | 1 | 3 | fail | 0.215 | 14.2s | PROGRAM_ERROR | {'SUCCESS': 88, 'MOTION_INCOMPLETE': 1, 'EXCEPTION': 1} |
| 53 | 2 | fail | 0.35 | 341.7s | MOTION | {'SUCCESS': 139, 'MOTION_INCOMPLETE': 11} | |
| 53 | 3 | fail | 0.213 | 50.6s | MOTION | {'SUCCESS': 226, 'MOTION_INCOMPLETE': 20} | |
| 53 | 4 | fail | 0.694 | 41.6s | COLLISION | {'SUCCESS': 243} | |
| 53 | 5 | fail | 0.047 | 40.1s | COLLISION | {'SUCCESS': 55} | |
| 53 | 6 | fail | 0.533 | 41.6s | MOTION | {'SUCCESS': 114, 'MOTION_INCOMPLETE': 1} | |
| 53 | 7 | 4 | fail | 0.584 | 13.0s | PROGRAM_ERROR | {'SUCCESS': 165, 'MOTION_INCOMPLETE': 1, 'IK_FAIL': 11} |
| 53 | 8 | 5 | success | 1.03 | 15.2s | KINEMATICS | {'SUCCESS': 231, 'MOTION_INCOMPLETE': 2, 'IK_FAIL': 8} |
| 51 | 8 | 5 | success | 1.027 | 18.4s | MOTION | {'SUCCESS': 217, 'MOTION_INCOMPLETE': 2} |
| 52 | 2 | 5 | success | 1.066 | 17.6s | KINEMATICS | {'SUCCESS': 237, 'MOTION_INCOMPLETE': 2, 'IK_FAIL': 5} |
| 54 | 2 | 5 | success | 1.003 | 15.1s | MOTION | {'SUCCESS': 211, 'MOTION_INCOMPLETE': 2} |
| 55 | 2 | 5 | success | 1.019 | 20.4s | MOTION | {'SUCCESS': 215, 'MOTION_INCOMPLETE': 2, 'EXCEPTION': 4} |
| 51 | 9 | 6 | success | 1.027 | 19.7s | MOTION | {'SUCCESS': 219, 'MOTION_INCOMPLETE': 4, 'EXCEPTION': 1} |
| 52 | 3 | 6 | success | 1.066 | 19.2s | MOTION | {'SUCCESS': 249, 'MOTION_INCOMPLETE': 4} |
| 53 | 9 | 6 | success | 1.03 | 17.6s | MOTION | {'SUCCESS': 249, 'MOTION_INCOMPLETE': 4, 'EXCEPTION': 2} |
| 54 | 3 | 6 | success | 1.003 | 21.1s | MOTION | {'SUCCESS': 212, 'MOTION_INCOMPLETE': 5, 'EXCEPTION': 4} |
| 55 | 3 | 6 | success | 1.019 | 18.2s | MOTION | {'SUCCESS': 219, 'MOTION_INCOMPLETE': 4} |
5 of 12 perception calls returned nothing (42%). The prompts used did not name anything the model recognises in this scene; the segmentation overlays show what it did see.
third-person rollout
7 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
solve_ik failed on 1 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
The program raised and stopped at program line 69: torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 16.00 MiB. GPU 0 has a total capacity of 7.67 GiB of which 26.31 MiB is free. Process 81482 has 4.02 GiB memory in use. Including non-PyTo
third-person rollout
solve_ik failed on 56 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
The program raised and stopped at program line 230: AssertionError: push staging unreachable at slide-in ([ 0.694 -0.08 0.68 ])
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
4 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
The program raised and stopped at program line 230: RuntimeError: no collision-free path to the requested joints
third-person rollout
11 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
20 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
45 primitive(s) ran with the arm already intersecting the scene.
third-person rollout
7 primitive(s) ran with the arm already intersecting the scene.
third-person rollout
1 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
The program raised and stopped at program line 228: AssertionError: no clear push radius behind the door
third-person rollout
solve_ik failed on 8 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
solve_ik failed on 5 pose(s): out of reach or unreachable at the requested orientation. Try a different approach orientation or move the target closer to the base.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
2 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
4 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
4 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
4 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
5 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout
4 motion(s) did not reach the commanded target — the arm was in contact while moving, so it was obstructed.
third-person rollout