Skip to content

[Backport release/3.0.0] Complete develop backports - #7851

Merged
kellyguo11 merged 69 commits into
isaac-sim:release/3.0.0from
kellyguo11:codex/backport-missing-runtime-deps-release-3.0.0
Sep 17, 2026
Merged

kellyguo11 merged 69 commits into
isaac-sim:release/3.0.0from
kellyguo11:codex/backport-missing-runtime-deps-release-3.0.0

Conversation

@kellyguo11

@kellyguo11 kellyguo11 commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Description

Consolidates the complete develop to release/3.0.0 backport set previously split across #7851, #7852, and #7853. Keeping the changes together lets CI validate the runtime, task, tooling, dependency, and renderer prerequisites as one coherent release tree.

The aggregate includes all audited develop changes through e8363313c, including the latest #7866, #7867, #7868, #7869, and #7870 fixes. It also includes the exact net patch from #7871 (412cac434 / patch ID 0f69afa6) because the externally updated Franka asset already breaks the release legacy-rendering matrix; #7871 is still pending merge to develop at the time of this update.

Release CI now uses the same immutable Isaac Sim latest-develop digest as develop:

isaacsim_image_tag: latest-develop@sha256:223adbb0a6f1897ed78d40597dac2efc740843e8051779ffdcbb021a9edc1217

This supersedes #7852 and #7853.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Documentation update
  • Release integration/backport

Release backport

  • Not applicable: this PR targets release/3.0.0 directly.

Screenshots

Not applicable.

Validation

  • Latest five develop commits are patch-equivalent in the aggregate tree.
  • Fix legacy OVRTX cloning of instanced geometry and unused variants #7871 renderer fix matches its source patch ID exactly.
  • .github/workflows/config.yaml matches develop.
  • 33 OVRTX USD/export tests passed; 19 optional backend tests skipped locally.
  • 3 focused Franka Pour/Lift/Reorient collider regressions passed.
  • 45 standalone supervisor tests passed; 386 simulator launch cases skipped locally.
  • All 23 repository skills validated.
  • Ruff check and formatting check passed on all manually merged/latest-fix Python files.
  • Workflow YAML parsing, uv lock --check, and aggregate git diff --check passed.
  • Full uv run isaaclab -f and local docs build cannot run on macOS ARM64 because the lock supports Linux x86_64/aarch64 and Windows AMD64; Linux CI is authoritative for those checks.

Checklist

  • I have read and understood the contribution guidelines.
  • I have run the full pre-commit command locally (platform-incompatible; focused Ruff/format checks passed and CI is running).
  • I have made corresponding documentation changes.
  • My focused local checks generate no new warnings.
  • I have added/backported tests that prove the fixes are effective.
  • I have included changelog fragments for every touched source package.
  • Contributor attribution is preserved from the source changes.

Aggregate CI result

The consolidated head 1b22248e6 completed with 50 successful checks, 5 intentional skips, 0 pending, and 0 failures. This includes both installation platforms, docs, pre-commit, dependency licenses, Docker builds, all core/task shards, contrib, RL, standalone demos, legacy rendering, OVRTX, and multi-GPU tests. The initially intermittent DrLegs HoldPose failure passed on the focused job rerun without a code change.

rebeccazhang0707 and others added 30 commits September 16, 2026 16:48
# Description

This PR reduces the number of physics views created by
`scripts/demos/bin_packing.py`. It keeps the existing scene
configuration, clone combinations, and randomized layout flow, but
changes each grocery slot to a spawn-only `AssetBaseCfg` and manages all
spawned groceries through one flat PhysX `RigidBodyView`.

This is a demo-only performance optimization and adds no dependencies.

## Type of change

- Performance improvement (non-breaking change)

## Testing

- `uv run isaaclab -f`
- `uv run python -m py_compile scripts/demos/bin_packing.py`
- `uv run isaaclab -p scripts/demos/bin_packing.py --num_envs 2
--visualizer none`

The 2-environment PhysX smoke test completed scene setup, created one
flat grocery view, and ran without errors.

## Screenshots

Not applicable; the rendered scene and randomized layouts are unchanged.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the pre-commit checks with `uv run isaaclab -f`.
- [x] My changes generate no new warnings.
- [x] I have tested the updated demo with the PhysX backend.
- [x] Documentation changes are not required for this internal demo
implementation update.
- [x] A changelog fragment is not required because no source package is
changed.
- [x] My name already exists in `CONTRIBUTORS.md`.

(cherry picked from commit 9c209c0)
…c-sim#7375)

This PR adds `IsaacContrib-Multitask-Manipulation`, a contributed
manager-based environment for training and evaluating one RSL-RL policy
across three heterogeneous manipulation layouts:

- OpenArm cube lifting
- Franka drawer opening
- UR10 end-effector reaching

The environment uses selection-aware physics-view indexing so that each
asset only exists in its task subset while observations and actions
remain fixed-width in global environment order.

- Adds `SceneEntitySelectionCfg` to resolve task-local assets and map
physics-view indices into global environment order, enabling
heterogeneous scene subsets across reset, observation, action, reward,
command, and termination terms.
- Supports multitask training, task-subset evaluation, and single-task
evaluation.
- Adds a shared observation backbone with task-specific Gaussian policy
and value heads.
- Masks inactive action dimensions in sampling, entropy,
log-probability, KL, and last-action observations.
- Adds bounded targets, task-specific timeouts, lift and cabinet success
metrics, and playback visualization.

The three tasks share manipulation structure but differ in robot state,
action semantics, and reward scale. A fully shared policy with one
padded action distribution would train irrelevant action dimensions and
allow the task with the largest reward scale to dominate the update. The
design therefore shares representations where transfer is useful while
routing task-specific outputs and normalization where the contracts
differ.

| Challenge | Solution | Motivation |
| --- | --- | --- |
| Heterogeneous scene ownership | Add `SceneEntitySelectionCfg`, which
maps global environment IDs to each asset's physics-view instance rows
and scatters task-local values back into global environment order. | An
asset exists only in its task subset, so global environment indices
cannot directly index its compact physics view. Explicit mapping
prevents incorrect or out-of-range indexing and zero-fills environments
where the asset is absent. |
| Varied observation dimensions | Concatenate a task ID and zero-filled
task blocks into one 95-dimensional policy observation: `3 task ID + 28
lift + 23 cabinet + 19 reach + 22 last action`. Process it with a shared
feature extractor. | Gives RSL-RL one fixed observation contract while
allowing the backbone to reuse features across tasks. |
| Varied action dimensions | Use task-specific Gaussian action heads
with dimensions `(8, 8, 6)` and task-specific scalar value heads. Mask
inactive action dimensions in actions, log-probability, entropy, KL, and
last-action observations. | Prevents unrelated joints from contributing
policy gradients while retaining shared actor and critic backbones. |
| Varied reward scaling | Normalize PPO advantages independently for
lift, cabinet, and reach rollouts. | Prevents a task with larger reward
magnitudes from dominating the shared PPO update. |

No new dependencies are required.

Train:

```bash
uv run isaaclab train \
    --rl_library rsl_rl \
    --task IsaacContrib-Multitask-Manipulation \
    --num_envs 16384 \
    --seed 42 \
    --run_name multitask_manipulation
```

Evaluate a specific checkpoint:

```bash
uv run isaaclab play \
    --rl_library rsl_rl \
    --task IsaacContrib-Multitask-Manipulation \
    --num_envs 3 \
    --checkpoint logs/rsl_rl/multitask_manipulation/<run-dir>/model_3000.pt \
    --viz kit
```
<img width="768" height="432"
alt="multitask_manipulation_eval_compressed"
src="https://github.com/user-attachments/assets/c491e548-2eb2-4943-be75-5eb97099c964"
/>

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

![Multitask manipulation
environment](https://github.com/rebeccazhang0707/IsaacLab/blob/reb/multitask_manip_demo/docs/source/_static/tasks/manipulation/multitask_manipulation.jpg?raw=true)

- `uv run isaaclab -f`
- `uv run --extra test --frozen python -m pytest
source/isaaclab_tasks/test/contrib/test_multitask_manipulation_env_cfg.py
-q` (`18 passed`)
- `uv run --extra test --frozen python -m pytest
source/isaaclab_tasks/test/contrib/test_contrib_environments.py -q -k
IsaacContrib-Multitask-Manipulation` (`1 passed`)
- `uv run python scripts/environments/list_envs.py --keyword Multitask
--show_presets`
- `uv run --isolated --extra test -- make -C docs current-docs`

- [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.
- [x] I have made corresponding changes to the documentation.
- [x] My changes generate no new task-local warnings.
- [x] I have added tests that cover the new behavior.
- [x] I have added a changelog fragment under
`source/isaaclab_tasks/changelog.d/`.
- [x] My name already exists in `CONTRIBUTORS.md`.

(cherry picked from commit 13296b1)
…n run (isaac-sim#7433)

# Description

`DataGenConfig.max_num_failures` is documented as *"Maximum number of
failures allowed before stopping generation"* and eighteen shipped Mimic
environment configs set it to `25`. Nothing reads it.

```console
$ git grep -c max_num_failures
source/isaaclab/isaaclab/envs/mimic_env_cfg.py:1          # the definition
source/isaaclab_mimic/isaaclab_mimic/envs/*.py:18         # eighteen assignments
```

No third entry: there is no read anywhere in the repository, and the
field has been inert since Isaac Lab Mimic was introduced in isaac-sim#179.
`env_loop` counts `num_failures` and then never consults it; its only
termination is

```python
check_val = num_success if generation_guarantee else num_attempts
if check_val >= generation_num_trials:
```

With `generation_guarantee = True` (which those same eighteen configs
also set), a task whose success rate is low retries without any bound,
and the one knob that claims to stop that does nothing. On our own data
generation this cost 337 attempts for 10 demos before we discovered the
cap was not real.

### Reproduction, on a stock task

```bash
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
  --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 \
  --input_file ./datasets/annotated_dataset.hdf5 \
  --output_file /tmp/out.hdf5 \
  --generation_num_trials 30 --num_envs 10 --headless
```

`FrankaCubeStackIKRelMimicEnvCfg` sets `max_num_failures = 25`.
Observed:

| | successes | failures | attempts |
|---|---|---|---|
| before | 30 | **50** | 80 |
| after (`max_num_failures = 25`) | 12 | **25** | 37 |

Before the change the run passed the configured cap and kept going,
ending at twice it. After, it stops on the attempt that reaches 25
failures and says so:

```
Reached 25 failures (max_num_failures=25) after 12/30 successes. Exiting.
```

### On the default

Wiring the field up exactly as written would abort the primary
documented workflow. At the ~36% success rate measured above,
`--generation_num_trials 1000` needs on the order of 1800 failures, so a
cap of 25 would end the run after roughly forty attempts. Since the
eighteen assignments were inert when they were written and no current
behaviour depends on them, they are removed here and the default becomes
`None`, meaning no limit. **Runs behave exactly as they do today unless
a limit is explicitly requested.**

If maintainers would rather the shipped configs keep an active cap, that
is a one-line change per config and I am happy to make it — it just
needs a value that suits large runs.

### Tests

`source/isaaclab_mimic/test/test_generation_failure_cap.py` drives
`env_loop` with a fake environment whose `step()` consumes scripted
attempt outcomes and refills the action queue, so the loop's own
termination logic runs unmodified with no simulator or dataset behind
it; a step-count fuse turns an unbounded loop into a failed assertion.
Six cases: the cap stops a run that never succeeds; `None` keeps the
guarantee unbounded as before; enough successes still end the run first;
a cap reached short of the target ends it; attempt-based termination
with the guarantee off is untouched (×2).

Against the unpatched loop the two cap-dependent cases fail (`'fuse' ==
'exited'`, and `(3, 4) == (2, 4)` — the loop overran the cap and
collected an extra success) and the four asserting unchanged behaviour
pass.

## Type of change

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

## Checklist

- [x] I have read and understood the contribution guidelines
- [ ] I have run the `pre-commit` checks 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01JFz91VMgmrjS4XR6f9Q9Z2

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
(cherry picked from commit 59df9b8)
## 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.

(cherry picked from commit b0c3941)
)

# Description

`test-contrib-environments` failed on isaac-sim#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

(cherry picked from commit 63d579e)
# Description

Use the default `GroundPlaneCfg` appearance in the granular, two-way
coupling, and snowball MPM demos. This removes per-demo size and color
overrides and keeps the examples aligned with the standard Isaac Lab
ground plane.

No new dependencies.

## Type of change

- Documentation/example cleanup (non-breaking)

## Release backport

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

## Screenshots

Not applicable; this intentionally adopts the standard ground-plane
appearance.

## 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/) on
all changed files
- [x] Documentation changes are not required
- [x] My changes generate no new warnings
- [x] Tests are not required for configuration-only demo cleanup
- [x] Changelog fragments are not required because no source package is
changed
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit bb3f366)
# Description

Adds the perspective-camera visual regression requested as a follow-up
to [isaac-sim#7053](isaac-sim#7053) and [NVBUG
6632117].

- Creates four spatially separated Cartpole environments for one PhysX +
Kit viewport case.
- Frames all four scene partitions in a single perspective-camera
capture.
- Rejects flat or missing-content captures before comparing against the
new golden image.

## Type of change

- Test update

## Release backport

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

## Screenshot

![Four scene-partitioned Cartpole
environments](https://raw.githubusercontent.com/nvsekkin/IsaacLab/test/scene-partitioning-perspective-golden/source/isaaclab_visualizers/test/golden_images/cartpole_all_envs/physx-kit-viewport.png)

## Validation

- `uv run isaaclab -f`
- The final candidate was captured twice against the current CI Isaac
Sim image (`sha256:50d2491d...`, Isaac Sim 6.1.0-alpha.72); the repeat
comparison passed.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the pre-commit checks.
- [x] Documentation changes are not applicable to this test-only update.
- [x] My changes generate no new warnings.
- [x] I have added a test that covers the requested behavior.
- [x] I have added a test-only changelog `.skip` fragment for
`isaaclab_visualizers`.
- [x] My name already exists in `CONTRIBUTORS.md`.

(cherry picked from commit 9be9102)
# Description

Running a play script with `--checkpoint pretrained` on a machine whose
`.pretrained_checkpoints` directory was left behind by a container run
(owned by `root`) prints:

```
Fetching pre-trained checkpoint : https://.../rsl_rl/Isaac-Humanoid-Direct_newtonmjwarp_none_rsl_rl.pt
A pre-trained checkpoint is currently unavailable for this task.
```

and exits. The checkpoint is published and reachable; the download
failed with
`PermissionError: [Errno 13] Permission denied:
'.../.pretrained_checkpoints/rsl_rl/https'`. That error
was discarded by a bare `except Exception` in

`isaaclab_rl.utils.pretrained_checkpoint.get_published_pretrained_checkpoint`,
which reported every
failure — a missing checkpoint, an unreachable server, an unwritable
cache, a full disk — with the same
sentence and returned `None`, after which the play scripts return
without further explanation.

This separates the two cases:

* **The asset server does not provide the checkpoint.** `None` is still
returned and the message still
starts with `A pre-trained checkpoint is currently unavailable for this
task.`, so callers and tests
matching on that line are unaffected. It now also names the location
that was tried, the task and
  backends that location was derived from, and what to do instead:

  ```
  A pre-trained checkpoint is currently unavailable for this task.
The asset server does not provide
'https://.../Isaac-Not-A-Real-Task_newtonmjwarp_none_rsl_rl.pt'.
Either no checkpoint is published for task 'Isaac-Not-A-Real-Task' with
the 'newtonmjwarp' physics
and 'none' render backends, or the asset server could not be reached.
Train the task, or pass --checkpoint <path> to use a checkpoint of your
own.
  ```

* **The checkpoint exists but could not be downloaded.** This is a local
problem the user has to fix, so
it raises `RuntimeError` naming the checkpoint, the cache directory and
the originating error, which is
  chained as the cause:

  ```
RuntimeError: Failed to download the pre-trained checkpoint
'https://.../Isaac-Humanoid-Direct_newtonmjwarp_none_rsl_rl.pt'
into '/home/user/IsaacLab/.pretrained_checkpoints/rsl_rl':
PermissionError: [Errno 13] Permission denied:
'/home/user/IsaacLab/.pretrained_checkpoints/rsl_rl/https'. Check that
the cache directory is writable and
that the disk is not full; a directory left behind by a container run is
owned by root.
  ```

Note that `omni.client` reports a checkpoint that was never published
and a server it cannot reach
identically, so both remain covered by the "unavailable" message.

Both paths were verified end to end against the live asset server, using
a published checkpoint with a
read-only cache directory and an unpublished checkpoint name.

## Type of change

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

Behaviour note: callers that relied on `None` to mask a local download
failure now see a `RuntimeError`.
Callers that treat `None` as "no checkpoint published for this task" —
every caller in the repository —
are unchanged. This is called out in the changelog fragment.

## Release backport

- [ ] <!-- 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

(cherry picked from commit 768c305)
# Description

Restores the missing `torch` import in `test_ovrtx_clone_plan.py`.

isaac-sim#7462 converted the existing clone-plan test inputs from Torch tensors
to NumPy arrays and removed the then-unused import. isaac-sim#6308 subsequently
added a new object-scale test using `torch.ones` and `torch.arange`
without restoring the import, causing the repository-wide Ruff
pre-commit check to fail with `F821 Undefined name torch`.

This PR contains only the import repair and an `isaaclab_ov` `.skip`
changelog fragment. It unblocks isaac-sim#7579 and other changes based on the
current `develop` branch.

## Type of change

- Bug fix (non-breaking test fix)

## Release backport

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

No release backport is required: `release/3.0.0` already imports `torch`
in this test.

## Screenshots

Not applicable.

## Testing

- `uv run --no-project --with pre-commit python -m pre_commit run
--all-files`
- `uv run --no-project python tools/changelog/cli.py check
--include-worktree`
- `git diff --check upstream/develop...HEAD`

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the full pre-commit checks
- [x] Documentation changes are not required because no public API
changed
- [x] My changes generate no new warnings
- [x] The fix directly covers the Ruff `F821` failure
- [x] I have added an `isaaclab_ov` changelog fragment
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit 7bf6959)
## Description

Adds two developer skills for issue work, split by scope:

- **`isaaclab-auditing-an-issue`** — audits a single issue against
current code and drafts the reply. Holds the reusable per-issue checks.
- **`isaaclab-triaging-issue-backlog`** — batch sweeps. Requires the
first as a sub-skill and adds only the orchestration: adversarial
verification, approval bookkeeping, and the human review gate.

The guidance is distilled from a full pass over the open backlog, where
automated triage repeatedly produced comments that read well but
asserted things that were not true. The skills encode the checks that
caught those.

### Per-issue skill

- **Mandatory checks table**, one row per claim shape. Grep `contrib/`
before writing "Isaac Lab doesn't have X", since features move to
contrib and absence claims go stale. Check the specific backend package
rather than assuming parity. Run a script for behavioral claims instead
of reading the raise site — a guard can be narrower than it looks.
- **URL traps.** `blob/main/...` 404s for `isaaclab_newton`,
`isaaclab_ov`, `isaaclab_ovphysx` and `isaaclab_contrib`, since those
packages are not on `main`. `isaac-sim.github.io/IsaacLab/main/...` is
the stale 2.x docs build. Both produced dead links during the triage
pass.
- **Do Not Close list.** Cases where the stated reason is defensible but
closing still loses something: an open maintainer question, pre-merge
feedback on an open PR, a duplicate of a bug that was itself closed
without a fix, an unmet titled ask, and upstream-blocked work where
nobody has filed upstream.
- **Comment style.** Thank the reporter, cite a verified fix, invite a
reopen, and do not assign fault to the reporter or to a sibling team.

### Batch skill

- Adversarial verification that defaults to REFUTED or UNCERTAIN when
evidence cannot be independently confirmed.
- Approval bookkeeping: never infer approval, keep one plan file,
re-show anything edited after approval, and report refuted and held
counts alongside the reduction figure.
- A failure-mode table observed in practice, so the next sweep expects
them rather than rediscovering them.

## Type of change

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

## Checklist

- [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
- [x] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

## Notes

`uv run --no-project python tools/skills/cli.py check` passes (23 skills
validated).

No changelog fragment: no source package changed, and the fragment check
passes.

The skills have not yet been pressure-tested against agents with and
without them, which is the usual bar for discipline-enforcing guidance.
Happy to do that before merge if reviewers would prefer.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit 3639364)
# Description

NVBug: 6674420

Newton MJWarp configured for Isaac RTX Minimal Mode with Simple Shading
Full MDL is substantially slower than Newton MJWarp with OVRTX. The
Isaac RTX path is not enabling Minimal Mode as expected, preventing the
intended performance gains. Investigate and fix the Isaac RTX
configuration path so Minimal Mode is correctly enabled.

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)
- New feature (non-breaking change which adds functionality)
- Breaking change (existing functionality will not work without user
modification)
- Documentation update

