Repository: isaac-sim/IsaacLab (Python)

Issue:
[Bug Report] `joint_effort_out_of_limit` flags non-violations
### Describe the bug

`isaaclab/envs/mdp/terminations.py::joint_effort_out_of_limit` uses:
```python
out_of_limits = torch.isclose(
    asset.data.computed_torque[:, asset_cfg.joint_ids],
    asset.data.applied_torque[:, asset_cfg.joint_ids],
)
return torch.any(out_of_limits, dim=1)
```

This logic is inverted. If no clipping occurs, `computed == applied` and the function wrongly returns `True`. If clipping occurs (i.e., torques exceed limits), `computed != applied` and the function wrongly returns `False`.


### Steps to reproduce
Minimal repro illustrating the truth table:

```python
from isaaclab.managers import SceneEntityCfg
from isaaclab.envs.mdp.terminations import joint_effort_out_of_limit

env = ...  # any ManagerBasedRLEnv with an Articulation named "robot"
cfg = SceneEntityCfg(name="robot", joint_ids=[0])  # single joint for clarity
art = env.scene["robot"]

# Case A: no clipping (should be False but returns True now)
art.data.computed_torque[:] = 0.0
art.data.applied_torque[:] = 0.0
assert joint_effort_out_of_limit(env, cfg).item() is False  # CURRENT: True (bug)

# Case B: clipping (should be True but returns False now)
art.data.computed_torque[:] = 100.0
art.data.applied_torque[:] = 50.0  # pretend actuator clipped to ±50
assert joint_effort_out_of_limit(env, cfg).item() is True   # CURRENT: False (bug)

```

### System Info

Commit: b5d094e5de0d35d0f6f87a0709394cbe230159d9 (branch: feature/isaacsim_5_0)

Isaac Sim Version: 5.0

OS: Ubuntu 22.04

GPU: RTX 5080

CUDA: 12.8

GPU Driver: 570.144

### Additional context

Option 1: detect clipping via inequality
```python
comp = asset.data.computed_torque[:, asset_cfg.joint_ids]
appl = asset.data.applied_torque[:, asset_cfg.joint_ids]
clipped = ~torch.isclose(comp, appl)
return clipped.any(dim=1)
```

Option 2: compare against effort limits when available

```python
comp = asset.data.computed_torque[:, asset_cfg.joint_ids]
lims = asset.data.soft_joint_effort_limits[:, asset_cfg.joint_ids]  # shape [N,K]
viol = torch.abs(comp) > lims
return viol.any(dim=1)
```

### Checklist

- [x] I have checked that there is no similar issue in the repo (**required**)
- [x] I have checked that the issue is not in running Isaac Sim itself and is related to the repo

### Acceptance Criteria

- [x] Predicate corrected so non-clipped torques do not trigger termination and clipped torques do.
- [ ] Unit tests for both “no-clip” and “clip” cases, and for presence/absence of soft_joint_effort_limits.
- [x] Docstring documenting the corrected logic.



Discussion: Thank you for posting this. The team will review it.
Thanks! I can also add a PR during my lunch break today, I think it just needs an inversion.



Fix (patch):
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 3c683ebe4f0..38fcfc8032b 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -90,6 +90,7 @@ Guidelines for modifications:
 * Lukas Fröhlich
 * Manuel Schweiger
 * Masoud Moghani
+* Maurice Rahme
 * Michael Gussert
 * Michael Noseworthy
 * Miguel Alonso Jr
diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml
index d5cc08d815e..9927329e7e8 100644
--- a/source/isaaclab/config/extension.toml
+++ b/source/isaaclab/config/extension.toml
@@ -1,7 +1,7 @@
 [package]
 
 # Note: Semantic Versioning is used: https://semver.org/
-version = "0.45.1"
+version = "0.45.3"
 
 
 # Description
diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst
index 9d60f294e57..e7fbb6d4e46 100644
--- a/source/isaaclab/docs/CHANGELOG.rst
+++ b/source/isaaclab/docs/CHANGELOG.rst
@@ -1,6 +1,16 @@
 Changelog
 ---------
 
+0.45.3 (2025-08-20)
+~~~~~~~~~~~~~~~~~~~
+
+Fixed
+^^^^^
+
+* Fixed :meth:`isaaclab.envs.mdp.terminations.joint_effort_out_of_limit` so that it correctly reports whether a joint
+  effort limit has been violated. Previously, the implementation marked a violation when the applied and computed
+  torques were equal; in fact, equality should indicate no violation, and vice versa.
+
 0.45.2 (2025-08-18)
 ~~~~~~~~~~~~~~~~~~~
 
diff --git a/source/isaaclab/isaaclab/envs/mdp/terminations.py b/source/isaaclab/isaaclab/envs/mdp/terminations.py
index 9f0f7858535..a13ce9bb4a2 100644
--- a/source/isaaclab/isaaclab/envs/mdp/terminations.py
+++ b/source/isaaclab/isaaclab/envs/mdp/terminations.py
@@ -134,12 +134,12 @@ def joint_effort_out_of_limit(
 
     In the actuators, the applied torque are the efforts applied on the joints. These are computed by clipping
     the computed torques to the joint limits. Hence, we check if the computed torques are equal to the applied
-    torques.
+    torques. If they are not, it means that clipping has occurred.
     """
     # extract the used quantities (to enable type-hinting)
     asset: Articulation = env.scene[asset_cfg.name]
     # check if any joint effort is out of limit
-    out_of_limits = torch.isclose(
+    out_of_limits = ~torch.isclose(
         asset.data.computed_torque[:, asset_cfg.joint_ids], asset.data.applied_torque[:, asset_cfg.joint_ids]
     )
     return torch.any(out_of_limits, dim=1)