Skip to content

feat: add isolated LeRobot policy module - #3479

Closed
TomCC7 wants to merge 30 commits into
cc/feat/external-python-native-modulefrom
cc/feat/lerobot-native-module
Closed

feat: add isolated LeRobot policy module#3479
TomCC7 wants to merge 30 commits into
cc/feat/external-python-native-modulefrom
cc/feat/lerobot-native-module

Conversation

@TomCC7

@TomCC7 TomCC7 commented Aug 15, 2026

Copy link
Copy Markdown
Member

Contribution path

Problem

LeRobot 0.6 requires a Transformers 5 and NumPy <2.3 environment that conflicts with the main DimOS perception and development dependency set. DimOS still needs a live policy module that can consume camera and joint-state observations without installing those packages into the main environment.

Solution

  • Add an RPC-only LeRobotPolicyModule host contract backed by the Python-native runtime from feat: add isolated Python module runtime #3478.
  • Put LeRobot, Transformers, Torch, runtime tests, and their lockfile in a sibling Python 3.12 project.
  • Preserve lazy checkpoint loading, observation validation, ordered joint targets, concurrency control, status, and clean shutdown from feat: LeRobot rollout on openyam #3315.
  • Exclude Python-native implementation trees and their virtualenvs from host blueprint discovery and mypy.
  • Add a hardware-independent example that launches the real isolated subprocess and calls policy_status over RPC.

The root DimOS dependency lists and root uv.lock are unchanged.

How to Test

CI=1 uv run pytest dimos/robot/test_all_blueprints_generation.py dimos/experimental/robot_policy/lerobot/test_module.py -q

cd dimos/experimental/robot_policy/lerobot/python
uv sync --locked --group tests
uv run --locked --group tests pytest -q
uv run --locked --group tests mypy
cd -

uv run python examples/native-modules/python_lerobot.py
uv run --group lint mypy

Validated locally: 7 host/registry tests and 12 isolated runtime tests passed; root and isolated mypy passed; changed-file pre-commit hooks passed; the real subprocess/RPC smoke example exited successfully.

AI assistance

OpenAI Codex with GPT-5 implemented and validated the change under direct user guidance. The user selected the module structure, RPC-only interface, dependency isolation strategy, and stacked-PR workflow.

Checklist

  • I have read and approved the CLA.

TomCC7 and others added 30 commits June 4, 2026 13:41
@TomCC7 TomCC7 changed the title cc/feat/lerobot native module feat: add isolated LeRobot policy module Aug 15, 2026
@codecov

codecov Bot commented Aug 15, 2026

Copy link
Copy Markdown

❌ 4 Tests Failed:

Tests completed Failed Passed Skipped
3806 4 3802 175
View the top 3 failed test(s) by shortest run time
dimos.codebase_checks.test_no_init_files::test_no_init_files
Stack Traces | 0.021s 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/dimos_lerobot/__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/dimos_lerobot/__init__.py')]
listing    = '  - .../python/dimos_lerobot/__init__.py'

