Skip to content

feat(manipulation): add Dual OpenYAM teleoperation - #3463

Open
TomCC7 wants to merge 1 commit into
pim/feat/g1-quest-teleop-stackedfrom
cc/feat/dual-yam
Open

feat(manipulation): add Dual OpenYAM teleoperation#3463
TomCC7 wants to merge 1 commit into
pim/feat/g1-quest-teleop-stackedfrom
cc/feat/dual-yam

Conversation

@TomCC7

@TomCC7 TomCC7 commented Aug 14, 2026

Copy link
Copy Markdown
Member

Summary

  • add a Dual OpenYAM entity with two verified OpenYAM arm models at the ABC Box 620 mm spacing
  • add mock and dual-CAN hardware support, coupled planning groups, and Quest teleoperation
  • align teleop velocity limits and Pink tuning with A1Z
  • document fake-hardware and physical-hardware startup

Testing

  • 83 focused manipulation, Pink IK, G1 Quest, and Dual OpenYAM tests pass after rebasing
  • Ruff passes
  • mypy passes
  • uv run dimos run teleop-quest-dual-openyam starts successfully with mock hardware

Stack

@codecov

codecov Bot commented Aug 14, 2026

Copy link
Copy Markdown

❌ 28 Tests Failed:

Tests completed Failed Passed Skipped
3906 28 3878 175
View the top 3 failed test(s) by shortest run time
::dimos.robot.manipulators.openyam.test_openyam
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/openyam/test_openyam.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/openyam/test_openyam.py:23: in <module>
    from dimos.robot.manipulators.openyam.blueprints.basic import (
.../openyam/blueprints/basic.py:22: in <module>
    from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)
dimos.imitation.collection.test_blueprint::test_recorder_reads_aggregate_joint_state[blueprint0]
Stack Traces | 0.001s run time
blueprint = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff8af0e2c6e0>

    @pytest.mark.parametrize("blueprint", [learning_collect_quest_xarm7, learning_collect_quest_piper])
    def test_recorder_reads_aggregate_joint_state(blueprint: Blueprint) -> None:
        streams = _joint_streams(blueprint)
    
        # Plain name pairing on both ends, no remap in between. The coordinator
        # atom carries its explicit instance_name (the RPC lookup contract).
        assert streams[("collectionrecorder", AGGREGATE)] == AGGREGATE
        assert streams[("ControlCoordinator", AGGREGATE)] == AGGREGATE
>       assert not [port for _instance, port in streams if port.endswith("_joints")]
E       AssertionError: assert not ['arm_joints']

blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/xarm_description.tar.gz after 3 attemp...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff8af0e2c6e0>
streams    = {('ControlCoordinator', 'arm_joints'): 'arm_joints', ('ControlCoordinator', 'coordinator_joint_state'): 'coordinator_j..., 'joint_command'): 'joint_command', ('collectionrecorder', 'coordinator_joint_state'): 'coordinator_joint_state', ...}

.../imitation/collection/test_blueprint.py:47: AssertionError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[openarm-planner-coordinator]
Stack Traces | 0.001s 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:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openarm-planner-coordinator'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openarm_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.basic'
        name       = 'openarm-planner-coordinator'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenArm coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenArm coordinator blueprints.'
__file__   = '.../openarm/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff66c89d8c20>
__name__   = 'dimos.robot.manipulators.openarm.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openarm.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff66c89d8c20>, origin='.../openarm/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openarm/blueprints/basic.py:22: ImportError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[openyam-planner-coordinator]
Stack Traces | 0.001s run time
blueprint_name = 'openyam-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 = 'openyam-planner-coordinator'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openyam-planner-coordinator'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openyam_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.basic'
        name       = 'openyam-planner-coordinator'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenYAM coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenYAM coordinator blueprints.'
__file__   = '.../openyam/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff66c8a10860>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff66c8a10860>, origin='.../openyam/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openyam/blueprints/basic.py:22: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[coordinator-openarm]
Stack Traces | 0.002s run time
blueprint_name = 'coordinator-openarm'

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

blueprint_name = 'coordinator-openarm'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.basic'
        name       = 'coordinator-openarm'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenArm coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenArm coordinator blueprints.'
__file__   = '.../openarm/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5305d9c380>
__name__   = 'dimos.robot.manipulators.openarm.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openarm.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5305d9c380>, origin='.../openarm/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openarm/blueprints/basic.py:22: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[coordinator-openyam]
Stack Traces | 0.002s run time
blueprint_name = 'coordinator-openyam'

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

blueprint_name = 'coordinator-openyam'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openyam'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.basic'
        name       = 'coordinator-openyam'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenYAM coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenYAM coordinator blueprints.'
__file__   = '.../openyam/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff5313db6b10>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff5313db6b10>, origin='.../openyam/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openyam/blueprints/basic.py:22: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openyam-planner]
Stack Traces | 0.002s run time
blueprint_name = 'keyboard-teleop-openyam-planner'

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

