Skip to content

feat(imitation): add profile-driven dual-arm collection - #3942

Draft
TomCC7 wants to merge 3 commits into
cc/feat/robot-learning-sdkfrom
cc/feat/flexible-policy-module
Draft

feat(imitation): add profile-driven dual-arm collection#3942
TomCC7 wants to merge 3 commits into
cc/feat/robot-learning-sdkfrom
cc/feat/flexible-policy-module

Conversation

@TomCC7

@TomCC7 TomCC7 commented Sep 4, 2026

Copy link
Copy Markdown
Member

Contribution path

Problem

  • The fixed recorder inputs cannot describe collection setups with different camera counts.
  • Recorder inputs and dataset projections need one declaration so stream names, message types, and joint ordering stay consistent.
  • Workflow presets should reference Python builders and profiles directly, without string-based imports.

Solution

  • Add Dual OpenYAM Quest collection with two wrist RGB cameras, measured joint state, and accepted joint commands.
  • Use a CollectionProfile for both typed recording inputs and dataset features.
  • Generate recorder ports before autoconnect through an explicit blueprint factory. Record each distinct raw stream once, even when several features project from it.
  • Keep camera devices and robot hardware in robot-specific builders. CLI presets hold builder callables and profile objects directly.
  • Decode native MCAP channels from message-type and codec metadata, including renamed streams. Pin Python message schemas to the native recorder's revision.
  • Keep single-arm collection and LeRobot rollout. ABC integration, dual-arm policy rollout, and a shared policy-backend API are deferred.

API shape

CollectionProfile
  ├── collection_recorder(...) → typed recorder Blueprint
  ├── robot collection builder → cameras + robot + recorder + episode monitor
  └── dataprep_config(...)     → dataset features + synchronization rules

The public models, with validation and defaults omitted:

class CollectionFeature(FeatureSpec):
    message_type: type[Any]
    # Inherits: stream, field, dtype, shape, names


class CollectionProfile(BaseConfig):
    name: str
    robot_type: str
    observations: dict[str, CollectionFeature]
    actions: dict[str, CollectionFeature]
    sync: SyncConfig
    quality: QualityConfig
  • Dictionary keys name dataset features, such as observation.images.overhead.
  • stream names the DimOS input; message_type supplies its concrete Python type.
  • field selects the message field. names specifies image axes or ordered joint names for joint vectors.
  • Several features can select different fields or joint subsets from one stream.
  • The default dual profile uses 640×480 RGB, 30 Hz, and a 20 ms synchronization tolerance anchored on the left wrist image. Joint order is left arm 1–6, right arm 1–6, left gripper, right gripper.

The recorder factory declares typed In[T] ports and adds the reserved status: In[EpisodeStatus] input:

collection_recorder(
    *,
    profile: CollectionProfile,
    recording: Path,
    instance_name: str | None = None,
) -> Blueprint

A robot-specific builder supplies the complete collection stack. The same profile configures dataset preparation:

from pathlib import Path

from dimos.imitation.dataprep.build import run_dataprep
from dimos.imitation.dataprep.core import OutputConfig
from dimos.robot.manipulators.dual_openyam.blueprints.learning_collection import (
    build_dual_openyam_quest_collection,
)
from dimos.robot.manipulators.dual_openyam.learning import DUAL_OPENYAM_COLLECTION

profile = DUAL_OPENYAM_COLLECTION
recording = Path("session.mcap")

blueprint = build_dual_openyam_quest_collection(
    profile=profile,
    recording=recording,
    task="fold the towel",
    cameras={
        "left_wrist_image": "/dev/video0",
        "right_wrist_image": "/dev/video2",
    },
    left_can_port="follower_l",
    right_can_port="follower_r",
)

# Prepare the recording after collection finishes.
config = profile.dataprep_config(
    source=str(recording),
    output=OutputConfig(
        path=Path("dataset"),
        metadata={
            "repo_id": "local/dual-openyam",
            "robot_type": profile.robot_type,
        },
    ),
)
run_dataprep(config)

To add an overhead camera, include this feature in a custom profile's observations and add "overhead_image": "/dev/video4" to the builder's cameras mapping:

from dimos.imitation.collection.profile import CollectionFeature, CollectionProfile
from dimos.msgs.sensor_msgs.Image import Image

overhead = CollectionFeature(
    stream="overhead_image",
    message_type=Image,
    field="data",
    dtype="video",
    shape=(480, 640, 3),
    names=["height", "width", "channels"],
)
base = DUAL_OPENYAM_COLLECTION
custom_profile = CollectionProfile(
    name="dual-openyam-overhead",
    robot_type=base.robot_type,
    observations={**base.observations, "observation.images.overhead": overhead},
    actions=base.actions,
    sync=base.sync,
    quality=base.quality,
)
  • Adding a camera does not require a recorder subclass or changes to core Blueprint discovery.
  • Strings remain for CLI selection, stream names, and dataset keys. Builders and message types are Python references.
  • Generated recorder classes are private; their identity survives pickle, worker deployment, and module reload.

How to Test

  • With two OpenYAM arms, a Quest headset, and wrist cameras attached, run the feature with the appropriate CAN ports and camera devices:
dimos imitation collect dual-openyam-quest --task "fold the towel" --left-can-port follower_l --right-can-port follower_r --camera left_wrist_image=/dev/video0 --camera right_wrist_image=/dev/video2
  • Space starts/saves an episode; D discards it. Keep the arms supported when stopping because shutdown de-torques them.
  • Prepare the saved recording:
dimos imitation prepare dual-openyam-quest RECORDING.mcap
  • 144 host/native tests passed, including forkserver deployment, reload, native Zenoh recording, CLI presets, and blueprint registry generation.
  • 36 isolated LeRobot tests passed, including exports with 1, 2, and 4 cameras, 14-joint ordering, shared-stream projections, and discarded-episode filtering.
  • Ruff, pre-commit hooks, and scoped host/isolated type checks passed. Full isolated mypy still reports missing stubs and unused ignores in imported host modules.
  • Robot hardware has not been tested. Native recording and export tests use synthetic messages.

AI assistance

  • OpenAI Codex (GPT-5) was used extensively for design, implementation, tests, documentation, and PR preparation.

Checklist

  • I have read and approved the CLA.

@TomCC7 TomCC7 changed the title cc/feat/flexible policy module feat(imitation): add profile-driven policy backends Sep 4, 2026
@TomCC7
TomCC7 force-pushed the cc/feat/flexible-policy-module branch from 737a8ec to 40001bb Compare September 8, 2026 23:42
@codecov

codecov Bot commented Sep 8, 2026

Copy link
Copy Markdown

❌ 63 Tests Failed:

