@@ -15,16 +15,65 @@ This document provides a high-level overview of the RoboVerse improvement roadma
1515
1616### P0 - Critical (Immediate)
1717
18- - [ ] ** State Cache Consistency** - Fix data corruption when switching state formats
19- - [ ] ** Test Coverage** - Add validation tests for robot configs and core tasks
18+ - [x] ** State Cache Consistency** - Fixed: dual tensor/dict caches in ` BaseSimHandler ` ,
19+ invalidated on ` set_states ` / ` set_dof_targets ` / ` simulate ` . Regression tests:
20+ ` metasim/test/sim/test_state_modes.py ` (integration) + ` metasim/test/test_set_states_key_validation.py `
21+ (unit, no sim env).
22+ - [x] ** ` set_states ` silent-drop guard** - Added: unknown / control-input keys now log a
23+ one-shot warning (e.g. ` dof_pos_target ` → "use ` set_dof_targets ` "). Catches the silent
24+ no-op bug that broke 15 downstream BC experiments.
25+ - [x] ** Robot-config validation tests** - Added static ` -k general ` tests for every shipped
26+ ` RobotCfg ` : instantiation, non-empty ` name ` , default joint positions match ` joint_limits `
27+ keys + lie inside the limit ranges. Surfaces 9 real config bugs (xfail-documented:
28+ AlohaAgilex/G1Tracking orphan joints, YamCfg/ArxL5Cfg/Vega/SoArm100/Koch/Go2/AllegroHand
29+ out-of-range defaults). ` metasim/test/test_robot_cfg_validation_general.py ` +
30+ ` tests/test_roboverse_robot_cfg_validation.py ` .
31+ - [x] ** Backend contract enforcement** - Static ` -k general ` test asserts every concrete
32+ ` BaseSimHandler ` subclass overrides each documented contract method. Known incomplete
33+ backends (pyrep, partial pybullet/genesis) are xfail-documented. Self-check guards the
34+ xfail list against staleness. ` metasim/test/test_backend_contract_general.py ` .
2035- [ ] ** CI Coverage Reporting** - Integrate pytest-cov with Codecov
2136
2237### P1 - High (Next Release)
2338
24- - [ ] ** Abstract Method Declarations** - Complete @abstractmethod annotations
39+ - [x] ** Parallel-sim error handling** - Fixed: every public method on ` ParallelHandler `
40+ now drains ` error_queue ` + checks ` process.is_alive ` after wire I/O. EOFError/BrokenPipe
41+ on recv is translated into a ` RuntimeError ` carrying the real worker traceback instead
42+ of a cryptic IPC exception. OOM-killed workers (queue stays empty) are surfaced via the
43+ dead-process check. Tests: ` metasim/test/test_parallel_error_handling_general.py ` .
44+ - [x] ** Newton joint-name parity** - Fixed: Newton's ` _collect_joint_names ` now strips
45+ the object prefix (` box_base/box_joint ` → ` box_joint ` ) when the bare name is unambiguous,
46+ matching mujoco / sapien3 / isaacgym / isaacsim. Cross-platform tasks doing
47+ ` dof_pos["box_joint"] ` previously silently broke on Newton. Falls back to the full key
48+ on collision so no information is lost. Verified by ` test_dict_state_all_objects[newton-*] `
49+ flipping from failed to passed.
50+ - [x] ** Newton silent-action drop guard** - Added: Newton's ` _set_dof_targets ` now warns
51+ once if ` model.control() ` has no ` joint_target_pos ` / ` joint_target_vel ` / ` joint_f `
52+ buffer — previously every action was silently swallowed. Same antipattern that broke
53+ MuJoCo ` set_states ` .
54+ - [x] ** Actuator partial-spec warning (MuJoCo + Newton)** - Identified as task #6 root
55+ cause: when an actuator cfg overrides ` stiffness ` / ` damping ` but doesn't set
56+ ` effort_limit_sim ` , the asset-authored force-range (MJCF ` forcerange ` / Newton
57+ ` joint_effort_limit ` ) silently dominates. Same ` stiffness=1e5 ` config produces
58+ different effective behaviour per backend. Both handlers now warn once per
59+ (robot, joint) so the asymmetry is visible.
60+ - [x] ** Benchmark reproducibility — ` env.reset(seed=N) ` now actually reseeds** -
61+ End-to-end wired: ` GymEnvAdapter.reset(seed=) ` → ` RLTaskEnv.reset(seed=) ` /
62+ ` TaskBase.reset(seed=) ` → ` BaseSimHandler.set_seed ` . Added a default
63+ ` set_seed ` on the base handler that reseeds Python ` random ` + NumPy +
64+ Torch (CPU and CUDA), so every backend gets reproducibility for free.
65+ Backends with extra internal RNG (Newton warp kernels, Sapien physics
66+ noise) can override and call ` super().set_seed(seed) ` first. Tests:
67+ ` test_set_seed_is_deterministic_on_numpy_and_torch ` and
68+ ` test_set_seed_differs_with_different_seeds ` in
69+ ` metasim/test/test_set_states_key_validation.py ` . Backward-compat:
70+ ` seed ` is a keyword-only parameter — every existing call site is
71+ unchanged.
72+ - [ ] ** Abstract Method Declarations** - Mostly covered by the new backend-contract test;
73+ still want ` @abstractmethod ` on ` _get_joint_names ` / ` _get_body_names ` once pyrep /
74+ partial pybullet / genesis catch up.
2575- [ ] ** Unified Environment Factory** - Create ` roboverse.make_env() ` API
2676- [ ] ** Configuration System** - Document and standardize config approaches
27- - [ ] ** Error Handling** - Improve parallel simulation error propagation
2877
2978### P2 - Medium (Future)
3079
0 commit comments