Skip to content

Add LeRobot LIBERO policy rollout#2667

Draft
TomCC7 wants to merge 14 commits into
cc/frontierfrom
cc/frontier_/policy-eval
Draft

Add LeRobot LIBERO policy rollout#2667
TomCC7 wants to merge 14 commits into
cc/frontierfrom
cc/frontier_/policy-eval

Conversation

@TomCC7

@TomCC7 TomCC7 commented Jun 30, 2026

Copy link
Copy Markdown
Member

Problem

DimOS had LIBERO runtime plumbing for scripted motor-surface demos, but no policy rollout path that exercised a real LeRobot policy through DimOS-owned inference, contract conversion, native runtime actions, and benchmark evaluation artifacts.

The official LeRobot LIBERO checkpoints use a native relative end-effector delta + gripper action surface, not the existing joint-position motor frame path. That left the policy benchmark blocked on overloaded motor semantics, missing rollout ownership boundaries, and manual environment setup.

Solution

  • Add a native runtime action frame to the shared runtime protocol and support StepRequest action unions.
  • Add native LIBERO action mode to the sidecar while preserving existing motor-frame mode.
  • Add robot-learning rollout components:
    • RobotPolicyModule
    • batch-first PolicyBackend
    • in-process LeRobotBackend
    • VlaJepaLiberoRobotContract
    • BenchmarkPolicyEvalRunner
  • Add a LeRobot VLA-JEPA LIBERO rollout demo/gate script with:
    • 50 episode libero_object matrix
    • strict success_rate > 0.50 gate
    • structured artifacts and optional videos
    • fake-backend smoke path
  • Auto-discover standard LIBERO package assets and create LIBERO config noninteractively.
  • Archive the completed OpenSpec change and sync specs.

Verification

  • uv run ruff check scripts/benchmarks/demo_lerobot_libero_policy_rollout.py dimos/robot_learning/policy_rollout packages/dimos-libero-pro-sidecar/src/dimos_libero_pro_sidecar/server.py packages/dimos-runtime-protocol/src/dimos_runtime_protocol packages/dimos-runtime-protocol/tests/test_models.py dimos/benchmark/runtime/test_libero_pro_sidecar_profile.py
  • uv run pytest packages/dimos-runtime-protocol/tests/test_models.py dimos/benchmark/runtime/test_libero_pro_sidecar_profile.py dimos/benchmark/runtime/test_sidecar_import_boundaries.py dimos/robot_learning/policy_rollout/test_robot_policy_module.py dimos/robot_learning/policy_rollout/test_evaluation.py dimos/robot_learning/policy_rollout/test_lerobot_backend.py dimos/robot_learning/policy_rollout/test_vla_jepa_libero_contract.py -q
  • openspec validate --all
  • External benchmark artifact verified on another machine: 50 episodes, 45 successes, success_rate=0.900, gate threshold > 0.50.

@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

❌ 18 Tests Failed:

