mcpField
I
isaac-sim-validator

isaac-sim-validator

github.com/isaac-simTesting & quality4.4k48 installsUpdated 5d ago
Repository

About isaac-sim-validator

isaac-sim-validator is a skill for checking Isaac Sim libraries, Kit scripts, scenes, renders, training outputs, and delivery assets. It combines static checks with an opt-in runtime level that executes scripts using the caller’s privileges.

Key features

  1. 01Static checks for levels 1–2
  2. 02Opt-in script execution at level 3
  3. 03Kit simulation and render checks
  4. 04USD articulation and file checks
  5. 05RL output and asset checks

Use cases

  1. 01Reviewing an Isaac Sim script before delivery
  2. 02Checking a render for lighting or image defects
  3. 03Validating robot USD articulation structure
  4. 04Inspecting RL training artifacts and metrics

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/isaac-sim/isaacsim --skill isaac-sim-validator

After installing, type/isaac-sim-validatorin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
feedback-log.md
quality-criteria.md
scripts/
validate_sim.sh

Details

From the project README

Isaac Sim Validator

WARNING: Level 3 executes the target script with your full user privileges. There is no container or sandbox isolation. Only use --confirm-execute on scripts you fully trust.

Purpose

Reject common delivery defects at the owning boundary: standalone library or Kit application/extension.

Levels 1–2 are static checks only. Level 3 runs the target Python script under timeout with the calling user's privileges. Level 3 requires an explicit --confirm-execute (or CONFIRM_EXECUTE=1) opt-in; it is not a sandbox.

Prerequisites

  • Standalone libraries need their configured build or installed test environment.
  • Kit checks need a built Isaac Sim tree; a GPU is required only for GPU-backed checks.

Limitations

  • Levels 1–2 cannot prove runtime correctness for every workload.
  • Level 3 executes untrusted script content only after --confirm-execute; there is no container/firejail isolation.
  • Thresholds target common demo/SDG failures, not all product features.

Troubleshooting

Error / symptomCauseSolution
Kit extension not foundWrong $ISAAC_SIM_DIR or stale buildPoint env vars at _build/linux-x86_64/release or rebuild
Black or empty framesMissing lights or non-RTX render modeAdd dome/key light; confirm RTX / PathTracing settings
Hang on stage load or first renderMDL compile or oversized stageFollow isolation steps in isaac-sim-troubleshooting

Final gate before delivery. Reject outputs that fail the checks below; do not soften results.

For a standalone library, validate a normal-process public import, declared package/native closure, relocation, SDK consumer when applicable, and isaacsim.common.logging.Logger diagnostics. Do not require SimulationApp, rendering, or a GPU.

Kit-only validation helper

ScriptPurposeArguments
scripts/validate_sim.shValidate simpositional args per script header (see script)

Running scripts

From agent runtimes that expose skill execution helpers, invoke helpers with run_script():

run_script("scripts/validate_sim.sh", args=[])

