Skip to content

[Backport release/3.0.0] Backport six non-breaking bug fixes - #8249

Merged
kellyguo11 merged 6 commits into
isaac-sim:release/3.0.0from
StafaH:backport/release-3.0.0-circular-buffer
Oct 2, 2026
Merged

kellyguo11 merged 6 commits into
isaac-sim:release/3.0.0from
StafaH:backport/release-3.0.0-circular-buffer

Conversation

@StafaH

@StafaH StafaH commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Description

Backport six non-breaking bug fixes to release/3.0.0:

All six fixes are exact cherry-picks. Original tests and changelog fragments are included; no new dependencies.

Validation

  • 78 entrypoint and video-recorder tests passed after narrowing the backport scope.
  • The six retained backports are unchanged from the previously validated combined branch (85 focused tests passed).
  • Formatting, lint, release-aware changelog checks, and git diff --check passed.
  • GPU/runtime validation is requested through CI; robot-load performance was not rerun locally.

Type of change

  • Bug fix (non-breaking)
  • Release backport

Backport isaac-sim#7131 to release/3.0.0.

(cherry picked from commit 7c05e96)

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isaac Lab Review Bot

The backport adds an initialization guard to CircularBuffer.buffer, replacing an implementation-level PyTorch failure before the first append with a documented RuntimeError. The focused implementation, changelog entry, and regression coverage are consistent with the existing buffer lifecycle.

  • Design and architecture: The validation remains at the property that owns access to _buffer, matching the lifecycle checks already used by __getitem__ and stacked. No new abstraction, state duplication, or cross-layer responsibility is introduced.
  • API: The reviewed public surface is CircularBuffer.buffer. Its post-append shape, oldest-to-newest ordering, device, dtype, and legacy versus stack_dim behavior remain unchanged. The docstring now explicitly documents the pre-append RuntimeError.
  • Compatibility and deprecation: Breaking changes: none identified. Pre-append access previously leaked an incidental PyTorch TypeError from operating on None; the patch intentionally replaces that failure with a clear, documented RuntimeError. No evidence establishes the former implementation error as a supported contract, while all initialized access paths remain unchanged.
  • Implementation: The new _buffer is None guard runs before both existing layout branches. Once initialized, the property still delegates directly to torch.transpose in legacy mode or torch.movedim in stacked-output mode, preserving the existing data path without added allocation or synchronization. The package changelog records the corrected failure behavior.
  • Style consistency: The added Raises: section follows the neighboring Google-style property documentation, and the concise error message gives the caller a concrete remedy. The implementation adds no redundant comments or structural churn, and the changelog wording is specific to the corrected behavior.
  • Test quality: The changed tests were audited for ownership and duplication. The new empty-property assertion directly covers the regression at the CircularBuffer.buffer boundary and checks both exception type and actionable wording. The first-append assertion independently preserves the default-mode warmup-fill contract before the existing overflow checks; it does not duplicate the separate stacked-output-mode case.

No blocking issues. No inline issue met the actionable-evidence threshold; the assessment above records the review feedback.

Automated review; human maintainers own approval decisions.

@greptile-apps

greptile-apps Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium risk] Fixes uninitialized buffer access in a utility class.

The PR appears safe to merge.

Summary

This backport makes CircularBuffer.buffer raise a clear RuntimeError when accessed before the first append.

  • Adds regression coverage for empty access and the first-append warmup layout.
  • Includes a changelog fragment.

Reviews (1) · Last reviewed commit: "Fix CircularBuffer.buffer access before ..."

@github-actions github-actions Bot added the isaac-lab Related to Isaac Lab team label Oct 1, 2026
@StafaH

StafaH commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Oct 1, 2026
@StafaH StafaH changed the title [Backport release/3.0.0] Fix CircularBuffer.buffer access before first append (#7131) [Backport release/3.0.0] Backport missing PRs that have bug fixes Oct 1, 2026
sylvesterkaczmarek and others added 5 commits October 1, 2026 14:08
# Description

Fixes Blender subprocess invocation in
`scripts/tools/process_meshes_to_obj.py`.

The helper previously constructed the command as one formatted string
and then called `.split(" ")`. Any valid Blender, input, output, or
script path containing whitespace was therefore split into multiple
command-line arguments.

The subprocess was also launched without `check=True`, so a failed
Blender conversion could be silently treated as success by the wrapper.

The helper now builds the subprocess argument list directly, preserves
each path as one argument, requests `check=True`, and raises a clear
error when Blender cannot be found on `PATH`.

## Type of change

- Bug fix

## Validation

- Added a unit regression test with Blender, input, and output paths
containing spaces.
- The test verifies each path remains one subprocess argument and
`check=True` is used.
- Added coverage for the missing-Blender error path.
- No Blender installation is required by the tests.
- No package changelog fragment is required because this changes a
repository script, not a `source/<pkg>/` package.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have added regression tests
- [x] No new dependencies

---------

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

Fixes two path-handling bugs in `scripts/tools/blender_obj.py`.

When the output is a basename such as `robot.obj`, `os.path.dirname()`
returns an empty string. The converter previously tried to create that
empty path with `os.makedirs("")`, so writing directly to the current
working directory failed.

The optional USD export also used `out_file.replace("obj", "usd")`,
which replaces every matching substring in the full path. A valid path
such as `objects/robot.obj` could therefore be changed to
`usdects/robot.usd`.

The converter now creates a parent directory only when one is present
and derives the USD path by replacing only the file extension.

## Type of change

- Bug fix

## Validation

- Added a unit regression test for an OBJ basename in the current
working directory.
- Added a regression test verifying `objects/robot.obj` maps to
`objects/robot.usd` without changing directory names.
- Blender is mocked, so the tests do not require a Blender installation.
- Added the required `isaaclab` `.skip` changelog marker because managed
package tests are touched.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have added regression tests
- [x] No new dependencies

---------

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

Fixes `dump_yaml()` changing valid `.yml` filenames.

The helper currently checks only whether the filename ends with the
literal string `yaml`. Passing a standard YAML filename such as
`config.yml` therefore writes `config.yml.yaml` instead of the requested
path.

The extension check now accepts both `.yaml` and `.yml`
case-insensitively. Filenames without a YAML extension continue to
receive the default `.yaml` suffix.

## Type of change

- Bug fix

## Validation

- Extended the existing YAML I/O unit tests.
- Added a regression test verifying `config.yml` is written unchanged
and `config.yml.yaml` is not created.
- Existing coverage still verifies extensionless filenames receive
`.yaml`.
- Added the required `isaaclab` changelog fragment.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have added a regression test
- [x] I have added the required changelog fragment
- [x] No new dependencies

(cherry picked from commit 7c69c9b)
# Description

Removes stray debug output from `ActionManager.get_IO_descriptors`.

Successful descriptor export currently executes `print(item["export"])`
for every action term, so normal export writes unrelated `True` /
`False` lines to stdout. The export flag is already consumed immediately
afterwards and does not need to be printed.

This removes only that debug print. The existing error message for
descriptors that actually fail to build is unchanged.

## Type of change

- Bug fix

## Validation

- Added a `pytest.mark.unit` regression test using a valid action
descriptor.
- The test captures stdout and verifies successful descriptor export is
silent.
- The exported descriptor content is still checked.
- Added the required `isaaclab` changelog fragment.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have added a regression test
- [x] I have added the required changelog fragment
- [x] No new dependencies

---------

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

Fixes Newton-native actuators driving only the first asset of a
multi-asset scene.

**Symptom.** In `examples/visual_color_randomization.py` with
`physics=newton_mjwarp`, only the stock ANYmal (the first asset) holds
its default pose. The other four styles have no joint control and
collapse to the floor within about 50 steps.

**Root cause.** `define_actuator_properties` authored `NewtonActuator`
USD prims on only the *first* prim matching the articulation path
(`find_first_matching_prim`). `MultiAssetSpawner` spawns a distinct
articulation per asset at `env_<i>/Robot` before cloning, so the other
assets had no actuator prims. Newton's `ModelBuilder` only sees
actuators authored on the prim it imports, so those assets imported with
no actuators and their joints received no torque. With a single asset,
only `env_0` exists at spawn time, so "first match" happened to be
enough.

**Fix.** Author the prims on every matching articulation, and resolve
the matches on the stage that was passed in rather than the current
stage. For a single asset there is one match, so behavior is unchanged.

Visual materials are not involved. I isolated this on pristine `develop`
with five *identical* plain assets through the multi-asset spawner,
which reproduces the collapse exactly, while a single asset controls all
envs.

Fixes # (issue)

## Type of change

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

## Verification

New test
`test_define_actuator_properties_authors_every_spawned_articulation`:
fails without the change, passes with it.
`source/isaaclab/test/actuators/test_newton_adapter.py`: 12 passed. ruff
0.14.10 check and format clean.

Real demo, `examples/visual_color_randomization.py`, 10 envs,
`newton_mjwarp`, no visualizer, before and after on `develop`:

| | before | after |
|---|---|---|
| `NewtonActuator` prims on stage | `env_0` only | one per asset source
(`env_0, 2, 4, 6, 8`) |
| native actuator indices in the Newton model | 24 (worlds 0 and 1) |
120 (all 10 worlds) |
| envs with nonzero applied torque | 2 of 10 | 10 of 10 |
| root height at step 100 | 0.43 (2 envs), 0.07 (8 envs) | 0.43 (all 10)
|

The number of controlled envs equaled the first asset's block size in
every case I tried (2 of 10, 3 of 15, 1 of 7).

## Not covered

I checked the PhysX and OVPhysX tests that mention these helpers; they
patch their own backend's `find_first_matching_prim` and do not depend
on this function. I did not run those GPU/runtime suites.

## Checklist

- [ ] I have read and understood the contribution guidelines
- [ ] I have run the `pre-commit` checks with `uv run isaaclab --format`
(I ran ruff 0.14.10 check and format, the same hook, on the changed
files only)
- [x] I have made corresponding changes to the documentation (docstring
updated; no user-facing docs affected)
- [ ] My changes generate no new warnings
- [x] I have validated the changed behavior with focused coverage
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

(cherry picked from commit c1242ed)
@StafaH StafaH changed the title [Backport release/3.0.0] Backport missing PRs that have bug fixes [Backport release/3.0.0] Backport seven non-breaking bug fixes Oct 1, 2026
@StafaH

StafaH commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Oct 1, 2026
@StafaH
StafaH force-pushed the backport/release-3.0.0-circular-buffer branch from 5db9d43 to 43df6ad Compare October 2, 2026 00:22
@StafaH StafaH changed the title [Backport release/3.0.0] Backport seven non-breaking bug fixes [Backport release/3.0.0] Backport six non-breaking bug fixes Oct 2, 2026
@StafaH

StafaH commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Oct 2, 2026
@kellyguo11
kellyguo11 merged commit e6cd31f into isaac-sim:release/3.0.0 Oct 2, 2026
56 checks passed
@StafaH
StafaH deleted the backport/release-3.0.0-circular-buffer branch October 10, 2026 19:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants