loginowskid's picture
Sync from simready-oem-library-pm@c858e9dd
cd53438 verified
# 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.