Generated banner for Hsb Setup
Generated logo for Hsb Setup

Hsb Setup

NVIDIAOfficialCreated by Holoscan TeamDistributed by NVIDIA

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • Medium risk
  • Has scripts

From the author

Clone the latest NVIDIA Holoscan Sensor Bridge repo, ask which supported devkit is being used, configure the host per platform, build the correct demo container, run it, and verify HSB connectivity by pinging 192.168.0.2. Use for Holoscan Sensor Bridge setup, build, container launch, and first-connectivity bring-up.
— the description by Holoscan Team

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The hsb-setup skill provides a structured, multi-phase workflow to deploy the Holoscan Sensor Bridge (HSB) demo on supported NVIDIA devkits. It handles the entire lifecycle from initial environment validation and platform auto-detection to repository cloning, host configuration, containerized build, and final connectivity verification. The skill emphasizes safety through mandatory token-budget preflight checks, interactive phase-based execution, and automated recovery procedures for common setup issues.

What it does

  • Performs mandatory token-budget preflight checks before any remote operations.
  • Auto-detects the host devkit platform and reconciles it with user-provided settings.
  • Clones the HSB repository and prepares the host environment based on platform-specific requirements.
  • Builds and launches the demo container tailored to the specific hardware configuration.
  • Verifies network connectivity to the sensor bridge and checks FPGA firmware versions.
  • Generates a detailed report of the setup process and any encountered issues.

When to use it

  • When you need to perform a fresh installation of the Holoscan Sensor Bridge demo.
  • When you need to verify or troubleshoot the connectivity between a devkit and the HSB hardware.
  • When you need to ensure the host environment is correctly configured for containerized HSB applications.
  • When you are setting up a new development environment on an IGX Orin, AGX Orin, AGX Thor, or DGX Spark.

Advantages

  • Reduces manual configuration errors through automated platform-specific setup.
  • Ensures safe execution with mandatory token-budget and preflight checks.
  • Provides clear, phase-based progress tracking and interactive confirmation gates.
  • Includes built-in recovery playbooks for common setup and connectivity failures.

Usage examples

“/hsb-setup AGX Thor”
Initiates the setup workflow for an AGX Thor devkit, walking through the phase plan and performing necessary host configurations.
“/hsb-setup IGX Orin dGPU --verbose”
Starts the setup for an IGX Orin with a discrete GPU in verbose mode, displaying full command output for each phase.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/hsb-setup/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip hsb-setup.zip -d .agents/skills

Documentation by Holoscan Team

Holoscan Sensor Bridge demo bring-up

Use this skill when the user wants to bring up the Holoscan Sensor Bridge demo environment end to end.

This workflow has side effects. Never run it automatically. Only run it when the user explicitly invokes it.

Before you start — required gates (do these first, in order)

Gate 1 — Read environment variables. Before doing anything else, check these variables and print their resolved values to the user:

SSH_TARGET      Remote devkit login (e.g. [email protected]). Ask the user if not set.
REMOTE_ROOT     Remote working directory (e.g. /home/nvidia). Ask the user if not set.
REMOTE_SUDO     sudo / sudo -n / "" — default to "sudo" if not set.
REMOTE_SSH_OPTS Additional SSH options (optional).
HSB_PLATFORM    Platform hint — may be empty; will detect from hardware.
HSB_REPO        Custom repo URL — defaults to https://github.com/nvidia-holoscan/holoscan-sensor-bridge.git

SSH_TARGET and REMOTE_ROOT are required. Stop and ask the user for them if either is missing.

Gate 2 — Present the phase plan. Before taking any action, show the user this exact plan and wait for acknowledgement:

HSB Setup — Phase Plan
  Phase 0: Token-budget preflight
  Phase 1: Confirm platform, set up SSH, clone repo, study user guide
  Phase 2: Host prerequisite checks and network setup
  Phase 3: Native CLI build (AGX Thor only — skipped for other platforms)
  Phase 4: Build demo container, run it, ping 192.168.0.2, verify FPGA version
  Phase 5: Issues report (with option to save)
  Phase 6: Stop apps, exit container, hand control back to user

Gate 3 — Token-budget preflight (Phase 0). Run this before any SSH connection or devkit change. See ## Token-budget preflight section for the full procedure. Do not proceed to Phase 1 until the budget check passes.

Instructions