## Release backport

- [ ] <!-- 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.

- [ ] 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
-->

---------

Co-authored-by: nvsekkin <esekkin@nvidia.com>
Co-authored-by: Ege Sekkin <72572910+nvsekkin@users.noreply.github.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit c58715b)
…r.replicate()` (isaac-sim#7453)

This depends on newton-physics/newton#4012 and pins the Newton 1.6
development build that first provides `ModelBuilder.replicate(...,
label_prefixes=...)`.

The homogeneous Newton cloning path previously replicated the model and
then walked every replicated entity label to replace the prototype
environment with its destination environment. It now rebases only the
retained prototype labels, restores them after the call, and lets
`ModelBuilder.replicate()` assign each copy's destination prefix while
it is created. String-valued custom attributes still use the existing
targeted rewrite because Newton cannot identify which strings are entity
paths.

The destination itself is the source of identity: prefixes are derived
from the queued source/destination mapping. No clone-plan environment
metadata, scene discovery, fallback clone path, or retained prototype
mutation is introduced. Labels exactly at a directly cloned asset root,
including Newton's `_free_joint` and `_articulation` companion labels,
are expressed relative to the nearest templated destination ancestor and
remain on the same fast path.

The Newton commit pin is mirrored in workspace and wheel installation
inputs so every supported install receives the API this path requires.

The final PR is `+195/-218`, net **-23 LOC**.

GPU 0, 4096 worlds, two samples per PR head. The targeted measurement
uses one 48-body/48-shape Newton prototype and times replication plus
all required label publication:

| Head | Targeted path median | Versus develop |
|---|---:|---:|
| develop base (`3a31389a9`) | 1.428 s | — |
| original PR (`cbb17ab6e`) | 1.160 s | -18.8% |
| cleaned PR (`844f4c4db`) | 1.171 s | **-18.0%** |

The cleanup is within 1.0% (11 ms) of the original PR result and
preserves the removed-pass gain. The 257 ms reduction from develop is
consistent with the original 215 ms observation on
`Isaac-Velocity-Flat-G1`.

Whole-workload check used:

```bash
CUDA_VISIBLE_DEVICES=0 uv run --no-sync isaaclab zero_agent \
  --task Isaac-Lift-KukaAllegro --num_envs 4096 --max_steps 1 \
  --device cuda:0 --visualizer none physics=newton_mjwarp
