Skip to content

WIP: feat: add manipulation planning groups#2489

Draft
TomCC7 wants to merge 32 commits into
mainfrom
cc/spec/movegroup
Draft

WIP: feat: add manipulation planning groups#2489
TomCC7 wants to merge 32 commits into
mainfrom
cc/spec/movegroup

Conversation

@TomCC7

@TomCC7 TomCC7 commented Jun 13, 2026

Copy link
Copy Markdown
Member

Summary

  • add first-class manipulation planning group models, SRDF/fallback discovery, resolved joint naming, and world group resolution
  • add group-scoped kinematics/planner APIs plus GeneratedPlan preview/execution projection through coordinator trajectory tasks
  • add OpenArm mock planner/coordinator large E2E coverage for single-arm and dual-arm planning flows
  • add OpenSpec artifacts and user/contributor docs for planning groups
image

Verification

  • uv run pytest dimos/manipulation -q
  • uv run pytest dimos/e2e_tests/test_manipulation_planning_groups.py -m self_hosted_large -q
  • uv run pytest --collect-only dimos/e2e_tests/test_manipulation_planning_groups.py -q
  • openspec validate add-planning-groups
  • pre-commit hooks via git commit

Notes

  • PR remains draft.
  • OpenSpec manual QA tasks 8.12 and 8.13 remain unchecked because no SRDF-backed chain fixture or auxiliary pose-planning fixture was available in this environment.

@TomCC7 TomCC7 changed the title WIP spec: movegroup concept and bimanual/multi-target motion planning WIP spec: planning group and bimanual/multi-target motion planning Jun 13, 2026
@codecov

codecov Bot commented Jun 13, 2026

Copy link
Copy Markdown

❌ 18 Tests Failed:

Tests completed Failed Passed Skipped
2111 18 2093 214
View the top 3 failed test(s) by shortest run time
::dimos.control.blueprints.test_dual
Stack Traces | 0s run time
.../control/blueprints/test_dual.py:17: in <module>
    from dimos.control.blueprints.dual import coordinator_dual_xarm
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/test_dual.cpython-312.pyc'
        __doc__    = 'Tests for dual-arm control blueprints.'
        __file__   = '.../work/dimos/dimos/.../control/blueprints/test_dual.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff3b3e530200>
        __name__   = 'dimos.control.blueprints.test_dual'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.test_dual', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0xff3b3e530200>, origin='.../work/dimos/dimos/.../control/blueprints/test_dual.py')
.../control/blueprints/dual.py:36: in <module>
    hardware=[_xarm7_left.to_hardware_component(), _xarm6_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/dual.cpython-312.pyc'
        __doc__    = 'Dual-arm coordinator blueprints with trajectory control.\n\nUsage:\n    dimos run coordinator-dual-xarm      # XArm7 left + XArm6 right\n    dimos run coordinator-piper-xarm     # XArm6 + Piper\n'
        __file__   = '.../work/dimos/dimos/.../control/blueprints/dual.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff3a9959e510>
        __name__   = 'dimos.control.blueprints.dual'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.dual', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff3a9959e510>, origin='.../work/dimos/dimos/.../control/blueprints/dual.py')
        _catalog_piper = <function piper at 0xff3a98d9a520>
        _catalog_xarm6 = <function xarm6 at 0xff3a98ddc360>
        _catalog_xarm7 = <function xarm7 at 0xff3a98ddc400>
        _xarm6_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d505f0>
        _xarm7_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d504b0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...]}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d504b0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d504b0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d504b0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a98d504b0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a98d4f050>}
        path       = <[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()] LfsPath object at 0xff3a98d4f0d0>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '7', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a98d4f0d0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a98df1d90>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff3a98d4f0d0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a98d4f0d0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a98df1d90>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff3a98d4f0d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff3a98d4f0d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        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_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
        relative_path = PosixPath('data/.lfs/xarm_description.tar.gz')
        repo_root  = PosixPath('.../work/dimos/dimos')
        retries    = 2