Tests completed Failed Passed Skipped
2419 18 2401 167
View the top 3 failed test(s) by shortest run time
::dimos.robot.manipulators.xarm.blueprints.test_gpd_mujoco_grasp_demo
Stack Traces | 0s run time
.../xarm/blueprints/test_gpd_mujoco_grasp_demo.py:41: in <module>
    from dimos.robot.manipulators.xarm.blueprints.simulation import (
        GPDGraspGenModule = <class 'dimos_gpd_grasp_demo.gpd_grasp_gen_module.GPDGraspGenModule'>
        GPD_GRASP_DEMO_ENV_NAME = 'dimos-gpd-grasp-demo'
        GPD_GRASP_DEMO_PROJECT = PosixPath('.../dimos/packages/dimos-gpd-grasp-demo')
        GraspCandidateArray = <class 'dimos.msgs.grasping_msgs.GraspCandidateArray.GraspCandidateArray'>
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        MockerFixture = <class 'pytest_mock.plugin.MockerFixture'>
        ModuleCoordinator = <class 'dimos.core.coordination.module_coordinator.ModuleCoordinator'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        Path       = <class 'pathlib.Path'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PointCloud2 = <class 'dimos.msgs.sensor_msgs.PointCloud2.PointCloud2'>
        PointcloudGraspDemoController = <class 'dimos.manipulation.grasping.pointcloud_grasp_demo_controller.PointcloudGraspDemoController'>
        PythonProjectRuntimeEnvironment = <class 'dimos.core.runtime_environment.PythonProjectRuntimeEnvironment'>
        RegisteredObject = <class 'dimos.msgs.perception_msgs.RegisteredObject.RegisteredObject'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/test_gpd_mujoco_grasp_demo.cpython-312.pyc'
        __doc__    = None
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/test_gpd_mujoco_grasp_demo.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff98be4df650>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.test_gpd_mujoco_grasp_demo'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.test_gpd_mujoco_grasp_demo', loader=<_pytest.assertion.rewri...4df650>, origin='.../work/dimos/dimos/.../xarm/blueprints/test_gpd_mujoco_grasp_demo.py')
        all_blueprints = {'alfred-nav': 'dimos.robot.diy.alfred.blueprints.alfred_nav:alfred_nav', 'coordinator-basic': 'dimos.control.blueprin...oordinator-cartesian-ik-piper': 'dimos.robot.manipulators.piper.blueprints.teleop:coordinator_cartesian_ik_piper', ...}
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        os         = <module 'os' (frozen)>
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
.../xarm/blueprints/simulation.py:50: in <module>
    address=str(XARM7_SIM_PATH),
        GPDGraspGenModule = <class 'dimos_gpd_grasp_demo.gpd_grasp_gen_module.GPDGraspGenModule'>
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PointcloudGraspDemoController = <class 'dimos.manipulation.grasping.pointcloud_grasp_demo_controller.PointcloudGraspDemoController'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        XARM7_SIM_HOME = [0.0, 0.0, 0.0, 0.0, 0.0, -0.7, ...]
        XARM7_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
        XARM7_VGN_OBSERVATION_HOME = [0.0, -0.247, 0.0, 0.909, 0.0, 1.15644, ...]
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/simulation.cpython-312.pyc'
        __doc__    = 'Simulation xArm perception manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/simulation.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff97d6025760>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.simulation', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xff97d6025760>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff988c7bf1a0>
        coordinator = <function coordinator at 0xff981cf980e0>
        gpd_grasp_gen_blueprint = <function gpd_grasp_gen_blueprint at 0xff981c0e25c0>
        make_xarm7_model_config = <function make_xarm7_model_config at 0xff981cf98b80>
        make_xarm_hardware = <function make_xarm_hardware at 0xff981cf98680>
        math       = <module 'math' (built-in)>
        trajectory_task = <function trajectory_task at 0xff981d0e25c0>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        filename   = 'xarm7'
        repo_root  = PosixPath('.../work/dimos/dimos')
dimos/utils/data.py:216: in _lfs_pull
    raise RuntimeError(
E   RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.
        attempt    = 3
        env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '21f75ad5-e1be-40b0-9240-2f549da5c8ee.tests.ubuntu-24_04-arm_3_14_fal', ...}
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz'])
        relative_path = PosixPath('data/.lfs/xarm7.tar.gz')
        repo_root  = PosixPath('.../work/dimos/dimos')
        retries    = 2
::dimos.robot.manipulators.xarm.blueprints.test_vgn_mujoco_grasp_demo
Stack Traces | 0s run time
.../xarm/blueprints/test_vgn_mujoco_grasp_demo.py:20: in <module>
    from dimos.robot.manipulators.xarm.blueprints.simulation import (
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/test_vgn_mujoco_grasp_demo.cpython-312.pyc'
        __doc__    = None
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/test_vgn_mujoco_grasp_demo.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff98be4df650>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.test_vgn_mujoco_grasp_demo'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.test_vgn_mujoco_grasp_demo', loader=<_pytest.assertion.rewri...4df650>, origin='.../work/dimos/dimos/.../xarm/blueprints/test_vgn_mujoco_grasp_demo.py')
.../xarm/blueprints/simulation.py:50: in <module>
    address=str(XARM7_SIM_PATH),
        GPDGraspGenModule = <class 'dimos_gpd_grasp_demo.gpd_grasp_gen_module.GPDGraspGenModule'>
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PointcloudGraspDemoController = <class 'dimos.manipulation.grasping.pointcloud_grasp_demo_controller.PointcloudGraspDemoController'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        XARM7_SIM_HOME = [0.0, 0.0, 0.0, 0.0, 0.0, -0.7, ...]
        XARM7_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
        XARM7_VGN_OBSERVATION_HOME = [0.0, -0.247, 0.0, 0.909, 0.0, 1.15644, ...]
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/simulation.cpython-312.pyc'
        __doc__    = 'Simulation xArm perception manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/simulation.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff97d63330b0>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.simulation', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xff97d63330b0>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff988c7bf1a0>
        coordinator = <function coordinator at 0xff981cf980e0>
        gpd_grasp_gen_blueprint = <function gpd_grasp_gen_blueprint at 0xff981c0e25c0>
        make_xarm7_model_config = <function make_xarm7_model_config at 0xff981cf98b80>
        make_xarm_hardware = <function make_xarm_hardware at 0xff981cf98680>
        math       = <module 'math' (built-in)>
        trajectory_task = <function trajectory_task at 0xff981d0e25c0>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff981cf943d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        filename   = 'xarm7'
        repo_root  = PosixPath('.../work/dimos/dimos')