Tests completed Failed Passed Skipped
4781 63 4718 180
View the top 3 failed test(s) by shortest run time
::dimos.cli.commands.test_graph
Stack Traces | 0s run time
ImportError while importing test module '.../cli/commands/test_graph.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../cli/commands/test_graph.py:24: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.commands.test_imitation
Stack Traces | 0s run time
ImportError while importing test module '.../cli/commands/test_imitation.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../cli/commands/test_imitation.py:22: in <module>
    from dimos.cli.commands.imitation import (
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.test_cache
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/cli/test_cache.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/cli/test_cache.py:25: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.test_can
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/cli/test_can.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/cli/test_can.py:24: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.test_dimos
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/cli/test_dimos.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/cli/test_dimos.py:26: in <module>
    from dimos.cli.dimos import main, normalize_argv
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.test_shell
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/cli/test_shell.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/cli/test_shell.py:17: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.cli.test_vqa
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/cli/test_vqa.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/cli/test_vqa.py:21: in <module>
    from dimos.cli.dimos import main as app
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.core.test_cli_stop_status
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/core/test_cli_stop_status.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/core/test_cli_stop_status.py:25: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.core.test_e2e_daemon
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/core/test_e2e_daemon.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/core/test_e2e_daemon.py:26: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.core.test_mcp_integration
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/core/test_mcp_integration.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/core/test_mcp_integration.py:39: in <module>
    from dimos.cli.dimos import main
dimos/cli/dimos.py:59: in <module>
    from dimos.cli.commands.imitation import imitation_app
.../cli/commands/imitation.py:47: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.collection.test_blueprint
Stack Traces | 0s run time
ImportError while importing test module '.../imitation/collection/test_blueprint.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../imitation/collection/test_blueprint.py:20: in <module>
    from dimos.imitation.collection.blueprint import (
.../imitation/collection/blueprint.py:30: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.collection.test_episode_monitor
Stack Traces | 0s run time
ImportError while importing test module '.../imitation/collection/test_episode_monitor.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../imitation/collection/test_episode_monitor.py:33: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.collection.test_native_recorder
Stack Traces | 0s run time
ImportError while importing test module '.../imitation/collection/test_native_recorder.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../imitation/collection/test_native_recorder.py:22: in <module>
    from dimos.robot.manipulators.dual_openyam.learning import DualOpenYamQuestRecorder
.../manipulators/dual_openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.collection.test_recorder
Stack Traces | 0s run time
ImportError while importing test module '.../imitation/collection/test_recorder.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../imitation/collection/test_recorder.py:17: in <module>
    from dimos.imitation.collection.recorder import CollectionRecorder, CollectionRecorderConfig
.../imitation/collection/recorder.py:30: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.dataprep.test_mcap_source
Stack Traces | 0s run time
ImportError while importing test module '.../imitation/dataprep/test_mcap_source.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../imitation/dataprep/test_mcap_source.py:35: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.policy.abc.test_module
Stack Traces | 0s run time
ImportError while importing test module '.../policy/abc/test_module.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../policy/abc/test_module.py:18: in <module>
    from dimos.imitation.policy.abc.module import DualOpenYamAbcPolicy
.../policy/abc/module.py:22: in <module>
    from dimos.robot.manipulators.dual_openyam.learning import DUAL_OPENYAM_ABC_IO
.../manipulators/dual_openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.policy.lerobot.test_module
Stack Traces | 0s run time
ImportError while importing test module '.../policy/lerobot/test_module.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../policy/lerobot/test_module.py:21: in <module>
    from dimos.imitation.policy.lerobot.module import LeRobotPolicyConfig, OpenYamLeRobotPolicy
.../policy/lerobot/module.py:18: in <module>
    from dimos.robot.manipulators.openyam.learning import OPENYAM_QUEST_IO
.../manipulators/openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.test_datacollection_e2e
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/imitation/test_datacollection_e2e.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/imitation/test_datacollection_e2e.py:29: in <module>
    from dimos.imitation.collection.recorder import CollectionRecorder
.../imitation/collection/recorder.py:30: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.imitation.test_workflows
Stack Traces | 0s run time
ImportError while importing test module '.../dimos/imitation/test_workflows.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
dimos/imitation/test_workflows.py:25: in <module>
    from dimos.robot.manipulators.dual_openyam.learning import ABC_JOINTS
.../manipulators/dual_openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.msgs.imitation_msgs.test_episode_status
Stack Traces | 0s run time
ImportError while importing test module '.../msgs/imitation_msgs/test_episode_status.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../msgs/imitation_msgs/test_episode_status.py:17: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.a1z.blueprints.test_teleop
Stack Traces | 0s run time
ImportError while importing test module '.../a1z/blueprints/test_teleop.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../a1z/blueprints/test_teleop.py:28: in <module>
    from dimos.teleop.quest.blueprints import teleop_quest_a1z
.../teleop/quest/blueprints.py:36: in <module>
    from dimos.teleop.quest.quest_extensions import (
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.dual_openyam.blueprints.test_learning
Stack Traces | 0s run time
ImportError while importing test module '.../dual_openyam/blueprints/test_learning.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../dual_openyam/blueprints/test_learning.py:20: in <module>
    from dimos.imitation.policy.abc.module import DualOpenYamAbcPolicy
.../policy/abc/module.py:22: in <module>
    from dimos.robot.manipulators.dual_openyam.learning import DUAL_OPENYAM_ABC_IO
.../manipulators/dual_openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.dual_openyam.test_blueprints
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/dual_openyam/test_blueprints.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/dual_openyam/test_blueprints.py:31: in <module>
    from dimos.robot.manipulators.dual_openyam.blueprints.teleop import (
.../dual_openyam/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.dual_openyam.test_teleop_ik
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/dual_openyam/test_teleop_ik.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/dual_openyam/test_teleop_ik.py:23: in <module>
    from dimos.robot.manipulators.dual_openyam.blueprints.teleop import (
.../dual_openyam/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openarm.test_openarm_teleop
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/openarm/test_openarm_teleop.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/openarm/test_openarm_teleop.py:35: in <module>
    from dimos.robot.manipulators.openarm.blueprints.teleop import (
.../openarm/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openyam.blueprints.test_learning_collection
Stack Traces | 0s run time
ImportError while importing test module '.../openyam/blueprints/test_learning_collection.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../openyam/blueprints/test_learning_collection.py:19: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openyam.blueprints.test_learning_collection_e2e
Stack Traces | 0s run time
ImportError while importing test module '.../openyam/blueprints/test_learning_collection_e2e.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../openyam/blueprints/test_learning_collection_e2e.py:33: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openyam.blueprints.test_learning_rollout
Stack Traces | 0s run time
ImportError while importing test module '.../openyam/blueprints/test_learning_rollout.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../openyam/blueprints/test_learning_rollout.py:21: in <module>
    from dimos.imitation.policy.lerobot.module import OpenYamLeRobotPolicy
.../policy/lerobot/module.py:18: in <module>
    from dimos.robot.manipulators.openyam.learning import OPENYAM_QUEST_IO
.../manipulators/openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openyam.test_learning
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/openyam/test_learning.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/openyam/test_learning.py:17: in <module>
    from dimos.robot.manipulators.openyam.learning import (
.../manipulators/openyam/learning.py:17: in <module>
    from dimos.imitation.collection.native_recorder import declare_recorder
.../imitation/collection/native_recorder.py:22: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::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:28: in <module>
    from dimos.robot.manipulators.openyam.blueprints.teleop import (
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.manipulators.openyam.test_teleop_ik
Stack Traces | 0s run time
ImportError while importing test module '.../manipulators/openyam/test_teleop_ik.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../manipulators/openyam/test_teleop_ik.py:24: in <module>
    from dimos.robot.manipulators.openyam.blueprints.teleop import _openyam_quest_task
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.robot.unitree.g1.test_g1_teleop
Stack Traces | 0s run time
ImportError while importing test module '.../unitree/g1/test_g1_teleop.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../unitree/g1/test_g1_teleop.py:38: in <module>
    from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop import (
.../blueprints/basic/unitree_g1_teleop.py:57: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.teleop.hosted.test_arm_command
Stack Traces | 0s run time
ImportError while importing test module '.../teleop/hosted/test_arm_command.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../teleop/hosted/test_arm_command.py:38: in <module>
    from dimos.teleop.hosted.arm_command import ArmCommandModule
.../teleop/hosted/arm_command.py:37: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.teleop.hosted.test_go2_audio_bridge
Stack Traces | 0s run time
ImportError while importing test module '.../teleop/hosted/test_go2_audio_bridge.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../teleop/hosted/test_go2_audio_bridge.py:32: in <module>
    from dimos.teleop.hosted.blueprints.cloudflare import teleop_hosted_go2_transport
.../hosted/blueprints/cloudflare.py:50: in <module>
    from dimos.teleop.hosted.arm_command import ArmCommandModule
.../teleop/hosted/arm_command.py:37: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.teleop.quest.test_blueprints
Stack Traces | 0s run time
ImportError while importing test module '.../teleop/quest/test_blueprints.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../teleop/quest/test_blueprints.py:22: in <module>
    from dimos.teleop.quest.blueprints import (
.../teleop/quest/blueprints.py:36: in <module>
    from dimos.teleop.quest.quest_extensions import (
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
::dimos.teleop.quest.test_quest_teleop_module
Stack Traces | 0s run time
ImportError while importing test module '.../teleop/quest/test_quest_teleop_module.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../teleop/quest/test_quest_teleop_module.py:25: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
.../msgs/imitation_msgs/EpisodeStatus.py:19: in <module>
    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-a1z]
Stack Traces | 0.003s run time
blueprint_name = 'teleop-quest-a1z'

    @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 = 'teleop-quest-a1z'

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 = 'teleop-quest-a1z'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_a1z'
        module_path = 'dimos.teleop.quest.blueprints'
        name       = 'teleop-quest-a1z'
.../teleop/quest/blueprints.py:36: in <module>
    from dimos.teleop.quest.quest_extensions import (
        DEFAULT_CAPACITY_COLOR_IMAGE = 6224896
        GO2Connection = <class 'dimos.robot.unitree.go2.connection.GO2Connection'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Teleop blueprints for testing and deployment.\n\nSingle sim/real blueprints — pass `--simulation` to run inside MuJoCo, omit for real\nhardware. The underlying coordinator blueprints branch on `global_config.simulation`.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01e8c80>
        __name__   = 'dimos.teleop.quest.blueprints'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01e8c80>, origin='.../work/dimos/dimos/.../teleop/quest/blueprints.py')
        autoconnect = <function autoconnect at 0xff118e9ff600>
        coordinator_teleop_a1z = Blueprint(blueprints=(BlueprintAtom(kwargs={'instance_name': 'ControlCoordinator', 'hardware': [HardwareComponent(hard...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_teleop_dual = <[FileNotFoundError("Test file 'piper_description' not found at .../dimos/data/.lfs/piper_descript...e the file is committed to Git LFS in the tests/data directory.") raised in repr()] Blueprint object at 0xff10b1f88170>
        coordinator_teleop_piper = <[FileNotFoundError("Test file 'piper_description' not found at .../dimos/data/.lfs/piper_descript...e the file is committed to Git LFS in the tests/data directory.") raised in repr()] Blueprint object at 0xff10b1f8b5f0>
        coordinator_teleop_xarm6 = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_teleop_xarm7 = Blueprint(blueprints=(BlueprintAtom(kwargs={'instance_name': 'ControlCoordinator', 'hardware': [HardwareComponent(hard...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01e8d70>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01e8d70>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01e93d0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01e93d0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01e9cd0>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01e9cd0>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[unitree-g1-teleop]
Stack Traces | 0.003s 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)

blueprint_name = 'unitree-g1-teleop'

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 = 'unitree-g1-teleop'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_g1_teleop'
        module_path = 'dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop'
        name       = 'unitree-g1-teleop'
.../blueprints/basic/unitree_g1_teleop.py:57: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        DEFAULT_CAPACITY_COLOR_IMAGE = 6224896
        In         = <class 'dimos.core.stream.In'>
        STATE_DIR  = PosixPath('.../tmp/dimos-test-state-gw3-bo63643g/dimos')
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_g1_teleop.cpython-312.pyc'
        __doc__    = 'Unitree G1 GR00T WBC + Quest teleop + manipulation + recording.\n\nThe GR00T locomotion/control core (without navigat...o --scene-package office run unitree-g1-teleop\n    dimos run unitree-g1-teleop                      # real hardware\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_g1_teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10abf03a40>
        __name__   = 'dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop'
        __package__ = 'dimos.robot.unitree.g1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop', loader=<_frozen_importlib_external.Source...t 0xff10abf03a40>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_g1_teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        datetime   = <class 'datetime.datetime'>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
        Any        = typing.Any
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        DisposableBase = <class 'reactivex.abc.disposable.DisposableBase'>
        Field      = <function Field at 0xff11a05072e0>
        In         = <class 'dimos.core.stream.In'>
        Literal    = typing.Literal
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        TypeAlias  = typing.TypeAlias
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/episode_monitor.cpython-312.pyc'
        __doc__    = 'Single point of operator-input → EpisodeStatus translation.\n\nWatches Quest buttons and accepts RPC commands, runs t...t stream into session.db; DataPrep reads only\nthe recorded EpisodeStatus events offline — never raw operator input.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10abf03a10>
        __name__   = 'dimos.imitation.collection.episode_monitor'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.episode_monitor', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10abf03a10>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        field_validator = <function field_validator at 0xff11a060ff60>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '.../usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10abfc2630>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10abfc2630>, origin='.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[keyboard-teleop-openyam-planner]
Stack Traces | 0.003s 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:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam-planner'
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'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e23350>
        __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 0xff6872e23350>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        coordinator = <function coordinator at 0xff6884392980>
        joint_trajectory_task = <function joint_trajectory_task at 0xff6912f12de0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff68ecd46660>
        openyam_hardware = <function openyam_hardware at 0xff68ecd465c0>
        planner    = <function planner at 0xff6884392a20>
        teleop_ik_task = <function teleop_ik_task at 0xff68843928e0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e23560>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e23560>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e23cb0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e23cb0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e54560>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e54560>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[learning-collect-quest-piper]
Stack Traces | 0.003s run time
blueprint_name = 'learning-collect-quest-piper'

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

blueprint_name = 'learning-collect-quest-piper'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'learning-collect-quest-piper'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'learning_collect_quest_piper'
        module_path = 'dimos.imitation.collection.blueprint'
        name       = 'learning-collect-quest-piper'
.../imitation/collection/blueprint.py:30: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        RECORDINGS_DIR = PosixPath('.../dimos/dimos/recordings')
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/blueprint.cpython-312.pyc'
        __doc__    = 'Recording blueprints.\n\n`CollectionRecorder` (a memory Recorder) captures the obs/action/status\nstreams to a SQLite session DB during the run and flushes it durably on\nshutdown. DataPrep reads that DB afterwards.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/blueprint.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e55a90>
        __name__   = 'dimos.imitation.collection.blueprint'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.blueprint', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e55a90>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/blueprint.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        datetime   = <class 'datetime.datetime'>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
        Any        = typing.Any
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        DisposableBase = <class 'reactivex.abc.disposable.DisposableBase'>
        Field      = <function Field at 0xff696380b2e0>
        In         = <class 'dimos.core.stream.In'>
        Literal    = typing.Literal
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        TypeAlias  = typing.TypeAlias
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/episode_monitor.cpython-312.pyc'
        __doc__    = 'Single point of operator-input → EpisodeStatus translation.\n\nWatches Quest buttons and accepts RPC commands, runs t...t stream into session.db; DataPrep reads only\nthe recorded EpisodeStatus events offline — never raw operator input.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e55850>
        __name__   = 'dimos.imitation.collection.episode_monitor'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.episode_monitor', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e55850>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        field_validator = <function field_validator at 0xff6963917f60>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '.../usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e55be0>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e55be0>, origin='.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[teleop-quest-a1z]
Stack Traces | 0.003s run time
blueprint_name = 'teleop-quest-a1z'

    @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 = 'teleop-quest-a1z'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'teleop-quest-a1z'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_a1z'
        module_path = 'dimos.teleop.quest.blueprints'
        name       = 'teleop-quest-a1z'
.../teleop/quest/blueprints.py:36: in <module>
    from dimos.teleop.quest.quest_extensions import (
        DEFAULT_CAPACITY_COLOR_IMAGE = 6224896
        GO2Connection = <class 'dimos.robot.unitree.go2.connection.GO2Connection'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/blueprints.cpython-312.pyc'
        __doc__    = 'Teleop blueprints for testing and deployment.\n\nSingle sim/real blueprints — pass `--simulation` to run inside MuJoCo, omit for real\nhardware. The underlying coordinator blueprints branch on `global_config.simulation`.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/blueprints.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff687315b9b0>
        __name__   = 'dimos.teleop.quest.blueprints'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.blueprints', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff687315b9b0>, origin='.../work/dimos/dimos/.../teleop/quest/blueprints.py')
        autoconnect = <function autoconnect at 0xff6951ce3600>
        coordinator_teleop_a1z = Blueprint(blueprints=(BlueprintAtom(kwargs={'instance_name': 'ControlCoordinator', 'hardware': [HardwareComponent(hard...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_teleop_dual = <[FileNotFoundError("Test file 'piper_description' not found at .../dimos/data/.lfs/piper_descript...e the file is committed to Git LFS in the tests/data directory.") raised in repr()] Blueprint object at 0xff6875b27530>
        coordinator_teleop_piper = <[FileNotFoundError("Test file 'piper_description' not found at .../dimos/data/.lfs/piper_descript...e the file is committed to Git LFS in the tests/data directory.") raised in repr()] Blueprint object at 0xff6875b2ab40>
        coordinator_teleop_xarm6 = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_teleop_xarm7 = Blueprint(blueprints=(BlueprintAtom(kwargs={'instance_name': 'ControlCoordinator', 'hardware': [HardwareComponent(hard...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff687315bb90>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff687315bb90>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff687315b5c0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff687315b5c0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731bc950>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff68731bc950>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[unitree-g1-teleop]
Stack Traces | 0.003s run time
blueprint_name = 'unitree-g1-teleop'

    @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 = 'unitree-g1-teleop'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'unitree-g1-teleop'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'unitree_g1_teleop'
        module_path = 'dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop'
        name       = 'unitree-g1-teleop'
.../blueprints/basic/unitree_g1_teleop.py:57: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        DEFAULT_CAPACITY_COLOR_IMAGE = 6224896
        In         = <class 'dimos.core.stream.In'>
        STATE_DIR  = PosixPath('.../tmp/dimos-test-state-gw2-5ey7xxgd/dimos')
        __builtins__ = <builtins>
        __cached__ = '.../basic/__pycache__/unitree_g1_teleop.cpython-312.pyc'
        __doc__    = 'Unitree G1 GR00T WBC + Quest teleop + manipulation + recording.\n\nThe GR00T locomotion/control core (without navigat...o --scene-package office run unitree-g1-teleop\n    dimos run unitree-g1-teleop                      # real hardware\n'
        __file__   = '/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_g1_teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873401a00>
        __name__   = 'dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop'
        __package__ = 'dimos.robot.unitree.g1.blueprints.basic'
        __spec__   = ModuleSpec(name='dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop', loader=<_frozen_importlib_external.Source...t 0xff6873401a00>, origin='/home/runner/work/dimos/dimos/.../blueprints/basic/unitree_g1_teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        datetime   = <class 'datetime.datetime'>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
        pSHMTransport = <class 'dimos.core.transport.pSHMTransport'>
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
        Any        = typing.Any
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        DisposableBase = <class 'reactivex.abc.disposable.DisposableBase'>
        Field      = <function Field at 0xff696380b2e0>
        In         = <class 'dimos.core.stream.In'>
        Literal    = typing.Literal
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        TypeAlias  = typing.TypeAlias
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/episode_monitor.cpython-312.pyc'
        __doc__    = 'Single point of operator-input → EpisodeStatus translation.\n\nWatches Quest buttons and accepts RPC commands, runs t...t stream into session.db; DataPrep reads only\nthe recorded EpisodeStatus events offline — never raw operator input.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873401a30>
        __name__   = 'dimos.imitation.collection.episode_monitor'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.episode_monitor', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873401a30>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        field_validator = <function field_validator at 0xff6963917f60>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '.../usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff696d5851c0>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff696d5851c0>, origin='.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openyam-planner]
Stack Traces | 0.004s 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'
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'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b0150d70>
        __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 0xff10b0150d70>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        coordinator = <function coordinator at 0xff10b2ba2e80>
        joint_trajectory_task = <function joint_trajectory_task at 0xff114fbf8ea0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff1129a565c0>
        openyam_hardware = <function openyam_hardware at 0xff1129a56520>
        planner    = <function planner at 0xff10b2ba2f20>
        teleop_ik_task = <function teleop_ik_task at 0xff10b2ba2de0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b0150f80>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b0150f80>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01516a0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01516a0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b0152150>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b0152150>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[keyboard-teleop-openyam]
Stack Traces | 0.004s 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'
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'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b016a180>
        __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 0xff10b016a180>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        coordinator = <function coordinator at 0xff10b2ba2e80>
        joint_trajectory_task = <function joint_trajectory_task at 0xff114fbf8ea0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff1129a565c0>
        openyam_hardware = <function openyam_hardware at 0xff1129a56520>
        planner    = <function planner at 0xff10b2ba2f20>
        teleop_ik_task = <function teleop_ik_task at 0xff10b2ba2de0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01691f0>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01691f0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01696d0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01696d0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b016b320>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b016b320>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[learning-collect-quest-piper]
Stack Traces | 0.004s run time
blueprint_name = 'learning-collect-quest-piper'

    @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 = 'learning-collect-quest-piper'

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 = 'learning-collect-quest-piper'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'learning_collect_quest_piper'
        module_path = 'dimos.imitation.collection.blueprint'
        name       = 'learning-collect-quest-piper'
.../imitation/collection/blueprint.py:30: in <module>
    from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        RECORDINGS_DIR = PosixPath('.../dimos/dimos/recordings')
        RealSenseCamera = <class 'dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera'>
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/blueprint.cpython-312.pyc'
        __doc__    = 'Recording blueprints.\n\n`CollectionRecorder` (a memory Recorder) captures the obs/action/status\nstreams to a SQLite session DB during the run and flushes it durably on\nshutdown. DataPrep reads that DB afterwards.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/blueprint.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b00ddbe0>
        __name__   = 'dimos.imitation.collection.blueprint'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.blueprint', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b00ddbe0>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/blueprint.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        datetime   = <class 'datetime.datetime'>
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, unitree_aes_128_key=None, xarm7_ip=None, xarm6_ip=None, can_port=None, dev...load_retries=2, dimos_upload_chunk_mb=None, dimos_upload_quiet_s=30.0, dimos_http_timeout=60.0, dimos_staging_dir=None)
.../imitation/collection/episode_monitor.py:36: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import (
        Any        = typing.Any
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        DisposableBase = <class 'reactivex.abc.disposable.DisposableBase'>
        Field      = <function Field at 0xff11a05072e0>
        In         = <class 'dimos.core.stream.In'>
        Literal    = typing.Literal
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        TypeAlias  = typing.TypeAlias
        __annotations__ = {}
        __builtins__ = <builtins>
        __cached__ = '.../collection/__pycache__/episode_monitor.cpython-312.pyc'
        __doc__    = 'Single point of operator-input → EpisodeStatus translation.\n\nWatches Quest buttons and accepts RPC commands, runs t...t stream into session.db; DataPrep reads only\nthe recorded EpisodeStatus events offline — never raw operator input.\n'
        __file__   = '/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b00dde20>
        __name__   = 'dimos.imitation.collection.episode_monitor'
        __package__ = 'dimos.imitation.collection'
        __spec__   = ModuleSpec(name='dimos.imitation.collection.episode_monitor', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b00dde20>, origin='/home/runner/work/dimos/dimos/.../imitation/collection/episode_monitor.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        field_validator = <function field_validator at 0xff11a060ff60>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '.../usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b00de330>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b00de330>, origin='.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-openarm]
Stack Traces | 0.004s 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)

blueprint_name = 'teleop-quest-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 = 'teleop-quest-openarm'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_openarm'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.teleop'
        name       = 'teleop-quest-openarm'
.../openarm/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ControlCoordinatorConfig = <class 'dimos.control.coordinator.ControlCoordinatorConfig'>
        JOINT_TRAJECTORY_TASK_NAME = 'joint_trajectory'
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_ARM_JOINTS = ['openarm_left_joint1', 'openarm_left_joint2', 'openarm_left_joint3', 'openarm_left_joint4', 'openarm_left_joint5', 'openarm_left_joint6', ...]
        OPENARM_GRIPPER_JOINTS = ['left_arm/gripper', 'right_arm/gripper']
        OPENARM_JOINTS = ['openarm_left_joint1', 'openarm_left_joint2', 'openarm_left_joint3', 'openarm_left_joint4', 'openarm_left_joint5', 'openarm_left_joint6', ...]
        OpenArmPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openarm.teleop_ik.OpenArmPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenArm Quest teleop blueprint.'
        __file__   = '.../work/dimos/dimos/.../openarm/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01ec500>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints.teleop'
        __package__ = 'dimos.robot.manipulators.openarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff10b01ec500>, origin='.../work/dimos/dimos/.../openarm/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        openarm_bimanual_model_config = <function openarm_bimanual_model_config at 0xff1129a48ae0>
        openarm_hardware = <function openarm_hardware at 0xff1129a48c20>
        replace    = <function replace at 0xff11a99dac00>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01ec770>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01ec770>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01ecfb0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01ecfb0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01ee180>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01ee180>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-openyam]
Stack Traces | 0.004s run time
blueprint_name = 'teleop-quest-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 = 'teleop-quest-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 = 'teleop-quest-openyam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'teleop-quest-openyam'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01d81a0>
        __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 0xff10b01d81a0>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff118e9ff600>
        coordinator = <function coordinator at 0xff10b2ba2e80>
        joint_trajectory_task = <function joint_trajectory_task at 0xff114fbf8ea0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff1129a565c0>
        openyam_hardware = <function openyam_hardware at 0xff1129a56520>
        planner    = <function planner at 0xff10b2ba2f20>
        teleop_ik_task = <function teleop_ik_task at 0xff10b2ba2de0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01d8440>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01d8440>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01d8b90>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01d8b90>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01d9760>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01d9760>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[keyboard-teleop-openyam]
Stack Traces | 0.004s 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:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'keyboard-teleop-openyam'
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'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e20470>
        __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 0xff6872e20470>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        coordinator = <function coordinator at 0xff6884392980>
        joint_trajectory_task = <function joint_trajectory_task at 0xff6912f12de0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff68ecd46660>
        openyam_hardware = <function openyam_hardware at 0xff68ecd465c0>
        planner    = <function planner at 0xff6884392a20>
        teleop_ik_task = <function teleop_ik_task at 0xff68843928e0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e206e0>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e206e0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e20cb0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e20cb0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6872e21670>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6872e21670>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[teleop-quest-dual-openyam]
Stack Traces | 0.004s run time
blueprint_name = 'teleop-quest-dual-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 = 'teleop-quest-dual-openyam'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'teleop-quest-dual-openyam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_dual_openyam'
        module_path = 'dimos.robot.manipulators.dual_openyam.blueprints.teleop'
        name       = 'teleop-quest-dual-openyam'
.../dual_openyam/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        DUAL_OPENYAM_ARM_JOINTS = ['left_joint1', 'left_joint2', 'left_joint3', 'left_joint4', 'left_joint5', 'left_joint6', ...]
        DUAL_OPENYAM_GRIPPER_JOINTS = ['left_arm/gripper', 'right_arm/gripper']
        DualOpenYamCoordinator = <class 'dimos.robot.manipulators.dual_openyam.blueprints.basic.DualOpenYamCoordinator'>
        DualOpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.dual_openyam.teleop_ik.DualOpenYamPinkPoseTargetSolver'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'Coupled Quest teleoperation for the complete Dual OpenYAM entity.'
        __file__   = '.../work/dimos/dimos/.../dual_openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731bef30>
        __name__   = 'dimos.robot.manipulators.dual_openyam.blueprints.teleop'
        __package__ = 'dimos.robot.manipulators.dual_openyam.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.dual_openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFi... at 0xff68731bef30>, origin='.../work/dimos/dimos/.../dual_openyam/blueprints/teleop.py')
        autoconnect = <function autoconnect at 0xff6951ce3600>
        dual_openyam_hardware = <function dual_openyam_hardware at 0xff68ecd46700>
        dual_openyam_model_config = <function dual_openyam_model_config at 0xff68ecd46980>
        dual_openyam_trajectory_task = <function dual_openyam_trajectory_task at 0xff6873f23100>
        teleop_ik_task = <function teleop_ik_task at 0xff68843928e0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731becf0>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff68731becf0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731bdc70>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff68731bdc70>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731bff20>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff68731bff20>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[teleop-quest-openarm]
Stack Traces | 0.004s run time
blueprint_name = 'teleop-quest-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 = 'teleop-quest-openarm'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'teleop-quest-openarm'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_openarm'
        module_path = 'dimos.robot.manipulators.openarm.blueprints.teleop'
        name       = 'teleop-quest-openarm'
.../openarm/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ControlCoordinatorConfig = <class 'dimos.control.coordinator.ControlCoordinatorConfig'>
        JOINT_TRAJECTORY_TASK_NAME = 'joint_trajectory'
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENARM_ARM_JOINTS = ['openarm_left_joint1', 'openarm_left_joint2', 'openarm_left_joint3', 'openarm_left_joint4', 'openarm_left_joint5', 'openarm_left_joint6', ...]
        OPENARM_GRIPPER_JOINTS = ['left_arm/gripper', 'right_arm/gripper']
        OPENARM_JOINTS = ['openarm_left_joint1', 'openarm_left_joint2', 'openarm_left_joint3', 'openarm_left_joint4', 'openarm_left_joint5', 'openarm_left_joint6', ...]
        OpenArmPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openarm.teleop_ik.OpenArmPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenArm Quest teleop blueprint.'
        __file__   = '.../work/dimos/dimos/.../openarm/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873125220>
        __name__   = 'dimos.robot.manipulators.openarm.blueprints.teleop'
        __package__ = 'dimos.robot.manipulators.openarm.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.openarm.blueprints.teleop', loader=<_frozen_importlib_external.SourceFileLoa...bject at 0xff6873125220>, origin='.../work/dimos/dimos/.../openarm/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        openarm_bimanual_model_config = <function openarm_bimanual_model_config at 0xff68ecdeca40>
        openarm_hardware = <function openarm_hardware at 0xff68ecdecb80>
        replace    = <function replace at 0xff696ccfec00>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff68731254f0>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff68731254f0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873125dc0>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873125dc0>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873126930>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873126930>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[teleop-quest-openyam]
Stack Traces | 0.004s run time
blueprint_name = 'teleop-quest-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 = 'teleop-quest-openyam'

dimos/robot/test_all_blueprints.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:83: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'teleop-quest-openyam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_openyam'
        module_path = 'dimos.robot.manipulators.openyam.blueprints.teleop'
        name       = 'teleop-quest-openyam'
.../openyam/blueprints/teleop.py:44: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        ArmTwistCoordinator = <class 'dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator'>
        EEF_TWIST_TASK_NAME = 'eef_twist_arm'
        KeyboardTeleopModule = <class 'dimos.teleop.keyboard.keyboard_teleop_module.KeyboardTeleopModule'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        OPENYAM_ARM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6']
        OPENYAM_GRIPPER_JOINT = 'arm/gripper'
        OPENYAM_HARDWARE_ID = 'openyam'
        OPENYAM_JOINTS = ['yam_joint1', 'yam_joint2', 'yam_joint3', 'yam_joint4', 'yam_joint5', 'yam_joint6', ...]
        OpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.openyam.teleop_ik.OpenYamPinkPoseTargetSolver'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        TeleopControlCoordinator = <class 'dimos.control.teleop_coordinator.TeleopControlCoordinator'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'OpenYAM keyboard and Quest teleop blueprints.'
        __file__   = '.../work/dimos/dimos/.../openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873244680>
        __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 0xff6873244680>, origin='.../work/dimos/dimos/.../openyam/blueprints/teleop.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0xff6951ce3600>
        coordinator = <function coordinator at 0xff6884392980>
        joint_trajectory_task = <function joint_trajectory_task at 0xff6912f12de0>
        make_openyam_model_config = <function make_openyam_model_config at 0xff68ecd46660>
        openyam_hardware = <function openyam_hardware at 0xff68ecd465c0>
        planner    = <function planner at 0xff6884392a20>
        teleop_ik_task = <function teleop_ik_task at 0xff68843928e0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873244830>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873244830>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff6962f7fba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff696380b2e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873244f20>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873244f20>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff696ccfe660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff6962f7fba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff6873245940>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff6873245940>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff696d43e8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_blueprint_kwargs::test_blueprint_atom_kwargs_match_module_config[teleop-quest-dual-openyam]
Stack Traces | 0.005s 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)

blueprint_name = 'teleop-quest-dual-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 = 'teleop-quest-dual-openyam'
dimos/robot/get_all_blueprints.py:51: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'teleop_quest_dual_openyam'
        module_path = 'dimos.robot.manipulators.dual_openyam.blueprints.teleop'
        name       = 'teleop-quest-dual-openyam'
.../dual_openyam/blueprints/teleop.py:35: in <module>
    from dimos.teleop.quest.quest_extensions import ArmTeleopModule
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        DUAL_OPENYAM_ARM_JOINTS = ['left_joint1', 'left_joint2', 'left_joint3', 'left_joint4', 'left_joint5', 'left_joint6', ...]
        DUAL_OPENYAM_GRIPPER_JOINTS = ['left_arm/gripper', 'right_arm/gripper']
        DualOpenYamCoordinator = <class 'dimos.robot.manipulators.dual_openyam.blueprints.basic.DualOpenYamCoordinator'>
        DualOpenYamPinkPoseTargetSolver = <class 'dimos.robot.manipulators.dual_openyam.teleop_ik.DualOpenYamPinkPoseTargetSolver'>
        ManipulationModule = <class 'dimos.manipulation.manipulation_module.ManipulationModule'>
        PinkKinematicsConfig = <class 'dimos.manipulation.planning.kinematics.config.PinkKinematicsConfig'>
        TaskConfig = <class 'dimos.control.coordinator.TaskConfig'>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/teleop.cpython-312.pyc'
        __doc__    = 'Coupled Quest teleoperation for the complete Dual OpenYAM entity.'
        __file__   = '.../work/dimos/dimos/.../dual_openyam/blueprints/teleop.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01fa300>
        __name__   = 'dimos.robot.manipulators.dual_openyam.blueprints.teleop'
        __package__ = 'dimos.robot.manipulators.dual_openyam.blueprints'
        __spec__   = ModuleSpec(name='dimos.robot.manipulators.dual_openyam.blueprints.teleop', loader=<_frozen_importlib_external.SourceFi... at 0xff10b01fa300>, origin='.../work/dimos/dimos/.../dual_openyam/blueprints/teleop.py')
        autoconnect = <function autoconnect at 0xff118e9ff600>
        dual_openyam_hardware = <function dual_openyam_hardware at 0xff1129a56660>
        dual_openyam_model_config = <function dual_openyam_model_config at 0xff1129a568e0>
        dual_openyam_trajectory_task = <function dual_openyam_trajectory_task at 0xff10b09c7560>
        teleop_ik_task = <function teleop_ik_task at 0xff10b2ba2de0>
.../teleop/quest/quest_extensions.py:38: in <module>
    from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule
        Any        = typing.Any
        Float32    = <class 'dimos.msgs.std_msgs.Float32.Float32'>
        Image      = <class 'dimos.msgs.sensor_msgs.Image.Image'>
        In         = <class 'dimos.core.stream.In'>
        Out        = <class 'dimos.core.stream.Out'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        Twist      = <class 'dimos.msgs.geometry_msgs.Twist.Twist'>
        TwistStamped = <class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>
        Vector3    = <class 'dimos.msgs.geometry_msgs.Vector3.Vector3'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        __builtins__ = <builtins>
        __cached__ = '.../quest/__pycache__/quest_extensions.cpython-312.pyc'
        __doc__    = 'Quest teleop module extensions and subclasses.\n\nAvailable subclasses:\n    - ArmTeleopModule: Raw arm poses with mi...rames pushed to the Quest over /ws\n    - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_extensions.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01f9100>
        __name__   = 'dimos.teleop.quest.quest_extensions'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_extensions', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01f9100>, origin='.../work/dimos/dimos/.../teleop/quest/quest_extensions.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        rpc        = <function rpc at 0xff119fc7bba0>
.../teleop/quest/quest_teleop_module.py:46: in <module>
    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
        Any        = typing.Any
        DIMOS_PROJECT_ROOT = PosixPath('.../work/dimos/dimos')
        Disposable = <class 'reactivex.disposable.disposable.Disposable'>
        Field      = <function Field at 0xff11a05072e0>
        HTMLResponse = <class 'starlette.responses.HTMLResponse'>
        In         = <class 'dimos.core.stream.In'>
        LCMJoy     = <class 'dimos_lcm.sensor_msgs.Joy.Joy'>
        LCMPoseStamped = <class 'dimos_lcm.geometry_msgs.PoseStamped.PoseStamped'>
        Module     = <class 'dimos.core.module.Module'>
        ModuleConfig = <class 'dimos.core.module.ModuleConfig'>
        Out        = <class 'dimos.core.stream.Out'>
        Path       = <class 'pathlib.Path'>
        PoseStamped = <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>
        StaticFiles = <class 'starlette.staticfiles.StaticFiles'>
        TypeVar    = <class 'typing.TypeVar'>
        WebSocket  = <class 'starlette.websockets.WebSocket'>
        WebSocketDisconnect = <class 'starlette.websockets.WebSocketDisconnect'>
        __builtins__ = <builtins>
        __cached__ = '.../work/dimos/dimos/dimos/teleop/quest/__pycache__/quest_teleop_module.cpython-312.pyc'
        __doc__    = '\nQuest Teleoperation Module.\n\nReceives VR controller tracking data from the Quest web app via an embedded\nFastAPI WebSocket server.  Transforms from WebXR to robot frame, computes\ndeltas, and publishes PoseStamped commands.\n'
        __file__   = '.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01f8e90>
        __name__   = 'dimos.teleop.quest.quest_teleop_module'
        __package__ = 'dimos.teleop.quest'
        __spec__   = ModuleSpec(name='dimos.teleop.quest.quest_teleop_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01f8e90>, origin='.../work/dimos/dimos/.../teleop/quest/quest_teleop_module.py')
        asyncio    = <module 'asyncio' from '............/usr/lib/python3.12/asyncio/__init__.py'>
        dataclass  = <function dataclass at 0xff11a99da660>
        json       = <module 'json' from '............/usr/lib/python3.12/json/__init__.py'>
        math       = <module 'math' (built-in)>
        rpc        = <function rpc at 0xff119fc7bba0>
        threading  = <module 'threading' from '............/usr/lib/python3.12/threading.py'>
        time       = <module 'time' (built-in)>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    # 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.
    
    from __future__ import annotations
    
    from typing import ClassVar, Literal, TypeAlias, cast
    
>   from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E   ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'

ClassVar   = typing.ClassVar
Literal    = typing.Literal
TypeAlias  = typing.TypeAlias
__annotations__ = {}
__builtins__ = <builtins>
__cached__ = '.../work/dimos/dimos/dimos/msgs/imitation_msgs/__pycache__/EpisodeStatus.cpython-312.pyc'
__doc__    = None
__file__   = '.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff10b01f8380>
__name__   = 'dimos.msgs.imitation_msgs.EpisodeStatus'
__package__ = 'dimos.msgs.imitation_msgs'
__spec__   = ModuleSpec(name='dimos.msgs.imitation_msgs.EpisodeStatus', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff10b01f8380>, origin='.../work/dimos/dimos/.../msgs/imitation_msgs/EpisodeStatus.py')
annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
cast       = <function cast at 0xff11aa11a8e0>

.../msgs/imitation_msgs/EpisodeStatus.py:19: ModuleNotFoundError
dimos.codebase_checks.test_docs_branding::test_docs_use_current_branding
Stack Traces | 0.014s run time
def test_docs_use_current_branding() -> None:
        """Fail if any file under docs/ spells the brand "DimOS" instead of "dimOS"."""
        hits = find_old_branding()
        if hits:
            listing = "\n".join(
                f"  - {p.relative_to(DIMOS_PROJECT_ROOT)}:{lineno}: {line.strip()}"
                for p, lineno, line in hits
            )
>           raise AssertionError(f'Found "DimOS" in docs/:\n{listing}\n\nThe brand is spelled "dimOS".')
E           AssertionError: Found "DimOS" in docs/:
E             - .../capabilities/manipulation/imitation-learning.md:3: DimOS separates demonstration collection from policy rollout. A collection
E             - .../capabilities/manipulation/imitation-learning.md:20: | `dual-openyam-quest` | Left and right wrist RGB | DimOS dual 14-D |
E             - .../capabilities/manipulation/imitation-learning.md:137: `PolicyIOProfile` maps backend feature keys directly to typed DimOS image or
E           
E           The brand is spelled "dimOS".

hits       = [(PosixPath('/home/runner/work/dimos/dimos/.../capabilities/manipulation/imitation-learning.md'), 3, 'DimOS separates...pulation/imitation-learning.md'), 137, '`PolicyIOProfile` maps backend feature keys directly to typed DimOS image or')]
listing    = '  - .../capabilities/manipulation/imitation-learning.md:3: DimOS separates demonstration collection from policy roll...s/manipulation/imitation-learning.md:137: `PolicyIOProfile` maps backend feature keys directly to typed DimOS image or'

dimos/codebase_checks/test_docs_branding.py:43: AssertionError
dimos.codebase_checks.test_no_init_files::test_no_init_files
Stack Traces | 0.024s run time
def test_no_init_files():
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        init_files = sorted(dimos_dir.rglob("__init__.py"))
        # The root dimos/__init__.py is allowed for the porcelain lazy import.
        init_files = [f for f in init_files if f != dimos_dir / "__init__.py"]
        if init_files:
            listing = "\n".join(f"  - {f.relative_to(dimos_dir)}" for f in init_files)
>           raise AssertionError(
                f"Found __init__.py files in dimos/:\n{listing}\n\n"
                "__init__.py files are not allowed because they lead to unnecessary "
                "extraneous imports. Everything should be imported straight from the "
                "source module."
            )
E           AssertionError: Found __init__.py files in dimos/:
E             - .../python/abc_minimal/__init__.py
E             - .../python/dimos_abc/__init__.py
E           
E           __init__.py files are not allowed because they lead to unnecessary extraneous imports. Everything should be imported straight from the source module.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
init_files = [PosixPath('.../dimos/dimos/dimos/.../python/abc_minimal/__init__.py'), PosixPath('.../dimos/dimos/dimos/.../python/dimos_abc/__init__.py')]
listing    = '  - .../python/abc_minimal/__init__.py\n  - .../python/dimos_abc/__init__.py'

dimos/codebase_checks/test_no_init_files.py:25: AssertionError
dimos.cli.test_cli_startup::test_help_startup_time
Stack Traces | 1.89s run time
def test_help_startup_time() -> None:
        """`dimos --help` must finish in under {HELP_TIMEOUT_SECONDS}s."""
        start = time.monotonic()
        result = subprocess.run(
            [sys.executable, "-m", "dimos.cli.dimos", "--help"],
            capture_output=True,
            text=True,
            timeout=HELP_TIMEOUT_SECONDS + 5,  # hard kill safety margin
        )
        elapsed = time.monotonic() - start
>       assert result.returncode == 0, f"dimos --help failed:\n{result.stderr}"
E       AssertionError: dimos --help failed:
E         Traceback (most recent call last):
E           File "<frozen runpy>", line 198, in _run_module_as_main
E           File "<frozen runpy>", line 88, in _run_code
E           File ".../dimos/cli/dimos.py", line 59, in <module>
E             from dimos.cli.commands.imitation import imitation_app
E           File ".../cli/commands/imitation.py", line 47, in <module>
E             from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
E           File ".../msgs/imitation_msgs/EpisodeStatus.py", line 19, in <module>
E             from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E         ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
E         
E       assert 1 == 0
E        +  where 1 = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-m', 'dimos.cli.dimos', '--help'], returncode=1, stdout='', stderr='Traceback (most recent call last):\n  File "<frozen runpy>", line 198, in _run_module_as_main\n  File "<frozen runpy>", line 88, in _run_code\n  File ".../dimos/cli/dimos.py", line 59, in <module>\n    from dimos.cli.commands.imitation import imitation_app\n  File ".../cli/commands/imitation.py", line 47, in <module>\n    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus\n  File ".../msgs/imitation_msgs/EpisodeStatus.py", line 19, in <module>\n    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus\nModuleNotFoundError: No module named \'dimos_lcm.imitation_msgs\'\n').returncode

elapsed    = 1.8830011240000317
result     = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-m', 'dimos.cli.dimos', '--help'], returncod...on_msgs import EpisodeStatus as LCMEpisodeStatus\nModuleNotFoundError: No module named \'dimos_lcm.imitation_msgs\'\n')
start      = 312.504038096

dimos/cli/test_cli_startup.py:74: AssertionError
dimos.cli.test_cli_startup::test_cli_import_does_not_pull_ipython
Stack Traces | 1.96s run time
def test_cli_import_does_not_pull_ipython() -> None:
        """Importing the CLI must not drag in IPython (~1700 modules, ~1.3s)."""
        result = subprocess.run(
            [
                sys.executable,
                "-c",
                "import sys; import dimos.cli.dimos; assert 'IPython' not in sys.modules",
            ],
            capture_output=True,
            text=True,
            timeout=30,
        )
>       assert result.returncode == 0, f"IPython leaked into CLI import:\n{result.stderr}"
E       AssertionError: IPython leaked into CLI import:
E         Traceback (most recent call last):
E           File "<string>", line 1, in <module>
E           File ".../dimos/cli/dimos.py", line 59, in <module>
E             from dimos.cli.commands.imitation import imitation_app
E           File ".../cli/commands/imitation.py", line 47, in <module>
E             from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
E           File ".../msgs/imitation_msgs/EpisodeStatus.py", line 19, in <module>
E             from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E         ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
E         
E       assert 1 == 0
E        +  where 1 = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-c', "import sys; import dimos.cli.dimos; assert 'IPython' not in sys.modules"], returncode=1, stdout='', stderr='Traceback (most recent call last):\n  File "<string>", line 1, in <module>\n  File ".../dimos/cli/dimos.py", line 59, in <module>\n    from dimos.cli.commands.imitation import imitation_app\n  File ".../cli/commands/imitation.py", line 47, in <module>\n    from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus\n  File ".../msgs/imitation_msgs/EpisodeStatus.py", line 19, in <module>\n    from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus\nModuleNotFoundError: No module named \'dimos_lcm.imitation_msgs\'\n').returncode

result     = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-c', "import sys; import dimos.cli.dimos; as...on_msgs import EpisodeStatus as LCMEpisodeStatus\nModuleNotFoundError: No module named \'dimos_lcm.imitation_msgs\'\n')

dimos/cli/test_cli_startup.py:61: AssertionError
dimos.core.test_daemon_zenoh::test_daemon_serves_coordinator_ping_over_zenoh
Stack Traces | 3.94s run time
tmp_path = PosixPath('.../pytest-0/popen-gw2/test_daemon_serves_coordinator0')

    def test_daemon_serves_coordinator_ping_over_zenoh(tmp_path: Path) -> None:
        env = os.environ | {
            "DIMOS_TRANSPORT": "zenoh",
            # Never touch the developer's real registry/config, even without xdist.
            "XDG_STATE_HOME": str(tmp_path / "state"),
            "XDG_CONFIG_HOME": str(tmp_path / "config"),
        }
        # File, not pipe: the daemon's forkserver inherits the CLI's stdout/stderr
        # and holds them open forever, so a pipe would block subprocess.run.
        run_log = tmp_path / "run.log"
        try:
            with run_log.open("w") as log:
                run = subprocess.run(
                    [
                        sys.executable,
                        "-m",
                        "dimos.cli.dimos",
                        "run",
                        "demo-mcp-stress-test",
                        "--daemon",
                        "--disable",
                        "mcp-server",
                        "--viewer",
                        "none",
                        "--n-workers",
                        "1",
                    ],
                    env=env,
                    stdin=subprocess.DEVNULL,
                    stdout=log,
                    stderr=log,
                    timeout=120,
                )
>           assert run.returncode == 0, f"dimos run --daemon failed:\n{run_log.read_text()}"
E           AssertionError: dimos run --daemon failed:
E             Traceback (most recent call last):
E               File "<frozen runpy>", line 198, in _run_module_as_main
E               File "<frozen runpy>", line 88, in _run_code
E               File ".../dimos/cli/dimos.py", line 59, in <module>
E                 from dimos.cli.commands.imitation import imitation_app
E               File ".../cli/commands/imitation.py", line 47, in <module>
E                 from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
E               File ".../msgs/imitation_msgs/EpisodeStatus.py", line 19, in <module>
E                 from dimos_lcm.imitation_msgs import EpisodeStatus as LCMEpisodeStatus
E             ModuleNotFoundError: No module named 'dimos_lcm.imitation_msgs'
E             
E           assert 1 == 0
E            +  where 1 = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-m', 'dimos.cli.dimos', 'run', 'demo-mcp-stress-test', '--daemon', '--disable', 'mcp-server', '--viewer', 'none', '--n-workers', '1'], returncode=1).returncode

env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': 'bc251adc-7ce4-43af-bf76-ff83a7a8591e.tests.ubuntu-24_04-arm_3_14_fal', ...}
log        = <_io.TextIOWrapper name='.../pytest-0/popen-gw2/test_daemon_serves_coordinator0/run.log' mode='w' encoding='UTF-8'>
run        = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', '-m', 'dimos.cli.dimos', 'run', 'demo-mcp-stress-test', '--daemon', '--disable', 'mcp-server', '--viewer', 'none', '--n-workers', '1'], returncode=1)
run_log    = PosixPath('.../pytest-0/popen-gw2/test_daemon_serves_coordinator0/run.log')
tmp_path   = PosixPath('.../pytest-0/popen-gw2/test_daemon_serves_coordinator0')

dimos/core/test_daemon_zenoh.py:96: AssertionError
dimos.codebase_checks.test_no_underscore_assign::test_no_underscore_assignment
Stack Traces | 8.14s run time
def test_no_underscore_assignment():
        """Fail if any file assigns to a bare `_`."""
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        hits = find_underscore_assignments()
        if hits:
            listing = "\n".join(f"  - {p.relative_to(dimos_dir)}:{lineno}" for p, lineno in hits)
>           raise AssertionError(
                f"Found assignment(s) to `_` in dimos/:\n{listing}\n\n"
                "Assigning to `_` is not allowed: it hides an unused variable instead "
                "of removing it. Delete the variable. If you only need the "
                "expression's side effect, evaluate it directly with a call "
                "(`obj.method()`, `getattr(obj, 'attr')`) or log it; a bare attribute "
                "access needs `# noqa: B018`. Tuple unpacking (`a, _ = f()`) is fine "
                "and not flagged by this rule."
            )
E           AssertionError: Found assignment(s) to `_` in dimos/:
E             - .../python/abc_minimal/fast_inference.py:110
E           
E           Assigning to `_` is not allowed: it hides an unused variable instead of removing it. Delete the variable. If you only need the expression's side effect, evaluate it directly with a call (`obj.method()`, `getattr(obj, 'attr')`) or log it; a bare attribute access needs `# noqa: B018`. Tuple unpacking (`a, _ = f()`) is fine and not flagged by this rule.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
hits       = [(PosixPath('.../dimos/dimos/dimos/.../python/abc_minimal/fast_inference.py'), 110)]
listing    = '  - .../python/abc_minimal/fast_inference.py:110'

dimos/codebase_checks/test_no_underscore_assign.py:55: AssertionError
dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E::test_coordinator_cancel_trajectory
Stack Traces | 30.1s run time
self = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4a10>
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce345430>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292ef20>

    def test_coordinator_cancel_trajectory(self, lcm_spy, start_blueprint) -> None:
        """Test that a running trajectory can be cancelled."""
        lcm_spy.save_topic("/coordinator_joint_state#sensor_msgs.JointState")
    
        # Start coordinator
        start_blueprint("coordinator-mock")
>       lcm_spy.wait_for_saved_topic("/coordinator_joint_state#sensor_msgs.JointState")

lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce345430>
self       = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4a10>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292ef20>

dimos/e2e_tests/test_control_coordinator.py:160: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:97: in wait_for_saved_topic
    wait_until(
        condition  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292d300>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce345430>
        timeout    = 30.0
        topic      = '/coordinator_joint_state#sensor_msgs.JointState'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292d300>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState

deadline   = 413.737675752
interval   = 0.1
message    = 'Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState'
predicate  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292d300>
timeout    = 30.0

.../utils/testing/waiting.py:35: TimeoutError
dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E::test_coordinator_starts_and_responds_to_rpc
Stack Traces | 30.1s run time
self = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4290>
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce71c4d0>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292d4e0>

    def test_coordinator_starts_and_responds_to_rpc(self, lcm_spy, start_blueprint) -> None:
        """Test that coordinator starts and responds to RPC queries."""
        # Save topics we care about (LCM topics include type suffix)
        joint_state_topic = "/coordinator_joint_state#sensor_msgs.JointState"
        lcm_spy.save_topic(joint_state_topic)
        lcm_spy.save_topic(".../ControlCoordinator/list_joints/res")
        lcm_spy.save_topic(".../ControlCoordinator/list_tasks/res")
    
        # Start the mock coordinator blueprint
        start_blueprint("coordinator-mock")
    
        # Wait for joint state to be published (proves tick loop is running)
>       lcm_spy.wait_for_saved_topic(joint_state_topic)

joint_state_topic = '/coordinator_joint_state#sensor_msgs.JointState'
lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce71c4d0>
self       = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4290>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292d4e0>

dimos/e2e_tests/test_control_coordinator.py:51: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:97: in wait_for_saved_topic
    wait_until(
        condition  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292ede0>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce71c4d0>
        timeout    = 30.0
        topic      = '/coordinator_joint_state#sensor_msgs.JointState'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292ede0>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState

deadline   = 323.263227269
interval   = 0.1
message    = 'Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState'
predicate  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292ede0>
timeout    = 30.0

.../utils/testing/waiting.py:35: TimeoutError
dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E::test_coordinator_executes_trajectory
Stack Traces | 30.1s run time
self = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f41d0>
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce277710>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292e020>
wait_until = <function wait_until at 0xff5ca9203920>

    def test_coordinator_executes_trajectory(self, lcm_spy, start_blueprint, wait_until) -> None:
        """Test that coordinator executes a trajectory via RPC."""
        # Save topics
        lcm_spy.save_topic("/coordinator_joint_state#sensor_msgs.JointState")
    
        # Start coordinator
        start_blueprint("coordinator-mock")
    
        # Wait for it to be ready
>       lcm_spy.wait_for_saved_topic("/coordinator_joint_state#sensor_msgs.JointState")

lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce277710>
self       = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f41d0>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292e020>
wait_until = <function wait_until at 0xff5ca9203920>

dimos/e2e_tests/test_control_coordinator.py:83: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:97: in wait_for_saved_topic
    wait_until(
        condition  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292f1a0>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce277710>
        timeout    = 30.0
        topic      = '/coordinator_joint_state#sensor_msgs.JointState'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292f1a0>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState

deadline   = 353.407293352
interval   = 0.1
message    = 'Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState'
predicate  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292f1a0>
timeout    = 30.0

.../utils/testing/waiting.py:35: TimeoutError
dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E::test_dual_arm_coordinator
Stack Traces | 30.1s run time
self = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4ce0>
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5c411f1970>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292cf40>
wait_until = <function wait_until at 0xff5ca9203920>

    def test_dual_arm_coordinator(self, lcm_spy, start_blueprint, wait_until) -> None:
        """Test dual-arm coordinator moving both arms with one combined trajectory."""
        lcm_spy.save_topic("/coordinator_joint_state#sensor_msgs.JointState")
    
        # Start dual-arm mock coordinator
        start_blueprint("coordinator-dual-mock")
>       lcm_spy.wait_for_saved_topic("/coordinator_joint_state#sensor_msgs.JointState")

lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5c411f1970>
self       = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4ce0>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292cf40>
wait_until = <function wait_until at 0xff5ca9203920>

dimos/e2e_tests/test_control_coordinator.py:203: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:97: in wait_for_saved_topic
    wait_until(
        condition  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292e340>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5c411f1970>
        timeout    = 30.0
        topic      = '/coordinator_joint_state#sensor_msgs.JointState'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292e340>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState

deadline   = 443.880153911
interval   = 0.1
message    = 'Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState'
predicate  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292e340>
timeout    = 30.0

.../utils/testing/waiting.py:35: TimeoutError
dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E::test_coordinator_joint_state_published
Stack Traces | 30.1s run time
self = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4740>
lcm_spy = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce96e5a0>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292ee80>

    def test_coordinator_joint_state_published(self, lcm_spy, start_blueprint) -> None:
        """Test that joint state messages are published at expected rate."""
        joint_state_topic = "/coordinator_joint_state#sensor_msgs.JointState"
        lcm_spy.save_topic(joint_state_topic)
    
        # Start coordinator
        start_blueprint("coordinator-mock")
    
        # Wait for initial message
>       lcm_spy.wait_for_saved_topic(joint_state_topic)

joint_state_topic = '/coordinator_joint_state#sensor_msgs.JointState'
lcm_spy    = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce96e5a0>
self       = <dimos.e2e_tests.test_control_coordinator.TestControlCoordinatorE2E object at 0xff5c577f4740>
start_blueprint = <function start_blueprint.<locals>.set_name_and_start at 0xff5c4292ee80>

dimos/e2e_tests/test_control_coordinator.py:133: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/e2e_tests/lcm_spy.py:97: in wait_for_saved_topic
    wait_until(
        condition  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292de40>
        self       = <dimos.e2e_tests.lcm_spy.LcmSpy object at 0xff5bce96e5a0>
        timeout    = 30.0
        topic      = '/coordinator_joint_state#sensor_msgs.JointState'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

predicate = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292de40>

    def wait_until(
        predicate: Callable[[], bool],
        *,
        timeout: float,
        interval: float = 0.1,
        message: str | None = None,
    ) -> None:
        """Poll ``predicate`` until it returns truthy or ``timeout`` elapses."""
        deadline = time.monotonic() + timeout
        while time.monotonic() < deadline:
            if predicate():
                return
            time.sleep(interval)
>       raise TimeoutError(message or f"Timed out after {timeout}s waiting for condition")
E       TimeoutError: Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState

deadline   = 383.567474832
interval   = 0.1
message    = 'Timeout waiting for topic /coordinator_joint_state#sensor_msgs.JointState'
predicate  = <function LcmSpy.wait_for_saved_topic.<locals>.condition at 0xff5c4292de40>
timeout    = 30.0

.../utils/testing/waiting.py:35: TimeoutError

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

Generate concrete recorder and rollout ports from typed policy I/O profiles while preserving Blueprint autoconnect.

Move LeRobot onto a shared safety runtime and add Dual OpenYAM two-camera collection plus three-camera Amazon ABC-DiT rollout in an isolated locked environment.

Tests: 147 affected host tests; 11 isolated LeRobot tests; 3 isolated ABC tests; strict mypy; pre-commit; blueprint registry; wheel and sdist builds.
@TomCC7
TomCC7 force-pushed the cc/feat/flexible-policy-module branch from 40001bb to fd57995 Compare September 8, 2026 23:55
@TomCC7 TomCC7 changed the title feat(imitation): add profile-driven policy backends feat(imitation): add profile-driven dual-arm collection Sep 9, 2026
)
from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus
from dimos.porcelain.dimos import Dimos
from dimos.robot.manipulators.openyam.collection import OPENYAM_QUEST_COLLECTION

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

specific config appearing in general cli command file is a scope pollution, meaning that some design is wrong in implementation

raise ValueError(f"unknown imitation {kind} {name!r}; choose one of: {choices}") from exc


def get_collection_workflow(name: str) -> CollectionWorkflow:

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

what is this weird helper function what is _get why is this needed...

help="Repeat for every profile camera as STREAM=DEVICE",
),
left_can_port: str | None = typer.Option(None, "--left-can-port"),
right_can_port: str | None = typer.Option(None, "--right-can-port"),

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

then these connection profile are also kind of static assumption.... I guess it's generally kind of hard to define a clean enough cli interface but it's worth thinking definitely

coordinator_joint_state: In[JointState]
applied_joint_position_command: In[JointState]
status: In[EpisodeStatus]
def collection_recorder(

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

wtf how is this even python code.... why would the class factory be this awkward...

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

can we make the implementation cleaner

quality: QualityConfig = QualityConfig()

@model_validator(mode="after")
def validate_features(self) -> CollectionProfile:

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

why not put these validation logic in field validator

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

bad naming for a helper function

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