# Add Machine Perception

You’ve proved that the application can control the correct scene object. Control is not enough. To make the attic useful to a future robot, the scene must also produce structured observations that do not depend on human color recognition.

**What you are learning:** `ovrtx` exposes camera annotation outputs and nonvisual sensor outputs from the same OpenUSD scene. Skills separate label authoring, output selection, readback, interpretation, and browser orchestration so the agent can combine them correctly.

**Why this matters for a robot-ready scene:** A robot does not experience a beauty render as an artist does. Perception software needs machine-readable identity and measurable spatial evidence, with clear contracts for how those observations were produced. Semantic output and lidar let the same digital scene support recognition, localization, synthetic-data validation, and sensor testing.

**Your 3D skills at work:** AOV and lookdev experience becomes ground-truth output design. Material and ray-tracing knowledge becomes sensor-return visibility. Taxonomy, masking, compositing, and render-debugging skills help you detect labels, surfaces, or outputs that would silently give a perception model bad evidence.

## Machine Perception: Semantics + Lidar

How a robot application turns raw output into meaning. Step through the slides, then make the 3D decisions that specify and build the observations below.

### 1

Semantic Vision: IDs Into Meaning

A number becomes a class, then a color.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-stack slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg> An **OpenUSD** label gives each object a semantic ID in a non-destructive layer.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-eye slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path></svg> The **`ovrtx`** semantic image stores that integer at every pixel - a cube pixel might be `17`.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-book slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg> The **semantic ID map** looks up `17` as class `retrieval_target`, label `memory_cube`.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-broadcast slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8.75 8.582v5.668a.75.75 0 0 1-1.5 0V8.582a1.75 1.75 0 1 1 1.5 0Zm3.983-7.125a.75.75 0 0 1 1.06.026A7.976 7.976 0 0 1 16 7c0 2.139-.84 4.083-2.207 5.517a.75.75 0 1 1-1.086-1.034A6.474 6.474 0 0 0 14.5 7a6.474 6.474 0 0 0-1.793-4.483.75.75 0 0 1 .026-1.06Zm-9.466 0c.3.286.312.76.026 1.06A6.474 6.474 0 0 0 1.5 7a6.47 6.47 0 0 0 1.793 4.483.75.75 0 0 1-1.086 1.034A7.973 7.973 0 0 1 0 7c0-2.139.84-4.083 2.207-5.517a.75.75 0 0 1 1.06-.026Zm8.556 2.321A4.988 4.988 0 0 1 13 7a4.988 4.988 0 0 1-1.177 3.222.75.75 0 1 1-1.146-.967A3.487 3.487 0 0 0 11.5 7c0-.86-.309-1.645-.823-2.255a.75.75 0 0 1 1.146-.967Zm-6.492.958A3.48 3.48 0 0 0 4.5 7a3.48 3.48 0 0 0 .823 2.255.75.75 0 0 1-1.146.967A4.981 4.981 0 0 1 3 7a4.982 4.982 0 0 1 1.188-3.236.75.75 0 1 1 1.143.972Z"></path></svg> The **server palette** colorizes it and **`ovstream`** delivers the frame to the browser.

### 2

Lidar Needs Nonvisual Materials

RTX lidar returns come from geometry plus material labels.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-stack slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg> RTX lidar hits come from **renderable USD geometry** - not PhysX collision or rigid-body schemas.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-tag slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg> Each unlabeled `Material` prim needs default-preserving sensor-return metadata so its surface returns hits.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-shield-check slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg> Author labels under both `omni:simready:nonvisual` and `inputs:nonvisual` in viewer-owned `R17_Lidar.usda` - never the source.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-check-circle slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm1.5 0a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm10.28-1.72-4.5 4.5a.75.75 0 0 1-1.06 0l-2-2a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l1.47 1.47 3.97-3.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg> `lidarNonvisualMaterialCount` reports how many materials you labeled.

## Mission 3.a — Add Machine-Readable Perception

### 1. Inspect — Define Meaning That Survives Appearance

Humans see a glowing cyan cube. A robot application needs per-pixel IDs connected to semantic meaning.

**Physical-AI translation:** In film and games, mattes, cryptomattes, object IDs, and render passes isolate visual elements for downstream work. Here that same discipline creates ground truth: every pixel can carry a stable class and object identity that perception systems can train against or validate.

An **AOV** is one requested render output, such as beauty color, depth, or semantic IDs. This step adds a semantic AOV to the existing camera RenderProduct.

### Find the Skill Chain

Start with the hero skill **`semantic-labels`**. It authors `SemanticsAPI` metadata; it does not create a display-ready image by itself.

| Skill or reference      | Job in the workflow                                                                              |
|-------------------------|--------------------------------------------------------------------------------------------------|
| `semantic-labels`       | Add class and label meaning in a non-destructive override layer; each object gets a semantic ID. |
| `camera-outputs-rt2`    | Request the semantic image and ID-map RenderVars.                                                |
| `reading-render-output` | Map the outputs returned by `ovrtx`.                                                             |
| Viewer `aov-switching`  | Colorize and select the streamed display mode without creating a second stream.                  |

This is another workflow, not one magic skill. The current pinned `ovrtx` skill and the actual runtime output keys are the source of truth; do not guess an AOV name from memory. The agent will run the provided focused semantic-view check before returning control.

Your lookdev, matte, and compositing experience is essential here. You already know that color, lighting, material, and helper effects can change without changing the object. That production distinction becomes the difference between trustworthy ground truth and a label that silently teaches a perception system the wrong identity.

### 2. Specify — Author the Semantic Brief

Test identity against appearance changes, decide which authored object owns the label, and define the task-oriented class and label that should appear in the result. Open the [Prompt Builder](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/prompt-builder.md), choose the **Ray Trace Your Way to a Better Life** session, and select **Mission 3.a - Add Semantic Perception**. Turn your taxonomy and object-boundary decision into additions for `Context` and `Done when`. Leave the optional fields blank to keep the tested `retrieval_target / memory_cube` contract.

### 3. Build — Add Your Taxonomy to the Mission Brief

### Show a finished prompt

```text
Goal:      Add Robot Vision to the Attic Portal: per-object candy-color ovrtx semantic
           segmentation, with BEAUTY and SEMANTIC controls in the existing R-17 Signal
           Panel.
Skills:    Read the installed ovrtx semantic-labels, camera-outputs-rt2,
           reading-render-output, and stepping-and-rendering skills. Use semantic-labels
           as the hero. Read
           ~/RTXViewport/skills/omniverse-realtime-viewer/SKILL.md and only its
           stage-loading, aov-switching, streaming-messages, viewer-control-patterns,
           viewer-feedback-status, and validation references.
Context:   Extend ~/RTXViewport/Attic_Portal. Before implementing, read
           ~/RTXViewport/ATTIC_PORTAL_STARTER.md and follow the detailed Robot Vision
           contract at
           ~/RTXViewport/Attic_Portal_Starter_Kit/Attic_Portal_Starter_Kit/ROBOT_VISION_CONTRACT.md.
           Reuse the starter snippets referenced there. Do not modify
           ~/RTXViewport/Attic_Nvidia.
Done when: The Robot Vision contract is satisfied; BEAUTY displays LdrColor; SEMANTIC
           displays candy-colored ovrtx SemanticSegmentation from the same camera and
           stream; /Root/Geometry/* objects have distinct labels; /Root/Workshop/Cube maps
           to retrieval_target / memory_cube; renderer_owner_count remains 1; protected
           source hashes are unchanged; and the agent reports changed files, output keys,
           browser URL, restart command, and concise validation evidence. Return control without
           waiting for my browser interaction.
```

### 4. Verify — Approve the Ground Truth

Switch between **BEAUTY** and **SEMANTIC**. Confirm that appearance changes do not change the authored identity, visual helpers are not mistaken for the target, and the cube resolves to the class and label in your brief. The semantic image provides per-pixel IDs, the ID map connects them to meaning, the server colorizes them, and `ovstream` delivers the display-ready frame; React does not invent or reinterpret the taxonomy.

If the colors look convincing but the ID map or labels disagree with your brief, reject the result. In physical AI, a pleasing visualization is not a substitute for correct ground truth.

![Semantic segmentation view of the attic with every object rendered in a flat candy-color identity, and the R-17 Robot Vision panel toggled to SEMANTIC with retrieval_target memory_cube.](images/lab-1-semantic-view.png)

## Mission 3.b — Commission Lidar Coverage

### 1. Inspect — Treat Returns as Evidence, Not an Effect

Semantic vision tells a robot application what a surface means. Lidar supplies structured 3D returns it can measure.

**Physical-AI translation:** A lighting or lookdev artist already reasons about how rays meet geometry and materials; a VFX artist already diagnoses missing intersections and unstable samples. Lidar uses that spatial judgment for a different output. Your task is to make sure the sensor can see the right surfaces and that the application reports usable evidence, not merely a convincing picture.

### Find the Sensor Skills

The authoring hero is **`nonvisual-materials`** - it teaches the agent how to give scene surfaces the sensor-return metadata that makes them visible to lidar. The lidar skills are read **for validation only**:

- `configuring-lidar-sensors` to confirm the authored sensor and its `PointCloud` output.
- `reading-sensor-pointclouds` to map `PointCloud` tensors and respect `Counts`.
- `interpreting-lidar-pointclouds` to understand coordinates, validity, frames, and units.
- `stepping-and-rendering` to produce a current sensor result.

**Why author materials at all?** RTX lidar returns come from **renderable USD geometry**, not PhysX collision or rigid-body schemas - so the agent must never add physics schemas just to make a prim “visible” to the sensor. Instead, every scene `Material` prim that lacks a sensor-return label needs default-preserving metadata so its surface returns hits. The agent queries the protected stage read-only, then authors labels **only in viewer-owned `R17_Lidar.usda`** under both supported prefixes - `omni:simready:nonvisual` and `inputs:nonvisual` (each with `base/coating/attributes = none`) - and never overrides an existing source label or saves the protected scene. Labels belong on `Material` prims, not `Mesh` prims, and `lidarNonvisualMaterialCount` reports how many the agent authored.

The sensor definition is authored once. **LIDAR ON/OFF controls whether the application steps and reads the lidar RenderProduct**; it does not mutate output-defining sensor attributes every time you click. The agent will run the provided focused lidar check before returning control.

Your lighting, lookdev, blocking, and ray-tracing experience helps you see the failure cases that a point count hides: occlusion, blind spots, the wrong sensor frame, missing return materials, and geometry that is visible to a camera but irrelevant to the task. The sensor API can return data; your spatial judgment decides whether it observes what matters.

### 2. Specify — Author the Sensor-Coverage Brief

Choose the task surfaces the sensor must observe, inspect the likely occlusion, and define which compact telemetry would count as credible evidence. Open the [Prompt Builder](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/prompt-builder.md), choose the **Ray Trace Your Way to a Better Life** session, and select **Mission 3.b - Commission Lidar Coverage**. Turn those choices into coverage intent for `Context` and rejection criteria for `Done when`. Leave the optional fields blank to keep the tested sensor contract.

### 3. Build — Add Your Coverage Judgment to the Mission Brief

### Show a finished prompt

```text
Goal:      Add the prepared R-17 Lidar Link to the Attic Portal.
Skills:    Read the ovrtx nonvisual-materials skill for sensor-return material authoring.
           Read configuring-lidar-sensors, reading-sensor-pointclouds,
           interpreting-lidar-pointclouds, and stepping-and-rendering for validation only.
           Read the Attic Portal starter recipe:
           ~/RTXViewport/ATTIC_PORTAL_STARTER.md#r-17-lidar-link.
Context:   Reuse the starter Lidar implementation from
           ~/RTXViewport/Attic_Portal_Starter_Kit. Compose R17_Lidar.usda above the
           protected attic scene. Add LIDAR ON/OFF to the existing R-17 Signal Panel using
           the existing request-correlated r17-command-v1 sender and r17-state-v1
           subscription. Keep one renderer, one camera RenderProduct, one stream, and one
           WebRTC connection. The Lidar preview must render inside the existing Lidar inset,
           follow the active camera, and use validated point cloud data, not a fake scene
           recolor. Lidar scene-return requirement: RTX Lidar visibility comes from
           renderable USD geometry, not PhysX collision or rigid-body schemas. Do not add
           physics schemas merely to make prims visible. Query the protected stage read-only
           for Material prims. For each material without an existing nonvisual base label,
           author default-preserving sensor-return metadata only in viewer-owned
           R17_Lidar.usda under both supported prefixes: omni:simready:nonvisual
           base/coating/attributes = none and inputs:nonvisual base/coating/attributes =
           none. Labels belong on Material prims, not Mesh prims. Never override an existing
           source nonvisual label and never save the protected scene. Publish and validate
           lidarNonvisualMaterialCount.
Done when: LIDAR ON reports READY with finite nonzero validPointCount and nearestRange; the
           inset shows stable camera-framed Lidar points for the scene; R17_Lidar.usda
           contains both nonvisual material prefixes for every discovered unlabeled material;
           lidarNonvisualMaterialCount is positive and matches the authored material set;
           LIDAR OFF reports DISABLED and clears stale telemetry; repeated toggles do not
           recreate the renderer or stream; source scene files are unchanged; and the agent
           reports changed files, material-label count, browser URL, restart command, and
           concise validation evidence.
```