dimos/utils/data.py:216: in _lfs_pull
    raise RuntimeError(
E   RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.
        attempt    = 3
        env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '21f75ad5-e1be-40b0-9240-2f549da5c8ee.tests.ubuntu-24_04-arm_3_14_fal', ...}
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz'])
        relative_path = PosixPath('data/.lfs/xarm7.tar.gz')
        repo_root  = PosixPath('.../work/dimos/dimos')
        retries    = 2
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_empty_snapshot_returns_none
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95408249b0>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95408249b0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95408249b0>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95408249b0>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_find_by_exact_name
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f1f70>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f1f70>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f1f70>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f1f70>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_find_by_object_id
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081d910>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081d910>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081d910>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081d910>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_find_by_object_id_ambiguous_returns_none
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f0d40>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f0d40>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f0d40>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff95407f0d40>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_find_by_partial_name
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081cf80>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081cf80>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081cf80>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081cf80>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestFindObjectInDetections::test_find_missing_returns_none
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081fe30>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081fe30>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081fe30>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff954081fe30>

dimos/core/module.py:834: TypeError
dimos.manipulation.test_pick_and_place_unit.TestPlaceBack::test_place_back_no_pick_pose_errors
Stack Traces | 0.002s run time
@pytest.fixture
    def module() -> PickAndPlaceModule:
        """Create a PickAndPlaceModule with heavy base init (RPC, config) patched out."""
        with patch.object(ModuleBase, "__init__", lambda self, config_args: None):
>           return PickAndPlaceModule()


dimos/manipulation/test_pick_and_place_unit.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/manipulation/pick_and_place_module.py:84: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff9540826c60>
dimos/manipulation/manipulation_module.py:185: in __init__
    super().__init__(**kwargs)
        __class__  = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        kwargs     = {}
        self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff9540826c60>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff9540826c60>
kwargs = {}
config = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
default_contract = True
decl = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
install_attribute = True

    def __init__(self, **kwargs: Any) -> None:
        self.ref = None
        self._inputs: dict[str, In[Any]] = {}
        self._outputs: dict[str, Out[Any]] = {}
        config = type(self).resolve_config(kwargs)
        io_contract = type(self).io_contract(config)
        default_contract = _uses_default_io_contract(type(self))
        annotated_stream_keys = {
            (decl.name, decl.direction) for decl in _stream_decls_from_annotations(type(self))
        }
    
        for decl in io_contract.streams:
            install_attribute = (
                default_contract or (decl.name, decl.direction) in annotated_stream_keys
            )
            self._register_stream_decl(decl, install_attribute=install_attribute)
>       super().__init__(config_args=kwargs, resolved_config=config)
E       TypeError: module.<locals>.<lambda>() got an unexpected keyword argument 'resolved_config'

__class__  = <class 'dimos.core.module.Module'>
annotated_stream_keys = {('coordinator_joint_state', 'in'), ('objects', 'in')}
config     = PickAndPlaceModuleConfig(rpc_transport=<class 'dimos.protocol.rpc.pubsubrpc.LCMRPC'>, default_rpc_timeout=120.0, rpc_t..._smoothing_max_joint_deviation=0.02, roboplan_smoothing_edge_step_size=0.02, roboplan_smoothing_min_keep_fraction=0.1))
decl       = StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])
default_contract = True
install_attribute = True
io_contract = ModuleIOContract(streams=(StreamDecl(name='coordinator_joint_state', direction='in', type=<class 'dimos.msgs.sensor_ms...'>), StreamDecl(name='objects', direction='in', type=list[dimos.perception.detection.type.detection3d.object.Object])))
kwargs     = {}
self       = <dimos.manipulation.pick_and_place_module.PickAndPlaceModule object at 0xff9540826c60>

dimos/core/module.py:834: TypeError
dimos.core.test_daemon.TestHealthCheck::test_all_unhealthy
Stack Traces | 0.003s run time
self = <dimos.core.test_daemon.TestHealthCheck object at 0xff981c0ba180>

    def test_all_unhealthy(self):
        coord = _mock_coordinator([False, False])
