Skip to content

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

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

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

Conversation

@pull

@pull pull Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

See Commits and Changes for more details.


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

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

isaaclab-bot Bot and others added 10 commits September 25, 2026 05:12
Bumped packages:
- isaaclab: 28.0.0 → 29.0.0
- isaaclab_newton: 7.0.1 → 8.0.0
- isaaclab_ov: 3.3.2 → 3.4.0
- isaaclab_physx: 7.2.2 → 7.2.3
- isaaclab_visualizers: 1.12.1 → 1.13.0
# OVPhysX/OVRTX test suite: 11:29 → 6:32 (−43%)

The `isaaclab_ov` suite runs through `pytest tools` on the same machine
with a warm Warp cache, both device passes, and the `ov` extra. All 36
files pass.

| | `develop` | this PR |
|---|---:|---:|
| Suite wall time | 11:29 | **6:32** |
| Test functions | 473 | 345 |
| Test lines | 19,636 | 16,136 |

## What changed
The whole test surface was pruned with the `isaaclab-auditing-tests`
skill (#8007).

**Method.** Every test was marked keep, fix, merge or delete. Whenever a
deletion's keeper does not carry the assertions verbatim, a deliberate
production mutation proves the keeper fails on both devices. An
independent review then restored every gap it found. Only test files
changed.

- **Merged:**
  - frame transformer: 6 builds → 1
  - IMU/PVA sanity tests into the analytic keepers
- articulation tests that rebuilt a sibling's fixture (5 Anymal builds →
1)
  - `test_ovphysx_view.py` error micro-tests into parametrized keepers
- **Deleted:**
  - tests of the mock fixtures themselves
  - private ordering-state checks
  - WrenchComposer and effort-limit replays
  - joint-wrench identity copies
- contact tests that can never run (production raises
`NotImplementedError`)
  - OVRTX dtype × layout replays