### 4. Verify — Approve the Sensor Evidence

Turn lidar on and judge the result against the coverage brief you authored. A nonzero point count is necessary but not sufficient: the returns must be current, finite, expressed in the expected frame, and cover the task surfaces you identified. `Counts` bounds the delivered entries, `Flags` identifies valid returns, `Coordinates` locates them, and `Intensity` describes processed reflection strength.

Confirm that the server interprets the mapped `ovrtx` output and sends compact evidence such as `validPointCount` and `nearestRange` through `ovstream`; React should display that evidence rather than process every raw point. Turn lidar off and confirm stale telemetry clears while the camera stream remains live. If the inset looks impressive but the evidence misses your required surface or frame, revise the brief and reject the result.

![Screen recording of the lidar coverage view - a depth-colored point cloud of the scene - with the R-17 LiDAR Link panel reporting a nearest range of about 2 meters and hundreds of thousands of returned points.](videos/lab-1-lidar-pointcloud.webm)

## Validate: The Scene Is Ready for Exploration

This is a digital-twin integration test, not a physical-robot safety certification. Each check proves one software contract that a future physical-AI system would depend on. Exercise the console you built:

- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Select **HOME → LEFT POSE −15 → LEFT POSE −15 → RIGHT POSE +15 → HOME**. Confirm the panel always reports `/Root/Workshop/Cube`, replaying LEFT produces the same transform, and HOME restores the complete recorded pose.
- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Switch **DEFAULT VIEW → CUBE FOCUS**, then orbit once. Confirm both presets work, navigation stays responsive, and the server changes `activeView` to `CUSTOM` after manual navigation. Return to **DEFAULT VIEW** and confirm it restores the startup preset.
- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Switch **BEAUTY → SEMANTIC**. Confirm the cube’s semantic label is `memory_cube` and the browser still uses the same stream.
- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Switch **LIDAR ON**. Confirm a finite nonzero valid point count appears without interrupting the camera frame loop.
- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Switch **LIDAR OFF**. Confirm sensor telemetry clears while the viewport stays live.
- <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Confirm the source attic hashes remain unchanged and all new cameras, semantics, and sensors live in viewer-owned layers.

Each proof maps to something a physical-AI team depends on:

| Provided proof                                                              | Why a physical-AI team cares                                                                          |
|-----------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
| Repeating LEFT reaches the same target and HOME restores the pose.          | Networks retry commands; idempotent desired states prevent cumulative drift.                          |
| DEFAULT and CUBE FOCUS are reproducible while navigation remains available. | Authored sensor and inspection viewpoints must be repeatable without blocking operator awareness.     |
| SEMANTIC resolves the cube as `memory_cube`.                                | Synthetic-data generation and model evaluation require a stable taxonomy tied to the correct object.  |
| Lidar reports finite valid returns without starving the camera loop.        | Multiple virtual sensors share a finite compute and frame-time budget.                                |
| Lidar OFF clears telemetry.                                                 | Robots and operators must not mistake stale sensor evidence for current state.                        |
| New work lives in viewer-owned layers.                                      | A digital twin needs a protected source of truth plus reproducible experiment and application layers. |

---

If a check fails, name the first boundary to inspect:

| Symptom                                             | First boundary                                            |
|-----------------------------------------------------|-----------------------------------------------------------|
| Button changes locally but no server status arrives | React command → `ovstream` message → server callback      |
| Command is acknowledged but the cube does not move  | application queue → renderer-owner transform write        |
| Focus status changes but view does not              | camera preset → active camera write → next `ovrtx` frame  |
| Semantic mode is blank or random                    | RenderVar name/format → ID map → server colorization      |
| Lidar is ON but count stays empty                   | sensor RenderProduct step → PointCloud map → Counts/Flags |
| Server state is correct but panel is stale          | `ovstream` state message → typed React subscription       |

The scene now provides stable identity, controlled observation, and measurable perception outputs. Next, turn one repeatable workflow into a reusable skill in [Create Your Own Agent Skill](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/create-your-own-skill.md).
