Spaces:
Running on T4
Running on T4
File size: 16,211 Bytes
cd53438 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | # 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.
|