Spaces:
Running on T4
Known problems
Issues encountered with the validation pipeline, the foundation specs, or the SimReady SDK that aren't bugs in this repo's code but affect the report output. Each entry: symptom β root cause β workaround / how to address β status.
When you hit a new issue, add it here. Keep the list short β fold resolved items into git history once they're fixed.
P1 β Profiles silently drop features that aren't registered
Symptom. A profile loads with far fewer features than its
profiles.toml declares. Concretely on the current foundations checkout:
| Profile | Declared in profiles.toml |
Loaded by validator | Dropped feature IDs |
|---|---|---|---|
Robot-Body-Runnable v1.0.0 |
5 | 1 | FET004_ROBOT_PHYSX v0.2.0, FET021_ROBOT_CORE_RUNNABLE v0.2.0, FET022_DRIVEN_JOINTS_PHYSX v0.1.0, FET024_BASE_ARTICULATION_PHYSX v0.1.0 |
Robot-Body-Isaac v1.0.0 |
6 | 2 | FET004_ROBOT_PHYSX v0.2.0, FET021_ROBOT_CORE_ISAAC v0.2.0, FET022_DRIVEN_JOINTS_ISAAC v0.1.0, FET024_BASE_ARTICULATION_PHYSX v0.1.0 |
Robot-Body-Neutral v1.0.0 |
5 | 3 | FET022_DRIVEN_JOINTS_NEUTRAL v0.1.0, FET024_BASE_ARTICULATION_NEUTRAL v0.1.0 |
Prop-Robotics-Neutral v2.0.0 |
6 | 5 | FET006_BASE_MDL v0.1.0 |
What's actually registered for the FET02x family (after repo usd_profiles_codegen):
fet_021_robot_corev0.2.0 (no variant suffix)fet_022_driven_jointsv0.1.0fet_023_robot_materialsv0.1.0fet_024_base_articulationv0.1.0
And for FET004/FET006 the only _BASE_NEUTRAL / _BASE_USDPREVIEW
forms are registered, not the _ROBOT_PHYSX / _BASE_MDL variants the
profiles ask for.
Root cause. Profile entries in
<foundations>/nv_core/sr_specs/docs/profiles/profiles.toml reference
variant feature IDs that the local foundations registry doesn't ship β e.g.
profiles ask for FET021_ROBOT_CORE_RUNNABLE, FET022_DRIVEN_JOINTS_PHYSX,
FET004_ROBOT_PHYSX, FET024_BASE_ARTICULATION_NEUTRAL. What is actually
registered (after repo usd_profiles_codegen runs against our checkout) is
only the unsuffixed _BASE_NEUTRAL / _BASE_USDPREVIEW / _CORE /
_BASE_ISAACSIM variants. The variant features the profiles ask for are
silently absent.
omni.asset_validator.ProfileRegistry resolves features by ID + version and
silently drops any it can't find. There's no warning emitted at profile
load time.
Verified the gap is local, not universal. Sample reports from another
SimReady environment (Fanuc content, sr9iar.usd.usd) show all five
declared Robot-Body-Runnable features actually loaded β
FET001_BASE_NEUTRAL (failed), plus FET004_ROBOT_PHYSX,
FET021_ROBOT_CORE_RUNNABLE, FET022_DRIVEN_JOINTS_PHYSX,
FET024_BASE_ARTICULATION_PHYSX, FET024_BASE_ARTICULATION_NEUTRAL
(passed). So the variants are registrable; our local codegen output
just doesn't include them.
Where the variants live. The foundation source ships JSON variant definitions next to each feature's markdown. For FET004:
docs/features/FET_004-simulate_multi_body_physics.md (md, _BASE_NEUTRAL only)
docs/features/FET_004_base_neutral-0.1.0-...json
docs/features/FET_004_base_physx-0.1.0-...json
docs/features/FET_004_base_physx-0.2.0-...json
docs/features/FET_004_robot_physx-0.1.0-...json <- this is the one profiles ask for
docs/features/FET_004_robot_physx-0.2.0-...json
Each JSON declares an id (e.g. FET004_ROBOT_PHYSX), version, path,
and a requirements list. Our repo usd_profiles_codegen run only
parses the .md files β the generated
_build/python/omni/capabilities/_features.py contains zero
_ROBOT_PHYSX / _BASE_PHYSX / _RUNNABLE entries even though the JSON
sources are right there.
How to address. Three paths, in priority order:
- Codegen β pick up the JSON variant files. The foundations
repo usd_profiles_codegentool needs to also enumerateFET_*_*-*-...jsonfiles in the features directory and emit Feature entries for each, not just theInternal IDdeclared in the.md. This closes the gap without changing source data β the variants already exist. - Validator β emit a warning when a profile entry doesn't resolve.
omni.asset_validator.ProfileRegistrysilently drops missing features. AWARNING:log at profile-load time would have made this bug visible from day one. - Documentation β once #1 lands,
repo.toml's codegen description should call out that JSON variants are part of the source of truth so downstream tooling doesn't repeat the mistake.
Open this with the SimReady foundations team
(#omni-simready / #simready-next-support); cite the discrepancy
between our local codegen output and the working Fanuc environment
sample.
In-repo workaround. The dashboard now surfaces the coverage gap
explicitly: when a profile declares more features than the validator
loaded, a banner at the top lists the missing IDs and tells the user which
ones got silently dropped. The validation result the report shows is
genuinely against the loaded feature set β running with
Robot-Body-Runnable does not check the four declared-but-missing
features.
Status. Local patch applied β see "Local patch applied" below. Upstream codegen fix still needed. Banner workaround still in place for environments without the patch.
Local patch applied
A patch lives in
plugins/simready-report/skills/simready-report/validate.py β
function _patch_register_json_variant_features(). It runs at module
load (so worker processes pick it up too) right after
import omni.asset_validator as oav. It is loud about itself: every
run prints a [PATCH P1] FeatureRegistry: +N JSON-variant feature(s) ... ProfileRegistry: rebuilt feature lists for M profile(s) ...
line so it's never invisible.
Concretely on the Yaskawa-local checkout the patch lifts:
- FeatureRegistry: 11 features β 30 features (+19 from JSON variants).
- Robot-Body-Runnable v1.0.0: 1 feature / 8 requirements β 5 / 41.
- 11 profiles got their
.featureslists rebuilt; +24 feature references appended in total.
Exactly what the patch does, step by step:
Discover variant JSON files. Globs
<foundations>/nv_core/sr_specs/docs/features/FET_*.json. The filename styles in this repo are inconsistent (FET_021-robot_core_isaac-0.1.0.json,FET_021_robot_core_runnable_0.2.0.json,FET_004_base_physx-0.2.0-simulate_multi_body_phyics.json), so we ignore the filename and read theid+versionfields from the JSON content.Build a Requirement code lookup.
r.code -> rfor everyRequirementinomni.asset_validator.RequirementsRegistry(). The JSON variants list dotted code strings like"RB.COL.003","DJ.001","BA.002"β those are looked up here.Construct a Feature-protocol object per JSON variant.
omni.asset_validator._features.Featureis atyping.Protocoldeclaringid: str, version: str, path: str, requirements: list. We use a frozen dataclass that satisfies the protocol structurally:@dataclass(frozen=True) class _PatchedFeature: id: str version: str path: str requirements: listSkip duplicates and unresolvable variants. If
FeatureRegistry.find(fid, fver)already returns something, skip (don't double-register). If any of the JSON's requirement code strings doesn't resolve in the code lookup, skip the whole feature and record it inunresolved_codes. (Currently zero unresolved on our checkout β every JSON variant's required codes exist.)Register via
FeatureRegistry().add(feat). The internalcreate_keyuses.id+.versionso our dataclass satisfies it.Re-resolve every profile's feature list β the critical step.
Profileis a frozen dataclass, so we can't reassignprofile.features. But the field is a mutable list, and the freeze only prevents field reassignment, not mutation of held collections. So for every entry inprofiles.toml's declared features that isn't already in the live profile, we look it up in the now-fullerFeatureRegistryandprofile.features.append(...)in place. Without this step the patch is invisible β adding toFeatureRegistryafter profiles are already built doesn't retroactively join existing Profile objects.
What the patch does NOT touch: foundation source files, the
codegen tool, generated _features.py, profile definitions in
profiles.toml, or any rule code. The local patch is purely in our
validation runner.
Remove the patch when: the foundation repo usd_profiles_codegen
tool is updated to enumerate JSON variant files alongside the
markdown. Once _features.py carries every variant on its own,
delete _patch_register_json_variant_features() and its call site.
P2 β Public ur10 sample asset fails current foundation specs
Symptom. Running /simready-report against the public ur10 sample
in
simready_foundations/sample_content/common_assets/robots_general/ur10/
(release 2026.04.0, commit 805d2c5) reports failures on every
variant when validated against its declared profile (or against
Robot-Body-Runnable cross-profile). Concretely, against each interface
USD's declared profile, with --use-kit so PhysX rules actually run:
| Variant interface | Declared profile | Result | Failing requirements |
|---|---|---|---|
simready_usd/ur10.usda |
Robot-Body-Neutral v1.0.0 | PASS | β |
simready_physx_usd/ur10.usda |
Robot-Body-Physx v1.0.0 | FAIL | (profile evaluates 0 features against the asset; features_summary empty in JSON output) |
simready_isaac_usd/ur10.usda |
Robot-Body-Isaac v1.0.0 | FAIL | RC.005 (VerifyRobotPhysicsAttributesSourceLayer), RC.008 (robot-type), RC.009 (root-joint-pinned), DJ.010, ISA.001 |
Under the cross-profile Robot-Body-Runnable run, Neutral and PhysX
variants additionally light up with RC.007 (robot-schema β no
IsaacRobotAPI on the default prim) because neither of those variants
applies IsaacRobotAPI, only the Isaac variant does.
Root cause. Asset-side metadata gaps and layer-organization issues
in the shipped public sample, not validator or skill code. The asset
file is tracked by Git LFS at the same OID as the release (b30f9c1bβ¦
for simready_isaac_usd/payloads/base.usda), so no in-tree edit
caused this. Each asset's customLayerData.SimReady_Metadata.validation
records validated_features against a snapshot dated 2026-01-09;
between then and the current 805d2c5 foundation specs the rules in
question were tightened (or added), so the asset that passed in
January no longer passes today. Specifically:
RC.008(robot-type) βsimready_isaac_usd/payloads/base.usdalines 81-83 declaretoken isaac:robotTypewith no value. The current rule requires a valid schema-defined token (e.g."Manipulator","End Effector"); the placeholder"Default"and the absent-value case both fail.RC.009(root-joint-pinned) β depends onisaac:robotTypeto decide whether the root joint must be pinned. The asset'sroot_jointis aPhysicsFixedJointwith emptyphysics:body0(pinned to world, correct for a Manipulator), but without a validrobotTypevalue the rule can't evaluate and fails.RC.005(VerifyRobotPhysicsAttributesSourceLayer) β physics attributes (physics:axis,physics:mass,physics:centerOfMass,physics:diagonalInertia,physics:principalAxes) on each robot link are authored in bothpayloads/base.usdaandpayloads/Physics/physics.usda. The current rule wants them in the physics payload only.- PhysX variant empty
features_summaryβ Robot-Body-Physx v1.0.0 evaluates zero features against the asset, suggesting the profile's declared feature set no longer matches what the asset has stamped (related to P1, but for a different feature family).
How to address. Asset fixes belong in
github.com/NVIDIA/simready-foundation, not here:
RC.008/RC.009β verified one-liner. Insimready_isaac_usd/payloads/base.usdaline 81, changetoken isaac:robotType (β¦)totoken isaac:robotType = "Manipulator" (β¦). Verified locally with--use-kit:- Against
Robot-Body-Isaac,FET021_ROBOT_CORE_ISAACfailing codes went from[RC.005, RC.008, RC.009]β[RC.003, RC.005](RC.008 and RC.009 cleared; RC.003 was previously cascade-suppressed and now surfaces). - Against
Robot-Body-Runnablecross-profile, the Isaac variant now PASSES (FET021_ROBOT_CORE_RUNNABLEonly requires RC.007/008/009 β all three OK onceisaac:robotTypeis set, because IsaacRobotAPI is already applied with the correct joints/links relationships and the root joint is pinned via emptyphysics:body0). Cross-profile summary moved from0 passed / 3 failedβ1 passed / 2 failed(Isaac passes, Neutral and PhysX still fail RC.007/008/009 because they don't apply IsaacRobotAPI at all).
- Against
RC.005: move everyphysics:*attribute currently authored on links inpayloads/base.usdaintopayloads/Physics/physics.usdaonly (or refactor sobase.usdacarries no physics attributes at all). This is a meaningful layer-organization change, not a one-liner. Still failing after fix 1 (88 RC.005 issues remain).RC.003(RobotNaming) β surfaced only after fix 1. The rule compares the immediate folder name (simready_isaac_usd) to the interface USD stem (ur10). Under the standard SimReady packaging convention these never match β every Isaac variant of every SimReady asset fails RC.003. Likely a rule bug (should probably look at the bundle parent, e.g.ur10/, not the variant folder) or a misalignment between rule and packaging spec. Worth raising upstream.RC.007(cross-profile only): if the intent is that the Neutral and PhysX variants should also satisfy Robot-Body-Runnable, applyIsaacRobotAPIto their default prims with the sameisaac:physics:robotJoints/robotLinksrelationships used in the Isaac variant. If the intent is that each variant only ever validates against its own declared profile, this is not needed.- PhysX empty features: align the variant USDs and Robot-Body-Physx
profile's expected feature set β likely needs the assets to carry
the variant feature IDs that the profile declares (intersect with
P1's missing-feature list once that's resolved). Also:
validate.pycurrently emits an empty.reports/<β¦>/dir when zero features match (noindex.html/results.jsonwritten). Tracked separately as avalidate.pyrobustness issue.
In-repo workaround. None β this is downstream of the validator. The
simready-report skill faithfully reports what the rules say. The
dashboard's "Failing requirements" panel surfaces the offending codes
so users can map each failure back to its requirement doc.
Status. Open against the foundations repo. Filed for tracking via
this MR; no action in simready-explorer is needed beyond surfacing
the issue here. Fix 1 above is verified to work locally (one-line
edit to base.usda) β upstream PR against NVIDIA/simready-foundation
is the right channel to land it. Fixes 2β5 still open. Re-validate
after the foundation team updates the sample assets, the rule code
(notably RC.003 RobotNaming), or relaxes the unmatched-feature
behavior.
How to file a new entry here
Use this skeleton:
## P<N> β <one-line title>
**Symptom.** What the user/reader sees that's wrong.
**Root cause.** Where the bug actually lives (which repo / file / step).
**How to address.** Concrete fix path(s), upstream or local.
**In-repo workaround.** What this repo does today to mitigate, if anything.
**Status.** Open / mitigated / fixed (link to commit).
Bump the number; don't reuse retired ones β the git history is the canonical record once an entry is resolved and removed.