Skip to content

Sync fpgs-dev with develop#6599

Merged
ooctipus merged 116 commits into
isaac-sim:fpgs-devfrom
ooctipus:ooctipus/sync-fpgs-dev-develop-20260717
Jul 18, 2026
Merged

Sync fpgs-dev with develop#6599
ooctipus merged 116 commits into
isaac-sim:fpgs-devfrom
ooctipus:ooctipus/sync-fpgs-dev-develop-20260717

Conversation

@ooctipus

Copy link
Copy Markdown
Collaborator

Description

Merge current develop (564a0083a00) into fpgs-dev while retaining the FeatherPGS solver integration and tuned task presets.

develop introduced the SolverBase.reset API and a side-effect-free solver factory contract after the previous public FeatherPGS Newton pin. This sync therefore also:

  • pins the public, reset-compatible ooctipus/newton@186502cec5db4b80a4cc235c9a6f5e4266ee2c07 revision;
  • aligns NewtonFeatherPGSManager with the current _create_solver contract;
  • keeps the FeatherPGS Go1 and G1 presets while accepting the updated Kamino defaults;
  • preserves the centralized dependency ownership introduced on develop.

Type of change

  • Bug fix (non-breaking change which fixes the stale branch and dependency incompatibility)

Tests

  • uv run -m newton.tests -k feather_pgs: 25 passed.
  • ./isaaclab.sh -p -m pytest source/isaaclab/test/cli/test_uv_run_pyproject.py -q: 6 passed.
  • IsaacLab formatting/lint hooks passed. The all-files merge-marker hook was skipped only for three license files added unchanged by develop whose license headings contain =======. The LFS pointer hook was skipped because this parent checkout has a local .git/info/attributes override disabling golden-image LFS; repository .gitattributes remains unchanged and correct.
  • Focused IsaacLab runtime test collection is unavailable in this isolated worktree because its wrapper selects system Python without NumPy/IsaacLab packages. The public Newton solver tests above ran with Warp 1.15 on RTX 5090 GPUs.

Screenshots

Not applicable.

Checklist

  • I have read and understood the contribution guidelines.
  • I have run the applicable pre-commit checks with ./isaaclab.sh --format.
  • Documentation changes are not required for this branch sync.
  • My changes generate no new warnings.
  • I have added or updated tests for the merged manager contract and dependency pin.
  • The existing FeatherPGS changelog fragment remains in place.
  • My name already exists in CONTRIBUTORS.md.

aserifi and others added 30 commits July 6, 2026 13:32
Revisited the solver parameters. Now, the environments consistently use
num_substeps=1.
Tuned also the settings for the DR Legs task, making training 3x faster.

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

- Deferred Kit and USD imports from modules loaded during task and
configuration resolution until the runtime functionality requires them.
- Prevented overlapping standalone USD package providers on x86 by
restricting `usd-exchange` to ARM, where `usd-core` is not installed.
- Added a metadata regression test that keeps the standalone USD
providers platform-disjoint.

## Root Cause

The failing installation-training environments loaded incompatible USD
Python bindings in one process, with traces showing both
`pxrInternal_v0_25_5` and `pxrInternal_v0_25_11`. On x86, `usd-core` and
`usd-exchange` both supplied USD/`pxr` components. Their coexistence
made native binding initialization depend on installation and import
order, producing wrapper and converter registration failures.

## Test Plan

- `./isaaclab.sh -p -m pytest
source/isaaclab/test/cli/test_source_package_metadata.py`
- `./isaaclab.sh -f`
- Installation Tests: fresh successful run plus 10 successful reruns,
each passing on x86 and ARM.

## CI Validation

- Fresh run: x86 `84271139083`, ARM `84271139099`
- Reruns 1-5: x86 `84278649544`, `84284392796`, `84297138420`,
`84306527331`, `84317891132`; ARM `84278649480`, `84284392767`,
`84297138393`, `84306527439`, `84317891100`
- Reruns 6-10: x86 `84343375232`, `84356535895`, `84361942197`,
`84373650598`, `84379046431`; ARM `84343375249`, `84356535827`,
`84361942203`, `84373650527`, `84379046460`

---------

Signed-off-by: Antoine RICHARD <antoiner@nvidia.com>
Co-authored-by: hujc <leo.hu.sh@gmail.com>
# Description

Fourbar-pole swingup RL example that uses Kamino. Builds on the core
Kamino changes in isaac-sim#5962

The USD model is added to `newton-assets` in
newton-physics/newton-assets#44

See video for a trained policy. 5s episode -> reset -> 5s episode.

https://github.com/user-attachments/assets/9deb0597-6653-4614-b05f-5f3a03f0ff74

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

---------