>       assert coord.health_check() is False
E       AssertionError: assert True is False
E        +  where True = health_check()
E        +    where health_check = <MagicMock spec='ModuleCoordinator' id='281027512362688'>.health_check

coord      = <MagicMock spec='ModuleCoordinator' id='281027512362688'>
self       = <dimos.core.test_daemon.TestHealthCheck object at 0xff981c0ba180>

dimos/core/test_daemon.py:173: AssertionError
dimos.core.test_daemon.TestHealthCheck::test_one_unhealthy
Stack Traces | 0.003s run time
self = <dimos.core.test_daemon.TestHealthCheck object at 0xff981c0b9dc0>

    def test_one_unhealthy(self):
        coord = _mock_coordinator([True, False])
>       assert coord.health_check() is False
E       AssertionError: assert True is False
E        +  where True = health_check()
E        +    where health_check = <MagicMock spec='ModuleCoordinator' id='281027548713744'>.health_check

coord      = <MagicMock spec='ModuleCoordinator' id='281027548713744'>
self       = <dimos.core.test_daemon.TestHealthCheck object at 0xff981c0b9dc0>

dimos/core/test_daemon.py:164: AssertionError
dimos.codebase_checks.test_no_init_files::test_no_init_files
Stack Traces | 0.019s run time
def test_no_init_files():
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        init_files = sorted(dimos_dir.rglob("__init__.py"))
        # The root dimos/__init__.py is allowed for the porcelain lazy import.
        init_files = [f for f in init_files if f != dimos_dir / "__init__.py"]
        if init_files:
            listing = "\n".join(f"  - {f.relative_to(dimos_dir)}" for f in init_files)
>           raise AssertionError(
                f"Found __init__.py files in dimos/:\n{listing}\n\n"
                "__init__.py files are not allowed because they lead to unnecessary "
                "extraneous imports. Everything should be imported straight from the "
                "source module."
            )
E           AssertionError: Found __init__.py files in dimos/:
E             - benchmark/runtime/__init__.py
E             - hardware/damiao/__init__.py
E             - .../whole_body/openarm/__init__.py
E             - perception/reconstruction/__init__.py
E             - ....../backends/fixed/__init__.py
E             - simulation/runtime_client/__init__.py
E           
E           __init__.py files are not allowed because they lead to unnecessary extraneous imports. Everything should be imported straight from the source module.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
init_files = [PosixPath('.../dimos/dimos/dimos/benchmark/runtime/__init__.py'), PosixPath('.../work/dimos/di...t.../backends/fixed/__init__.py'), PosixPath('.../dimos/dimos/dimos/simulation/runtime_client/__init__.py')]
listing    = '  - benchmark/runtime/__init__.py\n  - hardware/damiao/__init__.py\n  - .../whole_body/openarm/__init__.py\n  - ...n/__init__.py\n  - ....../backends/fixed/__init__.py\n  - simulation/runtime_client/__init__.py'

dimos/codebase_checks/test_no_init_files.py:25: AssertionError
dimos.robot.cli.test_dimos::test_runtime_prepare_cli_command_exists
Stack Traces | 0.037s run time
def test_runtime_prepare_cli_command_exists():
        result = CliRunner().invoke(main, ["runtime", "prepare", "--help"])
    
        assert result.exit_code == 0, result.output
