Robust Labs

PC assembly

A robot installs five parts into a desktop PC case: memory, CPU, cooler, graphics card and motherboard. Each part seats through simulated contact, keys, latches, levers and screws, with no snapping into place. Every VLA model will run the same 30 setups and starting positions.

In progressTask list v1 draft, not lockedHeadline result: RAM, scripted reference, dev split

Tasks

The case lies on its side with the side panel removed. M3 screws are driven with a push-to-drive screwdriver tool.

measured

RAM

two DIMMs into slots A2 and B2: key, full seating depth, both latches caught

early, dev split

CPU

LGA with load plate and lever, or PGA ZIF; pin-1 orientation, plate closed, lever latched

early, dev split

Cooler

low-profile cooler with captive M3 screws, driven with a push-to-drive screwdriver

early, dev split

GPU

PCIe slot to full depth, slot latch caught, bracket screw fastened

early, dev split

Motherboard

board into the case, I/O to the rear, mounting screws fastened

not started

Full build

All five installs in a row. Scored and reported apart from the main score.

A part counts as installed only when all of these hold on the final state:

  • Identity: the right part in the right place, for example a RAM stick (DIMM) in slot A2 or B2.
  • Orientation: the keyed orientation is correct (DIMM key, CPU pin 1, GPU connector, board I/O to the rear).
  • Depth: pushed in to within a set distance of full depth for that part.
  • Release: the gripper or tool no longer touches the part.
  • Retention: latches caught, CPU load plate closed and lever latched, required screws fastened.
  • Stability: the part stays still through the settle window after release.

A graphics card that sits in its slot without full depth, a caught latch and a fastened bracket screw does not count. We never report a partial assembly as a complete build. The checks are mechanical and say nothing about whether the PC would power on. Power supply, storage and cables are out of scope for v1.

10 machines, 3 layouts

Machines vary board form factor, socket type, RAM generation and latches, cooler size and screw count, GPU length, slot width and mass. Each setup is one machine on one layout, named M01-L1 to M10-L3.

The 10 machines. Source: pc-assembly-bench configs/machines.yaml.
IdMachine
M01office micro-ATX, Intel LGA, DDR5, compact 2-slot GPU
M02gaming ATX, Intel LGA, DDR5 tall spreaders, long 2.5-slot GPU
M03micro-ATX, AMD AM5 (LGA, lever left), DDR5, 2-slot GPU
M04micro-ATX, AMD AM4 (PGA ZIF socket), DDR4 two-sided latches, 2-slot GPU
M05small-form-factor mini-ITX, Intel LGA, DDR5 (adjacent slots), short 2-slot GPU
M06mini-ITX, AMD AM5, DDR5, single-slot low-profile-height GPU
M07workstation ATX, Intel LGA, DDR4, heavy 3-slot GPU
M08budget micro-ATX, AMD AM4 (PGA ZIF), DDR4 one-sided latches, compact GPU
M09ATX, AMD AM5, DDR5, 2.5-slot GPU
M10micro-ATX, Intel LGA, DDR4 two-sided latches, single-slot GPU
L1

nominal

bench fixture front-left, case front-right, trays behind, tools on the right

L2

mirrored

fixture front-right, case front-left, tools on the left

L3

shifted and rotated

case and fixture farther from the robot, turned 90 deg

Two renders of machine M01's visual meshes placed in an open case: motherboard, RAM, cooler and graphics card.
Asset check: the 3D models of machine M01 placed where the layout puts them, to check that no parts overlap. No robot assembled this.

Planned: three arms, 90 setups

The plan is to run every model on the same 90 setups: 10 machines x 3 layouts x 3 arms. Today only the Franka Panda is set up. The other two arms stay planned until the scripted reference solves all 30 setups on each.

Source: pc-assembly-bench context/decisions.md D18, commit 75f2cac (branch sims).
ArmStatus
Franka Panda (wrist camera)in use
xArm6 + Robotiq 2F-85planned
UR5e + Robotiq 2F-85planned
  • Scoring: each model gets one score per arm; the cross-arm score is the average of the 3 arm scores, shown only when all 3 arms are done.
  • Labels: each result says whether the model saw that arm in its training data.
  • Not used: WidowX 250s: its 250 g payload cannot lift the GPU, board or cooler (it is still used in shape assembly).

Shape assembly already shows what a cross-arm comparison looks like: its scripted reference is measured on three arms (see the results).

Scoring

p(c, t) = k / n unit success rate r_f = mean of p(c, f) over 30 configs family rate, pick starts only S = 100 x mean of r_f over 5 families PRIMARY SCORE (0-100)

A unit is one setup and one task, so the score covers 150 units. If any unit has no tries, the score S is n/a and the run is marked incomplete. The 95% ranges are worked out as in shape assembly: Wilson intervals per setup, a bootstrap for task rates and S, and a paired bootstrap on matching starting positions when comparing two models.

Tries per model. Source: pc-assembly-bench docs/scoring.md.
RunUnitsTries per modelIn the score
main score30 setups x 5 tasks, full pick1,500yes
full build30 setups150no
easier startsL1 setups x 5 tasks x 2 starts (in hand, above the slot)1,000no
diagnosticL1 setups x 8 faults400no
track

reference

scripted controller that reads the exact part positions from the simulator; shows the task can be done

track

sanity

moves at random or holds still, with no camera input; checks the task cannot be passed by chance

track

frozen

released model, not trained on this task; the only ranked track

track

adapted

trained on this task, so listed apart from the released models

track

diagnostic

injected faults or impossible setups; not scored

Diagnostics

Injected faults and impossible setups that test whether a model notices a problem. Reported separately and not scored.

  • X01 DIMM reversed in hand
  • X02 DIMM partially seated
  • X03 DIMM latch pre-closed
  • X04 wrong RAM generation (unsolvable)
  • X05 CPU rotated in hand
  • X06 GPU partially seated
  • X07 PCIe slot blocked (unsolvable)
  • X08 screw cross-threaded (unsolvable)

RAM task: scripted reference

Dev split, run wp0fix_ram_ref150. The task list is not locked yet, so there are no test-split numbers.

RAM is the only task with a headline number. CPU, cooler, GPU and motherboard have early dev-split results below, with notes. The scripted reference reads the exact part positions from the simulator, so it shows a task can be done and says nothing about how models perform. Octo, OpenVLA and OpenVLA-OFT have run only a small pilot on the dev split, incomplete (1 try per task on 3 of the 30 setups, GPU not included): 0 successes. See Models and status.

Both RAM sticks installed, by start

Full pick: 30 setups x 5 tries. The two easier starts: all 30 setups x 3 tries, run before a fix to the key notch on the RAM stick. No 95% range has been published for these runs.

Starts in handbefore notch fix
Starts above the slotbefore notch fix
Full pickpick up, then install
RAM task, scripted reference, dev split.
StartTriesSuccessesSplitRun
Starts in hand (grasped)9090/90devbefore the key notch fix
Starts above the slot (near_slot)9090/90devbefore the key notch fix
Full pick (pick)150150/150devafter the key notch fix

Full pick tries in detail

Run wp0fix_ram_ref150 (commit 673dcef), 150/150 full pick tries, dev split. Before the key notch fix, run ref_ram_dev_v1 also gave 150/150.
MetricValue
Success150/150
Control steps to finish, median / max222 / 315 at 25 Hz
Unintended contacts0
Excessive-force steps0
Drops0
Retries5
Max robot force49.9 N

Source: pc-assembly-bench docs/simulation.md, RAM section 'After the cited key notch' (origin/main 435a4b9, added in c342695); in-hand starts: context/progress.md Stage 3 'RAM task' row.

All five tasks, scripted reference (dev split, task list not locked)

Early results while the task list is still a draft.

Scripted reference, full pick, dev split, task list not locked. Sources: pc-assembly-bench origin/main 435a4b9.
TaskRunTries installedNotesSource
RAMwp0fix_ram_ref150150/150 (5 per setup)both DIMMs keyed, fully seated, latches caught; run after the DIMM key notch fixdocs/simulation.md, RAM section, run commit 673dcef
CPUm2_cpu90/90 (3 per setup)socket starts closed; the reference opens it, places the CPU, closes the load plate and latches the levercontext/progress.md (Stage 3, CPU row), run commit 5579be6
Coolercf_cooler90/90 (3 per setup)secured with its captive screws, driven by the screwdriver; 0 drops, 0 excessive-force stepsdocs/simulation.md (scripted references table, GPU row, re-run at d336431)
GPUcf_gpu90/90 (3 per setup)secured: seated, latched and bracket screws fastened (117 of 117 screws at end of travel). Force over 100 N in 40 steps across 16 episodes, during insertiondocs/sim_gpu.md "Fastened needs the end of travel", run commit d336431
Motherboardcf_mb90/90 (3 per setup)secured with 4 mounting screws (360 of 360 fastened). Open issue: the screws do not hold the board sideways; it slides at about 20 N with the screws still fasteneddocs/simulation.md (scripted references table, GPU row, re-run at d336431); caveat: context/progress.md (Stage 3, motherboard row)

Models and status

Source: pc-assembly-bench docs/policies.md "Closed-loop pilot on dev seeds" (commit 3aca2f2); configs/compatibility.yaml.
ModelTrackStatus
scriptedreferenceRAM measured (dev split); CPU, cooler, GPU and motherboard early results (dev split)
random, holdsanityPilot on the dev split, incomplete (1 try per task on all 30 setups): 0/30 on each of RAM, CPU, cooler and motherboard
octo-small-1.5, octo-base-1.5frozenPilot on the dev split, incomplete (1 try per task on 3 of 30 setups): 0/3 on each of RAM, CPU, cooler and motherboard
openvla-7bfrozenPilot on the dev split, incomplete (1 try per task on 3 of 30 setups): 0/3 on each of RAM, CPU, cooler and motherboard
openvla-oft (5 LIBERO checkpoints)frozenPilot on the dev split, incomplete (1 try per task on 3 of 30 setups): 0/3 on each of RAM, CPU, cooler and motherboard