Co-authored-by: Agon Serifi <agon.serifi@disney.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
Bumped packages:
- isaaclab: 8.1.2 → 9.0.0
- isaaclab_assets: 0.4.1 → 0.4.2
- isaaclab_ovphysx: 6.1.0 → 6.1.1
- isaaclab_tasks: 8.1.5 → 8.1.6
… utilities (isaac-sim#6334)

# Description

Moves the rigid object and rigid object collection interface test
factories into shared underscore-prefixed utility modules so later parts
can reuse them. Pure code movement with no behavior change and no
ordering content.

Part 1/8 of the series splitting isaac-sim#6248 into independently reviewable
units. isaac-sim#6248 remains open, untouched, as the reference implementation;
this stack was cut from its final tree after a `develop` sync (Kamino
Core, Newton bump, OVPhysX 0.5.1).

## Stack

- **Part 1/8 (this PR)**: isaac-sim#6334 — Extract rigid object interface test
utilities
- Part 2/8: isaac-sim#6335 — Core ordering foundation
- Part 3/8: isaac-sim#6336 — Newton backend
- Part 4/8: isaac-sim#6337 — PhysX backend
- Part 5/8: isaac-sim#6338 — Extract articulation interface test utilities
- Part 6/8: isaac-sim#6339 — OVPhysX backend
- Part 7/8: isaac-sim#6340 — Cross-backend ordering interface tests
- Part 8/8: isaac-sim#6341 — Events, consumers, and documentation

## Type of change

- Test/documentation/refactor change

## 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 added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] My name exists in `CONTRIBUTORS.md`

## Test Plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab/test/assets/test_rigid_object_iface.py` -> 1478 passed,
12 xfailed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab/test/assets/test_rigid_object_collection_iface.py` ->
1902 passed; the 7 failures + 636 errors are pre-existing on `develop`
in the local environment (OVPhysX 0.4.13 wheel vs the 0.5.x binding API
from isaac-sim#6314) — fail-set identical to the `develop` baseline
- [x] `./isaaclab.sh -f` -> all hooks pass

---------

Signed-off-by: Antoine RICHARD <antoiner@nvidia.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
# Description

Repeated sensor data reads currently re-enter the backend update
implementation even when the cached data is already fresh. For PhysX
contact sensors, this repeats getters such as get_net_contact_forces()
before the device mask can suppress masked kernel work.

This change adds a synchronization-free host freshness generation to
SensorBase. Updates and resets invalidate the generation, ordinary
repeated reads reuse the cached buffers, and force_recompute=True
bypasses the guard. Regression coverage includes repeated reads, full
and partial resets, forced recomputation, and CUDA graph capture.

No new dependencies are required.

Fixes isaac-sim#6315

## Type of change

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

## Screenshots

Not applicable; this change has no visual output.

## Testing

- ./isaaclab.sh -f
- SensorBase and selected core/PhysX sensor suites: 113 passed
- Newton sensor suites: 150 passed, 6 XPASS
- Verified the repeated-read regression fails before the fix on CPU and
CUDA

## 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 -f
- [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
- [x] I have added my name to CONTRIBUTORS.md or my name already exists
there
…r API (isaac-sim#5677)

# Fast GPU pose/scale ops on Fabric + a new writer-scope API

## What this does

Two things:

1. **Local-space pose and scale ops are now GPU-fast on the Fabric
backend.**
They go through the same Warp-kernel path that world-space ops already
used.
The old USD fallback for local-space is ~100× slower (see the table
below).

2. **All transform writes go through a small context manager.** You open
a
   scope, do your writes inside it, and the scope handles the cleanup:

   ```python
   with view.xform_world_space_writer() as writer:
       writer.set_poses(positions=p, orientations=o)
       writer.set_scales(scales=s)
   ```

   Use `view.xform_local_space_writer()` for local-space writes.

Builds on Piotr's prototype at

[`bareya/pbarejko/camera-update`](https://github.com/bareya/IsaacLab/tree/pbarejko/camera-update).

## Why a scope?

A FrameView keeps two copies of each prim's transform in Fabric storage:
the `omni:fabric:worldMatrix` and `omni:fabric:localMatrix` attributes.
When you write one, the other has to be recomputed so they stay
consistent.

Without a scope, that recompute has to run after every single write.
With
a scope, it runs **once**, when the scope closes. You can call
`set_poses`
and `set_scales` as many times as you want inside the scope; on exit,
one
Warp kernel derives the other space and one `wp.synchronize()` runs.
Empty scopes cost nothing.

The scope also pauses **Fabric Hierarchy**'s transform-change tracking
while you're writing, then restores it on exit. (Fabric itself is just
the data store; Fabric Hierarchy, exposed through USDRT's
`IFabricHierarchy`, is the plugin that watches writes to
`omni:fabric:localMatrix` / `omni:fabric:worldMatrix` and keeps them
mutually consistent across the hierarchy.) Its tracking is pull-based:
a per-attribute listener records writes into a changelog, and the
plugin drains and processes that changelog on the next call to
`IFabricHierarchy::update_world_xforms()`. Pausing the listener does
not block the writes themselves — they still land in Fabric storage —
it just keeps them out of the changelog. With the changelog empty, the
next tick has nothing to "catch up on" for these prims, and can't
decide one of the two spaces is canonical and derive the other from
it. See the next section for why that matters.

Rules:
- Only one writer can be open on a view at a time. Opening a second one
  raises `RuntimeError`.
- While a writer is open, the view's own getters (`get_world_poses`,
etc.)
raise. Read through the writer (`writer.get_poses()`) inside the scope,
  or close the scope first.
- **Do not advance the simulation or render from inside the scope.**
  No `sim.step()`, no `world.render()`, no `SimulationApp.update()`.
The matrices are mid-write until exit, and rendering against that state
would read torn data. Keep scopes short and close them before stepping.
- If something raises inside the scope (a user-code bug, a notebook
cell interrupt, etc.), the scope still runs the opposite-space recompute
  on exit so the world and local matrices stay consistent prim-by-prim.
  The partial write itself is not rolled back — if you need
  all-or-nothing, snapshot the matrices yourself before entering.

## Why we have to coordinate with Fabric Hierarchy (renderer
correctness)

A writer scope is synchronous Python code, so the renderer can't see
anything mid-scope — no tick runs until we exit. The risk is on the
**next** render/sim tick after the scope closes.

On that next tick, Fabric Hierarchy runs its
`IFabricHierarchy::update_world_xforms()` step, which can recompute
`omni:fabric:worldMatrix` from `omni:fabric:localMatrix` (or vice
versa). If it thinks one of the two was the user's most recent edit,
it derives the other from it; the derived value — not what we wrote —
is then what the **Fabric Scene Delegate (FSD)** hands to RTX on the
render path.

Three things in this PR keep that next-tick recompute from clobbering
our
work:

1. **Opposite-space derive at scope exit.** By the time the scope
closes,
   `omni:fabric:worldMatrix` and `omni:fabric:localMatrix` are mutually
   consistent prim-by-prim, so any recompute Fabric Hierarchy does is a
   no-op.

2. **Fabric-Hierarchy change tracking is paused for the whole scope.**
   The writer calls `track_local_xform_changes(False)` and
   `track_world_xform_changes(False)` on enter (saving the prior state)
   and restores them on exit. While tracking is paused, the listeners
   don't record our writes in their changelog, so when the next tick
   runs there's nothing for `update_world_xforms()` to "catch up on".

3. **Two persistent selections with explicit read-only / read-write
   flags.** Outside the scope, the view's selection is fully read-only —
   both `omni:fabric:worldMatrix` and `omni:fabric:localMatrix` are
   flagged RO. Inside the scope, the writer flips to a fully read-write
   selection.

   ```
_sel_ro : worldMatrix=RO, localMatrix=RO (steady state, between writes)
_sel_rw : worldMatrix=RW, localMatrix=RW (active during a writer scope)
   ```

   Both selections are built once when the view is initialized and kept
alive for its lifetime. The writer scope flips a single flag (`_is_rw`)
   on enter/exit; nothing is rebuilt. The RO steady state tells Fabric
   Hierarchy's next-tick `update_world_xforms()` that no attribute is
   user-authored, so it leaves both alone.

## Backend support

- **Fabric (PhysX):** the fast GPU path described above.
- **USD, Newton, OVPhysX:** the writer is a thin wrapper. Writes go
straight
to the backend's existing storage. No batching, no extra recompute
(there
is no second matrix to keep in sync). Same API across all four backends.

Newton has two different "scale" ideas, and the API keeps them apart:

- `NewtonSiteFrameView.set_scales(...)` (deprecated) writes the **Newton
  collision-shape geometry** size.
- The writer's `set_scales(...)` writes per-site **transform scale**,
  matching what USD FrameView does.

They operate on different state and are not merged.

## API changes

**New (recommended):**
- `view.xform_world_space_writer()` / `view.xform_local_space_writer()`
—
  a context manager with `set_poses`, `set_scales`, `get_poses`,
  `get_scales`.

**Deprecated (still works, warns once per class on first use):**
- `set_world_poses` / `set_local_poses` — use the writer scope.
- `get_scales` / `set_scales` — use `get_local_scales` /
  `get_world_scales`, or the writer's `set_scales`.

## Benchmark (1024 prims, 50 iterations, Blackwell RTX PRO 5000)

Per-iteration timings (lower is better):

| Operation | USD (ms) | Fabric (ms) | Newton Site (ms) |

|----------------------------|---------:|------------:|-----------------:|
| Get World Poses | 8.6148 | 0.0375 | 0.0307 |
| Set World Poses | 19.1357 | 0.1090 | 0.0368 |
| Get Local Poses | 5.9556 | 0.0374 | 0.0497 |
| Set Local Poses | 7.9794 | 0.0979 | 0.0790 |
| Get World Scales | 13.1193 | 0.0371 | 0.0015 |
| Set World Scales | 21.4571 | 0.1014 | 0.0612 |
| Get Local Scales | 3.2544 | 0.0375 | 0.0022 |
| Set Local Scales | 3.8350 | 0.0937 | 0.0587 |
| Get Both (World+Local) | 14.7506 | 0.0738 | 0.1302 |
| Interleaved World Set→Get | 28.1046 | 0.1432 | 0.1588 |
| **Per-iter total** | **126.2** | **0.77** | **0.61** |

Speedup vs USD (per-iter ops; one-time view construction excluded):

| Operation                  | Fabric × | Newton Site × |
|----------------------------|---------:|--------------:|
| Get World Poses            |   229.6× |        280.2× |
| Set World Poses            |   175.6× |        519.8× |
| Get Local Poses            |   159.0× |        119.9× |
| Set Local Poses            |    81.5× |        101.0× |
| Get World Scales           |   353.9× |       8911.5× |
| Set World Scales           |   211.6× |        350.4× |
| Get Local Scales           |    86.8× |       1489.9× |
| Set Local Scales           |    40.9× |         65.4× |
| Get Both (World+Local)     |   200.0× |        113.3× |
| Interleaved World Set→Get  |   196.2× |        177.0× |
| **Overall (per-iter)**     | **164×** |       **207×** |

One-time view construction (reported separately, not part of the
per-iter total): USD 4.6 ms, Fabric 4.4 ms, Newton Site 1013 ms — the
Newton number is dominated by stage population on the first call.
Steady-state per-iteration cost is what the speedup row reflects.

## Notes for reviewers

- Getters call `wp.synchronize()` before returning, so the returned
  `ProxyArray` is always immediately readable from both GPU and host
  code — no caller-side sync needed. (Both the cached and the
  per-indices paths sync; this used to be asymmetric.)

---------

Co-authored-by: pv-nvidia <peter.verswyvelen@gmail.com>
Co-authored-by: pv-nvidia <{"message":"Not Found","documentation_url":"https://docs.github.com/rest/users/emails#list-email-addresses-for-the-authenticated-user","status":"404"}>
# Description

Pins every active newton[sim] dependency to Newton commit
c7ae7c7648cd0717df39e5c94b95d5a02c997320 (current main), which includes
the experimental coupled solver framework (newton-physics/newton#2848).
Upstream comparison:
newton-physics/newton@2064e3b...c7ae7c7

Compatibility updates: adds newton-usd-schemas>=0.3.1 next to each pin
since Newton now hard-requires it for USD parsing
(newton-physics/newton#3117) and it only ships in the heavy
newton[importers] extra; removes the cloner fallback reading the deleted
ModelBuilder.equality_constraint_* attributes
(newton-physics/newton#3296), which are now handled through the
mujoco:equality_constraint_* custom attributes, and updates the fake
builder in the cloner test accordingly.

Verified in a fresh uv env: full isaaclab_newton test suite (340 passed
non-gated plus all Isaac-Sim-gated files: articulation 236, rigid object
94, rigid object collection 158, actuators 71, schemas 20), contrib
rigid-deformable coupling (4 passed), and end-to-end cartpole training
with presets=newton_mjwarp. Note: isaacsim-core 6.0.0.1 hard-pins
newton==1.2.0, so installing Isaac Sim after the Newton pin clobbers it;
the documented ./isaaclab.sh -i order handles this correctly.

## 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
> **Stacked on isaac-sim#6225** (OVPhysX `Articulation` → `OvPhysxView`), which
is stacked on isaac-sim#6224 (`OvPhysxView`). Review/merge those first — the diff
here collapses to a single commit once they land.

## What

The ovphysx wheel now exposes per-collision-shape material as the
`ARTICULATION_SHAPE_FRICTION_AND_RESTITUTION` /
`RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION` tensor types. This closes
the gap that kept `test_set_material_properties` `xfail`ed: the test had
been written against the PhysX-only
`root_view.get_material_properties()` / `set_material_properties()` /
`max_shapes` view API, which `OvPhysxView` does not provide.

- Add `tensor_types` aliases `SHAPE_FRICTION_AND_RESTITUTION` and
`RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION`, guarded with `try/except
AttributeError` so the module stays import-safe against older wheels.
- Rewrite `test_set_material_properties` to read/write the material
through `OvPhysxView.get_attribute` / `set_attribute` on the new tensor
type. The per-articulation shape count is derived from the binding shape
`[N, S, 3]` (`[static_friction, dynamic_friction, restitution]`); the
test skips on wheels that lack the type. The now-unused
`_MATERIAL_GAP_REASON` is removed.

## Verification

The material binding is device-resident (it follows the simulation
device). The `set → step → read` round-trip passes on both `cpu` and
`cuda:0` for `num_articulations` 1 and 2.
…isaac-sim#6356)

# Description

Currently, Omni tests test-type are broadly marked only as pytest, which
makes it difficult to categorize, filter, and run tests by intent or
coverage area. Update Omni tests to include the appropriate pytest marks
so they are more discoverable and easier to target in local runs, CI,
and reporting.
Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.

`row["test_type"] = f"{test_type}{','.join(markers)}"`


Fixes # ([OMPE-100407](https://jirasw.nvidia.com/browse/OMPE-100407))

## Type of change


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

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

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

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

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

---------

Signed-off-by: Matthew Taylor <mataylor@nvidia.com>
## 1. Summary

- **isaaclab**: makes the base Kit experiences use one renderer GPU by
default; XR explicitly retains multi-GPU rendering.
- Keeps single-process renderer multi-GPU available through existing
`kit_args`, avoiding overlap with training `--distributed`.
- Adds `ISAACLAB_FABRIC_USE_GPU_INTEROP=0|1` as an independent temporary
CI workaround; when unset, the Kit default is preserved.

## 2. Opt-in and workaround

Enable single-process renderer multi-GPU explicitly:

```text
--kit_args "--/renderer/multiGpu/enabled=true --/renderer/multiGpu/autoEnable=true --/renderer/multiGpu/maxGpuCount=16"
```

The multi-GPU CI lane can temporarily disable Fabric GPU interop with
`ISAACLAB_FABRIC_USE_GPU_INTEROP=0`. Explicit raw Kit settings and
`kit_args` take precedence over the environment override. Remove the
workaround after the underlying Kit/PhysX problem is fixed.

## 3. Validation

- [x] Merged current `develop` without conflicts.
- [x] Full `./isaaclab.sh -f` passed after the merge.
- [x] Five focused Fabric override and explicit-precedence tests passed.
- [x] Exact four-A10G diagnostics reproduced instability without the
Fabric override while five explicit-false controls completed cleanly:
isaac-sim#6300 (comment)
# Description

Documentation jobs are failing because of broken links from upstream
documentation:

was:
```
https://nvidia-isaac-ros.github.io/reference_workflows/isaac_for_manipulation/packages/isaac_ros_manipulation_ur_dnn_policy/index.html
```

is:
```
https://nvidia-isaac-ros.github.io/reference_workflows/isaac_for_manipulation/packages/isaac_ros_manipulation_dnn_policy/index.html
```

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 updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] 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#6322)

## 1. Summary

Fix CUDA initialization on non-default devices by selecting the resolved
device in PyTorch before synchronizing Warp at shared launcher and
physics-backend initialization boundaries. Newton binds CUDA graph
capture explicitly to the simulation device without backend-specific
default-device setup.

The exact three-rank camera workload failed 2/2 without device-scoped
capture and has now passed 6/6 with the fix, including two runs on the
final centralized implementation and one after merging current
``develop``.

## 2. Root cause

Warp used its default ``cuda:0`` context while nonzero distributed ranks
used their assigned devices. Newton's collision pipeline then mixed
allocations from different CUDA contexts, producing CUDA errors 900 and
101 during graph capture.

## 3. Design

- Select the PyTorch device before synchronizing Warp through a private
shared helper.
- Synchronize both runtimes after Kit startup in ``AppLauncher``.
- Synchronize both runtimes when resolving distributed ranks in
``sim_launcher``.
- Reassert the resolved device in ``PhysicsManager.initialize`` before
backend-specific setup, covering direct ``SimulationContext`` use for
every backend.
- Keep ``wp.ScopedCapture(device=device)`` in Newton so graph ownership
remains explicit.

## 4. Related work

Extracted from isaac-sim#5823 so the product fix can be reviewed and landed
independently of the multi-GPU CI infrastructure.

## 5. Test plan

- [x] Regression test fails without device-scoped capture and passes
with it
- [x] Exact three-rank Newton camera training passes on three physical
GPUs, including the committed tree merged with current ``develop``
- [x] Device synchronization, launcher, backend-ordering, and
distributed-resolution tests: 28 passed
- [x] Full Newton manager test file: 71 passed; two unrelated Kamino
cases require a newer Newton API than the installed environment provides
- [x] Changelog fragment gate
- [x] ``./isaaclab.sh -f``
…isaac-sim#6009)

# Description

Consolidates all dependencies into the central pyproject. This should
make it easier to maintain a ground truth.

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

Renderer presets repeated the category that the `renderer=` selector
already names. This PR drops the redundant `_renderer` suffix while
keeping the old spellings working as deprecated aliases:

| Old | New |
|---|---|
| `ovrtx_renderer` | `ovrtx` |
| `isaacsim_rtx_renderer` | `isaacsim_rtx` |

`newton_renderer` is intentionally **left unchanged** (no alias): the
bare `newton` spelling is deliberately avoided across the codebase —
it's a live physics deprecation alias (`newton` → `newton_mjwarp`) and
is guarded by `test_newton_solver_preset_names.py` — so renaming the
renderer to `newton` would reintroduce that ambiguity.

## How it works

The rename reuses the existing per-target legacy-alias mechanism (the
same one that powers `newton` → `newton_mjwarp`): the aliases live on
`PresetTarget.RENDERER.legacy_aliases`, so `renderer=ovrtx_renderer` /
`presets=...,ovrtx_renderer` still resolve — they just emit a
`FutureWarning` pointing at the new name. The aliases will be removed in
a future release.

Nice side effect: the preset name `ovrtx` now matches its underlying
`renderer_type` value.

## Changes

- **`presets.py`** — renamed the `MultiBackendRendererCfg` fields and
updated `set_isaac_rtx_global_settings`.
- **`preset_target.py`** — added the alias map + docstring to
`PresetTarget.RENDERER`.
- **`sim_launcher.py`** — help text and runtime-compatibility error
messages now use the suffix-less names.
- **Docs / benchmark scripts / shadow-hand task docstrings** — updated
example strings (re-padded the affected RST grid tables in
`environments.rst`).
- **Tests** — updated `test_runtime_compatibility.py`,
`test_preset_kit_decision.py`, `test_shadow_hand_camera_presets.py` to
the canonical names, and added a parametrized alias regression test in
`test_hydra.py`.
- Changelog fragments for `isaaclab` and `isaaclab_tasks`.

## Notes

- The golden-image test infra (`rendering_test_utils.py` + ~190 golden
files) builds renderer labels as `f"{renderer}_renderer"`, which are
used both as `presets=` tokens and as on-disk filenames. Those old
spellings still resolve via the new alias, so it was left untouched
(renaming 190 golden files is out of scope).

## Testing

Verified the alias-resolution logic and ran `pre-commit` on all changed
files (all hooks pass). The full pytest suite requires a GPU/Isaac Sim
environment not available locally — CI will exercise it.
Bumped packages:
- isaaclab: 9.0.0 → 10.0.0
- isaaclab_newton: 1.6.0 → 1.6.1
- isaaclab_ovphysx: 6.1.1 → 6.2.0
- isaaclab_physx: 2.7.0 → 2.7.1
- isaaclab_tasks: 8.1.6 → 8.1.7
- isaaclab_visualizers: 1.1.0 → 1.1.1
…saac-sim#6241)

> **Stacked on isaac-sim#6227** (OVPhysX `RigidObjectCollection` →
`OvPhysxView`), which is stacked on isaac-sim#6224 (`OvPhysxView`). Review/merge
those first. Sibling of isaac-sim#6239 (articulation) and isaac-sim#6240 (rigid object).

## What

The ovphysx wheel now exposes per-collision-shape rigid-body material as
the `RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION` tensor type. This closes
the gap that kept the collection's `test_set_material_properties`
`xfail`ed (it was an empty `NotImplementedError` stub written against
the PhysX-only `root_view.get/set_material_properties()` API).

- Add the `tensor_types` alias
`RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION`, guarded with `try/except
AttributeError` (shared with the sibling material PRs; documented
there).
- Implement `test_set_material_properties`, mirroring the PhysX backend
but reading/writing the material through `OvPhysxView.get_attribute` /
`set_attribute`. The collection's fused binding is body-major flat, so
data `[num_envs, num_cubes, 3]` is mapped to/from the view layout with
`reshape_data_to_view_3d` and its inverse.

## Verification

OVPhysX runs the PhysX solver. The material round-trip passes on both
`cpu` and `cuda:0` for `num_envs` 1/3 × `num_cubes` 1/2.

The changelog fragment is a `.skip` because the only user-facing
addition (the alias) is documented by the sibling material PRs; this PR
is test enablement.
…ac-sim#6240)

> **Stacked on isaac-sim#6226** (OVPhysX `RigidObject` → `OvPhysxView`), which is
stacked on isaac-sim#6224 (`OvPhysxView`). Review/merge those first — the diff
here collapses to a single commit once they land. Sibling of isaac-sim#6239 (the
articulation equivalent).

## What

The ovphysx wheel now exposes per-collision-shape rigid-body material as
the `RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION` tensor type (shape `[N,
S, 3]` = static friction, dynamic friction, restitution). This closes
the gap that kept **five** rigid-object material tests `xfail`ed — they
were empty `NotImplementedError` stubs written against the PhysX-only
`root_view.get/set_material_properties()` / `max_shapes` view API.

- Add the `tensor_types` alias
`RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION`, guarded with `try/except
AttributeError` so the module stays import-safe against older wheels.
- Implement, mirroring the PhysX backend but reading/writing the
material through `OvPhysxView.get_attribute` / `set_attribute`:
- `test_rigid_body_set_material_properties` and
`test_set_material_properties_via_view` — set/get round-trip.
- `test_rigid_body_no_friction`, `test_rigid_body_with_static_friction`,
`test_rigid_body_with_restitution` — physical-behavior tests.
- Ground planes use the solver-common `RigidBodyMaterialBaseCfg`; masses
come from `data.body_mass`. The no-friction test settles the cube and
uses zero restitution so the resting contact is clean before asserting
the sliding velocity is preserved.

## Verification

OVPhysX runs the PhysX solver, so the physical tests use the PhysX
reference tolerances. All five pass on both `cpu` and `cuda:0` for
`num_cubes` 1 and 2. Full `test_rigid_object.py` is green (53 passed on
cpu, no regressions).
…, Part 2/5) (isaac-sim#6198)

# Description

**Part 2 of 5** of the benchmark refactor series: unified runtime and
startup benchmark entry points.

> **Stacked on Part 1 (isaac-sim#6197).** The incremental Part 2 diff is:
>
AntoineRichard/IsaacLab@antoiner/benchmark-core...antoiner/benchmark-runtime-startup

Series: Part 1/5 core (isaac-sim#6197) -> **Part 2/5 runtime + startup (this
PR)** -> Part 3/5 training (isaac-sim#6199) -> Part 4/5 play (isaac-sim#6201) -> Part 5/5
cleanup (isaac-sim#6206).

This PR is additive. The existing benchmark scripts remain available
until Part 5.

Adds:
- `scripts/benchmarks/runtime.py`: steps an environment with random
actions and emits a `RuntimeBundle`.
- `scripts/benchmarks/startup.py`: profiles five startup phases with
`cProfile` and emits a `StartupBundle`.
- One end-to-end smoke test per entry point.

Physics and rendering backends are selected with Hydra preset overrides.
Output is selected with `--benchmark_formatter`, which accepts canonical
formatter names and comma-separated values such as `schema,omniperf`.
Formatter-list parsing is handled by the benchmark core, and preset
metadata is derived directly from the Hydra arguments.

The startup bundle records the complete benchmark duration. Both entry
points close their environments when benchmark processing raises.

## Validation

- `237 passed` across `scripts/benchmarks/test` and
`source/isaaclab/test/benchmark`.
- Both runtime and startup smoke tests pass with Newton/MJWarp.
- `./isaaclab.sh -f` passes after commit.

## Type of change

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

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run all pre-commit checks with `./isaaclab.sh -f`.
- [x] I have updated the benchmark documentation.
- [x] I have added focused end-to-end coverage.
- [x] I have added the required changelog fragment.
…#6243)

> **Stacked on isaac-sim#6239 (articulation material) and isaac-sim#6240 (rigid-object
material)** — this branch merges both so the MDP term has
`Articulation.root_view` + `RigidObject.root_view` (the isaac-sim#6225/isaac-sim#6226
migrations) and the material aliases. Review/merge those (and their
bases isaac-sim#6224/isaac-sim#6225/isaac-sim#6226) first; the diff here collapses to a single
commit once they land. (isaac-sim#6241/collection is **not** needed — this MDP
term targets `RigidObject`/`Articulation`, not collections.)

## What

`randomize_rigid_body_material` previously **no-op'd on the OVPhysX
backend** (the wheel lacked a material binding). The wheel now exposes
per-shape material as `*_SHAPE_FRICTION_AND_RESTITUTION`, so this
replaces the no-op with a real implementation.

OVPhysX runs the PhysX solver, so the new
`_RandomizeRigidBodyMaterialOvPhysx`:
- mirrors the **PhysX bucket approach** (PhysX's 64000 unique-material
limit applies): pre-samples `num_buckets` materials and randomly assigns
them to shapes;
- writes per-shape `(static_friction, dynamic_friction, restitution)`
through the asset's `OvPhysxView` (`set_attribute` on
`SHAPE_FRICTION_AND_RESTITUTION` for articulations,
`RIGID_BODY_SHAPE_FRICTION_AND_RESTITUTION` for rigid objects),
read-modify-writing the full `[N, S, 3]` buffer so non-selected envs are
preserved.

### Limitation
Randomizes **all shapes** only. Per-body selection
(`asset_cfg.body_ids`) raises `NotImplementedError` — the ovphysx wheel
exposes no per-body shape counts (unlike PhysX's
`link_physx_view.max_shapes` / Newton's `num_shapes_per_body`), so
body→shape ranges can't be indexed.

## Verification

New real-backend test (`test_randomize_rigid_body_material_mdp.py`)
drives the implementation against an OVPhysX `RigidObject`: it asserts
the written friction/restitution land within the sampled ranges, and
that a per-body selection fails loud. Passes on both `cpu` and `cuda:0`.
The PhysX and Newton paths are untouched.
# Description

Clears per-world solver-internal buffers on env reset via Newton's
solver-reset API — closing the NaN-recovery gap discussed in
[newton-physics/newton#1266](newton-physics/newton#1266).

Without this, a world that produces a NaN in one solve warm-starts the
next iteration from that NaN (MJWarp leaves `mj_checkPos` /
`mj_checkVel` / `mj_checkAcc` as TODOs, so nothing in the solver cleans
it up). IsaacLab's standard reset rewrites `joint_q` / `joint_qd` /
`body_q` but never touches MJWarp-internal `qacc_warmstart`, applied
forces, or activations — the world is permanently dead.

## What changed

* New `NewtonManager._reset_solver_internals(world_mask)` hook, invoked
at **both** boundaries that consume the accumulated reset masks,
immediately before the masks are zeroed: the top of `step()` and
`forward()`. The `forward()` call site matters because data reads may
trigger `forward()` between an env reset and the next `step()`, which
would otherwise consume the mask before the solver internals were ever
cleared.
* The **base implementation is solver-agnostic**: it forwards to
`SolverBase.reset(state, world_mask=..., flags=0)` — the upstream API
from
[newton-physics/newton#2657](newton-physics/newton#2657),
available at the Newton commit `develop` already pins. `flags=0` clears
only solver-owned buffers and preserves the joint state IsaacLab
authored during the reset. `SolverBase.reset` is a documented no-op, so
solvers that do not implement it (VBD, XPBD, Featherstone, MPM today)
are unaffected — and any solver that adds a `reset()` upstream is
covered automatically with no IsaacLab change.
* `NewtonMJWarpManager` specializes the hook only to gate the CPU-MuJoCo
path (`use_mujoco_cpu=True`): its reset branch owns a single global
`MjData` and is not mask-aware, and the hook fires on every boundary
with a usually-all-`False` mask. For MJWarp,
`SolverMuJoCo.reset(flags=0)` zeroes `qacc_warmstart`, `qfrc_applied`,
`xfrc_applied`, `ctrl`, `act` per masked world.
* `NewtonKaminoManager` opts out with a documented no-op override — its
FK delegate already performs the masked `SolverKamino.reset` with an
explicit `ResetConfig` at the same boundaries, so the generic call would
be a redundant second reset.

## Type of change

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

## Screenshots

N/A — physics behavior fix, no UI.

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

## Test plan

* New regression test
`source/isaaclab_newton/test/physics/test_newton_solver_reset.py` (2
envs, CUDA): poisons `qacc_warmstart`, authors a joint write for one
env, and verifies both public boundaries (`sim.forward()` and
`sim.step()`) clear the flagged world's history while preserving the
other world's history and the authored joint state. Verified to fail
with the reset disabled.
*
`source/isaaclab_newton/test/physics/test_newton_manager_abstraction.py`
passes (74 tests).
* Canonical training probes run to completion with no tracebacks:
* `./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct
--num_envs 16 presets=newton_mjwarp --max_iterations 5`
* `./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct
--num_envs 16 presets=newton_kamino --max_iterations 5`
isaac-sim#6363)

## Problem

```bash
--kit_args "--ext-folder=/path/to/ext"       # exit 2: "argument --kit_args: expected one argument"
--kit_args=--ext-folder=/path/to/ext         # worked
--kit_args "--ext-folder=/a --ext-folder=/b" # worked
```

argparse rejects a value token that looks like an option (`-`-prefixed,
no space) — and Kit args always start with `--`. Affects every entry
point.

## Fix

Two normalization points, sharing one fusing helper that rewrites
`["--kit_args", "--ext-folder=/path/to/ext"]` into
`["--kit_args=--ext-folder=/path/to/ext"]`:

1. `AppLauncher.add_app_launcher_args` fuses the pair in `sys.argv`
before any parsing. Covers every script that parses `sys.argv`: demos,
tutorials, tools, benchmarks, and the per-library play scripts.
2. `dispatch_library_entrypoint` applies the same fusing to the explicit
argv list it forwards to the per-library train/play scripts. Those
scripts parse that list (not `sys.argv`), so the `sys.argv`
normalization alone never reached the unified `train` command or the
multi-GPU ranks (each child rank runs through the dispatcher).

Already-working forms are unchanged: a guard test asserts the
equals-attached, quoted multi-token, and plain-flag forms are forwarded
byte-identical.

Tests: 17 in
`source/isaaclab/test/cli/test_train_multigpu_command_building.py`. 12
fail with the `AppLauncher` fusing reverted; the dispatcher regression
test fails with the dispatcher fusing reverted. Verified end-to-end:
cartpole training via `train --rl_library rsl_rl ... --kit_args
"--ext-folder=..."` (previously exit 2) now trains to completion, and
the same command without `--kit_args` behaves identically to before.

## 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
…onfig (isaac-sim#6429)

## Summary

Cherry-pick of isaac-sim#6428 onto `develop`.

- Removes the duplicated `L_thumb_distal_joint` entry in
`fourier_hand_left_dexpilot.yml`'s `target_joint_names` list (reported
in isaac-sim#6325)
- The right-hand equivalent (`fourier_hand_right_dexpilot.yml`) is
unaffected

## Test plan

- [ ] Verify `fourier_hand_left_dexpilot.yml` has exactly one
`L_thumb_distal_joint` entry
- [ ] Confirm OpenXR Fourier left-hand retargeting initializes without
duplicate joint warnings

Fixes isaac-sim#6325
…6431)

# Description

`test_rendering_shadow_hand.py` builds and tears down a full RTX env
once per parametrized AOV (data type). It had no entry in
`PER_TEST_TIMEOUTS`, so it fell back to `DEFAULT_TIMEOUT` (1000s). That
budget never scaled as data types were added to
`_DEFAULT_SENSOR_DATA_TYPES` (the list grew from 7 → 13), so the file
eventually exceeded 1000s and timed out on CI (retry-masked).

This gives the file an explicit **1500s** budget (~45s per AOV) and adds
a reminder comment to bump it when renderer cases are added.

Fixes nvbug 6299039.

## Type of change

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

## Screenshots

N/A

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

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

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Description

Continues isaac-sim#6305 (includes @pbarejko's `Remove quality settings` commit)
and supersedes the now-closed isaac-sim#6278. Branched on top of the post-isaac-sim#6279
changes.

Removes the three RTX rendering-mode presets (`performance`, `balanced`,
`quality`) and the machinery that loaded them. With the RTX Minimal
renderer now serving the high-performance path, the presets added little
value. The former `quality` settings are retained as high-fidelity
defaults baked into the camera rendering Kit experiences, applied
automatically when RGB camera rendering is enabled.

Updated 18 rgb/rgba golden images (isaacsim_rtx renderer, both
physx/newton) from the CI-rendered output, since baking the
high-fidelity RTX defaults into kit changes the composited color:
confirmed the shift is color-only, so no geometry/segmentation goldens
were touched.

## Breaking change
- Removed the `--rendering_mode` launcher argument and
`IsaacRtxRendererGlobalSettingsCfg.rendering_mode`, plus the
`apps/rendering_modes/` presets.
- Baked high-fidelity RTX defaults into
`apps/isaaclab.python.rendering.kit` and the headless variant.

## Type of change

- Breaking change (existing functionality will not work without user
modification)

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

---------

Co-authored-by: Piotr Barejko <pbarejko@nvidia.com>
…undle deletion, pin-pink) (isaac-sim#6329)

# Description

Fixes the Docker-only error flood in nvbugs 6343978 (follow-up to
isaac-sim#6288): streaming starts, but
the log carries 438 `[Error]` lines and 14 Isaac Sim extensions fail to
load. uv installs are
unaffected. Two independent causes, both Isaac Lab's install mutating
packages that Isaac Sim's
extensions rely on.

## Summary

- **`packaging` deleted from a shared prebundle.** The vestigial
`packaging<24` bound in
`isaaclab_rl` forced a downgrade; pip (which sees prebundle paths
through `python.sh`'s
environment) uninstalled `packaging-26.0` from the
`omni.isaac.core_archive` prebundle.
`omni.services.pip_archive` shares that package as per-file symlinks, so
the deletion dangled
the farm and cascaded into 13 extension startup failures. Fixed by
relaxing the bound (no
consumer requires it; now in the root `pyproject.toml` after the isaac-sim#6009
centralization), plus a
**fail-loud invariant**: the install aborts if pip leaves a prebundled
package with a dangling
  `__init__.py`.
- **`pin-pink==3.1.0` too old for Isaac Sim 6.x.**
`isaacsim.robot_motion.pink` needs
`pink.exceptions.NoSolutionFound` (pink ≥ 3.3.0). Isaac Sim bundles pink
4.2.0, but the
install replaces it with the kit-site-packages copy, pinned to 3.1.0
since pink 3.4+ broke
the `pink_ik` task API (isaac-sim#5846). Bumped to **3.3.0**, which satisfies
both consumers
(`DampingTask.set_target_from_configuration` verified present on both
wheels). The pin lives
once in the root `pyproject.toml`; the install CLI now derives its
force-install stack from
  those entries instead of a hardcoded copy.
- **Impact**: an image rebuilt with this PR runs the exact reported
command with
**0 errors / 0 tracebacks / 0 extension failures** (broken image and the
customer's attached
  log: 438 / 34 / 14).

## 1. Design notes

1. **Invariant scoping (empirical).** Every docker build routinely
replaces prebundled dists
(numpy, the cmeel/pinocchio stack, scipy, …) and leaves ~42 dangling
links to files Python
never imports at startup (test modules, `WHEEL`/license files, cmake
hooks) — none of them
`__init__.py`. The harmful class (this bug) dangles package
`__init__.py` files, making the
package unimportable for every extension that loads it. The install
therefore fails only on
   a new dangling `__init__.py` and warns on other new dangling links.
2. **Considered and rejected: hiding prebundles from pip.** Routing pip
to the concrete kit
interpreter also prevents deletions, but changes dependency resolution
build-wide: deps
previously satisfied by prebundled copies get freshly resolved into kit
site-packages, and
the `isaacteleop` step then downgraded numpy to 2.3.5 and pin to 3.9.0 —
CI measured the
`rsl_rl` export flow at ~4.4× baseline (600s timeouts vs 168s).
Prebundle-visible
   resolution is kept as-is, with the invariant as the guard.

## 2. Validation

- **End-to-end on a fresh image built from this PR** (Isaac Sim base
digest `99e4e4cfae17…`):
`isaac-sim.streaming.sh --allow-root` reaches streaming at ~34 s, stays
alive to timeout,
with 0 Kit errors, 0 tracebacks, 0 extension-startup failures. Baked
state: `packaging` 26.0
resolves from the prebundle, pink 3.3.0 imports from kit site-packages,
0 dangling
  `__init__.py` anywhere in the prebundles.
- **Customer log cross-check**: the attached
`isaaclab_streaming_20260702.log` has the
identical 438-error class set as the local broken reproduction — both
roots, no third issue.
- **Invariant**: catches the packaging cascade in-container
(RuntimeError naming the broken
`omni.services.pip_archive` links) and passes the routine-residue case.
- **Tests**: install CLI suites 148 passed / 1 skipped (invariant +
derived-stack tests);
`test_pink_ik_components.py` with pink 3.3.0 — 21 passed. CI fully
green; the export flow
  runs at its 168 s baseline.

Fixes nvbugs 6343978.
Move the resolution and application of the Python logging level out of
the Kit-based AppLauncher into a backend-agnostic module so kitless
backends can honor it too.

Previously AppLauncher owned _resolve_python_logging_level and
_apply_python_logging_level, so the --verbose / --info CLI arguments
only took effect for Kit-based runs. Kitless backends (Newton, OvPhysX)
launched via launch_simulation never constructed AppLauncher and
silently ignored them.

Extract those two helpers into isaaclab.app.logging_utils and apply the
resolved level in the kitless branch of launch_simulation. The
Kit-specific info-stream handler workaround stays in AppLauncher.

# Description

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

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

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

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
nvsekkin and others added 15 commits July 16, 2026 16:02
## Summary

- Add backend-neutral cart-pole and articulation/rigid-object scene
configurations for core integration tests using direct USD paths and
core schema configs.
- Consume the config-only fixtures introduced by isaac-sim#6557 to decouple
recorder, color, texture, and curriculum integration hosts from task
configuration imports while retaining their integration markers and
assertions.
- Uses `make_empty_manager_based_env_cfg` and `EmptyManagerCfg` from the
merged foundation.

This is PR 2 of the focused replacement series for isaac-sim#6526.

## Type of change

- Test refactor (no production behavior change)

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

# Description

`usd_replicate` copies source prims to per-environment destination paths
with `Sdf.CreatePrimInLayer` + `Sdf.CopySpec`. When the destination is
nested under a scope that does not yet exist in the target environment
(e.g. the `Groceries` scope in `/World/envs/env_{}/Groceries/Object`),
`CreatePrimInLayer` authors the missing intermediate ancestors as `over`
prim specs. A `def` copied below an `over` ancestor never composes as
defined, so the copied prims' references stay unexpanded and Hydra skips
them — the objects render only in the source environment and silently
disappear from every cloned one.

This PR promotes such freshly-authored `over` ancestors to `def` right
after `CreatePrimInLayer`. The walk stops at the first ancestor that is
already a `def` (or authored elsewhere), so pre-existing scene structure
is left untouched. A regression test covers both the nested-destination
case and the already-defined-ancestor case.

## 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
- [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: ooctipus <zhengyuz@nvidia.com>
# Description

This PR moves the reinforcement-learning training and playback logic out
of the
`scripts/reinforcement_learning/` launcher scripts and into a reusable
`isaaclab_rl.entrypoints` subpackage. The per-library launcher scripts
(`rl_games/`, `rlinf/`, `rsl_rl/`, `sb3/`, `skrl/`) were thin wrappers
that
couldn't be imported or reused by downstream applications; the actual
backend
logic now lives in the `isaaclab_rl` package and is exercised through a
single
dispatcher.

**What changed**

- Added an `isaaclab_rl.entrypoints` subpackage that owns the backend
implementations (`entrypoints/backends/train_*.py`, `play_*.py`), the
shared
  `common.py` helpers, and a `dispatch.py` that selects a backend from
  `--rl_library` and forwards the remaining arguments.
- Added a typed **programmatic API** so downstream code can launch
training and
  playback without building an `argparse.Namespace`:

  ```python
  from isaaclab_rl import TrainingRequest, train

train(TrainingRequest(backend="rsl_rl", task="Isaac-Cartpole",
max_iterations=100))
  ```

`PlaybackRequest` / `play` provide the same for playback.
Backend-specific
options go through `backend_args`, and Hydra / preset selectors through
  `hydra_args`.
- Reduced the top-level `scripts/reinforcement_learning/train.py` and
`play.py`
  to thin executables that call `run_train_cli` / `run_play_cli`.
- Removed the deprecated per-library scripts under
  `scripts/reinforcement_learning/<library>/` (`train.py`, `play.py`,
`cli_args.py`). Use the unified `train.py`/`play.py` with
`--rl_library`, or
  the programmatic API instead.
- Updated all internal callers — benchmarks, demos, Ray runners,
AutoMate
contrib launchers, the project template generator, and CI workflows — to
use
  the unified entrypoints.
- Fixed `--deterministic` not configuring PyTorch deterministic
operations in
  the RL-Games, RSL-RL, SB3, and skrl backends.
- Removed the `--use_last_checkpoint` flag from the RL-Games `play`
entrypoint;
  use `--checkpoint latest` instead.

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

**Breaking:** The per-library scripts under
`scripts/reinforcement_learning/<library>/` and the RL-Games
`--use_last_checkpoint` flag have been removed. Migrate to the unified
`train.py`/`play.py` with `--rl_library <library>` (and `--checkpoint
latest`).

## Screenshots

N/A — no user-facing visual changes.

## 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: Mustafa H <34825877+StafaH@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
…isaac-sim#6386)

# Description

When doing a hard reset, the Newton model is re-created but the
collision pipeline still holds references to the old model. Once the old
model's device buffers are freed (which happens under GPU memory
pressure between resets), those dangling references cause illegal CUDA
memory access violations (CUDA 700) on the first `step()` after the
reset — typically surfacing in `compute_shape_aabbs` or
`narrow_phase_kernel_gjk_mpr`.

**Fix:** On a hard reset, clear the cached collision state
(`_collision_pipeline` and `_contacts`) so `initialize_solver()`
rebuilds a fresh pipeline bound to the re-finalized model. Any captured
CUDA graph is also invalidated and re-captured by `initialize_solver()`
exactly as on first initialization, so CUDA graph capture keeps working
correctly. No special post-reset deferral is needed once the stale
pipeline is rebuilt.

**Tests:** Adds a regression test `test_hard_reset_then_step_runs` (run
with CUDA graph capture off and on). It drives reset → step → hard
reset, frees the old model's collide arrays, churns the allocator to
mimic real GPU memory pressure, then steps and syncs. On the pre-fix
code this reproduces the CUDA 700; with the fix it passes.

Fixes isaac-sim#6483

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

Co-authored-by: pv-nvidia <pv-nvidia@nvidia.com>
…im#6583)

# Description

Update omniverseclient dependency from 2.71.1.7015 to 2.72.1 for
compatibility with newer versions of ovrtx (0.4+)

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

Wires ordering into the PhysX backend read/write paths using the shared
kernels: fused user-and-backend target writes, lazily refreshed
timestamped `body_mass`/`body_inertia` (see the changelog `Changed`
entry for the semantics change vs develop), and ordering maps resolved
at initialization.

Part 4/8 of the series splitting isaac-sim#6248 into independently reviewable
units. isaac-sim#6248 remains open, untouched, as the reference implementation;
this stack was cut from its final tree after a `develop` sync (Kamino
Core, Newton bump, OVPhysX 0.5.1).

## Stack

- Part 1/8: isaac-sim#6334 — Extract rigid object interface test utilities
- Part 2/8: isaac-sim#6335 — Core ordering foundation
- Part 3/8: isaac-sim#6336 — Newton backend
- **Part 4/8 (this PR)**: isaac-sim#6337 — PhysX backend
- Part 5/8: isaac-sim#6338 — Extract articulation interface test utilities
- Part 6/8: isaac-sim#6339 — OVPhysX backend
- Part 7/8: isaac-sim#6340 — Cross-backend ordering interface tests
- Part 8/8: isaac-sim#6341 — Events, consumers, and documentation

> [!NOTE]
> All parts target `develop`, so until the preceding parts merge this
PR's diff includes them. The true delta of this part is [this
compare](AntoineRichard/IsaacLab@antoiner/articulation-reordering-p3...antoiner/articulation-reordering-p4).

## 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`
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] My name exists in `CONTRIBUTORS.md`

