Update OVRTX 0.4 to 0.5
Port an existing application with the minimum changes required by the 0.5
public contract. Do not adopt unrelated 0.5 features or rewrite working code.
When to Use
Use this skill when upgrading an existing Python, C, or C++ application from
OVRTX 0.4.x to 0.5.x. It also covers authored sensor USD and attached-mode
applications that must upgrade from OVStage 0.1.x to the matching 0.2.x release.
Do not use it for applications starting on OVRTX 0.3.x or earlier; apply the
corresponding earlier-version migration skill first.
Inputs
Resolve these before editing:
- The exact source and target OVRTX versions and package locations.
- Whether the application uses Python, C/C++, authored USD, or a combination.
- Whether it uses attached OVStage and directly consumes OVStage data.
- The source, build, deployment, and generated-asset files in migration scope.
- Whether 0.4-equivalent rendered output must be preserved.
Prerequisites
- Access to the application's current source, package pins, build configuration,
authored USD, and accepted output baselines when visual compatibility matters.
- Matching OVRTX 0.5.x and OVStage 0.2.x packages from the same release train for
attached mode.
- Read the authoritative sources below before changing APIs or data contracts.
- Runtime validation requires the GPU, driver, network, and unsandboxed execution
prerequisites documented in
../../AGENTS.md.
Scope
- Source: OVRTX 0.4.x, including 0.4.1, with optional OVStage 0.1.x.
- Target: OVRTX 0.5.x and, when attached mode is used, the matching OVStage
0.2.x package from the same release train.
- Languages: Python, C, C++, and authored USD used by those applications.
- Preserve application behavior unless the user explicitly wants the new 0.5
defaults.
This skill includes only changes that can require user source, build, deployment,
or authored-USD changes. Renderer bug fixes, performance work, tests, CI,
packaging reductions, documentation-only work, and optional new features are not
migration steps.
Authoritative Sources
Before editing, read:
- The
[0.5.0] migration bullets in
../../CHANGELOG.md.
- The installed 0.5 headers and Python signatures. They override release-note
drafts and internal inventories.
../../include/ovrtx/ovrtx_types.h,
../../include/ovrtx/ovrtx_config.h,
and ../reading-render-output/SKILL.md
when output or tensor APIs are present.
../../../../ovstage/public/CHANGELOG.md
when the application uses attached OVStage, OVStage population, or direct
OVStage reads/writes.
Do not infer a migration from a ticket title alone. Confirm that the change is
present in the target package and absent from 0.4.
Migration-Relevant Inventory
| Area |
Inventory evidence |
Applies when |
| Full RenderVar path identity |
OMPE-94127 |
The app fetches, indexes, logs, or compares render outputs. |
| Python DLPack surface |
OMPE-102110, OMPE-104349, OMPE-105119, OMPE-105460 |
The app imports ManagedDLTensor, uses .tensor, passes raw DLTensor, or inspects mapping metadata/lifetimes. |
| Vulkan-only Windows package |
OMPE-103728 |
The app selects DX12/Vulkan, has DX12 interop, or ships a pre-0.5 C binary. |
| Sensor schema/model versioning |
OMPE-74104, OMPE-94528 through OMPE-94535 |
The app authors acoustic, IDS, lidar, or radar sensors. |
| GenericModelOutput removal |
OMPE-107766 |
USD requests sourceName = "GenericModelOutput" or code imports the bundled GMO decoder. |
| Schema registration order |
OMPE-94125, OMPE-103596 |
OVRTX and OVStage or another OpenUSD runtime share a process. |
| One renderer per attached stage |
OMPE-105429 |
The app attaches one OVStage instance to more than one live OVRTX renderer. |
| Reset-stack Boolean dtype |
OMPE-103960 |
Low-level code reads/writes omni:resetXformStack and assumes kDLUInt. |
| OVStage population layouts |
OMPE-102552 |
Attached applications directly consume assets, path expressions, extents, or affected semantics. |
| OVStage loader packaging |
OMPE-106739 |
A C/C++ app manually links or deploys OVStage rather than using its package CMake config. |
| Other OVStage 0.2 public breaks |
Paired-package changelog; not fully represented in the OVRTX Jira inventory |
Attached applications use OVStage metadata, raw reads/maps, Python resource objects, physics schema fallbacks, or permissive 0.1 argument coercions. |
| Changed image defaults |
OMPE-102343, OMPE-103674, OMPE-105838 |
The app requires output equivalent to 0.4 and relied on an omitted setting. |
Instructions
- Establish the real baseline. Locate OVRTX and OVStage version pins,
package roots, copied headers/libraries, lock files, and generated USD. Record
whether the source is 0.4.0 or 0.4.1 and whether the application is Python,
C/C++, or mixed.
- Update packages together. Pin OVRTX to the requested 0.5 build. If the
app uses attached mode, pin the matching OVStage 0.2 build from the same
release train. Do not mix their bundled OpenUSD runtimes.
- Run the audit searches below before editing. Apply a migration only when
its search matches application code, build/deployment logic, or authored
USD. Do not turn every conditional item into a source change.
- Migrate RenderVar identity first. It affects nearly every output-reading
application and makes later tensor tests address the correct output.
- Migrate Python tensor handling. Remove
ManagedDLTensor dependencies,
consume mappings through DLPack, replace raw DLTensor inputs, and fix
device/lifetime assumptions.
- Migrate removed configuration and outputs. Remove Windows backend
selection and replace
GenericModelOutput where used.
- Migrate sensor assets. Resolve each applied sensor schema version and
update
omni:sensor:modelVersion; do not use the deprecation escape hatch as
the permanent migration.
- Fix initialization order. Register OVRTX schema paths before OpenUSD is
loaded and before OVStage performs its first population.
- Apply OVStage 0.2 data-contract migrations only to code that directly
reads or writes the affected representations. Ordinary OVRTX render-output
consumers do not need these edits.
- Decide whether to preserve 0.4 rendering defaults. Author explicit old
values only when image compatibility is required; otherwise accept and test
the new 0.5 defaults.
- Rebuild C/C++ applications. Do not reuse a 0.4 binary with 0.5 headers or
runtime libraries. Rebuild all translation units that include OVRTX or OVX
public headers.
- Validate representative workflows. Test renderer creation, scene
population, one step, every consumed RenderVar, sensor output parsing,
teardown, and Windows Vulkan/CUDA interop when applicable. Compare images or
tensors against the application's accepted 0.4 baseline when behavior must
remain stable.
Audit Searches and Required Actions
1. RenderVar path identity
Search Python for frame.render_vars, RenderVarOutput.name,
MappedRenderVar.name, and dictionaries keyed by AOV/source names such as
LdrColor, HdrColor, DepthSD, or PointCloud.
- Index
frame.render_vars by the full authored RenderVar prim path, not the
prim name and not sourceName. A unique prim name is insufficient.
- Replace
RenderVarOutput.name and MappedRenderVar.name with
render_var_path.
- Use
source_name only when code needs the AOV kind; do not use it as output
identity.
Search C/C++ for render_var_name and ovrtx_render_var_output_t.
- Replace
ovrtx_render_var_output_t.render_var_name with render_var_path.
- Use the new
source_name and source_type fields only for classification.
- Treat
ovrtx_render_var_t.name as a full RenderVar prim path.
- Recompile because the public result structure layout changed.
Source (Python): ../../examples/python/minimal/main.py snippet read-render-output.
Source (C lookup): ../../examples/c/minimal/main.cpp snippet find-output-helper.
2. Python DLPack and mapping objects
Search for ManagedDLTensor, MappedRenderVar.tensor, .numpy(),
.to_bytes(), .raw_dltensor, isinstance checks against the old wrapper,
direct DLTensor(...) inputs, and comparisons of .device with
ovrtx.Device.
- Remove public imports and direct construction of
ManagedDLTensor.
- For a single-tensor RenderVar, pass the
MappedRenderVar directly to a
DLPack consumer. For composite outputs, select a named RenderVarTensor; use
params for named parameters.
- Replace
.tensor.numpy() or .numpy() with the consuming library's
from_dlpack. Take a copy through that library when independent storage is
required.
- A CPU-only consumer cannot read a CUDA pointer. Map to CPU or use a
CUDA-capable DLPack consumer such as Warp, PyTorch, or CuPy.
device is now a DLDevice. Update comparisons to inspect its DLPack device
type and device id rather than comparing it with OVRTX's mapping-request
Device enum.
- Do not inspect mapping properties after
unmap() or context exit. Capture
metadata first, or retain a tensor/param view created while mapped.
- Renderer tensor inputs must implement
__dlpack__; raw ctypes DLTensor
structures are no longer accepted by Python write, bind, map, or read-
destination paths.
- Deprecated attribute reads with
dest= now return the exact destination
object. Remove assumptions that the result is a separate wrapper.
- A supplied read destination must have zero byte offset and C-contiguous
layout.
Source: ../reading-render-output/SKILL.md.
3. Windows backend selection
Search for use_vulkan, OVRTX_CONFIG_USE_VULKAN,
ovrtx_config_entry_use_vulkan, DX12 interop, and backend-dependent deployment
branches.
- Remove the retired configuration field/key/helper.
- Treat Windows OVRTX 0.5 as Vulkan-only.
- Port DX12-specific graphics interop to Vulkan or disable that integration.
- Recompile C/C++; passing the retired numeric key returns
OVRTX_API_ERROR.
4. Sensor versioning and GenericModelOutput
Search USD generators and assets for OmniSensorGeneric,
omni:sensor:modelVersion, dotted versions such as 0.0.0,
GenericModelOutput, and imports from the bundled GMO Python extension.
- The applied
OmniSensorGeneric*API_N suffix selects schema version N;
unsuffixed schemas select version 1.
- Set
omni:sensor:modelVersion to latest or a supported positive integer
string for that schema. Dotted semantic versions are invalid.
- Replace
sourceName = "GenericModelOutput" with the composite PointCloud
RenderVar and author the channels the application consumes. Update parsing to
read named tensors and params rather than a packed GMO buffer.
- If a separate consumer still needs packed GMO decoding, depend explicitly on
the standalone
generic-model-output package; OVRTX no longer bundles it.
- Prefer a supported sensor version.
sensors_allowed_deprecation_base is a
temporary compatibility gate and must exactly match the running OVRTX version,
so using it creates another required edit at the next upgrade.
Source (lidar): ../configuring-lidar-sensors/SKILL.md.
Source (radar): ../configuring-radar-sensors/SKILL.md.
5. Schema registration and reset-stack dtype
Search initialization code for ovrtx_register_schema_paths, creation of an
OVStage instance, the first population call, and any earlier import/load of an
OpenUSD runtime. Also find every attach_ovstage call and map attached stage
instances to live renderers.
- In C/C++, call
ovrtx_register_schema_paths() before OpenUSD loads and before
OVStage's first population. Registration now also makes the OVRTX schema
families visible to attached OVStage population.
- In Python, call
ovrtx.register_schema_paths() before creating/populating an
OVStage or importing another OpenUSD runtime. Merely importing ovrtx does
not register paths unless OVRTX_PXR_SCHEMA_AUTO_REGISTER=1 was set before
import.
- For a separate host OpenUSD runtime, enumerate/filter OVRTX plugin paths as
described by
ovrtx_get_usd_plugin_paths() and publish them before that
runtime opens its first stage.
- Do not attach one OVStage instance to multiple live OVRTX renderers. Give each
renderer its own stage, or detach the first renderer before attaching that
stage to another; 0.5 rejects simultaneous attachment.
Search low-level attribute code for omni:resetXformStack with kDLUInt.
Change its declared dtype to {kDLBool, 8, 1}. Calls through
ovrtx_set_reset_xform_stack() keep the same bool* signature and need no
source edit.
6. Attached OVStage 0.2 data contracts
Search direct OVStage readers/writers and population consumers for
ASSET_STRING, ASSET_PATH_ID, PATH_EXPRESSION_STRING, extent, and switches
over attribute semantics.
- Assets are
(authored, resolved) token-id pairs with
ASSET_PATH_ID, {kDLUInt, 64, 2}. This applies to scalar and array assets;
empty values are zero pairs.
- Path expressions are interned
{kDLUInt, 64, 1} token ids, not UTF-8 byte
rows. Resolve them through the path dictionary; scalar versus array is
selected by is_array.
extent on UsdGeomImageable is one non-array {kDLFloat, 64, 6} value in
(min xyz, max xyz) order, not a two-element float3[].
- Update semantic switches: Curves/Points
normals report POINT; light and
shadow colors report VECTOR; finite-dome, NeRF, and NuRec size/crop/offset
attributes report VECTOR. Inspect the USD type when the original USD role
matters.
- If C/C++ deployment manually names OVStage libraries, ship and link the new
forwarding loader plus its runtime. Applications using the package CMake
targets and setup helper retain the stable target and need no source change.
Also audit the rest of the OVStage 0.2 public changelog. These changes are
outside the original OVRTX Jira inventory but can still break an attached OVRTX
0.4 application when its OVStage dependency moves from 0.1 to 0.2:
- Stage metadata moved from
/__ovstage_population_stage_info__ to /, and
its columns use the usd-metadata: prefix.
ovstage_population_stage_info_path() was removed. Update stored paths,
query filters, and metadata column names.
- Fixed-size reads/maps now expose one data-row dimension and put tuple width
in
dtype.lanes. Update code that expects shapes such as (N, 3) or
(N, 4, 4). Fixed-size writes without an index map must supply exactly one
leading row per logical element rather than a flattened one-lane buffer.
- Populated USD bools now report
kDLBool, not kDLUInt. Update dtype switches
and assertions for every populated bool, not only omni:resetXformStack.
TIME_CODE and FRAME semantics are now reported for the corresponding
columns. Add those cases to exhaustive semantic switches and do not write a
conflicting role such as MATRIX to a frame4d column.
- OVStage no longer bundles PhysX, deformable, or Newton schema definitions.
Applications that depend on unauthored schema fallback properties must ship
their own definitions and register them with
ovstage_population_register_usd_schemas() before the first schema read.
- Python
PathDictionary.path_to_string(root_handle) now returns /, not an
empty string. Update root/sentinel tests that treated "" as the root.
- Keep each Python
ReadGroup alive while using arrays or DLPack views borrowed
from it; use its context manager and copy data that must outlive the group.
Do not construct a view from an unbound temporary group.
ReadGroup.array() is read-only. Replace attempts to mutate committed read
storage with a map or write operation.
- Caller-created Python path lists are now owned
PathList objects. Reuse or
explicitly release them; do not add a second manual release for the reference
the object already owns.
- Replace float/string spellings of integer fields with real integers; this
includes ordinals such as
5.0, indices, handles, tokens, masks, and enum
arguments. Use declared enum members, avoid negative population-domain masks,
and pass attribute names as str or tokens as int explicitly.
- If the app relied on OVStage's incidental console diagnostics, install a log
callback; the standalone runtime is silent by default.
7. Preserve 0.4 rendering defaults only when required
These are not compile failures. Add explicit settings only if the application
requires 0.4-equivalent images:
- Selection outlines changed from disabled to enabled by default. Set
selection_outline_enabled=false when the app uses selection groups but must
retain the old image.
- Multiple DomeLights changed from forced-single to enabled. Author
omni:rtx:scene:forceSingleDomeLight = true on each relevant RenderProduct to
retain the 0.4 single-DomeLight behavior.
- RTPT CFGPU camera jitter changed from disabled to enabled. Author
omni:rtx:rtpt:cfgpuCameraJitter = false when deterministic 0.4 sampling is
required.
If the application already authors any of these values explicitly, preserve its
authored choice; the default change requires no edit.
Limitations
- New optional features such as SPG stateful/raygen nodes, UV projectors,
decals, spectral rendering, Aftermath control, or DomeLight baking controls.
- Performance improvements, crash fixes, rendering correctness fixes, package
size reductions, tests, CI, or documentation-only tickets.
DepthSD: it is deprecated but not removed in 0.5. Record follow-up work if
desired; do not block this port on replacing it.
- Auto-applied Camera and RenderProduct RTX schemas: existing explicit schema
application remains valid and does not need removal.
- Strict validation of malformed times, config values, DLPack layouts, and null
RenderProduct paths. Fix matches found in application code, but do not add
compatibility workarounds for invalid 0.4 inputs.
- Any API that appeared and disappeared only during 0.5 development. Confirm
the 0.4 and final 0.5 shipped surfaces before adding a migration step.
Validation
- Python: import OVRTX 0.5 with no removed-symbol imports; run the narrowest
tests that create the renderer, populate the stage, step, and consume every
requested output on its real device.
- C/C++: cleanly rebuild and relink against the 0.5 package; run once with the
packaged runtime layout rather than relying only on header compilation.
- Sensors: instantiate every authored sensor, confirm no version or skipped-
output diagnostic, and validate PointCloud channel names, shapes, counts, and
units.
- Attached mode: populate through OVStage 0.2, advance the write floor, render a
committed ordinal, and exercise every directly consumed changed attribute.
- Behavior preservation: compare representative images/tensors with accepted
0.4 baselines after explicitly pinning only the defaults the app depends on.
Output Format
- List files changed, grouped by the migration areas above.
- State which audit areas did not apply and why.
- Call out authored-USD and deployment changes separately from source changes.
- Report exact build/test commands and runtime coverage.
- List any remaining deprecated-but-still-functional APIs as follow-up work,
not as completed migration.
Scripts
This skill has no scripts.
Troubleshooting
- If an audit search finds no match, verify the source is really OVRTX 0.4.x;
do not manufacture a migration edit.
- If attached mode fails during initialization or population, first confirm the
OVRTX and OVStage packages are from the same release train and schema paths
were registered before either OpenUSD runtime loaded.
- If a RenderVar lookup or mapping fails, verify the full authored RenderVar
path, target device, DLPack layout, and mapping lifetime.
- If sensor output is absent or rejected, verify the applied sensor schema
version,
omni:sensor:modelVersion, and replacement of removed
GenericModelOutput usage.
- If C/C++ works at compile time but fails at startup, cleanly rebuild and check
the packaged runtime layout; a 0.4 binary is not compatible with the 0.5
public result structures.
References
1---2# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.3# SPDX-License-Identifier: LicenseRef-NvidiaProprietary4#5# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual6# property and proprietary rights in and to this material, related7# documentation and any modifications thereto. Any use, reproduction,8# disclosure or distribution of this material and related documentation9# without an express license agreement from NVIDIA CORPORATION or10# its affiliates is strictly prohibited.11name: update-0-4-to-0-512description: >13 Upgrade an existing Python or C/C++ application from ovrtx 0.4.x to 0.5.x.14 Use when porting application code, authored sensor USD, RenderVar output15 handling, DLPack interoperability, Windows renderer configuration, or an16 attached ovstage 0.1 workflow to the ovrtx 0.5 release train.17license: LicenseRef-NvidiaProprietary18author: NVIDIA ovrtx19tags:20 - ovrtx21 - upgrade22 - "0.5"23 - ovstage24 - migration25tools:26 - Read27 - Grep28 - Edit29---3031# Update OVRTX 0.4 to 0.53233Port an existing application with the minimum changes required by the 0.534public contract. Do not adopt unrelated 0.5 features or rewrite working code.3536## When to Use3738Use this skill when upgrading an existing Python, C, or C++ application from39OVRTX 0.4.x to 0.5.x. It also covers authored sensor USD and attached-mode40applications that must upgrade from OVStage 0.1.x to the matching 0.2.x release.4142Do not use it for applications starting on OVRTX 0.3.x or earlier; apply the43corresponding earlier-version migration skill first.4445## Inputs4647Resolve these before editing:4849- The exact source and target OVRTX versions and package locations.50- Whether the application uses Python, C/C++, authored USD, or a combination.51- Whether it uses attached OVStage and directly consumes OVStage data.52- The source, build, deployment, and generated-asset files in migration scope.53- Whether 0.4-equivalent rendered output must be preserved.5455## Prerequisites5657- Access to the application's current source, package pins, build configuration,58 authored USD, and accepted output baselines when visual compatibility matters.59- Matching OVRTX 0.5.x and OVStage 0.2.x packages from the same release train for60 attached mode.61- Read the authoritative sources below before changing APIs or data contracts.62- Runtime validation requires the GPU, driver, network, and unsandboxed execution63 prerequisites documented in [`../../AGENTS.md`](../../AGENTS.md).6465## Scope6667- Source: OVRTX 0.4.x, including 0.4.1, with optional OVStage 0.1.x.68- Target: OVRTX 0.5.x and, when attached mode is used, the matching OVStage69 0.2.x package from the same release train.70- Languages: Python, C, C++, and authored USD used by those applications.71- Preserve application behavior unless the user explicitly wants the new 0.572 defaults.7374This skill includes only changes that can require user source, build, deployment,75or authored-USD changes. Renderer bug fixes, performance work, tests, CI,76packaging reductions, documentation-only work, and optional new features are not77migration steps.7879## Authoritative Sources8081Before editing, read:82831. The `[0.5.0]` migration bullets in84 [`../../CHANGELOG.md`](../../CHANGELOG.md).852. The installed 0.5 headers and Python signatures. They override release-note86 drafts and internal inventories.873. [`../../include/ovrtx/ovrtx_types.h`](../../include/ovrtx/ovrtx_types.h),88 [`../../include/ovrtx/ovrtx_config.h`](../../include/ovrtx/ovrtx_config.h),89 and [`../reading-render-output/SKILL.md`](../reading-render-output/SKILL.md)90 when output or tensor APIs are present.914. [`../../../../ovstage/public/CHANGELOG.md`](../../../../ovstage/public/CHANGELOG.md)92 when the application uses attached OVStage, OVStage population, or direct93 OVStage reads/writes.9495Do not infer a migration from a ticket title alone. Confirm that the change is96present in the target package and absent from 0.4.9798## Migration-Relevant Inventory99100| Area | Inventory evidence | Applies when |101|---|---|---|102| Full RenderVar path identity | OMPE-94127 | The app fetches, indexes, logs, or compares render outputs. |103| Python DLPack surface | OMPE-102110, OMPE-104349, OMPE-105119, OMPE-105460 | The app imports `ManagedDLTensor`, uses `.tensor`, passes raw `DLTensor`, or inspects mapping metadata/lifetimes. |104| Vulkan-only Windows package | OMPE-103728 | The app selects DX12/Vulkan, has DX12 interop, or ships a pre-0.5 C binary. |105| Sensor schema/model versioning | OMPE-74104, OMPE-94528 through OMPE-94535 | The app authors acoustic, IDS, lidar, or radar sensors. |106| GenericModelOutput removal | OMPE-107766 | USD requests `sourceName = "GenericModelOutput"` or code imports the bundled GMO decoder. |107| Schema registration order | OMPE-94125, OMPE-103596 | OVRTX and OVStage or another OpenUSD runtime share a process. |108| One renderer per attached stage | OMPE-105429 | The app attaches one OVStage instance to more than one live OVRTX renderer. |109| Reset-stack Boolean dtype | OMPE-103960 | Low-level code reads/writes `omni:resetXformStack` and assumes `kDLUInt`. |110| OVStage population layouts | OMPE-102552 | Attached applications directly consume assets, path expressions, extents, or affected semantics. |111| OVStage loader packaging | OMPE-106739 | A C/C++ app manually links or deploys OVStage rather than using its package CMake config. |112| Other OVStage 0.2 public breaks | Paired-package changelog; not fully represented in the OVRTX Jira inventory | Attached applications use OVStage metadata, raw reads/maps, Python resource objects, physics schema fallbacks, or permissive 0.1 argument coercions. |113| Changed image defaults | OMPE-102343, OMPE-103674, OMPE-105838 | The app requires output equivalent to 0.4 and relied on an omitted setting. |114115## Instructions1161171. **Establish the real baseline.** Locate OVRTX and OVStage version pins,118 package roots, copied headers/libraries, lock files, and generated USD. Record119 whether the source is 0.4.0 or 0.4.1 and whether the application is Python,120 C/C++, or mixed.1212. **Update packages together.** Pin OVRTX to the requested 0.5 build. If the122 app uses attached mode, pin the matching OVStage 0.2 build from the same123 release train. Do not mix their bundled OpenUSD runtimes.1243. **Run the audit searches below before editing.** Apply a migration only when125 its search matches application code, build/deployment logic, or authored126 USD. Do not turn every conditional item into a source change.1274. **Migrate RenderVar identity first.** It affects nearly every output-reading128 application and makes later tensor tests address the correct output.1295. **Migrate Python tensor handling.** Remove `ManagedDLTensor` dependencies,130 consume mappings through DLPack, replace raw `DLTensor` inputs, and fix131 device/lifetime assumptions.1326. **Migrate removed configuration and outputs.** Remove Windows backend133 selection and replace `GenericModelOutput` where used.1347. **Migrate sensor assets.** Resolve each applied sensor schema version and135 update `omni:sensor:modelVersion`; do not use the deprecation escape hatch as136 the permanent migration.1378. **Fix initialization order.** Register OVRTX schema paths before OpenUSD is138 loaded and before OVStage performs its first population.1399. **Apply OVStage 0.2 data-contract migrations** only to code that directly140 reads or writes the affected representations. Ordinary OVRTX render-output141 consumers do not need these edits.14210. **Decide whether to preserve 0.4 rendering defaults.** Author explicit old143 values only when image compatibility is required; otherwise accept and test144 the new 0.5 defaults.14511. **Rebuild C/C++ applications.** Do not reuse a 0.4 binary with 0.5 headers or146 runtime libraries. Rebuild all translation units that include OVRTX or OVX147 public headers.14812. **Validate representative workflows.** Test renderer creation, scene149 population, one step, every consumed RenderVar, sensor output parsing,150 teardown, and Windows Vulkan/CUDA interop when applicable. Compare images or151 tensors against the application's accepted 0.4 baseline when behavior must152 remain stable.153154## Audit Searches and Required Actions155156### 1. RenderVar path identity157158Search Python for `frame.render_vars`, `RenderVarOutput.name`,159`MappedRenderVar.name`, and dictionaries keyed by AOV/source names such as160`LdrColor`, `HdrColor`, `DepthSD`, or `PointCloud`.161162- Index `frame.render_vars` by the full authored RenderVar prim path, not the163 prim name and not `sourceName`. A unique prim name is insufficient.164- Replace `RenderVarOutput.name` and `MappedRenderVar.name` with165 `render_var_path`.166- Use `source_name` only when code needs the AOV kind; do not use it as output167 identity.168169Search C/C++ for `render_var_name` and `ovrtx_render_var_output_t`.170171- Replace `ovrtx_render_var_output_t.render_var_name` with `render_var_path`.172- Use the new `source_name` and `source_type` fields only for classification.173- Treat `ovrtx_render_var_t.name` as a full RenderVar prim path.174- Recompile because the public result structure layout changed.175176> **Source (Python):** [`../../examples/python/minimal/main.py`](../../examples/python/minimal/main.py) snippet `read-render-output`.177> **Source (C lookup):** [`../../examples/c/minimal/main.cpp`](../../examples/c/minimal/main.cpp) snippet `find-output-helper`.178179### 2. Python DLPack and mapping objects180181Search for `ManagedDLTensor`, `MappedRenderVar.tensor`, `.numpy()`,182`.to_bytes()`, `.raw_dltensor`, `isinstance` checks against the old wrapper,183direct `DLTensor(...)` inputs, and comparisons of `.device` with184`ovrtx.Device`.185186- Remove public imports and direct construction of `ManagedDLTensor`.187- For a single-tensor RenderVar, pass the `MappedRenderVar` directly to a188 DLPack consumer. For composite outputs, select a named `RenderVarTensor`; use189 `params` for named parameters.190- Replace `.tensor.numpy()` or `.numpy()` with the consuming library's191 `from_dlpack`. Take a copy through that library when independent storage is192 required.193- A CPU-only consumer cannot read a CUDA pointer. Map to CPU or use a194 CUDA-capable DLPack consumer such as Warp, PyTorch, or CuPy.195- `device` is now a `DLDevice`. Update comparisons to inspect its DLPack device196 type and device id rather than comparing it with OVRTX's mapping-request197 `Device` enum.198- Do not inspect mapping properties after `unmap()` or context exit. Capture199 metadata first, or retain a tensor/param view created while mapped.200- Renderer tensor inputs must implement `__dlpack__`; raw ctypes `DLTensor`201 structures are no longer accepted by Python write, bind, map, or read-202 destination paths.203- Deprecated attribute reads with `dest=` now return the exact destination204 object. Remove assumptions that the result is a separate wrapper.205- A supplied read destination must have zero byte offset and C-contiguous206 layout.207208> **Source:** [`../reading-render-output/SKILL.md`](../reading-render-output/SKILL.md).209210### 3. Windows backend selection211212Search for `use_vulkan`, `OVRTX_CONFIG_USE_VULKAN`,213`ovrtx_config_entry_use_vulkan`, DX12 interop, and backend-dependent deployment214branches.215216- Remove the retired configuration field/key/helper.217- Treat Windows OVRTX 0.5 as Vulkan-only.218- Port DX12-specific graphics interop to Vulkan or disable that integration.219- Recompile C/C++; passing the retired numeric key returns `OVRTX_API_ERROR`.220221### 4. Sensor versioning and GenericModelOutput222223Search USD generators and assets for `OmniSensorGeneric`,224`omni:sensor:modelVersion`, dotted versions such as `0.0.0`,225`GenericModelOutput`, and imports from the bundled GMO Python extension.226227- The applied `OmniSensorGeneric*API_N` suffix selects schema version `N`;228 unsuffixed schemas select version 1.229- Set `omni:sensor:modelVersion` to `latest` or a supported positive integer230 string for that schema. Dotted semantic versions are invalid.231- Replace `sourceName = "GenericModelOutput"` with the composite `PointCloud`232 RenderVar and author the channels the application consumes. Update parsing to233 read named tensors and params rather than a packed GMO buffer.234- If a separate consumer still needs packed GMO decoding, depend explicitly on235 the standalone `generic-model-output` package; OVRTX no longer bundles it.236- Prefer a supported sensor version. `sensors_allowed_deprecation_base` is a237 temporary compatibility gate and must exactly match the running OVRTX version,238 so using it creates another required edit at the next upgrade.239240> **Source (lidar):** [`../configuring-lidar-sensors/SKILL.md`](../configuring-lidar-sensors/SKILL.md).241> **Source (radar):** [`../configuring-radar-sensors/SKILL.md`](../configuring-radar-sensors/SKILL.md).242243### 5. Schema registration and reset-stack dtype244245Search initialization code for `ovrtx_register_schema_paths`, creation of an246OVStage instance, the first population call, and any earlier import/load of an247OpenUSD runtime. Also find every `attach_ovstage` call and map attached stage248instances to live renderers.249250- In C/C++, call `ovrtx_register_schema_paths()` before OpenUSD loads and before251 OVStage's first population. Registration now also makes the OVRTX schema252 families visible to attached OVStage population.253- In Python, call `ovrtx.register_schema_paths()` before creating/populating an254 OVStage or importing another OpenUSD runtime. Merely importing `ovrtx` does255 not register paths unless `OVRTX_PXR_SCHEMA_AUTO_REGISTER=1` was set before256 import.257- For a separate host OpenUSD runtime, enumerate/filter OVRTX plugin paths as258 described by `ovrtx_get_usd_plugin_paths()` and publish them before that259 runtime opens its first stage.260- Do not attach one OVStage instance to multiple live OVRTX renderers. Give each261 renderer its own stage, or detach the first renderer before attaching that262 stage to another; 0.5 rejects simultaneous attachment.263264Search low-level attribute code for `omni:resetXformStack` with `kDLUInt`.265Change its declared dtype to `{kDLBool, 8, 1}`. Calls through266`ovrtx_set_reset_xform_stack()` keep the same `bool*` signature and need no267source edit.268269### 6. Attached OVStage 0.2 data contracts270271Search direct OVStage readers/writers and population consumers for272`ASSET_STRING`, `ASSET_PATH_ID`, `PATH_EXPRESSION_STRING`, `extent`, and switches273over attribute semantics.274275- Assets are `(authored, resolved)` token-id pairs with276 `ASSET_PATH_ID`, `{kDLUInt, 64, 2}`. This applies to scalar and array assets;277 empty values are zero pairs.278- Path expressions are interned `{kDLUInt, 64, 1}` token ids, not UTF-8 byte279 rows. Resolve them through the path dictionary; scalar versus array is280 selected by `is_array`.281- `extent` on `UsdGeomImageable` is one non-array `{kDLFloat, 64, 6}` value in282 `(min xyz, max xyz)` order, not a two-element `float3[]`.283- Update semantic switches: Curves/Points `normals` report `POINT`; light and284 shadow colors report `VECTOR`; finite-dome, NeRF, and NuRec size/crop/offset285 attributes report `VECTOR`. Inspect the USD type when the original USD role286 matters.287- If C/C++ deployment manually names OVStage libraries, ship and link the new288 forwarding loader plus its runtime. Applications using the package CMake289 targets and setup helper retain the stable target and need no source change.290291Also audit the rest of the OVStage 0.2 public changelog. These changes are292outside the original OVRTX Jira inventory but can still break an attached OVRTX2930.4 application when its OVStage dependency moves from 0.1 to 0.2:294295- Stage metadata moved from `/__ovstage_population_stage_info__` to `/`, and296 its columns use the `usd-metadata:` prefix.297 `ovstage_population_stage_info_path()` was removed. Update stored paths,298 query filters, and metadata column names.299- Fixed-size reads/maps now expose one data-row dimension and put tuple width300 in `dtype.lanes`. Update code that expects shapes such as `(N, 3)` or301 `(N, 4, 4)`. Fixed-size writes without an index map must supply exactly one302 leading row per logical element rather than a flattened one-lane buffer.303- Populated USD bools now report `kDLBool`, not `kDLUInt`. Update dtype switches304 and assertions for every populated bool, not only `omni:resetXformStack`.305- `TIME_CODE` and `FRAME` semantics are now reported for the corresponding306 columns. Add those cases to exhaustive semantic switches and do not write a307 conflicting role such as `MATRIX` to a `frame4d` column.308- OVStage no longer bundles PhysX, deformable, or Newton schema definitions.309 Applications that depend on unauthored schema fallback properties must ship310 their own definitions and register them with311 `ovstage_population_register_usd_schemas()` before the first schema read.312- Python `PathDictionary.path_to_string(root_handle)` now returns `/`, not an313 empty string. Update root/sentinel tests that treated `""` as the root.314- Keep each Python `ReadGroup` alive while using arrays or DLPack views borrowed315 from it; use its context manager and copy data that must outlive the group.316 Do not construct a view from an unbound temporary group.317- `ReadGroup.array()` is read-only. Replace attempts to mutate committed read318 storage with a map or write operation.319- Caller-created Python path lists are now owned `PathList` objects. Reuse or320 explicitly release them; do not add a second manual release for the reference321 the object already owns.322- Replace float/string spellings of integer fields with real integers; this323 includes ordinals such as `5.0`, indices, handles, tokens, masks, and enum324 arguments. Use declared enum members, avoid negative population-domain masks,325 and pass attribute names as `str` or tokens as `int` explicitly.326- If the app relied on OVStage's incidental console diagnostics, install a log327 callback; the standalone runtime is silent by default.328329### 7. Preserve 0.4 rendering defaults only when required330331These are not compile failures. Add explicit settings only if the application332requires 0.4-equivalent images:333334- Selection outlines changed from disabled to enabled by default. Set335 `selection_outline_enabled=false` when the app uses selection groups but must336 retain the old image.337- Multiple DomeLights changed from forced-single to enabled. Author338 `omni:rtx:scene:forceSingleDomeLight = true` on each relevant RenderProduct to339 retain the 0.4 single-DomeLight behavior.340- RTPT CFGPU camera jitter changed from disabled to enabled. Author341 `omni:rtx:rtpt:cfgpuCameraJitter = false` when deterministic 0.4 sampling is342 required.343344If the application already authors any of these values explicitly, preserve its345authored choice; the default change requires no edit.346347## Limitations348349- New optional features such as SPG stateful/raygen nodes, UV projectors,350 decals, spectral rendering, Aftermath control, or DomeLight baking controls.351- Performance improvements, crash fixes, rendering correctness fixes, package352 size reductions, tests, CI, or documentation-only tickets.353- `DepthSD`: it is deprecated but not removed in 0.5. Record follow-up work if354 desired; do not block this port on replacing it.355- Auto-applied Camera and RenderProduct RTX schemas: existing explicit schema356 application remains valid and does not need removal.357- Strict validation of malformed times, config values, DLPack layouts, and null358 RenderProduct paths. Fix matches found in application code, but do not add359 compatibility workarounds for invalid 0.4 inputs.360- Any API that appeared and disappeared only during 0.5 development. Confirm361 the 0.4 and final 0.5 shipped surfaces before adding a migration step.362363## Validation364365- Python: import OVRTX 0.5 with no removed-symbol imports; run the narrowest366 tests that create the renderer, populate the stage, step, and consume every367 requested output on its real device.368- C/C++: cleanly rebuild and relink against the 0.5 package; run once with the369 packaged runtime layout rather than relying only on header compilation.370- Sensors: instantiate every authored sensor, confirm no version or skipped-371 output diagnostic, and validate PointCloud channel names, shapes, counts, and372 units.373- Attached mode: populate through OVStage 0.2, advance the write floor, render a374 committed ordinal, and exercise every directly consumed changed attribute.375- Behavior preservation: compare representative images/tensors with accepted376 0.4 baselines after explicitly pinning only the defaults the app depends on.377378## Output Format379380- List files changed, grouped by the migration areas above.381- State which audit areas did not apply and why.382- Call out authored-USD and deployment changes separately from source changes.383- Report exact build/test commands and runtime coverage.384- List any remaining deprecated-but-still-functional APIs as follow-up work,385 not as completed migration.386387## Scripts388389This skill has no scripts.390391## Troubleshooting392393- If an audit search finds no match, verify the source is really OVRTX 0.4.x;394 do not manufacture a migration edit.395- If attached mode fails during initialization or population, first confirm the396 OVRTX and OVStage packages are from the same release train and schema paths397 were registered before either OpenUSD runtime loaded.398- If a RenderVar lookup or mapping fails, verify the full authored RenderVar399 path, target device, DLPack layout, and mapping lifetime.400- If sensor output is absent or rejected, verify the applied sensor schema401 version, `omni:sensor:modelVersion`, and replacement of removed402 `GenericModelOutput` usage.403- If C/C++ works at compile time but fails at startup, cleanly rebuild and check404 the packaged runtime layout; a 0.4 binary is not compatible with the 0.5405 public result structures.406407## References408409- [`../reading-render-output/SKILL.md`](../reading-render-output/SKILL.md)410- [`../renderer-creation/SKILL.md`](../renderer-creation/SKILL.md)411- [`../configuring-lidar-sensors/SKILL.md`](../configuring-lidar-sensors/SKILL.md)412- [`../configuring-radar-sensors/SKILL.md`](../configuring-radar-sensors/SKILL.md)413- [`../../CHANGELOG.md`](../../CHANGELOG.md)414- [`../../../../ovstage/public/CHANGELOG.md`](../../../../ovstage/public/CHANGELOG.md)