```

| Head | Warm wall median | Scene creation median |
|---|---:|---:|
| original PR | 21.30 s | 6.324 s |
| cleaned PR | 21.39 s | 6.345 s |

That end-to-end difference is within startup noise; the cleanup
introduces no measured workload regression.

- Startup performance enhancement

- 81 focused clone, Newton, visualization-state, wheel-metadata, and
install tests passed.
- Ruff formatting and lint checks passed.
- Exact-root, sparse-environment, hook-authored-label, custom-attribute,
and retained-prototype cases are covered.
- The changelog fragment is present for the changed Newton package.

- [x] I have read and understood the contribution guidelines
- [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
- [x] My name already exists in `CONTRIBUTORS.md`

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit 0eb2589)
- Bumps Newton from `1.5.1` to `1.6.0rc1`, the first release carrying
[newton#4017](newton-physics/newton#4017),
unblocking the MuJoCo tendon adapter that PR isaac-sim#7161 needs.
- `warp-lang` and `mujoco`/`mujoco-warp` move with it, because
`1.6.0rc1` requires them.
- Pins `newton[sim]` in `[project].dependencies` as well, so a wheel
built from this metadata resolves the fix rather than falling back to
the newest stable.
- Updates test literals in `isaaclab` and `isaaclab_newton` for Newton's
new actuator class names, and asks for a determinism guarantee in the
manipulation determinism test.

`resolve_fixed_tendon_actuator_columns` reads `mujoco.actuator_trntype`
through an
`ArticulationView`. Every Newton 1.5.x release rejects that with *"has
custom frequency
'mujoco:actuator' which is not supported by ArticulationView"*;
newton#4017 makes
`ArticulationView` generic over custom frequencies.

`1.6.0rc1` (published 2026-09-03) is the first release containing that
fix — verified two ways:
the merge commit `4055a159` is an ancestor of `v1.6.0rc1`, and
`custom_frequency_label_attributes`,
the symbol the fix introduces in `newton/_src/sim/model.py`, is present
at `v1.6.0rc1` and absent
at `v1.5.1`. No `1.6.0` final exists yet, and no 1.5.x backport carries
the fix, so `1.6.0rc1` is
the only released option.

The release requires `warp-lang>=1.17.0` and `mujoco-warp~=3.12.0`, so
those pins move too:

| Package | Before | After |
| --- | --- | --- |
| `newton[sim]` | `1.5.1` | `1.6.0rc1` |
| `warp-lang` | `1.16.0` | `1.17.0` |
| `mujoco` | `3.11.0` | `3.12.0` |
| `mujoco-warp` | `3.11.0` | `3.12.0` |

`warp-lang` is pinned to the `1.17.0` release rather than left as
`>=1.17.0`: Newton's prerelease
enables prerelease resolution, and an unbounded bound then resolves to a
nightly
(`1.18.0.dev20260903`).

`[tool.uv].override-dependencies` only reaches `uv sync`, so it does not
constrain a wheel built
from this metadata. `1.6.0rc1` is a prerelease, which a default resolve
skips, so a loose bound
resolved `newton 1.5.1` — without newton#4017, the fix this bump exists
to deliver. Since
`wheel.yml` builds on every push to `develop`, that would have shipped.

`[project].dependencies` now pins `newton[sim]==1.6.0rc1`, matching the
override. A default
resolve of the new metadata returns `1.6.0rc1` under both `uv pip
compile` and `pip download`,
with no `--pre` flag. `isaacsim-core==6.0.1.0` requires
`newton[sim]==1.2.1`, so installing the
`isaacsim` extra still needs an override — exactly as on `develop`,
which carries an equally
exact pin in the same place.

`1.6.0rc1` introduces `DrivePD` / `DriveNeuralMLP` / `DriveNeuralLSTM`
alongside the existing
`ControllerPD` / `ControllerNeural*`. Both names remain importable, so
this is **not** a breaking
API change and no production code changes. Tests in `isaaclab` and
`isaaclab_newton` assert on the
class name Newton *constructs with*, which switched to the `Drive*`
form, so those literals are
updated.

`test_manipulation_env_determinism[cuda-Isaac-Open-Drawer-Franka]`
failed on this branch in CI.
Two separate questions: whether the bump caused it, and why it failed at
all.

**Not caused by the bump.** Each arm was run 5x on the same machine,
because a single run of an
intermittent test samples a coin rather than measuring it:

| GPU | develop pins (`newton 1.5.1` / `warp 1.16.0` / `mujoco 3.11.0`)
| this PR (`newton 1.6.0rc1` / `warp 1.17.0` / `mujoco 3.12.0`) |
| --- | --- | --- |
| RTX PRO 6000 Blackwell | 3 / 5 failed | 3 / 5 failed |
| L40 | 3 / 3 passed | 4 / 4 passed |

Both pin sets fail at the same rate on Blackwell and both are clean on
L40, so the failure is
hardware-dependent, not version-dependent. Intermediate Newton revisions
(the commits before and
at [newton#4119](newton-physics/newton#4119),
the MuJoCo 3.12 bump) show
the same behaviour, so neither Warp 1.17, MuJoCo 3.12, nor isaac-sim#4119 is
implicated.

**Why it failed.** The test asserted bit-reproducible rewards without
ever asking for a
determinism guarantee. Newton defaults to
`wp.DeterministicMode.NOT_GUARANTEED`, under which
Warp's atomics may accumulate in any order, so two runs of the same
environment are not required
to agree — the assertion was stricter than the configuration it ran
under, and whether it held
came down to GPU scheduling.

The Newton-backed case now passes `deterministic_mode="run_to_run"`,
which is exactly the
guarantee this test asserts: one device, one process, run twice.
`deterministic_mode` is a Newton
setting, so the PhysX-backed `IsaacContrib-Lift-Cube-Franka` case leaves
it unset and the helper
keeps asserting that the mode is only applied to a `NewtonCfg` backend.
This is a
test-configuration fix, not a masking of the intermittency: the
guarantee the assertion depends
on is now actually requested.

Related: [isaac-sim#7561](isaac-sim#7561)
addresses the adjacent layer and
does not overlap this PR. Newton's solvers take a per-module
`deterministic` argument, which is
what `deterministic_mode` reaches and what this PR sets; Newton's sensor
and geometry kernels take
no such argument and fall back to the `warp.config.deterministic`
global, which isaac-sim#7561 raises from
the same config field in the RL entrypoint.

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

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

- `uv lock --check` — clean; the relock moves exactly the four packages
above, and the
  `[project].dependencies` pin moves exactly one further lockfile line
- Default resolve of the published metadata returns `newton==1.6.0rc1`
under both
  `uv pip compile` and `pip download`, with no `--pre` flag
- `uv run --frozen python -m pytest
source/isaaclab/test/cli/test_wheel_builder_metadata.py
source/isaaclab/test/cli/test_uv_run_pyproject.py` — 21 passed, which
enforces that the two generated `uv-overrides.txt` files match the
override table and that `[tool.isaaclab.versions]` mirrors the
dependency pins
- `uv run isaaclab -f` — passed
- Full Docker + Tests suite — **48 passed / 0 failed** on `b184335e80b`

(cherry picked from commit bc3ebea)
# Description

Support both the released OVPhysX 0.5.11 lifecycle API and the OVPhysX
0.6 lifecycle API without changing Isaac Lab's dependency pins.

This follows the existing OVRTX 0.4.1/0.5 compatibility pattern:

- Detect the installed `ovphysx` distribution version once at import.
- Resolve an immutable lifecycle mapping to `warmup_gpu()` / `release()`
for OVPhysX 0.5.11 and to `warmup()` / `destroy()` for the OVPhysX 0.6
release line and later, including prerelease and development builds.
- Default missing or unparsable metadata to the supported OVPhysX 0.5.11
path.
- Keep the public `ov` and `ovphysx` extras pinned to `ovphysx==0.5.11`;
OVPhysX 0.6 remains a manual internal-testing overlay.

The lifecycle changes preserve existing 0.5.11 cleanup semantics. For
OVPhysX 0.6 only, they also retain OVPhysX and OVStage ownership when
`destroy()` fails before native teardown so cleanup can be retried; a
terminal destroy error releases dead owners.

The scope is limited to OVPhysX lifecycle compatibility code, tests, and
the `isaaclab_ov` changelog fragment. No actuator changes or dependency
updates are included.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)

## Validation

- `uv run --frozen --extra test --extra ovphysx python -m pytest
source/isaaclab_ov/test/physics/test_ovphysx_compat.py
source/isaaclab_ov/test/physics/test_ovphysx_scene_data_backend.py -q` —
50 passed against the pinned OVPhysX 0.5.11 environment.
- The same 50-test suite passed with installed OVPhysX metadata
simulated as 0.6.0, including the version-independent OVStage ownership
test and version-selected 0.6 lifecycle doubles.
- The 0.6 development-build regression fails on the prior PR head and
passes with the release-line classifier.
- `uv run --extra test --extra ovphysx python -m pytest
source/isaaclab_ov/test/assets/test_rigid_object.py::test_warmup_attach_stage_not_called_for_cpu
-q` — 1 passed against the real OVPhysX 0.5.11 CPU runtime.
- `uv run --frozen --extra test --extra ov python -m pytest
source/isaaclab_ov/test/test_ovrtx_clone_plan.py -q` — 17 passed after
merging upstream fix isaac-sim#7582.
- Changelog fragment validation against current `develop` — passed.
- `uv run isaaclab -f` — passed.

## Screenshots

Not applicable.

## 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 and that the
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] The contributors already exist in `CONTRIBUTORS.md`

---------

Co-authored-by: marcodiiga <1969828+marcodiiga@users.noreply.github.com>
Co-authored-by: hujc <jichuanh@nvidia.com>
(cherry picked from commit b81afde)
This follows isaac-sim#7462 by making the simulation's `ClonePlan` available
before cfg-owned scene construction.

`ReplicateSession` now builds and publishes the plan on entry,
constructs every participant at its planned source path, and dispatches
that same object on exit. `SimulationContext` remains the canonical
owner of the plan pointer; no secondary lifecycle state, constructor
ownership heuristic, stage discovery, fallback context, or second clone
mapping is introduced.

`InteractiveScene` owns this lifecycle for cfg-declared scenes. An empty
`InteractiveScene` authors only the env-0 prototype and leaves
replication to direct task setup. That removes redundant
environment-root authoring while preserving direct workflows with custom
clone positions. Plan positions remain NumPy during scene construction
and become a cached device tensor only when the public `env_origins`
property is read.

Kitless shadow visualization now takes its environment count and world
positions from the same plan instead of rediscovering destination env
transforms on USD. This lets OVPhysX feed Newton Renderer or OVRTX
without requiring redundant destination prims.

Custom cfg-owned composition roots should use the session around cfg
construction:

```python
with cloner.ReplicateSession(asset_cfgs, num_clones=num_envs, env_spacing=env_spacing):
    for cfg in asset_cfgs:
        cfg.class_type(cfg)