Invoke this skill by typing /hsb-setup [PLATFORM] [OPTIONS]. The skill walks through each phase interactively, prompting for confirmation before making changes.

What this skill must do

  1. Run the mandatory token-budget preflight before any remote command or devkit configuration change. Estimate the tokens needed to complete all setup phases, check the user's remaining subscription-plan usage with the best available Claude Code/account usage mechanism, display the estimate and result to the user, and stop if the available budget is insufficient or cannot be verified.

  2. prompt the user to confirm that the devkit is connected to the holoscan sensor bridge and everything is powered up and there is an active network connection to the outside world and that the devkit was installed with the proper OS version. if all profile parameters are known look into the repo user guide and draw a diagram of the devkit to sensor for the user to confirm that this is the setup they have.

  3. Once the user confirms the setup is ready, build the ssh connection to the devkit if the user is running the claude skill from an external computer. you can skip this step if claude installed directly on the devkit.

  4. Verify the host devkit platform by running cat /sys/class/dmi/id/product_name on the devkit and comparing the result to the HSB_PLATFORM environment variable using the product-name-to-platform mapping (see "Host platform auto-detection" section). If the command returns a recognized non-empty platform name that differs from HSB_PLATFORM, or if HSB_PLATFORM is empty, update HSB_PLATFORM to match the detected platform and alert the user about the change. If the command returns empty or fails and HSB_PLATFORM is already set, keep the existing value.

  5. Clone or refresh the GitHub repository from the latest main branch. By default this is the public nvidia-holoscan/holoscan-sensor-bridge repo, but the user can override it with a custom repo URL via the HSB_REPO environment variable or the --repo <URL> command-line flag. if the repo is an ssh repo, alert the user if no ssh key is set and provide instructions how to set up the ssh key.

  6. Ask the user which devkit/platform they want to use if it is not already clear.

  7. under the cloned repo root dir, study and understand the user guide at docs/user_guide to learn how to set up host environment for each devkit and OS, demo container, running applications inside and outside the container (where applicable) and flashing the FPGA.

  8. Map that platform to the correct host setup and container build mode and make sure host set up is configured properly per user guide instructions, fix and add any missing configuration or prompt the user with instruction how to fix.

  9. Build the demo container.

  10. Run the demo container.

  11. Verify connectivity to the board at 192.168.0.2. if the connection to the board fails, prompt the user for a possiblity of a different ip address.

  12. Verify the FPGA version reading register 0x80. if the FPGA version on the sensor does not match the hsb host software that is on the devkit, suggest the user to use the hsb-flash-skill to flash the board to the proper FPGA version.

  13. Report progress in phases, explain failures clearly, and attempt safe fixes before giving up.

  14. For every issue encountered, create a report that specifies what was the issue and how you overcame it.

  15. Allow the user an option to export the final report to an md file.

  16. once you are done setup, stop any running apps and exit the container giving up control on the devkit to the user at repo home directory on terminal window.

Supported platforms and build mapping

Use the following mapping unless the repository or current docs in the working tree clearly say otherwise:

  • IGX Orin with dGPU OS/configuration → build with sh docker/build.sh --dgpu

  • IGX Orin iGPU → build with sh docker/build.sh --igpu

  • AGX Orin → build with sh docker/build.sh --igpu

  • AGX Thor → build with sh docker/build.sh --igpu

  • DGX Spark → build with sh docker/build.sh --igpu

If the user says only “IGX Orin”, explicitly ask whether it is iGPU or dGPU OS/configuration.

Host platform auto-detection

During Phase 1 (after SSH is established or when running locally), verify the actual devkit hardware by reading the DMI product name and comparing it to the HSB_PLATFORM environment variable.

Product-name-to-platform mapping

The following table maps known /sys/class/dmi/id/product_name values to supported HSB_PLATFORM values. Match using case-insensitive substring search — the product name may contain additional text (e.g., "Developer Kit", revision numbers).

product_name contains (case-insensitive)Mapped HSB_PLATFORMNotes
IGX OrinIGX OrinStill need to ask iGPU vs dGPU if not already known
AGX OrinAGX Orin
AGX ThorAGX Thor
DGX SparkDGX Spark

If the product name does not match any known pattern, treat it as unrecognized and fall through to the manual platform question in step 5.

Detection and reconciliation logic

Run the following on the devkit (inside the Phase 1 SSH heredoc or locally):

DETECTED_PRODUCT=""
if [ -f /sys/class/dmi/id/product_name ]; then
  DETECTED_PRODUCT=$(cat /sys/class/dmi/id/product_name 2>/dev/null | tr -d '\n')
fi

DETECTED_PLATFORM=""
if echo "$DETECTED_PRODUCT" | grep -qi "IGX Orin"; then
  DETECTED_PLATFORM="IGX Orin"
elif echo "$DETECTED_PRODUCT" | grep -qi "AGX Orin"; then
  DETECTED_PLATFORM="AGX Orin"
elif echo "$DETECTED_PRODUCT" | grep -qi "AGX Thor"; then
  DETECTED_PLATFORM="AGX Thor"
elif echo "$DETECTED_PRODUCT" | grep -qi "DGX Spark"; then
  DETECTED_PLATFORM="DGX Spark"
fi

echo "DETECTED_PRODUCT=$DETECTED_PRODUCT"
echo "DETECTED_PLATFORM=$DETECTED_PLATFORM"
echo "HSB_PLATFORM=${HSB_PLATFORM:-}"

After collecting the output, apply the following reconciliation rules:

  1. DETECTED_PLATFORM is non-empty and HSB_PLATFORM is empty → set HSB_PLATFORM to DETECTED_PLATFORM. Alert the user:

    Platform auto-detected from hardware: <DETECTED_PLATFORM> (product_name: <DETECTED_PRODUCT>).
    HSB_PLATFORM was not set — updating to "<DETECTED_PLATFORM>".
  2. DETECTED_PLATFORM is non-empty and differs from HSB_PLATFORM → override HSB_PLATFORM with DETECTED_PLATFORM. Alert the user:

    WARNING: Hardware reports "<DETECTED_PLATFORM>" (product_name: <DETECTED_PRODUCT>),
    but HSB_PLATFORM was set to "<HSB_PLATFORM>".
    Updating HSB_PLATFORM to match the detected hardware: "<DETECTED_PLATFORM>".
  3. DETECTED_PLATFORM is non-empty and matches HSB_PLATFORM → no change needed. Confirm:

    Platform verified: <HSB_PLATFORM> matches hardware (product_name: <DETECTED_PRODUCT>).
  4. DETECTED_PLATFORM is empty (file missing, unreadable, or unrecognized product name) and HSB_PLATFORM is set → keep the existing HSB_PLATFORM. Warn:

    Could not auto-detect platform from hardware (product_name: "<DETECTED_PRODUCT>").
    Keeping existing HSB_PLATFORM: "<HSB_PLATFORM>".
  5. Both DETECTED_PLATFORM and HSB_PLATFORM are empty → fall through to the manual platform question in step 5.

After reconciliation, persist the updated HSB_PLATFORM in the remote session state file so subsequent phases use the correct value.

Linux/Windows-friendly wrapper variables