blueprint_name = 'keyboard-teleop-openyam-planner'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam-planner'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openyam_planner'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'keyboard-teleop-openyam-planner'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """OpenYAM keyboard teleop blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.manipulation.manipulation_module import ManipulationModule
    from dimos.robot.manipulators.common.blueprints import (
        coordinator,
        planner,
    )
    from dimos.robot.manipulators.common.coordinators import (
        ArmTwistCoordinator,
    )
>   from dimos.robot.manipulators.common.topics import (
        DEFAULT_TRAJECTORY_TASK_NAME,
        EEF_TWIST_TASK_NAME,
    )
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
__doc__    = 'OpenYAM keyboard teleop blueprints.'
__file__   = '.../openyam/blueprints/teleop.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff529b3e56a0>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.teleop'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff529b3e56a0>, origin='.../openyam/blueprints/teleop.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openyam/blueprints/teleop.py:29: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openyam]
Stack Traces | 0.002s run time
blueprint_name = 'keyboard-teleop-openyam'

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

blueprint_name = 'keyboard-teleop-openyam'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'keyboard-teleop-openyam'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """OpenYAM keyboard teleop blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.manipulation.manipulation_module import ManipulationModule
    from dimos.robot.manipulators.common.blueprints import (
        coordinator,
        planner,
    )
    from dimos.robot.manipulators.common.coordinators import (
        ArmTwistCoordinator,
    )
>   from dimos.robot.manipulators.common.topics import (
        DEFAULT_TRAJECTORY_TASK_NAME,
        EEF_TWIST_TASK_NAME,
    )
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
__doc__    = 'OpenYAM keyboard teleop blueprints.'
__file__   = '.../openyam/blueprints/teleop.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff529b3e4800>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.teleop'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff529b3e4800>, origin='.../openyam/blueprints/teleop.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openyam/blueprints/teleop.py:29: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[openarm-planner-coordinator]
Stack Traces | 0.002s run time
blueprint_name = 'openarm-planner-coordinator'

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

blueprint_name = 'openarm-planner-coordinator'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openarm-planner-coordinator'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openarm_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.basic'
        name       = 'openarm-planner-coordinator'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenArm coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenArm coordinator blueprints.'
__file__   = '.../openarm/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff529b3e5040>
__name__   = 'dimos.robot.manipulators.openarm.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openarm.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff529b3e5040>, origin='.../openarm/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openarm/blueprints/basic.py:22: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[openyam-planner-coordinator]
Stack Traces | 0.002s run time
blueprint_name = 'openyam-planner-coordinator'

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

blueprint_name = 'openyam-planner-coordinator'

dimos/codebase_checks/test_blueprint_kwargs.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/codebase_checks/test_blueprint_kwargs.py:36: in _get_blueprint_or_skip
    return get_blueprint_by_name(blueprint_name)
        blueprint_name = 'openyam-planner-coordinator'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'openyam_planner_coordinator'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.basic'
        name       = 'openyam-planner-coordinator'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenYAM coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenYAM coordinator blueprints.'
__file__   = '.../openyam/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff529b38c8f0>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff529b38c8f0>, origin='.../openyam/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff537df49f80>
coordinator = <function coordinator at 0xff5313a1f240>
planner    = <function planner at 0xff5313a1f100>

.../openyam/blueprints/basic.py:22: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-dual-openyam]
Stack Traces | 0.002s run time
blueprint_name = 'teleop-quest-dual-openyam'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        blueprint = _get_blueprint_or_skip(blueprint_name)
    
        violations: list[str] = []
        for atom in blueprint.blueprints:
            unknown_kwargs = sorted(set(atom.kwargs) - _allowed_kwarg_names(atom.module))
            if unknown_kwargs:
                violations.append(
                    f"{atom.module.__module__}.{atom.module.__name__}: unknown kwargs {unknown_kwargs}"
                )
    
        if violations:
            listing = "\n".join(f"  - {violation}" for violation in violations)
>           raise AssertionError(
                f"Blueprint {blueprint_name!r} passes unknown module kwargs:\n{listing}\n\n"
                "Blueprint kwargs are forwarded into the module constructor. For modules "
                "with an explicit `config` annotation, use fields from that config model; "
                "for legacy modules with direct constructor parameters, use the declared "
                "`__init__` keyword names."
            )
E           AssertionError: Blueprint 'teleop-quest-dual-openyam' passes unknown module kwargs:
E             - dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']
E           
E           Blueprint kwargs are forwarded into the module constructor. For modules with an explicit `config` annotation, use fields from that config model; for legacy modules with direct constructor parameters, use the declared `__init__` keyword names.

atom       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] BlueprintAtom object at 0xff529bec0e90>
blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff529bec0350>
blueprint_name = 'teleop-quest-dual-openyam'
listing    = "  - dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']"
unknown_kwargs = []
violations = ["dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']"]

dimos/codebase_checks/test_blueprint_kwargs.py:103: AssertionError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-openarm]
Stack Traces | 0.002s run time
blueprint_name = 'teleop-quest-openarm'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        blueprint = _get_blueprint_or_skip(blueprint_name)
    
        violations: list[str] = []
        for atom in blueprint.blueprints:
            unknown_kwargs = sorted(set(atom.kwargs) - _allowed_kwarg_names(atom.module))
            if unknown_kwargs:
                violations.append(
                    f"{atom.module.__module__}.{atom.module.__name__}: unknown kwargs {unknown_kwargs}"
                )
    
        if violations:
            listing = "\n".join(f"  - {violation}" for violation in violations)