```

Homogeneous direct workflows construct env 0 first, then finish their
one clone lifecycle explicitly:

```python
plan = cloner.clone_plan_from_env_0(src, dest, num_envs, positions, global_paths=global_paths)
cloner.replicate(plan)
```

| Scope | Added | Deleted | Net |
| --- | ---: | ---: | ---: |
| This PR | 180 | 143 | +37 |
| Production | 79 | 79 | 0 |
| isaac-sim#7462 + this PR | 1,413 | 1,813 | -400 |

The earlier functional 3B head was performance-neutral in one matched
warm sample on physical GPU 0 using `Isaac-Lift-KukaAllegro`, 4,096
environments, Newton MJWarp physics, and no visualizer:

| Metric | This PR | merged develop |
| --- | ---: | ---: |
| Total startup | 42.58 s | 43.11 s |
| Environment creation | 39.76 s | 39.24 s |
| First step | 0.658 s | 0.637 s |

The cleanup commits remove redundant empty-scene root authoring and
eager environment-origin tensor creation. A current-head Kuka sample
will replace this table when the shared physical GPU 0 is idle.

- Breaking change
- Bug fix
- Documentation update

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

Not applicable.

- 92 clone-plan and `ReplicateSession` tests passed
- 3 focused `InteractiveScene` origin/lifecycle tests passed on CPU and
CUDA
- 16 Newton clone/visualization-builder tests passed
- 22 Newton shadow-model lifecycle tests passed
- The missing-destination regression test fails with `KeyError` before
the fix and passes after it
- OVPhysX → Newton Renderer completed creation, reset, and first
rendered step with only the env-0 USD prototype
- Former CI failures passed: visual-material scene (1), multi-mesh
ray-caster camera (21), ray-caster integration (7), and Newton
duplicate-body frame transforms (4)
- PhysX and Newton visual-color-randomization demos reached setup and
continued through repeated resets
- Warning-free current documentation build passed
- Repository formatting, lint, changelog, and LFS checks passed
- `git diff --check` passed

The prior `isaaclab_rl` failure is the independent LEAPP 0.7 regression
fixed by isaac-sim#7592; this PR does not duplicate that dependency pin.

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding documentation changes
- [x] My changes generate no new warnings
- [x] I have added focused lifecycle and regression tests
- [x] I have added the required changelog fragments
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit ad83008)
…#7360)

# Description

Use the shared Isaac Lab environment creation path in all benchmark play
adapters so `DirectMARLEnv` tasks follow the same backend-specific
conversion rules as training.

This also:
- Adds the frontend argument required by the shared environment creator.
- Preserves native SKRL multi-agent handling for IPPO and MAPPO while
converting PPO.
- Reports the rejected unwrapped environment type in RL wrapper
validation errors.
- Adds focused regression coverage and package changelog fragments.

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.

## Validation

- `uv run --isolated --frozen --extra test python -m pytest
source/isaaclab/test/benchmark/test_api.py
source/isaaclab_rl/test/test_rsl_rl_wrapper_observations.py -q
--disable-warnings` (31 passed)
- `uv run --frozen isaaclab -f`
- One-step `Isaac-Shadow-Handover-Direct` RSL-RL play benchmark with
Newton MJWarp completed successfully.
- Isaac Sim PhysX smoke was not run because the optional installation
requires interactive NVIDIA EULA acceptance.

## 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] No public documentation changes are required; the behavior changes
are covered by changelog fragments
- [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/<pkg>/changelog.d/` for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit 632f197)
…c-sim#7468)

# Description

Removes the Newton 1.5 compatibility shim for the MuJoCo tendon adapter.
The shim back-filled the
`mujoco:actuator` custom-frequency surface that
[newton#4017](newton-physics/newton#4017)
adds, so the adapter could be written once against the 1.6 API while the
repository was still pinned
to 1.5. That pin moved to `newton[sim]==1.6.0rc1` in isaac-sim#7445, so the shim
now returns both of its
arguments unchanged on every call — dead code on the hot path of every
Newton Shadow Hand run.

The adapter now reads the API directly off the articulation view and
model. Verified present in
`newton 1.6.0rc1`:

| Symbol | Location |
| --- | --- |
| `ArticulationView.custom_frequency_counts` |
`newton/_src/utils/selection.py:1023` |
| `ArticulationView.custom_frequency_labels` |
`newton/_src/utils/selection.py:1024` |
| `ArticulationView.tendon_count` |
`newton/_src/utils/selection.py:1107` |
| `Model.custom_frequency_articulation` |
`newton/_src/sim/builder.py:2351` |

`resolve_fixed_tendon_actuator_columns()` already consumed exactly
these, so the only change at the
call site is dropping the wrapper:

```diff
-        view, model = ensure_newton_custom_frequency_api(articulation.root_view, model)
+        view = articulation.root_view
```

Deletes `physics/_mjwarp_view_compat.py` (284 lines) and
`test/physics/test_mjwarp_view_compat.py`
(134 lines). Nothing else in the repository referenced the module,
`ensure_newton_custom_frequency_api`,
or `actuator_owner_rows`.

## Type of change

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

## Validation

`test_mjwarp_tendon_control.py` — **10 passed**, unchanged from before
the removal. The adapter's
own coverage is untouched by this PR; only the shim's own tests are
deleted along with the shim.

```
uv run --frozen --extra test pytest source/isaaclab_newton/test/physics/test_mjwarp_tendon_control.py
10 passed in 5.49s
```

## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

(cherry picked from commit 56c0fe6)
isaac-sim#7614)

# Description

On the PhysX and OVPhysX backends on GPU, a `ContactSensor` with the
default `history_length=0` and the default `lazy_sensor_update=True`
kept reporting the last in-contact force after the body had left
contact, for as long as the body stayed in the air, whenever its data
was read less often than every physics step (for example once per policy
step with `decimation=4`).

**Root cause.** PhysX zeroes a body's entry in
`get_net_contact_forces()` only on the exact physics step where that
body's contact is lost. With `history_length=0` the sensor only called
the getter when `.data` was accessed, so a policy-rate reader skipped
most contact-lost steps and never saw the zero. The Isaac Lab kernels
and the CUDA-graph replay are not involved: the raw getter output, the
cached Warp view, and the sensor output agree at every read, and
disabling the graph changes nothing. CPU is unaffected. `history_length
> 0` is unaffected because the base class already refreshes every
physics step. The experiment table and a standalone reproduction are in
isaac-sim#7613; OVPhysX reproduces identically through its contact binding.

**Fix.** Both sensors override `update()` to fetch the physics-owned
buffers on every physics step, skipping the fetch when the base class
already refreshed on that step (history-bearing sensors, or
`force_recompute`). The Warp kernels that turn the fetched buffers into
sensor data still run lazily on data access, so the per-step cost is one
getter call, which is exactly what history-bearing sensors already pay.
The buffers are refreshed in place, so the cached views and the captured
CUDA graph stay valid. On PhysX the outer-graph-capture guard moves into
a helper shared by the eager fetch and the buffer update, so a capture
is rejected on either path and the existing capture test keeps its
"raise before touching PhysX" contract.

**Tests.** `test_lazy_sensor_reports_contact_loss` in both the PhysX and
OVPhysX contact sensor suites: settle a cube for six policy steps of
four physics steps each, reading the sensor once per policy step, then
hold it in the air for six more, and require every air read after the
first to be below 0.1 N. On the unfixed code it fails on `cuda:0` with
the force stuck at the resting value for all six reads, and passes on
`cpu`; with the fix it passes on both. The PhysX
`test_contact_history_updates_at_sensor_period` row for
`history_length=0` asserted the old zero-fetch cadence and was updated
to the new one; its history-bearing rows are unchanged.

**Exposure.** Every shipped velocity task sets `history_length=3` and is
unaffected. The Kuka Allegro and Franka lift tasks configure fingertip
contact sensors with the default history length and feed the force
matrix into observations, so on PhysX GPU those observations could hold
a stale contact force after a finger released the object.

Found while working on isaac-sim#7283 / isaac-sim#7574.

Fixes isaac-sim#7613

## 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`

## 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

(cherry picked from commit b342207)
…c-sim#7738)

# Description

Support OvPhysX 0.6 without changing the public 0.5.11 default or CI
dependency sources. OvPhysX 0.6 already fixes reversed-joint Jacobians
and mass matrices; applying Isaac Lab's legacy sign correction again
produces incorrect dynamics. Gate that correction by the installed
runtime's release line, including 0.6 development builds.

Gravity compensation forces already use the public joint basis in both
tested versions. Remove their extra sign correction while retaining
joint ordering. Register the wheel's physics schemas with OVStage's
independent registry when that API exists, including when host USD
already supplies the schemas.

Keep installation documentation limited to publicly available packages.
The compatibility path is selected automatically when OvPhysX 0.6 is
already installed; no internal-build installation support is added.
Public package pins and CI workflows remain unchanged. The schema fix is
adapted from `integration/ovphysx-next` and overlaps isaac-sim#7626.

## Type of change

- Bug fix
- Documentation update

## Release backport

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

## Validation

- [Public OV backend
CI](https://github.com/isaac-sim/IsaacLab/actions/runs/34504247401/job/102962556513):
**1,021 passing cases, 28 skipped**, including all eight CPU/CUDA
dynamics regressions and all six version-boundary cases. The [full
package CI
run](https://github.com/isaac-sim/IsaacLab/actions/runs/34504247401),
x86/ARM installation checks, wheel build, documentation, formatting, and
changelog/link checks all passed. Both multi-GPU checks also passed.
These CI results cover commit `1ac23b8fafa`; CI is being rerun for the
review follow-up.
- **16 native dynamics cases passed:** 0.5.11 and 0.6.2 on CPU and CUDA,
with/without gravity and custom joint/body ordering. Checks compare
Jacobian-predicted velocity with measured body velocity, generalized
kinetic energy with body kinetic energy, and gravity compensation with
summed body weights through the Jacobian.
- Reproduced the 0.6 Jacobian failure before the version gate and the
0.5 gravity-force failure before removing its extra correction.
- **76 tests passed:** shared ordering kernels, version boundaries,
schema registration, and manager lifecycle; legacy resolver/cache tests
also passed.
- Review follow-up: **36 lifecycle and compatibility tests passed on
each runtime** (0.5.11 and 0.6.2). The added missing-OVStage regression
failed before the fix and passed afterward.
- Full Sphinx HTML build passed with warnings treated as errors
(15-second external inventory fetch timeout). Formatting and changelog
checks passed. Full local suite intentionally not run; broader
validation uses CI.

The internally tested OVRTX 0.5/OVStage renderer still differs from
existing Cartpole RGB goldens (2.02% pixels versus 1.50% allowed).
Unchanged `develop` code with the same native stack reproduces it; the
public renderer stack passes. Golden images and thresholds are
unchanged.

## 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 changes to the documentation
- [ ] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] I have added a changelog fragment for every touched source package
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit 412fb31)
# 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

(cherry picked from commit 270ef40)
## 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>
(cherry picked from commit e86463d)
…-sim#7438)

Make the aggregate Isaac Lab package self-contained and directly
installable from a Git revision.

The wheel previously exposed the canonical core package through a nested
`isaaclab/source/isaaclab/isaaclab` tree and a runtime
`isaaclab.__path__` mutation. In addition, downstream projects could not
use the repository as a normal Git dependency: pointing a package
manager at `source/isaaclab` built only the dependency-free leaf package
and omitted repository-level runtime resources such as
`apps/isaaclab.python.kit`.

This PR:

- installs the canonical core modules directly in the top-level
`isaaclab` package;
- resolves bundled resources consistently in source checkouts and
installed packages;
- exposes `tools/wheel_builder` as a PEP 517 package source;
- stages Git-source builds through the same aggregate package assembly
used by release wheels;
- preserves the aggregate wheel’s top-level `main()` and
`bootstrap_kernel()` compatibility APIs;
- routes the installed console command through the compatibility
dispatcher, including `--generate-vscode-settings`;
- retains the root `pyproject.toml` as the single source of truth for
third-party dependencies and extras;
- bundles the sibling `isaaclab_*` packages, Kit experience files,
package data, and template resources; and
- keeps the existing `tools/wheel_builder/build.sh` workflow by sharing
its staging implementation.

No dependencies are added to the individual Isaac Lab subpackage
manifests, and no public Python API is changed.

External task repositories and applications can now depend on one
aggregate `isaaclab` package at an unreleased commit or tag. They no
longer need:

- a sibling Isaac Lab checkout at a fixed local path;
- separate source declarations for every `isaaclab_*` package;
- a copied list of Isaac Lab's transitive third-party dependencies; or
- a downstream workaround for the missing `apps/isaaclab.python.kit`
resource.

A downstream uv project can declare:

```toml
[project]
dependencies = ["isaaclab"]

[tool.uv.sources]
isaaclab = {
  git = "https://github.com/isaac-sim/IsaacLab.git",
  rev = "<commit-or-tag>",
  subdirectory = "tools/wheel_builder",
}
```

Pinning `rev` to a commit or tag makes the complete Isaac Lab code and
dependency metadata reproducible in the downstream lockfile. A branch
such as `develop` also works, with the usual behavior that a future
lockfile update may select a newer revision.

This is particularly useful for downstream task packages that need
changes from `develop` before the next Isaac Lab wheel release, and for
CI systems that should resolve the complete environment without
provisioning a separate source checkout.

- The aggregate wheel uses a conventional flat `isaaclab` package
instead of extending `isaaclab.__path__` at runtime. The resource
resolver lives in the conventionally named `isaaclab.paths` module.
- The compatibility dispatcher now lives in the canonical package, so
source and aggregate builds share `isaaclab.__main__`; the generated
console entry point targets that dispatcher rather than bypassing legacy
options.
- A small PEP 517 backend implements wheel, sdist, and metadata hooks
for Git-source consumers.
- Package staging was moved from shell commands into a shared Python
helper used by both the PEP 517 backend and the existing build script.
- The generated aggregate metadata continues to read dependencies and
extras from the repository root and removes only the `isaaclab_*`
workspace self-references because those packages are bundled in the
artifact.
- The installed package includes `apps/*.kit`, so asset-root discovery
and `AppLauncher` use the same experience files as a source checkout.

- Bug fix (non-breaking change which fixes the installed package layout)
- New feature (Git-source installation for downstream projects)

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

- Resolved and installed a fresh uv project whose only dependency was
`isaaclab` from a pinned Git revision and the `tools/wheel_builder`
subdirectory.
- Verified imports for `isaaclab`, `isaaclab_assets`, `isaaclab_newton`,
`isaaclab_rl`, and `isaaclab_tasks` from that fresh environment.
- Verified the Git-built installation contains
`apps/isaaclab.python.kit`, resolves the default asset root, and runs
`isaaclab --help`.
- Built both a wheel and an sdist through the new PEP 517 entry point.
- Built the wheel through the existing `tools/wheel_builder/build.sh`
entry point.
- Ran focused CLI, wheel-metadata, and asset tests (77 passed),
including regressions for the legacy VS Code option and top-level
compatibility APIs.
- Inspected the wheel to verify that core modules use the flat layout,
`isaaclab/paths.py` replaces `_paths.py`, the console entry point
targets `isaaclab.__main__:main`, and the Kit experience files are
included.
- Ruff, formatting, and all applicable pre-commit hooks passed. The
repository-wide changelog hook reports pre-existing fragment differences
on the branch; this PR includes the required `isaaclab` changelog
fragments.

Not applicable.

- [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 documented the Git-source installation path
- [x] My changes generate no new runtime warnings
- [x] I have added tests that exercise the aggregate build and installed
resource layout
- [x] I have added a changelog fragment under
`source/isaaclab/changelog.d/`
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit 360522d)
A handful of unit tests inspect repository artifacts that only exist in
a source checkout (`apps`, `scripts`, the root `pyproject.toml`,
`uv.lock`, `tools/wheel_builder`, and the workflow files). Run from an
installed package they fail because those paths are absent. This gates
them behind a shared `source_checkout_root` session fixture that locates
the checkout and skips the test when it is not present, and returns the
root path so the tests stop recomputing it by hand.

The fixture lives in `source/isaaclab/test/conftest.py`. The affected
tests now take `source_checkout_root` and drop their local
`_repo_root()` helpers, so the gating is explicit at the test and the
requirement is hard to forget: a checkout-only test needs the root
anyway, so it asks for the fixture and gets the skip for free.

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

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

- [x] I have read and understood the contribution guidelines
- [x] I have run the `pre-commit` checks 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
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

(cherry picked from commit 9adf483)
# Description

The `ovrtx-cache-warm` job selects its tests with `test-k-expr:
(isaacsim_rtx or ovrtx) and (rgb or depth)`. That expression matches
**zero** of the 33 collected items, so the job deselects everything and
the shader-cache save step runs with nothing to publish:

```
collected 11 items / 11 deselected / 0 selected   (test_rendering_cartpole.py)
collected 22 items / 22 deselected / 0 selected   (test_rendering_cartpole_kitless.py)
```

## How isaac-sim#7114 made the AOV labels stale

`pytest -k` matches against parametrize IDs, and isaac-sim#7114 ("[Test] Group
rendering correctness AOVs") changed what those IDs are made of.

Before isaac-sim#7114, `_make_sensor_data_type_params()` emitted one node per
data type, and the data type was the last segment of the ID. After
isaac-sim#7114, `group_rendering_params()` merges every AOV that can be captured
from a single environment into one node, and the ID's last segment
becomes the *capture group* name (`static`, `temporal`) rather than any
individual data type:

| | Before isaac-sim#7114 | After isaac-sim#7114 |
| --- | --- | --- |
| kit |
`physx-isaacsim_rtx-rgb`<br>`physx-isaacsim_rtx-depth`<br>`physx-isaacsim_rtx-albedo`<br>…
| `physx-isaacsim_rtx_renderer-static` |
| kitless |
`legacy-ovphysx-ovrtx-rgb`<br>`legacy-ovphysx-ovrtx-depth`<br>… |
`legacy-ovphysx-ovrtx_renderer-static` |

`rgb` and `depth` still run — they are two of the AOVs captured inside
the `-static` node — but they are no longer *named* in any node ID. So
the `(rgb or depth)` half of the expression, which selected 4 kit + 8
kitless nodes under the old scheme, now selects nothing. The
`(isaacsim_rtx or ovrtx)` half still matches fine; only the AOV half
went stale.

The timeline is why this was never caught: isaac-sim#7114 merged 2026-08-21 and
the cache-warm job was added in isaac-sim#6905 on 2026-09-03, so the expression
was written against an ID scheme that had already been replaced two
weeks earlier. The job has deselected everything for its entire life.

Only this one expression was affected — the other `test-k-expr` values
in the workflows (`legacy`, `ovstage`, `not ovphysx`, `test_environments
and not (Soft or Cloth or Cable)`) match on segments isaac-sim#7114 did not
touch.

## Impact

* The warmer compiles no PSO blobs, so the `kit/` and `kitless/`
shader-cache trees are never populated and the rendering-correctness
jobs that restore them keep compiling shaders cold.
* Nothing bad is *published*: the save steps in
`.github/actions/ovrtx-shader-cache/action.yml` are gated on non-zero
file counts, so an empty tree is never written back.
* `verify.sh` does emit `::error::` for the empty trees, but the job is
`continue-on-error: true`, so the failure never surfaced.

## Fix

Pin the warmer to the RTX-renderer subset of the existing post-merge
node lists (2 kit + 4 kitless nodes) via the
`test-node-ids-file`/`test-node-ids-key` mechanism the sibling
`rendering-correctness-kitless-*` jobs already use, and drop
`test-k-expr`.

The mechanism change is deliberate rather than repairing the expression
to `(isaacsim_rtx or ovrtx) and static`. A `-k` expression that matches
nothing is indistinguishable from one that legitimately matches nothing
in a given file, so `tools/conftest.py` treats "0 selected with a
k-expr" as a pass by design — which is exactly why this went unnoticed
for the life of the job. An unknown node ID is passed to pytest as an
explicit target and fails collection outright, so the next
parametrize-ID rename cannot silently empty this job again.

Verified by generating the parametrize IDs from `rendering_test_utils`
at both `7b504e34df^` and `develop`, confirming the before/after IDs
above, that the pre-fix 11/22 deselected counts reproduce exactly, and
that all six configured node IDs resolve.

## 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`

## 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 <!-- CI-only change; no source package is touched -->
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package <!-- none touched:
CI configuration only -->
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

(cherry picked from commit e80f5df)
…sim#7736)

# Description

Updates the scheduled changelog resolver to discover every remote
`release/*` branch automatically instead of naming one release branch.
`develop` remains a static target.

A discovered release branch is included when it contains
`tools/changelog/cli.py`. The historical 2.x release branches predate
that compiler and are reported as skipped rather than creating
permanently failing nightly jobs. The current resolved release set is
`release/3.0.0` and `release/3.0.0-beta2`; future compiler-enabled
release branches are picked up without another workflow edit. Manual
dispatch still accepts exactly one explicit branch.

Companion default-branch PR: isaac-sim#7737

## Type of change

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

## Validation

- Full `pre-commit run --all-files` passed, including changelog and Git
LFS pointer checks.
- YAML parsing passed.
- The scheduled resolver produced
`["develop","release/3.0.0","release/3.0.0-beta2"]`.
- The manual resolver produced `["release/3.0.0"]`.
- Unsupported `release/2.1.0`, `release/2.2.0`, and `release/2.3.0` refs
were detected and skipped.
- `git diff --check` passed.

## Release backport

- [x] Backport automation is not requested; the default-branch companion
PR applies the live scheduling fix directly.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the repository pre-commit checks.
- [x] My changes generate no new warnings.
- [x] No source package changed, so no changelog fragment is required.
- [x] Documentation and screenshots are not applicable to this
workflow-only change.

(cherry picked from commit e78aa3e)
## 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 isaac-sim#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`

(cherry picked from commit 480398d)
…7821)

## 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

(cherry picked from commit 538a409)
…saac-sim#7800)

# Description

Fixes the AnymalD / OVPhysX env-step regression introduced when isaac-sim#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

(cherry picked from commit 416a1d1)
# Conflicts:
#	source/isaaclab/test/install_ci/uv_pip/uv-overrides.txt
#	tools/wheel_builder/uv-overrides.txt
# Fixed locomanipulation NuRec SDG generation

Hugging Face NuRec assets were updated to v0.2. This PR updates
locomanip_sdg to use the v0.2 assets and fixes several issues in the
NuRec SDG workflow:

- Fixed navigation pose projection and recorder initial-state capture
after placement.
- Synced randomized static fixture poses so downstream success checks
use the placed table pose
  - Applied Isaac RTX Gaussian camera settings for NuRec camera capture.
- Automatically enabled placement randomization when a NuRec scene is
used.

## 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

<img width="692" height="437" alt="image"
src="https://github.com/user-attachments/assets/5491a85a-cd94-4fa0-818e-66e4983cdd6c"
/>

## 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`
- [ ] 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
-->

(cherry picked from commit b9618b6)
@kellyguo11

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 17, 2026
maxkra15 and others added 10 commits September 17, 2026 19:01
# Description

Pin the Franka Pour robot asset to its authored `Colliders=convex_hulls`
variant. The primitive default omits the arm collision meshes (`link0_c`
through `link7_c`) required by the task, preventing the current Newton
MPM environment from starting correctly.

This keeps the current 70% / 735-particle layout unchanged.

## 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 --extra test python -m pytest -q
source/isaaclab_tasks/test/contrib/test_franka_pour_env_cfg.py` (13
passed)
- `uv run isaaclab -f`
- Local Newton GL playback with the published `model_6997.pt` checkpoint
and one current-layout environment

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] Documentation changes are not required for this task configuration
fix
- [x] My changes generate no new warnings
- [x] I have added a test that proves the asset variant contract
- [x] I have added a changelog fragment for `isaaclab_tasks`
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit ad8b371)
# Description

Pin the Franka Pour robot asset to its authored `Colliders=convex_hulls`
variant. The primitive default omits the arm collision meshes (`link0_c`
through `link7_c`) required by the task, preventing the current Newton
MPM environment from starting correctly.

This keeps the current 70% / 735-particle layout unchanged.

## 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 --extra test python -m pytest -q
source/isaaclab_tasks/test/contrib/test_franka_pour_env_cfg.py` (13
passed)
- `uv run isaaclab -f`
- Local Newton GL playback with the published `model_6997.pt` checkpoint
and one current-layout environment

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] Documentation changes are not required for this task configuration
fix
- [x] My changes generate no new warnings
- [x] I have added a test that proves the asset variant contract
- [x] I have added a changelog fragment for `isaaclab_tasks`
- [x] My name already exists in `CONTRIBUTORS.md`

(cherry picked from commit ad8b371)
…aac-sim#7870)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[isaac-sim#6457](isaac-sim#6457)
([564a008](isaac-sim@564a008)),
then moved into the current Lift tasks in
[isaac-sim#6732](isaac-sim#6732)
([73106da](isaac-sim@73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and
isaac-sim#7866. [The isaac-sim#7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.

(cherry picked from commit c5d33ef)
…aac-sim#7870)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[isaac-sim#6457](isaac-sim#6457)
([564a008](isaac-sim@564a008)),
then moved into the current Lift tasks in
[isaac-sim#6732](isaac-sim#6732)
([73106da](isaac-sim@73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and
isaac-sim#7866. [The isaac-sim#7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.

(cherry picked from commit c5d33ef)
…7868)

`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [isaac-sim#5400](isaac-sim#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[isaac-sim#913](isaac-sim#913).
[isaac-sim#7624](isaac-sim#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871,
and isaac-sim#7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit e836331)
…7868)

`OperationalSpaceControllerAction` and the OSC integration-test helper
used link-origin poses and Jacobians together with center-of-mass
velocity feedback. When a link rotates with an offset center of mass,
these quantities describe different points, producing incorrect velocity
feedback. The task-frame test also copied rounded command quaternions
directly into reference frames, producing inconsistent composed targets.

Use `body_link_vel_w` and `root_link_vel_w` in both OSC callers, and
normalize the test's cloned task-frame quaternion before coordinate
conversion. Controller gains, raw command fixtures, convergence
tolerances, and step budgets match the base branch; the nullspace
damping ratio remains 1.0.

Two direct regressions guard these contracts: a moving, fixed-base
Franka checks each caller's velocity against its link Jacobian
multiplied by measured joint velocity, and a numerical check verifies
that the same rounded command resolves to the same absolute target
through root and task frames without mutating its inputs.

Provenance:

- [isaac-sim#5400](isaac-sim#5400) migrated both
OSC callers to `body_link_jacobian_w` while retaining the COM velocity
accessors.
- The rounded fixtures and unnormalized task-frame copy originated in
[isaac-sim#913](isaac-sim#913).
[isaac-sim#7624](isaac-sim#7624) later
normalized absolute pose commands, while the separately supplied frame
remained unnormalized. The exact change that first exposed the
convergence failures has not been bisected; these references establish
the input inconsistencies, not the first failing CI run.

Validation:

- Restoring COM feedback makes both velocity regression cases fail, with
a maximum linear-velocity discrepancy of 0.01469 m/s versus the 1e-4
assertion tolerance. Both pass with link-origin feedback.
- Removing frame normalization makes the target-equivalence regression
fail with a quaternion-component discrepancy of 0.00010675 versus the
1e-6 tolerance. It passes with the correction.
- The previously failing `test_franka_taskframe_pose_abs` and original
`test_franka_pose_abs_with_nullspace_centering` both pass with damping
1.0.
- Full OSC integration file: **21 passed** in 113 seconds, including all
three new regression cases.
- `uv run isaaclab -f` passes.

The earlier RL, legacy-rendering, and contrib failures have matching
failures and passing corresponding jobs in separate fixes: isaac-sim#7870, isaac-sim#7871,
and isaac-sim#7866, respectively. Those fixes remain separate from these OSC
corrections.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
(cherry picked from commit e836331)
…codex/backport-missing-runtime-deps-release-3.0.0
…o codex/backport-missing-runtime-deps-release-3.0.0
@github-actions github-actions Bot added the isaac-mimic Related to Isaac Mimic team label Sep 17, 2026
@kellyguo11 kellyguo11 changed the title [Backport release/3.0.0] Complete runtime, dependency, and CI backports [Backport release/3.0.0] Complete develop backports Sep 17, 2026
@kellyguo11

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 17, 2026
@kellyguo11
kellyguo11 merged commit 4c9e0e4 into isaac-sim:release/3.0.0 Sep 17, 2026
85 of 86 checks passed
@kellyguo11

Copy link
Copy Markdown
Contributor Author

Aggregate CI is green on 1b22248e6: 50 checks passed, 5 intentionally skipped, 0 pending, 0 failed. The consolidated PR supersedes #7852 and #7853 and runs release CI against the same pinned latest-develop image as develop.

kellyguo11 added a commit that referenced this pull request Sep 18, 2026
## Summary

- Revert the OVRTX source and test changes from open PR #7871 that were
inadvertently included in release backport #7851.
- Restore the four affected implementation/test files to the exact
`develop` versions at `e8363313c1441788a4619157954b1842d3857759`.
- Preserve the older release-only OVRTX mapping compatibility code and
existing immutable changelog fragments.
- Add a corrective `isaaclab_ov` changelog fragment for this
release-only revert.

## Validation

- `tools/changelog/cli.py check --include-worktree` against
`release/3.0.0`
- `ruff check` on the four affected Python files
- `ruff format --check` on the four affected Python files
- `python -m py_compile` on the four affected Python files
- `git diff --check`
- Confirmed no diff versus `develop` for the four reverted
implementation/test files

The OVRTX runtime tests and `uv run isaaclab -f` cannot resolve on this
macOS arm64 host because the project lock supports Linux x86_64/aarch64
and Windows AMD64. Linux PR CI is the authoritative runtime validation.

## Type of change

- Bug fix (release alignment)

## Checklist

- [x] The reverted implementation and tests match `develop`
- [x] No docs branch routing changes are included
- [x] Existing changelog compilation/history differences are left
untouched
- [x] A new changelog fragment documents the release-only revert
ooctipus added a commit that referenced this pull request Sep 20, 2026
…7904)

## Description

Backports ten `develop` PRs to `release/3.0.0`, including the PyTorch
2.12/CUDA 13.0 upgrade, the near-singular OSC fix, and the complete
cfg-first cloning and schema-fragment migrations.

The audit covers September 17, 2026 00:00 UTC through `develop` commit
`4269c29a39e463dd07c74a9704d890d7a5c01e08` (September 19, 23:55 UTC),
against release base `970d21ef48057a2efc3d749c0f2abab8e7e0c30e`.

| Source PR | Included change |
| --- | --- |
| #7777 | Refresh Newton solver transforms after fixed-root pose writes
|
| #7608 | Make direct cloning cfg-first, including assets, callers,
templates, tests, and migration documentation |
| #7895 | Apply the existing CI exclusion for Franka cable/cloth/soft
kitless rendering tests |
| #7872 | Load the CUDA runtime matching PyTorch for Newton graph
capture |
| #7831 | Check authored Newton mesh-collision schema tokens correctly |
| #7834 | Build documentation with the extra that provides Sphinx |
| #7838 | Migrate maintained consumers to physics schema fragments,
including readers and overrides |
| #7840 | Consistently name Isaac Lab 3.1 as the deprecation removal
release |
| #7903 | Handle near-singular operational-space control |
| #7674 | Upgrade PyTorch to 2.12, TorchVision to 0.27, and the CUDA
stack to 13.0, including installer, wheel, and cuRobo compatibility
changes |

All 305 changed non-lock files match the audited `develop` snapshot
exactly. The remaining file, `uv.lock`, matches that snapshot after
substituting the package versions from the release branch's existing
manifests; all 418 package entries were checked. Existing release
package versions, compiled changelogs, documentation routing, and OVRTX
compatibility code remain intact, including the #7880 revert. Source
commit hashes are recorded in the commit messages.

### Already present

#7866, #7870, #7867, #7869, and #7868 were included in #7851; #7819 was
backported by #7884; #7883, #7885, and #7887 were backported by #7889.
#7874, #7888, #7773, #7886, and #7042 were also already present.

The three automatic changelog/version compilation commits are excluded;
the release branch compiles its own fragments and maintains its own
versions.

## Type of change

- Release integration/backport
- Bug fixes and documentation updates
- Breaking changes already accepted for the 3.0 cloning and schema
migrations; their migration guidance and changelog fragments are
included

## Validation

- `uv run --no-sync isaaclab -f`: all checks passed using the existing
shared environment and the release base for changelog validation.
- Focused cloning, OSC feature, schema parity/shim, CLI, and task
configuration suite: **283 passed**.
- Newton fixed-root updates and CUDA runtime/capture regressions: **14
passed**.
- Complete OSC simulation suite: **21 passed**.
- Mesh-collision fragments: **17 passed**; cfg-first cloning
integration: **16 passed**; scene construction/ownership: **7 passed**.
- The above **358 tests passed with PyTorch 2.11**.
- With **PyTorch 2.12/CUDA 13.0**: installer/metadata/Docker tests **91
passed**; CPU/GPU OSC feature tests **17 passed**; complete OSC
simulation suite **21 passed**.
- `uv lock --check`: passed; release package manifests match their
lockfile entries.
- Repository skill validation: **23 skills passed**.
- File-by-file source audit, release-metadata preservation checks, and
`git diff --check`: passed.

Local simulation used RTX 5090 and Isaac Sim 6.0.1 with PyTorch 2.11 and
2.12. The full Docker image build and fresh installation matrix were not
rerun locally for this backport. Release CI uses its pinned Isaac Sim
6.1 image and remains the authoritative full integration check.
Kit-dependent suites run in separate processes to avoid loading
standalone USD before Kit.

## Release backport

Not applicable: this PR targets `release/3.0.0` directly.

## Checklist

- [x] Ran the complete pre-commit command.
- [x] Included the original migration documentation, regression tests,
and changelog fragments for every changed package.
- [x] Preserved source attribution and recorded every source commit.
- [x] Preserved the release branch's versions and existing
release-specific changes.

---------

Co-authored-by: vidurv-nvidia <vidurv@nvidia.com>
Co-authored-by: ooctipus <ooctipus@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset New asset feature or request documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team isaac-mimic Related to Isaac Mimic team

Projects

None yet

Development

Successfully merging this pull request may close these issues.