This file is the execution backlog for the full CUDA-to-MLX port of IsaacLab on Apple Silicon.
It is intentionally written as a task source, not as a loose idea list. The goal is to keep shipping work on main
without pausing for replanning after every small success.
- Always take the next unblocked task from the
Execution Ordersection. - Every merged task must update:
- this file
/Users/ilessio/.codex/skills/port-to-mlx/references/progress_log.md
- Every compatibility task needs at least one of:
- import-safety test
- install smoke
- benchmark smoke
- replay/train smoke
- “Done” means:
- code landed on
main - validation ran
- follow-on tasks updated
- code landed on
DONE: landed and validatedACTIVE: current execution focusREADY: unblocked and next in lineBLOCKED: depends on earlier tasksLATER: intentionally deferred until the earlier substrate exists
MLX-IMPORT-001throughMLX-IMPORT-008MLX-PKG-001throughMLX-PKG-004MLX-SIM-001throughMLX-SIM-010MLX-TASK-001throughMLX-TASK-012MLX-KERNEL-001throughMLX-KERNEL-008MLX-SENSOR-001throughMLX-SENSOR-006MLX-RL-001throughMLX-RL-006MLX-CI-001throughMLX-CI-006MLX-ROS-001throughMLX-ROS-003
DONERuntime backend seam fortorch-cuda|mlxDONESim backend seam forisaacsim|mac-simDONEKernel backend seam forwarp|metal|cpuDONEAppLauncher mac-sim bootstrap modeDONEMLX/mac-sim slices for cartpole, cart-double-pendulum, quadcopterDONEFocused backend tests and benchmark harnessDONEBase package extras formacos-mlx,cuda-isaacsim, anddevDONERL package base install no longer forces framework extrasDONEisaaclab_rl.sb3andisaaclab_rl.skrlimport-safe on MLX/mac pathDONERmpFlowControllerCfgsplit from the heavy controller implementationDONELightweight Nucleus constant module split from the heavy assets helperDONEisaaclab.simconfig surfaces for schemas, converters, and file spawners import onmlx + mac-simDONEisaaclab.envs.mdp.actionsconfig surfaces import onmlx + mac-simwithout runtime action modulesDONEmacOS install/import smoke now writes retained JSON artifacts and benchmark results in CI
- Status:
DONE - Title: Split controller config dataclasses away from heavy Isaac Sim runtime modules
- Validation:
- focused backend tests
- fresh import smoke
- Status:
DONE - Title: Split Nucleus constants away from
isaaclab.utils.assets - Validation:
- focused backend tests
- fresh import smoke
- Status:
DONE - Title: Audit
isaaclab.simpublic config/helper imports and isolate config-safe surfaces - Scope:
isaaclab.sim.__init__isaaclab.sim.schemasisaaclab.sim.spawners.*_cfgisaaclab.sim.utilsmodules that should be config-safe
- Acceptance:
- config-only imports do not pull
carb,omni,isaacsim, orpxrunless explicitly upstream-only - tests prove the new import-safe path
- config-only imports do not pull
- Validation:
- focused backend suite
- torch-free local install/import smoke
- local benchmark smoke JSON output
- Status:
DONE - Depends on:
MLX-IMPORT-003 - Title: Audit
isaaclab.envs.mdp.actionsconfig surfaces for config-only imports that still pull runtime-heavy modules - Acceptance:
- action config modules import on
mlx + mac-sim - unsupported runtime paths fail when instantiated, not when imported
- action config modules import on
- Validation:
- focused backend suite
- torch-free local install/import smoke
- Status:
READY - Depends on:
MLX-IMPORT-003 - Title: Audit
isaaclab.markersconfig surfaces for any remaining heavy imports - Acceptance:
- config modules use lightweight constants/helpers where possible
- Status:
READY - Depends on:
MLX-IMPORT-003 - Title: Audit
isaaclab.devices.openxrretargeter config/helpers for constant-only imports - Acceptance:
- config constants come from lightweight modules
- heavy runtime helpers stay lazy
- Status:
DONE - Depends on:
MLX-IMPORT-003 - Title: Add explicit import-safety test matrix for public bootstrap modules
- Acceptance:
- test covers
isaaclab,isaaclab.sim,isaaclab.controllers,isaaclab_rl - runs without Isaac Sim installed
- test covers
- Validation:
source/isaaclab/test/backends/test_runtime.pysource/isaaclab_rl/test/test_import_safety.py- torch-free local install/import smoke
- Status:
READY - Depends on:
MLX-IMPORT-007 - Title: Publish a definitive “import-safe on mac” module surface
- Acceptance:
- documented in README
- kept in sync with tests
- Status:
ACTIVE - Depends on:
MLX-IMPORT-007 - Title: Replace
isaaclab_taskseager recursive package registration with a lazy task registry - Scope:
source/isaaclab_tasks/isaaclab_tasks/__init__.pysource/isaaclab_tasks/isaaclab_tasks/utils/importer.py
- Acceptance:
import isaaclab_tasksdoes not recursively import every task package on the MLX/mac path- task/config entry points resolve lazily from strings or a registry manifest
- Status:
READY - Depends on:
MLX-IMPORT-009 - Title: Split direct-task CUDA/IsaacSim clusters from task package import surfaces
- Scope:
- AutoMate
- Factory
- FORGE
- first manager-based manipulation config clusters that import
carborisaacsimat module load
- Acceptance:
- task packages expose config/registration surfaces without importing
warp,carb,pxr, orisaacsim - runtime-only backends load on demand behind capability checks
- task packages expose config/registration surfaces without importing
- Status:
DONE - Title: Core package extras split for MLX vs CUDA users
- Status:
DONE - Title: RL package extras split so framework deps are optional
- Status:
READY - Title: Add clear support matrix for package extras and runtime combinations
- Acceptance:
- README section listing supported install combos
- one install smoke per documented combo
- Status:
READY - Depends on:
MLX-PKG-003 - Title: Add fresh-env install smoke for documented public paths in CI
- Acceptance:
- MLX base install smoke
- MLX + RL base install smoke
- upstream CUDA path remains unaffected
- Status:
READY - Title: Extract shared articulated joint-state container from cartpole/cart-double-pendulum
- Acceptance:
- no duplicated joint state reset/write logic across those envs
- Status:
READY - Depends on:
MLX-SIM-001 - Title: Extract shared root-state container from quadcopter path
- Acceptance:
- root pose/velocity read/write helpers centralized
- Status:
READY - Depends on:
MLX-SIM-001,MLX-SIM-002 - Title: Create reusable mac-sim batched state primitives module
- Acceptance:
- cartpole/cart-double-pendulum/quadcopter use the shared substrate
- Status:
READY - Depends on:
MLX-SIM-003 - Title: Add reusable environment origin/grid manager
- Status:
READY - Depends on:
MLX-SIM-003 - Title: Add terrain representation for the first locomotion task
- Status:
BLOCKED - Depends on:
MLX-SIM-005 - Title: Add contact approximation model sufficient for first locomotion bring-up
- Status:
BLOCKED - Depends on:
MLX-SIM-006 - Title: Add contact-oriented reward/termination utilities
- Status:
READY - Depends on:
MLX-SIM-003 - Title: Centralize reset sampling helpers and determinism controls
- Status:
READY - Depends on:
MLX-SIM-003 - Title: Add capability reporting from concrete mac-sim adapters into benchmarks and diagnostics
- Status:
READY - Depends on:
MLX-SIM-003 - Title: Add shared replay/rollout helpers for mac-native tasks
- Status:
DONE - Title: Port cartpole
- Status:
DONE - Title: Port cart-double-pendulum
- Status:
DONE - Title: Port quadcopter
- Status:
BLOCKED - Depends on:
MLX-SIM-005,MLX-SIM-006,MLX-SIM-007 - Title: Port first quadruped locomotion task
- Suggested target:
- pick the simplest existing velocity locomotion task with minimal sensor coupling
- Status:
BLOCKED - Depends on:
MLX-TASK-004 - Title: Add quadruped replay smoke and benchmark
- Status:
BLOCKED - Depends on:
MLX-TASK-004 - Title: Add quadruped training smoke on MLX
- Status:
LATER - Depends on:
MLX-TASK-004 - Title: Port first humanoid locomotion task
- Status:
LATER - Depends on:
MLX-SIM-003 - Title: Port first manipulation reach task
- Status:
LATER - Depends on:
MLX-TASK-008 - Title: Port first manipulation lift task
- Status:
LATER - Depends on:
MLX-SENSOR-001 - Title: Port first raycast-driven task
- Status:
READY - Title: Keep all current task slices benchmarked on every major substrate change
- Status:
READY - Title: Keep checkpoint/replay contracts stable across all mac-native tasks
- Status:
READY - Title: Inventory first real Warp/custom CUDA kernels needed by planned locomotion target
- Status:
READY - Depends on:
MLX-KERNEL-001 - Title: Implement MLX-op replacements for non-hot helper kernels
- Status:
BLOCKED - Depends on:
MLX-KERNEL-001 - Title: Implement Metal-backed replacements for locomotion hot loops
- Status:
READY - Depends on:
MLX-KERNEL-001 - Title: Add per-kernel parity tests against upstream outputs where feasible
- Status:
READY - Title: Add benchmark reporting that detects accidental CPU fallback
- Status:
LATER - Title: Inventory raycast kernels for future sensor port
- Status:
LATER - Title: Inventory camera/tiled-camera reshape kernels
- Status:
LATER - Title: Create a shared kernel-compat layer instead of scattered replacements
- Status:
LATER - Title: Implement
mac-sensorsraycast substrate
- Status:
LATER - Depends on:
MLX-SENSOR-001 - Title: Add raycast parity tests and benchmark
- Status:
LATER - Title: Define minimal depth output contract for task-usable cameras
- Status:
LATER - Depends on:
MLX-SENSOR-003 - Title: Add basic camera/depth path for non-RTX tasks
- Status:
READY - Title: Ensure unsupported camera/RTX features fail explicitly via capability checks
- Status:
LATER - Title: Add benchmark coverage for sensor-heavy mac-native tasks
- Status:
READY - Title: Extract reusable PPO trainer substrate from cartpole-specific code
- Status:
READY - Depends on:
MLX-RL-001 - Title: Define shared MLX policy/checkpoint format for mac-native tasks
- Status:
BLOCKED - Depends on:
MLX-TASK-004,MLX-RL-001 - Title: Train first locomotion task on MLX
- Status:
READY - Title: Add shared replay/eval scripts for all MLX task slices
- Status:
LATER - Title: Define MLX-native wrapper surface instead of relying on torch-centric RL wrappers
- Status:
LATER - Title: Add multi-task benchmark/training dashboard output
- Status:
DONE - Title: Add MLX macOS smoke workflow
- Status:
READY - Title: Add benchmark smoke run and artifact upload to MLX macOS workflow
- Status:
READY - Depends on:
MLX-CI-002 - Title: Add import-safety lane that proves no Isaac Sim install is required
- Status:
LATER - Title: Add nightly drift checks against selected upstream task semantics
- Status:
READY - Title: Publish support matrix and benchmark expectations in README
- Status:
LATER - Title: Archive benchmark trend JSON for M-series comparisons
- Status:
LATER - Title: Define planner compatibility seam to replace cuRobo progressively
- Status:
LATER - Title: Start plain ROS 2 process/message interoperability without CUDA assumptions
- Status:
LATER - Title: Document future CPU/Metal transport path for Isaac ROS compatibility
This queue exists so work can continue without waiting for a new plan:
- If
MLX-IMPORT-003is incomplete, keep taking the next import blocker fromisaaclab.sim. - If
MLX-IMPORT-003is complete, move directly toMLX-IMPORT-004. - Once the import-safety pass stops yielding high-value wins, start
MLX-SIM-001. - Once
MLX-SIM-003is complete, immediately startMLX-TASK-004.
PYTHONPATH=.:source/isaaclab:source/isaaclab_rl .venv/bin/pytest \
source/isaaclab_rl/test/test_import_safety.py \
source/isaaclab/test/backends/test_runtime.py \
source/isaaclab/test/backends/test_portability_utils.py \
source/isaaclab/test/backends/test_mac_cartpole.py \
source/isaaclab/test/backends/test_mac_cartpole_showcase.py \
source/isaaclab/test/backends/test_mac_cart_double_pendulum.py \
source/isaaclab/test/backends/test_mac_quadcopter.py -qPYTHONPATH=.:source/isaaclab .venv/bin/python \
scripts/benchmarks/mlx/benchmark_mac_tasks.py \
--tasks cartpole cart-double-pendulum quadcopter train-cartpole