From a built Isaac Sim tree, run the same file with ./python.sh (Linux) or python.bat (Windows) from _build/*/release, or execute shell helpers directly when they do not require the simulator.

Kit simulation checklist

CheckPassOn fail
Script pathexists, readablereject: Script path invalid: <path>
File size> 1 KBreject: Script empty or corrupted
isaacsim importuses isaacsim.*, not omni.isaac.corereject: Use isaacsim.* namespace; omni.isaac.core is deprecated
SimulationApp configexplicit width and heightreject: SimulationApp without window args causes swapchain-capture size mismatch
Lights presentDomeLight (intensity >= 100) and DistantLight (>= 500)reject: No lighting; render will be black
Render modeRayTracedLighting for iteration; PathTracing only for hero shotsreject: PathTracing too slow for iteration; use RayTracedLighting
ACES tonemapcarb rtx.post.tonemap.op = 4; filmIso 200 default / 600 deep-aisle / 400 aerialsuggest: Enable ACES (op=4) for contrast
Final render>= 150 KB and mean_RGB > 30reject: Render is black or low-energy; check lighting
User pathsno /home/<user>/, hardcoded C:\path\to\..., or per-agent home paths; prefer %USERPROFILE%, env vars, or argparsereject: Hardcoded user path; use $ISAAC_SIM_DIR, $ISAAC_LAB_DIR, $WORKSPACE_DIR, or argparse
Network endpointsno bare IPs (192.168.x.x, 10.x.x.x) or non-localhost hostsreject: Hardcoded endpoint; parameterize via env var or config
Output dirconfigurable (env var, CLI, or function param)reject: Output dir hardcoded; accept as parameter or read $OUTPUT_DIR
VRAM headroomnvidia-smi headroom > 20% after settlewarn at >90% utilization; likely leak or scale issue
pkill -f "kit/kit" usedflag for kill+relaunch bugwarn: Verify zero kit processes before next launch
Sim duration>= 3 s of physicsreject: Sim ran < 3 s; physics has not settled

File structure validation (USD scenes)

ItemValidInvalidAction
$ISAAC_LAB_DIR/scripts/read-only referencewriting outputs thereredirect to $OUTPUT_DIR or $WORKSPACE_DIR/outputs/
get_assets_root_path() -> s3://...runtime OKbaked into delivered outputcache locally; reference via configurable path
Melting / Splat MDL-only shadersOK in raw formMDL-only at exportfilter out; MDL-only causes black render
MakeInstanceable for RLrequired (make_instanceable: true)absentreject
usdPreviewSurface on surfacesrequiredabsentreject; suggest adding UsdPreviewSurface
convex_decompose_meshfalse (with clean_sdf_dc)truerecommend false for stability
mpu=0.01OK for warehouse shell (13 m tiles)on a robotreject

Render validation (frame analysis)

MetricGoodBadAction
File size1–4 MB~82 KB82 KB = black, reject
Mean RGB80–160< 20reject: Too dark; add lights
Max RGB200–2500reject: No light in scene
Pixel variance> 15< 5flat = missing shadows; add accents
Color histogrammulti-modalsingle peakoverexposed or flat lighting; adjust intensity
Object visibility>= 3 robots or 50+ assets< 10 visiblesuggest: Scene too sparse; add set dressing
Shadow consistencyconsistent shadowsrandom black blobsreject: Shadow artifacts; check light cone bounds

Video validation

For any delivered MP4/GIF, extract and inspect at least start/middle/end frames. Reject or recut the presentation copy if the first frames show render warm-up, the subject is occluded, or the camera loses the task. Keep the complete source render and metrics when a shorter presentation cut is made.

RL training validation

IssueAction
AppLauncher not firstreject: AppLauncher must precede any isaaclab imports
Task __init__.py non-emptyreject: Task __init__.py must be empty; do not import configs
omni.isaac.lab importreject: Use isaaclab.*; omni.isaac.lab is deprecated
PhysX backend (when Newton applies)reject: Use Newton; it is the default on Kit 110
Missing PYTHONUNBUFFERED=1warn: Set PYTHONUNBUFFERED=1 to see logs in real time
No GPU memory loggingsuggest: Log torch.cuda.memory_allocated()/1e6 to W&B
Batch size exceeds VRAMsuggest: Reduce num_envs (try 2048)
Wrong checkpoint namereject: Must be model_XXXX.zip, not policy.pt
Single seedsuggest: Run seeds 42, 123, 456 for valid comparison

Asset & shell validation

InputCheckAction
docker run command-v mount for /workspace/outputreject: Output folder not mounted
Sub-agent spawnworkdir=$WORKSPACE_DIRreject: Sub-agent workdir hardcoded; use $WORKSPACE_DIR
Blender USD exportcorrect mpu, dual-shader (UsdPreviewSurface + MDL), correct export typereject if any missing
Scene complexityrenders within 10 settle stepsreject: Scene too complex; simplify assets
Ghost artifactscleanup of /dev/shm/carb-*reject: Use workspace_cleanup.py to clear /dev/shm/carb-*

Kit decision tree

graph TD
    A[Received Output] --> B{Has script?}
    B -->|No| C[Reject: "No script provided"]
    B -->|Yes| D{File size >1KB?}
    D -->|No| E[Reject: "Script empty or corrupted"]
    D -->|Yes| F{Python?}
    F -->|Yes| G{isaacsim.* imports?}
    G -->|No| H[Reject: "Use isaacsim.* not omni.isaac.core"]
    G -->|Yes| I{SimulationApp or --exec?}
    I -->|Neither| J[Reject: "Must use SimulationApp with window args OR isaac-sim.sh --exec"]
    I -->|SimulationApp| K{width and height set?}
    K -->|No| L[Reject: "SimulationApp requires explicit width and height"]
    K -->|Yes| M{Dome + Distant lights?}
    M -->|No| N[Reject: "Add DomeLight and DistantLight (min intensity 100 and 500)"]
    M -->|Yes| O{RayTracedLighting?}
    O -->|No| P[Reject: "Use RayTracedLighting for iteration"]
    O -->|Yes| Q{Render output exists?}
    Q -->|No| R[Reject: "No render output"]
    Q -->|Yes| S{>= 150 KB and mean_RGB > 30?}
    S -->|No| T[Reject: "Render is black, too dark, or corrupted"]
    S -->|Yes| U{Hardcoded user paths or bare IPs?}
    U -->|Yes| V[Reject: "Replace hardcoded user paths/IPs with env vars or args"]
    U -->|No| Y[VALID - deliver]

Training output

ItemAction
policy_only_XXXX.ptaccept
model_XXXX.zipaccept
log.csv or wandb URLaccept
results.json with episode dataaccept
No reward curve / metricsreject: Log episode/reward_mean and train/value_loss

Reply format

  • Pass: Valid: <one-line summary>
  • Fail: Invalid: <list of failed checks>
  • Suggest (only when otherwise valid): Could be improved: <tip>

Do not hedge ("I think", "maybe"). Do not deliver a black frame.

Input sources

  • isaac-sim-orchestrator, isaac-sim-rendering, other producer skills, and sub-agent outputs.
  • Invoked on Isaac Sim deliverables: "validate this Isaac Sim script", "check this Isaac Sim render", "review this sim output".

Automated validation

Run the checks above from the CLI with scripts/validate_sim.sh:

# Levels 1–2: static only
bash scripts/validate_sim.sh --level <1|2> <script.py> [--output-dir <dir>] [--timeout <seconds>]

# Level 3: EXECUTES the script — requires explicit opt-in
bash scripts/validate_sim.sh --level 3 --confirm-execute <script.py> [--output-dir <dir>] [--timeout <seconds>]
# or: CONFIRM_EXECUTE=1 bash scripts/validate_sim.sh --level 3 <script.py> ...

Feedback loop

Comments

Markdown supported