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://mp-staging.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-structure-assessment/README.md
USD Structure Assessment
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
When to Use
Use when scoping USD structural validation; do not use for fixes or validator execution.
Instructions
Confirm the target asset, artifact, or user intent and check the prerequisites listed below.
Read only the referenced files needed for the current phase, failure mode, or output contract.
Follow the workflow, rules, and safety gates in this reference before invoking downstream references or shell commands.
Return the result using the Output Format section and name any blocked prerequisite or unresolved user decision.
Output Format
Return a concise status or report that names the input, selected runtime or evidence source, actions planned or performed, artifacts written, blockers, and the next validation or user-decision step. When a schema or template is referenced below, conform to that contract.
Purpose
Use this reference as the first analytical step after performance triage to combine composition, layer, instancing, variant/payload, and spatial heuristics into one validation-scope assessment. Do not use it to run geometry validators or apply fixes.
For detailed guidance on any subtopic, consult these references:
references/composition-audit.md- composition audit checklist + findings taxonomy + audit-report.schema.json mapping.references/layer-health.md- layer-health checks, file-format guidance, asset-path hygiene, flattening policy.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/instancing-readiness/references/instancing-tradeoffs.md- instancing/dedupe decision tree, merge safety, findings taxonomy.skills/omniverse-usd-performance-tuning/references/usd-structure-assessment/references/usd-edit-target-planner/references/variants-payloads.md- payload strategy, variant strategy, output policy, stop conditions.
This reference consolidates the operational checklists into a single pass and adds spatial heuristics that the individual references do not cover.
Prerequisites
Stage path and resolver context from performance triage.
Access to layer metadata, composition arcs, authored extents, and asset paths.
User goal for diagnosis, restructuring, or optimization handoff.
Pre-flight Checklist
Before producing the SA report, re-read and confirm:
[ ]
scripts/usd-structure-assessment-report.schema.json— required fields and strict/permissive boundaries.[ ]
references/asset-structure-principles.md— asset vs layer vs composition arc distinctions.[ ] SA is structural only — no geometry arrays (points, faceVertexCounts).
mesh_countcomes from prim-type traversal, not array reads.[ ] Spatial heuristics use authored
extentsHintonly. Skip if absent.
Limitations
Phase 1 is purely structural: metadata, composition arcs, prim traversal. No geometry arrays (points, faceVertexCounts) are read. No renderer, viewport, or BBoxCache computation. Mesh-level stats (triangle counts, density) are deferred to Phase 2c validators (SO analysis mode).
Phase 2 heuristics flag validation candidates; they do not justify operations by themselves.
Outlier detection (§2.1) uses authored
extentsHintattributes when present. If extents are not authored, SA cannot flag spatial outliers — Phase 2c validators (countVertices/MeshDensityChecker) catch density outliers downstream with SO loaded.
Troubleshooting
If assets, layers, and composition arcs are conflated, re-read the reference docs before estimating scope.
If duplicate hierarchy patterns appear, run
usd-hierarchy-dedupe-candidatesbefore recommending mesh-level deduplication.
References
Before running, read:
references/asset-structure-principles.md— asset vs layer vs composition arc; the interface/payload/geometry pattern.references/factory-level-structuring.md— asset boundaries, kind hierarchy, the seven-step structuring pattern.references/optimization-tradeoffs.md— three-phase pipeline, packaging strategies.
If you have network access, prefer the live URLs (noted in each reference file).
Phase 1: Structure Analysis (no geometry load)
These checks run without a Kit viewport, GPU, or renderer. SA opens the stage
with Usd.Stage.Open(path) (default load rules) and traverses the composed
prim hierarchy. No geometry arrays (points, faceVertexCounts, normals) are
read — SA only inspects metadata, composition arcs, prim types, and authored
attributes like extentsHint.
Mesh-level statistics (triangle counts, vertex density) are not SA's job.
Those are produced by Phase 2c validators (countVertices, MeshDensityChecker)
which run Scene Optimizer in analysis mode.
1.1 Composition inventory
Root layer path, default prim, up axis, meters per unit.
Total layer count, sublayer stack.
Count authored composition list-op items by type where the Python API exposes them: references, payloads, inherits, specializes, variants. For references and payloads, read the authored list-op metadata and count list items; do not depend on
PrimIndex.GetNodeRange(), which is not exposed by all USD 25.11 Python builds. If a runtime only supports prim-level boolean checks, report the count as prims-with-authored-arcs and record that limitation incomposition.counting_method.Distinguish between assets, layers, and composition arcs (see reference docs).
Populate
asset_physical_context:metersPerUnit,upAxis,scale_hintfrom stage metadata (zero cost).mesh_countfrom prim-type traversal (count prims of typeUsdGeom.Mesh— no geometry arrays needed). These fields are consumed by downstream operations (seeso-run-operations/references/units-and-tolerances.md).
1.2 Asset inventory
Group layers into assets. An asset is typically a directory containing:
Interface layer (e.g.,
Robot.usd) — lightweight, always loaded.Payload layer (e.g.,
Robot_payload.usd) — deferred loading wrapper.Geometry/content layer (e.g.,
Robot.geom.usd) — heavy mesh data.
Report:
Total unique assets (not layers, not composition arcs).
Assets with full interface/payload/geometry structure.
Assets missing expected layers (no payload, no interface, geometry-only).
The referenced asset manifest: list of geometry layer paths for downstream per-asset work.
1.3 Layer health
File formats (usdc vs usda vs usd).
Flag large
.usdadata files (>100KB) — should be.usdc.Flag tiny layers (<500B) — accumulated automation artifacts?
Flag anonymous or session layers.
Total size on disk.
1.4 Instancing analysis
Count instanceable prims and active instances.
Count prototypes.
Identify repeated references to the same asset — these are instancing candidates.
Compute instance ratio: instances / total referenceable prims.
1.5 Variant and payload state
Count variant sets and selected variants.
Identify unloaded payloads.
Flag variant-dependent geometry or material differences.
1.6 Kind hierarchy
Check that kind metadata is present and consistent (assembly → component → subcomponent).
Flag prims with geometry but no kind assignment.
Flag kind assignments that don't match the hierarchy (e.g., a component inside a component).
Phase 2: Structural Heuristics (metadata only, narrows validation scope)
These checks use authored extent metadata (extentsHint) and structural
patterns to identify assets that likely need deep validation. They do not
load geometry arrays. If extentsHint is not authored on a prim, SA skips
spatial heuristics for that prim — Phase 2c validators catch it downstream.
2.1 Outlier detection
Using extentsHint or authored extent attributes (when present):
Flag assets where a single mesh's authored extent spans a large fraction of the overall stage extent. This suggests fused architectural geometry that should be split into separate assets (e.g., floor + walls + ceiling as one mesh).
Flag assets with authored extents disproportionately small relative to their subtree depth or sibling count — possible over-tessellation candidates.
If extents are not authored, SA cannot flag spatial outliers. This is expected for many real-world assets. Phase 2c validators (
countVertices/MeshDensityChecker) provide the density signal when SO is loaded.
2.2 Containment detection
Using authored extent overlap analysis (only when extentsHint is present):
Identify asset pairs where one asset's authored extent is fully enclosed by another's. These are candidates for occlusion testing — the inner asset may be invisible from the outside (e.g., piping inside a cabinet).
Check enclosure opacity: For each containment pair, inspect the enclosing asset's bound material for transparency signals:
UsdPreviewSurface:
opacity< 1.0 oropacityThresholdpresentMDL: glass/transmission shader,
iorparameter, alpha-blend modeAny material with
opacity,transmission, oriorinputs Setenclosure_opaque: truewhen the enclosing material is fully opaque. Setenclosure_opaque: falsewhen any transparency signal is detected. This is a metadata read (material binding → shader attributes) — no geometry access needed.
Asset type context: Containment is most actionable for equipment, machines, vehicles, cabinets, housings, enclosures, pumps, motors, compressors — sealed assemblies with opaque shells. Flag the asset type when identifiable from prim names or kind metadata.
Only flag pairs, don't confirm occlusion — that requires expensive geometry analysis via
findOccludedMeshesin Phase 4.Skip this check for prims without authored extents.
2.3 Repetition detection
Identify assets with similar authored extent dimensions that reference different source layers (when extentsHint is authored). These may be near-duplicates that could share a common source via deduplication.
Distinguish from intentional instancing (same source, already shared).
Treat repeated CAD/BIM assembly names as a deep-tree signal, not just a root-level signal. Clean root children or clean depth-2 groups do not rule out duplicated modules nested under floor, discipline, category, or linked model containers.
If the stage is monolithic, has no references/payloads, has low instance count, or contains repeated CAD/BIM assembly names, invoke
usd-hierarchy-dedupe-candidatesfor subtree-hash candidate detection before recommending mesh-level deduplication.
2.4 Hierarchy depth analysis
Flag deep nesting without kind boundaries (many Xform ancestors before reaching a component or assembly kind).
Flag flat hierarchies where a single prim has hundreds of direct children with geometry — may benefit from grouping into subcomponents.
2.5 Prim count and mesh sizing interpretation
Use summary_counts, extents, and hierarchy context to explain scale before
recommending a downstream validation or optimization path:
Very large stages, including million-prim scenes, are not automatically mesh-merge candidates. First decide whether the count comes from duplicated hierarchy, over-fragmented composition, missing instancing, payload policy, or genuinely distinct authored content.
Prefer prototype-local or asset-local cleanup before whole-stage merging. Local work preserves references, variants, and reviewability, and it is easier to validate before the optimized assets are remapped into the assembly.
Treat entire-prototype or whole-assembly merging as a high-friction option. Before recommending it, surface overlap risk, shared hierarchy semantics, reference/payload rewrites, material and primvar preservation, important metadata, and the user's intent for future selective loading.
Small meshes are not always bad. They may be visible details, engineering fasteners, collision markers, or source-of-truth geometry. Keep, instance, or delete them based on visibility and user intent; do not assume removal is the right fix just because the mesh is small.
Large overlapping meshes can be expensive for ray tracing and selection even when prim count looks reasonable. Flag them as split/cull/occlusion-analysis candidates, especially when a single mesh spans rooms, floors, disciplines, or enclosing shells.
Any recommendation that may drop geometry, collapse hierarchy, or discard authored attrs/metadata requires explicit user confirmation downstream.
2.6 Duplicate subtree detection
Identify subtrees that are structurally identical and positioned at the same transform. This is common in BIM/Revit exports where linked models are included multiple times.
Check:
Scan multiple hierarchy depths. For CAD/BIM trees, normalize sibling names at each candidate depth by stripping numeric suffixes, generated copy suffixes, and export IDs before grouping. A duplicate pattern at depth 3+ is still a hierarchy-dedupe candidate even if the scene root and depth-2 containers look unique.
Group candidate roots by normalized sibling-name pattern and by subtree hash.
For each group with >1 member, compare:
Child names (are they identical?).
Transforms (are they all identity or all the same?).
Instance counts and prototype usage (same count per copy?).
If copies are structurally identical at the same transform, they are export duplicates — the scene contains N× the data it should.
If the shallow scan is clean but deep normalized names suggest repeated modules, report
hierarchy_dedupe.recommended: truewith a reason such as "needs deeper scan" and invokeusd-hierarchy-dedupe-candidates; do not set it tofalsebased only on root-level or depth-2 evidence.
Report:
Which discipline/subtree groups have duplicates.
Maximum depth scanned and whether repeated names only appear at depth 3+.
How many copies exist vs how many are needed (1).
Total redundant prims and the percentage of the scene they represent.
Whether the copies reference the same prototypes (shared) or generated separate prototypes (unshared — each copy inflates the prototype pool).
This is distinct from instancing: instancing shares geometry within a hierarchy, while duplicate subtrees are entire hierarchy copies that should not exist at all.
Recommendation:
Flag as "export duplication — keep one copy per discipline, deactivate rest."
If transforms differ, it may be intentional (separate building wings) — ask the user before deactivating.
If transforms are identical (all at origin), it is almost certainly an export artifact.
Quantify the saving: removing N-1 copies of each group eliminates (N-1)/N of the scene's prims and associated prototypes.
2.7 Asset boundary identification
For monolithic stages, identify natural grouping levels that could become separate assets. Present candidates to the user rather than prescribing a specific level.
Analyze the existing hierarchy for repeating patterns:
Disciplines (HVAC, Architectural, Structural, Electrical, Plumbing, Facades)
Spatial units (Buildings, Wings/Blocks, Floors, Rooms)
Categories (Walls, Doors, Ducts, Fittings, Equipment)
Report the hierarchy as a tree with prim counts at each level:
Scene (123K prims)
├── Discipline (×7): Architectural, HVAC, Plumbing, Electrical, Structural, Facades, Site
│ ├── Floor (×8): L1, L2, L3, L4, L5, M1, Parking, R1
│ │ └── Category: Walls, Ducts, Fittings, Equipment...Ask the user: "Which level should be the asset boundary for selective loading and optimization?" Common choices:
Per-floor — enables floor-by-floor loading. Good for construction/FM.
Per-discipline-per-floor — enables "show me L3 HVAC only." Most granular.
Per-discipline — enables discipline toggling. Simplest extraction.
The answer drives downstream structuring: each identified asset boundary becomes a candidate for extraction into a separate layer (payload or reference).
Selective loading is a separate decision from deduplication. A stage can be
well-instanced and still be a poor delivery package if it has payload_count: 0
and clear floor, discipline, linked-model, building-wing, or category
boundaries. In that case:
Set
asset_boundary_suggestions.user_choice_requiredtotrue.Route to
restructure-decisioneven when mesh optimization can proceed "as-is".Ask whether the user wants loadable sub-assets (for example per-floor or per-discipline-per-floor payloads), wants to optimize the monolith as-is, or wants a diagnosis-only exit.
Do not record
choice: optimize-as-iswithout presenting that selective loading choice to the user.
Hash-backed boundary refinement
When usd-hierarchy-dedupe-candidates has produced a read-only candidate report
for the same stage, refine the boundary suggestions above using its hash output.
Subtree hashes identify structurally identical (or near-identical) sub-hierarchies;
preferring cut points that align with those hashes creates immediate dedupe wins
when the boundaries are materialized.
Augment the candidate tree from the previous step with hash-backed signal:
For each candidate boundary level (e.g. per-floor, per-discipline-per-floor), count how many of the children at that level have matching subtree hashes.
Promote boundaries where multiple children share a hash - extracting at that level produces fewer, more reusable prototypes.
Demote boundaries that cut across hash-equal subtrees - extracting there fragments what could have been a single shared prototype.
If usd-hierarchy-dedupe-candidates has not been run yet and the stage is
monolithic, recommend running it before finalizing the boundary plan. The
combined SA + dedupe-candidates output is what restructure-decision (Phase 2e
in the tuning workflow) consumes when asking the user to confirm.
2.8 Prototype library assessment
For scenes with explicit prototypes:
Identify the authored prototype hierarchy path (e.g.,
/Root/Prototypes/).Count prototypes and assess whether they should be extracted into a shared library layer (per the VFI "component + subcomponent library packaging" pattern).
Assess whether the prototype pool is inflated by duplicate subtrees (see 2.6).
Extraction recommendation:
Prototype library as shared layer — all prototype definitions in one referenced file, assemblies reference them. Reduces duplication if multiple stages share the same component library.
Keep inline — for single-file delivery where composition overhead should be minimized.
Output
Emit a structure assessment report containing:
{
"stage": {
"identifier": "path/to/stage.usd",
"rootLayer": "path/to/stage.usd",
"metersPerUnit": 0.01,
"upAxis": "Z",
"scale_hint": "centimeters"
},
"asset_physical_context": {
"metersPerUnit": 0.01,
"upAxis": "Z",
"scale_hint": "centimeters",
"mesh_count": 18200
},
"summary_counts": {
"prim_count": N,
"mesh_count": N,
"material_count": N,
"prototype_count": N,
"instance_count": N,
"reference_count": N,
"payload_count": N
},
"composition": {
"layers": N,
"references": N,
"payloads": N,
"counting_method": "authored_list_op_items | prims_with_authored_arcs",
...
},
"assets": {
"total": N,
"well_structured": N,
"manifest": ["path/to/A.geom.usd", ...],
},
"layer_health": { "large_usda": [...], "tiny": N, ... },
"instancing": { "instances": N, "prototypes": N, "candidates": N, "ratio": 0.0 },
"hierarchy_dedupe": {
"recommended": true,
"reason": "monolithic stage with repeated assembly names and no instances",
"top_candidates": [
{ "path_pattern": "...", "subtree_prims": 0, "copies": 0, "estimated_prim_savings": 0 }
]
},
"scale_assessment": {
"prim_count_interpretation": "structural_reuse_needed | local_cleanup_first | acceptable",
"mesh_sizing_flags": ["small_mesh_detail", "large_overlap_candidate"],
"merge_posture": "prototype_local_preferred | whole_assembly_requires_user_confirmation"
},
"asset_boundary_suggestions": {
"candidate_levels": [
{ "level": "per-floor", "child_count": 8, "hash_matched_groups": 0, "promoted": false },
{ "level": "per-discipline-per-floor", "child_count": 56, "hash_matched_groups": 4, "promoted": true,
"reason": "4 hash-matched assembly groups align with this cut - immediate dedupe wins on extraction" }
],
"user_choice_required": true,
"choice_reason": "payload_count is 0 and clear spatial/discipline boundaries exist; selective loading is a user decision even if geometry reuse is already strong",
"consumed_by": "restructure-decision (Phase 2e)"
},
"flagged_assets": [
{ "asset": "...", "reason": "outlier_extent", "details": "..." },
{ "asset": "...", "reason": "containment", "pair": "...", "enclosure_opaque": true, "details": "..." },
{ "asset": "...", "reason": "repetition", "similar_to": "...", "details": "..." },
],
"validation_scope": {
"per_asset": ["list of assets needing individual validation"],
"cross_component_pairs": ["list of (A,B) pairs needing spatial analysis"],
"skip": ["list of assets with no flags — low priority for deep validation"],
},
"phase_recommendation": "structuring | optimization | already_optimized"
}The validation_scope section feeds directly into so-run-validators — it tells
the agent which assets to validate and which to skip.
The summary_counts section is the compact handoff consumed by
usd-validation-runner and skills/omniverse-usd-performance-tuning/references/usd-validation-runner/references/validation-scoping.md: it tells the
validator router whether the asset is monolithic, prototype-heavy, already
instanced, or worth restructuring before expensive validators run.
For reference_count and payload_count, prefer authored list-op item counts.
If the selected USD Python runtime can only produce prim-level booleans, use
the prims-with-authored-arcs count and write
composition.counting_method: "prims_with_authored_arcs" so downstream readers
do not mistake it for a total arc-item count.
The phase_recommendation indicates which phase of the three-phase pipeline
(extraction → structuring → optimization) the scene is currently in, based on
the structural evidence. This guides the edit-target planner and Scene Optimizer
handoff decisions.
If hierarchy_dedupe.recommended is true, run
usd-hierarchy-dedupe-candidates before restructure-decision or mesh-level
so-run-operations. That skill is read-only and decides whether repeated
subtrees should be turned into shared prototype/reference assets before any
mesh-level dedupe.
Rules
Do not read geometry arrays (points, faceVertexCounts, normals). SA is structural only. Mesh-level stats belong to Phase 2c validators.
Do not run geometry validators in this reference; hand validation scope to
usd-validation-runner/so-run-validators.Do not recommend operations based on structural heuristics alone — heuristics flag candidates for validation, not confirmed issues.
Report
summary_countsexplicitly. Asset counts are the primary scope metric; layer counts and arc counts are supporting evidence.Report
scale_assessmentwhen prim count, mesh size, or merge strategy affects the validation or optimization path.Do not set
hierarchy_dedupe.recommended: falsefrom only a root-child or depth-2 name scan on CAD/BIM exports. Deep repeated names require a deeper normalized scan orusd-hierarchy-dedupe-candidatesevidence.If
payload_countis 0 and clear asset boundaries exist, require arestructure-decisionselective-loading choice even when instancing is strong and the mesh-optimization path is otherwise "optimize as-is".Use the reference docs to distinguish assets from layers from arcs — conflating them leads to incorrect scope estimates.
Spatial heuristics (§2.1, §2.2, §2.3) use only authored
extentsHintattributes. If extents are not authored, skip the spatial check for that prim — do not compute bounds to fill the gap.
Tools for asset extraction
The isaacsim.asset.transformer extension provides a rule-based pipeline
framework for transforming USD assets. It can be configured with custom rules
to perform extraction:
Extract subtrees into separate layers
Create interface/payload structure
Collect and remap external assets
Re-route references after extraction
The framework handles: flattening, asset collection, path remapping, and
sequential rule execution. Custom rules implement RuleInterface.process_rule()
to perform specific extraction logic.
For the actual extraction, also consider plain USD Python API:
Sdf.Layer.CreateNew()+ copy prim specsSdf.CopySpec()/ layer export for subtree extractionReference/payload arc insertion on the assembly layer
UsdUtils.ModifyAssetPaths()for path remapping after restructuring
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