>       assert "--runtime" in result.output
E       AssertionError: assert '--runtime' in '\x1b[1m                                                                                \x1b[0m\n\x1b[1m \x1b[0m\x1b[1;33mUsage: \x1b[0m\x1b[1mroot runtime prepare [OPTIONS] ROBOT_TYPES...\x1b[0m\x1b[1m                          \x1b[0m\x1b[1m \x1b[0m\n\x1b[1m                                                                                \x1b[0m\n Prepare active Python project runtime environments for a blueprint.            \n                                                                                \n\x1b[2m╭─\x1b[0m\x1b[2m Arguments \x1b[0m\x1b[2m─────────────────────────────────────────────────────────────────\x1b[0m\x1b[2m─╮\x1b[0m\n\x1b[2m│\x1b[0m \x1b[31m*\x1b[0m    robot_types      \x1b[1;33mROBOT_TYPES...\x1b[0m  Blueprints or modules to prepare       \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m                                       \x1b[2;31m[required]                      \x1b[0m       \x1b[2m│\x1b[0m\n\x1b[2m╰──────────────────────────────────────────────────────────────────────────────╯\x1b[0m\n\x1b[2m╭─\x1b[0m\x1b[2m Options \x1b[0m\x1b[2m───────────────────────────────────────────────────────────────────\x1b[0m\x1b[2m─╮\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-runtime\x1b[0m          \x1b[1;33mTEXT\x1b[0m  Runtime name to prepare                             \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-disable\x1b[0m          \x1b[1;33mTEXT\x1b[0m  Module names to disable                             \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-option\x1b[0m   \x1b[1;32m-o\x1b[0m      \x1b[1;33mTEXT\x1b[0m                                                      \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-config\x1b[0m   \x1b[1;32m-c\x1b[0m      \x1b[1;33mPATH\x1b[0m  Path to config file                                 \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m                          \x1b[2m[default: ....../home/runner/.config/dimos]\x1b[0m               \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-help\x1b[0m             \x1b[1;33m    \x1b[0m  Show this message and exit.                         \x1b[2m│\x1b[0m\n\x1b[2m╰──────────────────────────────────────────────────────────────────────────────╯\x1b[0m\n\n'
E        +  where '\x1b[1m                                                                                \x1b[0m\n\x1b[1m \x1b[0m\x1b[1;33mUsage: \x1b[0m\x1b[1mroot runtime prepare [OPTIONS] ROBOT_TYPES...\x1b[0m\x1b[1m                          \x1b[0m\x1b[1m \x1b[0m\n\x1b[1m                                                                                \x1b[0m\n Prepare active Python project runtime environments for a blueprint.            \n                                                                                \n\x1b[2m╭─\x1b[0m\x1b[2m Arguments \x1b[0m\x1b[2m─────────────────────────────────────────────────────────────────\x1b[0m\x1b[2m─╮\x1b[0m\n\x1b[2m│\x1b[0m \x1b[31m*\x1b[0m    robot_types      \x1b[1;33mROBOT_TYPES...\x1b[0m  Blueprints or modules to prepare       \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m                                       \x1b[2;31m[required]                      \x1b[0m       \x1b[2m│\x1b[0m\n\x1b[2m╰──────────────────────────────────────────────────────────────────────────────╯\x1b[0m\n\x1b[2m╭─\x1b[0m\x1b[2m Options \x1b[0m\x1b[2m───────────────────────────────────────────────────────────────────\x1b[0m\x1b[2m─╮\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-runtime\x1b[0m          \x1b[1;33mTEXT\x1b[0m  Runtime name to prepare                             \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-disable\x1b[0m          \x1b[1;33mTEXT\x1b[0m  Module names to disable                             \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-option\x1b[0m   \x1b[1;32m-o\x1b[0m      \x1b[1;33mTEXT\x1b[0m                                                      \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-config\x1b[0m   \x1b[1;32m-c\x1b[0m      \x1b[1;33mPATH\x1b[0m  Path to config file                                 \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m                          \x1b[2m[default: ....../home/runner/.config/dimos]\x1b[0m               \x1b[2m│\x1b[0m\n\x1b[2m│\x1b[0m \x1b[1;36m-\x1b[0m\x1b[1;36m-help\x1b[0m             \x1b[1;33m    \x1b[0m  Show this message and exit.                         \x1b[2m│\x1b[0m\n\x1b[2m╰──────────────────────────────────────────────────────────────────────────────╯\x1b[0m\n\n' = <Result okay>.output

result     = <Result okay>

.../robot/cli/test_dimos.py:417: AssertionError
dimos.hardware.whole_body.openarm.test_adapter::test_openarm_dual_configures_side_gravity_models
Stack Traces | 3.11s run time
def test_openarm_dual_configures_side_gravity_models() -> None:
        adapter = OpenArmDualWholeBodyAdapter(use_mock_bus=True)
    
        left = adapter._robot_spec.groups["left_arm"]
        right = adapter._robot_spec.groups["right_arm"]
>       assert str(left.gravity_model_path).endswith("openarm_v10_left.urdf")

adapter    = <dimos.hardware.whole_body.openarm.adapter.OpenArmDualWholeBodyAdapter object at 0xffcc9d1d4c50>
left       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...scription.tar.gz']' returned non-zero exit status 1.") raised in repr()] DamiaoJointGroupSpec object at 0xffcc9d1d4530>
right      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...scription.tar.gz']' returned non-zero exit status 1.") raised in repr()] DamiaoJointGroupSpec object at 0xffcc9d1d5340>

