Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
f01c3cc
Stabilize Reach environment smoke tests (#6794)
maxkra15 Aug 3, 2026
5d3ec0a
Add Newton cable object support (#6688)
mmichelis Aug 3, 2026
05f68ac
Fix PhysX collision filtering in direct tasks (#6855)
kellyguo11 Aug 3, 2026
c8be14f
Replace cubric ctypes shim with IFabricHierarchy GPU API (#6834)
pbarejko Aug 4, 2026
d81d216
Disable Isaac Sim simulation manager callbacks at startup (#6728)
kellyguo11 Aug 4, 2026
42181ef
Make automatic PhysX defaults concrete and fix install hints (#6849)
kellyguo11 Aug 4, 2026
08e964b
Fix replay crash on trailing idle action in IK tasks (#6810)
rwiltz Aug 4, 2026
015b982
Fix Newton contact buffer sizing when solver naconmax exceeds the col…
fatimaanes Aug 4, 2026
994281e
[CI] Publish nightly images to the current NGC org (#6837)
hujc7 Aug 4, 2026
2517966
Expose cable demo backend option (#6872)
kellyguo11 Aug 4, 2026
0b45187
Synchronize environment preset documentation (#6879)
kellyguo11 Aug 4, 2026
6579c45
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 4, 2026
684ea95
Rework bin packing demo with heterogeneous cloning (#6562)
rebeccazhang0707 Aug 4, 2026
812e8ad
Remove Newton Warp missing-table xfail from Franka tests (#6869)
nvsekkin Aug 4, 2026
72f7a6d
Refactor viz and video-recording related classes. Expand video-record…
matthewtrepte Aug 4, 2026
62e1433
Update quickstart and uv installation for docs (#6867)
StafaH Aug 4, 2026
6665565
[BUG] Dispatch PhysicsEvent.STOP when the physics manager is declared…
hujc7 Aug 5, 2026
67370f5
Improve multi-gpu debugging skills and console log output (#6870)
StafaH Aug 5, 2026
8736403
Cleanup MDP for locomotion (#6871)
StafaH Aug 5, 2026
c05d72a
Add OSMO workflow for multi-GPU cluster training (#6883)
ooctipus Aug 5, 2026
f669093
Fix Franka Reach gains and IK backend support (#6880)
maxkra15 Aug 5, 2026
76d764a
Gate legacy kitless rendering on PRs (#6816)
nvsekkin Aug 5, 2026
7c60d5f
Support latest Newton world contracts (#6886)
maxkra15 Aug 5, 2026
11e7c21
Fix XR startup abort on unshipped omni.kit.xr.bundle.generic (#6894)
rwiltz Aug 5, 2026
e94ad28
Configure RSL-RL episode initialization (#6887)
maxkra15 Aug 5, 2026
124137e
Add scoped Newton world builder hooks (#6888)
maxkra15 Aug 5, 2026
9d078e8
Fix bin-packing demo crash for small --num_envs (#6898)
ooctipus Aug 5, 2026
5a76ce5
Fix renderer backend INFO logs silenced on kitless backends (#6813)
mataylor-nvidia Aug 5, 2026
50c445b
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 5, 2026
47bf8f6
docs: fix SO-101 leader-arm plugin prerequisites (#6915)
rwiltz Aug 5, 2026
4aeb364
Cleanup inconsistencies and flow in installation doc (#6907)
StafaH Aug 5, 2026
e3c7dd8
ci: Pin Isaac Sim image to the last known-good build (#6901)
nvsekkin Aug 5, 2026
174f1a7
Pin OVStage to OVPhysX-compatible version (#6929)
kellyguo11 Aug 6, 2026
82d0f28
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 6, 2026
0f2e021
Fix Cabinet MDP and ensure convergence (#6896)
StafaH Aug 6, 2026
89f10b0
Stop the Newton cloner from approximating mesh colliders (#6892)
ooctipus Aug 6, 2026
cfb54c0
Fix replication bug to achieve skip (#6904)
StafaH Aug 6, 2026
4414003
Support XR teleoperation in the uv install workflow (#6747)
rwiltz Aug 6, 2026
3ea6f7b
Make the required kitless rendering gate reliable (#6917)
nvsekkin Aug 6, 2026
1014257
Restore the sensor USD replication default (#6945)
nvsekkin Aug 7, 2026
b660597
Document direct physics engine API access (#6939)
AntoineRichard Aug 7, 2026
32abede
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 7, 2026
50a244e
Handle single-world coupled MPM resets (#6955)
maxkra15 Aug 7, 2026
480370c
perf: scale FabricFrameView selections to the view, not the stage (#6…
pv-nvidia Aug 7, 2026
6040c77
Add XR camera picture-in-picture feedback (#6818)
hougantc-nvda Aug 7, 2026
7a15f19
Tune Newton MJWarp locomotion environments (#6861)
ooctipus Aug 7, 2026
28f2cda
OVRTX visualization: add NewtonRTX visualizer and Streaming View fea…
matthewtrepte Aug 7, 2026
01eb210
Give Direct task variants their own environment-table rows (#6914)
AntoineRichard Aug 7, 2026
441def9
Remove the newton_kamino preset from Reach tasks (#6941)
AntoineRichard Aug 7, 2026
0cadc7c
QOL changes to benchmark (including startup) (#6903)
StafaH Aug 7, 2026
4fdfd18
Update Newton pin and articulation targets (#6911)
mmichelis Aug 7, 2026
a3d7a94
Update quickstart backend table (#6958)
StafaH Aug 7, 2026
e39fd57
Add firewall setup to the Docker section of the CloudXR teleoperation…
rwiltz Aug 7, 2026
3fbd732
Fix SO-101 leader-arm build commands in teleop docs (#6969)
rwiltz Aug 7, 2026
2e1225d
Add loading screen for train/play, default newton and rsl_rl across c…
StafaH Aug 7, 2026
8781c2d
Document tetrahedralization setup for soft lift tasks (#6967)
mmichelis Aug 7, 2026
be3e4bc
Restore AppLauncher.has_window dropped by #6658 (#6965)
rwiltz Aug 7, 2026
b16c083
Fix CODEOWNERS handles (#6921)
fatimaanes Aug 7, 2026
00b93dc
Fix Newton external wrench frame (#6934)
AntoineRichard Aug 7, 2026
e209212
Add Newton viewer rigid-body dragging (#6696)
maxkra15 Aug 8, 2026
04fb61d
[Multi-GPU] Refactors multi-gpu logic into module, fix ghost process …
StafaH Aug 8, 2026
f74ee31
ci: Update Isaac Sim to latest digest (from 08/06/2026) (#6966)
nvsekkin Aug 8, 2026
c6e817a
Let isaacsim and ovphysx resolve into one environment (#6938)
AntoineRichard Aug 8, 2026
b4e5d03
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 8, 2026
8718973
Fix several visualizer related bugs. (#6977)
matthewtrepte Aug 8, 2026
a7f6cc5
Fix kit-less container bugs and ship OVPhysX plus all Newton viewers …
hujc7 Aug 8, 2026
3c700dc
Retune Franka deformable lift for stable grasping (#6831)
mmichelis Aug 8, 2026
2404010
Remove obsolete OVPhysX bootstrap hacks (#6074)
marcodiiga Aug 8, 2026
a6b2b6e
[Docs Overhaul] --extra usage explained, and fixes to commands (#6979)
StafaH Aug 8, 2026
5131656
[Startup] Fix bug in camera replication skip (#6951)
StafaH Aug 8, 2026
ca5c4a8
Enable deterministic Newton physics (#6930)
kellyguo11 Aug 9, 2026
f5a566b
[Docs Overhaul] Add backend and preset page (#6974)
StafaH Aug 9, 2026
92934ec
Stabilize standalone demo smoke tests (#6982)
kellyguo11 Aug 9, 2026
2ad007e
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 9, 2026
688cdd8
[Fix] Revert gc.collect(0) (#6989)
StafaH Aug 9, 2026
aab5c78
Disable backface culling by default for newton warp renderer (#6959)
huidongc Aug 10, 2026
68d7f93
[CI][Auto Version Bump] Compile changelog fragments (schedule)
isaaclab-bot[bot] Aug 10, 2026
d6ee8a6
Add performance baseline comparison
AntoineRichard Aug 10, 2026
dd71af1
Run performance smoke comparisons in CI
AntoineRichard Aug 10, 2026
f58fb02
Harden performance smoke validation
AntoineRichard Aug 10, 2026
a22acd1
Complete performance smoke comparisons
AntoineRichard Aug 10, 2026
36495de
Isolate performance benchmark output
AntoineRichard Aug 10, 2026
e0376eb
Fix lazy PhysX IMU and PVA acceleration (#6439)
AntoineRichard Aug 10, 2026
1ce4fce
Extract benchmark output through Docker
AntoineRichard Aug 10, 2026
4103757
Add make_uninstanceable to UsdFileCfg (#6993)
ooctipus Aug 10, 2026
845e35f
Bump Isaac Sim image pin to commit 0d707bba (#6995)
huidongc Aug 10, 2026
b0c5a24
[Multi-GPU] Add multi-gpu benchmarks (#6987)
StafaH Aug 10, 2026
6a6e165
[Cleanup] Remove unused directory and alias functions (#6988)
StafaH Aug 10, 2026
fdc1d28
[Cleanup] Remove unused and excessive mock fixtures/tests (#6991)
StafaH Aug 10, 2026
a1dbb98
updated docs to use humanoid and emphasized cli argument (#6996)
frlai Aug 10, 2026
e5c98b3
Add runtime throughput aggregation option
AntoineRichard Aug 11, 2026
a881270
Trim performance comparison reporting
AntoineRichard Aug 11, 2026
253c756
Merge remote-tracking branch 'upstream/develop' into angehu/perf-smok…
angehu-nv Aug 14, 2026
60cae97
Integrate the perf-smoke gate with historical baselines
angehu-nv Aug 14, 2026
6e10e2b
Fix contract backend keys and harden the comparison inputs
angehu-nv Aug 14, 2026
7275e34
Record measured noise floors next to the thresholds
angehu-nv Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .agents/skills/isaaclab-training-multi-gpu
28 changes: 14 additions & 14 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@


# App experience files
/apps/ @kellyguo11 @hujc @matthewtrepte @StafaH
/apps/ @kellyguo11 @hujc7 @matthewtrepte @StafaH

# Core framework
/source/isaaclab/ @ooctipus @AntoineRichard @kellyguo11 @StafaH @pbarejko
/source/isaaclab/ @ooctipus @AntoineRichard @kellyguo11 @StafaH @pbarejko @fatimaanes
/source/isaaclab/isaaclab/envs/mimic_* @peterd-NV @kellyguo11
/source/isaaclab/isaaclab/envs/manager_based_rl_mimic_env.py @peterd-NV @kellyguo11
/source/isaaclab/isaaclab/envs/leapp_deployment_env.py @frlai @StafaH @kellyguo11
Expand All @@ -35,10 +35,10 @@
/source/isaaclab_assets/isaaclab_assets/robots/dr_legs.py @david-cao-mueller @aserifi @rubengrandia @AntoineRichard

/source/isaaclab_contrib/ @ooctipus @StafaH @kellyguo11
/source/isaaclab_experimental/ @hujc @AntoineRichard @kellyguo11
/source/isaaclab_experimental/ @hujc7 @AntoineRichard @kellyguo11
/source/isaaclab_mimic/ @kellyguo11 @peterd-NV

/source/isaaclab_newton/ @AntoineRichard @StafaH @hujc @kellyguo11
/source/isaaclab_newton/ @AntoineRichard @StafaH @hujc7 @kellyguo11
/source/isaaclab_newton/isaaclab_newton/physics/kamino_manager.py @david-cao-mueller @aserifi @rubengrandia @AntoineRichard

/source/isaaclab_ov/ @huidongc @rilei-nvidia @pbarejko @kellyguo11
Expand All @@ -54,30 +54,30 @@
/source/isaaclab_rl/ @ooctipus @StafaH @ClemensSchwarke @kellyguo11
/source/isaaclab_rl/test/export/ @frlai @StafaH @kellyguo11

/source/isaaclab_tasks/ @ooctipus @StafaH @kellyguo11 @hujc
/source/isaaclab_tasks/ @ooctipus @StafaH @kellyguo11 @hujc7
/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/ @david-cao-mueller @aserifi @rubengrandia @AntoineRichard

# Standalone scripts
/scripts/ @StafaH @kellyguo11 @ooctipus
/scripts/benchmarks/ @AntoineRichard @StafaH @kellyguo11 @r-schmitt @fanes
/scripts/benchmarks/ @AntoineRichard @StafaH @kellyguo11 @r-schmitt @fatimaanes
/scripts/imitation_learning/ @peterd-NV @rwiltz @kellyguo11
/scripts/imitation_learning/locomanipulation_sdg/ @jaybdub @peterd-NV @kellyguo11
/scripts/reinforcement_learning/leapp/ @frlai @StafaH @kellyguo11

# GitHub Actions and infrastructure
/uv.lock @StafaH @kellyguo11
/.github/ @kellyguo11 @myurasov-nv @hujc
/.vscode/ @kellyguo11 @hujc @myurasov-nv @Toni-SM
/docker/ @myurasov-nv @kellyguo11 @hujc
/.github/ @kellyguo11 @myurasov-nv @hujc7
/.vscode/ @kellyguo11 @hujc7 @myurasov-nv @Toni-SM
/docker/ @myurasov-nv @kellyguo11 @hujc7
/docs/ @AntoineRichard @kellyguo11 @StafaH @ooctipus
/tools/ @AntoineRichard @kellyguo11 @StafaH @ooctipus

# Cross-stack review caps
/source/*/changelog.d/

# RLiNF
/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/ @mingxueg @kellyguo11
/source/isaaclab_contrib/test/rl/test_rlinf_extension.py @mingxueg @kellyguo11
/source/isaaclab_rl/isaaclab_rl/entrypoints/backends/*rlinf.py @mingxueg @kellyguo11
/docs/source/experimental-features/rlinf_vla_posttraining.rst @mingxueg @kellyguo11
/docs/source/api/lab_contrib/isaaclab_contrib.rl.rst @mingxueg @kellyguo11
/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/ @mingxueg-nv @kellyguo11
/source/isaaclab_contrib/test/rl/test_rlinf_extension.py @mingxueg-nv @kellyguo11
/source/isaaclab_rl/isaaclab_rl/entrypoints/backends/*rlinf.py @mingxueg-nv @kellyguo11
/docs/source/experimental-features/rlinf_vla_posttraining.rst @mingxueg-nv @kellyguo11
/docs/source/api/lab_contrib/isaaclab_contrib.rl.rst @mingxueg-nv @kellyguo11
2 changes: 1 addition & 1 deletion .github/actions/validate-kitless-image/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ runs:
uv pip install --python "$VIRTUAL_ENV/bin/python" pytest
python -m pytest \
source/isaaclab/test/install_ci/misc/cartpole_training_smoke.py::test_train_cartpole_state_completes \
source/isaaclab_newton/test/test_mock_interfaces \
source/isaaclab/test/benchmark/test_asset_suite_runtime_semantics.py \
-q -p no:cacheprovider
'

Expand Down
207 changes: 206 additions & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -789,7 +789,7 @@ jobs:
name: "rendering-correctness-kitless (${{ matrix.variant }})"
runs-on: [self-hosted, gpu]
timeout-minutes: 120
continue-on-error: ${{ github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }}
continue-on-error: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && matrix.variant == 'ovstage') }}
needs: [build, config]
if: needs.build.result == 'success'
strategy:
Expand Down Expand Up @@ -835,6 +835,211 @@ jobs:
container-name: "isaac-lab-rendering-correctness-kitless-${{ matrix.variant }}-test"
omni-github-test-type: "rendering-correctness-kitless-${{ matrix.variant }}"

performance-smoke:
name: "performance-smoke (${{ matrix.name }})"
runs-on: [self-hosted, gpu]
# Budget for two attempts plus image pull and cache restore.
# Each attempt is bounded individually by `timeout` to prevent starving retry.
timeout-minutes: ${{ matrix.timeout_minutes * 2 + 10 }}
needs: [build, config]
# Pull requests run in gate mode, pushes to develop additionally record baseline.
if: >-
(github.event_name != 'push' || github.ref == 'refs/heads/develop') &&
needs.build.result == 'success'
strategy:
fail-fast: false
matrix:
include:
- name: cartpole-physx
task: Isaac-Cartpole-Direct
num_envs: 4096
timeout_minutes: 10
args: ""
- name: cartpole-newton
task: Isaac-Cartpole-Direct
num_envs: 4096
timeout_minutes: 10
args: physics=newton_mjwarp
- name: gear-mesh-physx
task: IsaacContrib-Factory-GearMesh-Direct
num_envs: 512
timeout_minutes: 15
args: ""
- name: shadow-camera-physx-rtx
task: Isaac-Reorient-Cube-Shadow-Camera-Benchmark-Direct
num_envs: 512
timeout_minutes: 20
args: renderer=isaacsim_rtx
- name: shadow-camera-physx-newton-renderer
task: Isaac-Reorient-Cube-Shadow-Camera-Benchmark-Direct
num_envs: 512
timeout_minutes: 20
args: renderer=newton_renderer
- name: shadow-camera-newton-rtx
task: Isaac-Reorient-Cube-Shadow-Camera-Benchmark-Direct
num_envs: 512
timeout_minutes: 20
args: physics=newton_mjwarp renderer=isaacsim_rtx
- name: shadow-camera-newton-renderer
task: Isaac-Reorient-Cube-Shadow-Camera-Benchmark-Direct
num_envs: 512
timeout_minutes: 20
args: physics=newton_mjwarp renderer=newton_renderer
- name: g1-physx
task: Isaac-Velocity-Flat-G1
num_envs: 512
timeout_minutes: 12
args: ""
- name: g1-newton
task: Isaac-Velocity-Flat-G1
num_envs: 512
timeout_minutes: 12
args: physics=newton_mjwarp
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Pull pull-request image
uses: ./.github/actions/ecr-build-push-pull
with:
image-tag: ${{ needs.config.outputs.ci_image_tag }}
isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }}
isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }}
dockerfile-path: docker/Dockerfile.base
cache-tag: cache-base
- name: Resolve Warp version for the JIT cache key
id: warp_version
run: |
set -euo pipefail
version="$(sed -n 's/.*warp-lang[^0-9]*\([0-9][0-9A-Za-z.\-]*\).*/\1/p' pyproject.toml | head -n1)"
if [ -z "$version" ]; then
echo "::error::Could not resolve the warp-lang pin from pyproject.toml; the JIT cache key would stop tracking Warp"
exit 1
fi
echo "value=$version" >> "$GITHUB_OUTPUT"

- name: Restore warm JIT cache
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/jit-cache
key: perf-jit-warp${{ steps.warp_version.outputs.value }}-${{ matrix.name }}-${{ github.run_id }}
restore-keys: |
perf-jit-warp${{ steps.warp_version.outputs.value }}-${{ matrix.name }}-
perf-jit-warp${{ steps.warp_version.outputs.value }}-

- name: Run runtime benchmark
env:
BENCHMARK_ARGS: ${{ matrix.args }}
BENCHMARK_TASK: ${{ matrix.task }}
CI_IMAGE_TAG: ${{ needs.config.outputs.ci_image_tag }}
NUM_ENVS: ${{ matrix.num_envs }}
BENCH_TIMEOUT_S: ${{ matrix.timeout_minutes * 60 }}
run: |
set -uo pipefail
install -d -m 0777 benchmark-output
# World-writable so the in-container user (uid 1000) can populate the cache
install -d -m 0777 "${GITHUB_WORKSPACE}/jit-cache/warp" "${GITHUB_WORKSPACE}/jit-cache/nv"

run_attempt() {
local attempt="$1"
local container="performance-smoke-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${{ matrix.name }}-${attempt}"
docker rm -f "$container" >/dev/null 2>&1 || true
timeout "${BENCH_TIMEOUT_S}" docker run --name "$container" --gpus all --network=host --ipc=host \
-e OMNI_KIT_ACCEPT_EULA=yes \
-e ACCEPT_EULA=Y \
-e ISAAC_SIM_HEADLESS=1 \
-e WARP_CACHE_PATH=/tmp/jit-cache/warp \
-e CUDA_CACHE_PATH=/tmp/jit-cache/nv \
-v "${GITHUB_WORKSPACE}/jit-cache:/tmp/jit-cache" \
--entrypoint bash "$CI_IMAGE_TAG" -lc \
"set -euo pipefail
mkdir -p /tmp/benchmark-output
./isaaclab.sh benchmark runtime \
--task '$BENCHMARK_TASK' \
--num_envs '$NUM_ENVS' \
--num_steps 200 \
--warmup_steps 100 \
--seed 42 \
--benchmark_formatter schema \
--output_path /tmp/benchmark-output \
--visualizer none \
$BENCHMARK_ARGS"
local status=$?
docker cp "$container:/tmp/benchmark-output/." benchmark-output/ 2>/dev/null || true
docker rm -f "$container" >/dev/null 2>&1 || true
return $status
}

if ! run_attempt 1; then
echo "::warning::${{ matrix.name }} failed on the first attempt; retrying once"
rm -f benchmark-output/benchmark_runtime_*.json
run_attempt 2
fi
# Read-only. Recording step below is the only writer scoped to refs/heads/develop.
- name: Compare against baseline history
env:
PERF_BASELINE_URI: ${{ vars.PERF_BASELINE_URI }}
run: |
set -euo pipefail
mapfile -t results < <(find benchmark-output -maxdepth 1 -type f -name 'benchmark_runtime_*.json')
if [ "${#results[@]}" -ne 1 ]; then
echo "::error::Expected one runtime benchmark JSON, found ${#results[@]}"
exit 1
fi
# An unset URI yields SKIP, not failure because a missing baseline is not a regression.
python3 -m tools.perf_smoke.cli compare \
--benchmark_result "${results[0]}" \
--baseline_uri "${PERF_BASELINE_URI:-}" \
--label "${{ matrix.name }}" \
--output_json benchmark-output/comparison.json \
| tee -a "$GITHUB_STEP_SUMMARY"

# Only develop records baselines, so the gate always compares a pull request
# against the branch it will merge into rather than against a stale snapshot.
- name: Record baseline
if: ${{ github.ref == 'refs/heads/develop' && vars.PERF_BASELINE_URI != '' }}
env:
PERF_BASELINE_URI: ${{ vars.PERF_BASELINE_URI }}
run: |
set -euo pipefail
mapfile -t results < <(find benchmark-output -maxdepth 1 -type f -name 'benchmark_runtime_*.json')
python3 -m tools.perf_smoke.cli write \
--benchmark_result "${results[0]}" \
--baseline_uri "$PERF_BASELINE_URI" \
--commit "$GITHUB_SHA" \
--timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--run_id "$GITHUB_RUN_ID"
- name: Upload performance results
if: always()
uses: actions/upload-artifact@v7
with:
name: performance-smoke-${{ matrix.name }}-${{ github.run_id }}
path: benchmark-output/
if-no-files-found: warn
retention-days: 7

# Centralized summary; individual failed tasks still display their own failed jobs.
performance-smoke-summary:
name: performance-smoke
runs-on: ubuntu-latest
needs: [performance-smoke]
if: always() && needs.performance-smoke.result != 'skipped'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: actions/download-artifact@v7
with:
pattern: performance-smoke-*-${{ github.run_id }}
path: comparisons
continue-on-error: true
- name: Summarise performance comparisons
run: |
set -euo pipefail
python3 -m tools.perf_smoke.cli aggregate \
--comparison_dir comparisons \
| tee -a "$GITHUB_STEP_SUMMARY"

# Publishes the shared Warp kernel cache the test jobs restore. Needed as its
# own job because a cache written from a PR is readable only by that PR, and
# no solver-heavy test job runs on push. Does not restore before saving:
Expand Down
8 changes: 5 additions & 3 deletions .github/workflows/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
# Shared image config for CI workflows. Loaded by the `config` job in each
# workflow via yq and exposed as job outputs (see e.g. .github/workflows/build.yaml).
# The `nvidian/isaac-sim` mirror stopped receiving nightly develop builds on 2026-06-24
# (frozen at 6.1.0-alpha.2). Isaac Sim publishes to its own NGC org, which is current.
# (frozen at 6.1.0-alpha.2). Both images use Isaac Sim's NGC org, which is current and
# which the CI credential can reach.
isaacsim_image_name: nvcr.io/0947644777160149/internal/isaac-sim
isaacsim_image_tag: latest-develop
isaaclab_image_name: nvcr.io/nvidian/isaac-lab
# Pinned to Isaac Sim 6.1.0-alpha.47 (commit 0d707bba) for reproducible CI.
isaacsim_image_tag: latest-develop@sha256:dc49acc482221d5302cc7095771b6a807de97a17c7835064f812dd013ff2b806
isaaclab_image_name: nvcr.io/0947644777160149/internal/isaac-lab
ovphysx_wheelhouse_image: ""
5 changes: 3 additions & 2 deletions .github/workflows/kitless-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ jobs:
^uv\.lock$ :: Locked dependency graph
^source/[^/]+/pyproject\.toml$ :: Package manifests
^source/isaaclab/isaaclab/cli/ :: Install CLI implementation
^source/isaaclab_newton/isaaclab_newton/test/mock_interfaces/ :: Mock-interface implementation
^source/isaaclab_newton/test/test_mock_interfaces/ :: Kit-less pytest subset
^source/isaaclab/isaaclab/test/fixtures/ :: Isolated asset fixture implementation
^source/isaaclab_(physx|newton|ovphysx)/isaaclab_.*/test/fixtures/ :: Backend fixture implementation
^source/isaaclab/test/benchmark/test_asset_suite_runtime_semantics\.py$ :: Kit-less pytest subset
^\.github/workflows/kitless-docker\.yml$ :: This workflow file
^\.github/actions/detect-changes/ :: Change-detection action
^\.github/actions/_lib/compute-deps-hash/ :: Dependency-cache identity
Expand Down
15 changes: 8 additions & 7 deletions .github/workflows/license-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ jobs:
ACCEPT_EULA: Y
ISAACSIM_ACCEPT_EULA: YES
run: |
uv sync --extra all --extra test
# Isaac Sim conflicts with --extra all under uv, so install it imperatively
# after the sync. Read the pinned spec from pyproject (single source of truth).
ISAACSIM_SPEC=$(.venv/bin/python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['optional-dependencies']['isaacsim'][0])")
uv pip install "$ISAACSIM_SPEC"
# ``all`` covers every backend (Isaac Sim included), RL library, and visualizer.
# ``rlinf`` and ``mimic`` are outside ``all``, so name them to keep them scanned.
# No extras conflict, so this is a single resolution -- Isaac Sim no longer needs
# an imperative install after the sync.
uv sync --extra all --extra test --extra rlinf --extra mimic
uv pip install pip-licenses pipdeptree \
-r tools/template/requirements.txt
# Put the venv on PATH for later steps.
Expand Down Expand Up @@ -175,8 +175,9 @@ jobs:
run: |
set -euo pipefail
config=.github/workflows/config.yaml
base_image="$(awk -F ':[[:space:]]*' '$1 == "isaacsim_image_name" { print $2; exit }' "$config")"
base_tag="$(awk -F ':[[:space:]]*' '$1 == "isaacsim_image_tag" { print $2; exit }' "$config")"
# The tag may carry a digest, so strip the key rather than splitting on every colon.
base_image="$(awk '$1 == "isaacsim_image_name:" { sub(/^[^:]+:[[:space:]]*/, ""); print; exit }' "$config")"
base_tag="$(awk '$1 == "isaacsim_image_tag:" { sub(/^[^:]+:[[:space:]]*/, ""); print; exit }' "$config")"
if [[ -z "$base_image" || -z "$base_tag" ]]; then
echo "::error::Missing Isaac Sim image configuration in $config"
exit 1
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/wheel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,4 @@ jobs:
--extra-index-url https://pypi.nvidia.com \
--index-strategy unsafe-best-match \
--prerelease=allow \
"${wheel}[isaacsim,all]"
"${wheel}[all]"
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ _build

# No benchmarks output
/benchmarks/
benchmark_*.json


# Ruff cache
**/.ruff_cache/
Expand Down
3 changes: 3 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ repos:
- id: check-added-large-files
args: ["--maxkb=2000"] # restrict files more than 2 MB. Should use git-lfs instead.
- id: check-yaml
# OSMO workflow specs are Jinja templates, so they only become valid
# YAML once the submission-time parameters have been substituted.
exclude: '^docker/cluster/osmo_multi_gpu_workflow\.yaml$'
- id: check-merge-conflict
# These verbatim license headings contain a literal "=======" separator.
exclude: '^docs/licenses/dependencies/(mujoco|llvmlite|numba)-license\.txt$'
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ Notes:
Snake-style `Test_<Filename_Stem_TitleCase>`, mirroring the filename. Each underscore-separated segment is TitleCase. Common acronyms stay uppercase when separate segments. **Do not** use CamelCase here; snake-style is the deliberate convention for these long compound names.

- ✅ `Test_Cli_Install_Core_In_Uvenv_Correctness`
- ✅ `Test_Uv_Pip_Install_Isaaclab_All_Isaacsim_Trains_Cartpole`
- ✅ `Test_Uv_Pip_Install_Isaaclab_All_Trains_Cartpole`
- ❌ `TestCliInstallCoreInUvenvCorrectness`

#### Method naming (strict)
Expand Down
Loading
Loading