Capability matrix
Everything the system can do, capability by capability, against where you
can do it. Compiled by reading the actual surfaces — the clap verb enum in
crates/caliper-cli/src/main.rs, the typed Python surface in
crates/caliper-py/python/caliper/__init__.pyi, the sidecar exports in
learn/caliper_learn/__init__.py (+ its caliper-learn console script), and
the Studio modes/store in apps/studio/src — not from memory. A ✗ is an
honest gap: the engine can do it, that face does not expose it (yet).
Faces: CLI · Python · Studio. Engine column links to the capability page.
Model & assets
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Load URDF / xacro, summarize structure | caliper-model (architecture) | load | Robot.from_urdf, .name/.ndof/.joint_names/.joint_limits/.frame_names/.tip_frame/.has_inertia | Open URDF… / samples / recents, ⌘O |
Asset doctor — diagnose A001–A016 | caliper-doctor | doctor | doctor(path) | automatic on every load (error-banner findings) |
| Asset repair — repaired copy, never in-place | caliper-doctor | doctor --repair [--density] [--out] | doctor(path, repair=True, density=…) | Repair & reload button |
| MJCF (MuJoCo XML) export (+ hull-mesh assets) | caliper-sim-mujoco::mjcf | mjcf (--hull-meshes) | model_to_mjcf (no hull-mesh export — primitive colliders only) | ✗ |
| Robot zoo — fetch a vendored real URDF | caliper-cli::zoo | fetch <name> / fetch --list | ✗ | ✗ |
Kinematics & analysis
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Forward kinematics (every frame) | caliper-kinematics | fk | Robot.fk | live in every mode (Jog sliders drive it) |
| Geometric Jacobian (world/body) | caliper-kinematics | ✗ | Robot.jacobian | ✗ (internal to the HUD analysis) |
| Iterative IK (DLS/LM, restarts) | caliper-ik | ik | Robot.ik | Jog tip gizmo (singularity-governed) |
| Analytic 6R IK (branch set) | caliper-ik::analytic | ik --analytic | Robot.analytic_ik | ✗ |
| Singularity / manipulability analysis | caliper-kinematics | analyze | Robot.analyze / manipulability / ellipsoid | singularity HUD + manipulability ellipsoid |
| Redundancy: nullspace step, resolved-rate | caliper-kinematics | ✗ | Robot.nullspace_step / Robot.resolved_rate | ✗ |
| SE(3) log/exp maps | caliper-spatial | ✗ | log6 / exp6 | ✗ |
Motion
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| MOVE_J (jerk-limited S-curve) | caliper-motion | move --goal | Robot.move_j | Motion mode / palette "Plan move to home" / poses |
| MOVE_L (Cartesian line) | caliper-motion | move --target | Robot.move_l | Motion mode (gizmo target) |
| MOVE_C (circular arc via a point) | caliper-motion | move --target --via | Robot.move_c | ✗ |
| Waypoint retiming | caliper-motion | ✗ | Planner.plan_trajectory (plan → retimed Trajectory) | ✗ |
| Time-optimal (TOPP) retiming | caliper-motion | move --time-optimal | Robot.retime_time_optimal | ✗ |
| Named pose library | caliper-motion::PoseLibrary | ✗ | ✗ | Motion mode (save/plan-to/delete poses) |
Trajectory lint T001–T007 | caliper-kinematics::lint_path | report | lint_path | ✗ |
Collision lint T008/T009 | CLI-side over caliper-collision | report --ground/--obstacle/--clearance [--strict] | ✗ | ✗ |
| Cycle-time + path-quality report | caliper-kinematics::path_report | report | ✗ | ✗ |
Dynamics & simulation
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| RNEA / CRBA / forward dynamics / gravity | caliper-dynamics | dyn | Robot.rnea / crba / forward_dynamics / gravity_torque | ✗ ¹ |
| Passive/forced time-stepped simulation | caliper-dynamics::Simulator | sim | Simulator (step/rollout/energy) | Simulate: gravity drop |
| MuJoCo contact simulation (props, ground) | caliper-sim-mujoco | ✗ (use mjcf + MuJoCo) | ✗ | Simulate: contact drop / hold / drive-to (mujoco builds) |
| Live sim session — fixed-1 ms stepped loop, PD hold target, pause/deterministic-reset/stop, ~60 Hz state stream | Studio backend over caliper-hal + caliper-sim-mujoco (Studio-internal IPC, not a public API) | ✗ | ✗ | Simulate: live session — mujoco builds get contacts + props + live contact count; default builds fall back to the builtin gravity integrator; drivable by hand (sliders / IK gizmo / keyboard jog / gamepad tip drive, Space = freeze); teleop takes record straight into LeRobotDataset v3.0 at exact tick decimation (verified to load in lerobot 0.6.0) |
Contact material presets (Rigid/Rubber/Foam/Steel/Wood/Custom) | caliper-sim-mujoco::mjcf | ✗ (mjcf has no material flag) | model_to_mjcf(material=…) — preset name or custom dict | ✗ |
Contact stability linter C001–C003 | caliper-sim-mujoco::lint | ✗ | ✗ | automatic after every contact bake (findings under the Simulate badges; mujoco builds) |
| Convex-decomposition seam (identity impl) | caliper-sim-mujoco | ✗ | ✗ | ✗ |
Collision & planning
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Self/world collision query | caliper-collision | collide | CollisionModel.query | Simulate: Check collision |
| EPA penetration contacts | caliper-collision | collide --contacts | CollisionModel.contacts | ✗ |
| RRT-Connect (+ shortcut smoothing) | caliper-planning | plan | Planner.plan / verify | Simulate: Plan to home (RRT) |
| RRT* (asymptotically optimal) | caliper-planning | plan --optimal | Planner.plan_optimal | ✗ |
| PRM roadmap planning | caliper-planning | plan --prm | Planner.plan_prm | ✗ |
| Plan to a Cartesian pose | caliper-planning | plan --target | Planner.plan_to_pose | ✗ |
| CHOMP-style trajectory optimization | caliper-trajopt | ✗ | ✗ | ✗ (engine-only) |
| Collision-aware reachability | caliper-planning::reach | reach | ReachChecker.status / reachable | ✗ ¹ |
Control, data & learning
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Computed-torque control loop | caliper-hal | run | ControlLoop (run_to / rollout_to / step_with_target / run_stream) | Simulate: Drive to home (control) |
| Safety monitor (limits gate, e-stop) | caliper-hal | inside run ² | SafetyMonitor | inside the control rollout ² |
| Leader–follower teleop | caliper-hal | teleop | LeaderFollower | ✗ |
| Dataset record (LeRobotDataset) | caliper-dataset | record (v3.0 / --format v21) | RecorderV3 / Recorder | ✗ |
| Dataset replay through a sim backend | caliper-dataset + caliper-hal | replay | ✗ (readers only) | ✗ |
| Dataset read / browse / plot | caliper-dataset | ✗ | DatasetReaderV3 / DatasetReader (incl. images) | Data mode (table, channel plots, thumbnails) |
| Dataset edit: delete / split / merge / tags | caliper-dataset::edit | data delete / data split / data merge / data tag | dataset_delete_episodes / dataset_split_episode / dataset_merge_episodes / dataset_read_tags / dataset_write_tags | Data mode edit bar + tag chips |
Dataset doctor D001–D016 | caliper-dataset::analyze | data doctor | data_doctor | Data mode: Doctor button (episode-jump findings) |
| Joint-offset calibration (Gauss-Newton) | caliper-calib | calibrate (incl. --self-test) | calibrate_joint_offsets | ✗ |
| lerobot calibration-file export | Python interop | ✗ | export_lerobot_calibration | ✗ |
| robomimic HDF5 export | Python interop | ✗ | export_robomimic_hdf5 | ✗ |
| BC learning (BC-MLP / ACT-lite / DDPM) | learn/caliper_learn sidecar | ✗ | separate caliper_learn package (on top of these bindings) | ✗ |
| Deploy a lerobot checkpoint — safetensors-only loader + closed-loop sim runner | caliper_learn.hub/runner | ✗ ³ | load_lerobot_policy / LoadedPolicy / run_policy | ✗ ³ |
Seeded policy eval — Wilson-95, E001–E003, checkpoint sweep | caliper_learn.eval | ✗ ³ (caliper-learn eval) | evaluate / sweep / reach_eval_task | ✗ ³ |
Task artifact — *.caliper-task.json v1 (scene + zones + gripper + success + horizon), stability-contract covered, Rust/Python parity-tested | caliper-sim-mujoco::task | ✗ ³ (caliper-learn eval/autopsy --task) | caliper_learn.load_task / VecSimEnv.from_task | Open task… (robot + scene + zones + live SUCCESS badge) |
| Policy-in-the-loop drive — trained checkpoint drives the live sim over a stdio JSON bridge | caliper_learn.bridge | ✗ ³ (caliper-learn drive) | drive_loop / load_drive_policy | Simulate: connect policy… (live session; state-based policies) |
Manipulation success predicates — lifted / placed_in_zone / combinators, exact JSON schema | caliper_learn.success | ✗ ³ | Lifted / PlacedInZone / AllOf / AnyOf / VecSimEnv(success=) / EvalTask.success_predicate | ✗ (Studio grasps via the live weld channel) |
Deploy-loop latency profile — L001–L003, honest achievable Hz | caliper_learn.profile | ✗ ³ (caliper-learn profile) | profile_rollout | ✗ ³ |
Policy deploy debugger P001–P008 | caliper_learn.debugger | ✗ ³ (caliper-learn debug) | analyze_policy | ✗ ³ |
| Policy Autopsy — D+P+E+L under one verdict | caliper_learn.autopsy | ✗ ³ (caliper-learn autopsy) | autopsy | ✗ ³ |
| Domain randomization (CI-diffable seeded draws) | caliper_learn.randomize | ✗ | RandomizationSpec / sample_randomization / apply_to_mjcf / apply_to_env / VecSimEnv(randomization=) | ✗ |
| Coverage generator (doctor→generator loop) | caliper_learn.coverage_gen | ✗ ³ (caliper-learn coverage) | generate_coverage | ✗ |
| Vectorized sim env (gym-vector semantics) | caliper_learn.vec_env | ✗ | VecSimEnv / reach_task / rollout_random | ✗ |
| Sim-camera collector (offscreen → image dataset) | caliper_learn.sim_camera | ✗ | SimCameraScene / collect_camera_dataset | ✗ |
MP4 video features (dtype video, lerobot-exact; metadata native in the Rust writer) | caliper_learn.video + caliper-dataset | ✗ | encode_episode_video / VideoRecorder / RecorderV3(video_features=…) (attach_video_metadata = repair tool) | ✗ |
Dataflow graph
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Run a graph | caliper-graph | graph run | run_graph | Graph mode: Run (+ live scopes) |
| Validate a graph (types, cycles, topo) | caliper-graph | graph validate | validate_graph | Graph mode: Validate (inline node/edge errors) |
| Edit a graph visually | — (frontend) | ✗ | ✗ | Graph mode editor (⌘D duplicate, delete, fit, app-data save/load, file import/export) |
Misc
| Capability | Engine | CLI | Python | Studio |
|---|---|---|---|---|
| Engine version / build info | caliper::VERSION | info / --version | version() / __version__ | toolbar readout |
| First-run guided tour | — (frontend) | ✗ | ✗ | 6-step overlay + palette "Show tour" |
| Lightweight benchmark harness | — (scripts) | ✗ (a shell script, not a verb: scripts/measure_lightweight.sh drives the CLI) | ✗ | ✗ |
¹ The Studio backend registers dynamics_at / reach_check commands, but no
UI control invokes them yet — counted as ✗ until a panel drives them.
² The safety monitor runs inside the control loop on these faces; only Python exposes it as a standalone object.
³ Policy inference is Python-side (torch + the safetensors-only hub loader),
so the Rust CLI and Studio cannot host these. The sidecar ships its own console
face instead: caliper-learn debug|autopsy|eval|profile (each takes
--json; exit code 1 on any error-severity finding) — see
Verdicts.