dimos/codebase_checks/test_no_init_files.py:25: AssertionError
dimos.core.test_python_native_end_to_end::test_python_native_rpc_refs_and_restart
Stack Traces | 3.26s run time
+ Exception Group Traceback (most recent call last):
  |   File ".../dimos/dimos/.venv/lib/python3.12........./site-packages/_pytest/runner.py", line 341, in from_call
  |     result: TResult | None = func()
  |                              ^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12........./site-packages/_pytest/runner.py", line 242, in <lambda>
  |     lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/pluggy/_hooks.py", line 512, in __call__
  |     return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/pluggy/_manager.py", line 120, in _hookexec
  |     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 167, in _multicall
  |     raise exception
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
  |     yield from thread_exception_runtest_hook()
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
  |     yield
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
  |     yield from unraisable_exception_runtest_hook()
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
  |     yield
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
  |     yield from self._runtest_for(item, "call")
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/logging.py", line 829, in _runtest_for
  |     yield
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
  |     return result.get_result()
  |            ^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12............/site-packages/pluggy/_result.py", line 103, in get_result
  |     raise exc.with_traceback(tb)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
  |     res = yield
  |           ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.../site-packages/_pytest/capture.py", line 898, in pytest_runtest_call
  |     return (yield)
  |             ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
  |     return result.get_result()
  |            ^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12............/site-packages/pluggy/_result.py", line 103, in get_result
  |     raise exc.with_traceback(tb)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
  |     res = yield
  |           ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
  |     return result.get_result()
  |            ^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12............/site-packages/pluggy/_result.py", line 103, in get_result
  |     raise exc.with_traceback(tb)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
  |     res = yield
  |           ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.../site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
  |     return (yield)
  |             ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 121, in _multicall
  |     res = hook_impl.function(*args)
  |           ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12........./site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
  |     item.runtest()
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/python.py", line 1627, in runtest
  |     self.ihook.pytest_pyfunc_call(pyfuncitem=self)
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/pluggy/_hooks.py", line 512, in __call__
  |     return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/pluggy/_manager.py", line 120, in _hookexec
  |     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 167, in _multicall
  |     raise exception
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 139, in _multicall
  |     teardown.throw(exception)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper
  |     return result.get_result()
  |            ^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12............/site-packages/pluggy/_result.py", line 103, in get_result
  |     raise exc.with_traceback(tb)
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper
  |     res = yield
  |           ^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12.............................................................../site-packages/pluggy/_callers.py", line 121, in _multicall
  |     res = hook_impl.function(*args)
  |           ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/dimos/.venv/lib/python3.12....../site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
  |     result = testfunction(**testargs)
  |              ^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../dimos/core/test_python_native_end_to_end.py", line 59, in test_python_native_rpc_refs_and_restart
  |     coordinator = ModuleCoordinator.build(
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^
  |   File ".../core/coordination/module_coordinator.py", line 367, in build
  |     coordinator.build_all_modules()
  |   File ".../core/coordination/module_coordinator.py", line 247, in build_all_modules
  |     safe_thread_map(modules, lambda m: m.build())
  |   File ".../dimos/utils/safe_thread_map.py", line 84, in safe_thread_map
  |     raise ExceptionGroup("safe_thread_map failed", errors)
  | ExceptionGroup: safe_thread_map failed (1 sub-exception)
  +-+---------------- 1 ----------------
    | dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Python-native environment preparation failed (exit 1): Using CPython 3.12.3 interpreter at: ........./usr/bin/python3
    | Creating virtual environment at: .venv
    | Resolved 182 packages in 1.08s
    | error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
    |        provided.
    | 
    | hint: To update the lockfile, run `uv lock`.
    | 
    | Remote traceback:
    | Traceback (most recent call last):
    |   File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
    |     response = f(*args[0], **args[1])
    |                ^^^^^^^^^^^^^^^^^^^^^^
    |   File ".../protocol/rpc/spec.py", line 116, in override_f
    |     return getattr(module, fname)(*args, **kwargs)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File ".../dimos/core/python_native_module.py", line 247, in build
    |     self._run_prepare()
    |   File ".../dimos/core/python_native_module.py", line 163, in _run_prepare
    |     raise RuntimeError(
    | RuntimeError: Python-native environment preparation failed (exit 1): Using CPython 3.12.3 interpreter at: ........./usr/bin/python3
    | Creating virtual environment at: .venv
    | Resolved 182 packages in 1.08s
    | error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
    |        provided.
    | 
    | hint: To update the lockfile, run `uv lock`.
    | 
    | 
    | The above exception was the direct cause of the following exception:
    | 
    | Traceback (most recent call last):
    |   File ".../dimos/utils/safe_thread_map.py", line 68, in safe_thread_map
    |     outcomes[idx] = fut.result()
    |                     ^^^^^^^^^^^^
    |   File "........./usr/lib/python3.12....../concurrent/futures/_base.py", line 449, in result
    |     return self.__get_result()
    |            ^^^^^^^^^^^^^^^^^^^
    |   File "........./usr/lib/python3.12....../concurrent/futures/_base.py", line 401, in __get_result
    |     raise self._exception
    |   File "........./usr/lib/python3.12.../concurrent/futures/thread.py", line 58, in run
    |     result = self.fn(*self.args, **self.kwargs)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File ".../core/coordination/module_coordinator.py", line 247, in <lambda>
    |     safe_thread_map(modules, lambda m: m.build())
    |                                        ^^^^^^^^^
    |   File ".../dimos/core/rpc_client.py", line 93, in __call__
    |     result, unsub_fn = self._rpc.call_sync(
    |                        ^^^^^^^^^^^^^^^^^^^^
    |   File ".../protocol/rpc/spec.py", line 88, in call_sync
    |     raise result
    | RuntimeError: Python-native environment preparation failed (exit 1): Using CPython 3.12.3 interpreter at: ........./usr/bin/python3
    | Creating virtual environment at: .venv
    | Resolved 182 packages in 1.08s
    | error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
    |        provided.
    | 
    | hint: To update the lockfile, run `uv lock`.
    +------------------------------------
dimos.core.test_python_native_end_to_end::test_example_script_exits_after_printing_results
Stack Traces | 5.21s run time
def test_example_script_exits_after_printing_results() -> None:
        repository = Path(__file__).parents[2]
    
        result = subprocess.run(
            [sys.executable, "examples/external_python_module/run.py"],
            cwd=repository,
            capture_output=True,
            text=True,
            timeout=30,
        )
    
>       assert result.returncode == 0, result.stderr
E       AssertionError:   + Exception Group Traceback (most recent call last):
E           |   File ".../examples/external_python_module/run.py", line 38, in <module>
E           |     run_example()
E           |   File ".../examples/external_python_module/run.py", line 22, in run_example
E           |     coordinator = ModuleCoordinator.build(
E           |                   ^^^^^^^^^^^^^^^^^^^^^^^^
E           |   File ".../core/coordination/module_coordinator.py", line 367, in build
E           |     coordinator.build_all_modules()
E           |   File ".../core/coordination/module_coordinator.py", line 247, in build_all_modules
E           |     safe_thread_map(modules, lambda m: m.build())
E           |   File ".../dimos/utils/safe_thread_map.py", line 84, in safe_thread_map
E           |     raise ExceptionGroup("safe_thread_map failed", errors)
E           | ExceptionGroup: safe_thread_map failed (1 sub-exception)
E           +-+---------------- 1 ----------------
E             | dimos.protocol.rpc.rpc_utils.RemoteError: [Remote builtins.RuntimeError] Python-native environment preparation failed (exit 1): Resolved 182 packages in 76ms
E         error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
E                provided.
E         
E         hint: To update the lockfile, run `uv lock`.
E         
E         Remote traceback:
E         Traceback (most recent call last):
E           File ".../protocol/rpc/pubsubrpc.py", line 280, in execute_and_respond
E             response = f(*args[0], **args[1])
E                        ^^^^^^^^^^^^^^^^^^^^^^
E           File ".../protocol/rpc/spec.py", line 116, in override_f
E             return getattr(module, fname)(*args, **kwargs)
E                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           File ".../dimos/core/python_native_module.py", line 247, in build
E             self._run_prepare()
E           File ".../dimos/core/python_native_module.py", line 163, in _run_prepare
E             raise RuntimeError(
E         RuntimeError: Python-native environment preparation failed (exit 1): Resolved 182 packages in 76ms
E         error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
E                provided.
E         
E         hint: To update the lockfile, run `uv lock`.
E         
E             | 
E             | The above exception was the direct cause of the following exception:
E             | 
E             | Traceback (most recent call last):
E             |   File ".../dimos/utils/safe_thread_map.py", line 68, in safe_thread_map
E             |     outcomes[idx] = fut.result()
E             |                     ^^^^^^^^^^^^
E             |   File ".............../usr/lib/python3.12........./concurrent/futures/_base.py", line 449, in result
E             |     return self.__get_result()
E             |            ^^^^^^^^^^^^^^^^^^^
E             |   File ".............../usr/lib/python3.12........./concurrent/futures/_base.py", line 401, in __get_result
E             |     raise self._exception
E             |   File ".............../usr/lib/python3.12....../concurrent/futures/thread.py", line 58, in run
E             |     result = self.fn(*self.args, **self.kwargs)
E             |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E             |   File ".../core/coordination/module_coordinator.py", line 247, in <lambda>
E             |     safe_thread_map(modules, lambda m: m.build())
E             |                                        ^^^^^^^^^
E             |   File ".../dimos/core/rpc_client.py", line 93, in __call__
E             |     result, unsub_fn = self._rpc.call_sync(
E             |                        ^^^^^^^^^^^^^^^^^^^^
E             |   File ".../protocol/rpc/spec.py", line 88, in call_sync
E             |     raise result
E             | RuntimeError: Python-native environment preparation failed (exit 1): Resolved 182 packages in 76ms
E         error: The lockfile at `uv.lock` needs to be updated, but `--locked` was
E                provided.
E         
E         hint: To update the lockfile, run `uv lock`.
E             +------------------------------------
E         
E       assert 1 == 0
E        +  where 1 = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', 'examples/external_python_module/run.py'], returncode=1, stdout='04:24:59.706 [inf][dination/module_coordinator.py] Building the blueprint\n04:24:59.708 [inf][ce/system_configurator/base.py] Pytest run detected: skipping system configuration.\n04:24:59.708 [inf][dination/module_coordinator.py] Starting the modules\n04:25:01.110 [inf][ation/worker_manager_python.py] Worker pool started. n_workers=2\n04:25:02.888 [inf][/coordination/python_worker.py] Deployed module. module=Offset module_id=1 worker_id=1\n04:25:02.897 [inf][/coordination/python_worker.py] Deployed module. module=ExampleExternal module_id=0 worker_id=0\n04:25:02.956 [inf][dination/module_coordinator.py] Transport module=exampleexternal name=value original_name=value topic=/value#std_msgs.Int32 transport=LCMTransport type=dimos.msgs.std_msgs.Int32.Int32\n04:25:02.958 [inf][dination/module_coordinator.py] Transport module=exampleexternal name=doubled original_name=doubled topic=/doubled#std_msgs.Int32 transport=LCMTransport type=dimos.msgs.std_msgs.Int32.Int32\n04:25:03.167 [err][.../protocol/rpc/pubsubrpc.py] Exception in RPC handler for Exampl..._result()\n    |            ^^^^^^^^^^^^^^^^^^^\n    |   File ".............../usr/lib/python3.12........./concurrent/futures/_base.py", line 401, in __get_result\n    |     raise self._exception\n    |   File ".............../usr/lib/python3.12....../concurrent/futures/thread.py", line 58, in run\n    |     result = self.fn(*self.args, **self.kwargs)\n    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n    |   File ".../core/coordination/module_coordinator.py", line 247, in <lambda>\n    |     safe_thread_map(modules, lambda m: m.build())\n    |                                        ^^^^^^^^^\n    |   File ".../dimos/core/rpc_client.py", line 93, in __call__\n    |     result, unsub_fn = self._rpc.call_sync(\n    |                        ^^^^^^^^^^^^^^^^^^^^\n    |   File ".../protocol/rpc/spec.py", line 88, in call_sync\n    |     raise result\n    | RuntimeError: Python-native environment preparation failed (exit 1): Resolved 182 packages in 76ms\nerror: The lockfile at `uv.lock` needs to be updated, but `--locked` was\n       provided.\n\nhint: To update the lockfile, run `uv lock`.\n    +------------------------------------\n').returncode

repository = PosixPath('.../work/dimos/dimos')
result     = CompletedProcess(args=['.../dimos/dimos/.venv/bin/python', 'examples/external_python_module/run.py'], re...d` was\n       provided.\n\nhint: To update the lockfile, run `uv lock`.\n    +------------------------------------\n')

dimos/core/test_python_native_end_to_end.py:98: AssertionError
dimos.codebase_checks.test_no_underscore_assign::test_no_underscore_assignment
Stack Traces | 7.27s 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             - core/test_python_native_module.py:39
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/core/test_python_native_module.py'), 39)]
listing    = '  - core/test_python_native_module.py:39'

dimos/codebase_checks/test_no_underscore_assign.py:55: AssertionError

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

@TomCC7
TomCC7 force-pushed the cc/feat/external-python-native-module branch from 7b1680e to e9c8f9b Compare August 18, 2026 00:07
@TomCC7 TomCC7 mentioned this pull request Aug 18, 2026
1 task
@TomCC7

TomCC7 commented Aug 18, 2026

Copy link
Copy Markdown
Member Author

Superseded by #3315, which now carries the isolated LeRobot implementation directly above #3478 in stack #3498. The adapted implementation uses IsolatedPythonModule, keeps LeRobot dependencies in the sibling runtime project, and has passed the host, isolated-runtime, mypy, pre-commit, and subprocess smoke checks.

@TomCC7 TomCC7 closed this Aug 18, 2026
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