A Controlled Study of Models, Skills, Feedback, and Curriculum in Agentic Robotics
Organizations: UC Berkeley · Bosch · NVIDIA
Abstract
Agentic robotics asks coding agents to implement and iteratively improve robot policies from simulated and real-world physical interactions. We study the self-learning loop of agentic robotics through a controlled simulation study spanning nine manipulation tasks, 631 different experiment configurations, and 28K coding agent rollouts, systematically varying model capability, skill priors, feedback structure, and curriculum. The experiment data suggests that the bottleneck is often not the access to sufficient information, but interpreting it into the right policy update. Across these factors, a successful self-learning loop depends on how effectively agents attribute failures, reason task-relevant spatial and geometric structure, and selectively restructure code to improve policies.
Figures & tables
| Model | Overall | Overall | Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @0 | @1 | @2 | 1 | 2 | @0 | @1 | @2 | @0 | @1 | @2 | @0 | @1 | @2 | @0 | @1 | @2 | @0 | @1 | @2 | |
| Human | 82 | – | 87 | 90 | 100 | 87 | 47 | |||||||||||||
| Opus 5, xhigh | 45 | 64 | 74 | 22 | 62 | 60 | 28 | 38 | 35 | 100 | 100 | 100 | 0 | 50 | 100 | 73 | 72 | 73 | ||
| Opus 5, high | 41 | 62 | 81 | 25 | 72 | 97 | 40 | 30 | 45 | 67 | 100 | 100 | 0 | 33 | 87 | 75 | 76 | 76 | ||
| Opus 5, low | 57 | 67 | 74 | 0 | 30 | 57 | 51 | 50 | 60 | 100 | 100 | 100 | 60 | 80 | 80 | 73 | 76 | 76 | ||
| DeepSeek V4 | 38 | 43 | 44 | 0 | 0 | 0 | 20 | 29 | 30 | 100 | 100 | 100 | 0 | 10 | 12 | 70 | 77 | 77 | ||
| Feedback | Overall | Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing |
|---|---|---|---|---|---|---|
| Initial policy | 3 | 0 | 0 | 0 | 0 | 17 |
| Per episode | 25 | 7 | 90 | 10 | 0 | 17 |
| Per motion | 36 | 45 | 55 | 80 | 0 | 0 |
| Per skill | 52 | 90 | 50 | 70 | 20 | 27 |
| Spatial representation | Overall | Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing |
|---|---|---|---|---|---|---|
| Outcome only | 19 | 15 | 45 | 0 | 0 | 33 |
| State + relations, world frame | 30 | 25 | 60 | 50 | 0 | 13 |
| State + relations, object frames | 40 | 63 | 50 | 60 | 0 | 27 |
| + part annotations | 52 | 90 | 50 | 70 | 20 | 27 |
| # Skills | Success (%) | |||
|---|---|---|---|---|
| Task | w/ curr. | w/o curr. | w/ curr. | w/o curr. |
| Tool Hanging | 19.3 | 28.0 | 16 | 63 |
| Gear Meshing | 18.3 | 21.7 | 33 | 40 |
| USB-C Insertion | 18.0 | 10.7 | 31 | 16 |
| Kitchen | 13.0 | 13.3 | 33 | 62 |
| Coffee | 5.0 | 11.7 | 76 | 64 |
Appendix figures & tables29 assets
Supplementary material from the paper’s appendix.
Appendix
| Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing | |
|---|---|---|---|---|---|
| Instruction | hang the wrench on the hook | pick up each syringe from the instrument tray, one at a time, and drop it through the hole in the top of the yellow sharps disposal box, until both are in the box | put the gear on its peg so it meshes with the pinion, then press the red button at the near end of the board to start it | insert the USB-C plug into the receptacle | weave the cable through the two pegs and route its free end into the port |
| Robot | bimanual I2RT YAM; prompted with one arm | Franka Panda | Franka Panda with Robotiq 2F-85 | bimanual I2RT YAM; prompted with one arm | bimanual I2RT YAM; prompted with both arms |
| Objects | wrench (260 mm); hook on a pegboard | two identical syringes 90 mm apart in an instrument tray; sharps box with a top aperture | spur gear (16, 20 or 24 teeth) on a mat; board with a peg, a driven pinion and a start button | USB-C plug ( scale) on an attached 240 mm cable; receptacle bolted to the bench, 0.15 mm clearance per side | 600 mm cable, one end welded in an anchor bracket; two pegs; a port |
| Success trials per episode | 1: the goal | 2: each syringe in the box | 1: the goal | 1: the goal | 3: seated at peg 1, at peg 2, in the port with its free end |
| Partial-credit reward (floor) | share of the 3 goal clauses (1/3: a wrench at rest meets the speed clause) | share of the 2 syringes in the box (0) | turning fraction of its one gear, so 0 or 1 (0) | insertion depth / 10.4 mm, capped at 1; 0 while the lateral offset exceeds 8.8 mm (0) | lower of the shares of the 4 containment and the 2 release clauses (0) |
| Step cap | 8,500 | 22,800 | 6,000 | 9,000 | 13,000 |
| Task | Base document, sampler and randomized quantities | Documents: 4 train, 5 val., 10 held-out | Seed |
|---|---|---|---|
| Tool Hanging | wrenches_level1 , layout:LEVEL1 : wrench each mm; hook fixed | train: 001, 012–014 val.: 015–019 held-out: 002–011 | doc : seed |
| Syringe Packing | tray_pair_both , 30-trial layout sweep: tray arrangement yaw about the first syringe, shift each mm, shifts 10 mm apart; sharps box each mm | train: t00, t11–t13 val.: t14–t18 held-out: t01–t10 | trial of one sweep at seed 0 |
| Gear Meshing | 40 drawn single-station boards, draw_layout : tooth count 16/20/24 (balanced); plate center each mm; chain yaw ; gear dropped uniformly on the mat ( 15 mm from the plate), clocked | train: 01, 12–14 val.: 15–19 held-out: 02–11 | doc : 31-bit SHA-256 of ; teeth: one balanced draw |
| USB-C Insertion | insert_easy , staging:USBC_EASY : plug yaw , each mm; receptacle mm across, mm along, yaw , redrawn until it clears the bench | train: 01, 12–14 val.: 15–19 held-out: 02–11 | doc : seed |
| Cable Routing | port_easy , staging:PORT_BOARD : cable bow mm, shift mm, yaw , wave mm (fractions ), anchor follows the cable; port each mm, yaw ; peg gap the 240 mm pitch within the anchor–port corridor, lateral wobble mm, board yaw , board position uniform in the corridor, rejected unless turning, wrap and route length stay near the declared board’s values | train: 01, 12–14 val.: 15–19 held-out: 02–11 | doc : seed |
| Namespace | Tools |
|---|---|
| robot (23) | close_gripper , describe_arm , describe_gripper , describe_workspace , execute_trajectory , forward_kinematics , get_camera_pose , get_ee_pose , get_gripper , get_gripper_pose , get_observation , go_home , go_to_pose , go_to_pose_cartesian , grasp_frame , instruction , move_cartesian_until_contact , move_to_joints , open_gripper , set_grip , solve_ik , stream_dual , wait_steps |
| motion (5/8) | describe_planner , get_robot_collision_spheres , plan_joint , plan_linear , plan_support_disengagement ; with cuRobo also build_world_tsdf , plan_to_pose , solve_ik_batch |
| curobo (9) | cloud_to_attachment , plan_directed_linear , plan_grasp_motion , plan_linear , plan_to_grasp_poses , plan_to_pose , plan_with_grasped_object , validate_joint_trajectory_grasped , validate_joint_trajectory_robot |
| curve (2) | fit_centerline , track_centerline |
| geometry (22) | build_world_config , cloud_to_attachment , compute_drop_position , compute_feature_mate , compute_obb , compute_xy_distance , depth_to_point_cloud , exclude_robot_points , filter_and_compute_obb , filter_noise , fit_linear_feature , fit_planar_feature , front_grasp_from_obb , iou , mask_to_world_points , pixel_to_world_point , pose_distance , rotate_quat_z90 , select_top_down_grasp , top_down_grasp_candidates , top_down_grasp_from_obb , transform_points |
| grounding-dino (1) | detect |
| Skill | Scripts | cuRobo | OSC | What it does |
| Perception (11) | ||||
| perceiving-deformable-linear-objects | 1 | ✓ | ✓ | Ordered 3D cable centerline from RGB-D, kept current across a task |
| perceiving-functional-features | 6 | ✓ | ✓ | Fits a described part (loop, shaft, tip, aperture) from RGB-D |
| perceiving-next-item | 3 | Container and next remaining item from one view, or done | ||
| perceiving-object-parts | 1 | ✓ | ✓ | Detects the parent object, then segments a named subpart in its crop |
| perceiving-objects | 1 | ✓ | ✓ | DINO detection, VLM crop tournament, SAM3 mask, world-frame box |
| Task, human graph | Bundle | Scripts |
| Tool Hanging | glue (1) | choose_placement_mode |
| gap_perception | from (15) | compute_mate , execute_placement_plan , release_and_retract , execute_approach_only , execute_reorientation , compute_align_pose , execute_grasp_align , perceive_fixture_feature , perceive_object_feature , select_next_source , plan_clearance_motion , plan_feature_engagement , build_collision_world , register_held , descend_release_linear (of 10 skills) |
| Syringe Packing | perception (8) | build_collision_world , count_remaining , map_syringe_to_hand , perceive_fixture , perceive_target , verify_grasp , verify_placement , verify_seated |
| gap_perception_v2 | motion (9) | compute_grasp , execute_insertion , execute_reorientation , grasp_checked , lift_held , plan_clearance_motion , plan_visual_insert , release_and_retract , unjam_aperture |
| helpers | motion_checks , perception_checks | |
| from (1) | compute_mate (of computing-feature-mating-poses ) |
| Table 1 , every setting | Feedback study; full library | Tools only | Docs callable | |
| Library | + docs of | |||
| skills callable | 27 / 25 | 27 / 25 | 0 | 27 / 25 |
| source readable | ✓ | ✓ | – | – |
| expert scripts | ✓ | – | – | – |
| SKILLS.md | ✓ | ✓ | ✓ | ✓ |
| SKILL_LIBRARY.md | , | notice only |
| Table 1 (models) | Feedback and skill-library studies | |
| Iterations | 3 ( ) | 6 ( ) |
| Training | 4 instances per iteration | 4 instances per iteration |
| Validation | 5 instances per iteration | 5 instances per iteration |
| Held-out | 10 instances per iteration | 10 instances at and on the kept iterate |
| Initial policy | written by the agent | written by the agent; in the feedback study every arm reuses the reference run’s with its training batch and held-out reading, and runs its own validation |
| Kept iterate | first iterate with the highest validation success | |
| Event (per 100 agent sessions) | Table 1 | Feedback | Skill library | All |
| Guard rejections | 5.5 | 6.3 | 4.3 | 5.7 |
| non-literal tool name (%) | 100 | 100 | 100 | 100 |
| Crashed preflights | 3.6 | 0.5 | 7.4 | 2.7 |
| repaired by fix sessions (%) | 82 | 100 | 100 | 88 |
| run unrepaired (%) | 18 | 0 | 0 | 12 |
| Reverts | 8.7 | 16.7 | 3.2 | 11.6 |
| Slot | In | Value in the study |
| {{instruction}} | G, I | the task’s instruction, verbatim (Table 5 ) |
| {{perception}} | G, I | vision |
| {{privileged}} | G, I | none |
| {{update_mode}} | G | freeform |
| {{layout_note}} | G, I | every task: “- Each training episode is a DIFFERENT layout of this task, and the policy is scored afterwards on ten further layouts it never sees, where the objects (and possibly the fixtures) sit elsewhere. Locate everything that can move with perception at run time: a coordinate read off this feedback fits the one layout it was measured in, and a policy built on such coordinates fails the rest.” The Opus 5, xhigh runs of Table 1 that train on one layout (Appendix C.2 ): “- Every training episode replays ONE fixed layout, but the policy is scored afterwards on layouts it never sees, where the objects (and possibly the fixtures) sit elsewhere. Locate everything that can move with perception at run time: a coordinate read off this feedback fits the training layout only, and a policy built on one fails every held-out layout.” |
| {{bimanual_note}} | G, I | Cable Routing: “This robot has 2 arms. Every robot./motion. verb takes arm_id (0 is the work arm, 1 the support arm); an omitted arm_id drives arm 0. Sequence the arms deliberately — SKILLS.md states each tool’s arm semantics.” Other tasks: empty. |
| Condition | Run arm | Form | Spatial | Granularity |
|---|---|---|---|---|
| Reference (Table 1 ; Per skill , + part annotations ) | reference | state, relations | parts | semantic |
| Spatial representation (Table 3 ) | ||||
| Outcome only | success_only | -- | (parts) | (semantic) |
| State + relations, world frame | positions | state, relations | positions | semantic |
| State + relations, object frames | frames | state, relations | frames | semantic |
| Temporal resolution (Table 2 ) |
| Form | Spatial | Temporal | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Rendered | Refer- ence | Outcome only | Outcome + stills | Outcome + state | Outcome + relations | World frame | Object frames | Per episode | Per motion |
| Outcome: episode table, per-object goals, abort, budget and stage banners, raised errors | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Node names (one unit per node, with status and time) | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| Up to 16 stills (two cameras) around the nodes nearest the first failure | – | – | ✓ | – | – | – | – | – | – |
| Tool names, commanded vs. achieved targets | ✓ | – | – | ✓ | – | ✓ | ✓ | – | ✓ |
| Node outputs ( returned key=value ) | ✓ | – | – | ✓ | – | ✓ | – | – | |
| Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing | |
| Validation target (success) | 1 | 0.83 | 1 | 1 | 0.67 |
| in objects | 5/5 | 9/10 | 5/5 | 5/5 | 11/15 |
| Revert margin (train success) | 0.5 | 0.25 | 0.5 | 0.5 | 0.25 |
| in objects | 2/4 | 2/8 | 2/4 | 2/4 | 3/12 |
| Episode wall budget (s) | 1500 + 4200 | 1500 + 12000 | 1500 + 7200 | 1500 + 7200 | 1500 + 14000 |
| Unchanged streak | 3 iterations without an accepted edit | ||||
| Sessions | Harness | Effort | Thinking tokens | ||||
| Setting | Model id | Listed | (UTC) | control | xhigh | Generate | Improve |
| Opus 5, xhigh | claude-opus-5 | 07-24 | 09-18–22 | – | 64% | 30.8k | 16.5k |
| Opus 5, high | claude-opus-5 | 07-24 | 09-22–24 | budget 32k | 13% | 17.8k | 21.2k |
| Opus 5, low | claude-opus-5 | 07-24 | 09-22–25 | budget 4k | 12% | 18.6k | 15.4k |
| DeepSeek V4 | deepseek/deepseek-v4-pro-0813 | 08-12 | 09-22–25 | – | 22% | 75.1k | 69.2k |
| Sonnet 5 | claude-sonnet-5 | 06-30 | 09-22–25 | – | 21% | 46.2k | 20.2k |
| Claude Code call | claude -p "Follow INSTRUCTIONS.md in this directory." --output-format json --max-turns 80 --allowedTools "Read,Edit,Write,Grep,Glob,Bash(./validate.sh:),Bash(echo:),Bash(mkdir:*)" --model <id> ; Kimi K3 and DeepSeek V4 set ANTHROPIC_BASE_URL to OpenRouter’s Anthropic-compatible endpoint. |
|---|---|
| Codex call | codex exec --json --skip-git-repo-check -s danger-full-access -C <workspace> -o <transcript>/last_message.txt -m <id> -c model_reasoning_effort="xhigh" "Follow INSTRUCTIONS.md in this directory. AGENTS.md states the rules." |
| Reasoning | Opus 5, high and low add MAX_THINKING_TOKENS =32000/4000 to the environment; Codex gets model_reasoning_effort in the call. Claude Code’s effort level is not set: the local machine’s CLI settings pin effortLevel to xhigh, and the remote machines did not record it. |
| Session limits | 2 h wall clock per session; turn cap --max-turns 80 for Claude Code, none for Codex. |
| Sampling | temperature and top- not set (provider default). |
| Context and output | as the CLI reports them. Context: 1M tokens for the Claude models, 200k for Kimi K3, DeepSeek V4 and the sessions rerun through OpenRouter (the CLI’s default for a model outside its catalog). Maximum output per response: 64k or 128k (Opus 5, Sonnet 5), 128k (Opus 5.5), 64k (Fable 5.1, the reruns), 32k (Kimi K3, DeepSeek V4). Codex reports neither. |
| Rate limits | from 2026-09-22, a Claude session refused with HTTP 429 on the subscription login is rerun at once with the same model through OpenRouter; before that, and for Kimi K3 and DeepSeek V4, it is retried after the limit resets when that is within 1 h (at most 4 attempts). A later reset, or a Codex usage limit, defers the round, and the run resumes it. |
| Fix | Per session | Lines | Gain | ||
| Setting | sessions | Turns | Minutes | per edit | @0 @2 |
| Opus 5, xhigh | 7% | 37 | 8.1 | 113 | |
| Opus 5, high | 10% | 42 | 8.1 | 156 | |
| Opus 5, low | 14% | 38 | 8.5 | 150 | |
| DeepSeek V4 | 4% | 47 | 29.0 | 30 | |
| Sonnet 5 | 6% | 31 | 8.7 | 27 | |
| Agent | Tokens (M) | Cost | Simulator | Policy | |||
| Setting | Runs | sessions | Input | Output | (USD) | hours | episodes |
| Opus 5, xhigh | 25 | 62 | 194 | 3.4 | 292 | 669 | 1,000 |
| Opus 5, high | 25 | 47 | 138 | 2.3 | 193 | 520 | 718 |
| Opus 5, low | 25 | 49 | 148 | 2.3 | 199 | 641 | 714 |
| DeepSeek V4 | 25 | 56 | 165 | 6.0 | 33 | 599 | 996 |
| Sonnet 5 | 25 | 56 | 199 | 3.7 | 112 | 806 | 978 |
| Model | Input | Cache read | Cache write | Output |
|---|---|---|---|---|
| Opus 5 | 5 | 0.5 | 10 | 25 |
| Opus 5.5 | 4 | 0.2 | 8 | 20 |
| Sonnet 5 | 2 | 0.2 | 4 | 10 |
| Fable 5.1 | 10 | 0.25 | 20 | 50 |
| Haiku 4.5 (CLI background model) | 1 | 0.1 | 1.25 | 5 |
| Kimi K3 | 3 | 0.3 | – | 15 |
| Component | Source | Cost (USD) |
| Table 1 | Table 20 | 1,700.03 |
| Feedback study | Table 20 | 3,186.60 |
| Skill library | Table 20 | 747.42 |
| Superseded passes and dropped arms | Table 20 | 1,923.12 |
| Pilot study | ccusage , harness transcripts | 22,462.13 |
| Curriculum study | reported by its authors | 6,436.83 |
| Category | Rule | Example message | |
|---|---|---|---|
| P | Perception | A perception node raises: the target, part or region is not found or not localized. | SAM3 could not localize 'ring' |
| G | Grasp miss/loss | The jaws close on nothing, or grasp verification finds the object gone from the hand. | the jaws closed on nothing (gap 8.00 mm, lag 0.00 mm) |
| K | Planning/IK refusal | The planner or IK returns no feasible grasp, orientation, path or approach. | plan_grasp: 0/1 candidate grasps had a feasible CuRobo plan … |
| T | Reach/tracking/transport | The hand stops short of, or tracks off, a commanded pose. | the hand stopped 23 mm from the grasp pose |
| A | Placement/insertion misalignment | The graph finishes with the object’s placement clause unmet, or a placement or insertion check raises. | encloses/wrench_1.ring/wrench_hook_1.shank: False |
| R | Release/goal-clause | The graph finishes with placement met but a rest, release or turning clause unmet. | speed/wrench_1: False |
| Final programs, by task | Table 1 | |||||||||
| Category | Tool Hanging | Syringe Packing | Gear Meshing | USB-C Insertion | Cable Routing | All | @0 | @2 | Feedback | Skill library |
| P Perception | 1 | 15 | 17 | 1 | 7 | 8 | 11 | 7 | 6 | 25 |
| G Grasp | 1 | 14 | 0 | 17 | 0 | 6 | 13 | 11 | 0 | 1 |
| K Planning/IK | 45 | 1 | 0 | 18 | 0 | 13 | 16 | 16 | 10 | 0 |
| T Reach/tracking | 13 | 6 | 0 | 2 | 0 | 5 | 9 | 5 | 5 | 4 |
| A Placement | 36 | 43 | 67 | 36 | 69 | 49 | 31 | 39 | 63 | 69 |
| Model | Overall | Tool Hanging | Syringe Packing | ||||||
|---|---|---|---|---|---|---|---|---|---|
| @0 | @1 | @2 | @0 | @1 | @2 | @0 | @1 | @2 | |
| Human | 82 | 87 | 90 | ||||||
| Opus 5, xhigh | 45 7 | 64 9 | 74 4 | 22 33 | 62 26 | 60 19 | 28 4 | 38 2 | 35 0 |
| Opus 5, high | 41 12 | 62 12 | 81 4 | 25 43 | 72 42 | 97 4 | 40 9 | 30 0 | 45 0 |
| Opus 5, low | 57 6 | 67 8 | 74 7 | 0 0 | 30 37 | 57 35 | 51 6 | 50 4 | 60 0 |
| DeepSeek V4 | 38 4 | 43 4 | 44 4 | 0 0 | 0 0 | 0 0 | 20 14 | 29 12 | 30 12 |
| Suite | Task | Instruction | Stages | Episode |
| MimicGen | Coffee (D1) | Insert the coffee pod into the coffee machine and close the lid. | 7 | 1500 steps |
| Kitchen (D1) | Cook the bread in the pot on the stove, serve the pot with the bread retained, and finish with the stove off. | 7 | 1500 steps | |
| Mug Cleanup (D1) | Open the target drawer, pick up the mug, place it upright inside the drawer, release it, close the drawer. | 7 | 1500 steps | |
| Threading (D1) | Pick up the needle by its handle, align its shaft with the tripod ring, and thread it through the ring. | 5 | 1500 steps | |
| VABAR | Tool Hanging (Level 2) | Hang both wrenches on the two hooks. | 7 | task budget |
| Gear Meshing (Level 2) | Put each gear on its own peg so they mesh, then press the red button at the near end of the board. | 5 | task budget |
| MimicGen | VABAR | |
|---|---|---|
| Tasks | Coffee, Kitchen, Mug Cleanup, Threading (D1) | Tool Hanging, Gear Meshing (Level 2); USB-C Insertion (Level 1) |
| Model | Claude Fable 5.1 | Claude Opus 5 |
| Iterations (privileged + perception) | 8 + 8 | 5 + 5 |
| Iterations (perception only) | 16 | 10 |
| Training episodes per iteration | 10 | 4 |
| Training layouts | 10 new every iteration (seeds 0–159 over 16 iterations) | same 4 every iteration |