Spaces:
Running on T4
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_core` v0.2.0 (no variant suffix) | |
| - `fet_022_driven_joints` v0.1.0 | |
| - `fet_023_robot_materials` v0.1.0 | |
| - `fet_024_base_articulation` v0.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: | |
| 1. **Codegen β pick up the JSON variant files.** The foundations | |
| `repo usd_profiles_codegen` tool needs to also enumerate | |
| `FET_*_*-*-...json` files in the features directory and emit Feature | |
| entries for each, not just the `Internal ID` declared in the `.md`. | |
| This closes the gap without changing source data β the variants | |
| already exist. | |
| 2. **Validator β emit a warning when a profile entry doesn't resolve.** | |
| `omni.asset_validator.ProfileRegistry` silently drops missing | |
| features. A `WARNING:` log at profile-load time would have made this | |
| bug visible from day one. | |
| 3. **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 `.features` lists rebuilt; +24 feature | |
| references appended in total. | |
| **Exactly what the patch does**, step by step: | |
| 1. **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 the `id` + `version` fields from the | |
| JSON content. | |
| 2. **Build a Requirement code lookup.** `r.code -> r` for every | |
| `Requirement` in `omni.asset_validator.RequirementsRegistry()`. | |
| The JSON variants list dotted code strings like `"RB.COL.003"`, | |
| `"DJ.001"`, `"BA.002"` β those are looked up here. | |
| 3. **Construct a Feature-protocol object per JSON variant.** | |
| `omni.asset_validator._features.Feature` is a `typing.Protocol` | |
| declaring `id: str, version: str, path: str, requirements: list`. | |
| We use a frozen dataclass that satisfies the protocol structurally: | |
| ```python | |
| @dataclass(frozen=True) | |
| class _PatchedFeature: | |
| id: str | |
| version: str | |
| path: str | |
| requirements: list | |
| ``` | |
| 4. **Skip 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 in `unresolved_codes`. (Currently zero unresolved on | |
| our checkout β every JSON variant's required codes exist.) | |
| 5. **Register via `FeatureRegistry().add(feat)`.** The internal | |
| `create_key` uses `.id` + `.version` so our dataclass satisfies it. | |
| 6. **Re-resolve every profile's feature list β the critical step.** | |
| `Profile` is a frozen dataclass, so we can't reassign | |
| `profile.features`. But the field is a *mutable list*, and the | |
| freeze only prevents field reassignment, not mutation of held | |
| collections. So for every entry in `profiles.toml`'s declared | |
| features that isn't already in the live profile, we look it up in | |
| the now-fuller `FeatureRegistry` and `profile.features.append(...)` | |
| in place. **Without this step the patch is invisible** β adding to | |
| `FeatureRegistry` after 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.usda` | |
| lines 81-83 declare `token isaac:robotType` with **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 on `isaac:robotType` | |
| to decide whether the root joint must be pinned. The asset's | |
| `root_joint` *is* a `PhysicsFixedJoint` with empty `physics:body0` | |
| (pinned to world, correct for a Manipulator), but without a valid | |
| `robotType` value 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 *both* `payloads/base.usda` and | |
| `payloads/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: | |
| 1. **`RC.008`/`RC.009`** β *verified one-liner*. In | |
| `simready_isaac_usd/payloads/base.usda` line 81, change | |
| `token isaac:robotType (β¦)` to | |
| `token isaac:robotType = "Manipulator" (β¦)`. Verified locally with | |
| `--use-kit`: | |
| - Against `Robot-Body-Isaac`, `FET021_ROBOT_CORE_ISAAC` failing | |
| 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-Runnable` cross-profile, the **Isaac variant | |
| now PASSES** (`FET021_ROBOT_CORE_RUNNABLE` only requires | |
| RC.007/008/009 β all three OK once `isaac:robotType` is set, | |
| because IsaacRobotAPI is already applied with the correct | |
| joints/links relationships and the root joint is pinned via | |
| empty `physics:body0`). Cross-profile summary moved from | |
| `0 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). | |
| 2. **`RC.005`**: move every `physics:*` attribute currently authored | |
| on links in `payloads/base.usda` into `payloads/Physics/physics.usda` | |
| only (or refactor so `base.usda` carries 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). | |
| 3. **`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. | |
| 4. **`RC.007` (cross-profile only)**: if the intent is that the | |
| Neutral and PhysX variants should also satisfy Robot-Body-Runnable, | |
| apply `IsaacRobotAPI` to their default prims with the same | |
| `isaac:physics:robotJoints`/`robotLinks` relationships used in the | |
| Isaac variant. If the intent is that each variant only ever | |
| validates against its own declared profile, this is not needed. | |
| 5. **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.py` | |
| currently emits an empty `.reports/<β¦>/` dir when zero features | |
| match (no `index.html` / `results.json` written). Tracked | |
| separately as a `validate.py` robustness 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. | |