Skip to content

[pull] develop from isaac-sim:develop - #38

Merged
pull[bot] merged 128 commits into
mataylor-nvidia:developfrom
isaac-sim:develop
Sep 16, 2026
Merged

pull[bot] merged 128 commits into
mataylor-nvidia:developfrom
isaac-sim:develop

Conversation

@pull

@pull pull Bot commented Sep 16, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

ooctipus and others added 30 commits September 7, 2026 10:53
## Description

Remove backend-specific task and training changes from rough velocity
configurations so physics selection no longer silently changes the
comparison inputs.

- Remove MJWarp-only actuator armature overrides from Anymal-C, Cassie,
Go1, and Go2.
- Use the same 5,000-iteration G1 PPO budget for every physics backend.
- Replace the one-option base-COM PresetCfg with its owned EventTerm and
update the robot-specific callers.
- Remove tests whose only contract was the deleted G1 budget or Go2
armature special case. Keep the legacy Newton alias check tied to the
selected solver instead of an actuator side effect.

Downstream configurations that intentionally require different values
can still set them explicitly.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] Backport this pull request to the active release branch after it
merges into develop

## Testing

- `uv run --extra test python -m pytest
source/isaaclab_tasks/test/core/test_hydra.py
source/isaaclab_tasks/test/core/test_velocity_newton_cfg.py` — 88
passed.
- `uv run isaaclab -f` — passed.
- No new tests were added.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the pre-commit checks.
- [x] Documentation changes are not required.
- [x] My changes generate no new warnings.
- [x] I removed tests that encoded the deleted backend-specific tuning.
- [x] I added an isaaclab_tasks changelog fragment.
- [x] My name already exists in CONTRIBUTORS.md.
# Description

Add `--no-sync` to RLinf train and play commands to preserve
GR00T-compatible package versions.

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->


Fixes # (issue)

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

The environment browser advertises SKRL support for the native
multi-agent tasks but previously omitted the algorithm from its
generated commands. SKRL consequently used its PPO default, converted
the environment to single-agent form, and selected the wrong algorithm
for pretrained-checkpoint lookup.

This change marks MAPPO as the generated-command default whenever a task
registers an SKRL MAPPO configuration, then appends `--algorithm MAPPO`
in the environment browser. Explicit runtime algorithm selection remains
unchanged, so other algorithm checkpoints are still supported.

This currently updates the generated commands for:

- `Isaac-Pendulum-MARL-Direct`
- `Isaac-Shadow-Handover-Direct`

Tracks NVBug 6675391. No matching existing PR was found; #7360 addresses
the separate benchmark play environment-creation path.

No new dependencies are required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable. A headless browser smoke test generated:

`uv run --extra skrl isaaclab train --rl_library skrl --task
Isaac-Shadow-Handover-Direct --algorithm MAPPO physics=newton_mjwarp`

## Validation

- `uv run --extra test python -m pytest --confcutdir=tools/test
tools/test/test_environ_docs.py -q` (28 passed)
- `uv run --isolated --extra dev --extra ov -- make -C docs
current-docs` (passed)
- `uv run isaaclab -f` (passed)
- Headless Chrome environment-browser command generation smoke test
(passed)

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the repository formatting and pre-commit checks with
`uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] No changelog fragment is required because no source package
changed
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

`NewtonVisualizer` dropped its viewer without closing it in two paths:
- normal shutdown through `close()`
- the `step()` recovery path that disables the viewer after an
initialization failure

This left OVRTX resources to be released by the garbage collector in an
undefined order. If the renderer was destroyed before its active
bindings and retained step results, shutdown could report:
```
Renderer destroyed with 1 active binding(s)
OV RTX: Leaking step result outputs
```
Both paths now use a shared `_release_viewer()` helper that calls
`viewer.close()` before clearing the reference.

During normal shutdown, teardown failures continue to propagate after
the remaining cleanup completes. If viewer cleanup also fails in the
`step()` recovery path, the error is logged without interrupting
training.

## Type of change
- Bug fix (non-breaking)

## Release backport
- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

The same issue is present on `release/3.0.0`.

## Validation

### Controlled teardown reproduction
The controlled test reproduced the reported shutdown signature:

| Version | Active-binding warnings | Leaked-step-result errors |
| --- | --- | --- |
| Without fix | 1 | 2 |
| With fix | 0 | 0 |

### Windows — RTX PRO 6000
Ran each of the two reported workloads three times, for six runs per
batch:

| Version | Completed | Active-binding warnings | Leaked-step-result
errors | New warnings |
| --- | --- | --- | --- | --- |
| Without fix | 6/6 | 1/6 | 0/6 | — |
| With fix | 6/6 | 0/6 | 0/6 | 0 |

The OVRTX window failed to initialize on this machine, so every run
exercised the `step()` recovery path. A pre-existing USD asset-loading
crash occurred once in each batch before viewer initialization and is
being tracked separately.

### Linux — L40
The nine new regression tests fail against the original implementation
and pass with the fix:

| Version | Visualizer test results |
| --- | --- |
| Without fix | 58 passed, 9 failed |
| With fix | 67 passed, 0 failed |

Seven tests requiring the full Isaac Sim runtime were excluded because
of a pre-existing collection error.

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation — not
applicable
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added the required changelog fragment under
`source/<pkg>/changelog.d/`
- [x] My name is already included in `CONTRIBUTORS.md`

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

Fixes NVBug 6675392 and NVBug 6684416

This PR fixes two camera-rendering failures at their respective
boundaries:

- Newton Warp rendering now marks deformable triangle-mesh render work
as non-graph-capturable because Warp mesh refits record allocation nodes
that conditional CUDA graph bodies do not support. Other graph-safe
sensor tasks remain capturable.
- Isaac RTX rendering now treats an empty annotator warm-up frame as not
ready, clears the destination buffer, and skips Warp slicing and reshape
work for that frame.

No new dependencies are required.

### Validation

#### NVBug 6675392 exact command

```console
uv run --extra isaacsim,all,rlinf,mimic,teleop,tetrahedralization,video,leapp isaaclab train --rl_library rsl_rl --task Isaac-Lift-Cloth-Franka-Camera --info --max_iterations 5
```

- PR parent `3639364a`: reproduced `Conditional body graph contains an
unsupported operation (memory allocation)` and the `sensor CUDA graph
capture failed` traceback, then completed learning iterations 0/5
through 4/5 via the existing eager fallback.
- This PR: completed learning iterations 0/5 through 4/5 without the
conditional-body or sensor-capture traceback.

#### NVBug 6684416 exact commands

Primary command (Windows path separators translated to Linux path
separators only):

```console
uv run --extra all,isaacsim,rlinf,mimic,teleop,tetrahedralization,video,leapp python scripts/environments/zero_agent.py --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos --visualizer newton_gl
```

Ubuntu multi-visualizer command:

```console
uv run --extra isaacsim,all,rlinf,mimic,teleop,tetrahedralization,video,leapp python scripts/environments/zero_agent.py --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos --visualizer kit,rerun,newton_gl,viser physics=isaacsim_physx
```

- PR parent and this PR: both commands completed environment setup,
reached `Zero agent is running`, and stepped until an external watchdog
stopped the intentionally unbounded process (90-120 seconds). Neither
revision raised `Invalid indexing in slice` on the locally available
repository-pinned Isaac Sim 6.0.1.0 stack.
- The ticket reports Isaac Sim 6.1.0.0-rc.12, which is not installed
locally. A run using the closest local 6.1 source build (6.1.0-alpha.56)
at the ticket's reported Isaac Lab revision stopped on an unrelated
4096-environment RTX allocation/OOM failure before reaching the reported
invalid-slice path, so it is not counted as a reproduction.
- The focused empty-annotator-frame regression test deterministically
fails on the PR parent with the reported invalid-slice behavior and
passes on this PR.

The unbounded zero-agent commands were wrapped only in a timeout, and
`OMNI_KIT_ACCEPT_EULA=YES` was scoped to the processes after confirming
an existing accepted-EULA marker. Their command arguments were otherwise
unchanged.

#### Focused and repository checks

- `uv run --frozen --extra test python -m pytest
source/isaaclab_newton/test/physics/test_newton_manager_abstraction.py
source/isaaclab_physx/test/renderers/test_isaac_rtx_renderer_contract.py
-q` — 200 passed
- The new focused regression tests were verified to fail before the
fixes and pass afterward.
- `uv run --frozen isaaclab -f`
- `uv run --frozen --extra test python tools/changelog/cli.py check
develop`

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation (changelog
fragments; no public API change)
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…7532)

# Description

Preset-based `--agent` auto-selection is dead code for `rsl_rl`,
`rl_games` and `sb3`. Two defects sit **in series** on the same code
path:

1. **The selection guard cannot see past the CLI default.**
`_auto_select_agent` in
`source/isaaclab_tasks/isaaclab_tasks/utils/preset_cli.py` was only
reached when `args.agent is None`. `add_common_train_args` registers
`--agent` with `default=agent_default`, and every backend except `skrl`
passes a non-`None` `agent_default` (`rsl_rl_cfg_entry_point`,
`rl_games_cfg_entry_point`, `sb3_cfg_entry_point`). The parsed value is
therefore never `None`, so the branch never runs.
2. **The benchmark entrypoints never asked for it.**
`benchmark_train_{rsl_rl,rl_games,sb3}.py` and
`benchmark_play_{rsl_rl,rl_games,sb3}.py` called
`setup_preset_cli(parser, argv)` without `agent_library`, so
auto-selection was not attempted at all (and the registered-agent help
listing was missing too). Only the `skrl` benchmark entrypoints wired
it.

## Provenance and symptom

Benchmark sweep dispatch `20260901-153531` (image built from
`release/3.0.0` at `f88dbc59c82`, `rsl_rl`) produced **60 failed rows**:
`resnet18` (30) and `theia_tiny` (30), failing 100% across all three
renderers and all physics backends. Every one died before the first
training step:

```
ValueError: Observation 'critic' in observation set 'critic' not found in the observations
from the environment. Available observations from the environment: ['policy']
```

Call chain: `OnPolicyRunner.__init__` → `ppo.py construct_algorithm` →
`rsl_rl/utils/utils.py:233 resolve_obs_groups`.

## Why this is an agent-entrypoint bug, not a missing observation group

`Isaac-Cartpole-Camera` already declares the correct pairing:

```python
"agent_preset_compatibility": {
    "rsl_rl_cfg_entry_point": _RAW_CAMERA_PRESETS,
    "rsl_rl_feature_cfg_entry_point": ("resnet18", "theia_tiny"),
    ...
}
```

and `CartpoleCameraFeaturePPORunnerCfg` sets `obs_groups` with `critic:
["policy"]`. The feature entry point exists, is registered, is correct —
it was simply unreachable, so `resnet18`/`theia_tiny` ran against the
raw-camera `CartpoleCameraPPORunnerCfg`, whose `obs_groups` asks for a
`critic` group the env does not expose. Nothing needs to be added to the
environment.

## Why both defects are in one PR

Neither half fixes the observed failure alone; this was measured, not
assumed. Reverting either half of the change and running the regression
test:

| state | result |
| --- | --- |
| defect 2 fixed only (`agent_library` wired, guard unchanged) | 4
failed — `--agent` still parses to the non-`None` default, so the guard
rejects |
| defect 1 fixed only (guard fixed, `agent_library` not wired) | 4
failed — `if agent_library and ...` is `False`, auto-selection never
attempted |
| both fixed | passes |

They are two links in one chain, so splitting them yields a PR that
fixes nothing observable and a PR that cannot be tested end-to-end.

## Scope: train **and** play, benchmark **and** non-benchmark

To pre-empt the obvious question — this is not a play-only or a
train-only fix.

| path | affected by | fixed by | proven by |
| --- | --- | --- | --- |
| `benchmark_train_{rsl_rl,rl_games,sb3}` | defects 1 + 2 |
`preset_cli.py` + `agent_library=` wiring |
`test_training_request_selects_preset_compatible_agent` — **this is the
observed 60-row failure** |
| `benchmark_play_{rsl_rl,rl_games,sb3}` | defects 1 + 2 |
`preset_cli.py` + `agent_library=` wiring |
`test_play_request_selects_preset_compatible_agent` |
| `isaaclab_rl` `train_*`/`play_*` (non-benchmark) | defect 1 only —
they already pass `agent_library` | `preset_cli.py` alone; **no file in
this PR touches them** |
`test_setup_preset_cli_auto_selects_agent_over_non_none_default` |

Each half of the benchmark wiring was reverted independently and
re-tested:

* revert the three **train** wirings → the 4 training selection cases
fail. Load-bearing for the reported failure.
* revert the three **play** wirings → the 2 playback selection cases
fail.

There is **no train/play asymmetry** that would justify wiring only one
of them: both register `--agent` with the same non-`None` default via
the same helper, both call `setup_preset_cli`, and both feed
`args.agent` into the same `resolve_task_config(...)` and then into the
same `OnPolicyRunner(...)` construction. The reason the sweep only
surfaced the training failure is ordering, not asymmetry — a row that
dies at `train_rc=1` never reaches playback. Measured on the playback
path before the wiring was added:

```
$ BenchmarkPlayRequest(backend="rsl_rl", task="Isaac-Cartpole-Camera", presets=("resnet18",))
args.agent : rsl_rl_cfg_entry_point          # raw-camera config, wrong
# with the wiring:
args.agent : rsl_rl_feature_cfg_entry_point  # correct
```

Playback would therefore have loaded a feature-trained checkpoint into
the raw-camera policy architecture.

## Fix chosen

Detect an explicitly typed `--agent` by re-parsing the same argv into a
namespace pre-seeded with a sentinel: argparse only applies a default
for a destination the namespace does not already carry, so the sentinel
survives unless the user actually typed the flag. Auto-selection runs
only when it does survive; an explicit `--agent` still wins. The six
benchmark entrypoints now pass `agent_library`.

The probe uses the same parser on the same argv as the real parse, so
its verdict *is* argparse's verdict. Verified across every spelling —
`--agent V`, `--agent=V`, the abbreviation `--age V`, repeated flags,
and `--agent` after a `--` separator (correctly not explicit: argparse
does not set it in the real parse either). A literal argv scan for
`--agent` would get the abbreviation wrong and silently override a
user's explicit choice, which is why the probe is preferred; the repo's
existing `ExplicitAction` idiom would work too but requires touching all
ten `--agent` registration sites across three packages, and a missed
site fails the same silent way.

### Rejected: make `--agent` default to `None` everywhere

This is the obvious fix and it is not safe. `skrl` can default to `None`
because `train_skrl.py` reconstructs the entry point from `--algorithm`
when it is `None`. The other three pass `args_cli.agent` straight into
`resolve_task_config(...)`, which has no such fallback — `hydra.py:619`
sets `agent_cfg = load_cfg_from_registry(...) if agent_entry else None`,
and the entrypoints then dereference `agent_cfg.max_iterations`. A
`None` default would break every plain `--task=X` run that relies on the
canonical entry point, i.e. the overwhelmingly common case. Fixing that
would mean adding a fallback to each of the six benchmark entrypoints
plus the four train/play entrypoints: a much wider blast radius than the
bug.

### Blast radius

Behavior changes only where auto-selection actually fires, and only when
the user did **not** type `--agent`:

* **Rule 1 (preset-based)** fires only for tasks that opted in with
`agent_preset_compatibility` — today `Isaac-Cartpole-Camera` and the two
cartpole-showcase tasks. That is the declared contract finally being
honored. Anyone who wants the previous (broken) pairing can still pass
`--agent rsl_rl_cfg_entry_point` explicitly; covered by a test.
* **Rule 2 (default-absent)** fires only when
`<library>_cfg_entry_point` is *not* registered and exactly one other
entry point is. That path previously resolved an unregistered entry
point and crashed, so this is strictly a repair.
* Everything else — no preset pairing declared, or the canonical default
is registered — keeps the exact default it had; covered by a test for
all three libraries.
* `skrl` is unaffected: it already passed `agent_default=None`, and the
explicit/implicit distinction collapses to the old `is None` check for
it.

`rl_games` and `sb3` share the defect and are fixed by the same change.
**`sb3` has no task declaring `agent_preset_compatibility`, so there is
no positive selection test for it** — its wiring is covered by the
shared code path and by a default-preservation test only.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

Not applicable.

## Validation

Regression tests were confirmed to fail on `develop` without the fix and
pass with it.

**Before the fix** (production changes reverted to `develop`, tests in
place):

```
$ uv run --frozen --extra test python -m pytest source/isaaclab_tasks/test/core/test_preset_cli.py \
    source/isaaclab/test/benchmark/test_api.py -q -p no:warnings \
    -k "preset_compatible_agent or keeps_backend_default_agent or auto_selects_agent_over_non_none or keeps_explicit_agent"

FAILED test_preset_cli.py::test_setup_preset_cli_auto_selects_agent_over_non_none_default
FAILED test_api.py::test_training_request_selects_preset_compatible_agent[resnet18-rsl_rl]
FAILED test_api.py::test_training_request_selects_preset_compatible_agent[resnet18-rl_games]
FAILED test_api.py::test_training_request_selects_preset_compatible_agent[theia_tiny-rsl_rl]
FAILED test_api.py::test_training_request_selects_preset_compatible_agent[theia_tiny-rl_games]
5 failed, 6 passed, 53 deselected

E  AssertionError: assert 'rl_games_cfg_entry_point' == 'rl_games_feature_cfg_entry_point'
```

**After the fix:**

```
$ uv run --frozen --extra test python -m pytest source/isaaclab_tasks/test/core/test_preset_cli.py \
    source/isaaclab_tasks/test/core/test_hydra.py source/isaaclab/test/benchmark \
    source/isaaclab_rl/test/test_entrypoints_common.py -q -p no:warnings
492 passed, 1 skipped in 30.89s

$ uv run --frozen --extra test --extra skrl --extra sb3 --extra rl-games --extra rsl-rl \
    python -m pytest source/isaaclab_rl/test/test_typed_preset_cli_train_play.py -q -p no:warnings
8 passed in 33.27s
```

(The last suite fails on a bare `--extra test` environment on `develop`
too — `ModuleNotFoundError: No module named 'skrl'` etc. — so it was
rerun with the RL extras.)

```
$ uv run --frozen python tools/changelog/cli.py check develop
✓ All modified packages have valid changelog fragments.

$ uv run --frozen isaaclab -f
all hooks passed
```

Tests added:

* `source/isaaclab_tasks/test/core/test_preset_cli.py` — auto-selection
over a non-`None` default; explicit `--agent` wins over the preset,
parametrized over the three spellings argparse accepts. The two
pre-existing auto-selection tests only covered `skrl` with
`agent_default=None`, which is exactly why this bug went unnoticed.
* `source/isaaclab/test/benchmark/test_api.py` — drives the real
benchmark entrypoints via
`BenchmarkTrainingRequest`/`BenchmarkPlayRequest` and `_parse_args`,
asserting the feature entry point is selected for
`resnet18`/`theia_tiny` × `rsl_rl`/`rl_games` on the train path
(mirroring the failing rows), the same on the play path, and that the
canonical default survives otherwise (`rsl_rl`, `rl_games`, `sb3`).

Both assert the *selected agent config*, not merely absence of an
exception.

Not run: a real training job on the failing rows (requires GPU sim). The
failure is a construction-time config selection, fully reproduced at CLI
level.

## Related PRs — checked, no overlap

* **#7491** (Select pretrained checkpoints from resolved task configs)
touches `isaaclab_rl/entrypoints/common.py`, the four `play_*`
entrypoints, the four `benchmark_play_*` entrypoints,
`cartpole/__init__.py` and `test_preset_cli.py` — adjacent, but changes
neither `agent_default` nor the selection guard. Textual conflicts are
possible in `test_preset_cli.py` and the `benchmark_play_*` files
(one-line `setup_preset_cli(...)` call); no semantic conflict.
* **#6440** (`fix(rsl_rl): default obs_groups for new runners`) adds an
`obs_groups` default in `isaaclab_rl/rsl_rl/utils.py`. It would mask
this symptom for runners that omit `obs_groups`, but
`CartpoleCameraPPORunnerCfg` sets `obs_groups` explicitly, so it does
not fix these 60 rows — and it would not make the correct feature config
get selected either. Complementary, not duplicate.
* `gh pr list --search "agent preset"` returned nothing touching this
code.

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

---------

Co-authored-by: hujc <jichuanh@nvidia.com>
… ages (#7574)

# Description

`ContactSensor.compute_first_contact(dt)` / `compute_first_air(dt)`
silently missed most touchdowns and lift-offs once the simulation had
run for a few seconds. On a transition step the contact (resp. air)
timer is exactly one sensor update interval, so the check degenerated to
`dt < dt + 1e-8`. The sensor clock is a float32 accumulator whose
rounding error reaches ~1e-6 after a few seconds of simulated time,
roughly 100x the default tolerance, so the events vanished depending on
the magnitude of the sim clock. The reporter's CPU reproducer shows
352/500 touchdowns and lift-offs missed at the default tolerance; it
reproduces exactly on `develop`. All three backends (Newton, PhysX,
OVPhysX) share the same logic, and the 2.x torch sensor had the same
defect, so this is long-standing rather than a Newton regression.

**Fix.** `abs_tol` now defaults to `None` and is resolved at call time
by a single helper in `BaseContactSensor` to **half the sensor update
interval**, i.e. `0.5 * max(cfg.update_period, physics_dt)`. Valid timer
values are integer multiples of that interval, so half an interval is
the midpoint between "one update ago" and "two updates ago". This stays
robust to float32 clock drift for hours of simulated time and works for
both `history_length == 0` (lazy, once-per-policy-step refresh) and
`history_length > 0` (every physics substep). The Warp kernels are
unchanged. Passing an explicit `abs_tol` still works; callers who want
the previous behaviour can pass `abs_tol=1e-8`.

**Tests.** Public-API regression tests in the Newton, PhysX and OVPhysX
contact sensor suites: settle a body in contact, age the sensor clock to
2.5 / 10 / 30 s, lift and land the body, and poll
`compute_first_contact` / `compute_first_air` with default arguments.
These fail on the unfixed code (e.g. `compute_first_air missed the
lift-off at clock 2.833s: reported [], expected [0]`) and pass with the
fix. The Newton variant covers both `history_length` modes.

**Refresh before query.** Both methods now call the sensor's
outdated-buffer refresh before comparing, restoring what the 2.x torch
sensor did by reading through `self.data`. The Warp port (#4707 / #4716)
read the private timer buffer directly, so a `history_length == 0`
caller that polled before touching `data` saw the previous step's
timers. The aged-clock tests now poll before reading `data`; the Newton
lazy-mode cases fail without the refresh (transition reported one policy
step late) and pass with it. Adopted from the approach in #7294.

**Out of scope, noted for follow-up.**
- The transition interval is counted in both the ending and the starting
phase, so `last_air_time` / `last_contact_time` overestimate each phase
by one update interval (also raised in the issue). That bias is present
since 2.x and baked into tuned `feet_air_time` thresholds, so changing
it would rescale rewards for trained velocity policies and deserves its
own PR.
- On `cuda:0` with `history_length == 0`, the PhysX and OVPhysX sensors
serve stale net forces when buffers refresh only on data access,
independently of this change. That is why the PhysX/OVPhysX public-API
tests cover only the substep cadence.

Fixes #7283

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Fixes #6829.

Preserve MuJoCo-authored joint friction loss when Isaac Lab imports USD
stages for the Newton MJWarp backend.

Before this change, both Newton production import paths passed only
`SchemaResolverNewton` and `SchemaResolverPhysx` to Newton:

* vectorized clone replication; and
* standalone stage import.

Consequently, a joint authored with `mjc:frictionloss=0.11` finalized
with `Model.joint_friction=0.0`, even though Newton supports the
attribute through `SchemaResolverMjc`.

This PR makes USD resolver selection an active-manager policy:

* `NewtonManager` defaults to Newton then PhysX resolvers;
* `NewtonMJWarpManager` appends the MuJoCo resolver;
* clone and standalone imports consume the same manager-owned resolver
list; and
* resolver order remains Newton → PhysX → MuJoCo, so MJC values are
fallbacks and do not override higher-priority authored values.

MuJoCo custom attributes continue to be registered through the existing
`_builder_attribute_solvers = (SolverMuJoCo,)` mechanism. The follow-up
removes the redundant MJWarp registration override instead of
duplicating that base-class path.

## Scope and alternative considered

PR #7386 fixes the immediate `frictionloss` symptom by appending the
complete `SchemaResolverMjc` to every Newton physics import. That
resolver also interprets additional joint, shape, contact, and scene
attributes. Applying it unconditionally would therefore expand MJC
semantics to Featherstone, XPBD, VBD, Kamino, and MPM rather than
changing only MJWarp.

This PR intentionally keeps the immediate fix solver-scoped: the manager
that registers and consumes MuJoCo-specific attributes also owns the
MuJoCo resolver. Regression coverage verifies that MJWarp imports
`mjc:frictionloss` and `mjc:damping`, while Featherstone preserves its
previous behavior.

A broader cross-backend solution should separately classify portable MJC
core semantics from MuJoCo-specific extensions, ideally by splitting
those resolver responsibilities in Newton upstream. That larger
architecture change is outside the scope of this bug fix.

No dependency or public API is added.

## Type of change

* Bug fix (non-breaking change which fixes an issue)

## Release backport

* [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable; this fixes a non-visual USD import path.

## Verification

Latest follow-up commit:

* focused production-path regression matrix: 5 passed;

* MJWarp × clone/standalone preserves `frictionloss=0.11` and
`damping=0.23`;
* Featherstone × clone/standalone leaves both MJC-authored values
unconsumed;
  * the existing explicit-global clone import test still passes;
* full pre-commit suite passed;
* changelog validation passed;
* Python bytecode compilation passed; and
* `git diff --check` passed.

Previous PR head verification in the matching isolated environment:

* Python 3.12.13;
* `isaaclab-newton==5.4.0`;
* `newton==1.5.0`;
* `warp-lang==1.16.0`;
* `mujoco-warp==3.11.0`; and
* full Newton manager abstraction suite: 157 passed on a CUDA host.

## Checklist

* [x] I have read and understood the [[contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
* [x] I have run the pre-commit checks
* [x] I have made corresponding changes to the documentation (not
applicable: no public API or user workflow changed)
* [x] My changes generate no new warnings
* [x] I have added tests that prove my fix is effective
* [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
* [x] I have added my name to `CONTRIBUTORS.md`

---------

Co-authored-by: NeoZng <neozng@foxmail.com>
## Summary
- Document that Isaac RTX's `rtx.scenedb.plugin` caps the number of
scene partitions at 15625; requesting more environments than that with
scene partitioning enabled silently discards additional partitions and
causes environments to share tiled camera views.
- Add a warning note to the scene partitioning section of the renderers
overview doc.
- Add a corresponding Known Issues entry under the Renderers section,
following the existing animated-curve scene-partition entry's format.

## Type of change

- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Test plan
- [x] `uv run isaaclab -f` passes (docs/rst formatting checks)
- [x] Manually reviewed rendered structure/headings match existing doc
conventions in both files
# Description

Fix surface-gripper stack observations so `object_grasped` and
`object_stacked` return one boolean per environment. The surface-gripper
state was reshaped to `(num_envs, 1)` before being combined with an
`(num_envs,)` predicate, which caused PyTorch to broadcast the result to
`(num_envs, num_envs)` while stepping the environment.

No new dependencies are required.

Reported in TC_146506 for
`IsaacContrib-Stack-Cube-UR10-Long-Suction-IK-Rel` with the Newton
Kamino backend.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable; this corrects an observation tensor shape.

## Validation

- `uv run python tools/changelog/cli.py check --include-worktree
develop`
- `uv run isaaclab -f`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] Documentation changes are not required for this internal shape
correction
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/isaaclab_tasks/changelog.d/`
- [x] My name already exists in `CONTRIBUTORS.md`

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…#7621)

# Description

Backports #7619 from `release/3.0.0` to `develop`.

The change restores native keyboard, gamepad, and SpaceMouse
teleoperation for both supported Franka Reach relative-IK
configurations:

- `physics=isaacsim_physx presets=diffik`
- `physics=newton_mjwarp presets=newton_ik`

Both configurations accept six-dimensional relative pose actions, so
their native device configurations disable the unsupported gripper
command. The default joint-position and absolute-pose presets remain
unchanged.

This is an exact patch replay of merged release commit
`17e5f3d51620168806647feeaeab85c2688d2bc4`; no conflict resolution or
develop-specific adaptation was required. No new dependencies are
required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [ ] <!-- backport-active-release --> This change originated on
`release/3.0.0`; do not backport it again.

## Screenshots

Not applicable.

## Validation

- Stable patch ID matches the merged #7619 release commit.
- `uvx --from pre-commit==4.6.2 pre-commit run --all-files` — passed.
- `tools/changelog/cli.py check develop` — passed against the current
develop base.
- `git diff --check upstream/develop..HEAD` — passed.
- Source PR validation for this exact patch: 23 Reach preset tests
passed, the Newton random-agent smoke test passed, the documentation
build passed without warnings, and `uv run isaaclab -f` passed.

The targeted test and documentation commands could not be rerun on this
macOS host because the current lockfile supports Linux x86_64/aarch64
and Windows AMD64 only. Develop CI provides the supported-platform
verification.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the available pre-commit checks.
- [x] I have included the corresponding documentation change.
- [x] My changes generate no new warnings in the available checks.
- [x] The source PR's tests cover this exact patch.
- [x] I have included the `isaaclab_tasks` changelog fragment.
- [x] The original contributor already appears in `CONTRIBUTORS.md`.

Co-authored-by: Maximilian Krause <99733341+maxkra15@users.noreply.github.com>
# Description

Updates the registry-backed environment browser so it advertises
`physics=newton_mjwarp` only for validated contributed task
combinations.

The following Galbot visuomotor registrations are documented as
PhysX-only after nvbug 6695019 reported their shared Newton
sensor-initialization failure:

- `IsaacContrib-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor`
-
`IsaacContrib-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Joint-Position`
- `IsaacContrib-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-RmpFlow`

The support matrix also documents these tasks as PhysX-only:

- `IsaacContrib-Factory-Franka`
- `IsaacContrib-Stack-Cube-UR10-Long-Suction-IK-Rel`

The UR10 task uses the PhysX-only surface-gripper implementation and
already rejects Newton during configuration validation. Renderer
selectors remain available for the Galbot tasks because renderer
selection is independent of the physics backend.

Regenerating the browser also captures existing registry drift for the
two DR Legs tasks, whose PhysX and Newton Kamino presets were missing
from the generated rows.

Focused regression coverage verifies every newly excluded task while
preserving supported task combinations.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [x] Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable; this updates generated environment metadata and command
options.

## Validation

- `uv run --frozen python -m pytest --confcutdir=tools/test
tools/test/test_environ_docs.py -q` (33 passed)
- `uv run --frozen python tools/update_environments_rst.py --check`
- `uv run --isolated --extra dev --extra ov -- make -C docs current-docs
SPHINXOPTS=-q`
- `SKIP=check-changelog-fragments uv run --frozen isaaclab -f` (all
applicable hooks passed; no source package changed)
- `git diff --check`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the applicable pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] No source package changed, so no changelog fragment is required
- [ ] I have added my name to `CONTRIBUTORS.md` or my name already
exists there
This automated draft updates CI to the current Isaac Sim nightly image.

| Field | Value |
|---|---|
| Image | `nvcr.io/0947644777160149/internal/isaac-sim` |
| Moving tag | `latest-develop` |
| Current pin |
`latest-develop@sha256:0bd319db2e50e667e75abf897ec48c2315e6707fed4faa6bb514bf393e537f8a`
|
| Candidate pin |
`latest-develop@sha256:b6222dffc0182e82f49d656d08dabdfb6a279e368a478cbd38080bbe959bb2ba`
|

Source:
https://registry.ngc.nvidia.com/orgs/0947644777160149/teams/internal/containers/isaac-sim/tags

New PRs are opened as drafts so maintainers can merge after the CI
results are acceptable.

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

---------

Co-authored-by: isaaclab-bot[bot] <282401363+isaaclab-bot[bot]@users.noreply.github.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

`test-contrib-environments` failed on #7610 (run
[34042243157](https://github.com/isaac-sim/IsaacLab/actions/runs/34042243157/job/101511058208))
in `test_contrib_environments[IsaacContrib-DrLegs-Walk]` with
`AssertionError: Invalid data` on the policy observation. The PR itself
only touched `source/isaaclab/test/install_ci`, so this is unrelated to
that change.

**Root cause.** The first row of the failing observation is NaN across
projected gravity, base angular velocity and joint positions, i.e. the
robot state itself is non-finite, not a single observation term.
Reproducing the test scenario locally (2 envs, 20 random-action steps,
fresh env per seed) shows the Kamino P-ADMM solver diverging
mid-episode: in 1 of 12 seeds the entire state of env 0 (root position,
root quaternion, joint positions and velocities) turns NaN at step 6.
The heading-driven velocity command then inherits the NaN through
`heading_w`, and the `root_height` / `bad_orientation` termination terms
cannot fire because every comparison against NaN is false, so the
episode is never reset. The sibling `IsaacContrib-DrLegs-HoldPose` task
(same robot, same solver preset, same random actions) stayed finite in 9
of 9 local trials and passed in the same CI job, as did the deprecated
alias id of the Walk task, which is why the failure is intermittent
rather than deterministic.

**Change.** Add `DrLegs-Walk` to `_SKIPPED_TASK_SUBSTRINGS` in
`test_contrib_environments.py` with the reason documented inline. The
substring covers both `IsaacContrib-DrLegs-Walk` and its deprecated
alias `Isaac-DrLegs-Walk-v0`, which the test also enumerates. HoldPose
keeps running. This is a test-side skip; the solver instability itself
needs to be addressed in Kamino/Newton (or by retuning the DR Legs
solver preset), and the inline comment says to re-enable once that
lands.

## Validation

- Reproduction script (launches once, rebuilds the env per seed, mirrors
`env_test_utils._run_environments`): Walk 1/12 seeds NaN at step 6 with
root pose, joint state and the velocity command all non-finite; HoldPose
0/9.
- `pytest
source/isaaclab_tasks/test/contrib/test_contrib_environments.py -k
DrLegs-Walk -rs`: both ids report `SKIPPED ... Kamino solver
intermittently produces NaN robot state under random actions.`; HoldPose
ids still collect as runnable.
- Ruff and ruff-format pass; `isaaclab_tasks` changelog `.skip` fragment
included.

## Type of change

- Test fix (non-breaking)

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Published checkpoint lookup included the task, physics backend, renderer
backend, and RL library, but ignored domain presets. As a result, a
depth policy could not be found and an unsuffixed RGB policy could be
selected for an incompatible preset.

This change:

- adds non-default domain presets to the canonical checkpoint filename;
- keeps aliases of the default preset, such as RGB, on the existing
unsuffixed filename;
- derives the selection centrally from the existing preset overrides,
covering all checkpoint consumers;
- declares the published Cartpole depth checkpoint and disables the
environment-browser pretrained option for undeclared preset selections.

No new dependencies.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] Backport this pull request to the active release branch after it
merges into develop

## Screenshots

Not applicable; the UI change disables the existing
pretrained-checkpoint checkbox for unsupported preset selections.

## Validation

- 17 existing/new pretrained-checkpoint tests passed.
- 28 existing/new environment documentation tests passed.
- Environment browser generation check passed for 137 registered
training environments.
- Ruff lint and formatting hooks passed on all touched Python files.
- The repository-wide format command passed every hook except the
changelog-fragment comparison, which reports pre-existing develop/base
differences in unrelated isaaclab_newton, isaaclab_experimental,
isaaclab_tasks, and isaaclab_visualizers files.

## Checklist

- [x] I have read and understood the contribution guidelines
- [ ] I have run the complete pre-commit checks without unrelated base
failures
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added a changelog fragment for every touched package
- [x] My name already exists in CONTRIBUTORS.md
# Description

Fixes NVBug 6684415.

The three contrib stack tasks that configure a PhysX `SurfaceGripper`
now select CPU simulation by default, and config validation rejects an
explicit unsupported GPU override before simulator initialization. The
zero and random agent entrypoints now preserve a task-defined simulation
device unless the user explicitly passes `--device`, allowing
`AppLauncher` to start these tasks on CPU automatically.

The public `parse_env_cfg` helper also preserves the registered task
device when its `device` argument is omitted, while continuing to apply
explicit device overrides. This also corrects the two UR10 suction
configs, which previously assigned `self.device` instead of
`self.sim.device`.

No new dependencies are required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Testing

- `uv run --isolated --frozen --extra test --extra teleop python -m
pytest source/isaaclab_rl/test/test_entrypoints.py
source/isaaclab_tasks/test/core/test_parse_cfg.py
source/isaaclab_tasks/test/contrib/stack/test_surface_gripper_task_cfg.py
-q` (`44 passed, 2 skipped`)
- `uv run --frozen isaaclab -f`
- `uv run --frozen python tools/changelog/cli.py check develop`
- Verified the task-config regression test fails against the reported
3.0 commit because all three affected tasks resolved to `cuda:0`.
- Verified the `parse_env_cfg` regression against the first PR revision:
the omitted device resolved back to `cuda:0` and failed CPU-only
validation.

The full Isaac Sim smoke test was attempted in a fresh environment but
stopped at the interactive Omniverse EULA prompt before Kit startup.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab -f`
- [x] I have confirmed that no documentation or environment-browser
selector change is required
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`
Bumped packages:
- isaaclab: 24.0.0 → 24.1.0
- isaaclab_newton: 6.1.1 → 6.2.0
- isaaclab_ov: 3.0.2 → 3.1.0
- isaaclab_physx: 7.0.1 → 7.1.0
- isaaclab_rl: 0.17.0 → 0.17.1
- isaaclab_tasks: 20.1.0 → 20.1.1
- isaaclab_visualizers: 1.10.2 → 1.10.3
# Description

Reduces common Direct Locomotion task overhead used by Ant and Humanoid
without introducing the experimental Ant post-step path.

The change:

- stages effort targets once per environment step because articulation
command buffers persist across decimation substeps;
- uses the cached all-joint target path instead of repeatedly uploading
joint indices;
- keeps scalar zero assignments on-device;
- removes a duplicate articulation reset already performed by the scene
reset;
- removes redundant clones after advanced indexing; and
- uses the common fused joint-state writer provided by PhysX, Newton,
and Isaac Lab OV.

The isolated device scalar change improved the Ant host-return
measurement from 3.433 ms to 3.231 ms. The remaining changes remove
repeated launches, index transfers, copies, and reset writes; the larger
fused post-step and device-mask work is deliberately excluded.

This is one focused slice of superseded Draft PR #6509 and is
independent of benchmark PR #6474.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv run python tools/changelog/cli.py check develop`
- `uv run --frozen isaaclab -f`
- `uv run --frozen --extra test python -m pytest
source/isaaclab_tasks/test/core/test_environments_newton.py -k 'Direct
and (Ant or Humanoid)' -q` (`2 passed`)
- Verified the fused writer interface on PhysX, Newton, and Isaac Lab
OV.
- The source change was exercised by the original focused CPU/CUDA
validation before the PR split; new test files are intentionally omitted
from this slice.

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation (not
required for this internal performance fix)
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description
Small additive updates for leapp.
1. Pins the leapp version to latest 0.6.1 which improves robustness for
slicing operations. Previously this wasn't supported but now new
features should automatically enable more types of operations.
2. Adds graph level expected frequency to leapp yaml. This change helps
downstream deployment set default frequency based on training configs.
3. Adds the Isaac Lab env.yaml to the exported leapp bundle for
convenience. Isaac sim 6.2 will add leapp controller features. the
env.yaml is required to set things up. This will make porting the policy
and its environment much more convenient.

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- New feature (non-breaking change which adds functionality)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

Fixes #6475.

This change makes Python import-path configuration consistent across
Isaac Lab source checkouts, installed packages, and generated external
projects, including both VS Code/Pylance and Cursor/basedpyright.

The configuration is split by ownership:

- Checked-in Pyright policy lives in `pyproject.toml`.
- Machine-specific paths are written to a git-ignored
`pyrightconfig.json` that extends the project policy.
- VS Code settings retain interpreter and editor behavior without
defining a competing `python.analysis.extraPaths` value.

The shared `isaaclab.utils.editor` utility discovers:

- Isaac Sim extension paths from the selected installation.
- Isaac Lab monorepo packages under `source/*`.
- Standard downstream packages under a `src` layout.
- Isaac Lab packages visible to the active interpreter, covering
editable and wheel installs.

The repository setup script and installed-package workflow now use that
shared utility. The template generator copies the canonical setup
wrapper instead of maintaining a second implementation, and the
generated `pyproject.toml`, README, tests, and documentation are aligned
with the new single-package uv `src` layout introduced on `develop`.
Invalid explicit `--isaac_path` values now fail clearly rather than
silently selecting another installation.

No new runtime dependency is required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv run pytest source/isaaclab_rl/test/test_template_generator.py
source/isaaclab/test/cli/test_installed_workflow_entrypoints.py -q` — 34
passed
- `uv run pytest --confcutdir=tools/template tools/template/test_cli.py
-q` — 7 passed
- `uv run pytest source/isaaclab/test/cli/test_wheel_builder_metadata.py
-q` — 11 passed
- Pyright 1.1.411 configuration check — 0 errors and 0 warnings
- `uv run isaaclab -f` — passed, including changelog validation against
the current upstream `develop`
- `uv run --isolated --extra dev -- make -C docs current-docs` —
warning-free build passed

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

`conda install -c nvidia cuda-toolkit=12.8` now pulls in a GCC 14
toolchain (the defaults channel jumped from GCC 11 to 14). This
documentation change adds a small command fix.

## Type of change

- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaacsim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Fix three failures in the documented template-generator workflows:

- Pin generated external projects and their optional extras to the exact
Isaac Lab version that ran the generator. This prevents `uv sync` from
silently selecting an older prerelease whose CLI may do nothing and
return success.
- Let the repository environment-listing script run without constructing
`AppLauncher`, so task and preset discovery works in the default
Kit-less environment.
- Document the explicit non-PPO agent entry point for generated internal
tasks while retaining automatic selection when the task exposes one
unambiguous agent configuration.

No new dependencies are required.

Internal bug: NVBug 6695420 validation follow-up.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv run --frozen python -m pytest --confcutdir=tools/template
tools/template/test_cli.py -q` — 7 passed
- `uv run --frozen python -m pytest --confcutdir=tools/test
tools/test/test_list_envs.py -q` — 1 passed
- `uv run --frozen python -m pytest --confcutdir=source/isaaclab_tasks
source/isaaclab_tasks/test/core/test_preset_cli.py -q` — 31 passed
- `uv run --frozen python -m pytest --confcutdir=source/isaaclab
source/isaaclab/test/cli/test_installed_workflow_entrypoints.py -q` — 10
passed
- `uv run --isolated --extra dev -- make -C docs current-docs` — passed
without warnings
- `uv run --frozen isaaclab -f` — passed

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added focused tests that prove the fixes are effective
- [x] No package changelog fragment is required because no
`source/<package>/` code changed
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

This PR bundles four fixes for issues found:

1. 6684416: **RTX renderer: fix crash on not-yet-warmed-up annotator
buffers.** `IsaacRtxRenderer.render()` unconditionally trimmed the tiled
buffer to 2/3 channels for
`motion_vectors`/`normals`/`SIMPLE_SHADING_MODES`/`RGB_HDR`. Immediately
after an annotator is attached (e.g. at env creation, before the RTX
renderer has pumped a frame), Replicator can momentarily return a buffer
whose channel dimension is 0. Warp's array slicing rejects trimming an
already-empty dimension (unlike NumPy, which allows it), raising
`RuntimeError: Invalid indexing in slice: 0:0:1`. Guard the trim and
skip writing that data type for the frame instead of crashing.
2. 6683697: **`robust_eval.py`/`play.py`: pass `enable_cameras=True`
explicitly.** `release/3.0.0` removed the `--enable_cameras` CLI flag
and the `ENABLE_CAMERAS` env-var fallback from `AppLauncher` in favor of
`launch_simulation()`'s scene-scan auto-detection, but these two
robomimic scripts still use the legacy `AppLauncher(args_cli)` pattern
and were never migrated. Without cameras enabled, and with the old
explicit "pass --enable_cameras" guard in `IsaacRtxRenderer.__init__`
also removed in this release, the failure now surfaces as an opaque
`ValueError: Invalid object in Py_Graph in getWrappedGraphFromNode` deep
inside OmniGraph/SyntheticData. Pass `enable_cameras=True` explicitly,
matching the pattern already used in `generate_dataset.py`.
3. 6683610: **Docs: add `uv run` examples for the HDF5/MP4 conversion
and merge tools.** The Augmented Imitation Learning doc recommends `uv`
as the primary workflow throughout (dataset generation, training, eval
all show a "uv (Recommended)" tab), but the `hdf5_to_mp4.py`,
`mp4_to_hdf5.py`, and `merge_hdf5_datasets.py` examples only showed a
bare `python ...` invocation with no indication of which
environment/extras to use. Added matching `uv (Recommended)` /
`isaaclab.sh` tab-sets (`--extra mimic`, since these tools only need
`h5py`/`opencv`/`numpy`, no Isaac Sim import).
4. 6702683: **RTX renderer: fail fast on oversized tiled camera
buffers.** `IsaacRtxRenderer.render()` flattens every environment's
camera tile into one Warp array per data type. Warp requires every array
dimension to fit in a signed 32-bit int, so a large enough `num_envs *
resolution` combination overflows that limit and crashes deep inside
`render()`'s `.flatten()` call with `ValueError: Array shapes must not
exceed the maximum representable value of a signed 32-bit integer, got
2621440000 in dimension 0` and no indication of what to change. Compute
the worst-case tiled buffer size upfront in `create_render_data()` and
raise a clear error naming the offending env count/grid/resolution and
suggesting to reduce `--num_envs` or camera resolution. This does not
lift the underlying Warp/RTX limit — it only replaces the opaque failure
with an actionable one.
  
## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`
    
## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Complete preset-aware pretrained checkpoint support for
feature-extractor policies on `Isaac-Cartpole-Camera`.

- Advertise every feature-agent preset supported by the preferred RSL-RL
workflow in the checkpoint publication matrix. The currently registered
feature presets are `resnet18` and `theia_tiny`.
- Flatten arbitrary multi-dimensional frozen image-encoder outputs after
the environment batch dimension. This is a no-op for ResNet18's
already-flat output and converts Theia-Tiny's token output from
`(num_envs, 36, 192)` to the flat observation required by the MLP
policy.
- Validate checkpoint metadata registry-wide: workflows must be
registered, presets must be unique, and every advertised preset must be
a real domain preset.
- Derive the Cartpole coverage assertion from
`agent_preset_compatibility`, so adding a future feature preset without
checkpoint publication metadata fails CI.
- Regenerate the environment browser so supported pretrained feature
presets are visible.

The mechanism is not tied to the two QA commands: #7594 provides generic
preset-aware naming/lookup/publication, while this PR covers arbitrary
feature encoder shapes and future feature-preset registry additions.
Other raw camera/rendering/domain presets remain explicit opt-ins
because each advertised entry requires a compatible trained artifact.

This builds on the agent preset selection fixed by #7532 and the
checkpoint naming/lookup fixed by #7594. Both are merged.

Addresses NVBug 6675381.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- Regression test failed on merged `develop`: encoder output remained
`torch.Size([4, 6, 8])` instead of `(4, 48)`.
- `.venv/bin/python -m pytest
scripts/tools/test/test_train_and_publish_checkpoints.py
source/isaaclab/test/envs/test_stacked_image_mdp.py
source/isaaclab_rl/test/test_pretrained_checkpoint.py -q` — 44 passed.
- `UV_FROZEN=1 uv run isaaclab -f` — passed.
- `uv run python tools/changelog/cli.py check develop` — passed.
- `uv run --isolated --extra test -- make -C docs current-docs` —
generated the updated browser and completed all pages, but exited 2
because the local isolated environment reports 44 pre-existing
import/reference warnings as errors (including unavailable `ovstage` and
`isaaclab_ppisp` modules). The PR docs CI is the authoritative
warning-free build.
- ResNet18 and Theia-Tiny RSL-RL policies trained for 1,638,400 steps
each with local Isaac Sim 6.1 and reached mean episode lengths of 222.25
and 177.00, respectively (benchmark threshold: 150).
- Both checkpoints loaded and reached policy playback; Theia-Tiny used
the corrected flattened observation size of 6,912.
- Both default Newton MJWarp/Newton renderer artifacts are present on
the internal Nucleus server under the exact preset-aware filenames:
- `rsl_rl/Isaac-Cartpole-Camera_resnet18_newtonmjwarp_newton_rsl_rl.pt`
— 6,985,267 bytes, SHA-256
`13cbec819675809d6904c57d68a20d7c7d92d283999502509e8fd8da006099f8`
-
`rsl_rl/Isaac-Cartpole-Camera_theia_tiny_newtonmjwarp_newton_rsl_rl.pt`
— 43,450,675 bytes, SHA-256
`9f75a2069bdec9bd06f888b9264da3ad664d3707fa038cf09929045ce5b526c0`

## Artifact coverage

The uploaded pair covers the default Newton MJWarp/Newton renderer
selection. The generic core publication matrix also schedules both
feature presets for these additional supported backend/renderer pairs,
whose artifacts still need to be trained and published for full
cross-backend coverage:

- PhysX / RTX
- PhysX / Newton renderer
- Newton MJWarp / RTX

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`
#7647)

# Description

KitVisualizationMarkers.visualize() re-resolved and re-authored the
primvars:omni:scenePartition token array on every call. Marker ownership
is static in most tasks, but visualize() runs every frame — and
ObjectUniformPoseCommand._update_metrics() calls it independently of
debug_vis. At 4096 envs, every frame paid a device synchronization, a
4096-entry tuple rebuild, and 4096 token strings for a value that never
changed. Isaac-Lift-KukaAllegro-Camera has two such instancers
(SuccessMarkers, ObservationPointCloud).

This caches the resolved tokens, the tensor they came from, and the
tokens currently authored, so the primvar is rebuilt only when the
environment IDs change. The partition-active probe caches its positive
result; a negative one is still re-checked, since markers can be created
before the renderer prepares the stage.


Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- As a practice, it is recommended to open an issue to have
discussions on the proposed pull request.
This makes it easier for the community to keep track of what is being
developed or added, and if a given feature
is demanded by more than one party. -->

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Benchmark Results

Measured on `Isaac-Lift-KukaAllegro-Camera` (4096 envs, `duo_camera`
preset, single L40 GPU), 200-step `isaaclab benchmark runtime` run
before vs. after this commit on top of `develop` (25fad3e):

| Metric | Before | After | Change |
| --- | --- | --- | --- |
| Mean Total FPS | 3773.4 | 4270.6 | **+13.2%** |
| Mean Iteration Time | 1085.5 ms | 959.1 ms | -11.6% |
| Max Total FPS | 4284.9 | 4703.1 | +9.8% |
| GPU Utilization | 28.6% | 37.3% | +8.7 pts |
| Scene Creation Time | 295.9 s | 282.0 s | -4.7% |

Single run per side, but well outside the ~150-180 FPS std-dev band
reported within each run. Confirms the throughput improvement claimed
above for this task's SuccessMarkers/ObservationPointCloud instancers.

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

Updates the CUDA-enabled PyTorch commands in the Isaac Lab Python
package installation workflow to use `uv pip`, matching the uv-based
environment setup. The managed conda workflow continues to render
`python -m pip`.

No new dependencies are required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] Backport this pull request to the active release branch after it
merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv run --isolated --extra dev -- sphinx-build -W --keep-going -j auto
docs <temporary-output-directory>` — passed without warnings.
- Verified the rendered Python-package commands use `uv pip` for Linux
x86_64, Windows x86_64, and Linux aarch64.
- `uv run isaaclab -f` — all applicable formatting and documentation
hooks passed. The repository-wide changelog hook reports unrelated
existing `develop` discrepancies in packages untouched by this docs-only
change.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the applicable pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] No source package was changed, so no changelog fragment is
required
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

Improve the environment browser by presenting related task variants as
visual cards and making task capabilities easier to discover.

This change:

- groups manager-based, direct, camera, and direct-camera variants into
one card
- adds preview images and physics, renderer, and RL capability badges
- supports searching by task name or capability
- moves the Core, Contrib, and Warp scope selector alongside the task
filters
- updates responsive styling for the new card layout

No additional dependencies are required.

## Type of change

- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not included; the rendered documentation preview shows the updated card
layout.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the formatting and pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (no source
packages are touched)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…les demo (#7652)

# Description

Deformable objects in the Newton VBD deformables demo passed through the
ground plane, and cloth sheets were occasionally launched several metres
into the air. Two causes:

- Collision ran once per 10 ms tick with no continuous collision
detection, while objects dropped from up to 3.5 m cross the 18 mm
contact detection band within a single tick. The plane was missed during
the crossing tick and the penalty force resolved on the next one,
ejecting the object.
- Young's modulus was sampled up to 1e8 Pa, far stiffer than the contact
penalty can resist, so the elastic response overwhelmed the ground
contact and vertices ended up below the plane.

This sets `collision_decimation` to 1 so the collision pipeline re-runs
on every solver substep, caps the sampled Young's modulus at 1e7 Pa, and
raises the VBD iteration count to 20. Only affects `--physics
newton_vbd`; the PhysX paths are unchanged.

Measured over 6 s with two seeds, the stiffness and iteration changes
alone still left 5 objects stranded in the air (one cloth at 3.27 m,
another at 0.53 m, a volume deformable at 1.43 m). With
`collision_decimation = 1` every object settles on the plane and
worst-case penetration drops from 51 mm to 29 mm.

Fixes nvbugs 6201420

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Forward-ports #7633 from `release/3.0.0` to `develop`.

`VideoRecorder` logs the Kit/Newton "requires cubric" warning from
`_frame_from_visualizer()`, which is called on every captured frame.
Because the condition is fixed recorder configuration state, repeating
the warning once per frame floods the terminal without adding
information.

This change adds a per-recorder guard so the warning is emitted on the
first applicable capture only. Frame capture continues on every frame,
the warning text is unchanged, and each independent recorder still emits
its own warning.

The original commit by @klakhi is preserved. The test also covers a
second recorder instance, addressing the review feedback on #7633.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

Existing release PR: #7633

## Screenshots

N/A — console-output behavior only.

## Validation

- Regression test on unmodified `upstream/develop`: failed as expected
with 6 warnings instead of 2.
- `PYTHONPATH=source/isaaclab:source/isaaclab_visualizers uv run
--no-project --with pytest --with numpy --with torch --with gymnasium
--with lazy-loader --with warp-lang --with 'moviepy<2' python -m pytest
source/isaaclab/test/envs/test_video_recorder.py -q` — 33 passed.
- Changelog fragment gate — passed against the current
`upstream/develop`.
- `uv run --no-project --with-editable ./source/isaaclab --with
pre-commit isaaclab -f` — passed all hooks.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation (none
required; no public API or documented behavior changed)
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] The original contributor already exists in `CONTRIBUTORS.md`

---------

Co-authored-by: Krishna Lakhi <klakhi@nvidia.com>
…positioned (#7650)

…itioned

# Description

QA reported that after pressing `R` during SO-101 leader-arm joint
teleoperation
(`IsaacContrib-Stack-Cube-SO101-Joint-Teleop-v0`), the environment
resets but
teleoperation appears to "stop working" and the robot no longer responds
to the
  physical leader arm.

This is expected, not a bug: pressing `R` calls `reset(pause=True)`,
which resets
the environment **and** pauses teleoperation until the operator presses
`B` to
resume. This task's joint-teleop pipeline mirrors the leader arm's raw
joint
angles onto the follower with no re-anchoring or clutch, so resuming
immediately
after a reset -- without first moving the physical leader arm back to
match the
follower's reset pose -- would command an instantaneous, large joint
motion on
the follower. The pause exists specifically to give the operator a
chance to
  reposition the leader arm safely before resuming.
 
This behavior was previously undocumented. This PR adds a note
explaining it,
placed directly after the keyboard-shortcuts table in the SO-101 example
section
  of the teleop docs.

Fixes # (issue)

## Type of change

- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
kellyguo11 and others added 22 commits September 15, 2026 00:20
# Description

The released aggregate wheel currently copies all root optional
dependencies into its metadata. The pinned RL-Games and Robomimic
integrations are Git requirements and do not provide package-index
wheels, so they cannot be included in the released PyPI package.

This change keeps both integrations available in source checkouts while
making the aggregate wheel metadata publishable:

- omit the `rl-games` extra and its transitive helper requirements from
generated wheel metadata;
- remove the `robomimic` requirement from the wheel-only `mimic` extra
while retaining Isaac Lab Mimic;
- document that RL-Games and Robomimic require a source checkout; and
- add regression coverage for the generated metadata.

No new dependencies are required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

A direct cherry-pick PR for `release/3.0.0` is being opened alongside
this PR.

## Validation

- `PYTHONPATH=source/isaaclab uv run --no-project --with pytest --with
rich --with toml python -m pytest
source/isaaclab/test/cli/test_wheel_builder_metadata.py -q` (11 passed)
- `uv run --no-project --with ruff ruff check
tools/wheel_builder/gen_pyproject.py
source/isaaclab/test/cli/test_wheel_builder_metadata.py`
- `uv run --no-project --with ruff ruff format --check
tools/wheel_builder/gen_pyproject.py
source/isaaclab/test/cli/test_wheel_builder_metadata.py`
- `uv run --no-project python tools/changelog/cli.py check` against
`upstream/develop`
- `bash tools/wheel_builder/build.sh`; inspected the built wheel
METADATA and confirmed it has neither the `rl-games` extra nor
`rl-games`/`robomimic` requirements
- Sphinx rendered the changed installation page successfully in a
lightweight macOS docs environment. The repository lockfile excludes
macOS, so the complete warning-free docs environment is left to Linux
CI.

## Screenshots

Not applicable.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the applicable pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added a changelog fragment under
`source/isaaclab/changelog.d/`
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

Update the Docker documentation to use the Isaac Lab 3.0.0 RC1 release
images:

- `nvcr.io/nvidia/isaac-lab:3.0.0-rc1`
- `nvcr.io/nvidia/isaac-lab:3.0.0-rc1-kitless`

Also update the OSMO workflow default so it matches the documented
container image, and refresh the stale editable-package versions in
`uv.lock`. Wheel installation remains version-independent.

## Type of change

- Documentation update
- Lockfile maintenance

## Release backport

- [x] Backport this pull request to the active release branch after it
merges into `develop`

## Validation

- [x] `git diff --check`
- [x] `uv lock --check` (436 packages)
- [x] Running `uv lock` produces no further lockfile changes
- [x] Wheel installation files match `upstream/develop`
- [ ] Full repository formatting/docs build (the uv lock excludes this
macOS host)

## Checklist

- [x] I have read and understood the contribution guidelines
- [ ] I have run the pre-commit checks locally
- [x] I have made corresponding changes to the documentation
- [x] Tests are not applicable to this documentation and
generated-lockfile update
- [x] No source package was touched, so no changelog fragment is
required
- [x] My name already exists in `CONTRIBUTORS.md`
## Summary

Ports the focused security updates from internal MR7 onto develop.

- Updates GitPython, Pillow, and PyArrow security selections and
refreshes the lockfile.
- Installs a checksum-verified Git LFS 3.8.0 executable in both
container images.
- Adds offline regression coverage for dependency pins and the Git LFS
installer.
- Includes the IsaacLab changelog fragment.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] Backport this pull request to the active release branch after it
merges into develop

A matching release/3.0.0 PR is being opened directly because both
security branches were explicitly requested.

## Validation

- Nine security dependency tests pass.
- pyproject.toml and uv.lock parse successfully.
- Git LFS installer passes bash syntax validation.
- Focused pre-commit hooks pass.

## Checklist
- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding changelog changes
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added a changelog fragment for the touched package
- [x] My name already exists in CONTRIBUTORS.md

Co-authored-by: Sheikh Dawood <sabdulajees@nvidia.com>
…ns (#7805)

## Summary

- Ports the SonarQube and security hardening changes from internal MR6
onto current `develop`.
- Rejects legacy pickled actuator checkpoints before deserialization and
requires TorchScript archives.
- Hardens CI command argument handling and MDL import parsing.
- Pins RL-Games to `02d1958`, where Ray and Weights & Biases are
optional dependencies.
- Adds an explicit IsaacLab `wandb` extra while keeping Ray and W&B out
of the default `all` container installation.

## Validation

- `uv lock --check`
- Verified `--extra all` exports RL-Games without Ray or W&B.
- Verified `--extra wandb` exports W&B explicitly.
- Built the RL-Games wheel and verified its metadata marks `ray` and
`wandb` as extras only.
- Ruff, Ruff format, YAML, TOML, codespell, security, shell syntax, and
Python compilation checks passed.
- GPU/runtime actuator tests require Linux/Windows CI; the project lock
does not support this macOS host.

## Type of change

- Bug fix (non-breaking change except that unsafe legacy pickle actuator
checkpoints must be converted to TorchScript)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run formatting and lint checks
- [x] My changes generate no new warnings
- [x] I have added a regression test for unsafe checkpoint
deserialization
- [x] I have added the required changelog fragment
- [x] My name already exists in `CONTRIBUTORS.md`

---------

Co-authored-by: Sheikh Dawood <sabdulajees@nvidia.com>
# Description

`--video` enabled a headless Kit visualizer and continuous PhysX Fabric
transform updates for the full training run, even though frames are only
needed during capture windows. This caused a substantial FPS drop
between recordings.

This change treats headless visualizers as on-demand rather than
continuous renderers, disables continuous Fabric synchronization after
PhysX initialization, and synchronizes transforms immediately before
each visualizer frame capture. RTX camera sensors explicitly retain
continuous Fabric updates.

### RTX 5090 benchmark

`Isaac-Humanoid-Direct`, PhysX, 4,096 environments, RSL-RL, 16
iterations. Idle results exclude iterations 0 and 10, which contain the
two scheduled 32-frame capture windows.

| Configuration | Mean idle FPS | Difference |
| --- | ---: | ---: |
| Plain headless | 360,635 | — |
| Offscreen RTX enabled, no video recorder | 326,336 | -9.5% vs. plain
headless |
| Periodic `--video` with this fix | 315,966 | -3.2% vs. offscreen RTX
control |

The unfixed periodic-video run reproduced approximately 214,300 FPS
between captures, about 34% below its plain-headless control. With this
fix, most of that avoidable idle-window regression is removed. Capture
iterations still drop as expected; the fixed periodic run measured
76,127 and 135,151 FPS during its two capture iterations, with 289,675
FPS overall including both captures.

No new dependencies are required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable; this is a performance fix. A frame probe on the RTX 5090
verified that all 20 captured frames were non-black and changed over
time (`temporal_std=72.21`, mean consecutive delta `12.46`).

## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation (not
applicable; no public API or user workflow changed)
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

### Validation

- `uv run --frozen --extra test --extra rerun python -m pytest
source/isaaclab/test/sim/test_simulation_context_visualizers.py
source/isaaclab/test/envs/test_video_recorder.py -q` — 74 passed
- `uv run --frozen isaaclab -f` — all hooks passed
- `source/isaaclab/test/sensors/test_camera.py::test_camera_init` —
passed on RTX 5090
## Description

Warn when the deprecated `isaaclab.sh` wrapper is invoked and direct
users to `uv run isaaclab`.

Warn users when legacy RSL-RL configuration fields are migrated at
runtime; this compatibility support will end in Isaac Lab 3.1.

## Type of change

- Documentation update

## Release backport

- [ ] Backport this pull request to the active release branch after it
merges into `develop`

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit formatting and lint checks
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

## Validation

- `uv run python -m pytest
source/isaaclab_rl/test/test_rsl_rl_cfg_deprecation.py`
- `uv run isaaclab -f` (all formatting and lint hooks passed; the
changelog gate reports unrelated baseline changes)
## Description

Implicit actuators on the standard ovphysx path submitted their PD
effort estimate as an additional joint force while native joint drives
remained enabled. Submit the processed effort command so implicit joints
receive only their feedforward effort, while explicit joints retain
their computed motor output. This matches the existing PhysX adapter.

Extend the existing tests to cover both actuator execution paths and
reordered implicit joints, including force readback, native gains and
effort telemetry. Refresh the Shadow Hand and Kuka motion-vector golden
images to match the corrected implicit-actuator motion.

## Type of change

- Bug fix

## Validation

- The original selector fails the ordinary mixed-actuator GPU case and
the reordered implicit CPU/GPU cases at the force assertions. The native
actuator case already passes.
- All four focused cases pass with the corrected selector, using
separate CPU and GPU processes.
- The base commit passes both motion-vector comparisons. With the
corrected selector, both cases fail against the old goldens and pass
against the refreshed images at the existing 3% pixel threshold. The
refreshed images reproduce the CI outputs byte-for-byte.
- Formatting and changelog checks pass.

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read the contribution guidelines.
- [x] I have run the pre-commit checks with `uv run isaaclab -f`.
- [x] I have added regression coverage and a package changelog fragment.
- [x] My name already appears in `CONTRIBUTORS.md`.

---------

Co-authored-by: marcodiiga <1969828+marcodiiga@users.noreply.github.com>
Bumped packages:
- isaaclab: 24.2.1 → 24.2.2
- isaaclab_ov: 3.1.1 → 3.1.2
- isaaclab_rl: 0.17.4 → 0.17.5
…http (#7835)

# Description

Ports the supply-chain hardening from internal MR !8 onto the current
`develop` branch and updates the remaining compatible web dependency
selection.

- installs CI contract-test tools from a complete hash-locked,
wheel-only requirements file
- restricts Git LFS downloads and redirects to HTTPS
- preserves the newer uv-based cuRobo build, which no longer downloads
or executes `get-pip.py`
- raises Starlette to `>=1.3.1`
- pins aiohttp to `==3.14.1` to match `isaacsim-kernel==6.1.0.0`
- adds dependency-selection and supply-chain regression coverage


## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- Docker/security contract tests: 50 passed, 12 subtests passed
- Full pre-commit suite passed
- Changelog fragment validation passed
- `uv lock --check` passed
- Independently verified the pinned `get-pip.py` digest used by the
release implementation

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] Documentation is not required for this dependency and CI hardening
change
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added a changelog fragment for the affected package
- [x] My name already exists in `CONTRIBUTORS.md`

---------

Co-authored-by: Sheikh Dawood <sabdulajees@nvidia.com>
## Description

Updates the `rsl-rl-lib` pin from 5.4.1 to 5.5.1 and removes the
redundant direct `onnxscript` dependency, which RSL-RL already provides.

This is the dependency-only portion of #7784; no compatibility shims,
tests, or runtime code are changed.

## Type of change

- Dependency update

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv lock --check`
- `uv run isaaclab -f`
- `uv run python -m pytest
source/isaaclab_rl/test/test_rsl_rl_cfg_deprecation.py -q` (39 passed)

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] Documentation changes are not required for this dependency-only
update
- [x] My changes generate no new warnings
- [x] Existing compatibility tests cover this dependency-only update
- [x] A changelog fragment is not required because no source package is
changed
- [x] My name already exists in `CONTRIBUTORS.md`
## Description

The environment browser currently requests preview images from flattened
documentation paths that do not exist. Its MP4 previews are also Git LFS
objects, so multi-version documentation deployments can serve pointer
text instead of decodable video.

This change:

- serves task preview images from the Isaac Sim S3-backed download host
while preserving their `tasks/...` paths;
- removes the 93 task preview JPEGs from the repository;
- resolves the four existing MP4 previews from their actual
`_static/tasks/previews` directory;
- falls back to the task image when a preview video cannot be loaded or
decoded; and
- remembers failed video URLs so later control changes do not expose the
broken video again.

For example, the Cartpole fallback now loads from:


`https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/tasks/classic/cartpole.jpg`

The S3 objects must be uploaded under `isaaclab/images/tasks/` before
this PR is ready to merge.

Supersedes #7814.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Validation

- `node --check docs/source/_static/css/environment-browser.js`
- `uv run --extra test python -m pytest --noconftest
tools/test/test_environ_docs.py` (35 passed)
- `uv run --isolated --extra dev -- make -C docs current-docs`
(succeeded without warnings)
- `uv run isaaclab -f` (all hooks passed)
- Verified the upload archive contains all 93 task preview JPEGs and all
65 unique browser image paths

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] Existing environment documentation tests pass
- [x] No source package was touched, so no changelog fragment is
required
- [x] My name already exists in `CONTRIBUTORS.md`

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…y tasks (#7520)

## The problem

`ArticulationData._sim_bind_joint_pos` is bound straight to
`ArticulationView.get_dof_positions()`:

```python
# isaaclab_newton/assets/articulation/articulation_data.py:1594
self._sim_bind_joint_pos = self._root_view.get_dof_positions(SimulationManager.get_state_0())[:, 0]

# newton/_src/utils/selection.py:1587
def get_dof_positions(self, source):
    """Get the joint coordinate positions (DoF positions) ..."""
    return self._get_attribute_values("joint_q", source)
```

The name says DOF, the return is `joint_q` which is coordinate space.
Newton (like MuJoCo) stores a
ball joint as a 4-component unit quaternion against 3 DOFs, so for an
articulation containing one the
array is wider than `num_joints`, while `joint_names`, `joint_vel`,
`default_joint_pos` and every
joint gain stay in DOF space. On Agility Digit (6 ball joints) that is
**56 coordinates against 50
DOFs**.

PhysX is unaffected: its articulations are reduced-coordinate, a
spherical joint is 3 scalars,
`nq == nv`, and the string `joint_q` does not appear anywhere in
`isaaclab_physx`. The MDP layer was
written against that assumption and the Newton backend inherited it
without a conversion.

IsaacLab addresses joints by DOF index everywhere in `joint_names`,
`find_joints`,
`SceneEntityCfg.joint_ids`, so both directions break, and they break
silently.

### Reads

Every MDP term indexes both arrays with the same ids:

```python
# isaaclab/envs/mdp/rewards.py:186
asset.data.joint_pos.torch[:, asset_cfg.joint_ids] - asset.data.default_joint_pos.torch[:, asset_cfg.joint_ids]
```

The two arrays are in different spaces, so past the first ball joint
they refer to different joints.
On Digit `joint_pos[13]`, `left_leg_knee`, reads a quaternion `w`, which
barely leaves 1.0, so the
knee angle never reaches the policy or the rewards.
`sync_torque_telemetry` carries the same offset.

### Writes

`write_joint_position_to_sim_*` scatters DOF-indexed values into
coordinate slots, so
`reset_joints_by_scale` corrupts the pose on every reset: the
loop-closure residual goes from
0.0004 mm to 828 mm and the solver diverges within 10 steps.

## The fix

`joint_coordinates.py` adds `JointCoordinateMap`, which builds the
coordinate ↔ DOF index tables
once per articulation and converts with four small Warp kernels. Ball
joints go through
rotation vector ↔ quaternion; the gather forces `w >= 0` first, because
a quaternion double-covers
SO(3) and without that a fixed pose can decode to `+θ` one step and
`-(2π − θ)` the next, injecting
discontinuities into the observation. Rotation vector is the
representation consistent with
`joint_qd`, which already holds angular velocity in the joint frame.

`required` is False when every joint has one coordinate per DOF — i.e.
every articulation without a
ball joint. Those keep the existing zero-copy view onto `joint_q` and
cost nothing.

Four call sites: the binding in `articulation_data.py`, a lazy
`_refresh_joint_positions()` in
`update()` and the `joint_pos` property, a `_flush_joint_positions()`
after each of the four joint
position writers in `articulation.py`, and a forced refresh in
`_post_actuator` (it runs inside the
step, before `update()` bumps the timestamp).

The scatter is scoped to the environments each write touched. Resets are
staggered, so an unscoped
scatter would round-trip every environment's ball joints through the log
map on nearly every step,
and the float32 rounding lands on the loop-closure constraints.

## The Digit tasks

`DigitPhysicsCfg` gains a `newton_mjwarp` branch, so
`presets=newton_mjwarp` selects it on the
shipped tasks; the PhysX default is unchanged. Digit was never
PhysX-only by design — that missing
branch was the whole implementation of it. Four items specific to
`digit_v4.usd`, all gated on the
preset:

* 32 `CollisionAPI` prims, every one a `/Visual/` decoration mesh on a
RealSense camera mount. They
become 57% of the robot's shapes and produced 3e7 N contact forces 1.4 m
above the ground.
* Ten joints ship with armature below MJWarp's explicit-damping bound
`c·h/I < 2` — `wrist_yaw` at
  7.86, eight more at 2.74. They get their own actuator group with
  `armature = preset(default=None, newton_mjwarp=0.10)`.
* No `articulation_props`, so Newton filtered all 253 intra-articulation
shape pairs and the legs
  passed through each other.
* `entropy_coef = preset(default=0.01, newton_mjwarp=0.005)`. MJWarp is
less forgiving of the action
tail than PhysX, and at 0.01 a seed occasionally diverges late in
training while the policy itself
  is still healthy.

## Result on the task this came from

Digit was listed in `docs/source/refs/issues.rst` as "not currently
validated" on Newton, attributed
to its closed kinematic loops. The loops import and solve fine; this was
the actual blocker. With it
fixed (3 seeds each, 4096 envs, `Metrics/success_rate` at the final
iteration):

| | before | after |
|---|---|---|
| Velocity-Flat-Digit | 0.000 / 0.000 / 0.000 | **1.000 / 1.000 /
1.000** |
| Velocity-Rough-Digit | 0.019 / 0.005 / 0.002 | **0.992 / 0.993 /
1.000** |

Episode length 985–1000 of 1000, tip-over termination 0.008 (was 1.000
on rough), terrain curriculum
climbing to 3.5 (was pinned at 0).


- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] bug fixed 
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Co-authored-by: ooctipus <zhengyuz@nvidia.com>
…7800)

# Description

Fixes the AnymalD / OVPhysX env-step regression introduced when #7713
made the native Newton actuator path the default (perf team repro: 16384
envs, 47 → 256 ms per env step, GPU utilization 65% → 12%; bisected to
`cdb244d1`).

**Root cause.** `PhysxActuatorRuntime._run_native_actuator_kernels`
launches `sync_torque_telemetry` with `data.joint_stiffness`,
`data.joint_damping` and `data.joint_effort_limits` every physics step.
On OVPhysX those are CPU-only bindings whose getters were gated on the
simulation timestamp, so each access was a blocking `TensorBinding.read`
into pinned host staging plus an H2D copy — three host round-trips per
physics step, re-fired every step because `update()` bumps the
timestamp, with cost linear in the environment count (measured 0.35 ms
at 256 envs, 1.07 ms at 1024; extrapolates to ~15 ms per physics step at
16384). PhysX returns cached views and the Isaac Lab actuator path only
reads gains for implicit actuators, which is why only OVPhysX × native
regressed.

The LSTM itself is on the GPU throughout (`DriveNeuralLSTM` reports
`warp_device=cuda:0 torch_device=cuda:0`); the regression is host-side.

**Fix.** Joint properties (gains, limits, armature, friction) and body
mass/inertia are static under stepping, and their `write_*` / `set_*`
setters already update the data buffers in place before pushing to the
wheel. They are now read through the existing
`_read_static_binding_into_buf` gate — once after explicit invalidation
— instead of once per step. Body state buffers (poses, velocities,
accelerations) keep the per-step refresh. Tendon properties are left
unchanged (GPU-resident; separate writers) and can follow in a later PR.

**Measured (laptop RTX 5000 Ada, `isaaclab benchmark runtime`,
`Isaac-Velocity-Flat-AnymalD`, `physics=ovphysx`, 1024 envs, 100
steps):**

| | native actuators, before | native actuators, after | Isaac Lab
actuators |
| --- | --- | --- | --- |
| env step | 22–30 ms (unstable) | **14 ms, std 0** | 14–15 ms |
| actuator step / physics step (median) | 2.0–2.4 ms | **0.94 ms** |
0.75 ms |
| gain/limit getters / physics step | 1.07 ms (3 blocking reads) | 0.01
ms | n/a |

Regression test
`test_static_property_reads_are_not_invalidated_by_simulation_steps`
asserts one binding read across several steps for joint and body
properties, one more after explicit invalidation, per-step refresh for
state buffers, and the joint-ordering gather path. It fails on `develop`
(`assert 3 == 1`) and passes with this change.

Fixes # (perf team regression report; no issue filed yet)

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
## Description

Downstream projects do not inherit Isaac Lab's uv overrides. The
published wheel's loose Torch requirements therefore allowed newer,
untested builds from PyPI, as reported by the SO-101 tutorial with Torch
2.13.0.

Pin torch/torchaudio 2.11.0 and torchvision 0.26.0 directly in the
published dependencies, remove the redundant uv overrides and their
generated copies, and refresh the lockfile metadata. The existing
platform-specific PyTorch indexes remain unchanged: CUDA 12.8 on Linux
x86_64 and Windows, and CUDA 13.0 on Linux aarch64. Normal `uv sync` and
`uv run` commands require no CUDA selectors.

Document that downstream uv projects must configure their own PyTorch
indexes. The corresponding tutorial fix adds those indexes, keeps x86 on
CUDA 12, and removes its obsolete Newton release-1.5 override. The
pinned Warp 1.17.0 installation reports CUDA Toolkit 12.9. Isaac Lab
already pins the compatible Newton 1.6.0rc1 release and documents the
OpenUSD parser workaround.

## Validation

- 22 focused metadata and wheel-builder tests passed, including the
updated check that direct Torch pins match the central version table.
- `uv lock --check` and `uv run isaaclab -f` passed.
- Tutorial: 61 tests, Ruff, and the reported 8-environment/100-step
zero-agent command passed with the default CUDA 12.8 build and
`PXR_WORK_THREAD_LIMIT=1`.
- Co-installation: `uv sync --locked --extra isaacsim --extra test`
installed Isaac Sim 6.1.0.0 alongside Torch 2.11.0+cu128, matching Isaac
Sim's Torch pin without an override. `uv run --extra isaacsim isaaclab
train --rl_library rsl_rl --task Isaac-Cartpole-Direct --num_envs 16
--max_iterations 5` passed with both `physics=isaacsim_physx` and
`presets=newton_mjwarp` in the same environment (exit 0 and `Training
time:` for each). PhysX used the existing install-CI Carbonite
environment shim preload; both runs set `PXR_WORK_THREAD_LIMIT=1`.
- GPU validation used an RTX PRO 6000 Blackwell Workstation Edition with
driver 580.159.03. No Windows or aarch64 hardware runs were performed.

## Type of change

- Bug fix
- Documentation update

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Checklist

- [x] Ran pre-commit checks with `uv run isaaclab -f`
- [x] Updated installation documentation
- [x] Updated existing version-pin coverage
- [x] Added an Isaac Lab changelog fragment
# Description

The environment browser generated the Franka soft-lift command without
the optional tetrahedralization dependencies, causing the task to fail
at startup. Add task-level required extras to the generated browser
metadata so both the standard and camera variants now produce commands
beginning with:

```bash
uv run --extra tetrahedralization isaaclab train --rl_library rsl_rl --task Isaac-Lift-Soft-Franka
```

The browser continues to append the selected physics and task presets.
Regression tests cover required-extra collection and row generation.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv run --extra test python -m pytest --confcutdir=tools/test
tools/test/test_environ_docs.py -q` (38 passed)
- `uv run --isolated --extra dev -- make -C docs current-docs`
(warning-free build)
- Staged pre-commit hooks passed; the branch-wide changelog hook was
skipped because this PR does not touch a `source/<package>/` package and
the checkout contains unrelated changelog findings.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] Changelog fragment is not applicable because no
`source/<package>/` package changed
- [x] My name already exists in `CONTRIBUTORS.md`
## Description

Follow-up to #7822 that addresses the two review comments left on the
merged PR:

- resolve task-card thumbnails from the external task-image host instead
of the deleted local `_static/tasks` assets; and
- keep non-task preview images, such as `Lift-Soft-Franka`, on their
local `_static` paths.

Both the selected-task preview and task-card thumbnails now use one
shared URL resolver.

Addresses:
- #7822 (comment)
- #7822 (comment)

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Validation

- `node --check docs/source/_static/css/environment-browser.js`
- `uv run --extra test python -m pytest --noconftest
tools/test/test_environ_docs.py` (35 passed)
- `uv run --isolated --extra dev -- make -C docs current-docs`
(succeeded without warnings)
- Headless Chrome verified Cartpole resolves to the external task-image
URL and `Lift-Soft-Franka` resolves to the local built `_static/newton`
image.
- `uv run isaaclab -f` (all applicable hooks passed; changelog
validation passed separately against `upstream/develop` because the fork
base is stale)

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] Existing environment documentation tests pass
- [x] No source package was touched, so no changelog fragment is
required
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

The Franka deformable-lift environments default to the Newton MJWarp/VBD
proxy preset, but the shared Menagerie USD was not told to select its
MuJoCo physics payload. The asset therefore retained its authored PhysX
variant even when the environment selected Newton.

This change keeps the choice task-owned and backend-specific:

- Newton/default selects the asset's `Physics=mujoco` variant.
- Isaac Sim PhysX and automatic PhysX select `Physics=physx`.
- No asset, actuator, reward, observation, or rigid-task behavior
changes.

A focused regression test covers the default, explicit Newton, Isaac Sim
PhysX, and automatic PhysX resolutions. It fails in all four cases on
the unmodified base (`spawn.variants` is `None`) and passes after the
fix.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## Release backport

- [x] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable; this fixes configuration resolution before the USD is
spawned.

## Validation

- `uv run python -m pytest
source/isaaclab_tasks/test/core/test_lift_env_cfg.py -q` — 7 passed.
- `uv run python tools/changelog/cli.py check develop` — passed.
- `uv run isaaclab -f` — passed.
- `Isaac-Lift-Soft-Franka`, one environment, 32 random-agent steps with
`physics=newton_mjwarp_vbd_proxy` — passed.
- `Isaac-Lift-Soft-Franka`, one environment, 32 random-agent steps with
`physics=isaacsim_physx` — passed.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] I have made corresponding changelog changes
- [x] My changes generate no new warnings
- [x] I have added tests that prove the fix is effective
- [x] I have added a changelog fragment for every touched source package
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

OvStage 0.1.1 had transform issues when using the GPU_INCREMENTAL
setting. OvStage has fixed these issues in 0.2.0. The compat file was
added to allow GPU_INCREMENTAL to be used when 0.2.0 is detected but
still falls back to CPU_INCREMENTAL


Fixes # (issue)

Performance boost ~9x FPS when using ovstage 0.2.0

## Type of change

- Compatibility module for ovstage 0.1.1 and 0.2.0


## Checklist

Docker and GPU tests run on demand. Push the commits you want tested,
then
comment `run-ci` on the pull request.

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package (do **not** edit
`CHANGELOG.rst` or bump `extension.toml` — CI handles that)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Prevents Newton VBD initialization from hanging indefinitely while Warp
balances graph colors.

Warp's optional balancing pass can cycle between valid color assignments
without changing the maximum-to-minimum group-size ratio. Newton VBD
only requires a valid coloring for correctness, so this change keeps
Warp's initial valid coloring and disables the optional balancing pass
at both VBD builder-coloring call sites.

This is a temporary downstream workaround. No new dependencies are
introduced.

Related issues:

- Upstream Warp defect:
[NVIDIA/warp#1964](NVIDIA/warp#1964)
- Isaac Lab cleanup tracker for restoring balancing after the upstream
fix: #7827

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Testing

- `uv run --extra test python -m pytest
source/isaaclab_newton/test/physics/test_vbd_core.py -q` — 8 passed
- `OMNI_KIT_ACCEPT_EULA=Y uv run --extra test --extra tetrahedralization
--extra isaacsim python -m pytest
source/isaaclab_contrib/test/deformable/test_deformable_object.py -q` —
19 passed; six consecutive full-file runs completed without a hang
- `uv run python tools/changelog/cli.py check develop` — passed
- `uv run isaaclab -f` — passed

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the pre-commit checks with `uv run isaaclab -f`
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] I have added a changelog fragment under
`source/isaaclab_newton/changelog.d/`
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

Promotes Isaac Lab from the Newton `1.6.0rc1` release candidate to the
final `1.6.0` release for both workspace and wheel installs.

This updates the root dependency and uv override, generated override
files, wheel-install assertion, and lockfile. No user migration is
required.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Release backport

- [ ] <!-- backport-active-release --> Backport this pull request to the
active release branch after it merges into `develop`

## Screenshots

Not applicable.

## Validation

- `uv lock --check`
- `PYTHONPATH=source/isaaclab uv run --no-project --with pytest python
-m pytest source/isaaclab/test/cli/test_wheel_builder_metadata.py
source/isaaclab/test/cli/test_uv_run_pyproject.py` — 22 passed
- `uv run --no-project python tools/changelog/cli.py check
<develop-base>` — passed
- Changed-file pre-commit checks — all applicable checks passed. The Git
LFS pointer hook was skipped because `git-lfs` is unavailable on the
macOS host; no LFS-managed files changed.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the applicable pre-commit checks
- [x] Documentation changes are not required for this dependency
promotion
- [x] My changes generate no new warnings
- [x] Existing metadata tests cover the updated dependency contract
- [x] I have added a changelog fragment for the affected package
- [x] My name already exists in `CONTRIBUTORS.md`
## Summary

- make `develop` the multi-version documentation landing-page default
- render and validate the selected documentation redirect on Unix and
Windows
- continue building `v3.0.0-EA` as an available versioned tag without
making it the site default
- prepare `develop` to own the repository's scheduled workflows
- remove the obsolete backwards-compatibility cron so the default-branch
switch does not activate it
- replace stale default-branch comments and point active nightly
examples at `develop` and `release/3.0.0`

The GitHub Pages deployment environment already permits `develop`, so no
environment policy change is required.

## Cutover order

1. Merge the README backport (#7771) into `release/3.0.0` and create the
exact-case `v3.0.0-EA` tag from the intended release commit.
2. Merge this PR and the develop README PR (#7770) into `develop`.
3. Change the repository default branch to `develop`.
4. Manually dispatch the Docs workflow from `develop` and verify the
site root redirects to `/develop/`.

The previous release-default preparation PRs (#7768 and #7769) are
superseded by this plan.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Validation

- passed the applicable pre-commit formatting, YAML, spelling, license,
and Git LFS checks
- exercised redirect generation with the default
`DOCS_DEFAULT_REF=develop`
- verified a missing default ref fails the build
- verified the scheduled workflow set and branch targets that will
become active on `develop`
- verified the GitHub Pages deployment branch policy already allows
`develop`
- `uv run --isolated --extra test -- make -C docs current-docs` and `uv
run isaaclab -f` cannot resolve on macOS arm64 because the project
lockfile supports Linux and Windows; Linux PR CI remains the
authoritative full build

No package source changed, so no changelog fragment is required.
## Summary

- keep the `develop` README documentation links on the published
`develop` documentation
- replace the repository-source RL link with the published
reinforcement-learning page
- replace the obsolete Tutorials landing page with the current tutorials
and how-to index
- remove the deleted `#local-installation` anchor
- replace the beta2 release-branch compatibility entry with the exact
`v3.0.0-beta2` tag

## Cutover note

The compatibility table records the planned `v3.0.0-EA` tag, but this
branch's README links intentionally continue to track `/develop/` before
and after `develop` becomes the repository default.

The release-specific counterpart is #7771, whose links point to the
immutable `/v3.0.0-EA/` documentation.

## Type of change

- Documentation update

## Validation

- verified every linked `develop` documentation URL returns HTTP 200
- verified every linked page source exists on both `develop` and
`release/3.0.0`
- verified all local README targets exist
- passed the applicable pre-commit formatting, spelling, and Git LFS
checks
- `uv run --isolated --extra test -- make -C docs current-docs` and `uv
run isaaclab -f` cannot resolve on macOS arm64 because the project
lockfile supports Linux and Windows; PR CI remains the authoritative
full check

No package source changed, so no changelog fragment is required.
@pull pull Bot locked and limited conversation to collaborators Sep 16, 2026
@pull pull Bot added the ⤵️ pull label Sep 16, 2026
@pull
pull Bot merged commit 7a7575d into mataylor-nvidia:develop Sep 16, 2026
14 of 21 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.