.../whole_body/openarm/test_adapter.py:62: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...fs/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcbe006dfd0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../urdf/robot/openarm_v10_left.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...fs/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcbe006dfd0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'openarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../urdf/robot/openarm_v10_left.urdf')
        name       = '.../urdf/robot/openarm_v10_left.urdf'
        nested_path = PosixPath('urdf/robot/openarm_v10_left.urdf')
        path_parts = ('openarm_description', 'urdf', 'robot', 'openarm_v10_left.urdf')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/openarm_description.tar.gz')
        filename   = 'openarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/openarm_description.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/openarm_description.tar.gz']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '21f75ad5-e1be-40b0-9240-2f549da5c8ee.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/openarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/openarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/openarm_description.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[gpd-mujoco-grasp-demo]
Stack Traces | 3.12s run time
blueprint_name = 'gpd-mujoco-grasp-demo'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'gpd-mujoco-grasp-demo'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'gpd-mujoco-grasp-demo'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'gpd_mujoco_grasp_demo'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        name       = 'gpd-mujoco-grasp-demo'
.../xarm/blueprints/simulation.py:50: in <module>
    address=str(XARM7_SIM_PATH),
        GPDGraspGenModule = <class 'dimos_gpd_grasp_demo.gpd_grasp_gen_module.GPDGraspGenModule'>
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PointcloudGraspDemoController = <class 'dimos.manipulation.grasping.pointcloud_grasp_demo_controller.PointcloudGraspDemoController'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        XARM7_SIM_HOME = [0.0, 0.0, 0.0, 0.0, 0.0, -0.7, ...]
        XARM7_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
        XARM7_VGN_OBSERVATION_HOME = [0.0, -0.247, 0.0, 0.909, 0.0, 1.15644, ...]
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/simulation.cpython-312.pyc'
        __doc__    = 'Simulation xArm perception manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/simulation.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffcbc5005a90>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.simulation', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xffcbc5005a90>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffcc7e7c1c60>
        coordinator = <function coordinator at 0xffcc0e986200>
        gpd_grasp_gen_blueprint = <function gpd_grasp_gen_blueprint at 0xffcc0d1b9300>
        make_xarm7_model_config = <function make_xarm7_model_config at 0xffcc0e986c00>
        make_xarm_hardware = <function make_xarm_hardware at 0xffcc0e986700>
        math       = <module 'math' (built-in)>
        trajectory_task = <function trajectory_task at 0xffcc0e985f80>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        filename   = 'xarm7'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '21f75ad5-e1be-40b0-9240-2f549da5c8ee.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm7.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[vgn-mujoco-grasp-demo]
Stack Traces | 3.13s run time
blueprint_name = 'vgn-mujoco-grasp-demo'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'vgn-mujoco-grasp-demo'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'vgn-mujoco-grasp-demo'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'vgn_mujoco_grasp_demo'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        name       = 'vgn-mujoco-grasp-demo'
.../xarm/blueprints/simulation.py:50: in <module>
    address=str(XARM7_SIM_PATH),
        GPDGraspGenModule = <class 'dimos_gpd_grasp_demo.gpd_grasp_gen_module.GPDGraspGenModule'>
        GraspingModule = <class 'dimos.manipulation.grasping.grasping.GraspingModule'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PointcloudGraspDemoController = <class 'dimos.manipulation.grasping.pointcloud_grasp_demo_controller.PointcloudGraspDemoController'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SceneReconstructionModule = <class 'dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule'>
        TargetGraspDemoController = <class 'dimos.manipulation.grasping.target_grasp_demo_controller.TargetGraspDemoController'>
        VGNGraspGenModule = <class 'dimos.manipulation.grasping.vgn_grasp_gen_module.VGNGraspGenModule'>
        XARM7_SIM_HOME = [0.0, 0.0, 0.0, 0.0, 0.0, -0.7, ...]
        XARM7_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
        XARM7_VGN_OBSERVATION_HOME = [0.0, -0.247, 0.0, 0.909, 0.0, 1.15644, ...]
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/simulation.cpython-312.pyc'
        __doc__    = 'Simulation xArm perception manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/simulation.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffcbc396eba0>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.simulation', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xffcbc396eba0>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffcc7e7c1c60>
        coordinator = <function coordinator at 0xffcc0e986200>
        gpd_grasp_gen_blueprint = <function gpd_grasp_gen_blueprint at 0xffcc0d1b9300>
        make_xarm7_model_config = <function make_xarm7_model_config at 0xffcc0e986c00>
        make_xarm_hardware = <function make_xarm_hardware at 0xffcc0e986700>
        math       = <module 'math' (built-in)>
        trajectory_task = <function trajectory_task at 0xffcc0e985f80>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command...ude', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffcc0e988150>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
        filename   = 'xarm7'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    ["git", "lfs", "pull", "--include", str(relative_path)],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/xarm7.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '21f75ad5-e1be-40b0-9240-2f549da5c8ee.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm7.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm7.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm7.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.robot.test_all_blueprints_generation::test_all_blueprints_is_current
