Skip to content

NP.008 false-positive on idiomatic system-MDL references (@OmniPBR.mdl@) #33

Description

@l-tschreiber-a11y

Summary

NP.008 (all asset paths must resolve to an existing file) flags material
bindings that reference NVIDIA's OmniPBR shader via the standard idiom
info:mdl:sourceAsset = @OmniPBR.mdl@. Because OmniPBR is a system MDL module
resolved through MDL search paths rather than USD asset resolution, the rule
reports it as unresolvable even though the material renders correctly. This makes
it effectively impossible to use OmniPBR.mdl the way it is intended to be used
without working around the validator.

Steps to reproduce

  1. Author a USD material whose shader binds a system MDL by bare name:

    def Shader "Shader"
    {
        uniform token info:implementationSource = "sourceAsset"
        uniform asset info:mdl:sourceAsset = @OmniPBR.mdl@
        uniform token info:mdl:sourceAsset:subIdentifier = "OmniPBR"
        color3f inputs:diffuse_color_constant = (0.7, 0.7, 0.7)
        float inputs:reflection_roughness_constant = 0.5
        float inputs:metallic_constant = 0
        token outputs:out
    }
    
  2. Run simready-validate on the asset with any profile whose materials feature
    includes NP.008.

Expected

NP.008 should recognise bare system-MDL names (e.g. @OmniPBR.mdl@ and other
core ::nvidia::* / Kit-shipped MDL modules) as valid references resolved via
MDL search paths, and not report them as unresolvable asset paths.

Actual

NP.008 reports the reference as unresolvable — even under a full Isaac / Kit
runtime where the material renders correctly.

Why this looks like a false positive

@OmniPBR.mdl@ is a bare system-MDL name, not a USD asset path. OmniPBR is a
core MDL module that ships inside Kit / Isaac Sim and is resolved at render time
through MDL search paths, not through USD asset resolution. This bare form is the
canonical way to reference OmniPBR.

NP.008 only resolves @...@ references as on-disk USD asset paths, so it
validates a USD asset path against something that was never meant to be one. The
rule does not appear to account for system MDL modules.

Impact / workarounds (both undesirable)

  • Vendor a copy of OmniPBR.mdl alongside the asset so the bare name anchors
    to an on-disk file. This duplicates a file that already ships with every Isaac
    Sim / Kit install, and the copy silently goes stale when the shader is revised.
  • Reference the installed file by path — not viable; system MDLs live under
    Kit's install dir (varies by machine/version) and are absent from a plain-PyPI
    validation environment, which is exactly why NP.008 fires.

Both push authors toward duplication in order to use a shader that is meant to be
referenced by name.

Suggested fix

Have NP.008 treat bare system-MDL module names as valid — e.g. maintain an
allowlist of Kit-shipped MDL modules (OmniPBR.mdl, OmniGlass.mdl, and the
::nvidia::* core modules), or skip resolution for references that carry
info:mdl:sourceAsset with a bare (non-path) name and a subIdentifier.

Environment

  • simready-validate version: 2026.7.1 (public PyPI)
  • simready-foundation ref: v2026.07.1
  • Profile / version: Robot-Gripper v2.1.0
  • Supporting pins: usd-core==26.8, omniverse-asset-validator==1.18.0,
    omniverse-usd-profiles==1.11.2, usd-validation-nvidia==1.22.0,
    numpy==2.5.1
  • Python 3.12, plain-PyPI environment (no Kit/Isaac runtime)

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