Skip to content

Grasp Demo branch with sim - #3301

Draft
mustafab0 wants to merge 18 commits into
manip/grasp-sprint-july-26from
manip/grasp-sprint-july-26-sim
Draft

Grasp Demo branch with sim#3301
mustafab0 wants to merge 18 commits into
manip/grasp-sprint-july-26from
manip/grasp-sprint-july-26-sim

Conversation

@mustafab0

Copy link
Copy Markdown
Contributor

A sim exploration of grasping

mustafab0 added 10 commits July 30, 2026 06:43
A PD-held arm rests 1e-4..1e-3 rad off target, so microradian equality
gates rejected every preview-then-execute pick and every plan requested
while the arm merely held position (INVALID_START / 'no longer matches
the stored plan start'). 0.01 rad absorbs hold jitter and still catches
a genuinely moved arm.
… manip/grasp-sprint-july-26-sim

# Conflicts:
#	dimos/manipulation/planning/world/roboplan_world.py
#	dimos/robot/manipulators/xarm/blueprints/simulation.py
Compose GraspGenXModule into xarm-grasp-sim so pick's provider path runs
learned proposals (autoconnect fills the GraspGenSpec ref); CC's xArm gripper
config from grasp_config. xarm-perception-sim is unchanged.

Adds static_box_obstacles to ManipulationModuleConfig next to floor_z: startup
box obstacles for scene furniture the planner must always respect. The
grasp-sim table matches data/xarm_grasp_sim/scene.xml.
@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

❌ 7 Tests Failed:

Tests completed Failed Passed Skipped
3501 7 3494 234
View the top 3 failed test(s) by shortest run time
::dimos.robot.manipulators.test_blueprints
Stack Traces | 0s run time
.../robot/manipulators/test_blueprints.py:52: in <module>
    from dimos.robot.manipulators.xarm.blueprints.agentic import (
        Any        = typing.Any
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        ManipulationModuleConfig = <class 'dimos.manipulation.manipulation_module.ManipulationModuleConfig'>
        McpClient  = <class 'dimos.agents.mcp.mcp_client.McpClient'>
        McpServer  = <class 'dimos.agents.mcp.mcp_server.McpServer'>
        NoManipulationVisualizationConfig = <class 'dimos.manipulation.visualization.config.NoManipulationVisualizationConfig'>
        ObjectSceneRegistrationModule = <class 'dimos.perception.object_scene_registration.ObjectSceneRegistrationModule'>
        Path       = <class 'pathlib.Path'>
        PickAndPlaceModule = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModule'>
        PickAndPlaceModuleConfig = <class 'dimos.manipulation.pick_and_place_module.PickAndPlaceModuleConfig'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        ViserVisualizationConfig = <class 'dimos.manipulation.visualization.viser.config.ViserVisualizationConfig'>
        __builtins__ = <builtins>
        __cached__ = '.../manipulators/__pycache__/test_blueprints.cpython-312.pyc'
        __doc__    = None
        __file__   = '.../work/dimos/dimos/.../robot/manipulators/test_blueprints.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff2d69dc9670>
        __name__   = 'dimos.robot.manipulators.test_blueprints'
        __package__ = 'dimos.robot.manipulators'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.test_blueprints', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff2d69dc9670>, origin='.../work/dimos/dimos/.../robot/manipulators/test_blueprints.py')
        coordinator_teleop_piper = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem...fs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c715670>
        eef_twist_task = <function eef_twist_task at 0xff2c6c21c220>
        get_blueprint_by_name = <function get_blueprint_by_name at 0xff2cb9c11e40>
        keyboard_teleop_a1z = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a1z_description.tar.gz after 3 attempt....lfs/a1z_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6c1a00>
        keyboard_teleop_a750 = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...lfs/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6c2d20>
        keyboard_teleop_openarm = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6d6210>
        keyboard_teleop_openarm_mock = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6d54f0>
        keyboard_teleop_openyam = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/yam_description.tar.gz after 3 attempt....lfs/yam_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6d7050>
        keyboard_teleop_piper = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem...fs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c714590>
        planner    = <function planner at 0xff2c6c21c4a0>
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
.../xarm/blueprints/agentic.py:29: in <module>
    from dimos.robot.manipulators.xarm.blueprints.simulation import (
        BASE_MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm.\n\nAvailable skills:\n- get_robot_state: Get... FAULT, call reset before retrying.\nAfter a planning failure, call reset before attempting more planning or motion.\n'
        MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm with an eye-in-hand RealSense camera and a gr...s only when they are known to be stale. After any robot motion fault, call **reset** before more planning or motion.\n'
        McpClient  = <class 'dimos.agents.mcp.mcp_client.McpClient'>
        McpServer  = <class 'dimos.agents.mcp.mcp_server.McpServer'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/agentic.cpython-312.pyc'
        __doc__    = 'Agentic xArm manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/agentic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff2c6c715f70>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.agentic'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.agentic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff2c6c715f70>, origin='.../work/dimos/dimos/.../xarm/blueprints/agentic.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff2d517e6160>
        xarm7_planner_coordinator = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c725070>
        xarm_graspgenx = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6cb810a0>
        xarm_perception = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c6c1ca0>
.../xarm/blueprints/simulation.py:72: in <module>
    name: str(_XARM_GRASP_MESH_DIR / f"{name}.obj")
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        LfsPath    = <class 'dimos.utils.data.LfsPath'>
        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'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        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 0xff2c80a99350>
        XARM_GRASP_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff2c80a99bd0>
        _XARM_GRASP_MESH_DIR = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff2c6cbe5050>
        _XARM_GRASP_TABLE = {'center': (0.47, 0.0, 0.065), 'name': 'table', 'size': (0.38, 0.6, 0.13)}
        __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 0xff2c6c744710>
        __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 0xff2c6c744710>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        _xarm7_perception_sim = <function _xarm7_perception_sim at 0xff2c6cc22ca0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff2d517e6160>
        coordinator = <function coordinator at 0xff2c6c21c400>
        make_xarm7_sim_hardware = <function make_xarm7_sim_hardware at 0xff2c80a61800>
        make_xarm7_sim_module_kwargs = <function make_xarm7_sim_module_kwargs at 0xff2c80a618a0>
        make_xarm7_sim_robot_config = <function make_xarm7_sim_robot_config at 0xff2c80a616c0>
        make_xarm_graspgenx_config = <function make_xarm_graspgenx_config at 0xff2c80a51da0>
        trajectory_task = <function trajectory_task at 0xff2c6c21c0e0>
        xarm_perception_sim = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff2c6c746810>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff2c6cbe50d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../assets/manip/bottle.obj'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff2c6cbe50d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_grasp_sim'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../assets/manip/bottle.obj')
        name       = '.../assets/manip/bottle.obj'
        nested_path = PosixPath('assets/manip/bottle.obj')
        path_parts = ('xarm_grasp_sim', 'assets', 'manip', 'bottle.obj')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        filename   = 'xarm_grasp_sim'
        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/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.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': '5fe9c95b-e814-45c8-bf1b-f77907eb5912.tests.ubuntu-24_04-arm_3_14_fal', ...}
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz'])
        relative_path = PosixPath('data/.lfs/xarm_grasp_sim.tar.gz')
        repo_root  = PosixPath('.../work/dimos/dimos')
        retries    = 2
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[xarm-grasp-sim]
Stack Traces | 3.12s run time
blueprint_name = 'xarm-grasp-sim'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
>       blueprint = _get_blueprint_or_skip(blueprint_name)

blueprint_name = 'xarm-grasp-sim'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'xarm-grasp-sim'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'xarm_grasp_sim'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        name       = 'xarm-grasp-sim'
.../xarm/blueprints/simulation.py:72: in <module>
    name: str(_XARM_GRASP_MESH_DIR / f"{name}.obj")
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        LfsPath    = <class 'dimos.utils.data.LfsPath'>
        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'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        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 0xffe41b44b4d0>
        XARM_GRASP_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe41b44ad50>
        _XARM_GRASP_MESH_DIR = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe4015fa450>
        _XARM_GRASP_TABLE = {'center': (0.47, 0.0, 0.065), 'name': 'table', 'size': (0.38, 0.6, 0.13)}
        __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 0xffe401611cd0>
        __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 0xffe401611cd0>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        _xarm7_perception_sim = <function _xarm7_perception_sim at 0xffe401609c60>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffe4ec1ba160>
        coordinator = <function coordinator at 0xffe406ecc040>
        make_xarm7_sim_hardware = <function make_xarm7_sim_hardware at 0xffe41b5a6660>
        make_xarm7_sim_module_kwargs = <function make_xarm7_sim_module_kwargs at 0xffe41b5a6700>
        make_xarm7_sim_robot_config = <function make_xarm7_sim_robot_config at 0xffe41b5a6520>
        make_xarm_graspgenx_config = <function make_xarm_graspgenx_config at 0xffe41b5e6d40>
        trajectory_task = <function trajectory_task at 0xffe406e9fce0>
        xarm_perception_sim = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffe401613470>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe4015fa4d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../assets/manip/bottle.obj'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe4015fa4d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_grasp_sim'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../assets/manip/bottle.obj')
        name       = '.../assets/manip/bottle.obj'
        nested_path = PosixPath('assets/manip/bottle.obj')
        path_parts = ('xarm_grasp_sim', 'assets', 'manip', 'bottle.obj')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        filename   = 'xarm_grasp_sim'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.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/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.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': '5fe9c95b-e814-45c8-bf1b-f77907eb5912.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_grasp_sim.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[xarm-grasp-sim]
Stack Traces | 3.12s run time
blueprint_name = 'xarm-grasp-sim'

    @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 = 'xarm-grasp-sim'

dimos/robot/test_all_blueprints.py:109: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:85: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'xarm-grasp-sim'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'xarm_grasp_sim'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.simulation'
        name       = 'xarm-grasp-sim'
.../xarm/blueprints/simulation.py:72: in <module>
    name: str(_XARM_GRASP_MESH_DIR / f"{name}.obj")
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        LfsPath    = <class 'dimos.utils.data.LfsPath'>
        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'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        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 0xffd78ddb9950>
        XARM_GRASP_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd78ddba650>
        _XARM_GRASP_MESH_DIR = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774ae6250>
        _XARM_GRASP_TABLE = {'center': (0.47, 0.0, 0.065), 'name': 'table', 'size': (0.38, 0.6, 0.13)}
        __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 0xffd774af6720>
        __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 0xffd774af6720>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        _xarm7_perception_sim = <function _xarm7_perception_sim at 0xffd774cdb6a0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffd85e8ea160>
        coordinator = <function coordinator at 0xffd77938cae0>
        make_xarm7_sim_hardware = <function make_xarm7_sim_hardware at 0xffd78de94540>
        make_xarm7_sim_module_kwargs = <function make_xarm7_sim_module_kwargs at 0xffd78de945e0>
        make_xarm7_sim_robot_config = <function make_xarm7_sim_robot_config at 0xffd78de94400>
        make_xarm_graspgenx_config = <function make_xarm_graspgenx_config at 0xffd78de64ae0>
        trajectory_task = <function trajectory_task at 0xffd77938c7c0>
        xarm_perception_sim = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffd774b24590>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774ae62d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../assets/manip/bottle.obj'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774ae62d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_grasp_sim'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../assets/manip/bottle.obj')
        name       = '.../assets/manip/bottle.obj'
        nested_path = PosixPath('assets/manip/bottle.obj')
        path_parts = ('xarm_grasp_sim', 'assets', 'manip', 'bottle.obj')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        filename   = 'xarm_grasp_sim'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.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/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.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': '5fe9c95b-e814-45c8-bf1b-f77907eb5912.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_grasp_sim.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:216: RuntimeError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[xarm-grasp-sim-agent]
Stack Traces | 3.13s run time
blueprint_name = 'xarm-grasp-sim-agent'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
>       blueprint = _get_blueprint_or_skip(blueprint_name)

blueprint_name = 'xarm-grasp-sim-agent'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'xarm-grasp-sim-agent'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'xarm_grasp_sim_agent'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.agentic'
        name       = 'xarm-grasp-sim-agent'
.../xarm/blueprints/agentic.py:29: in <module>
    from dimos.robot.manipulators.xarm.blueprints.simulation import (
        BASE_MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm.\n\nAvailable skills:\n- get_robot_state: Get... FAULT, call reset before retrying.\nAfter a planning failure, call reset before attempting more planning or motion.\n'
        MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm with an eye-in-hand RealSense camera and a gr...s only when they are known to be stale. After any robot motion fault, call **reset** before more planning or motion.\n'
        McpClient  = <class 'dimos.agents.mcp.mcp_client.McpClient'>
        McpServer  = <class 'dimos.agents.mcp.mcp_server.McpServer'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/agentic.cpython-312.pyc'
        __doc__    = 'Agentic xArm manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/agentic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffe4014808c0>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.agentic'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.agentic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xffe4014808c0>, origin='.../work/dimos/dimos/.../xarm/blueprints/agentic.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffe4ec1ba160>
        xarm7_planner_coordinator = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffe40726a7b0>
        xarm_graspgenx = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffe40752dbe0>
        xarm_perception = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffe4072636e0>
.../xarm/blueprints/simulation.py:72: in <module>
    name: str(_XARM_GRASP_MESH_DIR / f"{name}.obj")
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        LfsPath    = <class 'dimos.utils.data.LfsPath'>
        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'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        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 0xffe41b44b4d0>
        XARM_GRASP_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe41b44ad50>
        _XARM_GRASP_MESH_DIR = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe401547f50>
        _XARM_GRASP_TABLE = {'center': (0.47, 0.0, 0.065), 'name': 'table', 'size': (0.38, 0.6, 0.13)}
        __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 0xffe401480890>
        __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 0xffe401480890>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        _xarm7_perception_sim = <function _xarm7_perception_sim at 0xffe40160b240>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffe4ec1ba160>
        coordinator = <function coordinator at 0xffe406ecc040>
        make_xarm7_sim_hardware = <function make_xarm7_sim_hardware at 0xffe41b5a6660>
        make_xarm7_sim_module_kwargs = <function make_xarm7_sim_module_kwargs at 0xffe41b5a6700>
        make_xarm7_sim_robot_config = <function make_xarm7_sim_robot_config at 0xffe41b5a6520>
        make_xarm_graspgenx_config = <function make_xarm_graspgenx_config at 0xffe41b5e6d40>
        trajectory_task = <function trajectory_task at 0xffe406e9fce0>
        xarm_perception_sim = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffe401482210>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe401467a50>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../assets/manip/bottle.obj'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe401467a50>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_grasp_sim'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../assets/manip/bottle.obj')
        name       = '.../assets/manip/bottle.obj'
        nested_path = PosixPath('assets/manip/bottle.obj')
        path_parts = ('xarm_grasp_sim', 'assets', 'manip', 'bottle.obj')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        filename   = 'xarm_grasp_sim'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.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/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.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': '5fe9c95b-e814-45c8-bf1b-f77907eb5912.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_grasp_sim.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[xarm-grasp-sim-agent]
Stack Traces | 3.13s run time
blueprint_name = 'xarm-grasp-sim-agent'

    @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 = 'xarm-grasp-sim-agent'

dimos/robot/test_all_blueprints.py:109: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:85: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'xarm-grasp-sim-agent'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1."
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'xarm_grasp_sim_agent'
        module_path = 'dimos.robot.manipulators.xarm.blueprints.agentic'
        name       = 'xarm-grasp-sim-agent'
.../xarm/blueprints/agentic.py:29: in <module>
    from dimos.robot.manipulators.xarm.blueprints.simulation import (
        BASE_MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm.\n\nAvailable skills:\n- get_robot_state: Get... FAULT, call reset before retrying.\nAfter a planning failure, call reset before attempting more planning or motion.\n'
        MANIPULATION_AGENT_SYSTEM_PROMPT = 'You are a robotic manipulation assistant controlling an xArm7 robot arm with an eye-in-hand RealSense camera and a gr...s only when they are known to be stale. After any robot motion fault, call **reset** before more planning or motion.\n'
        McpClient  = <class 'dimos.agents.mcp.mcp_client.McpClient'>
        McpServer  = <class 'dimos.agents.mcp.mcp_server.McpServer'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/agentic.cpython-312.pyc'
        __doc__    = 'Agentic xArm manipulation blueprints.'
        __file__   = '.../work/dimos/dimos/.../xarm/blueprints/agentic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xffd774b30dd0>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints.agentic'
        __package__ = 'dimos.robot.manipulators.xarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints.agentic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xffd774b30dd0>, origin='.../work/dimos/dimos/.../xarm/blueprints/agentic.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffd85e8ea160>
        xarm7_planner_coordinator = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffd7798f09e0>
        xarm_graspgenx = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffd7798f3f50>
        xarm_perception = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffd77a4066c0>
.../xarm/blueprints/simulation.py:72: in <module>
    name: str(_XARM_GRASP_MESH_DIR / f"{name}.obj")
        GraspGenXModule = <class 'dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule'>
        LfsPath    = <class 'dimos.utils.data.LfsPath'>
        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'>
        RerunBridgeModule = <class 'dimos.visualization.rerun.bridge.RerunBridgeModule'>
        SimObjectScene = <class 'dimos.perception.sim_object_scene.SimObjectScene'>
        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 0xffd78ddb9950>
        XARM_GRASP_SIM_PATH = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd78ddba650>
        _XARM_GRASP_MESH_DIR = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774b3f6d0>
        _XARM_GRASP_TABLE = {'center': (0.47, 0.0, 0.065), 'name': 'table', 'size': (0.38, 0.6, 0.13)}
        __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 0xffd774b30b90>
        __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 0xffd774b30b90>, origin='.../work/dimos/dimos/.../xarm/blueprints/simulation.py')
        _xarm7_perception_sim = <function _xarm7_perception_sim at 0xffd774b58ae0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xffd85e8ea160>
        coordinator = <function coordinator at 0xffd77938cae0>
        make_xarm7_sim_hardware = <function make_xarm7_sim_hardware at 0xffd78de94540>
        make_xarm7_sim_module_kwargs = <function make_xarm7_sim_module_kwargs at 0xffd78de945e0>
        make_xarm7_sim_robot_config = <function make_xarm7_sim_robot_config at 0xffd78de94400>
        make_xarm_graspgenx_config = <function make_xarm_graspgenx_config at 0xffd78de64ae0>
        trajectory_task = <function trajectory_task at 0xffd77938c7c0>
        xarm_perception_sim = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xffd774b32810>
dimos/utils/data.py:369: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774b3ff50>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = '.../assets/manip/bottle.obj'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_grasp_sim.tar.gz after 3 attempts...ta/.lfs/xarm_grasp_sim.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffd774b3ff50>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_grasp_sim'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/.../assets/manip/bottle.obj')
        name       = '.../assets/manip/bottle.obj'
        nested_path = PosixPath('assets/manip/bottle.obj')
        path_parts = ('xarm_grasp_sim', 'assets', 'manip', 'bottle.obj')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
        filename   = 'xarm_grasp_sim'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.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/xarm_grasp_sim.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.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': '5fe9c95b-e814-45c8-bf1b-f77907eb5912.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_grasp_sim.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_grasp_sim.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_grasp_sim.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.78s 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               @@ -150,13 +150,12 @@
E                    "unitree-go2-webrtc-keyboard-teleop": "dimos.robot.unitree.go2.blueprints.basic.unitree_go2_webrtc_keyboard_teleop:unitree_go2_webrtc_keyboard_teleop",
E                    "unitree-go2-webrtc-rage-keyboard-teleop": "dimos.robot.unitree.go2.blueprints.basic.unitree_go2_webrtc_rage_keyboard_teleop:unitree_go2_webrtc_rage_keyboard_teleop",
E                    "unity-sim": "dimos.simulation.unity.blueprint:unity_sim",
E               +    "xarm-grasp-sim": "dimos.robot.manipulators.xarm.blueprints.simulation:xarm_grasp_sim",
E               +    "xarm-grasp-sim-agent": "dimos.robot.manipulators.xarm.blueprints.agentic:xarm_grasp_sim_agent",
E                    "xarm-graspgenx": "dimos.robot.manipulators.xarm.blueprints.graspgenx:xarm_graspgenx",
E                    "xarm-graspgenx-agent": "dimos.robot.manipulators.xarm.blueprints.agentic:xarm_graspgenx_agent",
E                    "xarm-perception": "dimos.robot.manipulators.xarm.blueprints.perception:xarm_perception",
E                    "xarm-perception-agent": "dimos.robot.manipulators.xarm.blueprints.agentic:xarm_perception_agent",
E               -    "xarm-grasp-sim": "dimos.robot.manipulators.xarm.blueprints.simulation:xarm_grasp_sim",
E               -    "xarm-grasp-sim-agent": "dimos.robot.manipulators.xarm.blueprints.agentic:xarm_grasp_sim_agent",
E               -    "xarm-perception-sim": "dimos.robot.manipulators.xarm.blueprints.simulation:xarm_perception_sim",
E                    "xarm-perception-sim-agent": "dimos.robot.manipulators.xarm.blueprints.agentic:xarm_perception_sim_agent",
E                    "xarm6-planner-only": "dimos.robot.manipulators.xarm.blueprints.basic:xarm6_planner_only",
E                    "xarm6-worldbelief": "dimos.robot.manipulators.xarm.blueprints.worldbelief:xarm6_worldbelief",
E               @@ -275,6 +274,7 @@
E                    "rerun-web-socket-server": "dimos.visualization.rerun.websocket_server.RerunWebSocketServer",
E                    "security-module": "dimos.experimental.security_demo.security_module.SecurityModule",
E                    "semantic-search": "dimos.memory2.module.SemanticSearch",
E               +    "sim-object-scene": "dimos.perception.sim_object_scene.SimObjectScene",
E                    "simple-phone-teleop": "dimos.teleop.phone.phone_extensions.SimplePhoneTeleop",
E                    "simple-planner": "dimos.navigation.cmu_nav.modules.simple_planner.simple_planner.SimplePlanner",
E                    "spatial-memory": "dimos.perception.spatial_perception.SpatialMemory",

all_blueprints = {'a1z-planner-coordinator': 'dimos.robot.manipulators.a1z.blueprints.basic:a1z_planner_coordinator', 'alfred-nav': 'di...rs.a1z.blueprints.basic:coordinator_a1z', 'coordinator-basic': 'dimos.control.blueprints.basic:coordinator_basic', ...}
all_modules = {'alfred-high-level': 'dimos.robot.diy.alfred.effector_high_level.AlfredHighLevel', 'arm-command-module': 'dimos.teleo...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...sted.blueprints.cloudflare.WristCamera",\n    "zed-camera": "dimos.hardware.sensors.camera.zed.camera.ZEDCamera",\n}\n'
diff       = <generator object unified_diff at 0xffe3fbebedc0>
diff_str   = '--- all_blueprints.py (current)\n+++ all_blueprints.py (generated)\n@@ -150,13 +150,12 @@\n     "unitree-go2-webrtc-k..._planner.simple_planner.SimplePlanner",\n     "spatial-memory": "dimos.perception.spatial_perception.SpatialMemory",\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...sted.blueprints.cloudflare.WristCamera",\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
View the full list of 1 ❄️ flaky test(s)
::dimos.manipulation.demo_grasp_visualization.test_demo

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0s run time
ImportError while importing test module '.../manipulation/demo_grasp_visualization/test_demo.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../visualization/viser/runtime.py:25: in <module>
    from viser import ViserServer as ViserServer
E   ModuleNotFoundError: No module named 'viser'

The above exception was the direct cause of the following exception:
.../manipulation/demo_grasp_visualization/test_demo.py:24: in <module>
    from dimos.manipulation.demo_grasp_visualization import __main__
.../manipulation/demo_grasp_visualization/__main__.py:20: in <module>
    from .demo import DEFAULT_MAX_CANDIDATES, run_contributor_demo
.../manipulation/demo_grasp_visualization/demo.py:43: in <module>
    from dimos.manipulation.visualization.viser.visualizer import ViserManipulationVisualizer
.../visualization/viser/visualizer.py:28: in <module>
    from dimos.manipulation.visualization.viser.gui import ViserPanelGui
.../visualization/viser/gui.py:30: in <module>
    from dimos.manipulation.visualization.viser.runtime import VISER_INSTALL_HINT
.../visualization/viser/runtime.py:29: in <module>
    raise ModuleNotFoundError(VISER_INSTALL_HINT) from e
E   ModuleNotFoundError: Viser manipulation visualization requires Viser with URDF support. Install it with: uv sync --extra manipulation

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 and others added 8 commits July 30, 2026 20:55
Convert MuJoCo's internal closing-joint feedback to aperture values and keep direct gripper RPCs in the coordinator's hold-last cache. This prevents arm trajectory commands from closing a gripper that pick just opened.

Increase the xArm simulation pre-grasp clearance from 5 cm to 10 cm and cover both regressions with focused tests.
pointcloud_to_convex_hull_obj centers the hull on the mean of the points,
but the obstacle was placed at obj.pose, which carries the bounding-box
centre. The two differ by ~1.6cm on tall asymmetric objects, so mesh
obstacles sat offset from the geometry they represent.
Publish the object cloud, the ranked grasp candidates, and the candidate
currently under feasibility check as Viser display layers, so a failing
pick can be inspected instead of inferred from logs.

The gripper geometry comes from config rather than the generator: grasp_gen_x
bakes grasp_frame_to_tcp into candidate poses and the wireframe un-applies it,
so the xarm blueprint sources both from one config object. Publishing is
opt-in, and every call is suppressed so visualization cannot fail a pick.
Plumb the existing WorldObstacleMonitor use_mesh_obstacles option through
start_obstacle_monitor and enable it for the grasp sim. Bounding boxes
envelop an object at every height, so a side approach collides with empty
space; the hull follows the observed geometry. Other blueprints keep boxes.
pointcloud_to_convex_hull_obj named its output hull_{id(points)}.obj. id() is
a memory address, and CPython reuses a freed address for the next same-sized
array, so sequential callers overwrote each other: five of six scene objects
collapsed onto one hull file and every obstacle took the shape of whichever
was written last. Intermittent, because it depends on allocator reuse.

The default name is now a uuid. The obstacle monitor passes an explicit path
per object instead, so rescanning overwrites in place rather than growing the
cache without bound.
The stored-plan freshness check rejected a grasp two milliseconds after IK
solved it: the preview animation runs for ~1.6s between planning and
executing, and a PD-held shoulder sags past the fixed 0.01 rad threshold in
that window. That is not the stale-plan case the check guards against.

The tolerance is now configurable (execution_start_tolerance, default
0.05 rad, 0 disables) and the rejection message reports the measured drift so
the threshold can be set from data rather than guessed.
Pick suppressed every object obstacle for the whole transaction, so the
approach was planned against an empty scene and swept through whatever stood
between the arm and the target.

Suppression is now staged. Candidate selection and the approach plan against
the full scene; only the legs that must reach into and carry the target -
grasp, close, retreat, and their feasibility check - hide the target, and
nothing else is ever hidden. A failed restore is recorded on the transaction
so it still surfaces, and pick_suppress_all_object_obstacles remains as a
diagnostic escape hatch.
@TomCC7
TomCC7 force-pushed the manip/grasp-sprint-july-26 branch 4 times, most recently from 90216db to c652e0c Compare August 5, 2026 05:32
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.

2 participants