>           raise AssertionError(
                f"Blueprint {blueprint_name!r} passes unknown module kwargs:\n{listing}\n\n"
                "Blueprint kwargs are forwarded into the module constructor. For modules "
                "with an explicit `config` annotation, use fields from that config model; "
                "for legacy modules with direct constructor parameters, use the declared "
                "`__init__` keyword names."
            )
E           AssertionError: Blueprint 'teleop-quest-openarm' passes unknown module kwargs:
E             - dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']
E           
E           Blueprint kwargs are forwarded into the module constructor. For modules with an explicit `config` annotation, use fields from that config model; for legacy modules with direct constructor parameters, use the declared `__init__` keyword names.

atom       = BlueprintAtom(kwargs={'kinematics': PinkKinematicsConfig(backend='pink', solver='proxqp', dt=0.01, max_iterations=200,...ntrol_coordinator', spec=<class 'dimos.control.coordinator.ControlCoordinator'>, optional=False),), instance_name=None)
blueprint  = Blueprint(blueprints=(BlueprintAtom(kwargs={'task_names': {'left': 'teleop_openarm', 'right': 'teleop_openarm'}}, modu...mteleopmodule', 'right_controller_output'): 'right_cartesian_command'}), requirement_checks=(), configurator_checks=())
blueprint_name = 'teleop-quest-openarm'
listing    = "  - dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']"
unknown_kwargs = []
violations = ["dimos.teleop.quest.quest_extensions.ArmTeleopModule: unknown kwargs ['task_names']"]

dimos/codebase_checks/test_blueprint_kwargs.py:103: AssertionError
dimos.imitation.collection.test_blueprint::test_recorder_reads_aggregate_joint_state[blueprint1]
Stack Traces | 0.002s run time
blueprint = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff8af0e3b590>

    @pytest.mark.parametrize("blueprint", [learning_collect_quest_xarm7, learning_collect_quest_piper])
    def test_recorder_reads_aggregate_joint_state(blueprint: Blueprint) -> None:
        streams = _joint_streams(blueprint)
    
        # Plain name pairing on both ends, no remap in between. The coordinator
        # atom carries its explicit instance_name (the RPC lookup contract).
        assert streams[("collectionrecorder", AGGREGATE)] == AGGREGATE
        assert streams[("ControlCoordinator", AGGREGATE)] == AGGREGATE
>       assert not [port for _instance, port in streams if port.endswith("_joints")]
E       AssertionError: assert not ['arm_joints']

blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/piper_description.tar.gz after 3 attem...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff8af0e3b590>
streams    = {('ControlCoordinator', 'arm_joints'): 'arm_joints', ('ControlCoordinator', 'coordinator_joint_state'): 'coordinator_j..., 'joint_command'): 'joint_command', ('collectionrecorder', 'coordinator_joint_state'): 'coordinator_joint_state', ...}

.../imitation/collection/test_blueprint.py:47: AssertionError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-openarm]
Stack Traces | 0.002s run time
blueprint_name = 'coordinator-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 = 'coordinator-openarm'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openarm'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openarm'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.basic'
        name       = 'coordinator-openarm'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenArm coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenArm coordinator blueprints.'
__file__   = '.../openarm/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff672372db50>
__name__   = 'dimos.robot.manipulators.openarm.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openarm.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff672372db50>, origin='.../openarm/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openarm/blueprints/basic.py:22: ImportError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-openyam]
Stack Traces | 0.002s run time
blueprint_name = 'coordinator-openyam'

    @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-openyam'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-openyam'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.basic'
        name       = 'coordinator-openyam'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """Basic OpenYAM coordinator blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import ControlCoordinator, TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.robot.manipulators.common.blueprints import coordinator, planner
>   from dimos.robot.manipulators.common.topics import DEFAULT_TRAJECTORY_TASK_NAME
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
__doc__    = 'Basic OpenYAM coordinator blueprints.'
__file__   = '.../openyam/blueprints/basic.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff67270da450>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.basic'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff67270da450>, origin='.../openyam/blueprints/basic.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openyam/blueprints/basic.py:22: ImportError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[keyboard-teleop-openyam-planner]
Stack Traces | 0.002s run time
blueprint_name = 'keyboard-teleop-openyam-planner'

    @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-openyam-planner'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam-planner'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openyam_planner'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'keyboard-teleop-openyam-planner'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """OpenYAM keyboard teleop blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.manipulation.manipulation_module import ManipulationModule
    from dimos.robot.manipulators.common.blueprints import (
        coordinator,
        planner,
    )
    from dimos.robot.manipulators.common.coordinators import (
        ArmTwistCoordinator,
    )
>   from dimos.robot.manipulators.common.topics import (
        DEFAULT_TRAJECTORY_TASK_NAME,
        EEF_TWIST_TASK_NAME,
    )
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
__doc__    = 'OpenYAM keyboard teleop blueprints.'
__file__   = '.../openyam/blueprints/teleop.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff66c89d8740>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.teleop'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff66c89d8740>, origin='.../openyam/blueprints/teleop.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openyam/blueprints/teleop.py:29: ImportError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[keyboard-teleop-openyam]
Stack Traces | 0.002s run time
blueprint_name = 'keyboard-teleop-openyam'

    @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-openyam'

dimos/robot/test_all_blueprints.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:82: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam'
        message    = "cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)"
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'keyboard_teleop_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'keyboard-teleop-openyam'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # Copyright 2026 Dimensional Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """OpenYAM keyboard teleop blueprints."""
    
    from __future__ import annotations
    
    from dimos.control.coordinator import TaskConfig
    from dimos.core.coordination.blueprints import autoconnect
    from dimos.manipulation.manipulation_module import ManipulationModule
    from dimos.robot.manipulators.common.blueprints import (
        coordinator,
        planner,
    )
    from dimos.robot.manipulators.common.coordinators import (
        ArmTwistCoordinator,
    )
>   from dimos.robot.manipulators.common.topics import (
        DEFAULT_TRAJECTORY_TASK_NAME,
        EEF_TWIST_TASK_NAME,
    )
E   ImportError: cannot import name 'DEFAULT_TRAJECTORY_TASK_NAME' from 'dimos.robot.manipulators.common.topics' (.../manipulators/common/topics.py)

ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
__builtins__ = <builtins>
__cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
__doc__    = 'OpenYAM keyboard teleop blueprints.'
__file__   = '.../openyam/blueprints/teleop.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff66c89baf60>
__name__   = 'dimos.robot.manipulators.openyam.blueprints.teleop'
__package__ = 'dimos.robot.manipulators.openyam.blueprints'
__spec__   = ModuleSpec(name='dimos.robot.manipulators.openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff66c89baf60>, origin='.../openyam/blueprints/teleop.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
autoconnect = <function autoconnect at 0xff679ba85f80>
coordinator = <function coordinator at 0xff6731705940>
planner    = <function planner at 0xff6731705800>

.../openyam/blueprints/teleop.py:29: ImportError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openarm]
Stack Traces | 0.003s run time
blueprint_name = 'keyboard-teleop-openarm'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        blueprint = _get_blueprint_or_skip(blueprint_name)
    
        violations: list[str] = []
        for atom in blueprint.blueprints:
            unknown_kwargs = sorted(set(atom.kwargs) - _allowed_kwarg_names(atom.module))
            if unknown_kwargs:
                violations.append(
                    f"{atom.module.__module__}.{atom.module.__name__}: unknown kwargs {unknown_kwargs}"
                )
    
        if violations:
            listing = "\n".join(f"  - {violation}" for violation in violations)
>           raise AssertionError(
                f"Blueprint {blueprint_name!r} passes unknown module kwargs:\n{listing}\n\n"
                "Blueprint kwargs are forwarded into the module constructor. For modules "
                "with an explicit `config` annotation, use fields from that config model; "
                "for legacy modules with direct constructor parameters, use the declared "
                "`__init__` keyword names."
            )
E           AssertionError: Blueprint 'keyboard-teleop-openarm' passes unknown module kwargs:
E             - dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']
E           
E           Blueprint kwargs are forwarded into the module constructor. For modules with an explicit `config` annotation, use fields from that config model; for legacy modules with direct constructor parameters, use the declared `__init__` keyword names.

atom       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...on.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] BlueprintAtom object at 0xff529bed54f0>
blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff529bed4bc0>
blueprint_name = 'keyboard-teleop-openarm'
listing    = "  - dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']"
unknown_kwargs = []
violations = ["dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']"]

dimos/codebase_checks/test_blueprint_kwargs.py:103: AssertionError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openarm-planner]
Stack Traces | 0.004s run time
blueprint_name = 'keyboard-teleop-openarm-planner'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        blueprint = _get_blueprint_or_skip(blueprint_name)
    
        violations: list[str] = []
        for atom in blueprint.blueprints:
            unknown_kwargs = sorted(set(atom.kwargs) - _allowed_kwarg_names(atom.module))
            if unknown_kwargs:
                violations.append(
                    f"{atom.module.__module__}.{atom.module.__name__}: unknown kwargs {unknown_kwargs}"
                )
    
        if violations:
            listing = "\n".join(f"  - {violation}" for violation in violations)
>           raise AssertionError(
                f"Blueprint {blueprint_name!r} passes unknown module kwargs:\n{listing}\n\n"
                "Blueprint kwargs are forwarded into the module constructor. For modules "
                "with an explicit `config` annotation, use fields from that config model; "
                "for legacy modules with direct constructor parameters, use the declared "
                "`__init__` keyword names."
            )
E           AssertionError: Blueprint 'keyboard-teleop-openarm-planner' passes unknown module kwargs:
E             - dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']
E           
E           Blueprint kwargs are forwarded into the module constructor. For modules with an explicit `config` annotation, use fields from that config model; for legacy modules with direct constructor parameters, use the declared `__init__` keyword names.

atom       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...on.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] BlueprintAtom object at 0xff529bed5100>
blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/openarm_description.tar.gz after 3 att...iption.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff529bed5850>
blueprint_name = 'keyboard-teleop-openarm-planner'
listing    = "  - dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']"
unknown_kwargs = []
violations = ["dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule: unknown kwargs ['task_name']"]

dimos/codebase_checks/test_blueprint_kwargs.py:103: AssertionError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[unitree-g1-teleop]
Stack Traces | 0.006s run time
blueprint_name = 'unitree-g1-teleop'

    @pytest.mark.parametrize("blueprint_name", _blueprint_params())
    def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None:
        """Fail when blueprint kwargs cannot be consumed by their target module."""
        blueprint = _get_blueprint_or_skip(blueprint_name)
    
        violations: list[str] = []
        for atom in blueprint.blueprints:
            unknown_kwargs = sorted(set(atom.kwargs) - _allowed_kwarg_names(atom.module))
            if unknown_kwargs:
                violations.append(
                    f"{atom.module.__module__}.{atom.module.__name__}: unknown kwargs {unknown_kwargs}"
                )
    
        if violations:
            listing = "\n".join(f"  - {violation}" for violation in violations)
>           raise AssertionError(
                f"Blueprint {blueprint_name!r} passes unknown module kwargs:\n{listing}\n\n"
                "Blueprint kwargs are forwarded into the module constructor. For modules "
                "with an explicit `config` annotation, use fields from that config model; "
                "for legacy modules with direct constructor parameters, use the declared "
                "`__init__` keyword names."
            )
E           AssertionError: Blueprint 'unitree-g1-teleop' passes unknown module kwargs:
E             - dimos.teleop.quest.quest_extensions.MobileVideoArmTeleopModule: unknown kwargs ['task_names']
E           
E           Blueprint kwargs are forwarded into the module constructor. For modules with an explicit `config` annotation, use fields from that config model; for legacy modules with direct constructor parameters, use the declared `__init__` keyword names.

atom       = BlueprintAtom(kwargs={'db_path': '.../dimos/recordings/session_g1_20260814_220008.db', ... type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>, direction='in')), module_refs=(), instance_name=None)
blueprint  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/groot.tar.gz after 3 attempts: Command.../groot.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] Blueprint object at 0xff529bbd2a20>
blueprint_name = 'unitree-g1-teleop'
listing    = "  - dimos.teleop.quest.quest_extensions.MobileVideoArmTeleopModule: unknown kwargs ['task_names']"
unknown_kwargs = []
violations = ["dimos.teleop.quest.quest_extensions.MobileVideoArmTeleopModule: unknown kwargs ['task_names']"]

dimos/codebase_checks/test_blueprint_kwargs.py:103: AssertionError
dimos.robot.manipulators.dual_openyam.test_integration::test_authoritative_arm_only_model_prepares_for_viser
Stack Traces | 3.11s run time
def test_authoritative_arm_only_model_prepares_for_viser() -> None:
        config = dual_openyam_model_config()
        prepared = Path(
>           prepare_urdf(
                config.model_path,
                package_paths=config.package_paths,
                convert_meshes=config.auto_convert_meshes,
            )
        )

config     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] RobotModelConfig object at 0xff5298225680>

.../manipulators/dual_openyam/test_integration.py:20: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../planning/utils/mesh_utils.py:75: in prepare_urdf
    urdf_path = Path(urdf_path)
        convert_meshes = True
        package_paths = {'dual_openyam_abc_box': <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_..._box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>}
        urdf_path  = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
        xacro_args = None
....../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/dual_openyam_abc_box_v2.tar.gz after ...box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff529a38bf40>
....../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/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after ...box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff529a38bf40>
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.hardware.whole_body.dual_openyam_damiao.test_adapter::test_adapter_connects_complete_dual_yam_topology
Stack Traces | 3.12s run time
adapter = <dimos.hardware.whole_body.dual_openyam_damiao.adapter.DualOpenYamDamiaoAdapter object at 0xff8a7387eab0>

    def test_adapter_connects_complete_dual_yam_topology(
        adapter: DualOpenYamDamiaoAdapter,
    ) -> None:
