Skip to content

Fix ISA.001 to validate composition instead of the filesystem - #24

Open
NV-JBapst wants to merge 1 commit into
NVIDIA:mainfrom
NV-JBapst:fix/isa-001-usdz-composition
Open

NV-JBapst wants to merge 1 commit into
NVIDIA:mainfrom
NV-JBapst:fix/isa-001-usdz-composition

Conversation

@NV-JBapst

Copy link
Copy Markdown

Summary

The ISA.001 Isaac composition checker inspects the OS filesystem for a hardcoded set of payload filenames. As a result it fails assets that are correctly composed, including this repository's own sample prop.

Both defects are in nv_core/sr_specs/docs/capabilities/isaac_sim/composition/validation.py.

1. The payload check is filesystem-only, so every .usdz fails.
_check_payload_structure resolves Path(stage_root).parent / "payloads" and calls .exists(). A .usdz is a single package: its payloads/ layers are archive members, so there is never a sibling payloads/ directory on disk and the check fails unconditionally for packaged assets.

2. The expected filenames are the robot layout, applied to prop assets too.
The checker expects ["geometries.usd", "base.usda", "instances.usda", "materials.usda"] and a literal ./payloads/base.usda reference. That is the robot payload layout. ISA.001 is also carried by Prop-Robotics-Isaac (via FET100_BASE_ISAACSIM), and its requirement doc specifies {asset_name}_base / _meshes / _physics — so correctly-authored prop assets fail even unpacked.

Concretely, sample_content/.../obs_workbench_tool_a01/isaacsim_usd/sm_obs_workbench_tool_a01_01.usd uses payloads/obs_workbench_tool_01_{base,meshes,physics}.usd and fails ISA.001 on main today:

  [FAILED] Prop-Robotics-Isaac v1.0.0
           FET100_BASE_ISAACSIM: failing requirements: ['com.nvidia.simready.ISA.001']

What changed

Both checks are now driven by the composed stage rather than the surrounding directory listing:

  • Payload layers are detected from stage.GetUsedLayers(), unioned with the reference/payload arcs authored on the default prim. Layer identifiers cover the on-disk form (.../payloads/x_base.usd) and the packaged form (asset.usdz[payloads/x_base.usd]) alike, so packaging no longer changes the verdict. Unioning with the arcs also keeps the check correct when a stage is opened with a load rule other than LoadAll.
  • Layers are matched by role, not by exact filename. The payload stem does not have to equal the main asset file name — the sample prop above is sm_obs_workbench_tool_a01_01.usd with obs_workbench_tool_01_* payloads.
  • Both layouts ISA.001 governs are accepted: the prop layout (payloads/{asset_name}_base.usd + _meshes.usd + _physics.usd) and the robot layout used by Robot-Body-Isaac (payloads/base.usda + geometries.usd + instances.usda + materials.usda). An asset must match one of them completely; a partial structure fails and is reported against the closest layout.

composition.md is reconciled with the checker: it names the validator entry point, records that either layout satisfies the requirement, notes the stem/filename independence, and documents that .usdz delivery is validated identically.

The Meshes/Visuals invisibility check is unchanged in intent; it now runs only on scopes actually present in the composed stage, and the dead found_looks/found_meshes/found_visuals bookkeeping and unused imports were removed.

Verification

Swept every .usd/.usda under sample_content plus 100 packaged SimReady .usdz assets — 176 stages — with the checker before and after:

ISA.001 passing
before 1
after 102

Zero regressions: no asset that passed before fails now. ur10.usd, the one asset passing on main, still passes — that case is what motivated accepting both layouts rather than only the prop one.

Tests

New nv_core/sr_specs/tests/test_isaac_composition.py (10 tests, pytest nv_core/sr_specs/tests/test_isaac_composition.py) covering:

  • a packaged .usdz asset passes, and agrees with the identical unpacked tree
  • the usdz premise itself — payload layers exist only as archive members
  • the robot layout passes; a partial robot layout fails naming the missing layer
  • a flat asset with no payload structure still fails
  • kind='component' and scope-invisibility failures are still reported
  • the repository's own sample prop passes

The .usdz fixture is built at test time rather than committed: *.usdz is a Git LFS pattern here, and constructing it in the test keeps the required layout readable in review. Against the current checker 6 of the 10 tests fail; all 10 pass with this change.

Note on a related bug not fixed here

simready-validate's validate_asset() rejects any path whose extension is not .usd/.usda and returns None silently, so .usdz assets produce no verdict from the CLI at all. That lives in the simready-validate package rather than this repository, so it is out of scope for this PR, but it compounds the same problem and is worth tracking separately.

🤖 Generated with Claude Code

The Isaac composition checker inspected the OS filesystem for a hardcoded set
of payload filenames. Two consequences:

1. `_check_payload_structure` resolved `Path(stage_root).parent / "payloads"`
   and called `.exists()`. A `.usdz` is a single package whose `payloads/`
   layers are archive members, so no sibling directory is ever on disk and
   every packaged asset failed unconditionally.

2. The expected names (`geometries.usd`, `base.usda`, `instances.usda`,
   `materials.usda`, and a literal `./payloads/base.usda` reference) are the
   robot payload layout. ISA.001 is also carried by Prop-Robotics-Isaac, whose
   requirement doc specifies `{asset_name}_base/_meshes/_physics`, so
   correctly-authored prop assets failed even when unpacked. The repository's
   own sample prop, obs_workbench_tool_a01, failed its own checker.

Both checks are now driven by the composed stage: payload layers are detected
from `stage.GetUsedLayers()` unioned with the reference/payload arcs authored
on the default prim, and matched by role rather than by exact filename. Layer
identifiers cover the on-disk form and the packaged form
(`asset.usdz[payloads/asset_base.usd]`) alike, so packaging no longer changes
the verdict.

Both payload layouts ISA.001 governs are accepted -- the prop layout and the
robot layout used by Robot-Body-Isaac -- and an asset must match one of them
completely. Unioning the arcs with the used layers also keeps the check
correct when a stage is opened with a load rule other than LoadAll.

`composition.md` is reconciled with the checker: it names the validator entry
point, states that the payload stem need not equal the asset file name, records
that both layouts satisfy the requirement, and documents that `.usdz` delivery
is validated identically.

Verified over sample_content plus 100 packaged SimReady assets (176 stages):
ISA.001 passes went from 1 to 102 with no asset regressing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant