Skip to content

simready-validate silently produces no verdict for .usdz and .usdc assets (extension gate in validate_asset) #25

Description

@NV-JBapst

Summary

simready-validate cannot validate .usdz or .usdc assets. It does not report an error — it prints the asset header with no verdict at all and exits 1.

$ simready-validate --rules-path nv_core/sr_specs/docs/capabilities \
    --features-path nv_core/sr_specs/docs/features \
    --profiles-path nv_core/sr_specs/docs/profiles \
    --profile Prop-Robotics-Isaac --version 1.0.0 \
    0SDU0DKMY8.usdz

Asset: 0SDU0DKMY8.usdz
$ echo $?
1

Compare a .usd asset, which prints a verdict line:

Asset: sample_content/.../sm_obs_workbench_tool_a01_01.usd
  [FAILED] Prop-Robotics-Isaac v1.0.0
           FET005_BASE_NEUTRAL: failing requirements: ['com.nvidia.simready.GSP.001']

Because the exit code is 1 and the [PASSED]/[FAILED] line is simply absent, this is indistinguishable from a genuine validation failure. A user batch-validating a directory of .usdz assets gets a non-zero exit and an empty report, with nothing indicating the assets were never opened.

Cause

simready/validate/api.py, in validate_asset():

suffix = asset_path_p.suffix.lower()
if suffix not in [".usd", ".usda"]:
    return None

None is returned with no log line. None is also the return value for "file not found", "profile not registered" and "unexpected exception", so the caller cannot tell these apart.

This excludes two standard USD formats:

  • .usdz — the packaged distribution format
  • .usdc — the binary crate format

Both open fine with Usd.Stage.Open, and both validate correctly through the public validate_stage() API. Only the extension gate in validate_asset() blocks them:

>>> sv.validate_asset(sv.AssetValidationConfig(asset_path="0SDU0DKMY8.usdz",
...                   profile_id="Prop-Robotics-Isaac", profile_version="1.0.0"))
None
>>> sv.validate_asset(sv.AssetValidationConfig(asset_path="probe.usdc", ...))
None
>>> sv.validate_stage(Usd.Stage.Open("0SDU0DKMY8.usdz"), "Prop-Robotics-Isaac", "1.0.0")
AssetValidationResult(...)   # works

The docstring does list "The file extension is not .usd or .usda" as a None condition, so the gate looks deliberate — but it conflicts with the spec this repository publishes.

Why this looks like a bug rather than a policy

  • The spec has a requirement specifically about USDZ assets: AA.OV.001 (ov-usdz-udim-limitation), "Texture UDIMs are not supported in USDZ files in NVIDIA Omniverse". A requirement that only applies to .usdz can never be evaluated, because no .usdz asset can reach the validator through the CLI.
  • NVIDIA distributes SimReady prop assets as .usdz. We validated 100 of them; every one had to be routed around the CLI via validate_stage().
  • .usdc is a core OpenUSD format with no packaging semantics at all — there is no obvious rationale for excluding it.

Suggested fix

Accept every format the USD runtime can open, and make the remaining None cases observable:

suffix = asset_path_p.suffix.lower()
if suffix not in (".usd", ".usda", ".usdc", ".usdz"):
    logger.warning("Unsupported file extension %r for %s; skipping.", suffix, asset_path_p)
    return None

A logger.warning on each early return would separately fix the silent-None ambiguity, which is the part that makes this expensive to diagnose.

Note that write_metadata=True cannot work for .usdz (the package is not writable in place), so that combination should report a clear error rather than fail quietly.

Environment

  • simready-validate 2026.6.4
  • usd-validation-nvidia 1.20.0
  • Python 3.12, Windows 11

Related

Filed separately from #24, which fixes an ISA.001 checker bug that also broke .usdz assets. That one lives in this repository; this one is in the simready-validate package, so it needs a different fix. Together they were why 100 correctly-authored .usdz assets could not be validated: the CLI never opened them, and the checker would have failed them if it had.

I'm happy to open a PR for this if the simready-validate source is accessible somewhere I can contribute to — I could not find a public repository for the package.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions