Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
ISA.001Isaac 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
.usdzfails._check_payload_structureresolvesPath(stage_root).parent / "payloads"and calls.exists(). A.usdzis a single package: itspayloads/layers are archive members, so there is never a siblingpayloads/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.usdareference. That is the robot payload layout.ISA.001is also carried byProp-Robotics-Isaac(viaFET100_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.usdusespayloads/obs_workbench_tool_01_{base,meshes,physics}.usdand failsISA.001onmaintoday:What changed
Both checks are now driven by the composed stage rather than the surrounding directory listing:
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 thanLoadAll.sm_obs_workbench_tool_a01_01.usdwithobs_workbench_tool_01_*payloads.ISA.001governs are accepted: the prop layout (payloads/{asset_name}_base.usd+_meshes.usd+_physics.usd) and the robot layout used byRobot-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.mdis 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.usdzdelivery is validated identically.The
Meshes/Visualsinvisibility check is unchanged in intent; it now runs only on scopes actually present in the composed stage, and the deadfound_looks/found_meshes/found_visualsbookkeeping and unused imports were removed.Verification
Swept every
.usd/.usdaundersample_contentplus 100 packaged SimReady.usdzassets — 176 stages — with the checker before and after:ISA.001passingZero regressions: no asset that passed before fails now.
ur10.usd, the one asset passing onmain, 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:.usdzasset passes, and agrees with the identical unpacked treekind='component'and scope-invisibility failures are still reportedThe
.usdzfixture is built at test time rather than committed:*.usdzis 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'svalidate_asset()rejects any path whose extension is not.usd/.usdaand returnsNonesilently, so.usdzassets produce no verdict from the CLI at all. That lives in thesimready-validatepackage 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