Skip to content

Angehu/perf smoke integration - #13

Closed
angehu-nv wants to merge 96 commits into
developfrom
angehu/perf-smoke-integration
Closed

Angehu/perf smoke integration#13
angehu-nv wants to merge 96 commits into
developfrom
angehu/perf-smoke-integration

Conversation

@angehu-nv

Copy link
Copy Markdown

Description

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

Fixes # (issue)

Type of change

  • 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

Screenshots

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

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks 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

maxkra15 and others added 30 commits August 3, 2026 11:38
# Description

Stabilizes the Reach environment smoke cases that intermittently
terminated inside the bundled OpenUSD 25.11 physics parser.

The current Kit runtime starts OpenUSD with multiple workers, where
concurrent physics descriptor collection can corrupt native state and
terminate pytest without a Python traceback. `SimulationApp` already
exposes `limit_cpu_threads`, but `AppLauncher` previously filtered that
option out.

This change:

- forwards `limit_cpu_threads` through `AppLauncher`;
- launches the regular, Newton, and stage-in-memory environment smoke
suites with one CPU worker; and
- gives `Isaac-Reach-Franka-OSC` a valid reachable absolute-pose action
with nominal stiffness instead of sampling an unbounded Gaussian pose
and non-unit quaternion.

## Drawback

`limit_cpu_threads=1` is broader than an OpenUSD-only switch. For the
lifetime of these three test processes it also limits Kit/Carbonite
tasking, TBB, and OpenBLAS. GPU physics and rendering remain parallel,
but CPU-heavy stage parsing, asset loading, and cloning may be slower
for every environment in these suites, and these jobs no longer exercise
multithreaded CPU paths.

This draft PR is intended to expose that CI wall-time tradeoff before
the approach is finalized. The workaround can be removed once the
bundled OpenUSD runtime contains the parser fix.

## Type of change

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

## Screenshots

Not applicable.

## Validation

- `uv run --frozen python -m pytest
source/isaaclab/test/app/test_kwarg_launch.py::test_limit_cpu_threads_forwarded_to_simulation_app
-q`
- CUDA:1 regular Reach/OSC smoke selection: 4 passed
- CUDA:1 explicit-Newton Reach/OSC smoke selection: 4 passed
- CUDA:1 stage-in-memory Reach/OSC smoke selection: 2 passed
- Five fresh combined stage-in-memory processes: 10/10 selected cases
passed
- `uv run --frozen isaaclab -f`
- Changelog gate evaluated against `upstream/develop`

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

---------

Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
## Description

Adds first-class cable authoring and runtime support for Newton.

- Adds `CableObjectCfg`, the `CableCfg` spawner, and `CableMaterialCfg`
for authoring open, linear, nonperiodic `UsdGeom.BasisCurves` cables,
with validated thickness, density, and the four stiffness moduli
(finite/positive geometry, finite/nonnegative stiffness).
- Adds a backend-dispatched `CableObject` and `CableObjectData` API
exposing per-segment world pose and velocity, with indexed and masked
pose/velocity writes, default-state capture for restoration,
interactive-scene integration, and model-rebuild rebinding on
`PHYSICS_READY`.
- Implements the Newton VBD backend for cables. Cables run under a
standalone `NewtonVBDManager` and under `CouplerProxyCfg` when a named
VBD entry owns the cable segments. Other backends are not registered, so
selecting PhysX or OpenUSD PhysX raises the generic factory import
error; PhysX non-support is documented in the supported-features tables.
- Adds opt-in cable collision (`collision_props`) with
adjacent-segment-only collision filtering, so connected segments are
filtered while the cable still collides with the ground and with other
cables, matching Newton's cable-pile behavior.
- Adds a runnable Newton VBD cable-pile demo (`scripts/demos/cables.py`)
with configurable cable and segment counts and periodic state resets,
plus a showroom gallery entry.
- Supports imported and replicated cables, colors VBD-integrated cable
bodies at simulation start, and skips particle-BVH rebuilds in
cable-only (particle-less) scenes.
- Allows physics materials to bind to deformable curves
(`PhysicsCurvesDeformableSimAPI`) while preserving existing
deformable-body query semantics.
- Adds the `Using Cables` guide covering authoring, materials,
collision, runtime state, USD import, and limitations.
- Adds authoring, importer, runtime, state, proxy-coupler, render-sync,
and callback-lifetime test coverage, plus public API documentation.

All four stiffness moduli are exposed. `shear_stiffness` and
`twist_stiffness` default to `None` and are then left unauthored, so
Newton keeps applying its stretch and bend fallbacks and existing cables
are unchanged. An authored zero is kept as zero rather than treated as
unset.

Cable curve points are synchronized to the render delegate through CPU
Fabric because the RTX Hydra delegate does not read GPU-backed Fabric
arrays for `BasisCurves` (NVBug 6502662). The on-device sync path can be
restored once that bug is fixed.

VBD builder coloring is unified into
`NewtonVBDManager.start_simulation`, which colors any VBD builder
(cables and deformables) on the clone path while the USD-import path is
colored during builder instantiation. This supersedes the
`post_replicate_hooks` / `color_registered_deformables` post-replication
coloring, which is removed. Deformable coloring is preserved through the
unified path.

## Known limitations

These are documented in the guide's Limitations section rather than
worked around.

- **Uniform point spacing is assumed.** Newton derives one stiffness
pair from the mean segment length, so uneven control-point spacing
mistunes the outlier segments. Tracked upstream as
newton-physics/newton#3722. This cannot be corrected on the Isaac Lab
side: `joint_penalty_k` is snapshotted once during initialization, so
post-finalize writes to `joint_target_ke` have no effect.
- **Contact properties are not per-cable.** The Newton cable importer
derives each cable's `ShapeConfig` from the import-wide default and
carries over only density and the collision flags, so friction, contact
stiffness/damping, margin, and gap fall back to solver-global values.
Tracked upstream as newton-physics/newton#3734. `collision_props` is
therefore honored for enabling collision, not for tuning it.

## Type of change

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

## Screenshots

N/A. This change adds backend API and simulation behavior without a
user-interface change.

## Validation

- The cable authoring, USD import (including adjacent collision
filtering and the shear/twist fallback semantics), runtime/state,
proxy-coupler, and render-sync test suites pass.
- The cable-pile demo runs under standalone Newton VBD with periodic
resets on CPU and CUDA, and renders under the Kit/RTX visualizer
(`--visualizer kit`, 250 steps) with the reset firing and no
missing-curve-point warnings.
- Masked segment writes are verified CUDA-graph capturable.
- Full pre-commit checks passed.
- Changelog validation passed for every touched package.
- Documentation built successfully without warnings.

## 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; CI handles
changelog compilation and version bumps
- [x] I have added my name to `CONTRIBUTORS.md` or my name already
exists there

---------

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

Fixes isaac-sim#5302.
Fixes isaac-sim#6853.

Manual direct workflows call the cloner after spawning their assets, but
most of them only authored per-environment collision groups on CPU—or
did not author them at all. The PhysX replication path currently uses
USD collision filtering instead of PhysX environment IDs, so CUDA
replicas could collide across environments and constrain articulated
joints despite valid effort targets.

This change:

- applies collision filtering on every PhysX simulation device for all
affected in-repo tasks and standalone scripts using the manual
direct-workflow cloning path;
- preserves each affected workflow's global ground or terrain collision
paths;
- guards the filtering by backend so Newton behavior is unchanged.

The deterministic 4,096-environment reproduction now reports identical
cart velocity in every environment after 20 steps at 100 N:

```text
min=6.7209768 m/s, max=6.7209768 m/s, mean=6.7209768 m/s
```

## Type of change

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

## Screenshots

Not applicable.

## Validation

- Audited standalone cloning scripts and updated the two affected
direct-workflow paths.
- Confirmed the original 4,096-environment constant-effort diagnostic
produces identical velocities across replicas.
- Confirmed the Newton MJWarp control remains consistent across four
replicas.
- `uv run isaaclab -f`
- `uv run --no-sync python tools/changelog/cli.py check issue-5302-base`
- Confirmed Cartpole rendering correctness passes for the PhysX/Isaac
Sim RTX and PhysX/Newton renderer combinations (2 passed).
- Confirmed the registered Cartpole and Shadow Hand camera tasks match
their updated collision-group stage goldens.