>       assert adapter.connect()
E       assert False
E        +  where False = connect()
E        +    where connect = <dimos.hardware.whole_body.dual_openyam_damiao.adapter.DualOpenYamDamiaoAdapter object at 0xff8a7387eab0>.connect

adapter    = <dimos.hardware.whole_body.dual_openyam_damiao.adapter.DualOpenYamDamiaoAdapter object at 0xff8a7387eab0>

.../whole_body/dual_openyam_damiao/test_adapter.py:44: AssertionError
dimos.robot.manipulators.dual_openyam.test_model::test_both_arm_chains_are_symmetric_and_use_two_rad_s_limits
Stack Traces | 3.12s run time
def test_both_arm_chains_are_symmetric_and_use_two_rad_s_limits() -> None:
>       root = _tree()


.../manipulators/dual_openyam/test_model.py:78: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../manipulators/dual_openyam/test_model.py:29: in _tree
    return ET.parse(DUAL_OPENYAM_MODEL_PATH).getroot()
....../usr/lib/python3.12....../xml/etree/ElementTree.py:1204: in parse
    tree.parse(source, parser)
        parser     = None
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
        tree       = <xml.etree.ElementTree.ElementTree object at 0xff529288b560>
....../usr/lib/python3.12....../xml/etree/ElementTree.py:557: in parse
    if not hasattr(source, "read"):
        close_source = False
        parser     = None
        self       = <xml.etree.ElementTree.ElementTree object at 0xff529288b560>
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'read'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.robot.manipulators.dual_openyam.test_model::test_model_package_is_versioned_and_self_contained
Stack Traces | 3.13s run time
def test_model_package_is_versioned_and_self_contained() -> None:
        assert DUAL_OPENYAM_ARTIFACT == "dual_openyam_abc_box_v2"
>       assert Path(DUAL_OPENYAM_PACKAGE).name == DUAL_OPENYAM_ARTIFACT


.../manipulators/dual_openyam/test_model.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
....../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/dual_openyam_abc_box_v2.tar.gz after ...box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>,)
        kwargs     = {}
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff529290ace0>
....../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/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>
        args       = (<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after ...box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>,)
        ntpath     = <module 'ntpath' (frozen)>
        paths      = []
        self       = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0xff529290ace0>
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '_flavour'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a73450>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2')
        name       = 'dual_openyam_abc_box_v2'
        nested_path = None
        path_parts = ('dual_openyam_abc_box_v2',)
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.robot.manipulators.dual_openyam.test_model::test_model_contains_no_workbench_camera_or_environment_geometry
Stack Traces | 3.13s run time
def test_model_contains_no_workbench_camera_or_environment_geometry() -> None:
>       root = _tree()


.../manipulators/dual_openyam/test_model.py:111: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../manipulators/dual_openyam/test_model.py:29: in _tree
    return ET.parse(DUAL_OPENYAM_MODEL_PATH).getroot()
....../usr/lib/python3.12....../xml/etree/ElementTree.py:1204: in parse
    tree.parse(source, parser)
        parser     = None
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
        tree       = <xml.etree.ElementTree.ElementTree object at 0xff52928b29f0>
....../usr/lib/python3.12....../xml/etree/ElementTree.py:557: in parse
    if not hasattr(source, "read"):
        close_source = False
        parser     = None
        self       = <xml.etree.ElementTree.ElementTree object at 0xff52928b29f0>
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'read'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.robot.manipulators.dual_openyam.test_model::test_model_has_one_geometry_free_root_and_only_preserves_arm_spacing
Stack Traces | 3.18s run time
def test_model_has_one_geometry_free_root_and_only_preserves_arm_spacing() -> None:
>       root = _tree()


.../manipulators/dual_openyam/test_model.py:59: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../manipulators/dual_openyam/test_model.py:29: in _tree
    return ET.parse(DUAL_OPENYAM_MODEL_PATH).getroot()
....../usr/lib/python3.12....../xml/etree/ElementTree.py:1204: in parse
    tree.parse(source, parser)
        parser     = None
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
        tree       = <xml.etree.ElementTree.ElementTree object at 0xff52928b3e00>
....../usr/lib/python3.12....../xml/etree/ElementTree.py:557: in parse
    if not hasattr(source, "read"):
        close_source = False
        parser     = None
        self       = <xml.etree.ElementTree.ElementTree object at 0xff52928b3e00>
        source     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'read'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.robot.manipulators.dual_openyam.test_model::test_model_exposes_twelve_arm_joints_and_fixed_finger_geometry
Stack Traces | 3.18s run time
def test_model_exposes_twelve_arm_joints_and_fixed_finger_geometry() -> None:
>       model = pinocchio.buildModelFromUrdf(str(DUAL_OPENYAM_MODEL_PATH))


.../manipulators/dual_openyam/test_model.py:94: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:371: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff5313a72fd0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError
dimos.robot.manipulators.dual_openyam.test_blueprints::test_quest_blueprint_selects_physical_hardware_from_both_can_ports
Stack Traces | 3.2s run time
value = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>

    def _copy_opaque(value: Any) -> Any:
        try:
>           return copy.deepcopy(value)

value      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>

