OpenRUA: Robot-Use Agents Are Zero-Shot Visuomotor Policies
Organizations: University College London · Carnegie Mellon University
Abstract
Coding agents are extending their reach into the physical world by writing and executing robot control programs. One might expect the agents to use the existing mature software stack that engineers have developed over decades to access sensors and control motion. Yet prior work primarily engineers complex custom harnesses to orchestrate agents for robot use, particularly by prescribing specialized workflows and providing bespoke interfaces. This raises the question: "Is such additional harness engineering necessary?" We introduce OpenRUA, a zero-abstraction harness that bypasses bespoke abstraction layers by providing off-the-shelf coding agents with only terminal access to the robot's native software interface ROS 2. OpenRUA employs a minimalist workspace-as-harness design, only offering ROS 2 documentation and basic tools while leaving the coding agent to organize its own work without orchestrating any agentic workflow. Within this workspace, OpenRUA recasts perception as file I/O and manipulation as coding. With Claude Code powered by Claude Opus 5, OpenRUA achieves success rates of 99.0% on CaP-Bench and 87.0% on LIBERO-PRO, demonstrating that an off-the-shelf coding agent can serve as a zero-shot visuomotor policy through the robot's native interface, without bespoke primitives or task-specific training. Under this minimalist design, further analysis reveals striking emergent behaviors of coding agents: (1) For perception, the agent spontaneously writes programs that process raw sensory inputs and derive metric measurements in 96.80% of episodes. (2) For manipulation, the agent spontaneously builds motion-control clients (e.g., gripper control) in 95.87% of episodes and closed-loop control programs (e.g., adjusting motion based on sensor feedback) in 50.13% of episodes. Our code is available at https://github.com/terminalworld/OpenRUA.
Figures & tables
| Benchmark | Episodes | Image processing (%) | Metric programs (%) |
| CaP-Bench | 700 | 47.43% | 97.43% |
| LIBERO-PRO | 800 | 94.75% | 96.25% |
| Overall | 1,500 | 72.67% | 96.80% |
| Benchmark | Episodes | Motion-control clients (%) | Feedback-control programs (%) |
| CaP-Bench | 700 | 97.00% | 60.14% |
| LIBERO-PRO | 800 | 94.88% | 41.38% |
| Overall | 1,500 | 95.87% | 50.13% |
| Method | Setting | Success Rate (%) | ||||||||
| Agent | Model (Effort) | Train. | Exp. | Oracle | Atomic-Seen | Comp.-Seen | Comp.-Unseen | Overall | ||
| Learned Policy | GR00T N1.5 | – | – | ✓ | ✗ | ✗ | 41.9 | 0.0 | 0.2 | 15.1 |
| – | – | ✓ | ✓ | ✗ | 68.5 | 40.6 | 42.1 | 51.1 | ||
| RLDX-1 | – | – | ✓ | ✗ | ✗ | 60.0 | 21.3 | 5.0 | 30.0 | |
| Agent + Policy | Harness VLA | Codex | GPT-5.5 (xhigh) | ✓ | ✓ | ✓ | 92.0 | 61.0 | 13.8 | 57.1 |
| CC | Opus 4.7 (max) | ✓ | ✓ | ✓ | 79.4 | 47.5 | 15.0 | 48.6 | ||
| Cause of failure | LIBERO-PRO | CaP-Bench | RoboCasa365 | All |
| A Success criterion not stated in the instruction | 42 | 1 | 36 | 79 |
| B Predicate contradicts the instruction | 17 | 0 | 2 | 19 |
| C Budget exhausted while handling undocumented machine behavior | 15 | 0 | 125 | 140 |
| D Object or force beyond the machine’s limits | 12 | 0 | 63 | 75 |
| E Perception, control, or waiting error of the agent | 18 | 6 | 76 | 100 |
| Analyzed failed episodes | 104 | 7 | 302 | 413 |
Appendix figures & tables23 assets
Supplementary material from the paper’s appendix.
Appendix
| Benchmark | Images read | Processed images | Metric programs | Targets traced to computed coordinates |
| CaP-Bench | 14 | 16% | 13 | 94% |
| LIBERO-PRO | 21 | 36% | 21 | 93% |
| RoboCasa365 | 31 | 40% | 35 | 90% |
| Purpose | Processed images | |||||||
| Benchmark | Scene | Verify | Inspect | Crop / zoom | Grid / markers | Depth view | Mosaic | Mask overlay |
| CaP-Bench | 32% | 37% | 31% | 80% | 3% | 3% | 1% | 2% |
| LIBERO-PRO | 38% | 35% | 27% | 94% | 11% | 4% | 2% | 2% |
| RoboCasa365 | 18% | 47% | 36% | 68% | 10% | 5% | 6% | 2% |
| Technique | CaP-Bench | LIBERO-PRO | RoboCasa365 |
| Depth threshold / height band | 97% | 99% | 98% |
| Centroid / bounding box | 100% | 96% | 94% |
| Point cloud / plane fit | 83% | 69% | 88% |
| Connected components / contours | 68% | 69% | 56% |
| Color threshold | 48% | 24% | 41% |
| Crop / zoom for its own reading | 60% | 99% | 98% |
| Tasks | Motion commands per episode | Through own programs | Feedback program | Reads force | Velocity servo |
| CaP-Bench, contact-rich (Nut, Wipe, Restack, 2A-Lift, Handover) | 14 | 99% | 67% | 86% | 4% |
| CaP-Bench, Lift and Stack | 9 | 86% | 44% | 97% | 6% |
| LIBERO-PRO, six perturbation cells | 20 | 68% | 37% | 64% | 3% |
| LIBERO-10 | 26 | 84% | 54% | 44% | 3% |
| RoboCasa365 | 50 | 86% | 71% | 63% | 12% |
| Tool | Purpose | CaP-Bench | LIBERO-PRO | RoboCasa365 |
| cam_snap | save an image topic to a file | 100% (7.9) | 100% (12.5) | 100% (17.8) |
| px2world | back-project a pixel with depth | 29% (0.6), read 24% | 75% (1.9), read 10% | 57% (1.6), read 24% |
| fjt_send | send one joint trajectory | 8% (0.1), read 33% | 63% (2.8), read 13% | 32% (2.0), read 30% |
| gripper_cmd | open / close the gripper | 9% (0.2), read 25% | 56% (1.8), read 17% | 22% (1.5), read 29% |
| ik_move | IK to a pose and move | 3% (0.1), read 41% | 41% (1.2), read 36% | 8% (0.6), read 50% |
| base_goto | drive the base to a pose | – | – | 62% (3.0), read 11% |
| Agent | Model (Effort) | Success (%) | Turns, median (succ. / fail.) | Tokens / turn, median | Cost ($), mean | Cost per success ($) |
| CC | Sonnet 5 (high) | 24.0 | 301 (219 / 334) | 512 | 22.4 | 93.3 |
| CC | Opus 5 (high) | 72.5 | 103 (97 / 131) | 1,058 | 13.7 | 18.9 |
| CC | Fable 5.1 (high) | 75.0 | 73 (72 / 84) | 760 | 8.4 | 11.2 |
| Codex | GPT-6 Astra (medium) | 62.5 | 98 (103 / 89) | 90 | 11.8 | 19.1 |
| Codex | GPT-6 Astra (high) | 69.0 | 93 (97 / 86) | 122 | 10.0 | 14.4 |
| Class | Sub-cause | LIBERO | CaP | RoboCasa |
| A | Joint threshold: “open” needs mm or of travel, a mixer head ; lift needs m | 14 | 1 | 6 |
| Region box differs from the words: “in front of the stove”, “right of the plate”, “on the rack”, “in the microwave” | 19 | 0 | 0 | |
| Tolerance of On : body origins within 30 mm (a mug’s origin sits 18 mm toward its handle) | 2 | 0 | 0 | |
| Final check coarser than the predicate: drawer read as shut from a point cloud, door “closed” needs of travel, lid seated within 4 cm and | 7 | 0 | 10 | |
| Stand-off after release ( / m), contact and timer clauses, sweep m, “do not touch the food”, navigation pose within 0.20 m | 0 | 0 | 20 | |
| B | Predicate names the other object (“left moka pot” scores the pot in the BDDL’s right init region) | 9 | 0 | 0 |