- **Fixed tests that could not fail:**
- material randomization (the default values sat inside the sampling
ranges)
  - IMU partial reset
  - contact threshold (#3498)
  - `apply_joint_command`
  - reset tests
- **Test bug fixed:** a test mutated the shared `FRANKA_PANDA_CFG`, so
every later Panda test ran on a robot that went NaN and still passed.

## Product defect found (not fixed here)
- OVPhysX has no ArticulationRootAPI guard for rigid objects. Pinned
with a strict `xfail`.

## Release backport

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

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Octi Zhang <zhengyuz@nvidia.com>
Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
# PhysX test suite: 12:54 → 7:09 (−45%)

The `isaaclab_physx` suite runs through `pytest tools` on the same
machine with a warm Warp cache. 26/27 files pass. `test_spawn_meshes.py`
needs the `tetrahedralization` extra, which is missing locally and fails
identically on `develop`; it passes with the extra.

| | `develop` | this PR |
|---|---:|---:|
| Suite wall time | 12:54 | **7:09** |
| Test functions | 272 | 186 |
| Test lines | 15,744 | 12,350 |

## What changed
The whole test surface was pruned with the `isaaclab-auditing-tests`
skill (#8007).

**Method.** Every test was marked keep, fix, merge or delete. Whenever a
deletion's keeper does not carry the assertions verbatim, a deliberate
production mutation proves the keeper fails. An independent review then
restored every gap it found. Only test files changed.

- **Merged:**
  - frame transformer: one scene
  - IMU/PVA: one driven loop each (the analytic checks are kept)
  - Jacobian and mass-matrix tests into the link-origin contract
  - init smoke tests into their siblings
  - consistency tests into the write tests, which now use random states
- **Deleted:**
- joint-wrench tests that compared the sensor to the raw tensor it
copies; the shared analytic test is the keeper
  - Fabric tests that restated the shared FrameView contract
  - WrenchComposer replays
  - OSC tests covered by the controller suite
  - cloner tests that are always-xfail or always-skipped
- **Un-shadowed:** the Fabric view defined local tests with the same
names as the shared contract tests, which hid them. The shared tests now
run and catch a per-row scale bug the local copies missed.
- **Fixed tests that could not fail:**
  - external-force tests, where the robot was in free fall
  - `apply_joint_command` (inverted assertion)
  - reset tests
  - IMU stale-data (#4970)
  - `physx_replicate`, which was a non-strict xfail
  - contact threshold (#3498)
  - friction sign
- **Kept:** the RTX writer and visual-material tests, and IK tracking.
Their would-be keepers (the Kuka golden-image test and
`test_differential_ik.py`) never run in CI.

## Product defects found (not fixed here)
- `RigidObjectCollection.set_coms_index` raises `KeyError`.
- A full collection `reset()` leaves the wrench composers active.
- `FrameTransformer.__str__` swaps the frame count and the frame names.
- The Kuka visual-material golden-image test is excluded from CI.

## Release backport

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

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

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

## Summary

PR5B follows merged #8005 and is rebased directly onto develop
`0173b0436`. This PR now contains only the geometry changes.

Complete SDP geometry transport for deformables, MPM particles and
cables:

- `ClonePlan` stays generic. Backend imports read declared prototypes
and retain native geometry mappings; no geometry fields or point-cloud
assets are added to the plan.
- Physics publishes native pointers and exact visual-path ranges. SDP
either borrows native point views or converts/interpolates directly into
the requested destination, once per publication timestamp.
- OVRTX no longer calls Newton for geometry. Shared Fabric rendering and
foreign Newton rendering also consume SDP publications.
- Fabric meshes stay on GPU. Kit's Points/Curves sink requires CPU
Fabric writes; SDP owns the transfer. Removed per-frame USD
`attr.Set()`, renderer-side host packing, duplicate remapping and
obsolete internal point APIs.
- PR5A removes implicit Newton construction, not native-only startup
without a plan. PhysX/OVPhysX can initialize without geometry
declarations; SDP geometry requests require an initialized declaration
and distinguish it from an explicitly empty scene.

Relative to develop: **production −1,708 LOC; tests −991 LOC; overall
−2,602 LOC.**

## Performance

Pre-rebase matched warm sample per workload after cache priming,
physical GPU 1 (RTX 5090), 128 environments, Newton MJWarp+VBD proxy
physics, Newton renderer, no visualizer, seed 42. Baseline: PR5A
`efc70de0b` (develop `1e520e9d5` plus lifecycle enforcement); candidate:
`e4b01c453`. Both used the same harness and dependencies, with checkout
imports verified. Startup includes imports through environment
construction, excluding first step. Runtime excludes 20 warmup steps and
measures 100 steps with GPU synchronization at window boundaries.
Timings have not been rerun for this rebase.

| Camera workload | Startup PR5B / PR5A | Step PR5B / PR5A | Aggregate
FPS PR5B / PR5A |
|---|---:|---:|---:|
| Franka cloth lift | 8.82 / 8.85 s | 29.21 / 29.27 ms | 4,382 / 4,373 |
| Franka cable lift | 7.44 / 7.46 s | 19.73 / 19.95 ms | 6,488 / 6,417 |

These samples are performance-neutral; no broad speedup is claimed.
Image means and standard deviations matched for both workloads.

A focused 1,024-world × 1,024-vertex GPU measurement compares the former
interpolation-then-scatter path with direct SDP-to-Fabric writes:
**0.0294–0.0299 ms → 0.0217–0.0223 ms** across two paired orders, with
identical results. This is a geometry-kernel saving, not an end-to-end
FPS claim.

## Validation

- Rebased onto develop `0173b0436`, preserving upstream PhysX/OVPhysX
test pruning. The conflict resolutions changed no production logic.
Geometry cache naming now uses `geometry_timestamp`, with its relation
to articulation and rigid-object buffer timestamps documented; cache
behavior is unchanged.
- Current focused validation: 32 SDP/Newton geometry checks passed (1
skipped), 42 OVPhysX checks passed, and 79 renderer checks passed. These
groups ran in separate processes to respect schema-registration
ordering. Formatting and changelog checks passed. No PR5A example or
`AGENTS.md` changes remain; documentation builds stay in CI.
- On the preceding stack revision: 116 focused CPU checks, 12 native
Kit/PhysX lifecycle and publication checks, and all 10 GPU geometry
checks passed. Formatting and changelog checks passed. Preserved
upstream test consolidation and the global native-deformable import
regression.
- Fixed the native-Fabric request shared by 77 failing CI cases: the
preceding transform request already updates the whole native stage, so
rendering no longer requests geometry a second time or requires a dummy
plan. The regression failed before the fix and passed afterward. 57 CPU
contract checks and 36 Kit checks passed, covering cameras, environment
render scheduling, XR feeds, all visuotactile tests, and foreign Newton
geometry/cables. Included PR5A's stale documentation-snippet fix; full
documentation validation remains in CI.
- Earlier validation on the pre-rebase revision:
- 176 focused CPU tests and four subtests passed; 10 CUDA/native cases
were skipped in that CPU run.
- All 10 geometry tests passed with GPU 1 enabled, including CPU↔GPU and
native Fabric destinations, pointer ownership and version caching.
- Native Fabric storage-reallocation regression failed before the fix
and passed afterward. Pixel probes verified moving meshes, points and
curves without modifying authored USD point values.
- Formatting and changelog checks passed. Documentation builds are left
to CI.

## Checklist

- [x] Followed contribution guidelines and ran formatting checks
- [x] Updated documentation and package changelog fragments
- [x] Consolidated existing tests and removed obsolete coverage
- [x] <!-- backport-active-release --> Backport to the active release
branch
# Description

Follow-up to #7985 in the series that splits the core cleanup in #7949
into small, reviewable pieces. It makes the fixed tendon position-limit
API consistent across the PhysX, OVPhysX, and Newton backends, and fixes
the Newton fixed tendon mask API.

> **Stacked on #7985.** Until that merges, this diff also shows its two
commits. The PR-specific commits fix tendon position limits and clarify
the remaining Newton property mappings.

## Fixed tendon position limits
The data layout was inconsistent: `fixed_tendon_pos_limits` is
documented and reported as `wp.vec2f` of shape (N, T) (torch: (N, T,
2)), but the setters disagreed.
- **PhysX:** the setters validated (N, T) `wp.float32` and wrote with a
2D float kernel, while the buffer is (N, T, 2). They could not accept
the layout the asset reports, which is why `test_articulation_iface.py`
excluded them. They now validate `wp.vec2f` (torch tensors with a
trailing dimension of 2), like `write_joint_position_limit_to_sim_*`.
- **OVPhysX:** the setters accepted only the (N, T, 2) `wp.float32` form
and rejected `wp.vec2f` arrays (e.g.
`data.fixed_tendon_pos_limits.warp`); a float reached the kernel instead
of raising. They now accept both forms and raise `ValueError` for a
float, like the OVPhysX joint position limits.
- **Newton:** raised `NotImplementedError`. They now write the MuJoCo
`tendon_range` (already bound for reading `fixed_tendon_pos_limits`),
which `write_fixed_tendon_properties_to_sim_*` applies and the solver
refreshes on `ModelFlags.TENDON_PROPERTIES` (added in #7985).

With this, `randomize_fixed_tendon_parameters` can randomize position
limits on all three backends.

## Newton fixed tendon mask API
- `set_fixed_tendon_stiffness_mask` / `set_fixed_tendon_damping_mask`
called `_resolve_env_mask` and `_resolve_fixed_tendon_mask`, which the
Newton articulation does not define (only its rigid object collection
does), and passed `full_data=True` to index setters without that
argument. Both always raised. The articulation now has the mask-to-index
helpers, and the mask setters pass the selected data to the index
setters.
- `write_fixed_tendon_properties_to_sim_mask` called `_resolve_mask`
without its required argument, got a boolean mask where indices were
needed, and passed `env_ids` positionally to a keyword-only method. It
now resolves the masks and forwards them.
- The fixed tendon writers now take the `fixed_tendon_ids` /
`fixed_tendon_mask` arguments the base class declares.

## Newton tendon semantics

The force-gain implementation is now proposed in [Newton
#4311](newton-physics/newton#4311), with the
[Isaac Lab setters implemented on a dependent
branch](https://github.com/ooctipus/IsaacLab/tree/fix/pr7990-tendon-limit-gains).
Those setters require the Newton API addition and are kept out of this
PR until the dependency is updated. The existing Newton 1.6.0 pin
remains unchanged here.

Newton's MuJoCo solver supports tendons. Corrected errors and API docs
that called tendons PhysX-only or implied that MuJoCo cannot represent
limit stiffness. The shared limit-stiffness, rest-length, and offset
setters remain unimplemented; position ranges only act on tendons with
limits enabled in the model.

Newton already [converts joint-limit force gains to
solref](https://github.com/newton-physics/newton/blob/v1.6.0/newton/_src/solvers/mujoco/kernels.py#L2622-L2732),
scaling stiffness and damping by inverse inertia times `(1 - dmax)`. An
isolated GPU check with Newton 1.6.0 / MuJoCo Warp 3.12 and constant
impedance 0.95 adapted this conversion using `tendon_invweight0`: a 3 N
load remained at the expected 3 cm limit penetration for stiffness 100
N/m, with both 1 kg and 10 kg masses. This verifies static compliance in
that setup, not full PhysX trajectory parity.

A tendon conversion should live in Newton's solver, where it can refresh
after inertia changes. Before enabling the shared setter, reconcile
these behaviors:
- PhysX's damping also enters its limit response; MuJoCo has separate
passive and limit damping. Copying the shared damping into both needs
validation against [PhysX's tendon spring
implementation](https://github.com/NVIDIA-Omniverse/PhysX/blob/da950a3537927784951853c66618036f332ca0ce/physx/source/lowleveldynamics/shared/DyCpuGpuArticulation.h#L765-L855).
- Newton's joint converter resets nonpositive stiffness or damping to
MuJoCo's default solref. That fallback does not preserve a shared API's
zero-gain meaning.
- Finite impedance and timestep clamping affect transient response even
when static compliance matches.

The Newton property writer also now reads each staged value at the
selected environment/tendon indices. Previously, writing environment 1,
tendon 1 could silently copy environment 0, tendon 0.

## Tests
- `test/assets/test_articulation_iface.py`:
`set_fixed_tendon_position_limit` is added to the fixed tendon writer
matrix (torch/warp × index/mask × all/subset × invalid input) for the
mock, PhysX, and OVPhysX backends; the note excluding it is removed. 12
of these cases fail on `develop`.
- `isaaclab_newton/test/assets/test_articulation.py`:
`test_fixed_tendon_properties_reach_solver` now uses a mask setter, the
position-limit setter, and the mask writer, and checks the MuJoCo
model's `tendon_range`. It fails on #7985 alone.
- The full `test_articulation_iface.py` (1965 passed) and the Newton
tendon tests pass.

- The Newton integration regression now covers two environments and a
selected stiffness/damping update. It fails with the original writer (12
instead of the requested 42 at environment 1, tendon 1) and passes after
the fix with Newton 1.6.0. All formatting/pre-commit checks passed.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- 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 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

## Release backport

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

---------

Signed-off-by: Octi Zhang <zhengyuz@nvidia.com>
Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
# Description

Part of the series that splits the core cleanup in #7949 into small,
reviewable pieces. Following #7985, event terms and task code should not
branch on the physics manager's class name; they should call the asset
API and let each backend handle (or reject) what it supports. An audit
found the remaining places that branched on the backend name, plus one
Newton solver gap. This PR fixes them. It is independent of #7985 /
#7990 / #7991.

## Changes
- **`randomize_joint_parameters`** chose the friction write path with
`"newton" in manager_name`, treating every other backend (including
OVPhysX) as PhysX. It now randomizes dynamic friction whenever the asset
data exposes `joint_dynamic_friction_coeff` (PhysX, OVPhysX; not
Newton), and makes one `write_joint_friction_coefficient_to_sim_index`
call on every backend. Newton's writer already applies the viscous part
and ignores dynamic friction. Its invalid-operation error also named
`'randomize_fixed_tendon_parameters'`; it now names the right term.
- **`randomize_rigid_body_com`** sliced the pose to a position on Newton
(`"newton" in manager_name`) because Newton's `set_coms_*` accepted
positions only, unlike the base API, PhysX, and OVPhysX, which take
poses. Newton's `set_coms_index` / `set_coms_mask` (articulation, rigid
object, rigid object collection) now also accept poses (trailing
dimension 7 or `wp.transformf`) and ignore the orientation, since Newton
models the center of mass as a position. The event passes poses on every
backend.
- **`randomize_rigid_body_scale`** detected articulations with
`cls.__name__ == "Articulation"` over the MRO; it now uses
`isinstance(asset, BaseArticulation)`.
- **NIST `reset_end_effector_around_asset`** (`isaaclab_tasks` contrib)
no longer performs a backend-specific Jacobian refresh. Joint writes
invalidate articulation data, and subsequent body-pose reads refresh
forward kinematics on demand. This also removes the invalid
`root_physx_view` access on OVPhysX.
- **Newton Featherstone inertia changes.** `SolverFeatherstone` derives
its inertia data (`body_I_m`, `body_X_com`) from the model only in its
constructor, and its `notify_model_changed` ignores
`ModelFlags.BODY_INERTIAL_PROPERTIES`. So `set_masses_*`, `set_coms_*`,
`set_inertias_*`, and the mass/CoM/inertia randomization events silently
had no effect on Featherstone. The real fix is upstream in Newton. Until
then, a manager can declare model changes its solver does not apply
(`NewtonManager._ignored_model_changes`). Featherstone declares
`BODY_INERTIAL_PROPERTIES`, and the manager logs a warning the first
time such a change is flushed.
- **Pretrained checkpoints** (`isaaclab_rl`): OVPhysX configs resolve to
the PhysX checkpoints through the `"physx"` substring match. This is
intended, since they run the same PhysX engine, so it is only
documented.

Not changed: Newton ignores `joint_velocity_limit` on MJWarp (documented
by Newton). A warning was considered, but actuator setup writes velocity
limits for every articulation, so it would fire on every MJWarp run.

## Tests
- `isaaclab_physx/test/assets/test_articulation.py`: the two CUDA cases
of `test_write_joint_state_data_consistency` pass, verifying fresh body
state after manual joint writes without a simulation step or explicit
Jacobian read.
- `test/envs/test_articulation_ordering_events.py`: the Newton
joint-parameter randomization test no longer gives the term a physics
manager. It fails on `develop`, where the term reads `env.sim`. The fake
Newton articulation now forwards viscous friction the way Newton's
writer does.
- `isaaclab_newton/test/assets/test_articulation.py`:
`test_randomize_rigid_body_com` also sets CoMs from full poses (fails on
`develop` with a shape mismatch).
- `isaaclab_newton/test/physics/test_newton_manager_abstraction.py`:
`test_initialize_solver_populates_canonical_state` checks that only
Featherstone registers `BODY_INERTIAL_PROPERTIES` as ignored (8 solver
variants).
- Also passing: the full Newton manager abstraction tests (199) and the
Newton articulation / rigid object / collection CoM and friction tests.

## Type of change

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

## Release backport

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

## Checklist

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

---------

Signed-off-by: Octi Zhang <zhengyuz@nvidia.com>
Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
# Extension package test jobs: 27:03 → 20:58 (−22%)

Each package job runs through `pytest tools` on the same machine with a
warm Warp cache, once on `develop` and once on this PR. The same files
fail on both sides, only from optional dependencies missing in the
timing environment (`pytetwild`, viser/rerun, OpenXR). Those files pass
with the extras installed.

| Package job | `develop` | this PR | Test functions |
|---|---:|---:|---:|
| `isaaclab_rl` | 7:28 | 6:46 | 168 → 146 |
| `isaaclab_mimic` | 8:19 | **4:08** | 20 → 15 |
| `isaaclab_visualizers` | 5:23 | 4:58 | 93 → 75 |
| `isaaclab_assets` | 1:47 | 1:27 | 2 → 2 |
| `isaaclab_contrib` | 1:44 | 1:31 | 143 → 102 |
| `isaaclab_teleop` | 1:40 | 1:29 | 250 → 186 |
| `isaaclab_experimental` | 0:42 | 0:39 | 182 → 109 |
| `isaaclab_ppisp` (not in CI) | – | – | 24 → 20 |
| **Total** | **27:03** | **20:58** | **882 → 655** |

Test lines: 27,724 → 24,181. The only change outside test files: the
tiled Newton visualizer file was merged into
`test_visualizer_integration_newton.py`, so its retry entry in
`tools/conftest.py` was dropped and a flaky mark was carried into the
merged file.

## What changed
Pruned with the `isaaclab-auditing-tests` skill (#8007), campaign mode,
one commit per package.

**Method.** Every test was marked keep, fix, merge or delete. Whenever a
deletion's keeper does not carry the assertions verbatim, a deliberate
production mutation proves the keeper fails. An independent review then
compared deleted coverage against the keepers, and every gap it found
was restored and mutation-proven:
- the RSL-RL recurrent-config fields (`stochastic`, `init_noise_std`,
`state_dependent_std`);
- Warp graph-cache replay identity;
- the tiled Newton visualizer retry.

- **Merged:** repeated scene or env builds that checked overlapping
properties, and parametrize axes that reach no distinct code path.
- **Deleted:** mock self-tests, restated config values, import and
inventory checks, and duplicate per-backend replays of
backend-independent helpers.
- **Fixed:** assertions that could not fail.

## Follow-ups
- `isaaclab_ppisp` has no CI job in `build.yaml`.
- The three byte-identical mimic dataset-generation files could become
one parametrized file.

## Release backport

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

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
# `isaaclab_tasks` changed test files: 12:27 → 8:45 (−30%)

This times the 42 `isaaclab_tasks` test files this PR touches, rendering
files included. Each run goes through `pytest tools` on the same machine
with a warm Warp cache, once on `develop` and once on this PR. Four
kitless and cable rendering files fail on both sides, only from local
golden-image and renderer environment differences.

| | `develop` | this PR |
|---|---:|---:|
| Wall time (changed files) | 12:27 | **8:45** |
| Rendering nodes, Kit jobs | 83 | 36 |
| Rendering nodes, kitless jobs | 166 | 68 |
| Test functions | 379 | 309 |
| Test lines | 12,664 | 11,656 |
| Golden images | – | 137 removed |

The only change outside test files: `.github/workflows/build.yaml` no
longer lists the deleted `test_rendering_franka_soft.py`.

## What changed
Pruned with the `isaaclab-auditing-tests` skill (#8007), campaign mode.

**Method.** Every test was marked keep, fix, merge or delete. Whenever a
deletion's keeper does not carry the assertions verbatim, a deliberate
production mutation proves the keeper fails. An independent review then
restored every gap it found: the Pink `daqp` dependency row and the
dict-form `distributed=False` no-op.

- **Rendering:**
- The minimal-mode (simple-shading) golden layer went down to the Shadow
Hand rows. Cartpole's flat materials render the same at shading modes 3
and 2, so its golden images could not catch a mode regression.
  - Newton-default and always-skipped OVPhysX rows were dropped.
- `test_rendering_franka_soft.py` was deleted; every one of its nodes
always skipped.
- The yellow-background kitless file is covered by `test_ovrtx_usd.py`.
- **Deleted:** tests covered elsewhere:
- hydra (13), `preset_cli` (6), distributed device resolution (10),
runtime compatibility (4)
  - quaternion helper replays (covered by `test_math.py`)
  - three `rl_device` GPU-to-GPU rows
  - two determinism rows (385 s → 94 s)
- **Merged:** camera preset tables (19 → 4 and 6 → 2 rows), kit-decision
selectors, lazy-stub import kinds, and the Kuka OVPhysX presets.
- **Fixed tests that could not fail:**
  - the hydra unknown-preset test
  - the `parse_env_cfg` override test
  - the kitless distributed test, which now uses the real resolver
  - the fake hand's `preserve_order`
  - the sampler negative weight
  - the XR feed link
  - SO-101 output order, which used to skip where it should fail

## Follow-ups
- The OVPhysX smoke, MPM, Kuka visual-material, yellow-background and
partition-bounds rendering files are not wired into CI.
- `CameraCfg.validate_config` needs a core test.

## Release backport

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

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
)

# Description

The fixed-tendon integration regression failed at `sim.reset()` after
#8005 made Newton model construction explicit. It now calls
`replicate(sim.get_clone_plan())` before reset, matching the other
articulation tests.

The original environment, event-manager, and tendon fixes from this PR
were already merged through the stacked #7990. This update resolves the
conflicts against current `develop`, preserves its newer tendon
implementation and expanded regression, and leaves only the missing test
setup call plus the required changelog marker.

## Validation

- 21 checks passed: 6 articulation-event tests, 13 event-manager tests,
the indexed-dictionary curriculum regression, and the GPU tendon
regression.
- The tendon regression passed with the pinned Newton 1.6.0 and MuJoCo
Warp 3.12.0 on an RTX 5090. It covers stiffness, damping, position
limits, and selected environment/tendon updates.
- Before the setup call, the test failed because no Newton builder had
been supplied. With the setup corrected, removing only
`ModelFlags.TENDON_PROPERTIES` notification makes the test fail
numerically: solver stiffness remains 0 instead of 12.
- All formatting and pre-commit checks passed.

## Release backport

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

---------

Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
# Core (`isaaclab`) test job: 32:18 → 22:40 (−30%)

The core job (`pytest tools`, excluding `isaaclab_*` packages, as the
three core CI shards run it) ran on the same machine with a warm Warp
cache, once on `develop` and once on this PR.
- **Timing fix.** In the worktree the two benchmark smoke files launched
the system Python and failed fast. The pruned time is corrected with
their 2:00 baseline duration; they are unchanged by this PR.
- **Shared failures.** Six files fail on both sides only because of
local tools and environment: video conversion, `nsys`, device
constructors and visualizer markers.
- **Fixed here.** The four asset interface files that fail on `develop`
fail because of an OVPhysX fixture bug, which this PR fixes.

| | `develop` | this PR |
|---|---:|---:|
| Core job wall time | 32:18 | **22:40** |
| Test files | 312 | 289 |
| Test functions | 3,069 | 2,229 |
| Test lines | 97,369 | 81,275 |

Changes outside test files:
- `tools/test_settings.py` drops `TESTS_TO_SKIP` entries for five
deleted files.
- `docs/source/refs/contributing.rst` pointed at the deleted
`deps/test_torch.py`; it now points at `utils/test_circular_buffer.py`.

## What changed
Pruned with the `isaaclab-auditing-tests` skill (#8007), campaign mode.
The work ran in seven lanes:
- sim
- assets
- sensors
- envs / managers / controllers / actuators
- scene / cloner / renderers / markers
- utils
- CLI / app / benchmarks

**Method.** Every test was marked keep, fix, merge or delete. Whenever a
deletion's keeper does not carry the assertions verbatim, a deliberate
production mutation proves the keeper fails. An independent review per
lane restored every gap it found, each mutation-proven:
- OSC variable-impedance masking
- render interval in all three workflows
- per-backend deprecated friction writer
- CPU segmentation
- ray-caster mesh cache
- rendering-kit defaults
- non-default `dt`
- schema API application
- joint drive type
- file-log level
- global torque reset
- terrain origins

- **Largest cuts:**
- asset interface tests: mocked cases ~6,400 → ~1,050; about 114 getter
tests became 4 table tests, with rows diffed mechanically
  - 10 OSC convergence sims, covered by the repaired unit-law test
  - manager tests moved off Kit
  - actuator and rendering cartesian products
  - SimulationContext 52 → 30 tests
- **Tests that could not fail, now fixed:**
  - partial writes with a non-trivial joint/body ordering
  - alias equality compared by shape only
  - writer read-backs
  - schema validators that inspected only children
  - `test_reset` lifecycle checks
  - a camera test that compared a shared cache with itself
- **Multi-GPU lane:** tests now use `DeviceScope.DEFAULT_CUDA` or
`CPU_AND_DEFAULT_CUDA`, so no file enters the multi-GPU job unless it
boots Kit with `resolve_test_sim_device()`.

Merged with #7995. Its new renderer source-scan test was not carried
over: the behavior it guards, SDP writing geometry into Fabric, is
covered by `test_scene_data_geometry.py`.

## Product defects found (not fixed here)
- When physics handles decimation, the render check only fires on exact
multiples. For example, `render_interval=10` with `decimation=4` renders
at half rate. This affects all four env classes.
- PhysX-Fabric FrameView: after a USD parent move, whichever of the
world/local reads comes second is stale.
- The MJCF physics scene is written to payload layers, not under the
default prim.
- PhysX fixed-tendon position limits are `(N, T, 2)`, which contradicts
the docstring and OVPhysX.
- EventManager does not register class terms when created while the sim
is already playing.
- `FrameTransformer.__str__` swaps the frame count and names.
- RigidObjectCollection `set_coms_index` raises KeyError on PhysX.

## Release backport

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

## Checklist
- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
@pull pull Bot locked and limited conversation to collaborators Sep 25, 2026
@pull pull Bot added the ⤵️ pull label Sep 25, 2026
@pull
pull Bot merged commit fbfd453 into mataylor-nvidia:develop Sep 25, 2026
10 of 11 checks passed
@github-actions github-actions Bot added documentation Improvements or additions to documentation infrastructure isaac-mimic asset labels Sep 25, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants