# v1.0 Release Notes

**Date:** 2026-03-03

## Highlights

This release introduces a unified robot assembly API, modular arm + gripper MJCF models, simulation support, and a cleaner SDK surface for downstream consumers.

## Unified Robot Assembly

- **`get_yam_robot()` now supports all arm variants** via the new `arm_type` parameter (`yam`, `yam_pro`, `yam_ultra`, `big_yam`). The separate `get_big_yam_robot()` function has been removed.
- **New `ArmType` enum** in `i2rt.robots.utils` for selecting arm variants.
- **Motor wrap-around correction**: the assembly routine now reads initial motor positions and applies ±2π offsets automatically, preventing jump discontinuities on startup.

## Modular Arm + Gripper Models

- **Arm and gripper MJCF files are now separate** under `robot_models/arm/` and `robot_models/gripper/`. At runtime, `combine_arm_and_gripper_xml()` merges the arm and gripper XMLs by replacing the `link_6` subtree and combining assets.
- **End-effector mass/inertia overrides**: pass `ee_mass` and `ee_inertia` to `get_yam_robot()` to customise the link_6 inertial properties without editing XML files.
- Removed legacy monolithic model directories (`robot_models/yam/`, `robot_models/big_yam/`, `robot_models/arx_r5/`).

## Simulation Support

- **`get_yam_robot(sim=True)`** returns a `SimRobot` backed by MuJoCo — no CAN hardware required. Useful for testing policies and control loops offline.

## Gripper Changes

- **Default gripper type** changed from `crank_4310` to `linear_4310`.
- **Explicit calibration opt-in**: gripper auto-detection is now controlled by the `enable_gripper_calibration` flag instead of being inferred from the gripper type. `crank_4310` no longer triggers calibration by default.
- Gripper limit detection tuned: `position_stable_count` threshold reduced from 6 to 3 for faster calibration. The `close_offset` parameter has been removed.

## Motor Driver Cleanup

- Removed `max_step_time` tracking from the control loop.
- Linear rail imports in `flow_base_controller.py` are now lazy to avoid import errors when the linear rail hardware module is not present.

## SDK & API

- `joint_state_saver_factory` signature changed from `Callable[[str], Any]` to `Callable[[], Any]`.
- `_last_gripper_command_qpos` initialises to `1` (fully open) instead of `None`.
- `start_recording()` / `stop_recording()` methods are still available on `MotorChainRobot` (moved to bottom of class, no behaviour change).
- Base `Robot` class now includes default no-op `reinit()` and `close()` methods.
- `GripperType.from_string_name()` and the new `ArmType.from_string_name()` use direct enum construction for cleaner error messages.

## Dependencies

- `mink` bumped from `0.0.11` to `>=0.0.13`.
- `pydantic` / `pydantic-core` removed from core dependencies.
- `viser>=0.2.0` added.
- `pytest-xdist` added to dev dependencies.
- `mujoco` is now a required import in `minimum_gello.py` (no longer optional).

## Removed

- `get_big_yam_robot()` — use `get_yam_robot(arm_type=ArmType.BIG_YAM)` instead.
- `robot_models/yam/`, `robot_models/big_yam/`, `robot_models/arx_r5/` directories.
- `doc/set_persist_id_socket_can.md` and `doc/yam_handle_readme.md` — content moved to online docs.
- `dm_driver_single_motor_example.py` and `motor_chain_example.py` — use `examples/` directory instead.
- `mujoco_visualizer.py` — functionality covered by existing visualiser utilities.
- `GripperType.get_gripper_default_test_torque()` — replaced by `test_torque` parameter on `MotorChainRobot`.
