Omniverse Usd Performance Tuning
OpenAIOfficialCreated by NVIDIA OmniverseDistributed by OpenAI
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The omniverse-usd-performance-tuning skill provides a structured, end-to-end procedure for addressing performance bottlenecks in USD assets. It manages the lifecycle of performance tuning, from initial runtime context setup and baseline profiling to composition auditing, validation, and targeted scene optimization. The skill enforces a rigorous milestone-based approach, ensuring that all destructive operations are planned and approved, and that performance improvements are verified through comparative profiling and standardized reporting.
What it does
- Orchestrates the end-to-end USD performance tuning lifecycle.
- Validates runtime environments and handles authentication for remote assets.
- Conducts composition audits and structural assessments of USD stages.
- Executes validated optimization operations using Scene Optimizer.
- Generates structured optimization reports comparing baseline and post-optimization metrics.
- Enforces safety gates for destructive operations and mutation.
When to use it
- When a USD scene exhibits slow loading times or low frame rates.
- When memory usage is excessively high or GPU crashes occur.
- When you need to optimize a scene for better interactivity or performance.
- When you need to diagnose CAD conversion quality issues.
- When you need to validate a scene before and after applying optimizations.
Advantages
- Ensures consistent performance diagnosis through a standardized workflow.
- Prevents accidental data loss by requiring approval for destructive operations.
- Provides clear, evidence-based reporting on performance improvements.
- Integrates seamlessly with existing Omniverse validation and optimization tools.
- Maintains strict separation between diagnosis, planning, and execution phases.
Usage examples
- “This USD scene loads very slowly; please triage what I should check first.”
- The agent will initiate the runtime context gate, perform a composition audit, and provide a structured plan to identify the source of the slow load time.
- “Optimize my CAD scene for better performance.”
- The agent will verify the runtime, assess the CAD conversion quality, and propose a milestone-based optimization plan including validation and profiling.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/omniverse-usd-performance-tuning/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip omniverse-usd-performance-tuning.zip -d .agents/skills
Documentation by NVIDIA Omniverse
Omniverse USD Performance Tuning
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
When to Use
Use this workflow for broad performance asks such as slow loading, high memory, low FPS, GPU crashes, conversion-quality triage, or generic requests to optimize a USD scene.
Instructions
Start from the mandatory runtime context gate before producing tuning output, unless the prompt is only asking for a static classification test.
Classify broad optimization requests as
ready_to_plan; reserveapproval_requiredfor prompts that explicitly name a destructive operation to execute before planning.Plan the full canonical chain through
optimization-report, preserving the structured milestone order and theprofile-stage:baseline/profile-stage:afterlabels when listing milestones.Invoke downstream skill bodies only when their phase is reached, and keep raw runtime artifacts on disk while reading compact summaries.
Frontmatter keeps version and tools at top level for agentskills.io runtime
compatibility. NVCARPS discoverability fields live under metadata.
Output Format
Return a plan or status summary that names the selected entry skill, uses ready_to_plan for generic optimization requests, includes the full milestone chain through optimization-report, and labels profile phases as profile-stage:baseline and profile-stage:after. For structured outputs, the broad-optimization milestone subsequence is omniverse-usd-performance-tuning -> profile-stage:baseline -> usd-structure-assessment -> usd-validation-runner -> restructure-decision -> apply-restructure -> so-run-validators -> so-interpret-validators -> so-run-operations -> profile-stage:after -> compare-profiles -> optimization-report. End-to-end execution should produce an optimized stage when mutation runs and a report conforming to the optimization-report reference's schema (scripts/optimization-report.schema.json within that reference).
Use this workflow for broad performance asks such as slow loading, low FPS, high memory, GPU crashes, conversion quality, or "optimize my scene."
Entry skill rule
This skill is the named entry point for broad performance work whenever the
agent has any verified way to do that work. Runtime probing details live in
setup-usd-performance-tuning; this rule only decides which skill owns the
user-facing performance request.
If the setup probe shows any verified runtime path - Kit, standalone, or even a partial stack such as Asset Validator only - enter here. If the user's requested tool is missing, return the specific
blocked_code(blocked_missing_scene_optimizer,blocked_missing_so_operation, etc.) instead of substituting another workflow.Enter at
setup-usd-performance-tuningonly when no runtime path is verified and runtime choice/setup is the first unresolved problem.For
omniverse://assets, enter atomniverse-authenticationfirst. Authentication precedes setup and triage for remote assets.
The decision is about ownership, not order. Setup, authentication, and triage all run in their normal phase order; this rule only fixes which skill the agent names as the entry skill in its response.
Runtime context — session-start gate (mandatory)
Before any other tuning output, follow the mandatory session-start gate in
skills/omniverse-usd-performance-tuning/references/setup-usd-performance-tuning/references/runtime-context-header.md.
That reference owns output_path, the canonical setup-preflight.json
location, Format A/Format B, and the "do not improvise a silent probe"
anti-pattern.
Required outcomes:
Missing or unreadable preflight: invoke
setup-usd-performance-tuning.Present preflight: print Format A and wait for the user to choose Continue, Change Kit, Switch to standalone, or Re-run probe.
Confirmed runtime in the same session: use compact Format B for follow-up status.
[Kit: {runtime_context.kit.application} {runtime_context.kit.version} | SO: {runtime_context.sceneOptimizer.version} | AV: {runtime_context.assetValidator.version}]Runtime artifact token budget
Before reading Kit logs, Asset Validator CSVs, Scene Optimizer logs, Tracy CSVs,
or other runtime output, follow
references/runtime-artifact-token-budget.md. Keep raw artifacts on disk, read
summary JSON first, and use bounded log snapshots instead of full dumps or live
streams.
Plan-time vs execution-time approval
approval_required at planning time is reserved for requests that explicitly name a destructive operation. Use the following rule when deciding between ready_to_plan and approval_required:
approval_requiredat planning time — the user's request itself names a destructive operation: "flatten this stage", "decimate the meshes", "merge prototypes", "delete unused prims", or any specific named mutation that cannot be undone within the same workflow. In this case the agent's first response must be an approval prompt that names the operation, before the agent commits to a plan that executes it.ready_to_planat planning time — the user's request is general: "optimize this scene", "make it load faster", "reduce GPU memory", "improve interactivity". The agent lays out the full plan, including any destructive operations the plan would invoke (for exampleso-run-operationswithmergeMaterials), without withholding the plan itself. Approval for each destructive operation is requested alongside plan approval.
The distinction is between authorising a plan and authorising a destructive action. A general optimisation request authorises planning; it does not authorise execution of specific destructive operations.
For structured runtime-test responses and similar planning summaries:
A future
restructure-decisionprompt is a planned user-decision gate, not a reason to set the top-level responsedecisiontoapproval_requiredfor a generic optimization request.For a generic optimization request, set
decision: "ready_to_plan"and include the full intended chain in bothcommitted_milestonesandplanned_phases, throughoptimization-report.It is valid for
gates_observedto includeasks_user_for_restructure_decisionwhile the top-leveldecisionremainsready_to_plan.Whenever a chain names profile phases, use the exact labels
profile-stage:baselineandprofile-stage:after; do not emit the ambiguous bareprofile-stagetoken.Start structured milestone lists with
omniverse-usd-performance-tuningas the owning entry skill. Includesetup-usd-performance-tuningonly as additional Phase 0 context, not as a replacement for the entry skill milestone.For broad optimization requests, preserve the milestone subsequence from Output Format above exactly, with optional extra analysis steps inserted only where they do not reorder it.
Do not list
so-run-validatorsorso-interpret-validatorsbeforerestructure-decisionin broad optimization milestone summaries. Phase-aware validator routing still happens throughusd-validation-runner; the SO validator executor/interpreter milestones appear after the restructure decision path in the structured plan contract.
Output expectation
End-to-end optimization work should produce both an optimized USD stage, when
mutation is executed, and a structured optimization report conforming to
the optimization-report reference's scripts/optimization-report.schema.json. The HTML report must be rendered
from references/report-templates/optimization-report.html.template via
render_preview.py — never hand-write HTML. Diagnosis-only work should still
end with a report or summary that states no optimized stage was written.
Purpose
Route digital twin USD performance requests into the right diagnostic and optimization workflow while preserving evidence before mutation.
Prerequisites
Stage path or enough context to identify the target asset.
User goal: diagnosis only, validation, profiling, or processor execution.
Runtime availability status from
setup-usd-performance-tuningwhen not already known.Permission status for in-place mutation vs writing a separate optimized output.
Examples
"This USD loads slowly; triage what to check first."
"Route a low-FPS CAD scene through the performance workflow."
Triage order
Runtime gate. Follow the mandatory session-start gate above before validation, profiling, or optimization. Do not scan, probe, install, or pick Kit/standalone runtimes directly in this skill;
setup-usd-performance-tuningowns probe/chooser/install dispatch and writes the preflight consumed here.Identify the target problem:
Load time.
FPS or interactivity.
GPU or system memory.
Crash or device lost.
CAD conversion quality.
Validation failure.
Gather minimum context:
Stage path and size.
Whether the stage is local, mounted, or
omniverse://remote. For remote assets, route throughomniverse-authenticationbefore first open.Kit or USD runtime.
Whether the workload is CAD, VFI, AIF, Isaac, or generic OpenUSD.
Whether in-place mutation is allowed.
Whether the user wants diagnosis only or processor execution.
Route:
USD composition questions:
usd-structure-assessment(composition is now part of the SA umbrella; deeper detail inskills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/composition-audit.md).Validation and content issues:
usd-validation-runner(master router; routes tovalidate-*family orso-run-validatorsbased on intent).Edit/output decisions:
usd-edit-target-planner(also owns variant/payload gates).Repeated copied hierarchy or high mesh count with no instancing:
usd-hierarchy-dedupe-candidates.Restructure decision (monolithic stage, asset boundary materialization):
restructure-decision.CAD converter settings: read
references/cad-conversion/README.md(niche pre-USD concern; see reference for details).Scene Optimizer:
so-run-validators,so-interpret-validators,so-run-operations.
Optimization ordering
Follow the canonical ordering in workflow.md § Operation ordering invariants. The high-level rule: prototypes first → per-asset validation → stage-level operations last. The workflow reference owns the full invariant list (meshCleanup before decimateMeshes, deduplication before decimation, never merge if instanced, etc.) and the analysis-only ops catalogue.
Rules
Always run composition audit before mutation.
Always validate before and after processor execution.
Optimize prototypes before per-asset validation.
Do not run whole-stage mesh deduplication on very large CAD scenes before checking for hierarchy-level reuse.
Do not recommend a fixed optimization stack without bottleneck evidence.
Do not invent numeric thresholds or expected percentage wins.
Prefer canonical SO ops over specialty / documentary ones. The op curation in
references/operations/_curation.jsonclassifies every op ascanonical,specialty,analysis,documentary, ordeprecated. When more than one op could resolve the same finding, recommend the canonical one first and only reach for a specialty op when the user explicitly asks or the rationale warrants it. Specifically:For vertex welding, prefer canonical
meshCleanupwith explicit flags over the standalonemergeVerticesop. The standalone op is a legacy/specialty surface; use upstreamusd-optimizefor the operation mechanics and local approval policy before mutating.For hierarchy dedupe, recommend
usd-hierarchy-dedupe-candidates+apply-restructure(the USD-authored rewrite path).For per-mesh dedupe, recommend
deduplicateGeometry(canonical) overfindCoincidingGeometry(analysis — produces a report, not a change).Do not recommend
documentary-status ops (e.g.,boxClip,deletePrims,removeAttributes,removeUntypedPrims,mergeoutside its narrow non-instanced case) without an explicit user request. Documentary ops survive in the per-opreferences/operations/<key>.mdrouting stubs for completeness but are excluded from agent-initiated recommendations.Specialty ≠ documentary. Ops classified as
specialtyin_curation.jsoneither (a) have validator-finding evidence that wires them into theso-interpret-validatorschain (e.g.sparseMeshes,optimizePrimvars), or (b) are load-bearing escape hatches needed for specific downstream contexts (e.g.primitivesToMesheswhen output must beUsdGeomMesh,utilityFunctionfor instancing toggles and material rebinding,pythonScriptforso-create-proxyrecipes). Recommend specialty ops when their validator fires OR when their downstream context applies — the suppression above only targetsdocumentaryops.
Limitations
Does not replace downstream reference instructions; load each required reference before executing it.
Does not install runtimes directly; follow setup or install references when requirements are missing.
Does not authorize mutation when the user has not allowed writes.
Troubleshooting
If runtime status is unclear, run
setup-usd-performance-tuningbefore profiling or validation.If the reported problem is vague, gather stage path, workload type, and whether diagnosis or execution is requested.
If the workflow suggests mutation before evidence, return to baseline profiling and composition audit first.
References
Before routing, read:
skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/optimization-tradeoffs.md— identify which pipeline phase the scene is in (extraction, structuring, or optimization). The right action depends on the phase.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/factory-level-structuring.md— understand the three pillars (assets, aggregation, animation) and the seven-step structuring pattern.
If you have network access, prefer the live URLs (noted in each reference file) for the most current version.
Required execution flow
Read references/workflow.md for the canonical Phase 0-7 flow, including
Kit/standalone branches, validator-stack routing, operation ordering,
termination conditions, duration hints, and the optional iteration pattern.
The compact root map at references/skill-map.md only routes agents
into this workflow.
Do not treat downstream phase names as plain checklist labels. Before executing
each step, load that phase's nested README.md reference and follow its
instructions. Claude Code only exposes the public catalog skill; it does not
recursively inject profile-stage, usd-structure-assessment, or other nested
references.
The final deliverable must come from optimization-report: save both the structured JSON report and the generated Markdown summary. Do not substitute an ad hoc SUMMARY.md or chat-only recap for the optimization report.
For deeper subtopic guidance, consult the references:
skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/composition-audit.md,skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/layer-health.md- subtopic detail for SA's Phase 1 checklist.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/instancing-readiness/references/instancing-tradeoffs.md- merge safety, decision tree for instancing choices.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/usd-edit-target-planner/references/variants-payloads.md- deeper variant/payload trade-offs (gates are inline in usd-edit-target-planner).references/cad-conversion/README.md- CAD converter settings.references/upstreams/usd-optimize.md- upstream SO mechanics and prebuilt package resolution.skills/omniverse-usd-performance-tuning/references/usd-validation-runner/references/so-run-validators/references/infrastructure.md- local handoff for SO validator infrastructure.skills/omniverse-usd-performance-tuning/references/usd-validation-runner/references/validation-scoping.md- tier 1/2/3 plan + scene-aware adjustment.skills/omniverse-usd-performance-tuning/references/optimization-report/references/optimization-report-template.md- the data contract every phase populates.
For full Kit runtime profiling (FPS, frame time, Hydra/RTX metrics), refer to the external profiling skills at NVIDIA/omniperf.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- BENCHMARK.md22.5 KiB
- LICENSEAdded by AutoGineer10.0 KiB
- SKILL.md17.2 KiB
- agents/openai.yaml402 B
- evals/evals.json4.8 KiB
- references/cad-conversion/README.md2.5 KiB
- references/cad-conversion/scripts/conversion-report.schema.json1.3 KiB
- references/compare-profiles.md2.4 KiB
- references/compare-profiles/README.md9.7 KiB
- references/omniverse-authentication/README.md3.8 KiB
- references/operations/CLASSIFICATION.md4.5 KiB
- references/operations/EXECUTION.md4.5 KiB
- references/operations/README.md8.0 KiB
- references/operations/_curation.json14.5 KiB
- references/operations/_template.md1.5 KiB
- references/operations/boxClip.md1.0 KiB
- references/operations/computeExtents.md1.1 KiB
- references/operations/countVertices.md1.1 KiB
- references/operations/decimateMeshes.md2.6 KiB
- references/operations/deduplicateGeometry.md1.1 KiB
- references/operations/deduplicateHierarchies.md1.5 KiB
- references/operations/deleteHiddenPrims.md1.1 KiB
- references/operations/deletePrims.md1.0 KiB
- references/operations/diceMeshes.md1.1 KiB
- references/operations/editStageMetrics.md1.1 KiB
- references/operations/findCoincidingGeometry.md1.1 KiB
- references/operations/findFlatHierarchies.md1.1 KiB
- references/operations/findOccludedMeshes.md4.8 KiB
- references/operations/findOverlappingMeshes.md1.1 KiB
- references/operations/fitPrimitives.md1.1 KiB
- references/operations/flattenHierarchy.md1.1 KiB
- references/operations/generateAtlasUVs.md1.1 KiB
- references/operations/generateNormals.md1.1 KiB
- references/operations/generateProjectionUVs.md1.1 KiB
- references/operations/generateScene.md1.1 KiB
- references/operations/manifest.json38.6 KiB
- references/operations/manifoldMeshes.md1.1 KiB
- references/operations/merge.md1.1 KiB
- references/operations/mergeVertices.md1.1 KiB
- references/operations/meshCleanup.md1.1 KiB
- references/operations/optimizeMaterials.md1.1 KiB
- references/operations/optimizePrimvars.md1.1 KiB
- references/operations/optimizeSkelRoots.md1.1 KiB
- references/operations/optimizeTimeSamples.md1.1 KiB
- references/operations/organizePrototypes.md1.1 KiB
- references/operations/pivot.md1.0 KiB
- references/operations/primitivesToMeshes.md1.1 KiB
- references/operations/printStats.md1.0 KiB
- references/operations/probe-snapshots/so-110.0.4.json1.8 KiB
- references/operations/pruneLeaves.md1.1 KiB
- references/operations/pythonScript.md1.0 KiB
- references/operations/remeshMeshes.md1.1 KiB
- references/operations/removeAttributes.md1.1 KiB
- references/operations/removePrims.md1.1 KiB
- references/operations/removeSmallGeometry.md1.1 KiB
- references/operations/removeUntypedPrims.md1.1 KiB
- references/operations/removeUnusedUVs.md1.1 KiB
- references/operations/rtxMeshCount.md1.1 KiB
- references/operations/scripts/operation-curation.schema.json1.2 KiB
- references/operations/scripts/operation-manifest.schema.json1.8 KiB
- references/operations/shrinkwrap.md1.0 KiB
- references/operations/sparseMeshes.md1.1 KiB
- references/operations/splitMeshes.md1.0 KiB
- references/operations/subdivideMeshes.md1.1 KiB
- references/operations/triangulateMeshes.md1.1 KiB
- references/operations/utilityFunction.md1.1 KiB
- references/optimization-report/README.md14.6 KiB
- references/optimization-report/references/optimization-report-template.md10.4 KiB
- references/optimization-report/scripts/optimization-report.schema.json9.7 KiB
- references/output-workspace.md3.1 KiB
- references/profile-stage/README.md13.7 KiB
- references/report-templates/README.md1.4 KiB
- references/report-templates/optimization-report.design-fixture.json6.4 KiB
- references/report-templates/optimization-report.html.template8.6 KiB
- references/report-templates/optimization-report.md.template1.7 KiB
- references/report-templates/render_preview.pyScript8.2 KiB
- references/runtime-artifact-token-budget.md3.8 KiB
- references/setup-usd-performance-tuning/README.md12.2 KiB
- references/setup-usd-performance-tuning/references/install-asset-validator-standalone/README.md3.8 KiB
- references/setup-usd-performance-tuning/references/install-kit/README.md2.6 KiB
- references/setup-usd-performance-tuning/references/install-so-standalone/README.md11.0 KiB
- references/setup-usd-performance-tuning/references/install-so-via-kit/README.md3.7 KiB
- references/setup-usd-performance-tuning/references/kit-discovery.md2.9 KiB
- references/setup-usd-performance-tuning/references/runtime-context-header.md13.2 KiB
- references/setup-usd-performance-tuning/references/runtime-probe.md4.5 KiB
- references/setup-usd-performance-tuning/references/standalone-runtime.md2.7 KiB
- references/setup-usd-performance-tuning/scripts/probe-snapshot.schema.json1.7 KiB
- references/setup-usd-performance-tuning/scripts/setup-preflight.schema.json2.8 KiB
- references/skill-map.md6.3 KiB
- references/so-run-operations/README.md3.5 KiB
- references/so-run-operations/references/batch-mode.md4.5 KiB
- references/so-run-operations/references/config-from-evidence.md4.4 KiB
- references/so-run-operations/references/invocation.md4.5 KiB
- references/so-run-operations/references/operation-safety.md8.7 KiB
- references/so-run-operations/references/pipelines.md2.4 KiB
- references/so-run-operations/references/so-create-proxy/README.md1.7 KiB
- references/so-run-operations/references/so-create-proxy/references/bounding-box-proxy-modes.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/decimate-step-recipes.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/decimation-tuning.md1.5 KiB
- references/so-run-operations/references/so-create-proxy/references/proxy-config-recipes.md1.6 KiB
- references/so-run-operations/references/units-and-tolerances.md3.8 KiB
- references/upstreams/usd-optimize.md3.1 KiB
- references/usd-structure-assessment/README.md24.8 KiB
- references/usd-structure-assessment/references/apply-restructure/README.md14.2 KiB
- references/usd-structure-assessment/references/apply-restructure/references/hierarchy-dedupe-rewrite-tool-spec.md8.5 KiB
- references/usd-structure-assessment/references/apply-restructure/references/ref-remap-mode.md2.4 KiB
- references/usd-structure-assessment/references/apply-restructure/references/restructure-mode.md8.2 KiB
- references/usd-structure-assessment/references/asset-structure-principles.md60.1 KiB
- references/usd-structure-assessment/references/composition-audit.md4.8 KiB
- references/usd-structure-assessment/references/factory-level-structuring.md24.0 KiB
- references/usd-structure-assessment/references/instancing-readiness/README.md8.5 KiB
- references/usd-structure-assessment/references/instancing-readiness/references/instancing-guide.md45.0 KiB
- references/usd-structure-assessment/references/instancing-readiness/references/instancing-tradeoffs.md5.6 KiB
- references/usd-structure-assessment/references/layer-health.md3.1 KiB
- references/usd-structure-assessment/references/optimization-tradeoffs.md8.6 KiB
- references/usd-structure-assessment/references/restructure-decision/README.md16.5 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/README.md6.3 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/references/output-saving.md2.1 KiB
- references/usd-structure-assessment/references/usd-edit-target-planner/references/variants-payloads.md4.2 KiB
- references/usd-structure-assessment/references/usd-hierarchy-dedupe-candidates/README.md5.7 KiB
- references/usd-structure-assessment/references/usd-hierarchy-dedupe-candidates/references/instance-candidate-finder-spec.md34.2 KiB
- references/usd-structure-assessment/scripts/audit-report.schema.json1.9 KiB
- references/usd-structure-assessment/scripts/optimization-plan.schema.json1.5 KiB
- references/usd-structure-assessment/scripts/usd-structure-assessment-report.schema.json9.5 KiB
- references/usd-validation-runner/README.md13.0 KiB
- references/usd-validation-runner/references/so-interpret-validators/README.md3.6 KiB
- references/usd-validation-runner/references/so-interpret-validators/references/follow-up-queries.md4.6 KiB
- references/usd-validation-runner/references/so-interpret-validators/references/rule-reference.md8.2 KiB
- references/usd-validation-runner/references/so-run-validators/README.md2.9 KiB
- references/usd-validation-runner/references/so-run-validators/references/infrastructure.md1.6 KiB
- references/usd-validation-runner/references/validate-usd-asset-validator.md13.7 KiB
- references/usd-validation-runner/references/validation-scoping.md23.8 KiB
- references/usd-validation-runner/scripts/asset-validator-validation-report.schema.json2.7 KiB
- references/usd-validation-runner/scripts/validation-report.schema.json1009 B
- references/workflow.md24.5 KiB
- skill-card.md2.5 KiB
- skill.oms.sig39.9 KiB
references/usd-validation-runner/references/validation-scoping.md
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
Validation Scoping — Canonical Cost Guardrails
This is the single source of truth for validation cost control in the digitaltwin-performance-skill workflow. Other references (
usd-validation-runner,validate-usd-asset-validator,workflow.md) point here for tier detail, approval gates, and scoping rules rather than duplicating them.
Decision Tree (read this first)
┌─ What did structure assessment say? ─────────────────────────────────────┐
│ │
│ phase_recommendation = "structuring" │
│ → Structural validators only (do not validate geometry about to be │
│ restructured) │
│ │
│ phase_recommendation = "optimization" │
│ → Tier 1: always (full stage) │
│ → Tier 2: per flagged asset (or 10% sample if budget allows) │
│ → Tier 3: only on specifically flagged targets, ALWAYS ask first │
│ │
│ phase_recommendation = "already_optimized" │
│ → Tier 1 only; ask user before expanding scope │
│ │
│ No structure assessment available │
│ → Run structure assessment first. Do not begin with validators. │
│ │
├─ Is a full-stage Asset Validator sweep requested? ───────────────────────┤
│ │
│ Trigger the FULL-SWEEP APPROVAL GATE (§ below) when ANY of: │
│ • Stage size is unknown │
│ • Customer-scale factory/CAD/BIM/MEP/plant/city │
│ • SA reports large prim/mesh/prototype/material counts │
│ • Request is performance triage (not formal conformance) │
│ │
│ Offer: targeted rules (recommended) | full sweep + timeout | defer │
│ │
├─ Is full-stage AV too expensive but signal is still needed? ─────────────┤
│ │
│ Use MASKED-STAGE SPOT CHECKS (§ below) │
│ • ≥25% mesh coverage or explain why not │
│ • Label as sample evidence, not full-stage evidence │
│ │
├─ Is a full-stage category sweep planned on a very large mesh count? ─────┤
│ │
│ Do NOT run uncapped Basic/Layer/Geometry/etc. over the whole stage. │
│ Use masked spot checks, or run each selected category/rule in a │
│ subprocess with an explicit wall-clock budget and report TIMEOUT rows. │
│ │
├─ Stage has >30K prototype meshes and per-rule attribution is needed? ────┤
│ │
│ Use PER-RULE TIMEOUT pattern (§ below) │
│ │
├─ Validating post-decompose targets (payloads, assembly root)? ───────────┤
│ │
│ Each target re-enters THIS tree independently (§ Post-Restructure │
│ Validation Strategy). Treat each payload/assembly as a fresh validation │
│ request — tier selection, approval gate, and spot-check threshold apply │
│ based on THAT target's prim count, not the original composed stage. │
│ │
└──────────────────────────────────────────────────────────────────────────┘Purpose
Translate structure assessment findings into a concrete validation plan that
avoids running expensive validators on assets that do not need them. Use this
after usd-structure-assessment produces its report and before invoking
so-run-validators.
Inputs
Structure assessment report:
flagged_assets,validation_scope,phase_recommendation.User time/resource budget and approval posture for expensive checks.
Goal type: diagnosis-only or diagnosis plus execution.
Validator names available in the installed runtime.
Validator Tiers
Tier 1: Fast (seconds per asset)
Metadata and traversal only. Safe to run on all assets.
printStatscountVerticesrtxMeshCountremoveSmallGeometry(analysis mode)findFlatHierarchies(analysis mode)pruneLeaves(analysis mode)removePrims(analysis mode — orphaned overs)
Tier 2: Medium (seconds to minutes per asset)
Per-mesh inspection. Run on flagged assets or all if budget allows.
meshCleanup(analysis mode)optimizeMaterials(analysis mode)removeUnusedUVs(analysis mode)computeExtents(analysis mode)generateNormals(analysis mode)
Tier 3: Expensive (minutes per asset, minutes to hours cross-component)
Spatial or pairwise analysis. Run only on specifically flagged assets/pairs. Always ask the user before running.
deduplicateGeometry(analysis mode) — on repetition-flagged assetsfindCoincidingGeometry(analysis mode) — on repetition-flagged pairsfindOccludedMeshes(analysis mode) — on containment-flagged pairsfitPrimitives(analysis mode) — on outlier-flagged or primitive-like assetssparseMeshes(analysis mode) — on outlier-flagged assets
Deferred to Post-Optimization Pass
These validators are expensive AND their findings do not influence operation selection — the corresponding operations already run unconditionally based on structural signals. Running these first adds cost without changing the plan.
| Validator | Why deferred |
|---|---|
optimizePrimvars / IndexedPrimvarChecker | removeUnusedUVs + optimizePrimvars already run for CAD/BIM. Checker produces 100K+ warnings (~6 min, ~156 MB) confirming what SA already told you. |
SceneOptimizerNonManifoldChecker / ManifoldChecker | Per-edge topology; only relevant for simulation targets. Visualization-only workflows skip entirely. |
SceneOptimizerUnusedUVsChecker | Same signal as IndexedPrimvar — the operation is already selected. |
Exception: If the assessment does NOT indicate these operations should run (e.g., a non-BIM scene where UV removal is uncertain), DO run the validators — their findings provide the evidence to justify the operation.
Full-Sweep Approval Gate
Trigger before any command that enables the default AV rule set over the whole composed stage when ANY condition holds:
Stage size is unknown.
Target is customer-scale factory/CAD/BIM/MEP/plant/city.
SA reports large prim/mesh/prototype/material counts, many payloads/references, or a monolithic root layer.
Request is performance triage rather than formal conformance.
Offer the user three options:
Recommended: minimum-openability + targeted category/rule checks.
Full sweep: default AV rule set with explicit timeout and artifact dir.
Defer: skip AV until after SA or after mutation.
When approved, record scope: "full_stage", approved_by_user: true,
timeout_seconds, and artifact paths. If not approved, do not launch.
Scoping Rules
Structure assessment is the first filter. Use
summary_countsplus duplicate-hierarchy candidates to decide which validators can change the optimization plan. Do not start with a full default AV sweep.Start with cheap, optimization-oriented evidence. Duplicate geometry/materials, empty leaves, flat hierarchies, high vertex/mesh count summaries, unused UVs (when tolerant of noise), small/zero-extent geometry (when scoped).
Keep SO analysis in the validation workflow. Use AV-registered SO checkers when available; otherwise run equivalent read-only SO analysis via
so-run-validatorsin the same plan. Do not treat it as a separate phase.Run Tier 2 per-asset on:
All assets flagged by SA (any reason).
A sample of unflagged assets if budget allows (e.g., 10% random).
Run Tier 3 only on flagged targets:
deduplicateGeometry: onlyrepetition-flagged.findOccludedMeshes: onlycontainment-flagged pairs.fitPrimitives/sparseMeshes: onlyoutlier_extentor primitive-like. For CAD/BIM/MEP, pipe/duct/conduit/fitting names or high prototype mesh counts are enough evidence. Heavy existing instancing does not remove this signal.
Cross-component validators require the composed stage with relevant payloads visible. Use
Usd.Stage.OpenMasked()with a population mask covering only the flagged pair (and their dependency closures), OR run the validator via standaloneUsd.Stage.Open()on each target file. Do NOT rely onLoadNone+ selectivestage.Load()— the Asset Validator discards load rules and re-opens with LoadAll (see §"LoadRules Behavior With the Asset Validator" below).If no assets are flagged: Tier 1 only. Report the scene as likely well-structured. Ask before running Tier 2-3.
Defer noisy/slow full-stage rules. Do not run
IndexedPrimvarChecker,CoincidingGeometryChecker,ExtentsChecker,AlmostExtremeExtentChecker,ArticulationChecker,ColliderChecker, orKindCheckerglobally in the preliminary pass. Run them only when the scope makes their output actionable (physics checks for simulation assets, coinciding geometry for repetition-suspect groups, etc.).Cap selected category sweeps on large stages. A category-scoped AV run is still a full-stage traversal for that category. If
summary_counts.mesh_countor prototype/proxy mesh contribution is very large, do not launch uncappedBasic,Layer,Geometry,Material, or multi-category sweeps over the full composed stage. Prefer masked-stage spot checks. If a category sweep is still needed, run each selected category or rule in its own subprocess with an explicit wall-clock budget, recordtimeout_seconds/timeout_reason, and treat partial results as scoped evidence rather than full conformance.Prefer summaries over issue dumps. Summarize findings into target counts and operation candidates. Apply
runtime-artifact-token-budget.mdfor CSV/log/summary handling.
Scene-Aware Tier Adjustment
The static tier assignments above are defaults. Adjust based on
phase_recommendation and scene characteristics:
| Scene signal | Adjustment |
|---|---|
| CAD/BIM/MEP, pipe/duct-heavy, many primitive-like prototypes | Promote fitPrimitives analysis into first SO pass (even when heavily instanced — instancing skips mesh dedup, not prototype primitive fitting). |
| Well-structured, artistic | Promote deduplicateGeometry + optimizeMaterials; demote fitPrimitives. |
| Instancing ratio >80% | Skip deduplicateGeometry. |
| Scene has 0 extents | Always include computeExtents. |
| Enclosed building | Scope findOccludedMeshes to within-floor/within-discipline, or skip entirely. |
When removeUnusedUVs and fitPrimitives both target the same CAD/BIM
content, interpret fitPrimitives candidates against the post-UV-cleanup
state; a pre-cleanup nonconstPrimvarMeshCount bucket is still a
primitive-fit opportunity.
Masked-Stage Spot Checks
See also: "Post-Restructure Validation Strategy" below for how to validate after
apply-restructureordecompose-for-selective-loading. Masked-stage techniques apply within that framework when individual targets (assembly skeleton or a single large payload) are themselves too expensive for a full sweep.
Use when full-stage AV is too expensive but prim-level findings can still change the optimization plan. This is the preferred alternative to dropping validation entirely on customer-scale assets.
When to use
Stage is customer-scale (CAD/BIM/MEP/factory/city, tens of thousands of prototype meshes).
SA can identify representative candidate subtrees.
Rule set is mostly
CheckPrim-style geometry/material/schema checks.Result is optimization evidence, not formal conformance.
Sample selection
Build a cheap full-stage inventory first: top branches by mesh count, semantic names, top prototype/fingerprint groups, material-heavy branches, instance-heavy branches.
Include all SA-flagged targets that may change the operation plan.
Cover ≥25% of mesh-bearing content by mesh count,
rtxMeshCount, or instance-proxy mesh contribution. If floor is impractical, record why and mark result as limited sample evidence.Include high-risk exemplars: largest mesh, deepest hierarchy, material-heavy mesh, repeated module, top prototype/fingerprint family, dominant mesh-bearing semantic classes (pipe/duct/conduit/fitting for MEP; equivalent for other scenes).
Do not sample bare generated prototype roots unless the masked stage is verified to expose descendant meshes.
Implementation
from pxr import Sdf, Usd, UsdGeom
from omni.asset_validator import CategoryRuleRegistry, ValidationEngine
asset_abs = "/path/to/customer-scale.usd"
root_layer = Sdf.Layer.FindOrOpen(asset_abs)
default_prim_path = f"/{root_layer.defaultPrim}" if root_layer.defaultPrim else None
sampled_paths = ["/Root/Prototypes/PipeFamily_A", "/Root/Mechanical/Level_02/AHU_01"]
closure_paths = ["/Root/Looks", "/Root/Materials"]
mask = Usd.StagePopulationMask()
for path in [*sampled_paths, *closure_paths, default_prim_path]:
if path:
mask.Add(path)
stage = Usd.Stage.OpenMasked(root_layer, mask)
assert stage.GetDefaultPrim().IsValid(), "masked stage excluded default prim"
# Verify mesh coverage (proxy/prototype-aware)
mesh_count = sum(
1 for prim in Usd.PrimRange.Stage(
stage, Usd.TraverseInstanceProxies(Usd.PrimDefaultPredicate)
) if prim.IsA(UsdGeom.Mesh)
)
# Must be ≥25% of total_scene_mesh_count; raise if 0
registry = CategoryRuleRegistry()
normals_rule = next(
rule for rule in registry.get_rules("Geometry") if rule.__name__ == "NormalsValidChecker"
)
engine = ValidationEngine(init_rules=False)
engine.enable_rule(normals_rule)
results = engine.validate(stage)Constraints
Preserve default prim in the mask.
Add material scopes / relationship targets when running material rules.
Avoid stage-global / layer-global / dependency rules in spot mode.
Label output
scope: "masked_stage_spot_check"with sampled paths, semantic tags, mesh coverage %, and evidence scope.Reject empty samples: if proxy/prototype-aware counts report 0 meshes, resample instead of reporting "0 findings."
Post-Restructure / Post-Decompose Validation Strategy
After apply-restructure (mode=restructure) or decompose-for-selective-loading
produces an assembly root + N payload/prototype files, do NOT open the full composed
stage with all payloads loaded for a blanket validator sweep. That re-couples what was
just decomposed and doubles validation work.
Validation Distribution
Assembly skeleton — open with
Usd.Stage.OpenMasked()excluding payload prim paths. Run structural validators only: reference resolution, kind hierarchy, layer structure, defaultPrim, extent hints, assetInfo. Single pass.Assembly root as optimization target — if the assembly root retains mesh content after extraction (ground planes, shared environment geometry, non-extracted sub-hierarchies), it is itself a Phase 4 target. Validate and optimize it like any other target via the decision tree. The manifest records this with
target_class: "assembly_root".Each payload/prototype (standalone) — open each file independently with
Usd.Stage.Open(payload_file). Plan validation through the decision tree for each target (tier selection and approval thresholds apply per-target based on that target's prim count — a small payload may qualify for spot-check rather than a full sweep). These are independent and can run in parallel.Cross-payload pairs — open with
Usd.Stage.OpenMasked(root, mask)covering only the two relevant payload subtrees. Run Tier 3 only (findCoincidingGeometry, etc.) per flagged pair.
Rules
Validate each payload as a standalone file. Do not rely on the assembly context for per-payload geometry validation.
Validate payloads in parallel — they are independent by definition.
The assembly-skeleton pass confirms composition integrity (all refs resolve, no dangling payload arcs, kind/model hierarchy correct).
Cross-payload Tier 3 validators use
OpenMaskedto expose only the specific pair, not all payloads.Report results per-target (assembly vs each payload) so the user sees which specific payload has issues.
Each target in the per-target loop re-enters THIS decision tree as if it were a fresh validation request — the tree's tier selection, spot-check threshold, and approval gate apply per-target based on that target's prim count.
Why NOT re-compose
Opening the full composed stage with all payloads loaded for validation after decompose:
Defeats the purpose of decomposition (cost is the same as the original).
Produces per-prim findings attributed to composed paths that don't map cleanly to individual payload files.
Prevents parallel validation of independent payloads.
Triggers the same cost gate the user already approved once (double-prompting).
LoadRules Behavior With the Asset Validator
The Asset Validator's ComplianceChecker opens a new stage from
the input's root layer with default LoadAll semantics. The original stage's
load rules (e.g. LoadNone) are discarded.
StagePopulationMask IS preserved — if the input stage was opened with
Usd.Stage.OpenMasked(), the mask carries through to the validator's internal stage.
This is observable behaviour across current AV versions; do not assume future releases will behave the same. Probe the AV API/version when possible.
Consequences
Passing a
LoadNonestage to the AV is equivalent to passing aLoadAllstage.All payload content will be loaded and traversed regardless of the load predicate.
Usd.PrimRange.Stage(stage, Usd.TraverseInstanceProxies())visits everything loaded.Elapsed time and findings will reflect the full composed stage, not the skeleton.
What works
Usd.Stage.OpenMasked()— physically excludes prims from the stage's view. The AV preserves the population mask, so masked prims remain invisible to checkers.Opening each payload file standalone (preferred — see "Validation Distribution" above).
What does NOT work
Usd.Stage.Open(root, Usd.Stage.LoadNone)— load rules are discarded by AV.stage.Load(specific_path)afterLoadNone— same problem, AV re-opens from root.Any load-state scoping strategy that relies on
StageLoadRulesbeing preserved.
Per-Rule Timeout Pattern
For stages with very high mesh/prototype counts where total validation would exceed the time budget. Run each category or rule in its own subprocess with an explicit budget so a single slow checker does not consume the whole pass.
import subprocess, json, sys
from omni.asset_validator import CategoryRuleRegistry, ValidationEngine
from pxr import Usd
def validate_one_rule(stage_path, category, rule_name, per_rule_budget_s):
registry = CategoryRuleRegistry()
rule = next(
rule for rule in registry.get_rules(category) if rule.__name__ == rule_name
)
engine = ValidationEngine(init_rules=False)
engine.enable_rule(rule)
stage = Usd.Stage.Open(stage_path)
results = engine.validate(stage)
return list(results.issues())
# Driver:
RULES = [
("Geometry", "ManifoldChecker"),
("Geometry", "WeldChecker"),
]
results = {}
for category, rule_name in RULES:
try:
out = subprocess.run(
[sys.executable, __file__, stage_path, category, rule_name],
timeout=per_rule_budget_s, capture_output=True, check=True,
)
results[f"{category}.{rule_name}"] = json.loads(out.stdout)
except subprocess.TimeoutExpired:
results[f"{category}.{rule_name}"] = {
"status": "timed-out",
"budget_s": per_rule_budget_s,
}When to use: >30K prototype meshes, very large summary_counts.mesh_count,
suspected single-rule hang, or iterating on one rule without re-running others.
For small/medium stages, use the standard tier plan via so-run-validators.
Output — Validation Plan JSON
{
"tier1": {
"scope": "full_stage",
"validators": ["printStats", "countVertices", "rtxMeshCount", "..."]
},
"tier2": {
"scope": "per_asset",
"assets": ["path/to/A.geom.usd", "path/to/B.geom.usd"],
"validators": ["meshCleanup", "optimizePrimvars", "..."]
},
"tier3": {
"scope": "targeted",
"tasks": [
{ "validator": "findOccludedMeshes", "targets": [["CabinetA", "PipeB"]] },
{ "validator": "deduplicateGeometry", "targets": ["ChairA", "ChairB"] }
]
},
"spot_checks": {
"scope": "masked_stage_spot_check",
"sampled_paths": ["</Root/Prototype_A>", "</Root/Mechanical/PipeFamily_01>"],
"mesh_coverage_percent": 28.4,
"evidence_scope": "sample"
},
"skip": ["list of unflagged assets - no deep validation planned"],
"estimated_time": "fast | minutes | long"
}This plan is passed to so-run-validators (executor) by usd-validation-runner (router).
Hard Rules
Never run all validators on all assets by default.
Never run Tier 3 without structural evidence from the assessment.
Always ask before Tier 3 cross-component checks.
Never start a performance workflow with a full default AV sweep.
Prefer masked-stage spot checks over dropping validation when full-stage is too expensive.
Always report what was skipped and why — the user may override.
Duration Hints (typical: ~100K prims, ~200K meshes)
| Scope | Expected |
|---|---|
| Tier 1 (full stage) | ~5 min |
| Tier 2 (per flagged asset) | ~30 min |
| Tier 3 (cross-component) | hours — always confirm |
| Structural validators only | ~2 min |
| Masked-stage spot check | ~5-10 min |
Prerequisites
Structure assessment report (specifically
flagged_assetsandvalidation_scope).User time/resource budget.
Access to validator names in the installed runtime.
Limitations
Scope quality depends on the structure assessment; weak evidence stays visible.
Tier cost estimates are defaults — they scale with scene size.
SO validator names must match the installed runtime.
Troubleshooting
No assets flagged → Tier 1 only, ask before expanding.
Tier 3 requested without evidence → return to
usd-structure-assessment.Named validator unavailable → record gap, choose nearest supported source.
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
The author says: Orchestrator skill. Downstream phases may require Kit, Scene Optimizer, Asset Validator, USD Python, writable output paths, and omniverse:// authentication selected by setup-usd-performance-tuning.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Omniverse
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/nvidia/skills/omniverse-usd-performance-tuning · commit d420d13
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (written by AutoGineer)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-usd-performance-tuning.zip