.../coordination/blueprint_config/values.py:148: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
............................../usr/lib/python3.12/copy.py:162: in deepcopy
    y = _reconstruct(x, memo, *rv)
        _nil       = []
        cls        = <class 'dimos.control.coordinator.TaskConfig'>
        copier     = None
        d          = 280816936540144
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        reductor   = <built-in method __reduce_ex__ of TaskConfig object at 0xff66c9bfd7f0>
        rv         = (<function __newobj__ at 0xff67b72b05e0>, (<class 'dimos.control.coordinator.TaskConfig'>,), {'auto_start': False, 'jo...lter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}, ...}, None, None)
        x          = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>
        y          = []
............................../usr/lib/python3.12/copy.py:259: in _reconstruct
    state = deepcopy(state, memo)
        args       = <generator object _reconstruct.<locals>.<genexpr> at 0xff67a108ef20>
        deep       = True
        deepcopy   = <function deepcopy at 0xff67b6c72020>
        dictiter   = None
        func       = <function __newobj__ at 0xff67b72b05e0>
        listiter   = None
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        state      = {'auto_start': False, 'joint_names': ['left_arm/joint1', 'left_arm/joint2', 'left_arm/joint3', 'left_arm/joint4', 'lef...nt_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}, ...}
        x          = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>
        y          = <[AttributeError("'TaskConfig' object has no attribute 'name'") raised in repr()] TaskConfig object at 0xff66b89441a0>
............................../usr/lib/python3.12/copy.py:136: in deepcopy
    y = copier(x, memo)
        _nil       = []
        cls        = <class 'dict'>
        copier     = <function _deepcopy_dict at 0xff67b6aa0ae0>
        d          = 280820566374144
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        x          = {'auto_start': False, 'joint_names': ['left_arm/joint1', 'left_arm/joint2', 'left_arm/joint3', 'left_arm/joint4', 'lef...nt_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}, ...}
        y          = []
............................../usr/lib/python3.12/copy.py:221: in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
        deepcopy   = <function deepcopy at 0xff67b6c72020>
        key        = 'params'
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        value      = {'bindings': [{'gripper_closed_position': 0.0, 'gripper_joint': 'left_arm/gripper', 'gripper_open_position': 1.0, 'han..., 'joint_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}
        x          = {'auto_start': False, 'joint_names': ['left_arm/joint1', 'left_arm/joint2', 'left_arm/joint3', 'left_arm/joint4', 'lef...nt_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}, ...}
        y          = {'auto_start': False, 'joint_names': ['left_arm/joint1', 'left_arm/joint2', 'left_arm/joint3', 'left_arm/joint4', 'left_arm/joint5', 'left_arm/joint6', ...], 'name': 'teleop_dual_openyam', 'priority': 10, ...}
............................../usr/lib/python3.12/copy.py:136: in deepcopy
    y = copier(x, memo)
        _nil       = []
        cls        = <class 'dict'>
        copier     = <function _deepcopy_dict at 0xff67b6aa0ae0>
        d          = 280816917099904
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        x          = {'bindings': [{'gripper_closed_position': 0.0, 'gripper_joint': 'left_arm/gripper', 'gripper_open_position': 1.0, 'han..., 'joint_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}
        y          = []
............................../usr/lib/python3.12/copy.py:221: in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
        deepcopy   = <function deepcopy at 0xff67b6c72020>
        key        = 'robot_model'
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        value      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] RobotModelConfig object at 0xff66c99437f0>
        x          = {'bindings': [{'gripper_closed_position': 0.0, 'gripper_joint': 'left_arm/gripper', 'gripper_open_position': 1.0, 'han..., 'joint_command_filter_cutoff_hz': 30.0, 'max_command_tracking_error_deg': 10.0, 'max_joint_velocity_rad_s': 2.0, ...}
        y          = {}
............................../usr/lib/python3.12/copy.py:143: in deepcopy
    y = copier(memo)
        _nil       = []
        cls        = <class 'dimos.manipulation.planning.spec.config.RobotModelConfig'>
        copier     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...bc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] method object at 0xff67a0949740>
        d          = 280816933681136
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        x          = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] RobotModelConfig object at 0xff66c99437f0>
        y          = []
.venv/lib/python3.12.../site-packages/pydantic/main.py:978: in __deepcopy__
    _object_setattr(m, '__dict__', deepcopy(self.__dict__, memo=memo))
        cls        = <class 'dimos.manipulation.planning.spec.config.RobotModelConfig'>
        m          = RobotModelConfig()
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] RobotModelConfig object at 0xff66c99437f0>
............................../usr/lib/python3.12/copy.py:136: in deepcopy
    y = copier(x, memo)
        _nil       = []
        cls        = <class 'dict'>
        copier     = <function _deepcopy_dict at 0xff67b6aa0ae0>
        d          = 280816928391488
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        x          = {'auto_convert_meshes': True, 'base_link': 'dual_openyam_base', 'base_pose': Pose(position=Vector([          0           0           0]), orientation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000)), 'collision_exclusion_pairs': [], ...}
        y          = []
............................../usr/lib/python3.12/copy.py:221: in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
        deepcopy   = <function deepcopy at 0xff67b6c72020>
        key        = 'model_path'
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        value      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff673177b5d0>
        x          = {'auto_convert_meshes': True, 'base_link': 'dual_openyam_base', 'base_pose': Pose(position=Vector([          0           0           0]), orientation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000)), 'collision_exclusion_pairs': [], ...}
        y          = {'default_rpc_timeout': 120.0, 'frame_id': None, 'frame_id_prefix': None, 'g': GlobalConfig(robot_ip=None, robot_ips=N...'127.0.0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}
............................../usr/lib/python3.12/copy.py:141: in deepcopy
    copier = getattr(x, "__deepcopy__", None)
        _nil       = []
        cls        = <class 'dimos.utils.data.LfsPath'>
        copier     = None
        d          = 280818676643280
        memo       = {280816917099584: {'build_native': False, 'can_port': None, 'detection_model': 'moondream', 'device_path': None, ...},....0.1', dimsim_scene='apartment', dimsim_port=8090, dimsim_headless=True, local_relay=False, relay_url=None), ...}, ...}
        x          = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff673177b5d0>
        y          = []
dimos/utils/data.py:366: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = '__deepcopy__'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff673177b5d0>
dimos/utils/data.py:349: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...c_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xff673177b5d0>
dimos/utils/data.py:306: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'dual_openyam_abc_box_v2'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/dual_openyam_abc_box_v2/dual_openyam.urdf')
        name       = 'dual_openyam_abc_box_v2/dual_openyam.urdf'
        nested_path = PosixPath('dual_openyam.urdf')
        path_parts = ('dual_openyam_abc_box_v2', 'dual_openyam.urdf')
dimos/utils/data.py:250: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
        filename   = 'dual_openyam_abc_box_v2'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.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(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    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/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'fac9ee65-5946-4d55-b331-02e42ffdc75c.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/dual_openyam_abc_box_v2.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:218: RuntimeError

The above exception was the direct cause of the following exception:

    def test_quest_blueprint_selects_physical_hardware_from_both_can_ports() -> None:
>       parsed = BlueprintConfigParser(teleop_quest_dual_openyam).parse(
            [
                "--left-can-port",
                "follower_l",
                "--right-can-port",
                "follower_r",
                "--manipulationmodule.visualization.host=0.0.0.0",
            ],
            environ={},
        )


.../manipulators/dual_openyam/test_blueprints.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../coordination/blueprint_config/parser.py:169: in parse
    key: plain(value)
        cli_tokens = ['--left-can-port', 'follower_l', '--right-can-port', 'follower_r', '--manipulationmodule.visualization.host=0.0.0.0']
        config_path = None
        environ    = {}
        global_overrides = None
        overrides  = None
        schema     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3..._v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] ParserSchema object at 0xff66c91e7cc0>
        self       = <dimos.core.coordination.blueprint_config.parser.BlueprintConfigParser object at 0xff66b8945ac0>
.../coordination/blueprint_config/values.py:50: in plain
    return [plain(item) for item in value]
        value      = [<[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after ...oint5', 'right_arm/joint6'], priority=20, auto_start=False, params={'start_position_tolerance': 0.05}, stream_bind={})]
.../coordination/blueprint_config/values.py:55: in plain
    return _copy_opaque(value)
        value      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

value = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>

    def _copy_opaque(value: Any) -> Any:
        try:
            return copy.deepcopy(value)
        except Exception as error:
>           raise BlueprintConfigError(
                f"Configuration value of type {type(value).__name__} cannot be copied safely: {error}"
            ) from error
E           dimos.core.coordination.blueprint_config.errors.BlueprintConfigError: Configuration value of type TaskConfig cannot be copied safely: Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/dual_openyam_abc_box_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.

value      = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/dual_openyam_abc_box_v2.tar.gz after 3...ox_v2.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] TaskConfig object at 0xff66c9bfd7f0>

.../coordination/blueprint_config/values.py:150: BlueprintConfigError

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 base branch from cc/feat/dual-arm-teleop to pim/feat/g1-quest-teleop-stacked August 14, 2026 01:45
Comment thread dimos/control/tasks/teleop_ik_task/teleop_ik_task.py Outdated
Comment thread dimos/control/tasks/trajectory_task/trajectory_task.py Outdated
Comment thread dimos/hardware/whole_body/damiao/adapter.py Outdated
Comment thread dimos/hardware/whole_body/dual_openyam_damiao/adapter.py Outdated
Comment thread dimos/hardware/whole_body/dual_openyam_damiao/adapter.py Outdated
Comment thread dimos/hardware/whole_body/dual_openyam_damiao/adapter.py Outdated
Comment thread dimos/manipulation/planning/kinematics/pink_solver.py Outdated
Comment thread dimos/manipulation/planning/kinematics/pink_solver.py Outdated
Comment thread dimos/manipulation/planning/utils/mesh_utils.py Outdated
Comment thread dimos/manipulation/planning/utils/model_reduction.py Outdated
Comment thread dimos/manipulation/planning/world/roboplan_model.py
Comment thread dimos/manipulation/planning/world/drake_world.py
Comment thread dimos/manipulation/visualization/viser/test_visualizer_lifecycle.py
Comment thread dimos/manipulation/visualization/viser/scene.py
Comment thread dimos/robot/manipulators/dual_openyam/blueprints/teleop.py Outdated
Comment thread dimos/robot/manipulators/dual_openyam/blueprints/teleop.py Outdated
Comment thread dimos/robot/manipulators/dual_openyam/blueprints/teleop.py
Comment thread docs/capabilities/manipulation/dual_openyam_abc_box.md Outdated
Comment thread dimos/robot/manipulators/dual_openyam/test_blueprints.py Outdated
Comment thread dimos/robot/manipulators/dual_openyam/test_blueprints.py Outdated
Comment thread dimos/robot/manipulators/dual_openyam/test_blueprints.py
@TomCC7
TomCC7 marked this pull request as ready for review August 14, 2026 20:29
@TomCC7
TomCC7 requested a review from Dreamsorcerer as a code owner August 14, 2026 20:29
@TomCC7
TomCC7 force-pushed the cc/feat/dual-yam branch 2 times, most recently from 7ad8bac to d344110 Compare August 14, 2026 21:40
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