SimReady Foundation PyPI Packages#
About This Guide#
SimReady Foundation tier packages let you install the requirements, capabilities, features, profiles, and validation rules required for a specific runtime or use case. They also let you add organization-specific content without modifying or repackaging the Foundation source. This guide explains how to install Foundation tiers, use them to validate assets, and create a new tier that depends on and extends an existing tier.
This guide is intended for:
Asset pipeline users and validation engineers who need to install Foundation content and validate assets with
simready-validate.Python developers and validation framework developers who need to package and distribute additional requirements, capabilities, features, profiles, and validation rules.
This guide assumes you are familiar with the SimReady Foundation model of requirements, capabilities, features, and profiles. If these concepts are new to you, SimReady Foundation provides an introduction. The installation and validation sections assume you are familiar with command-line tools and pip. The tier-authoring sections also assume you are familiar with Python package development, pyproject.toml, package entry points, and SimReady validation rule checkers.
Background: What Is a Tier?#
The Foundation spec is organized into tiers: separately publishable Python packages, each owning a coherent slice of capabilities, features, and profiles. Tiers can form dependency relationships. A tier that depends on another tier is the downstream tier; the tier it depends on is the upstream tier. The downstream tier declares the upstream tier as a pip dependency and adds its own content without modifying the upstream package. For example, a custom my-simready-tier that adds organization-specific rules would be downstream of simready-foundation-tier-core.
This section covers what a tier is well enough to follow the rest of this guide. For why the specification is divided this way, what tier ownership tells you about a profile, and how tiers differ from compatibility tiers and maturity levels, see SimReady Foundation Tiers.
Before tier packages, validation content was loaded from shared capabilities, features, and profiles directories under nv_core/sr_specs/docs/. The tier structure packages corresponding content in self-contained Python package subtrees under nv_core/tiers/. During wheel builds, shared tooling generates each tier’s requirements-enum module and embeds it in the wheel.
The SimReady Foundation repository organizes tier package sources as follows.
nv_core/tiers/
|-- _tooling/
`-- simready_foundation_tier_core/
|-- pyproject.toml
`-- simready/foundation/tier_core/
|-- capabilities/
|-- features/
`-- profiles/
Additional tiers are siblings of simready_foundation_tier_core/ with the same internal shape, each in its own simready/foundation/<tier>/ package.
Foundation runtime tests live in their owning tier package beside the tier’s catalogs. The descriptor advertises their package directory without importing it. Validator-only installs therefore remain lightweight, while a tier’s optional dependency extra installs the Benchmark and engine dependencies needed to execute those bundled tests.
Note
This layout illustrates the SimReady Foundation repository; it does not prescribe the source layout for third-party tiers. A third-party tier must provide the entry points, plugin, and tier descriptor described later in this guide. If it uses the generic descriptor, it also needs capabilities/, features/, and profiles/ directories under its package. Repository directories and Python modules use underscores; PyPI distribution names use hyphens.
The Foundation currently publishes a single tier:
Package |
Contents |
Depends on |
|---|---|---|
Core, Hierarchy, Visualization, Physics Bodies, Isaac Sim, Non-Visual Sensors, Semantic Labels, Dataset Taxonomies, and Packaging capabilities; the neutral, PhysX, and Isaac prop profiles, the robot and gripper profiles, the package profiles, and the Open Taxonomy profiles |
Prerequisites#
This guide requires Python 3.11 or 3.12.
Installation#
First, install or upgrade simready-validate. Then install simready-foundation-tier-core, which provides the core, neutral, PhysX, Isaac Sim, and package content.
Important
Foundation releases use a major.minor product version; the Python
distribution prefixes it with the release year (Foundation 7.1 is
2026.7.1). Major and minor Foundation releases are not backward-compatible
with older Foundation releases. When following these 7.1 docs, install the
7.1 core tier and use validator, Benchmark, and packaging tool versions that
support Foundation 7.1. Do not combine 7.1 tier content with requirements,
features, profiles, custom tiers, or validation stamps from 7.0 or earlier.
Migrate older assets and custom tiers as needed, then validate them again
against a 7.1 profile.
Foundation 7.1 Library Set#
The SimReady libraries use independent release numbers. The supported 7.1 set is:
Library |
Foundation 7.1 version |
When it is needed |
|---|---|---|
|
|
Always. Supplies the 7.1 requirements, features, profiles, validators, and bundled runtime tests. |
|
|
Static validation and the |
|
|
Runtime and behavioral tests in Kit or Isaac Sim. Installed by the core tier’s |
|
|
Package creation and pre/post validation. Use |
The tier and tool version numbers are intentionally different; do not replace
the tool versions above with 2026.7.1. Pip resolves supporting libraries such
as usd-validation-nvidia>=1.20.0, usd-core>=23.5 for Benchmark, and numpy
through these direct dependencies. Install those transitive libraries manually
only when developing or diagnosing the Foundation itself.
Note
The Isaac Sim capabilities, features, and profiles used to ship in a separate simready-foundation-tier-isaac package. They are now part of simready-foundation-tier-core, and the Isaac package is no longer published. If you have it installed, run pip uninstall simready-foundation-tier-isaac before upgrading: leaving both in one environment registers the Isaac requirement IDs twice.
Public PyPI#
For static validation, install the 7.1 tier and its compatible validator:
pip install "simready-foundation-tier-core==2026.7.1" "simready-validate>=2026.7.0.dev1"
To install the core tier together with Benchmark, its Kit engine, and the published Foundation runtime tests:
pip install "simready-foundation-tier-core[benchmark]==2026.7.1" "simready-validate>=2026.7.0.dev1"
Add packaging support when required:
pip install "simready-package>=2026.6.0a1"
# Include the publish extra only for WRAPP publishing.
pip install "simready-package[publish]>=2026.6.0a1"
NVIDIA Internal Artifactory#
Confirm the internal index URL and authentication requirements for your environment before running these commands. The package names and version constraints are the same as for public PyPI.
pip install "simready-foundation-tier-core==2026.7.1" "simready-validate>=2026.7.0.dev1"
For the complete Benchmark environment:
pip install "simready-foundation-tier-core[benchmark]==2026.7.1" "simready-validate>=2026.7.0.dev1"
For packaging, add:
pip install "simready-package>=2026.6.0a1"
# Include the publish extra only for WRAPP publishing.
pip install "simready-package[publish]>=2026.6.0a1"
How Tier Discovery Works#
Each tier wheel contributes one entry point to each of two entry-point groups. A group can contain entry points from multiple installed packages:
usd_validation_nvidia: the asset validator (simready-validate) uses this group to auto-discover and load the tier’s validation rules and requirement enums at startup.simready.tier: the SimReady loader uses this group to enumerate all installed tiers and register their content in a single phased pass across all tiers: requirements and rules, then features, then profiles. Cross-tier references resolve regardless of install order.
These entry points let consumers discover a tier’s validators and content from the installed wheel instead of requiring manually supplied content paths.
An installed tier may expose runtime_tests_path on its simready.tier
descriptor. Benchmark reads that path alongside the tier’s specification
catalogs, so their versions cannot drift. Independent test-only distributions
may still use the simready_benchmark.tests entry-point group. Explicit
Benchmark --tests-path arguments are additive and remain available for
unpublished tests under local development.
simready.validate supports both content sources. When you call initialize() with filesystem paths, it loads content from local Foundation directories. When you call initialize() without filesystem paths, it discovers and registers installed tier wheels.
The following sequence shows how an installed tier participates in validation.
sequenceDiagram
participant User
participant pip
participant CLI as simready-validate
participant Plugin as usd_validation_nvidia
participant TierEP as simready.tier
participant Wheel as Tier wheel
User->>pip: pip install simready-foundation-tier-core
pip->>Wheel: install wheel and register entry points
User->>CLI: simready-validate --profile X --version Y asset.usd
CLI->>Plugin: discover SimReadyPlugin
Plugin->>Wheel: on_startup()
Wheel->>Wheel: import capabilities and register rules
CLI->>TierEP: discover tier descriptor
TierEP->>Wheel: resolve TierContent
Wheel-->>CLI: content paths and requirements module
CLI->>CLI: load profile, features, and requirements
CLI->>CLI: run registered rule checkers
CLI-->>User: validation results
Verifying the Install#
After installing the tier, confirm that its entry points are registered:
from importlib.metadata import entry_points
tiers = entry_points(group="simready.tier")
print([ep.name for ep in tiers])
For example, after installing the core tier, the output includes tier_core.
Validating an Asset#
Validate an asset to determine whether it conforms to the contract defined by a selected profile. simready-validate loads the profile and its associated features, requirements, and rules from the installed tiers, runs the rule checkers against the asset, and reports the results.
To validate an asset, pass a profile, its version, and the asset path. Because the installed tiers supply the rules, features, and profiles, you do not need the --rules-path, --features-path, or --profiles-path flags:
simready-validate --profile Prop-Robotics-Neutral --version 1.0.0 path/to/asset.usd
Or from Python:
Call initialize() with empty path lists to trigger entry-point-based discovery of installed tiers. Then create an AssetValidationConfig that identifies the asset and the profile version to validate against, and pass it to validate_asset. The function returns one aggregate result for that asset and profile.
import simready.validate as sv
sv.initialize(rules_and_requirements_paths=[], features_paths=[], profiles_paths=[])
result = sv.validate_asset(
sv.AssetValidationConfig(
asset_path="path/to/asset.usd",
profile_id="Prop-Robotics-Neutral",
profile_version="1.0.0",
)
)
print(result)
For either method, review the output and verify that the validation results match the expected conformance of the asset.
Creating Your Own Tier#
A tier is an ordinary Python package. For example, if you want to distribute organization-specific validation rules and profiles while reusing Foundation content from the core tier, create your own tier. The steps below outline the package metadata and Python scaffolding for a tier that depends on simready-foundation-tier-core and adds a custom validation rule. They do not create a complete installable tier.
1. Declare the Package#
In the root directory of your tier package, create a pyproject.toml file. Declare simready-foundation-tier-core as a dependency and register both entry points:
[project]
name = "my-simready-tier"
version = "0.1.0"
requires-python = ">=3.11,<3.13"
dependencies = [
"usd-validation-nvidia>=1.19.3",
"simready-foundation-tier-core",
]
[project.entry-points."usd_validation_nvidia"]
my-tier-validate = "my_org.simready.tier_foo:SimReadyPlugin"
[project.entry-points."simready.tier"]
tier_foo = "my_org.simready.tier_foo:tier"
Note
The path in [tool.hatch.build.hooks.custom] assumes the tier lives alongside the Foundation tiers under nv_core/tiers/. If you are building outside the Foundation repository, copy build_hook.py from nv_core/tiers/_tooling/ into your tier structure and adjust path accordingly.
Then add the Hatchling build configuration:
[tool.hatch.build.hooks.custom]
path = "../_tooling/build_hook.py"
module = "my_org.simready.tier_foo"
reverse_domain = "com.myorg.simready"
[tool.hatch.build.targets.wheel]
packages = ["my_org"]
[tool.hatch.build.targets.wheel.force-include]
"_build/python/my_org/simready/tier_foo/requirements" = "my_org/simready/tier_foo/requirements"
[build-system]
requires = ["hatchling", "usd-profiles-nvidia"]
build-backend = "hatchling.build"
2. Implement the Plugin#
The asset validator discovers SimReadyPlugin through the tier’s usd_validation_nvidia entry point and calls its startup and shutdown methods. Each tier must provide and export this class; the validator does not supply a default. For a conventional tier, you can use the generic implementation below without modification.
The on_startup method imports the tier’s capabilities package, which registers its validators through decorator side effects. The on_shutdown method does nothing because the loader manages registry cleanup.
# my_org/simready/tier_foo/_plugin.py
from __future__ import annotations
class SimReadyPlugin:
def on_startup(self) -> None:
from . import capabilities # noqa: F401
def on_shutdown(self) -> None:
pass
The package initializer re-exports SimReadyPlugin and tier so that the two entry points declared in pyproject.toml can resolve those names from the package.
# my_org/simready/tier_foo/__init__.py
from ._plugin import SimReadyPlugin
from ._tier import tier
__all__ = ["SimReadyPlugin", "tier"]
3. Expose the Tier Descriptor#
The tier object is discovered through the simready.tier entry point and tells SimReady consumers where to find the tier’s content. TierContent records the tier name, importable validator package, generated requirements module, bundled paths for capabilities and requirements, features, and profiles, plus an optional runtime-test container. The generic descriptor derives the tier name and module from its package, so a conventional tier can use it without modification.
# my_org/simready/tier_foo/_tier.py
from __future__ import annotations
from dataclasses import dataclass
from pathlib import Path
_PKG_ROOT = Path(__file__).resolve().parent
_MODULE = __package__ or _PKG_ROOT.name
_NAME = _MODULE.rsplit(".", 1)[-1]
@dataclass(frozen=True)
class TierContent:
name: str
rules_package: str
requirements_module: str
rules_and_requirements_path: Path
features_path: Path
profiles_path: Path
runtime_tests_path: Path | None = None
tier = TierContent(
name=_NAME,
rules_package=f"{_MODULE}.capabilities",
requirements_module=f"{_MODULE}.requirements",
rules_and_requirements_path=_PKG_ROOT / "capabilities",
features_path=_PKG_ROOT / "features",
profiles_path=_PKG_ROOT / "profiles",
runtime_tests_path=None,
)
runtime_tests_path identifies one importable Benchmark test package directly.
A tier with no bundled runtime tests must leave the field as None, as in this
generic example. A tier that bundles a test package in the same wheel may set
the field to that package directory, but it must verify that the source project
or installed distribution owns both the tier descriptor and the test package.
Do not derive it with a fixed parents[N] path: that can advertise a similarly
named package owned by another installed distribution. The core tier’s
_tier.py is the reference ownership-checked implementation. Descriptor
resolution only returns the path; it must not import the test package or its
engine dependencies.
4. Add a Requirement, Feature, and Profile#
The recommended way to extend the Foundation is to define new requirements, features, and profiles that are owned entirely by your tier. Do not import requirements from another tier’s module or use override=True on another tier’s requirements.
The example below adds a new requirement FOO.001, a rule checker that validates it, a feature that includes it, and a profile that references that feature. This pattern mirrors how the core tier’s isaac_sim/composition capability adds ISA.001.
Define the requirement
Create a markdown file under your tier’s capabilities/ tree:
<!-- my_org/simready/tier_foo/capabilities/my_capability/requirements/foo-001.md -->
# my-capability
| Code | FOO.001 |
|------|---------|
| Tags | {tag}`essential` |
## Summary
Assets must satisfy the organization-specific constraint described here.
Write the rule checker
# my_org/simready/tier_foo/capabilities/my_capability/validation.py
import my_org.simready.tier_foo.requirements as cap
import usd_validation_nvidia
from pxr import Usd
@usd_validation_nvidia.register_rule("MyCapability")
@usd_validation_nvidia.register_requirements(cap.MyCapabilityRequirements.FOO_001, override=True)
class MyCapabilityChecker(usd_validation_nvidia.BaseRuleChecker):
def CheckStage(self, stage: Usd.Stage) -> None:
...
Import the rule in the capabilities package
# my_org/simready/tier_foo/capabilities/__init__.py
from .my_capability import validation
Define a feature
{
"id": "FET200_MY_FEATURE",
"version": "0.1.0",
"display_name": "My Feature",
"dependencies": [
{"FET001_BASE_NEUTRAL": {"version": "0.1.0"}}
],
"requirements": ["FOO.001"]
}
Add a profile
[My-Profile]
"1.0.0" = {features = [
{"FET200_MY_FEATURE" = {version = "0.1.0"}},
]}
For a complete worked example, refer to nv_core/tiers/simready_foundation_tier_core/.
5. Install and Validate#
Before running these commands, add your tier’s requirements, feature definitions, and a profile named My-Profile. The preceding steps do not create this content.
Build the tier wheel using one of the following methods. After either method, continue with install and validate.
In the Foundation repository
If your tier lives alongside the Foundation tiers under nv_core/tiers/, add its directory to the members list in nv_core/tiers/pyproject.toml, which is the uv workspace root for the tiers:
[tool.uv.workspace]
members = [
"simready_foundation_tier_core",
"my-simready-tier",
]
Then run:
python _tooling/build_tiers.py
build_tiers.py generates the requirements-enum module for every workspace member and writes the wheels to the shared nv_core/tiers/_build/dist/. It requires uv on your PATH.
Outside the Foundation repository
If your tier lives outside the Foundation repository, complete the following steps:
Copy
build_hook.pyfromnv_core/tiers/_tooling/into your tier structure.Adjust the Hatchling
pathinpyproject.tomlto the copied file.Run
uv build --wheel.
Install and validate
Regardless of where your tier lives, install the built wheel and validate an asset. In the Foundation repository the wheel is in the shared nv_core/tiers/_build/dist/; outside it, uv build --wheel writes to your tier’s own dist/.
pip install simready-validate simready-foundation-tier-core <dist-dir>/my_simready_tier-*.whl
simready-validate --profile My-Profile --version 1.0.0 path/to/asset.usd
These commands install the core tier and your custom tier in the same environment. simready-validate loads both tiers and runs their registered rules in one validation pass.