Skip to content

Contributing

A contribution is an implementation of exactly one contract, and nothing that is a second copy of something lerobot, MuJoCo or Isaac already owns.

What goes in

kind shape
a robot drivers/<family>/protocol.py (pure functions over bytes) + driver.py (the Driver) + one registry row + a twin where the family has one + one acceptance smoke
a policy provider one module implementing Policy, one row in policies.json, its frame declared
a sim backend one module implementing SimEngine
a skill one function in app/skills.py over the contract, runs on every robot whose driver declares the verbs

What stays out

Planners with no shared contract, in-process copies of models lerobot serves, a second dataset writer, a second quaternion helper, a second noise model, a transport with no customer path, tests that mock the backend they claim to test.

The checks

python3 scripts/check_layers.py            # 0 violations
python3 scripts/check_imports_cheap.py     # bare import stays cheap
ruff check strands_robots && ruff format --check strands_robots
mypy --strict strands_robots
bash acceptance/all.sh                     # GREEN with the real count
mkdocs build --strict

Rules every file obeys: typed in, typed out; refusals name the bad value, the cause and the remedy; wire formats are ported verbatim; docstrings state the contract in twelve lines or fewer; ASCII only; from __future__ import annotations; every GitHub Action SHA-pinned. Anything a user imports is announced one minor ahead before it disappears, with its replacement named.