## 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 behavior-only fix.
- [x] My changes generate no new warnings.
- [x] Existing environment tests cover the affected behavior.
- [x] I have added a changelog fragment for the touched package.
- [x] My name already exists in `CONTRIBUTORS.md`.
…6728)

# Description

Disable Isaac Sim's default simulation-manager callbacks before
extension
startup using its new `enable_default_callbacks` setting.

On Isaac Sim versions that support the setting, Isaac Lab now preserves
the
native `SimulationManager` instead of replacing its module exports.
Older
versions continue to use the existing callback-disable and
manager-takeover
fallback for backward compatibility.

This prevents Isaac Sim's timeline and stage callbacks from invalidating
the
PhysX tensor view owned by `PhysxManager`, while allowing the
compatibility
patch to be removed once older Isaac Sim versions are no longer
supported.

## Type of change

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

## Testing

- `uv run isaaclab -f`
- `uv run python tools/changelog/cli.py check develop`
- `uv run --extra test python -m pytest
source/isaaclab/test/app/test_env_var_launch.py -k 'not livestream'`
- Legacy Isaac Sim ownership integration test: 1 passed
- New Isaac Sim setting runtime smoke:
  - verified the extension remained disabled until explicitly enabled
  - verified all five default callbacks were disabled
  - verified the native `SimulationManager` remained exported
  - reset and stepped `Isaac-Reach-Franka`
  - stepped successfully after a timeline stop/play cycle

## 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 have added tests that prove the fix is effective
- [x] I have added a changelog fragment for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`
…im#6849)

# Description

Make task configurations whose existing default aliased `PhysxAutoCfg`
use concrete `isaacsim_physx` instead. Tasks with an explicit Newton or
other backend default retain that default. The explicit `physics=physx`
selector remains automatic, so users can still request runtime-dependent
selection between Isaac Sim PhysX and OvPhysX.

This also fixes optional backend, visualizer, and RL framework
installation guidance. Runtime errors and documentation use complete `uv
run --extra ...` commands only when an optional dependency is required;
RSL-RL commands retain plain `uv run` because RSL-RL is included in the
base environment. Manual pip fallbacks install published wheels directly
instead of using invalid editable extras. The OvPhysX fallback
intentionally omits a version so the diagnostic does not become stale
when the runtime dependency changes.

Previously, task defaults that aliased `PhysxAutoCfg` could resolve to
OvPhysX when no explicit Kit signal was present, even though suffixless
PhysX tasks were expected to retain Isaac Sim PhysX behavior.
Separately, several failure messages suggested incomplete `uv run`
invocations or editable package commands that did not install the
missing runtime into the active environment.

No new dependencies are required.

## Type of change

- Bug fix
- Breaking change for tasks that previously defaulted to automatic PhysX
selection
- Documentation update

## Screenshots

Not applicable.

## Validation

- `uv run python -m pytest
source/isaaclab_ov/test/test_ovrtx_renderer_contract.py
source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py
source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py
source/isaaclab_tasks/test/core/test_preset_kit_decision.py
source/isaaclab_tasks/test/core/test_reach_franka_presets.py
source/isaaclab_tasks/test/core/test_runtime_compatibility.py` (78
passed, 17 skipped)
- Explicit config assertions for the preserved DR Legs, Handover, Franka
Soft, Reach, Allegro Hand, and Shadow Hand Newton defaults
- Root dependency audit confirming RSL-RL is a base dependency while
RL-Games, SKRL, SB3, RLinf dependencies, and video are optional
- `uv run --isolated --extra test -- make -C docs current-docs`
- `uv run python tools/update_environments_rst.py --check` (127 training
environments)
- `uv run python tools/changelog/cli.py check
changelog-upstream-develop`
- `uv run --no-project python tools/skills/cli.py check`
- `uv run isaaclab -f`

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the pre-commit checks
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have updated tests to prove the changed behavior
- [x] I have added a changelog fragment for every touched package
- [x] My name already exists in `CONTRIBUTORS.md`
# Description

Replaying demonstrations for an absolute task-space (IK) task crashed
*after* all
episodes had replayed successfully, with a `torch.linalg.solve ... input
matrix is
singular` error from the differential IK controller instead of exiting
cleanly.

  Root cause is a trailing step past the end of the recorded data. In
`replay_episodes_loop`, `env.step(actions)` sat outside the
`has_next_action`
check, so once every environment had exhausted its episodes the loop
applied the
untouched `idle_action` one last time before terminating. No task
defines
`idle_action`, so it falls back to `torch.zeros(env.action_space.shape)`
— and for
an absolute-pose action (`[pos_xyz, quat_xyzw, gripper]`) a zeros action
carries a
  **zero-norm quaternion**.

`DifferentialIKController.set_command` renormalized it as `quat /
norm(quat)`,
i.e. `0/0`, producing a NaN target orientation. The NaN propagated into
the joint
position targets, diverged the articulation, and only surfaced on the
next
decimation sub-step as an unrelated "singular matrix" failure — which is
why the
  traceback points at the solver rather than at the defect.

  Fixes:

- `scripts/tools/replay_demos.py`: stop before stepping once every
environment is
exhausted, so the replay terminates without applying the idle action or
running
    another IK solve.
- `DifferentialIKController.set_command`: a degenerate (zero-norm)
commanded
quaternion now holds the current end-effector orientation (identity when
none was
supplied) instead of emitting NaN. Applied per-environment via a
branchless
`torch.where`, so there is no added host sync on the training hot path.
- `adaptive_dls`: a non-finite Jacobian is reported by its actual cause
instead of
the opaque LAPACK singular-matrix / convergence failure. The check runs
only on
    the failure path, so the happy path is unchanged.

The controller change is not redundant with the script change: with
`--num_envs > 1`,
an environment that finishes early keeps receiving the zero-quaternion
idle action
every step while the others replay, which would diverge that environment
and take
  down the whole batch.

Reproduced and verified with `IsaacContrib-Stack-Cube-SO101-IK-Abs-v0`.
On the
unfixed code the QA command produces a byte-for-byte identical
traceback; with the
  fix it prints `Finished replaying 1 episode.` and exits 0.

Note (out of scope): `idle_action` defaulting to zeros is unsound for
*any*
absolute-pose task, since a zero quaternion is never a valid
orientation. Seeding
the quaternion to identity would be a broader change affecting every
task using the
  replay script, so it is left for a separate PR.

Fixes # (issue)

## Type of change

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

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] 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
…lision pipeline estimate (isaac-sim#6850)

# Description

`Isaac-Velocity-Rough-G1` with `presets=newton_mjwarp` and `--rl_library
rsl_rl` crashes at `sim.reset()`:

```
ValueError: MuJoCo naconmax (25600) exceeds contacts.rigid_contact_max (3840).
Create Contacts with at least rigid_contact_max=25600.
```

```
naconmax          = nconmax(100) x num_envs(256) = 25600   solver internal buffer
rigid_contact_max = ~15/env auto-estimate x 256  = 3840    collision-pipeline buffer
```

**Root cause.** On the `use_mujoco_contacts=False` (RSL-RL sensor) path,
the base `_initialize_contacts`
in `newton_manager.py` sizes `NewtonManager._contacts` from the
collision pipeline alone and never
consults the solver's `naconmax`. `_update_sensors ->
solver.update_contacts()` then requires
`buffer >= naconmax`, so `3840 < 25600` raises. The `mjwarp_manager.py`
override already sizes to
`solver.get_max_contact_count()` for the `use_mujoco_contacts=True`
path; the base path was missing
the same logic. This is a buffer-sizing bug, not a Newton/mujoco_warp
version regression.

**Fix.** Grow `_contacts` to `solver.get_max_contact_count()` when the
solver demands more. The buffer
only grows, so the allocation is unchanged wherever the pipeline
estimate is already large enough.

No linked issue.

## Verification

Reproduced and fixed on an NVIDIA L40 at 256 envs with the exact failing
invocation. Before: crash at
iteration 0. After: the run completes its iterations with no `naconmax`
error.

To confirm the larger buffer is genuinely populated rather than silently
empty, `CollisionPipeline.collide`
and the Newton contact sensor were instrumented and compared against an
unpatched control run made legal
by lowering `nconmax`:

| at reset | unpatched (buffer 3840) | patched (buffer 25600) |
| --- | --- | --- |
| `rigid_contact_count` | 4535 (118% of capacity) | 4530 (17.7%) |
| bodies reporting >1 N | 421 | 421 |
| max contact force | 2369.5 N | 2432.3 N |

Contact counts and sensor forces track the control run, so the patch
changes buffer capacity only, not
contact generation. Note that the unpatched buffer was itself
overflowing at reset (4535 contacts into
3840 slots), so contacts were being dropped even in configurations where
the guard does not fire.

A config-level `gap=0.0` workaround was ruled out: `naconmax` stayed at
25600 and the crash was unchanged.

**Known limitation.** This sizes the buffer to `naconmax` only. Where
`naconmax` is smaller than the number
of contacts the pipeline actually generates, the pipeline's own ~15/env
auto-estimate can still
under-allocate. That pre-existing sizing question is out of scope here.

## Type of change

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

## Screenshots

N/A

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

Note on the two unchecked boxes: no documentation pages are affected,
and the fix is verified by the
instrumented before/after runs above rather than by an added unit test —
happy to add a regression test
if maintainers would like one.

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

The CI credential no longer has access to `nvcr.io/nvidian/isaac-lab`,
so the nightly
image publish fails on push. That repository is unreachable even
anonymously:

| Image | Anonymous | With `NGC_API_KEY` |
|---|---|---|
| `nvcr.io/nvidian/isaac-lab:latest-develop` | denied | denied |
| `nvcr.io/0947644777160149/internal/isaac-lab:latest-develop` | — |
**ok** |

This points `isaaclab_image_name` at the org Isaac Sim already publishes
from, which is
the same org this branch pulls its base image from after isaac-sim#6815. Reading
and publishing
now happen in one place instead of straddling a mirror that no longer
receives builds.

`isaacsim_image_name` and `isaacsim_image_tag` are untouched; every
workflow already
resolves the publish target through `config.yaml`, so no workflow
changes are needed.

Follow-up to isaac-sim#6815.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- This change requires a documentation update

## Screenshots

None.

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

Push access to the new repository is unverified — only pull was probed.
The first
scheduled publish after this merges is the real confirmation.

`docs/source/features/include/docker_details.inc` still points readers
at
`nvcr.io/nvidian/isaac-lab:latest-develop-kitless`, which is both an
unreachable org and
a tag that does not exist. Left for a separate docs change.

---------

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

The cable demo used the common visualizer launcher arguments but
hard-coded its Newton VBD configuration, so it did not accept the
explicit `--physics` selector used by other demo scripts.

This change:

- exposes `--physics newton_vbd` as the demo's single supported physics
option;
- resolves the backend through `launch_simulation()` and then reapplies
the demo-specific VBD tuning;
- preserves the Kit default and the standard `kit`, `newton`, `rerun`,
`viser`, and `none` visualizer choices;
- documents the available physics, visualizer, and cable-demo options;
- removes the fixed-backend test override and adds a regression
assertion for the explicit selector.

The default launch behavior is unchanged.

## Type of change

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

## Screenshots

Not applicable; the demo's rendered output is unchanged.

## Validation

- `uv run --extra test python -m pytest
source/isaaclab/test/app/test_standalone_scripts.py` — 40 passed, 295
runtime cases skipped
- `uv run python scripts/demos/cables.py --physics newton_vbd
--visualizer none --num_cables 1 --num_segments 2 --max_steps 1`
- `uv run isaaclab -d` — warning-free documentation build
- `uv run --frozen isaaclab -f`
- `uv run --extra test python tools/changelog/cli.py check
cable-demo-pr-base` against `upstream/develop`

The regression test was also verified to fail against the pre-fix cable
script.

## Checklist

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

Synchronize the environment documentation with the physics, renderer,
and domain presets exposed by the registered task implementations.

The curated tables and interactive environment browser were maintained
separately from the generated comprehensive list, which allowed task
capabilities to drift between sections. The per-environment rows also
exposed the automatic `physx` and `rtx` family aliases where concrete
backend names are more actionable.

This change:

- regenerates the comprehensive table for all 127 training environments;
- synchronizes curated-table preset cells from the same registry data,
using the union for rows that group multiple task IDs;
- generates the interactive browser's core-task rows from the
registry-backed documentation rows;
- documents `physics=physx` and `renderer=rtx` as valid automatic
aliases in the selector overview while omitting them from
per-environment rows, which retain concrete selectors such as
`isaacsim_physx`, `ovphysx`, `isaacsim_rtx`, and `ovrtx`;
- adds regression coverage for curated tables, browser generation,
marker safety, and concrete selector filtering.

No new dependencies are required.

## Type of change

- Documentation update

## Screenshots

Not applicable; this updates table data and its generation tooling
without changing the page layout.

## Validation

- `uv run python -m pytest --noconftest tools/test/test_environ_docs.py`
— 21 passed
- `uv run isaaclab -f` — passed all hooks
- `uv run --isolated --extra test -- sphinx-build -W --keep-going -j 1
docs docs/_build/codex-pr-check-serial` — warning-free build passed
(direct equivalent of `make -C docs current-docs` on Windows)
- environment generator `--check` — 127 training environments up to date
- JavaScript syntax check — passed

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab -f`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] No package changelog fragment is required because no
`source/<package>/` files are changed
- [x] My name already exists in `CONTRIBUTORS.md`
Bumped packages:
- isaaclab: 15.1.1 → 15.2.0
- isaaclab_contrib: 1.0.0 → 1.1.0
- isaaclab_newton: 2.4.3 → 2.5.0
- isaaclab_ov: 0.10.1 → 0.10.2
- isaaclab_ovphysx: 8.2.2 → 8.2.3
- isaaclab_physx: 4.0.0 → 4.0.1
- isaaclab_tasks: 10.2.0 → 11.0.0
# Description
The bin packing demo previously spawned every grocery object in every
environment and parked the unused ones in an off-screen cache. This PR
reworks the demo on top of heterogeneous cloning: it samples a
per-environment object count, declares each bin layout as a clone
combination, and lets the clone plan spawn genuinely different object
sets per environment. Which grocery slots fill each bin is drawn with
`randperm`, so layouts vary in both object count and composition, with
small per-reset drop noise, and reset target poses read from the asset
default root pose.