dimos.project.test_no_init_files::test_no_init_files
Stack Traces | 0.016s 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             - .../planning/groups/__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/.../planning/groups/__init__.py')]
listing    = '  - .../planning/groups/__init__.py'

dimos/project/test_no_init_files.py:25: AssertionError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[keyboard-teleop-xarm6]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-xarm6'

    @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 = 'keyboard-teleop-xarm6'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-xarm6'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.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       = 'keyboard_teleop_xarm6'
        module_path = 'dimos.robot.manipulators.xarm.blueprints'
        name       = 'keyboard-teleop-xarm6'
.../manipulators/xarm/blueprints.py:56: in <module>
    joint_names=_xarm6_cfg.global_joint_names,
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        XARM6_FK_MODEL = <[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()] LfsPath object at 0xff5be71232d0>
        XARM7_FK_MODEL = <[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()] LfsPath object at 0xff5be7123250>
        __builtins__ = <builtins>
        __cached__ = '.../xarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Keyboard teleop blueprints for XArm6 and XArm7.\n\nLaunches the ControlCoordinator (mock adapter + CartesianIK), the\... wired together via autoconnect.\n\nUsage:\n    dimos run keyboard-teleop-xarm6\n    dimos run keyboard-teleop-xarm7\n'
        __file__   = '.../work/dimos/dimos/.../manipulators/xarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba88edb50>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints'
        __package__ = 'dimos.robot.manipulators.xarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba88edb50>, origin='.../work/dimos/dimos/.../manipulators/xarm/blueprints.py')
        _catalog_xarm6 = <function xarm6 at 0xff5be5d722a0>
        _catalog_xarm7 = <function xarm7 at 0xff5be5d720c0>
        _xarm6_cfg = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63fb660>
        _xarm7_cfg = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63fb6b0>
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63fb660>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63fb660>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63fb660>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6492450>}
        path       = <[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()] LfsPath object at 0xff5ba64935d0>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '6', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba64935d0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66ef680>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff5ba64935d0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba64935d0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66ef680>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff5ba64935d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff5ba64935d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[keyboard-teleop-piper]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-piper'

    @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 = 'keyboard-teleop-piper'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-piper'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/piper_description.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       = 'keyboard_teleop_piper'
        module_path = 'dimos.robot.manipulators.piper.blueprints'
        name       = 'keyboard-teleop-piper'
.../manipulators/piper/blueprints.py:45: in <module>
    hardware=[_piper_cfg.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        PIPER_FK_MODEL = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem....lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5be71230d0>
        __builtins__ = <builtins>
        __cached__ = '.../piper/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Keyboard teleop blueprint for the Piper arm.\n\nLaunches the ControlCoordinator (mock adapter + CartesianIK), the\nMa...nd a pygame keyboard\nteleop UI — all wired together via autoconnect.\n\nUsage:\n    dimos run keyboard-teleop-piper\n'
        __file__   = '.../work/dimos/dimos/.../manipulators/piper/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba8914470>
        __name__   = 'dimos.robot.manipulators.piper.blueprints'
        __package__ = 'dimos.robot.manipulators.piper'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.piper.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba8914470>, origin='.../work/dimos/dimos/.../manipulators/piper/blueprints.py')
        _catalog_piper = <function piper at 0xff5be5e042c0>
        _piper_cfg = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem.../piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6776e40>
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
        gripper_joints = ['arm/gripper']
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem.../piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6776e40>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem.../piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6776e40>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem.../piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6776e40>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem.../piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6776e40>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'piper_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_descriptio...lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3c50>}
        path       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem....lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 atte...fs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6753e60>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem....lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 atte...fs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6753e60>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem....lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'piper_description/urdf/piper_description.xacro'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem....lfs/piper_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba90d3dd0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'piper_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/piper_description/urdf/piper_description.xacro')
        name       = 'piper_description/urdf/piper_description.xacro'
        nested_path = PosixPath('urdf/piper_description.xacro')
        path_parts = ('piper_description', 'urdf', 'piper_description.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/piper_description.tar.gz')
        filename   = 'piper_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/piper_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/piper_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/piper_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/piper_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/piper_description.tar.gz'])
relative_path = PosixPath('data/.lfs/piper_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[openarm-mock-planner-coordinator]
Stack Traces | 3.1s run time
blueprint_name = 'openarm-mock-planner-coordinator'

    @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 = 'openarm-mock-planner-coordinator'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openarm-mock-planner-coordinator'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openarm_mock_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'openarm-mock-planner-coordinator'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba8141ee0>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba8141ee0>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466bc0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466c60>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466bc0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466bc0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466bc0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6466bc0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6442570>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6442570>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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[openarm-planner-coordinator]
Stack Traces | 3.1s run time
blueprint_name = 'openarm-planner-coordinator'

    @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 = 'openarm-planner-coordinator'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openarm-planner-coordinator'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openarm_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'openarm-planner-coordinator'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba891b740>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba891b740>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647f8e0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647fa70>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647f8e0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647f8e0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647f8e0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba647f8e0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba67521f0>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba67521f0>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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.catalog.test_ufactory::test_xarm_instance_offsets_are_encoded_only_in_base_pose[xarm6]
Stack Traces | 3.1s run time
factory = <function xarm6 at 0xff3a98ddc360>

    @pytest.mark.parametrize("factory", [xarm6, xarm7])
    def test_xarm_instance_offsets_are_encoded_only_in_base_pose(
        factory: Callable[..., RobotConfig],
    ) -> None:
        config = factory(name="arm", y_offset=0.5, pitch=0.25)
>       model_config = config.to_robot_model_config()

config     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528ef9d0>
factory    = <function xarm6 at 0xff3a98ddc360>

.../robot/catalog/test_ufactory.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/config.py:206: in to_robot_model_config
    model=self.model_description,
        base_link  = 'link_base'
        base_pose  = Pose(position=Vector([          0         0.5           0]), orientation=Quaternion(0.000000, 0.124675, 0.000000, 0.992198))
        bp         = [0.0, 0.5, 0.0, 0.0, 0.12467473338522769, 0.0, ...]
        exclusions = [('right_inner_knuckle', 'right_outer_knuckle'), ('left_inner_knuckle', 'left_outer_knuckle'), ('right_inner_knuckle',...ft_inner_knuckle', 'left_finger'), ('left_finger', 'right_finger'), ('left_outer_knuckle', 'right_outer_knuckle'), ...]
        joint_names = ['joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6']
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528ef9d0>
dimos/robot/config.py:153: in model_description
    return self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528ef9d0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528ef9d0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a53f2e950>}
        path       = <[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()] LfsPath object at 0xff3a98407950>
        xacro_args = {'add_gripper': 'true', 'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '6', ...}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a98407950>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a98cb1fc0>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff3a98407950>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a98407950>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a98cb1fc0>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff3a98407950>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff3a98407950>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[keyboard-teleop-openarm]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-openarm'

    @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 = 'keyboard-teleop-openarm'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openarm'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openarm'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'keyboard-teleop-openarm'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba88ede80>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba88ede80>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f5c0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f7a0>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f5c0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f5c0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f5c0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f5c0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6751930>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6751930>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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.catalog.test_ufactory::test_xarm_instance_offsets_are_encoded_only_in_base_pose[xarm7]
Stack Traces | 3.1s run time
factory = <function xarm7 at 0xff3a98ddc400>

    @pytest.mark.parametrize("factory", [xarm6, xarm7])
    def test_xarm_instance_offsets_are_encoded_only_in_base_pose(
        factory: Callable[..., RobotConfig],
    ) -> None:
        config = factory(name="arm", y_offset=0.5, pitch=0.25)
>       model_config = config.to_robot_model_config()

config     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528eebc0>
factory    = <function xarm7 at 0xff3a98ddc400>

.../robot/catalog/test_ufactory.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/config.py:206: in to_robot_model_config
    model=self.model_description,
        base_link  = 'link_base'
        base_pose  = Pose(position=Vector([          0         0.5           0]), orientation=Quaternion(0.000000, 0.124675, 0.000000, 0.992198))
        bp         = [0.0, 0.5, 0.0, 0.0, 0.12467473338522769, 0.0, ...]
        exclusions = []
        joint_names = ['joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6', ...]
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528eebc0>
dimos/robot/config.py:153: in model_description
    return self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528eebc0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff3a528eebc0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a52b225d0>}
        path       = <[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()] LfsPath object at 0xff3a52b23450>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '7', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a52b23450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a54364190>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff3a52b23450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff3a52b23450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff3a54364190>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff3a52b23450>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff3a52b23450>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[keyboard-teleop-openarm-mock]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-openarm-mock'

    @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 = 'keyboard-teleop-openarm-mock'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openarm-mock'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openarm_mock'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'keyboard-teleop-openarm-mock'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba81314f0>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba81314f0>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f3e0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646c780>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f3e0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f3e0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f3e0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba646f3e0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66eeff0>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66eeff0>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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[keyboard-teleop-xarm7]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-xarm7'

    @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 = 'keyboard-teleop-xarm7'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-xarm7'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.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       = 'keyboard_teleop_xarm7'
        module_path = 'dimos.robot.manipulators.xarm.blueprints'
        name       = 'keyboard-teleop-xarm7'
.../manipulators/xarm/blueprints.py:56: in <module>
    joint_names=_xarm6_cfg.global_joint_names,
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        XARM6_FK_MODEL = <[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()] LfsPath object at 0xff5be71232d0>
        XARM7_FK_MODEL = <[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()] LfsPath object at 0xff5be7123250>
        __builtins__ = <builtins>
        __cached__ = '.../xarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Keyboard teleop blueprints for XArm6 and XArm7.\n\nLaunches the ControlCoordinator (mock adapter + CartesianIK), the\... wired together via autoconnect.\n\nUsage:\n    dimos run keyboard-teleop-xarm6\n    dimos run keyboard-teleop-xarm7\n'
        __file__   = '.../work/dimos/dimos/.../manipulators/xarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba813b590>
        __name__   = 'dimos.robot.manipulators.xarm.blueprints'
        __package__ = 'dimos.robot.manipulators.xarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.xarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba813b590>, origin='.../work/dimos/dimos/.../manipulators/xarm/blueprints.py')
        _catalog_xarm6 = <function xarm6 at 0xff5be5d722a0>
        _catalog_xarm7 = <function xarm7 at 0xff5be5d720c0>
        _xarm6_cfg = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6778370>
        _xarm7_cfg = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba677bac0>
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6778370>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6778370>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6778370>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba917e8d0>}
        path       = <[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()] LfsPath object at 0xff5ba917f950>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '6', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba917f950>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6753d80>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff5ba917f950>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba917f950>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6753d80>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff5ba917f950>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff5ba917f950>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[coordinator-openarm-mock]
Stack Traces | 3.1s run time
blueprint_name = 'coordinator-openarm-mock'

    @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 = 'coordinator-openarm-mock'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm-mock'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm_mock'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'coordinator-openarm-mock'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5bb6bb69c0>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5bb6bb69c0>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af6b0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af750>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af6b0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af6b0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af6b0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb73af6b0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6352960>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6352960>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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[keyboard-teleop-a750]
Stack Traces | 3.1s run time
blueprint_name = 'keyboard-teleop-a750'

    @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 = 'keyboard-teleop-a750'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-a750'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/a750_description.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       = 'keyboard_teleop_a750'
        module_path = 'dimos.robot.manipulators.a750.blueprints'
        name       = 'keyboard-teleop-a750'
.../manipulators/a750/blueprints.py:49: in <module>
    hardware=[_a750_cfg.to_hardware_component()],
        A750_FK_MODEL = <[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()] LfsPath object at 0xff5ba67c45d0>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        __builtins__ = <builtins>
        __cached__ = '.../a750/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Keyboard teleop blueprint for the A-750 arm.\n\nLaunches the ControlCoordinator (mock adapter + CartesianIK), the\nMa...and a pygame keyboard\nteleop UI — all wired together via autoconnect.\n\nUsage:\n    dimos run keyboard-teleop-a750\n'
        __file__   = '.../work/dimos/dimos/.../manipulators/a750/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba88c2c00>
        __name__   = 'dimos.robot.manipulators.a750.blueprints'
        __package__ = 'dimos.robot.manipulators.a750'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.a750.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba88c2c00>, origin='.../work/dimos/dimos/.../manipulators/a750/blueprints.py')
        _a750_cfg  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...s/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba675f1b0>
        _catalog_a750 = <function a750 at 0xff5ba677c860>
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, -1.5707963267948966, 0.0, 0.0, 0.0]}
        gripper_joints = ['arm/finger']
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...s/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba675f1b0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...s/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba675f1b0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...s/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba675f1b0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attemp...s/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba675f1b0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'a750_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.....lfs/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba67c4350>}
        path       = <[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()] LfsPath object at 0xff5ba67c43d0>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attem...lfs/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba67c43d0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66ecf20>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff5ba67c43d0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/a750_description.tar.gz after 3 attem...lfs/a750_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba67c43d0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba66ecf20>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff5ba67c43d0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'a750_description/urdf/a750_rev1.urdf'
        self       = <[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()] LfsPath object at 0xff5ba67c43d0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'a750_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/a750_description/urdf/a750_rev1.urdf')
        name       = 'a750_description/urdf/a750_rev1.urdf'
        nested_path = PosixPath('urdf/a750_rev1.urdf')
        path_parts = ('a750_description', 'urdf', 'a750_rev1.urdf')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/a750_description.tar.gz')
        filename   = 'a750_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/a750_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/a750_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/a750_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/a750_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/a750_description.tar.gz'])
relative_path = PosixPath('data/.lfs/a750_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[coordinator-piper-xarm]
Stack Traces | 3.1s run time
blueprint_name = 'coordinator-piper-xarm'

    @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 = 'coordinator-piper-xarm'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-piper-xarm'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.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       = 'coordinator_piper_xarm'
        module_path = 'dimos.control.blueprints.dual'
        name       = 'coordinator-piper-xarm'
.../control/blueprints/dual.py:36: in <module>
    hardware=[_xarm7_left.to_hardware_component(), _xarm6_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/dual.cpython-312.pyc'
        __doc__    = 'Dual-arm coordinator blueprints with trajectory control.\n\nUsage:\n    dimos run coordinator-dual-xarm      # XArm7 left + XArm6 right\n    dimos run coordinator-piper-xarm     # XArm6 + Piper\n'
        __file__   = '.../work/dimos/dimos/.../control/blueprints/dual.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba8a8e2a0>
        __name__   = 'dimos.control.blueprints.dual'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.dual', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba8a8e2a0>, origin='.../work/dimos/dimos/.../control/blueprints/dual.py')
        _catalog_piper = <function piper at 0xff5be5e042c0>
        _catalog_xarm6 = <function xarm6 at 0xff5be5d722a0>
        _catalog_xarm7 = <function xarm7 at 0xff5be5d720c0>
        _xarm6_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba63810e0>
        _xarm7_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6383200>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...]}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6383200>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6383200>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6383200>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6383200>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba9147150>}
        path       = <[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()] LfsPath object at 0xff5ba9144cd0>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '7', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba9144cd0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba63533e0>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff5ba9144cd0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba9144cd0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba63533e0>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff5ba9144cd0>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff5ba9144cd0>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[coordinator-openarm-right]
Stack Traces | 3.1s run time
blueprint_name = 'coordinator-openarm-right'

    @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 = 'coordinator-openarm-right'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm-right'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm_right'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'coordinator-openarm-right'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba8a87770>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba8a87770>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603ac0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603bb0>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603ac0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603ac0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603ac0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba6603ac0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6312f10>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6312f10>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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[coordinator-openarm-bimanual]
Stack Traces | 3.11s run time
blueprint_name = 'coordinator-openarm-bimanual'

    @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 = 'coordinator-openarm-bimanual'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm-bimanual'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm_bimanual'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'coordinator-openarm-bimanual'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5bad1d1340>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5bad1d1340>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8affa20>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8aff8e0>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8affa20>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8affa20>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8affa20>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5ba8affa20>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6351af0>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6351af0>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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[coordinator-dual-xarm]
Stack Traces | 3.11s run time
blueprint_name = 'coordinator-dual-xarm'

    @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 = 'coordinator-dual-xarm'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-dual-xarm'
        message    = "Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.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       = 'coordinator_dual_xarm'
        module_path = 'dimos.control.blueprints.dual'
        name       = 'coordinator-dual-xarm'
.../control/blueprints/dual.py:36: in <module>
    hardware=[_xarm7_left.to_hardware_component(), _xarm6_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/dual.cpython-312.pyc'
        __doc__    = 'Dual-arm coordinator blueprints with trajectory control.\n\nUsage:\n    dimos run coordinator-dual-xarm      # XArm7 left + XArm6 right\n    dimos run coordinator-piper-xarm     # XArm6 + Piper\n'
        __file__   = '.../work/dimos/dimos/.../control/blueprints/dual.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5ba9395fd0>
        __name__   = 'dimos.control.blueprints.dual'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.dual', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5ba9395fd0>, origin='.../work/dimos/dimos/.../control/blueprints/dual.py')
        _catalog_piper = <function piper at 0xff5be5e042c0>
        _catalog_xarm6 = <function xarm6 at 0xff5be5d722a0>
        _catalog_xarm7 = <function xarm7 at 0xff5be5d720c0>
        _xarm6_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa8437a0>
        _xarm7_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa841bd0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...e, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1', dimsim_scene='apt', dimsim_port=8090)
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...]}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa841bd0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa841bd0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa841bd0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...s/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5baa841bd0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'xarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.....lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6574350>}
        path       = <[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()] LfsPath object at 0xff5ba6575a50>
        xacro_args = {'attach_rpy': '0 0 0', 'attach_xyz': '0 0 0', 'dof': '7', 'limited': 'true'}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6575a50>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba8b2f140>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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()] LfsPath object at 0xff5ba6575a50>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attem...lfs/xarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6575a50>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba8b2f140>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[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()] LfsPath object at 0xff5ba6575a50>