When this skill is used from Linux/Windows with a local Claude Code session that shells out to SSH, prefer these environment variables when present:

  • SSH_TARGET for the remote login target such as nvidia@agx-thor-host

  • REMOTE_ROOT for the remote working directory where the repo should live

  • REMOTE_SUDO for privileged commands. Accept sudo, sudo -n, or empty string

  • REMOTE_SSH_OPTS for additional SSH options

  • HSB_PLATFORM as an optional platform hint

  • HSB_REPO for a custom GitHub repository URL to clone (e.g. https://github.com/myorg/my-hsb-fork.git). If not set, defaults to https://github.com/nvidia-holoscan/holoscan-sensor-bridge.git

If these are set, notify the user of these settings and use them without re-asking unless the user explicitly overrides them.

Before Phase 1, print the resolved remote execution settings you will use, with secrets redacted if needed.

Mandatory interaction pattern

Present the phase plan from Gate 2 above before making any changes. Skip Phase 3 for non-Thor platforms.

Then execute one phase at a time.

After each non-final phase (Phases 0–5):

  1. Show a phase summary. The detail level depends on --verbose mode (see "Verbosity mode" section):

    • Verbose: full output + detailed status block (phase name, what ran, result, next action).

    • Concise (default): bullet-point summary with issues highlighted.

  2. Prompt the user with Proceed to Phase <N+1>? [Y/n] while specifing what is phase N+1 and wait for confirmation before continuing (see "Phase gate" section).

If something fails, do not just dump raw logs. Summarize:

  • the exact command that failed

  • the likely root cause

  • what safe repair you will try next

  • whether the repair succeeded

Token-budget preflight

Phase 0 - token-budget preflight

This phase is mandatory and must run before any SSH connection, repo clone, package/configuration check, container build, reboot, or devkit setting change.

  1. Estimate the full-run token budget for the entire setup workflow, not just the next phase. The values below are conservative heuristics, not measured historical usage. Treat them as initial safety budgets and refine them from actual /hsb-setup run logs once measured token usage is available:

    • Reserve at least 280,000 tokens for a complete setup run on IGX Orin, AGX Orin, or DGX Spark.

    • Reserve at least 340,000 tokens for AGX Thor because native build and SIPL/FuSa checks add more phases and troubleshooting.

    • Add 60,000 tokens when --verbose, custom repo handling, SSH key remediation, reboot recovery, or extra troubleshooting is expected.

    • Use the larger estimate if the platform is not yet known.

  2. Check remaining usage using the best available Claude Code/account usage source for the current subscription plan. Prefer machine-readable or product-provided usage data when available. If no reliable usage source is available, ask the user to provide their current remaining usage/quota from the Claude Code account or plan UI.

    When asking the user because usage cannot be self-verified, present the options in this exact order so the safe stop choices appear first:

    1. I can't verify — stop: The user cannot determine remaining usage. Stop before Phase 1.

    2. I have < {estimate} available — stop: The user checked their plan/account UI and confirms less than the estimated budget remains. Stop before Phase 1.

    3. I have ≥ {estimate} available — proceed: The user checked their plan/account UI and confirms at least the estimated budget remains. Proceed to Phase 1.

    4. Type something: Treat as a question or free-form instruction, answer it, then re-prompt with the same ordered options.

    Do not put the proceed option first. The user must intentionally move past the stop choices before selecting proceed.

  3. Display the result to the user before continuing:

    Token-budget preflight
    - Estimated tokens required for complete /hsb-setup run: <estimate>
    - Estimate basis: conservative heuristic; refine from actual run logs when available
    - Safety margin included: <margin>
    - Remaining plan usage available: <available or "unverified">
    - Result: PASS / FAIL
  4. Stop on insufficient or unverifiable budget:

    • If remaining usage is lower than the estimate, stop before Phase 1 and explain that the skill is refusing to start because it may run out of tokens while modifying devkit settings.

    • If remaining usage cannot be verified, stop before Phase 1 and ask the user to start a fresh session, upgrade/refresh usage, or provide verifiable remaining usage.

    • --y must not bypass this preflight.

Platform questions to ask when missing

Ask only the minimum required questions:

  1. Which platform are you using?

    • IGX Orin iGPU

    • IGX Orin dGPU

    • AGX Orin

    • AGX Thor

    • DGX Spark

  2. Is the HSB board already physically connected and powered on?

  3. Are you okay with commands that require sudo for network and Docker setup?

If the user already provided any of these, do not ask again.

Available Scripts

ScriptPurposeArguments
scripts/hsb_phase_runner.shStructured shell execution with timestamped logs per phase<phase_name> <command>

Use run_script(scripts/hsb_phase_runner.sh, <phase_name>, <command>) to run phase steps with automatic logging.

Phase details

See references/phase-details.md for full step-by-step phase instructions, output style, verbosity behavior, auto-approve mode, phase gate rules, and the persistent SSH session model.

Recovery playbook

Try these fixes in order when applicable:

  1. Re-run the failing command once if the failure looks transient.

  2. Fix missing prerequisites (git-lfs, Docker access, xhost, network route).

  3. Refresh repo state and LFS content.

  4. Re-run only the failed phase, not the whole workflow.

  5. If still blocked, stop with a concise diagnosis and a copy-paste command list for the user.

Supporting files in this skill

Built-in help (--help)

If $ARGUMENTS contains --help or -h, do not run the workflow. Instead, print the following help text verbatim and stop:

Holoscan Sensor Bridge — Demo Bring-Up Skill

USAGE
  /hsb-setup [PLATFORM] [OPTIONS]

PLATFORM (optional — will prompt if omitted)
  AGX Orin          NVIDIA Jetson AGX Orin (iGPU, build with --igpu)
  AGX Thor          NVIDIA Jetson AGX Thor (iGPU, build with --igpu)
  IGX Orin iGPU     NVIDIA IGX Orin in iGPU configuration (build with --igpu)
  IGX Orin dGPU     NVIDIA IGX Orin with discrete GPU (build with --dgpu)
  DGX Spark         NVIDIA DGX Spark (iGPU, build with --igpu)

OPTIONS
  --help, -h        Show this help message and exit
  --verbose         Show full raw command output for every phase
                    (default is concise bullet-point summaries)
  --y               Auto-approve all phase gates (skip user confirmation
                    between phases). Not recommended — a confirmation
                    warning is shown before proceeding. All output is
                    saved to a timestamped log file.
  --repo <URL>      Clone a custom GitHub repo instead of the default
                    nvidia-holoscan/holoscan-sensor-bridge.
                    Can also be set via the HSB_REPO env var.
                    Priority: --repo flag > HSB_REPO env var > default repo

ENVIRONMENT VARIABLES (set before invoking the skill)
  SSH_TARGET        Remote login target (e.g. [email protected])
  REMOTE_ROOT       Remote working directory for repo clone and builds
  REMOTE_SUDO       Privilege escalation: 'sudo', 'sudo -n', or ''
  REMOTE_SSH_OPTS   Additional SSH options (e.g. -o ServerAliveInterval=30)
  HSB_PLATFORM      Platform hint (same values as PLATFORM above)
  HSB_REPO          Custom GitHub repo URL (overridden by --repo flag)

WORKFLOW PHASES
  Phase 0   Token-budget preflight; verify enough plan usage for a full run
  Phase 1   Confirm platform, clone repo, and study user guide
  Phase 2   Host prerequisite checks and network setup
  Phase 3   Native build of CLI tools (AGX Thor only, skipped otherwise)
  Phase 4   Build, run demo container, and verify connectivity
  Phase 5   Produce issues report, optionally export to file
  Phase 6   Stop apps, exit container, hand off to user

  The skill prompts for confirmation between each phase.

EXAMPLES
  /hsb-setup AGX Thor
  /hsb-setup AGX Thor --verbose
  /hsb-setup AGX Thor --y
  /hsb-setup IGX Orin dGPU --repo https://github.com/myorg/my-fork.git
  /hsb-setup --help

After printing the help text, do not proceed with any phases or ask any questions.

See the EXAMPLES section in Built-in help (--help) for invocation examples.

When $ARGUMENTS contains a platform, use it instead of asking again. Strip --verbose, --y, --repo <URL>, and --help from the arguments before parsing the platform name.

Files

docs/failure-playbook.md

Holoscan Sensor Bridge failure playbook

Use this file to explain failures in a user-friendly, action-oriented way.

1. Git clone or refresh fails

Symptoms
  • DNS resolution errors

  • GitHub TLS/network timeout

  • local repo has modified files blocking checkout

Response pattern
  • Show the failing command

  • Say whether it is a network problem, auth problem, or local repo-state problem

  • Prefer safe remedies:

    • retry once for transient network failures

    • git stash only if the user agrees

    • otherwise clone into a new directory

2. Git LFS content missing

Symptoms
  • missing binary/data assets during build

  • placeholder pointer files instead of real content

Remedy
git lfs install
git lfs pull

Then retry only the failed build step.

3. Docker access denied

Symptoms
  • permission denied on Docker socket

  • cannot connect to Docker daemon

Remedy
sudo usermod -aG docker $USER

Then explain that a reboot or fresh login session is required before group membership takes effect.

4. Demo container build fails during image pull

Likely causes
  • not logged in to nvcr.io

  • intermittent network failure

  • proxy/DNS issue

Remedy
  • ask the user to authenticate with Docker if required

  • retry once after login

  • if still failing, capture the exact image and layer pull error

5. Container starts but GUI/visualizer fails

Symptoms
  • segmentation fault from visualizer

  • display access denied

  • blank white window

Remedy
  • ensure the command is launched from a GUI session

  • check DISPLAY

  • run:

xhost +local:docker
  • if needed, retry with xhost +

6. Ping to 192.168.0.2 fails

Likely causes
  • board not powered

  • incorrect cable/port

  • wrong host interface configured

  • missing static IP or route

  • NetworkManager connection not active

Checks
ip addr
ip route
nmcli con show
ping -c 4 192.168.0.2

Explain the result in plain English.

7. Ping works but board is still not usable

Likely causes
  • firmware incompatibility

  • enumeration not happening

  • data plane not flowing

Next checks

Inside the demo container:

hololink enumerate

Explain that ping success only confirms basic IP connectivity, not full HSB readiness.

8. xhost fails over SSH with "unable to open display"

Symptoms
  • xhost: unable to open display ":0" when running via SSH

Likely cause

The SSH session does not have DISPLAY set, or the X server is not on :0. On many systems (especially AGX Thor with GNOME), the display may be :1 or another number.

Remedy
  1. Check existing X sockets: ls /tmp/.X11-unix/

  2. Check active sessions: w (look for a tty login with a desktop session)

  3. Set DISPLAY to the correct value (e.g., :1 if X1 exists)

  4. Set XAUTHORITY=/home/$USER/.Xauthority

  5. Retry xhost +local:docker

export DISPLAY=:1
export XAUTHORITY=/home/$USER/.Xauthority
xhost +local:docker

9. demo.sh fails with "the input device is not a TTY"

Symptoms
  • Running sh docker/demo.sh over SSH produces: the input device is not a TTY

  • Using ssh -t also fails when stdin is not a real terminal (e.g., from Claude Code on Windows)

Likely cause

demo.sh hardcodes docker run -it. The -t flag requires a TTY, which is not available in non-interactive SSH sessions.

Remedy

Invoke docker run directly without the -it flag, replicating all other arguments from demo.sh (volumes, environment variables, network, GPU access, working directory). See the Phase 4 section of the skill for the full command template.

When running from a local GUI session on the host (not over SSH), sh docker/demo.sh works as-is.

Symptoms
  • hololink-enumerate (native binary) crashes with: bind failed with errno=98: "Address already in use"

  • Typically on AGX Thor when running the native enumerate after or alongside a Docker container

Likely cause

The native hololink-enumerate and the containerized hololink enumerate (Python) both bind the same UDP broadcast port for device discovery. Since the demo container uses --net host, they share the host network namespace and conflict.

Remedy
  1. Force-stop all running hololink containers:

docker ps --format '{{.Names}}' | xargs -r -I{} sh -c 'docker stop -t 2 {} 2>/dev/null; docker rm -f {} 2>/dev/null'
  1. Verify no process is still holding the port:

sudo ss -ulnp | grep holo
  1. If a process remains, kill it by PID:

sudo kill <pid>
  1. Retry the native enumerate:

cd <repo-root>/build
timeout 5 ./tools/enumerate/hololink-enumerate
Prevention

Always force-stop the demo container before running native CLI tools, and vice versa. Use docker stop -t 2 followed by docker rm -f rather than just docker rm -f, to give the process a brief grace period before SIGKILL.

10a. Orphaned container keeps running after timeout kills docker run

Symptoms
  • timeout N docker run --name X ... exits after N seconds, but docker ps still shows container X running

  • Subsequent containers or native binaries fail with port conflicts

  • SSH command completes but the remote container is still consuming resources

Root cause

timeout sends SIGTERM/SIGKILL to the local docker run client process, not to the container running in the Docker daemon. The container continues running detached.

Remedy

Never use timeout as the sole mechanism to stop a container. Instead:

  1. Run the container in detached mode (docker run -d --name ...)

  2. Use docker logs -f to stream output

  3. Use a background watchdog to stop the container after the desired duration:

CONTAINER_NAME="hsb_task_$$"
docker run -d --name "$CONTAINER_NAME" --rm [flags] image:tag command

# Watchdog kills the container after N seconds
( sleep N; docker stop -t 2 "$CONTAINER_NAME" 2>/dev/null ) &
WATCHDOG_PID=$!

# Stream logs until the container stops
docker logs -f "$CONTAINER_NAME" 2>&1 || true

# Clean up watchdog process
kill $WATCHDOG_PID 2>/dev/null
wait $WATCHDOG_PID 2>/dev/null

# Belt and suspenders — ensure container is gone
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
Prevention

All container runs in the skill must follow the "Container lifecycle management" section in SKILL.md. Every docker run must have a matching cleanup path.

11. Native build fails on AGX Thor — missing dependencies

Symptoms
  • cmake errors about missing packages (fmt, yaml-cpp, OpenSSL, curlpp, ibverbs)

  • nvcc not found during build

Likely cause

CUDA is installed but not on PATH, or build libraries were not installed.

Remedy
  1. Add CUDA to PATH:

export PATH=/usr/local/cuda-13.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-13.0/lib64:$LD_LIBRARY_PATH
  1. Install missing libraries (from the AGX Thor setup docs):

sudo apt-get update
sudo apt install -y cmake libfmt-dev libssl-dev libcurlpp-dev libyaml-cpp-dev libibverbs-dev python3-dev
  1. Re-run cmake and make.

Symptoms
  • hololink enumerate --count 3 fails with: error: unrecognized arguments: --count 3

Likely cause

The hololink enumerate CLI does not support a --count or iteration-limit flag. It runs indefinitely, printing one enumeration response per second.

Remedy

Run hololink enumerate without --count. Collect at least 3 consistent responses from the output, then stop the container (e.g., docker stop demo or Ctrl-C). Parse the output for mac_id, hsb_ip_version, fpga_crc, ip_address, serial_number, and interface fields.

13. SSH connection lost after nvpmodel reboot

Symptoms
  • echo "YES" | sudo nvpmodel -m 0 triggers an immediate reboot

  • SSH session terminates with Connection to <host> closed by remote host

  • Subsequent SSH attempts fail with Connection refused or Connection timed out for 1–3 minutes

Likely cause

Setting MAXN power mode on AGX Orin requires a reboot. The nvpmodel command reboots the device immediately after receiving YES confirmation, dropping the SSH connection.

Remedy

This is expected behavior, not an error. Wait for the device to reboot and poll SSH connectivity:

for i in $(seq 1 20); do
  sleep 15
  if ssh -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "echo ok" 2>/dev/null; then
    echo "Reconnected after ~$((i * 15)) seconds"
    break
  fi
done

After reconnecting, verify the power mode change took effect:

sudo nvpmodel -q

Should show NV Power Mode: MAXN and mode 0.

Prevention

Always structure Phase 3 so that the MAXN/reboot step comes after all other persistent configurations (sysctl, nmcli) have been applied, minimizing the amount of work that needs to be done post-reboot.

14. SSH key-based authentication fails from Windows host

Symptoms
  • ssh -o BatchMode=yes $SSH_TARGET "echo ok" fails with Permission denied (publickey) or Permission denied (publickey,password)

  • Skill cannot proceed to any remote phases

Likely causes (check in order)
  1. No SSH key pair exists on the Windows host — ~/.ssh/ has no id_ed25519 or id_rsa files

  2. SSH agent is not running — ssh-add -l returns Could not open a connection to your authentication agent

  3. Key exists but is not loaded — ssh-add -l returns The agent has no identities

  4. Public key not deployed on remote host — key is loaded locally but the remote ~/.ssh/authorized_keys does not contain it

Remedy

Follow these steps sequentially, stopping as soon as SSH succeeds:

1. Check for existing keys:

ls ~/.ssh/id_ed25519.pub 2>/dev/null || ls ~/.ssh/id_rsa.pub 2>/dev/null

If no key exists, generate one:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" -C "$USERNAME@$(hostname)"

2. Start SSH agent and load the key:

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519 2>/dev/null || ssh-add ~/.ssh/id_rsa 2>/dev/null

3. Retry SSH. If it still fails, deploy the public key:

# This will prompt the user for the remote password once
cat ~/.ssh/id_ed25519.pub | ssh -o StrictHostKeyChecking=accept-new $REMOTE_SSH_OPTS $SSH_TARGET "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

4. Final verification:

ssh -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "echo ok"
If deployment still fails
  • Verify the password was correct

  • Check remote ~/.ssh ownership: ls -la ~ ~/.ssh (should be owned by the target user, not root)

  • Check remote SSH config: grep PubkeyAuthentication /etc/ssh/sshd_config (must be yes or absent/commented)

  • Check remote authorized_keys is not world-writable: stat -c %a ~/.ssh/authorized_keys (should be 600)

Requirements and compatibility

Written for: Claude Code

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: Declares allowed tools, Claude Code frontmatter

Security

What our scanner noticed· Medium risk

  • Phrasing that asks for actions without confirmation
  • Large base64-encoded blobs
  • References to credential files
  • 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
Holoscan Team
Publisher
NVIDIA (Official)
Distributed by
NVIDIA
Source
NVIDIA/skills · skills/hsb-setup · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Holoscan Team or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download hsb-setup.zip