- disable Newton_mjwarp physics backend for now since it does not
support heterogeneous worlds.

## Screenshots
Physx From:
<img width="1729" height="1143" alt="Screenshot from 2026-07-17
08-46-10"
src="https://github.com/user-attachments/assets/8b4d68d3-4e41-45cc-a053-a0a0ddf7db93"
/>
To:
<img width="1620" height="1040" alt="Screenshot from 2026-07-15
19-18-03"
src="https://github.com/user-attachments/assets/7b901d99-c152-464e-809b-86004e9835ea"
/>


## Type of change

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

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

---------

Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
)

# Description

Drop the xfail mark so all seven Newton Warp AOV cases per suite (on
every kitless Franka soft and cloth run) gate normally.

## Type of change

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

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] 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
…ing feature. (isaac-sim#6598)

## Summary

This PR refactors visualizer and video-recording related classes and
expands & cleans-up the video-recording feature.

ViewerCfg is deprecated. instead we can use Visualizer eye and look_at
fields.
ViewportControllerCfg is deprecated and combined with KitVisualizer
Two VideoRecording Config Classes are removed

Video recording is redesigned
- replaced gym RecordVIdeo wrapper with an internal method from
VideoRecorder
- eliminated eye and lookat fields from VideoRecorderCfg. the idea now
is the video recorder either records a visualizer or sensor (renderer),
and doesn't have any camera based fields - those fields should just live
with visualizer or renderer configs
- now multiple video recordings can be launched
- can now record tiled camera views in visualziers
- can now specify which sensor to record
- also added a few more VideoRecorderCfg fields, like to keep the last n
clips and start recording only after n steps

Added video recorder tutorial script and separated out the video
recorder docs from visualizer into its own docs page

Fixed an live plots issue in Rerun

Fixes isaac-sim#6605 

## Screenshots

Example captures from 1 cmd with 4 VideoRecordingCfgs. These examples
are from the new docs page.

Kit Visualizer
<img width="640" height="360" alt="example_kit_viewport"
src="https://github.com/user-attachments/assets/37d161a0-fd20-44be-a7b0-52c6753bdf46"
/>

Newton Visualizer
<img width="640" height="360" alt="example_newton_viewport"
src="https://github.com/user-attachments/assets/253dabbb-c8e8-4d4d-9537-6fc6caf4081e"
/>

Kit Visualizer Tiled View
<img width="640" height="640" alt="example_tiled_kit_viewport"
src="https://github.com/user-attachments/assets/bbbd7463-0044-46d7-8df4-cc8606fc4204"
/>

Kit Sensor (Renderer)
<img width="640" height="640" alt="example_sensor"
src="https://github.com/user-attachments/assets/97f9cd6b-8a18-4a0b-ae57-c411c7024392"
/>


## Test plan

- [ ] `source/isaaclab/test/envs/test_video_recorder.py` — 17/17 unit
tests pass (covers all `_select_video_backend` dispatch paths including
new Newton fallback)
- [ ] `source/isaaclab/test/sim/test_simulation_context.py` — 29 passed
before pre-existing hang on `test_timeline_callbacks_with_weakref`
(unrelated)
- [ ] `source/isaaclab/test/envs/test_env_rendering_logic.py` — 17/17
pass
- [ ] `source/isaaclab/test/sim/test_simulation_context_visualizers.py`
— 28/28 pass
- [ ] `source/isaaclab_tasks/test/core/test_recording_backends.py` —
**5/5 integration tests pass** (Kit/PhysX, Kit/Newton fallback, Newton
GL, PhysX renderer, Newton renderer)

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

---------

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

> [!IMPORTANT]
> Confirm the pull request base before submitting. Target `develop` for
all
> contributions. The `release/3.0.0-beta2` branch is a frozen stable
landing
> snapshot and is not used for ongoing maintenance.

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

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

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

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

Fixes # (issue)

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

## Type of change

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

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Breaking change (existing functionality will not work without user
modification)
- Documentation update

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

- [ ] 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
-->
… lazily (isaac-sim#6759)

# Description

Fixes a `SIGSEGV` on shutdown after training a camera task with the RTX
renderer (nvbug 6492483).

Not a rendering bug: `PhysicsEvent.STOP` is never dispatched, so **no
sensor or asset is ever
told to release its resources**.

## Root cause

A physics config may declare its manager lazily (`class_type =
"{DIR}.mjwarp_manager:NewtonMJWarpManager"`)
so that reading the config does not import the backend. `configclass`
wraps that as a
`ResolvableString` — a `str` subclass that proxies attribute access.
`initialize(...)` therefore
works, but the shutdown gate is an identity check:

```python
is_active_manager = sim is not None and sim.physics_manager is cls   # str is class -> always False
if is_active_manager:
    cls.dispatch_event(PhysicsEvent.STOP)                            # never runs
```

The guard exists to stop a *non-active* manager from clearing shared
state; written with `is`,
"skip when non-active" became "skip always" for every backend (since
isaac-sim#6193, 2026-06-15). The
failure is silent by construction — skipping every listener looks
exactly like having none.
PhysX was masked because `physx_manager.py:70` maps `PhysicsEvent.STOP →
IsaacEvents.TIMELINE_STOP`,
so its listeners kept receiving `STOP` through Kit's timeline.

`Camera._invalidate_initialize_callback` is registered on that event, so
render products stayed
registered at stage teardown: 8 leaked UJITSO processors,
`pipelineLayouts: 151`,
`descriptorSetLayouts: 119`, then `-11`. Assets subscribe to the same
event, so their
invalidation was skipped too.

## The fix

`PhysicsManager.close` compares against the lazily declared form as well
as the class, so the
dispatch no longer depends on how a caller stored the value.

Restoring it exposed teardown code that had not been executing. Also
fixed here:

- **`OVRTXRenderer.cleanup(render_data)` ignored its argument** and tore
down state shared by
every camera on that backend. It now releases what `OVRTXRenderData`
owns, matching
  `BaseRenderer.cleanup` and both sibling renderers.
- **Renderer-owned state had nowhere to be released from.** A renderer
is shared by every camera
whose config resolves to it, so its lifetime belongs to `RenderContext`,
which had no teardown
counterpart to `get_renderer`. `__del__` is not one — it runs under the
collector, where the
ovrtx objects it touches may already be gone. New `BaseRenderer.close()`
(no-op by default, so
other backends and out-of-tree subclasses are unaffected) and
`RenderContext.close()`, called
from `clear_instance()` after `STOP` and before `close_stage()`, while
the stage is still alive.
- **Two Newton RTX goldens captured leaked state.** Render products are
now released at teardown
rather than at collection, so each environment renders from its own.
Both recaptured.

## Scope

145 config fields use the lazy `"{DIR}..."` form. Exactly **one**
identity comparison exists
against them, the one fixed here; every other is `is None` / `is not
None`, which behaves
correctly on a `str`.

Fixes # (not provided -- tracked internally as nvbug 6492483)

## Type of change

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

## Testing

Reproduced on Isaac Sim `6.1.0rc1+release.44589`, single RTX A6000,
driver 570.211.01:

```
./isaaclab.sh train --rl_library skrl --task Isaac-Cartpole-Camera-Direct \
  renderer=rtx physics=newton_mjwarp
```

| | Baseline | With this fix |
|---|---|---|
| exit code | `-11` | `0` |
| leaked UJITSO processors | 8 | 0 |
| `pipelineLayouts` / `descriptorSetLayouts` | 151 / 119 | none |
| `GeometryStreaming` at shutdown | present | none |

The bug requires a **non-headless** run: `--headless` never creates the
viewport render path.

Regression tests, each verified to fail without its fix:

-
`test_simulation_context.py::test_stop_is_dispatched_for_lazy_class_type`
— `2 passed`
  (physx + newton); `2 failed` with the guard reverted.
- `test_ovrtx_renderer_contract.py` — **22 passed**; the cleanup and
close release cases fail
  against their previous implementations.
- `test_simulation_render_context.py` — **11 passed**; 2 fail with the
`close()` dispatch removed.
- Kitless `dexsuite_kuka_homo` `legacy-ovphysx-ovrtx`: **12/12**;
without the fix the 4th test
  fails and the process dies.
- `test_rendering_lift_kuka_hetero_kitless.py` is identical with and
without the renderer close,
  and all 54 environment teardowns complete without the process dying.

---------

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

# Description

Adds skills and documentation to correctly identify and solve multi-gpu
issues. Fixes console duplicate logging during multi-gpu training.

## Checklist

- [ ] 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
-->
# Clean up ant and humanoid locomotion, and make the direct and manager
workflows identical

## Summary

Cleans up the ant and humanoid locomotion tasks against the conventions
used by `core/cartpole`, and
makes the direct-workflow and manager-based environments define the same
MDP so both converge to the
same reward.

The cleanup surfaced four genuine bugs, one of which was already
breaking humanoid training on
`main` before this branch existed.

## Motivation

`Isaac-Ant` / `Isaac-Ant-Direct` and `Isaac-Humanoid` /
`Isaac-Humanoid-Direct` are meant to be two
presentations of the same task, but they had drifted into two different
problems. The direct
environments were not scaling rewards by `step_dt` the way
`RewardManager` does, so the two
workflows were not even on a common reward scale — 9641 versus 91 on the
same task.

The direct environments also carried a fair amount of dead machinery
inherited from the IsaacGym
port, and encoded joint gears as backend-ordered lists that had to be
duplicated per physics
backend.

## Changes

### Direct/manager parity

The manager-based environments were the better-specified MDP, so they
are the basis. The direct
environments gained:

- feet joint wrench observations (`observation_space` 36 → 60 for ant,
75 → 87 for humanoid)
- reset joint randomization (±0.2 rad, ±0.1 rad/s, clamped into the
joint limits)
- `step_dt`-scaled rewards, matching `RewardManager.compute()`
- the gear-weighted energy and joint-limit penalties
- `episode_length_s` 15.0 → 16.0 and `env_spacing` 4.0 → 5.0

Where the direct environments were the better-specified side, the
manager-based tasks were changed
instead rather than copying the weaker behaviour:

- the terminal death cost is now a `terminating` reward term on both
workflows
- the joint effort action is now clipped on both workflows

### Cleanup

- `joint_gears` is now a dict keyed by joint name expression instead of
a backend-ordered list, so a
single table is correct for every physics backend and the
`isinstance(cfg.sim.physics, ...)`
  branch is gone
- removed dead IsaacGym-era machinery from `LocomotionDirectEnv`: the
start rotation was the identity
quaternion, so `inv_start_rot`, `basis_vec0/1` and the `quat_mul` inside
`compute_heading_and_up`
were all no-ops; `motor_effort_ratio` was hardcoded to ones; `up_vec`,
`heading_vec` and `pitch`
  were computed but never read
- replaced the local `normalize_angle` helper with
`isaaclab.utils.math.wrap_to_pi`, and used it in
  the manager MDP terms too so both workflows wrap angles identically
- dropped a redundant `self.robot.reset()` (the base `_reset_idx`
already calls `scene.reset`) and a
  private `_ALL_INDICES` access
- absolute imports in `mdp/rewards.py` and `mdp/__init__.pyi`, two stray
`# isort: skip` markers
removed, and the humanoid gear table hoisted to a single `JOINT_GEARS`
constant instead of being
  written out three times
- split the `Metrics/success_rate` logging out of `progress_reward` into
a `survival_success_rate`
  term, matching the cartpole convention
- removed the pass-through `__init__` on `AntEnv` / `HumanoidEnv` and an
unused `contact_force_scale`
  field (later reintroduced as the feet wrench observation scale)

## Bugs fixed

**Unbounded joint efforts drove the MJWarp solver to `NaN`.** Humanoid
training aborted partway
through a run with `The observation group 'policy' ... contains NaN
values`. Reproduced in 10 steps
with large actions; the corruption originates in the raw articulation
state (`joint_pos`,
`joint_vel`, `root_lin_vel_w` all non-finite while the quaternion is
still unit-norm), not in any
observation or reward math.

| action scale | clamped | result |
|---|---|---|
| 3.0 | no | NaN at step 10 |
| 1.0 | no | clean 6000 steps |
| 3.0 | yes | clean 6000 steps |
| 5.0 | yes | clean 6000 steps |

This is **pre-existing on `main`** — confirmed by stashing this entire
branch and reproducing on
unmodified code, where `Isaac-Humanoid` failed at iteration 872. The
manager-based tasks never
clipped their joint efforts. Fixed by clipping on both workflows.

**The humanoid direct agent trained at a different rate.**
`HumanoidDirectPPORunnerCfg` overrode
`learning_rate` (1.0e-4 versus 5.0e-4), `desired_kl` and
`value_loss_coef`, so the two workflows
trained differently despite sharing an MDP. It now inherits the
algorithm settings and overrides only
the experiment name, as the ant and cartpole configs do. This closed a
10.4% reward gap to 0.4%.

**The manager-based tasks could not run on OvPhysX.** `presets=ovphysx`
failed with
`Unknown preset(s): ovphysx` because their physics preset configurations
were missing the `ovphysx`
entry the direct configurations already declared. Also pre-existing.

**`progress_reward` was inconsistent across reset.** `reset()` computed
the distance to the target
without zeroing the vertical component, while `__call__` zeroed it, so
the potential recorded at
reset did not match any subsequent step.

**The manager-based walk target was an absolute world position.**
`(1000, 0, 0)` was shared by every
environment, so robots in different grid cells aimed along measurably
different directions. It is now
offset by each environment origin, matching the direct environments.

## Verification

Parity was checked by driving both workflows from identical states and
comparing tensors directly,
which is independent of RL seed noise:

| | ant | humanoid |
|---|---|---|
| observation dimension | 60 = 60 | 87 = 87 |
| step-0 observation max abs difference | 0.0 | 0.0 |
| reward max abs difference, 60 steps | 0.0 | 4e-9 |

The humanoid comparison was repeated with actions large enough that the
new effort clip binds on
every joint, to exercise that path.

Training, `newton_mjwarp`, seed 42, 1000 iterations:

| task | manager | direct |
|---|---|---|
| ant | 80.36 | 74.68 |
| humanoid | 142.11 | 141.54 |

The ant difference sits inside its own run-to-run spread: the same
config and seed produced 81.98 and
74.68 on two separate runs, so roughly 9% of nondeterminism between
runs.

Smoke tested (3 iterations, all four tasks) on `newton_mjwarp`,
`isaacsim_physx` and `ovphysx` —
12/12 pass. `uv run isaaclab -f` is clean.

## Breaking changes

- `observation_space` for the direct tasks changed from 36 to 60 (ant)
and 75 to 87 (humanoid), and
`episode_length_s` from 15.0 to 16.0. **Existing direct-workflow
checkpoints will not load.**
- `joint_gears` changed from an ordered list (or a `{"physx": [...],
"newton": [...]}` dict) to a dict
keyed by joint name expression. Migrate by replacing the list with regex
entries, e.g.
`joint_gears = [15, 15, 15, 15, 15, 15, 15, 15]` becomes `joint_gears =
{".*": 15.0}`.
- Reward magnitudes for the direct tasks changed by roughly 60x because
they are now `step_dt`-scaled
like the manager-based tasks. Logged reward curves are not comparable
across this change.
- The joint effort clip changes the reachable effort envelope for the
manager-based tasks, so
manager-based checkpoints will behave differently even though they still
load.

## Known gaps

- **The experimental warp frontend is not ported.** Its observation
kernel writes a fixed 36/75-value
layout with no wrench block and unscaled rewards. Rather than let it
silently zero-fill the tail of
a 60/87 buffer, it now raises with an explicit message. `--frontend
warp` on these tasks does not
  run until it is ported.
- **Convergence is only established on `newton_mjwarp`.** PhysX and
OvPhysX are smoke tested but not
  trained to convergence.
- The direct configurations now set `bounce_threshold_velocity=0.2` on
the Isaac Sim PhysX preset to
match the manager-based tasks, instead of leaving the 0.5 default. This
changes PhysX behaviour for
  the direct tasks and has not been validated by a convergence run.
- The `NaN` fix addresses the trigger, not the solver behaviour. Whether
MJWarp should emit `NaN`
rather than erroring on a diverging articulation is a separate question,
and a sufficiently bad
  contact could still diverge inside the clipped envelope.


## Checklist

- [ ] 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: AntoineRichard <antoiner@nvidia.com>
# Description

Isaac Lab's cluster tooling currently only covers SLURM and PBS via
singularity. Both paths require converting the Docker image to a `.sif`
and copying the source tree to the cluster on every submission.

This PR adds an [NVIDIA OSMO](https://developer.nvidia.com/osmo)
workflow spec at `docker/cluster/multi_gpu.yaml`. OSMO runs the
published Isaac Lab container image directly, so there is no singularity
conversion and no code copy step — the image is the unit of deployment.

The workflow requests a single node and scales training across that
node's GPUs through the existing `train_multigpu` command. Everything
site-specific is a submission-time parameter (`image`, `rl_library`,
`num_gpu`, `num_cpu`, `memory`, `storage`, `platform`, `master_port`,
`args`), so the file carries no cluster- or user-specific defaults. When
`num_gpu` is `1` it falls back to the single-process `train` entry
point, so one file covers both cases.

Submitting a 4-GPU run:

```bash
osmo workflow submit docker/cluster/multi_gpu.yaml \
  --set num_gpu=4 \
  --set args="--task Isaac-Reorient-KukaAllegro --num_envs 4096"
```

The container startup script does two things beyond launching training:

- Hides the system Vulkan ICDs when the image ships its own, which
otherwise makes the loader pick up a conflicting driver on the compute
node.
- Splits the allocated CPUs across the per-GPU workers via
`OMP_NUM_THREADS`, so each worker does not size its thread pool for the
whole node.

The spec is a Jinja template and only becomes valid YAML after parameter
substitution, so it is excluded from the `check-yaml` pre-commit hook.
Rendering was verified for both the `num_gpu=1` and `num_gpu>1`
branches.

Fixes # (issue)

## Type of change

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

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [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

<sub>No changelog fragment is included because this PR does not touch
any package under `source/`; `tools/changelog/cli.py check` passes
as-is. No tests are included because the change is a cluster job spec
plus documentation.</sub>
## Summary

- Use corrected USD-authored Franka drive gains while retaining solver
velocity limits.
- Enable absolute DiffIK on Isaac Sim PhysX, Newton MJWarp, and OVPhysX.
- Reduce the NewtonIK rotational action scale for more reliable MJWarp
training.

The corrected `franka_panda.usda` and `payloads/Physics/physics.usda`
must be promoted to production before merge.

## Validation

- Franka preset tests: 25 passed
- Absolute DiffIK: train/play on PhysX, Newton MJWarp, and OVPhysX
- OVPhysX: stable 1,000-iteration training and exact play
- Targeted pre-commit checks passed

## Type of change

- Bug fix (non-breaking change)
# Description
Makes legacy kitless rendering failures fail PR checks while preserving
full test execution; merge after OVPhysX wheelhouse parity is restored.

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

## Checklist

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

Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
## Summary

This PR completes the latest Newton `main` dependency update by aligning
Isaac Lab with Newton global-world contracts.

- synchronize wheel-builder and installation-test overrides with the
root Newton, MuJoCo, MJWarp, and USD-schema pins
- expose the zero-copy local-world slice of `model.gravity` through
per-environment asset data
- use the canonical `world_count + 1` solver reset mask while leaving
the global entry unselected
- import Newton USD schema resolvers from the public `newton.usd` API
- give the Kamino internal-contact fixture the collidable geometry
required by the current pipeline
- align shared asset-interface and benchmark mocks with the
local-plus-global world layout

This is stacked on isaac-sim#6882. If isaac-sim#6882 merges first, its dependency commits
become part of `develop` and this PR narrows to the compatibility fixes.

## Scope and compatibility

This PR changes only latest-Newton compatibility. It contains no MPM
task, coupling, visualizer, RSL-RL, camera, teleoperation, or
golden-image change.

No Isaac Lab API is renamed or removed. Existing per-environment gravity
views remain live zero-copy bindings, ordinary resets select only local
environments, and the new global Newton entry remains untouched by
environment reset masks.

## Regression evidence

- the dependency bump alone reproduces gravity/compensation failures
because `model.gravity` is now shaped `(world_count + 1, 3)`
- the old N-entry reset mask uses Newton legacy behavior rather than the
current global-world contract
- the former Kamino internal-contact fixture has no collision pipeline
- wheel override files otherwise retain stale Newton-stack metadata
- the shared Newton benchmark model otherwise lacks the world layout
needed by real asset-data construction

The focused fixes make each of these regressions pass.

## Validation

- full isolated `isaaclab_newton` package suite passed
- shared articulation, rigid-object, and collection interface matrices
passed
- Newton manager abstraction coverage passed for every solver
configuration, including Kamino internal contacts
- articulation, rigid-object, and collection gravity coverage passed on
CPU and CUDA
- canonical reset-mask regression passed without Newton legacy-mask
warnings
- wheel metadata, packaging, benchmark, and shared mock coverage passed
- full pre-commit passed before commit and push

The compatibility work remains one focused commit,
`1f7511c55c23f4534e2dc9fe399d82e274edc327`, on top of Kelly Guo exact
isaac-sim#6882 commits and current `develop`. The pushed branch head is
`ca6dd9f1b914ca4e393daf1f2acfaaa717e365de`.

## Current CI triage

The branch-specific Newton, core, task, PhysX, RL, installation,
documentation, packaging, and lint suites pass. Three image/demo jobs
currently fail for reasons outside this diff:

- rendering correctness reproduces on current upstream `develop`,
including the same PhysX and registered Cartpole camera comparisons
- visualizer failures are image-golden and pause-frame drift; this PR
has no visualizer or golden diff
- the standalone demo failure is PhysX `bin_packing.py` clone planning;
this PR does not touch that demo or clone planner

Per scope, this PR does not modify goldens or unrelated shared code to
mask those failures.

---------

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

# Description

--xr aborted at startup with a dependency solver failure wherever the
Kit extension registry was unreachable — reported by QA in the Isaac Sim
6.1 container:

No versions of omni.kit.xr.bundle.generic that satisfies:
isaaclab.python.xr.openxr-3.0.0
Available packages for omni.kit.xr.bundle.generic version *: (none
found)
[Error] [omni.kit.app.plugin] Exiting app because of dependency solver
failure...

apps/isaaclab.python.xr.openxr.kit depended on
omni.kit.xr.bundle.generic, a meta-extension Isaac Sim does not ship (0
copies on disk in any install). It resolved only by downloading from the
Kit SDK
  registry, so every XR run required registry reachability.

The 2.3 line declared omni.kit.xr.system.openxr +
omni.kit.xr.profile.ar. Kit 110 removed profile.ar; its successor is
omni.kit.xr.ui.window.profile, which is shipped. The Isaac Sim 6.0
update
(0049bb5) pointed at the bundle instead — a one-line change — so the
migration to discrete XR extensions stalled halfway. This PR completes
it, matching what isaacsim.exp.base.xr.vr.kit declares.

This is latent since Isaac Sim 6.0, not a regression on develop —
release/3.0.0-beta2 carries the identical line. A workstation that
reaches the registry caches the bundle on first use and loads it
locally forever after, which is why it only ever surfaced in containers.

  Two related fixes:

- --xr without --visualizer kit now always resolves headless. Previously
a task config declaring a Kit visualizer left XR non-headless, selecting
the GUI experience and leaving /isaaclab/xr/auto_start
false — so the session waited for a Start XR click that headless users
cannot make. This wires up _xr_auto_start, which was computed but never
read.
- AttributeError: 'Namespace' object has no attribute 'headless' in
record_demos.py and teleop_se3_agent.py, which still read the --headless
flag removed in isaac-sim#6656. Fixed by exposing a public
  AppLauncher.headless.

Fixes # (issue)

## Type of change

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

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] 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
## Summary

- add `init_at_random_ep_len` to the RSL-RL runner configuration
- preserve randomized initial episode progress as the default
- honor the same setting in normal and benchmark training

## Motivation

Reset-dataset curricula need the first sampled states to complete a real
episode before they contribute outcomes. Tasks can now opt out of
randomized initial episode progress without an environment wrapper or
rollout-boundary synchronization hook.

The MPM Pour and Push tasks in isaac-sim#6875 are the initial consumers.

## Scope and compatibility

This PR contains one commit and only changes RSL-RL configuration and
its two Isaac Lab entrypoints. It adds no distributed collective,
training-state synchronization, environment wrapper, or MPM-specific
behavior. Existing tasks remain unchanged unless they explicitly set
`init_at_random_ep_len = False`.

## Validation

- focused RSL-RL configuration and entrypoint tests passed
- benchmark configuration coverage passed
- full pre-commit passed on head
`0bb84af6d571d61491f898c3a5b08384f3262088`
## Summary

- add a context-managed `newton_builder_world_hook` for temporary
per-world Newton builder authoring
- restore the previous hook safely for nested contexts and exceptions
- expose and document the single scoped API

## Motivation

Solver-specific scenes such as coupled MPM tasks need to augment each
replicated Newton world during construction. A scoped hook provides that
extension point without task-local mutation of retained clone sources or
permanent global hook state.

## Scope and compatibility

This PR contains one commit and is limited to the Newton cloner API, its
documentation, one focused lifecycle test, and a changelog fragment. It
does not add a clone-source helper and does not change existing
replication unless a caller explicitly enters the context.

## Validation

- focused nested-context, exception-cleanup, and lifecycle coverage
passed
- documentation built without warnings
- full pre-commit passed on head
`3550028fd1439779876c46c3ac762f885d385b96`
## Description

Follow-up to isaac-sim#6562, which merged with a red `standalone demos (headless,
Kit)` check. The bin-packing demo crashes when it runs with fewer
environments than it declares layouts:

```
RuntimeError: Clone planning did not assign spawn_path for '/World/envs/env_.*/Groceries/Grocery_02'.
[ERROR] Command failed with code 1: "... scripts/demos/bin_packing.py --num_envs 2 --physics isaacsim_physx --visualizer none"
```

Environments cycle through the declared layouts in order (`sequential`
gives env *i* layout `i % NUM_LAYOUTS`), so a run with two environments
only ever activates layouts 0 and 1. The remaining grocery slots are
claimed by some layout but active in none of the used ones, so clone
planning leaves their `spawn_path` unset and
`InteractiveScene._add_entities_from_cfg` rejects them. The bin itself
is unaffected because an asset named by no combination at all stays
active in every row — only *claimed* assets can end up orphaned.

This is user-facing, not just a CI artifact. Driving the layout
construction through `make_valid_clone_combinations` and `sequential`
over 200 random draws per environment count, the merged code leaves
slots unspawned in:

| `--num_envs` | runs with an unspawned slot |
|---|---|
| 1 | 194/200 |
| 2 | 177/200 |
| 4 | 96/200 |
| 8 | 17/200 |
| 16 (default) | 0/200 |
| 64 | 0/200 |

The default of 16 passed only because sixteen random subsets happen to
cover all 24 slots; nothing guarantees it.

Declaring the first layout as the full set of slots keeps every slot
active in env 0 for any environment count, and leaves the remaining
random draws unconstrained. Because `sequential` always hands layout 0
to env 0, this holds even at `--num_envs 1`. Env 0 now always shows a
full bin; envs 1..N-1 keep their random subsets.

## Type of change

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

## Screenshots

None; the demo renders as before apart from env 0 always being full.

## 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
- [x] 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 on the checklist

- **Tests:** no new test is added. The existing
`test_standalone_scripts.py` launch matrix already covers this —
`demos-bin_packing-isaacsim_physx-default-none` is the check that failed
on isaac-sim#6562. I verified it fails without this change (reproducing the
identical `RuntimeError` locally) and passes with it. The three runnable
visualizer cases (`none`, `kit`, `newton`) pass locally; `rerun` and
`viser` skip, as they do in CI.
- **Changelog:** no fragment is required. This touches only
`scripts/demos/`, so no package under `source/` is affected and the
changelog gate passes.
…m#6813)

## Summary

- The two startup log lines \`[INFO]: Created new renderer for
simulation: <name>\` and \`[INFO]: Using renderer: <name>\` were
silenced on kitless backends (Newton, OvPhysX) because the root logger
defaults to \`WARNING\` and no Kit logging bridge is present
- Add \`force_log_level(level)\` context manager to \`logging_utils\`
that saves the root logger and handler levels, lowers them for the
duration of the block, then restores them — no permanent change to any
logger or handler
- Wrap the two \`logger.info()\` call sites in \`RenderContext\` and
\`Camera\` with \`force_log_level(logging.INFO)\` so the messages always
reach the console regardless of backend

## Test plan

- [ ] Run with a kitless backend (e.g. \`physics=newton_mjwarp\`) and
confirm \`[INFO]: Created new renderer for simulation: OVRTXRenderer\`
and \`[INFO]: Using renderer: OVRTXRenderer\` appear in stdout
- [ ] Run with a Kit-based backend (default) and confirm the same lines
still appear and no other INFO output is added
- [ ] Run with \`--verbose\` / \`--info\` and confirm no duplicate or
missing log lines
Bumped packages:
- isaaclab: 15.2.0 → 15.3.0
- isaaclab_assets: 0.6.2 → 0.6.3
- isaaclab_newton: 2.5.0 → 2.6.0
- isaaclab_ov: 0.10.2 → 0.10.3
- isaaclab_physx: 4.0.1 → 4.1.0
- isaaclab_rl: 0.12.0 → 0.13.0
- isaaclab_tasks: 11.0.0 → 12.0.0
- isaaclab_visualizers: 1.3.1 → 1.4.0
# Description

The SO-101 leader-arm example assumed `so101_leader_plugin` was already
available. It is
produced only by building [Isaac
Teleop](https://github.com/NVIDIA/IsaacTeleop) from source,
so users hit a missing-binary error with no indication of the required
setup, then hit build
failures (commonly a missing `clang-format-14`) with no troubleshooting
guidance.

  In `docs/source/features/isaac_teleop.rst`:
   
- State that the plugin is built from Isaac Teleop source, and give the
build prerequisites,
install location
(`<IsaacTeleop>/install/plugins/so101_leader/so101_leader_plugin`), and
a
    hardware-free synthetic run to verify it.
- Add a **Start the plugin** section: Isaac Lab does not spawn it —
launch the sim, then
`source ~/.cloudxr/run/cloudxr.env` and run the plugin in a second
terminal.
- Link to the Isaac Teleop build-from-source and data-collection-in-sim
pages for the full
    walkthrough and build/runtime troubleshooting tables.
- Drop the incorrect `uv pip install lerobot` prerequisite — the plugin
speaks the FEETECH wire
protocol directly and calibrates with its own `calibrate` subcommand.
- Add the missing `--visualizer kit` to the "local viewport only"
commands (headless is the default).

Fixes # (issue)

## Type of change

- Documentation update

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

---------

Signed-off-by: Rafael Wiltz <rwiltz@nvidia.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
kellyguo11 and others added 24 commits August 8, 2026 20:28
# Description

Standalone demo smoke tests had two independent flaky failure modes:

1. The supervisor kept classifying fatal-looking output after it
intentionally sent `SIGTERM`. Kit can emit Material Library, USD
caching, and Replicator asyncio tracebacks during that forced teardown,
after the demo reached readiness and completed its healthy soak.
2. The first camera-enabled Kit/RTX process consistently needs roughly
526?558 seconds to initialize on CI, but the camera case had a fixed
600-second startup budget. That left only 42?74 seconds for runner,
cache, and service variation. In the timeout example, approximately 10
seconds of failed OmniHub launch retries contributed to the case
crossing the limit at 605.8 seconds.

A CI experiment that disabled image saving and deferred the camera
demo's Matplotlib import still took 526 seconds. That rules out optional
plotting and confirms the long phase belongs to cold camera-enabled
Kit/RTX initialization; the experimental demo change has been removed
from the final diff.

This change fixes both test boundaries:

- Fatal-pattern detection stops immediately before intentional teardown,
while shutdown output remains captured for diagnostics. Fatal output
during startup or the soak still fails the test.
- The camera case receives a 900-second startup timeout, providing
headroom for its known cold initialization while preserving the
300-second default hang detector for other demos.

Example failures:

- Intentional-teardown traceback:
https://github.com/isaac-sim/IsaacLab/actions/runs/31243355943/job/93068486798?pr=6831
- Same teardown race on another unrelated PR:
https://github.com/isaac-sim/IsaacLab/actions/runs/31230902685/job/93048260426
- Same teardown race on PR 6979:
https://github.com/isaac-sim/IsaacLab/actions/runs/31247096260/job/93077436474?pr=6979
- Camera startup budget exhausted:
https://github.com/isaac-sim/IsaacLab/actions/runs/31243047225/job/93069642023?pr=6979

No new dependencies are required.

## Type of change

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

## Screenshots

Not applicable; this changes headless smoke-test supervision and a
case-specific timeout.

## Validation

- Teardown regression confirmed failing before the fix and passing after
it:
`uv run --frozen python -m pytest
source/isaaclab/test/app/test_standalone_scripts.py::test_subprocess_supervisor_ignores_fatal_output_after_intentional_teardown
-q`
- Camera timeout contract confirmed failing at the previous 600-second
value and passing at 900 seconds:
`uv run --frozen python -m pytest
source/isaaclab/test/app/test_standalone_scripts.py::test_commands_respect_script_launcher_capabilities
-q`
- Buffered pre-teardown output regression confirmed failing before the
drain fix and passing after it:
`uv run --frozen python -m pytest
source/isaaclab/test/app/test_standalone_scripts.py::test_subprocess_supervisor_classifies_buffered_fatal_output_before_intentional_teardown
-q`
- Platform-independent standalone harness subset: 35 passed, 298
simulator launches skipped, and 7 POSIX process-control tests deselected
on Windows.
- Linux standalone Kit CI passed with the teardown boundary; the camera
case took 526 seconds, providing the direct timing evidence used for the
final timeout fix:
https://github.com/isaac-sim/IsaacLab/actions/runs/31247940912/job/93079622769
- Changelog fragment gate against current upstream `develop`: passed.
- `uv run --frozen isaaclab -f`: passed after staging and again after
commit.
## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`uv run isaaclab -f`
- [x] Documentation changes are not applicable to this test
stabilization
- [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
Bumped packages:
- isaaclab: 15.5.0 → 15.6.0
- isaaclab_contrib: 1.2.0 → 1.3.0
- isaaclab_newton: 3.1.0 → 3.2.0
- isaaclab_ov: 0.10.4 → 0.10.5
- isaaclab_ovphysx: 8.2.4 → 8.3.0
- isaaclab_physx: 4.2.0 → 4.2.1
- isaaclab_tasks: 14.0.0 → 15.0.0
- isaaclab_visualizers: 1.5.0 → 1.5.1
# Description

There is a small bug with garbage collection corrupting the environment
such that the test scripts crash.

## Checklist

- [ ] 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
-->
…im#6959)

# Description

Disable backface culling by default for newton warp renderer. User can
opt out if needed by setting
`NewtonWarpRendererCfg.enable_backface_culling`.

Fixes OMPE-103486

## Type of change

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

## Screenshots

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

| State | Screenshot |
| ------ | ----- |
| Before | <img width="1030" height="1030"
alt="franka_cloth-ovphysx-newton_renderer-rgb-before"
src="https://github.com/user-attachments/assets/77e1ac3a-88a4-4580-8303-53c696a5a2ef"
/> |
| After | <img width="1030" height="1030"
alt="franka_cloth-ovphysx-newton_renderer-rgb-after"
src="https://github.com/user-attachments/assets/44e15c0d-eff2-462d-8566-cd16d273126c"
/> |

## Dexsuite runtime benchmark

Performance and memory impact of disabling Newton Warp backface culling
by default
(`NewtonWarpRendererCfg.enable_backface_culling: True → False`).

### Comparison — before vs. after

Δ = after (`afc3ebd9`) − before (`50a244ec` / develop). Positive FPS Δ%
means after is faster; negative GPU-mem / RAM Δ% means after uses less
memory.

| Variant | Envs | FPS Δ% | Env create Δ% | First step Δ% | GPU mem peak
Δ% | RAM peak Δ% |
| ------------- | ---: | -----: | ------------: | ------------: |
--------------: | ----------: |
| homogeneous   | 4096 | +2.98% | -1.14% | -2.87% | +4.15% | -0.24% |

**Takeaways:**

- FPS change is within typical run-to-run noise for this single-config
sample.
- GPU memory peak and host RAM peak are essentially unchanged.
- Env-creation / first-step times are also within noise for this setup.

### Before — `50a244ec70a` (develop)

Baseline with `enable_backface_culling=True` (previous default).

| Item        | Value |
| ----------- | ----- |
| Commit | `50a244ec70a Handle single-world coupled MPM resets (isaac-sim#6955)`
|
| Setting     | `NewtonWarpRendererCfg.enable_backface_culling = True` |
| Results dir |
`huidongc/benchmarks/20260807_newton_bfc_before_develop/` |

| Variant | Envs | FPS mean | FPS peak | Iter s mean | GPU mem mean (GB)
| GPU mem peak (GB) | RAM mean (GB) | RAM peak (GB) | GPU util % | Env
create s | First step s |
| ------------- | ---: | -------: | -------: | ----------: |
----------------: | ----------------: | ------------: | ------------: |
---------: | -----------: | -----------: |
| homogeneous | 4096 | 42192.8 | 48652.8 | 0.0971 | 4.82 | 4.82 | 4.14 |
4.14 | 87.9 | 35.9 | 0.8 |

### After — `afc3ebd9` (`enable_backface_culling=False`)

Same benchmark after disabling backface culling by default.

| Item        | Value |
| ----------- | ----- |
| Commit | `afc3ebd9 Disable Newton Warp backface culling by default` |
| Setting | `NewtonWarpRendererCfg.enable_backface_culling = False` |
| Results dir | `huidongc/benchmarks/20260807_newton_bfc_after_7a64e7b/`
|

| Variant | Envs | FPS mean | FPS peak | Iter s mean | GPU mem mean (GB)
| GPU mem peak (GB) | RAM mean (GB) | RAM peak (GB) | GPU util % | Env
create s | First step s |
| ------------- | ---: | -------: | -------: | ----------: |
----------------: | ----------------: | ------------: | ------------: |
---------: | -----------: | -----------: |
| homogeneous | 4096 | 43450.7 | 49929.3 | 0.0943 | 4.93 | 5.02 | 4.13 |
4.13 | 87.2 | 35.5 | 0.8 |

### Setup

| Item                | Value                           |
| ------------------- | ------------------------------- |
| GPU                 | NVIDIA RTX A6000 |
| Task                | `Isaac-Lift-KukaAllegro-Camera` |
| Physics             | `newton_mjwarp`                 |
| Renderer            | `newton_renderer`               |
| Homogeneous presets | `rgb64,single_camera,cube`      |
| Seed                | `42`                            |
| Iterations          | `1000` (after warmup) |
| Command             | `huidongc/benchmark_dexsuite.sh` |

## 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
Bumped packages:
- isaaclab_newton: 3.2.0 → 3.2.1
Require every authoritative baseline to cover throughput and both memory metrics so missing data cannot silently pass. Reject non-finite inputs and drop the unsupported Newton and Isaac RTX camera combination.
Add total startup timing to the required performance metrics. Qualify FPS regressions with coherent iteration-time statistics and reject malformed or inconsistent benchmark data. Use provider-qualified runtime identities so kit-less Newton runs compare correctly.
Write benchmark JSON to container-local storage while Isaac Sim is running, then copy the completed result to the host artifact mount. This avoids the reproducible RTX finalization failure on the bind-mounted path without changing benchmark behavior.
## Summary

- compute PhysX IMU and PVA finite-difference acceleration from the
elapsed time between sensor samples
- keep timestamp inputs stable inside the recorded Warp launches from
isaac-sim#6390
- remove mutable scalar inverse-dt launch parameters
- add lazy-read and nonzero-update-period regressions for IMU linear
acceleration and PVA linear/angular acceleration

This PR is stacked on isaac-sim#6390. Until isaac-sim#6390 merges, its commits are
included in this comparison against develop.

## Root cause

IMU and PVA cached velocity only when their buffers were recomputed, but
divided the next velocity delta by the most recent physics-step dt. With
four lazy physics updates or an update period of four physics steps,
both sensors reported 4x acceleration.

The kernels now derive a per-environment interval from timestamp minus
timestamp_last_update.

## Validation

- Unmodified isaac-sim#6390 base: 4 regressions failed with the expected 4x
acceleration error
- Fixed targeted regressions: 4 passed
- Complete PhysX IMU suite: 11 passed
- Complete PhysX PVA suite: 11 passed
- Final pre-commit hooks: passed
- Existing recorded-launch assertions remain enabled and pass

## Performance

Benchmarking is deferred until the test machine is connected to AC
power. The change removes scalar launch-parameter updates and retains
the recorded-launch path; this PR makes no performance claims.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Keep benchmark results in container-local storage and use host-side docker cp after the run. This removes the non-root bind-mount write that consistently fails for the RTX workload while preserving the normal container user.
# Description

Descendants of an instanceable prim are instance proxies, which USD does
not allow editing. A recursive override such as `physics_material`
therefore cannot reach the colliders inside an instanceable asset:
spawning the asset with a physics material appears to succeed, but the
colliders stay bound to whatever the source layer specified. This is
easy to hit with converted assets, where the collision geometry is
commonly authored under an instanceable scope.

This adds an opt-in `make_uninstanceable` flag to `UsdFileCfg`. When
enabled, instancing is disabled below the spawned prim immediately after
variant selection and before any override runs, so the recursive
overrides apply to the descendants as intended. It defaults to `False`
because making descendants editable increases stage memory, so users
only pay for it when an override needs it. The `make_uninstanceable`
helper it calls already exists in `isaaclab.sim.utils`.

One incidental change: the new branch takes `_spawn_from_usd_file` one
point over the repo `C901` complexity limit (31 > 30), so the adjacent
material-path `if/else` is collapsed into an equivalent ternary to stay
within budget. No behavior change there.

## Type of change

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

## Screenshots

None.

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

Update the multi-arch latest-develop digest from 307e5486 (Aug 7) to
0d707bba (Aug 9) for reproducible CI.

## Type of change

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

## Checklist

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

Multi-gpu benchmarks:

`uv run isaaclab benchmark startup-multigpu --task <>`

Similarly:` runtime-multigpu`, `training-multigpu`

## Checklist

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

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

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

Remove unused functions and empty video recording submodule

## Checklist

- [ ] 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
…6991)

# Description

Remove the massive amount of code in isaaclab around mock fixtures for
mock tests. Many of the mocks were not used, others were overdesigned
and overengineering and creating large technical debt.

The few useful/required fixtures are still there, just maintained as
small, lean, minimal fixtures.

## Checklist

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

# Description

update export docs to use Isaac-Humanoid for sb3 compatibility.
update direct notes to specify that the export_method is not available.

## 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
Keep runtime benchmarks aligned with the established arithmetic FPS semantics by default while allowing callers to opt into effective aggregate throughput. Compare performance baselines using the matching per-step FPS statistics.
Keep the machine-readable JSON and workflow summary while removing unused JUnit and Markdown artifacts. Reduce duplicate significance fields and repetitive validation tests without changing gate semantics.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.