dimos/utils/data.py:347: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm_description/urdf/xarm_device.urdf.xacro'
        self       = <[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()] LfsPath object at 0xff5ba6575a50>
dimos/utils/data.py:304: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm_description/urdf/xarm_device.urdf.xacro')
        name       = 'xarm_description/urdf/xarm_device.urdf.xacro'
        nested_path = PosixPath('urdf/xarm_device.urdf.xacro')
        path_parts = ('xarm_description', 'urdf', 'xarm_device.urdf.xacro')
dimos/utils/data.py:248: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
        filename   = 'xarm_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/xarm_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/xarm_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/xarm_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/xarm_description.tar.gz'])
relative_path = PosixPath('data/.lfs/xarm_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[coordinator-openarm-left]
Stack Traces | 3.12s run time
blueprint_name = 'coordinator-openarm-left'

    @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 = 'coordinator-openarm-left'

dimos/robot/test_all_blueprints.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:80: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm-left'
        message    = "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."
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm_left'
        module_path = 'dimos.robot.manipulators.openarm.blueprints'
        name       = 'coordinator-openarm-left'
.../manipulators/openarm/blueprints.py:34: in <module>
    hardware=[_mock_left.to_hardware_component(), _mock_right.to_hardware_component()],
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_V10_FK_MODEL = <[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 0xff5ba6374050>
        __builtins__ = <builtins>
        __cached__ = '.../openarm/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'OpenArm blueprints. Flip LEFT_CAN / RIGHT_CAN below if arms come up swapped.'
        __file__   = '.../work/dimos/dimos/.../manipulators/openarm/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5bb76bf5c0>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints'
        __package__ = 'dimos.robot.manipulators.openarm'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5bb76bf5c0>, origin='.../work/dimos/dimos/.../manipulators/openarm/blueprints.py')
        _mock_left = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d532f0>
        _mock_right = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d50b40>
        _openarm   = <function openarm_arm at 0xff5ba633bba0>
        _openarm_single = <function openarm_single at 0xff5ba633bce0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff5c5ecd0b80>
dimos/robot/config.py:251: in to_hardware_component
    joints=self.global_joint_names,
        adapter_kwargs = {'initial_positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...], 'side': 'left'}
        gripper_joints = []
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d532f0>
dimos/robot/config.py:163: in global_joint_names
    return make_global_joint_names(self.name, self.local_joint_names)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d532f0>
dimos/robot/config.py:157: in local_joint_names
    self._ensure_parsed()
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d532f0>
dimos/robot/config.py:125: in _ensure_parsed
    self._parsed = parse_model(self.model_path, self.package_paths, self.xacro_args)
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...penarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] RobotConfig object at 0xff5bb6d532f0>
dimos/robot/model_parser.py:71: in parse_model
    path = Path(path)
        package_paths = {'openarm_description': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_descri...s/openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6376150>}
        path       = <[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 0xff5ba6375450>
        xacro_args = {}
....../usr/lib/python3.12/pathlib.py:1164: in __init__
    super().__init__(*args)
        __class__  = <class 'pathlib.Path'>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6312a40>
....../usr/lib/python3.12/pathlib.py:362: in __init__
    if arg._flavour is ntpath and self._flavour is posixpath:
        arg        = <[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 0xff5ba6375450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 at.../openarm_description.tar.gz']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5ba6375450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff5ba6312a40>
dimos/utils/data.py:364: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        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 0xff5ba6375450>
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 0xff5ba6375450>
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': '5b6e30e3-d4b8-4d7a-a6d5-225499853ce7.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

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 changed the title WIP spec: planning group and bimanual/multi-target motion planning feat: add manipulation planning groups Jun 17, 2026
@TomCC7 TomCC7 changed the title feat: add manipulation planning groups WIP: feat: add manipulation planning groups Jun 17, 2026
Comment thread dimos/e2e_tests/test_manipulation_planning_groups.py Outdated
Comment thread dimos/manipulation/planning/kinematics/jacobian_ik.py Outdated
Comment thread dimos/manipulation/planning/kinematics/jacobian_ik.py
Comment thread dimos/manipulation/planning/kinematics/jacobian_ik.py Outdated
Comment thread dimos/manipulation/manipulation_module.py
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py
@TomCC7 TomCC7 force-pushed the cc/spec/movegroup branch from f157926 to 31731b1 Compare June 19, 2026 02:31
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py
Comment thread dimos/manipulation/manipulation_module.py
Comment thread dimos/manipulation/manipulation_module.py Outdated
return result

@rpc
def plan_to_pose(self, pose: Pose, robot_name: RobotName | None = None) -> bool:

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.

plan_to_pose and plan_to_joints should be just wrapper of the more generic functions, no duplication. plan_to_poses and plan_to_joints

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.

Addressed in d370174.

Comment on lines +909 to +917
if self._world_monitor is None or self._kinematics is None:
return False
if not pose_targets:
return self._fail("At least one pose target is required")
with self._lock:
if self._state not in (ManipulationState.IDLE, ManipulationState.COMPLETED):
logger.warning(f"Cannot plan: state is {self._state.name}")
return False
self._state = ManipulationState.PLANNING

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.

should reuse begin_planning here

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.

Addressed in d370174.

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.

why not?

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.

Addressed in 288fca5.

Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/planning/world/drake_world.py Outdated
Comment thread dimos/manipulation/planning/planning_group_utils.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment thread dimos/manipulation/manipulation_module.py Outdated
Comment on lines +909 to +917
if self._world_monitor is None or self._kinematics is None:
return False
if not pose_targets:
return self._fail("At least one pose target is required")
with self._lock:
if self._state not in (ManipulationState.IDLE, ManipulationState.COMPLETED):
logger.warning(f"Cannot plan: state is {self._state.name}")
return False
self._state = ManipulationState.PLANNING

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.

why not?

Comment thread dimos/manipulation/manipulation_module.py Outdated
self._world_monitor.world.list_planning_groups(), robot_name
)

def _current_positions_by_name(

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 function is basically a noop check, remove

) -> bool:
"""Preview planned path in Meshcat."""
return _client.preview_path(duration, robot_name, target_fps)
"""Preview the last generated plan in Meshcat."""

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.

Suggested change
"""Preview the last generated plan in Meshcat."""
"""Preview the last generated plan in Visualizer."""

"""Dual-arm coordinator blueprints with trajectory control.

Usage:
dimos run coordinator-dual-mock # Mock 7+6 DOF arms

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.

ok we shouldn't remove this... bring it back

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.

no init

return fallback_result
return _failure(IKStatus.NO_SOLUTION, f"Pink IK failed after {max_attempts} attempts")

def _solve_single(

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.

again, solve single should be thin wrapper of the more general case (solve pose target)

planning_groups: list[PlanningGroupInfo]


class PlanningGroupInfo(TypedDict):

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 just duplication... why not use original type?

Comment on lines +548 to +586
def _selected_joint_state(self, group_ids: tuple[PlanningGroupID, ...]) -> JointState | None:
"""Collect current state for exactly the selected global joints."""
assert self._world_monitor is not None
selection = self._world_monitor.planning_groups.select(group_ids)

robot_ids_by_name: dict[RobotName, WorldRobotID] = {}
for robot_name in selection.robot_names:
try:
robot_ids_by_name[robot_name] = self._robots[robot_name][0]
except KeyError:
logger.error("Robot '%s' is not registered", robot_name)
return None

current_by_robot: dict[RobotName, dict[str, float]] = {}
for robot_name, robot_id in robot_ids_by_name.items():
current = self._world_monitor.get_current_joint_state(robot_id)
if current is None:
logger.error("No joint state for robot '%s'", robot_name)
return None
indexed_current = self._current_positions_by_name(robot_name, current)
if indexed_current is None:
return None
current_by_robot[robot_name] = indexed_current

names: list[str] = []
positions: list[float] = []
for group in selection.groups:
robot_state = current_by_robot[group.robot_name]
for resolved_name, local_name in zip(
group.joint_names, group.local_joint_names, strict=True
):
if local_name not in robot_state:
logger.error("Current state missing selected joint '%s'", resolved_name)
return None
position = robot_state[local_name]
names.append(resolved_name)
positions.append(position)

return JointState(name=names, position=positions)

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.

really can't simplify this?

}

def evaluate_pose_target(self, pose: Pose, robot_name: RobotName) -> TargetEvaluation:
def evaluate_pose_target(

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.

maybe we should just remove this and use IK + collision checking function instead of the all-in-one function

logger.error(f"No coordinator_task_name for '{robot_name}'")
@rpc
def execute_plan(
self, plan: GeneratedPlan | None = None, robot_name: RobotName | None = None

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.

execute a plan with only one robot makes zero sense. a plan is a whole and should always be executed together, just remove the robot_name variable

def execute_plan(
self, plan: GeneratedPlan | None = None, robot_name: RobotName | None = None
) -> bool:
"""Project and execute a generated plan through affected trajectory tasks."""

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.

Suggested change
"""Project and execute a generated plan through affected trajectory tasks."""
"""Project and execute a generated plan through affected trajectory tasks. TODO: proper time parametrization """

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