## Test Plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_physx/test/assets/test_articulation.py` -> 239 passed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_physx/test/assets/test_newton_actuators_physx.py` -> 44
passed
- [x] `./isaaclab.sh -f` -> all hooks pass
…erarchy assets (isaac-sim#6377)

# Description

Spawning an asset whose rigid bodies are nested (child link prims
authored under their parent link prim, as produced by the URDF importer
in Isaac Sim 6.0 and later) only applied `rigid_props` and `mass_props`
to the first link: the `apply_nested` decorator stops descending into a
prim's children once the wrapped function succeeds, assuming physics
schemas cannot nest. On a 29-link arm, `disable_gravity=True` reached
1/29 bodies with no warning.

This completes the nested-hierarchy fix started in isaac-sim#6259 (which covered
contact-sensor activation):

- `apply_nested` gains a `stop_on_success` flag (default `True`; the
dual-form decorator keeps every existing bare `@apply_nested` usage
working unchanged).
- `modify_rigid_body_properties` and `modify_mass_properties` opt out of
the early stop, since their anchor prims are exactly the link prims that
nest.
- Regression test with a 3-deep nested rigid-body chain verifying both
properties land on every body (mirrors the isaac-sim#6259 test).

## Scope: why only the rigid-body and mass writers

An audit of the 40 asset stages referenced by
`isaaclab_assets`/`isaaclab_tasks` informed the scoping:

1. Rigid-body nesting is the only *independent-anchor* nesting in use:
`ShadowHandNewton` authors 24 of its 25 links body-under-body and is
spawned with `rigid_props` by the shadow-hand task — this fix is
required for those values to reach every link.
2. No joint-under-joint nesting and no nested articulation roots exist
in any audited asset; keeping the early stop for those writers is safe.
3. Collider-under-collider exists only as duplicated same-intent anchors
in a few props (e.g. the factory gear assets author `CollisionAPI` with
SDF approximation on two ancestor Xforms of the same meshes, via layer
composition). Those anchors describe the *same* geometry rather than
independent colliders — the USD Physics spec ties `CollisionAPI` to leaf
gprims, so nested Xform-level anchors have no defined precedence.
Widening the traversal there would paper over an asset-level duplication
instead of fixing schema application, so the collision writers keep the
early stop; the asset duplication is being followed up separately.
4. Some flat assets (e.g. Franka) author `MassAPI` on both link prims
and mesh prims beneath them. With this change `mass_props` now also
authors the nested `MassAPI` prims; per the [USD Physics
spec](https://openusd.org/release/wp_rigid_body_physics.html), a
parent's explicit mass overrides mass properties authored further down
the subtree, so effective per-body mass is unchanged.

## Behavior note

The Newton shadow-hand task cfg sets `disable_gravity=True` (and related
rigid-body properties) that previously reached only 1 of 25 links. With
this fix the cfg applies to all 25 links as intended. This is the bug
being fixed, but baselines tuned against the old (partial) behavior may
shift for tasks whose assets have nested links.

## Verification

- End-to-end through the spawner (`UsdFileCfg` → the same
property-application path `UrdfFileCfg` uses) on a nested
Geometry-scoped 3-link chain: `disable_gravity` and `mass` author on 1/3
bodies before the fix and 3/3 after; contact-report API 3/3 on both (via
isaac-sim#6259).
- New regression test in `test_schemas.py` (nested chain, asserts both
properties on every link).
- Full CI green (34/34 checks).

Fixes isaac-sim#5918

## 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
- [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
…nager runtime (isaac-sim#6412)

## Summary

- Fixes OVPhysX actuator joint indices to follow the common actuator
indexing contract.
- Fixes OVPhysX initialization alongside Kit by reusing Kit's registered
PhysX schema provider.
- Fixes the OVPhysX manager to support both the declared public runtime
API and the current runtime API.
- Regression tests included. Validated by full dexterous training runs
on the OVPhysX backend; split out of the lumped validation branch isaac-sim#6324
(Part 2 of 11).

## Dependencies

- None.

## Series review map

Full integrated diff + training/validation evidence: the lumped
validation PR isaac-sim#6324
(DO-NOT-MERGE).

| Part | PR |
|---|---|
| Docs: regenerate the environment overview table |
isaac-sim#6410 |
| Part 1/11: Newton runtime fixes (cloner rows, cubric fallback, viz
teardown) | isaac-sim#6411 |
| **Part 2/11: OVPhysX runtime fixes (this PR)** |
isaac-sim#6412 |
| Part 3/11: success-rate metrics for the Direct reorientation tasks |
isaac-sim#6413 |
| Part 4/11: RSL-RL training for the handover Direct task |
isaac-sim#6414 |
| Part 5/11: success-rate support in the benchmark utilities |
isaac-sim#6415 |
| Part 6/11: renderer presets for the Direct camera task |
isaac-sim#6416 |
| Part 7/11: OVPhysX presets for the dexterous tasks |
isaac-sim#6417 |
| Part 8/11: Allegro manager counterpart |
isaac-sim#6418 |
| Part 9/11: Shadow + OpenAI manager counterparts |
isaac-sim#6419 |
| Part 10/11: Shadow camera manager counterpart |
isaac-sim#6420 |
| Part 11/11: Shadow handover manager counterpart |
isaac-sim#6421 |


---
### Exact changes in this PR

- OVPhysX backend changes + tests:
isaac-sim@1f7a433
# Description

Default enable_external_forces_every_iteration to true for PhysX and
warn when users opt out with the deprecated flag.

Add a deprecation warning and a breaking changelog fragment.

## 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)
- Breaking change (existing functionality will not work without user
modification)

## Checklist

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

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
# Description

Updates CODEOWNERS based on recent development.

## Type of change

- Documentation update


## 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 updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] 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

PR isaac-sim#6505 removed the Kit extension startup that previously re-imported
`isaaclab_physx` after Kit loaded. When task configuration imports the
PhysX package before Kit, the compatibility hook returns early and is
never retried. The original Isaac Sim `SimulationManager` STOP callback
then invalidates the tensor view shared with `PhysxManager`, causing
Franka and other PhysX articulation environments to fail during their
first reset.

This PR retries the existing idempotent compatibility takeover from
`PhysxManager.initialize()`, where Kit is available and PhysX is the
selected backend. It also updates the import-order contract and adds an
integration regression test that imports `PhysxCfg` before launching
Kit.

This fix is independent of isaac-sim#6337.

## Type of change

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

## Screenshots

N/A

## Validation

- Regression RED on unmodified develop: module alias remained the
original Isaac Sim `SimulationManager` after `SimulationContext`
initialization.
- Regression GREEN: `1 passed`.
- `Isaac-Reach-Franka`, 16 environments, PhysX: environment creation,
reset, and first step completed with exit code 0 and without
invalidated-view errors.
- `./isaaclab.sh -p tools/changelog/cli.py check develop`
- `./isaaclab.sh -f`

## Checklist

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

Remove the unused `flatdict` dependency from the root test extra and the
two CI bootstrap commands that install test tooling. Also remove
`flatdict` from the Sphinx mocked-import list.

The repository no longer imports or otherwise uses `flatdict`, so
retaining it adds unnecessary installation and dependency-resolution
work.

Dependencies required by this change: none. This change removes
`flatdict`.

## Type of change

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

## Screenshots

Not applicable.

## Validation

- `./isaaclab.sh -p -m pytest
source/isaaclab/test/cli/test_uv_run_pyproject.py` (6 passed)
- `bash -n .github/actions/multi-gpu/multi_gpu_shard_runner.sh`
- Parsed `pyproject.toml` and asserted the test extra contains no
`flatdict` requirement
- Searched the repository for remaining live `flatdict` references; only
the historical changelog entry remains
- `./isaaclab.sh -f` (passed before commit and again before push)

## Checklist

- [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
- [ ] I have added tests that prove my fix is effective or that my
feature works (no new test was needed for this metadata-only removal;
existing metadata tests pass)
- [x] I have added a changelog fragment for every touched package (not
applicable; no package under `source/` was changed)
- [x] My name already exists in `CONTRIBUTORS.md`
…ss prims (isaac-sim#6501)

# Description

The `apply_rigid_body_properties`, `apply_collision_properties`, and
`apply_mass_properties` fragment family writers force-applied their
defining USD API (`RigidBodyAPI` / `CollisionAPI` / `MassAPI`) directly
on the input prim. The legacy writers they replace are `@apply_nested`:
they modify the prims that *already carry* the API and never author a
fresh one.

For bare-prim spawns (shapes, meshes) the define-fresh behavior is
correct, which is why all existing tests passed. The failure needs a
real USD asset: robot assets author `RigidBodyAPI` on their **link**
prims and (commonly) `ArticulationRootAPI` on the **spawn** prim.
Configuring `rigid_props` as a fragment list on such an asset
force-anchored a new rigid body on the spawn prim, turning every link
into a nested rigid body — the PhysX parser then drops the
articulation's joint graph (`Articulation` initialization fails with an
empty joint registry). Reproduced A/B on the cartpole asset.

## Fix

Resolve targets the way the legacy nested writers do, mirroring the
articulation-root writer's existing pattern: collect subtree prims
already carrying the defining API (breadth-first, without descending
past a match — nested applications of the same physics schema are not
allowed), dispatch every fragment to each; apply a fresh API on the
input prim **only** when the subtree carries none (presence-gated),
preserving the bare-prim spawner behavior. Instanced prims are skipped
with a warning. The shared resolution lives in one helper used by all
three writers.

## Tests

New `test_schema_writer_nested_targets.py` (all fail before the fix,
pass after):
- fragment `rigid_props`/`collision_props`/`mass_props` through the
production USD spawn path on an articulated asset: attributes land on
the links/colliders, the spawn prim gains no anchor;
- fragment vs legacy path on the same asset: identical per-prim
applied-schema sets and authored attributes;
- bare-prim define-fresh preserved; traversal does not descend past an
existing body.

Existing suites re-run green: schema/collision/mass/mesh-collision
fragments, spawn meshes, schemas (101 tests total).

## Type of change

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

## Checklist

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

Depends on isaac-sim#6481

## 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 updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] 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
-->
# Conflicts:
#	pyproject.toml
#	source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py
#	source/isaaclab_newton/pyproject.toml
#	source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/go1/flat_env_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_env_cfg.py
@greptile-apps

greptile-apps Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Too many files changed for review. (1096 files found, 100 file limit)

@github-actions github-actions Bot added asset New asset feature or request isaac-sim Related to Isaac Sim team isaac-mimic Related to Isaac Mimic team infrastructure labels Jul 18, 2026
@ooctipus
ooctipus merged commit 1f90f4c into isaac-sim:fpgs-dev Jul 18, 2026
15 of 16 checks passed
ooctipus added a commit that referenced this pull request Jul 18, 2026
# Description

Revert #6599. That PR incorrectly squash-merged the complete `develop`
history into one oversized commit instead of rebasing the FPGS work on
top of `develop`.

The resulting tree is verified byte-for-byte equal to the pre-#6599
`fpgs-dev` tree at `3002557631e365bfbd889c504b15a3b2b27a2d07`.

A separate corrected branch will be built from `develop` with only the
intended FPGS changes replayed on top and audited before publication.

## Tests

- Restored tree hash: `333af65956c460d2572f3073cf979c1f870845b2`,
exactly matching the pre-#6599 tree.
- Pre-commit hooks passed. The LFS hook was skipped locally only because
the parent checkout has an `.git/info/attributes` override; repository
attributes are unchanged.
@ooctipus
ooctipus deleted the ooctipus/sync-fpgs-dev-develop-20260717 branch July 18, 2026 06:58
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 infrastructure isaac-mimic Related to Isaac Mimic team isaac-sim Related to Isaac Sim team

Projects

None yet

Development

Successfully merging this pull request may close these issues.