Stack Traces | 3.77s run time
def test_all_blueprints_is_current() -> None:
        root = DIMOS_PROJECT_ROOT / "dimos"
        all_blueprints, all_modules = _scan_for_blueprints(root)
    
        common = set(all_blueprints.keys()) & set(all_modules.keys())
        assert not common, (
            f"Names must be unique across blueprints and modules, "
            f"but these appear in both: {sorted(common)}"
        )
    
        generated_content = _generate_all_blueprints_content(all_blueprints, all_modules)
    
        file_path = root / "robot" / "all_blueprints.py"
    
        if "CI" in os.environ:
            if not file_path.exists():
                pytest.fail(f"all_blueprints.py does not exist at {file_path}")
    
            current_content = file_path.read_text()
            if current_content != generated_content:
                diff = difflib.unified_diff(
                    current_content.splitlines(keepends=True),
                    generated_content.splitlines(keepends=True),
                    fromfile="all_blueprints.py (current)",
                    tofile="all_blueprints.py (generated)",
                )
                diff_str = "".join(diff)
>               pytest.fail(
                    f"all_blueprints.py is out of date. Run "
                    f"`pytest dimos/robot/test_all_blueprints_generation.py` locally to update.\n\n"
                    f"Diff:\n{diff_str}"
                )
E               Failed: all_blueprints.py is out of date. Run `pytest dimos/robot/test_all_blueprints_generation.py` locally to update.
E               
E               Diff:
E               --- all_blueprints.py (current)
E               +++ all_blueprints.py (generated)
E               @@ -153,6 +153,7 @@
E                    "b-box-navigation-module": "dimos.navigation.bbox_navigation.BBoxNavigationModule",
E                    "b1-connection-module": "dimos.robot.unitree.b1.connection.B1ConnectionModule",
E                    "basic-path-follower": "dimos.navigation.basic_path_follower.module.BasicPathFollower",
E               +    "benchmark-policy-eval-module": "dimos.robot_learning.policy_rollout.evaluation.BenchmarkPolicyEvalModule",
E                    "camera-module": "dimos.hardware.sensors.camera.module.CameraModule",
E                    "cartesian-motion-controller": "dimos.manipulation.control.servo_control.cartesian_motion_controller.CartesianMotionController",
E                    "click-start-goal-router": "dimos.navigation.cmu_nav.modules.click_start_goal_router.click_start_goal_router.ClickStartGoalRouter",
E               @@ -247,6 +248,7 @@
E                    "replanning-a-star-planner": "dimos.navigation.replanning_a_star.module.ReplanningAStarPlanner",
E                    "rerun-bridge-module": "dimos.visualization.rerun.bridge.RerunBridgeModule",
E                    "rerun-web-socket-server": "dimos.visualization.rerun.websocket_server.RerunWebSocketServer",
E               +    "robot-policy-module": "dimos.robot_learning.policy_rollout.robot_policy_module.RobotPolicyModule",
E                    "scene-reconstruction-module": "dimos.perception.reconstruction.scene_reconstruction.SceneReconstructionModule",
E                    "security-module": "dimos.experimental.security_demo.security_module.SecurityModule",
E                    "semantic-search": "dimos.memory2.module.SemanticSearch",

all_blueprints = {'alfred-nav': 'dimos.robot.diy.alfred.blueprints.alfred_nav:alfred_nav', 'coordinator-basic': 'dimos.control.blueprin...oordinator-cartesian-ik-piper': 'dimos.robot.manipulators.piper.blueprints.teleop:coordinator_cartesian_ik_piper', ...}
all_modules = {'agentic-manipulation-module': 'dimos.manipulation.agentic_manipulation_module.AgenticManipulationModule', 'alfred-hi...t_extensions.ArmTeleopModule', 'b-box-navigation-module': 'dimos.navigation.bbox_navigation.BBoxNavigationModule', ...}
common     = set()
current_content = '# Copyright 2025-2026 Dimensional Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the "License");\n# you m...ebsocket_vis_module.WebsocketVisModule",\n    "zed-camera": "dimos.hardware.sensors.camera.zed.camera.ZEDCamera",\n}\n'
diff       = <generator object unified_diff at 0xffcc9f148ba0>
diff_str   = '--- all_blueprints.py (current)\n+++ all_blueprints.py (generated)\n@@ -153,6 +153,7 @@\n     "b-box-navigation-modul...ental.security_demo.security_module.SecurityModule",\n     "semantic-search": "dimos.memory2.module.SemanticSearch",\n'
file_path  = PosixPath('.../dimos/robot/all_blueprints.py')
generated_content = '# Copyright 2025-2026 Dimensional Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the "License");\n# you m...ebsocket_vis_module.WebsocketVisModule",\n    "zed-camera": "dimos.hardware.sensors.camera.zed.camera.ZEDCamera",\n}\n'
root       = PosixPath('.../dimos/dimos/dimos')

