Gantry

Evaluation report, RoboTwin 2.0

Two archives in TianxingChen/RoboTwin2.0 are named for 500 demonstrations each and contain one recorded episode between them. Every other archive in the release is complete. This was found by reading the index of all 510 archives without downloading the 1.5 TB they hold, and it is invisible to anyone who unzips them, because both files open without an error.

release
1.5 TB
510 task archives, 50 tasks, 5 embodiments
read in full, downloaded none of it
archives audited
510
every archive in dataset/, by its own central directory
about 150 MB of range requests
incomplete
2
archives holding fewer recordings than their name advertises
of 510
episodes missing
999
advertised in a filename and absent from the archive
126,500 advertised, 125,501 present
dataset card
24 bytes
the entire README, a licence line and nothing else
no manifest, no episode counts

What a complete archive contains

Each episode in a healthy archive is four files. Only the first is trainable. An archive carrying trajectory pickles and nothing else holds motion plans, not demonstrations, and unzips silently.

filewhat it istypical size
data/episodeN.hdf5the recording, head, left and right cameras with intrinsics and extrinsics, plus states12 MB
video/episodeN.mp4a preview render0.1 MB
instructions/episodeN.jsonthe language instructions, seen and unseen phrasings2 KB
_traj_data/episodeN.pklthe planned trajectory, an input to the generator rather than a recording of one0.1 MB

Every archive, and how much of itself it contains

Recorded episodes divided by the number in the filename, one dot per archive, in repository order. Five hundred and eight sit exactly on the 100% line. There is no gradual tail and nothing in between, which is what makes the two worth reporting rather than filing as noise.

0%25%50%75%100%the 510 archives in dataset/, in repository order508 complete2 incompleteput_bottles_dustbin0 of 500dump_bin_bigbin1 of 500

The two archives

Both are named randomized_500. Neither carries a single language instruction. The first has no recordings at all and only 70 of the 500 planned trajectories. The second has the full 500 plans and exactly one recording.

archivename saysrecordings plansvideosinstructions size
put_bottles_dustbin/arx-x5_randomized_500.zip500070009.9 MB
dump_bin_bigbin/franka_randomized_500.zip50015001050.9 MB

For scale, a healthy archive runs about 7 MB per recorded episode. A complete randomized_500 is several gigabytes. These two are 9.9 MB and 50.9 MB, which is 0.3% and 1.5% of the median for their variant, while every other archive in the release is at least 36% of its own median.

What is in the archives, and what is not

Every clip below is the video/episodeN.mp4 shipped inside the release, untouched. The first is the whole of what one broken archive contains. The rest are complete archives of the same tasks, including two pulled out of multi-gigabyte files with the same range-request trick used for the audit.

dump_bin_bigbin franka_randomized_500the only one
The entire visual content of an archive named for 500 demonstrations. There is one mp4 inside it and this is the mp4. The other 499 episodes exist only as trajectory plans.
107 frames, 3.6 s at 30 fps
dump_bin_bigbin aloha-agilex_randomized_5001 of 500
The same task and the same randomized_500 variant, from a complete archive. This is episode 0 of 500, and the other 499 are there. Pulled out of a 7.0 GB archive with two range requests.
169 frames, 5.6 s at 30 fps
put_bottles_dustbin aloha-agilex_randomized_5001 of 500
The other affected task. The arx-x5 archive for this task holds zero recordings and 70 plans. This is what its 500 should look like. Pulled out of a 21.3 GB archive the same way.
517 frames, 17.2 s at 30 fps
dump_bin_bigbin franka_clean_501 of 50
The clean variant of the broken archive's own task and embodiment. All 50 episodes are present here, with hdf5, video and instructions.
206 frames, 6.9 s at 30 fps
put_bottles_dustbin arx-x5_clean_501 of 50
The embodiment whose randomized_500 is empty, working normally in its clean_50 archive. The fault is in one file, not in the robot or the task.
476 frames, 15.9 s at 30 fps
put_bottles_dustbin arx-x5_clean_501 of 50
A second take of the same task and embodiment, for a sense of the variation the release does carry where it carries anything.
383 frames, 12.8 s at 30 fps

The one clip against a complete one

Eight frames evenly spaced across each episode, both from dump_bin_bigbin and both from the randomized_500 variant, so the background randomisation is like for like. Top is the single surviving recording in the franka archive. Bottom is episode 0 of the 500 that the aloha-agilex archive actually contains. Nothing is wrong with the top clip. That is the point. It is an ordinary episode, and it is the only one that survived.

eight frames from the one surviving episode above eight from a complete archive

Which embodiments cover which tasks

A separate gap, and a documented one rather than a fault. The release is 50 tasks against 5 embodiments, and the matrix is not full. Anyone assuming they can hold the task fixed and vary the robot will find that only two embodiments span the whole set.

aloha-agilex50 of 50arx-x550 of 50ur547 of 50franka46 of 50piper37 of 50tasks with data for that embodiment
embodimenttasksmissing
aloha-agilex50complete
arx-x550complete
ur547handover_block, put_bottles_dustbin, put_object_cabinet
franka46handover_block, pick_diverse_bottles, pick_dual_bottles, put_bottles_dustbin
piper37adjust_bottle, click_alarmclock, hanging_mug, place_bread_skillet, place_can_basket, place_cans_plasticbox, place_fan, place_object_basket, put_object_cabinet, rotate_qrcode, scan_object, stack_blocks_three, stack_bowls_three

Why nobody noticed

The dataset card is 24 bytes. It contains a licence line and nothing else, so there is no manifest, no episode count and no checksum to compare an archive against. The only tooling the release ships is _download.py, which calls snapshot_download on the whole repository with no filter, so the documented path costs 1.5 TB and still tells you nothing about what arrived. Both broken archives open cleanly in any zip tool. The failure is only visible if you count files inside them and compare that count to the number in the filename, which is exactly what nothing in the release invites you to do.

What to do about it

Two things, and the first costs nothing. Publish a manifest, one line per archive with its episode count, so that a truncated download and a truncated upload stop being indistinguishable. Regenerate the two archives, or remove them, so that a filename saying 500 is not the only evidence of what should be inside. Until then, anyone training on this release should count the hdf5 files in each archive after unzipping, since two of them will quietly contribute nothing.

Method, and what this is not

No model was trained for this page and no success rate is claimed. It is an integrity audit of the release as published.

A zip file stores a central directory at its end listing every member. Fetching the last 64 KB of each archive with an HTTP Range request, locating the end-of-central-directory record and then pulling the directory itself is enough to know exactly what an archive contains. That is about 150 MB across all 510 archives, against 1.5 TB to download them. Zip64 was handled explicitly, because many of these archives are well over 4 GB and the classic record holds placeholder offsets on those, so reading it alone would mis-locate the directory on precisely the largest files.

The reader was checked before it was trusted. Three archives were downloaded in full and their member lists compared against what the range reader returned. All three matched exactly, including a 982 MB one.

Not measured. Nothing here is a claim about the quality of the demonstrations that are present, only about whether they are present. The trajectory pickles inside the two broken archives were not opened, and the release also ships 124 GB of co-training checkpoints and a 10.6 GB LeRobot conversion that this audit does not cover.

source: huggingface.co/datasets/TianxingChen/RoboTwin2.0 audited 11 September 2026