Suggested tag: v0.2.0 (pyproject is 0.1.17; minor bump for
backward-compatible additions).
Usage: rename [Unreleased] → [0.2.0] - 2026-05-31 in CHANGELOG.md,
then:
git tag -a v0.2.0 -m "MetaSim v0.2.0 — cross-platform infrastructure hardening"
git push origin v0.2.0
gh release create v0.2.0 \
--title "MetaSim v0.2.0 — cross-platform infrastructure hardening" \
--notes-file RELEASE_NOTES_NEXT.mdThis release tightens the BaseSimHandler contract so the same MetaSim code
runs identically on mujoco, sapien3, newton, isaacsim, mjx, isaacgym, and
pybullet — without the silent per-backend divergences that previously broke
downstream experiments.
The release is forward- and backward-compatible. Every behavior change is additive (new warnings, new optional kwargs); no existing call site needs to be modified.
gym.reset(seed=N)actually seeds the simulator now.BaseSimHandlerships a defaultset_seedthat seeds Pythonrandom,numpy, andtorchCPU+CUDA; the seed is forwarded throughParallelHandler(broadcast to workers) andHybridHandler(physics + render). Closes the benchmark reproducibility gap.set_statessilent-drop is gone. The dict keydof_pos_target(which previously silently broke 15 downstream BC experiments) now emits a one-shot warning recommendingset_dof_targets. Same guard for unknown robot/object names, unknown joint names, read-only velocity fields, and partial pose dicts.- Newton joint-name parity. Newton previously returned
box_base/box_jointwhile every other backend returnedbox_joint— cross-platform tasks indexingdof_pos["box_joint"]silently failed. Fixed with safe disambiguation: bare name when unambiguous, full key on collision. - Sapien3
_set_statesno longer raisesKeyErroron missingdof_pos/pos/rot; it defaults to zeros, matching mujoco's behavior. It also instantiates and reads all robots (was only reading the first). - mjx backend unblocked — eager init, JAX 0.10+
__dlpack__protocol, recursive MJCF<include>parser with cycle detection. - ParallelHandler error surfacing —
EOFError/BrokenPipe/ OOM-killed workers now raise aRuntimeErrorcarrying the real worker traceback instead of hanging silently. - Multi-agent (bimanual) trajectory loading lands natively in
get_trajvialist[RobotCfg]. Single-agent path is unchanged.
No required changes. If you previously relied on the silent drop of
set_states({"dof_pos_target": ...}), switch to:
handler.set_dof_targets([{robot_name: {"dof_pos_target": ...}}])If you previously caught KeyError from sapien3 _set_states on missing
dof_pos, that branch is now dead — sapien3 defaults to zeros.
386 general tests pass + 21 xfailed across a 5-backend sweep (general + mujoco + sapien3 + newton + passthroughs). Per-backend PD-convergence shortfalls are xfail-documented with specific reasons (not silenced).
See CHANGELOG.md for the complete commit-by-commit list.