dimos/robot/test_all_blueprints_generation.py:76: Failed
dimos.codebase_checks.test_no_all::test_no_all
Stack Traces | 5.9s run time
def test_no_all():
        """Fail if any file defines `__all__`."""
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        hits = find_all_definitions()
        if hits:
            listing = "\n".join(f"  - {p.relative_to(dimos_dir)}:{lineno}" for p, lineno in hits)
>           raise AssertionError(
                f"Found __all__ definition(s) in dimos/:\n{listing}\n\n"
                "__all__ is not allowed. We don't use `from x import *`, so __all__ "
                "lists serve no purpose and are tedious to maintain. Remove them. For "
                "an import that exists purely to be re-exported, use `# noqa: F401`."
            )
E           AssertionError: Found __all__ definition(s) in dimos/:
E             - hardware/damiao/__init__.py:28
E             - hardware/damiao/arm_adapter.py:408
E             - hardware/damiao/runtime.py:372
E             - hardware/damiao/specs.py:309
E             - hardware/damiao/whole_body_adapter.py:251
E             - .../manipulators/a750/__registry__.py:19
E             - .../manipulators/mock/__registry__.py:19
E             - .../manipulators/openarm/__registry__.py:19
E             - .../manipulators/openarm_rs/__registry__.py:19
E             - .../manipulators/openarm_rs/adapter.py:132
E             - .../manipulators/piper/__registry__.py:19
E             - hardware/manipulators/registry.py:150
E             - .../manipulators/sim/__registry__.py:19
E             - .../manipulators/xarm/__registry__.py:19
E             - .../whole_body/openarm/adapter.py:169
E             - perception/reconstruction/__init__.py:20
E           
E           __all__ is not allowed. We don't use `from x import *`, so __all__ lists serve no purpose and are tedious to maintain. Remove them. For an import that exists purely to be re-exported, use `# noqa: F401`.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
hits       = [(PosixPath('.../dimos/dimos/dimos/hardware/damiao/__init__.py'), 28), (PosixPath('.../runner/work/dim...ter.py'), 251), (PosixPath('.../dimos/dimos/dimos/.../manipulators/a750/__registry__.py'), 19), ...]
listing    = '  - hardware/damiao/__init__.py:28\n  - hardware/damiao/arm_adapter.py:408\n  - hardware/damiao/runtime.py:372\n  - h.../xarm/__registry__.py:19\n  - .../whole_body/openarm/adapter.py:169\n  - perception/reconstruction/__init__.py:20'

dimos/codebase_checks/test_no_all.py:51: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@TomCC7 TomCC7 force-pushed the cc/frontier_/policy-eval branch from 6567ead to 84d6ab2 Compare June 30, 2026 23:00
Comment thread dimos/robot_learning/policy_rollout/backends/lerobot/backend.py
Comment thread dimos/robot_learning/policy_rollout/backends/lerobot/__init__.py
Comment thread dimos/robot_learning/policy_rollout/backends/backend.py
Comment thread dimos/robot_learning/policy_rollout/lerobot_backend.py Outdated
Comment thread dimos/robot_learning/policy_rollout/lerobot_backend.py Outdated
Comment thread dimos/robot_learning/policy_rollout/lerobot_backend.py Outdated


@dataclass(frozen=True)
class RobotLearningSample:

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bad name. if it's an input sample it should be named better. a bunch of ids that's not really used within module is added. also episode_id is a benchmark specific thing, should not be here at all. And, what's the performance of using lcm to transmit a large dictionary of images? is there a way to do it without serialization?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partially addressed in 072b32f: renamed RobotLearningSample to RobotPolicyObservation, removed benchmark-specific ids and top-level task from the policy observation, and keep language in metadata/observations for the contract. I left the image dictionary transport/performance question for a separate design pass rather than mixing transport redesign into this cleanup.

Comment thread dimos/robot_learning/policy_rollout/models.py Outdated
Comment thread dimos/robot_learning/policy_rollout/contract.py Outdated
Comment thread dimos/robot_learning/policy_rollout/lerobot_backend.py Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant