SimReady Validation Workflow#
This guide walks through validating OpenUSD assets against a SimReady profile
using the simready-validate CLI. It covers setting up your environment,
running validation against a real asset, saving results to JSON, and stamping
validation metadata into the asset.
All commands run from the repository root.
Prerequisites#
Requirement |
Minimum |
|---|---|
Python |
3.12+ |
Git LFS |
Installed and initialised ( |
1. Create a clean virtual environment#
simready-validate depends on omniverse-asset-validator and usd-core.
These packages can conflict with other USD or Omniverse installations, so
always work inside a dedicated venv.
python -m venv .venv .venv\Scripts\activate
python -m venv .venv source .venv/bin/activate
2. Install dependencies#
pip install -r nv_core/validator_sample/requirements.txt
This installs:
simready-validate— the CLI andsimready.validatePython API (pulls inomniverse-asset-validatorandusd-coreas transitive dependencies).omniverse-usd-profiles— profile definitions the validator uses to resolve feature and requirement references.
Verify the install succeeded:
simready-validate --help
3. Run validation on a sample asset#
Use the simready-validate CLI to validate the included apple asset against
the Prop-Robotics-Neutral profile:
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/profiles.toml –profile Prop-Robotics-Neutral –version 1.0.0 sample_content/common_assets/props_general/apple_a01/simready_usd/sm_apple_a01_01.usd
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/profiles.toml –profile Prop-Robotics-Neutral –version 1.0.0 sample_content/common_assets/props_general/apple_a01/simready_usd/sm_apple_a01_01.usd
What each flag does:
Flag |
Value |
Purpose |
|---|---|---|
|
|
Directory containing the rule checkers (validation.py) and requirement definitions |
|
|
Directory containing feature definitions (JSON) that group requirements into named features |
|
|
TOML file that assembles features into named profiles |
|
|
Name of the profile to validate against |
|
|
Version of the profile |
You should see output like:
Asset: sample_content/common_assets/props_general/apple_a01/simready_usd/sm_apple_a01_01.usd
[FAILED] Prop-Robotics-Neutral v1.0.0
FET006_BASE_MDL: failing requirements: ['VM.TEX.002']
FET004_BASE_NEUTRAL: failing requirements: ['RB.MB.001']
The core features — hierarchy, units, rigid-body physics, and grasp physics —
all pass. The two failures (VM.TEX.002 material texture colorspace and
RB.MB.001 multi-body) are known gaps in the sample asset and do not affect
the primary validation workflow.
Note
The production validators in nv_core/sr_specs require additional dependencies
beyond what requirements.txt provides. If you hit import errors, see
Troubleshooting below.
4. Save results to JSON#
Add --output to write a machine-readable report:
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/profiles.toml --profile Prop-Robotics-Neutral --version 1.0.0 --output results.json sample_content/common_assets/props_general/apple_a01/simready_usd/sm_apple_a01_01.usd
Open results.json to see per-requirement pass/fail details, messages, and
the prim paths that triggered each finding.
5. Stamp validation results into the asset#
The --stamp-asset-validation flag writes the validation outcome directly into
the USD file’s customLayerData:
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/profiles.toml --profile Prop-Robotics-Neutral --version 1.0.0 --stamp-asset-validation sample_content/common_assets/props_general/apple_a01/simready_usd/sm_apple_a01_01.usd
After stamping, the USD file contains metadata like:
customLayerData = {
"SimReady_Metadata" = {
"validation" = {
"profile" = "Prop-Robotics-Neutral"
"validated_features" = {
"<YYYY-MM-DD>" = {
"FET001_BASE_NEUTRAL" = {
"version" = "0.1.0"
"dependencies" = "[]"
"passed" = true
}
}
}
}
}
}
The <YYYY-MM-DD> key (e.g. 2026-05-12) records when the stamp was written.
Running the command again on a later date appends a new entry, preserving the
full validation history. Downstream tools — renderers, simulation pipelines,
asset browsers — can read this metadata without re-running validation.
6. Understanding the validator (sample project)#
To understand how rules, features, and profiles fit together, explore the
minimal sample project in nv_core/validator_sample/. It contains a single
requirement, feature, and profile you can read end-to-end:
validator_sample/
├── requirements.txt
├── sample_assets/
│ ├── sample1.usda # passes SAMP.001 (defaultPrim = "Foo")
│ └── sample_fail.usda # fails SAMP.001 (defaultPrim = "NotFoo")
├── sample_features/
│ └── feat_1_properly_named.json
├── sample_profiles/
│ └── profiles.toml
└── sample_requirements/
├── __init__.py
├── capability-sample.md
├── requirement-name.md
└── rule_name_checker.py
Component |
Role |
|---|---|
|
Defines capability |
|
Declares feature |
|
Defines |
|
A valid USDA — its default prim is |
|
An invalid USDA — its default prim is |
You can run the sample project from nv_core/validator_sample/ to see a
controlled pass/fail cycle:
cd nv_core/validator_sample
# Passing — sample1.usda has defaultPrim = "Foo"
simready-validate --rules-path sample_requirements --features-path sample_features --profiles-path sample_profiles/profiles.toml --profile Sample-Profile --version 1.0.0 sample_assets/sample1.usda
# Failing — sample_fail.usda has defaultPrim = "NotFoo"
simready-validate --rules-path sample_requirements --features-path sample_features --profiles-path sample_profiles/profiles.toml --profile Sample-Profile --version 1.0.0 sample_assets/sample_fail.usda
The failing run reports Root prim must be named 'Foo'. and exits with a
non-zero code. See the
SimReady Learning Workflow for a deeper dive
into writing your own requirements, rules, and features.
Troubleshooting#
simready-validate command not found#
The CLI entry point is installed by the simready-validate pip package. If the
command is missing:
Make sure the venv is activated.
Run
pip install -r nv_core/validator_sample/requirements.txtagain.On Windows, try
python -m simready.validateas a fallback.
Git LFS pointer files#
If USD files are tiny text files starting with
version https://git-lfs.github.com/spec/v1, LFS pointers were not resolved:
git lfs install
git lfs pull