Hsb Test
NVIDIAOfficialCreated by Holoscan TeamDistributed by NVIDIA
- Skill
- Workflow
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The HSB QA Test Runner is a structured workflow designed to execute automated test plans on Holoscan Sensor Bridge (HSB) hardware. It manages the entire testing lifecycle, from verifying devkit connectivity and container readiness to executing individual test cases, evaluating results, and generating comprehensive reports. The skill includes robust error handling, session state management to skip redundant checks, and an interactive gate-based approach to ensure user oversight during the testing process.
What it does
- Verifies devkit SSH connectivity, board responsiveness, and demo container availability.
- Filters user-provided test plans based on the detected hardware configuration.
- Executes test cases within a containerized environment with automated pass/fail evaluation.
- Provides interactive debugging and analysis for failed test cases.
- Generates a structured, saveable report of all test results and applied fixes.
- Performs automatic cleanup of containers and temporary artifacts after testing.
When to use it
- When you need to perform automated QA testing on an HSB board and devkit.
- When you have a test plan document and need to determine which tests are automatable.
- When you want to ensure consistent test execution and reporting across different hardware setups.
- When you need to verify board identity, FPGA versions, and sensor configurations.
Advantages
- Reduces manual effort by automating test execution and result logging.
- Ensures test reliability through environment verification and containerized execution.
- Provides clear, actionable feedback on test failures with suggested resolutions.
- Supports flexible workflows with both interactive and auto-approve modes.
Usage examples
- “/hsb-test”
- Initiates the interactive HSB testing workflow, starting with environment verification and phase planning.
- “/hsb-test --timeout 60”
- Runs the test suite with a custom 60-second timeout per test case.
- “/hsb-test --y”
- Executes the entire test plan in auto-approve mode, skipping interactive gates for faster, non-stop execution.
- “/hsb-test --full”
- Forces a complete re-verification of the hardware and connectivity, ignoring any existing session state.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/hsb-test/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip hsb-test.zip -d .agents/skills
Documentation by Holoscan Team
HSB QA Test Runner
Use this skill when the user wants to execute a QA test plan against an HSB board and devkit. The skill reads a test document (local file or web link), filters tests to those that can run automatically on the user's specific hardware setup, executes each test with pass/fail evaluation, and produces a comprehensive results report.
This skill assumes the devkit is already set up (SSH, demo container built, host configured, board connected). If setup is not complete, it will offer to invoke /hsb-setup first.
This workflow runs test applications inside the demo container. 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 (optional).SSH_TARGET and REMOTE_ROOT are required. Stop and ask the user for them if either is missing.
Gate 2 — Present the phase plan, ask for the test document, and get confirmation. Before taking any action:
Show the phase plan:
HSB Test — Phase Plan
Phase 0: Verify devkit SSH, board ping, and demo container availability
Phase 1: Obtain test document, confirm setup, build executable test plan
Phase 2: Execute tests, record pass/fail, analyze failures
Phase 3: Produce test results report (with option to save)
Phase 4: Clean up test artifactsIf the user has not provided a test document path or URL, STOP and ask for it — do not proceed to Phase 0 or any phase until the user provides it:
Please provide the path or URL to your test document:. If the user has already specified specific tests (e.g., "connectivity checks only"), state which phases will run and which will be skipped, and note that tests will be filtered to the user's platform/board/sensor configuration and classified as automatable vs. manual.Ask explicitly:
Shall I proceed with Phase 0? [Y/n]— do not start Phase 0 until the user confirms.
What this skill must do
Verify that the devkit is reachable over SSH, the HSB board is connected and responsive, and the demo container is available. Read the current FPGA version and board identity. Verify the type of sensor/camera and hsb devkit and release repo used either from already set environment variables or from prompting the user. If the setup is not ready, offer to invoke
/hsb-setupto prepare the devkit.Obtain a test plan document from the user (file path or URL). Confirm the user's setup details collected in Phase 0 (repo location, HSB version, platform, board type, sensors). Study the test plan and the repository's
examples/directory to determine which tests can run automatically. Skip manual tests and tests requiring additional equipment. Present the executable test plan for user approval.Execute each test case in sequence. For each test: run the application, evaluate pass/fail against the criteria in the test plan, log the result. On failure, analyze logs, suggest fixes, and let the user decide how to proceed before running the next test.
Produce a structured test results report with per-test pass/fail status, issues encountered, and fixes applied. Offer to save the report.
Clean up all test artifacts (containers, temporary files, session state).
Linux/Windows-friendly wrapper variables
Reuse the same environment variables from the other HSB skills:
SSH_TARGETfor the remote login target (e.g.nvidia@agx-thor-host)REMOTE_ROOTfor the remote working directoryREMOTE_SUDOfor privileged commandsREMOTE_SSH_OPTSfor additional SSH optionsHSB_PLATFORMas an optional platform hint
If these are set, notify the user of these settings and use them without re-asking.
Before Phase 0, print the resolved remote execution settings.
Mandatory interaction pattern
First run in a session (no prior verification)
When no valid session state exists, show the full phase plan:
Phase 0: Verify board connectivity, demo container readiness, and user setup (release repo, platform, sensor/camera)
Phase 1: Obtain test plan, confirm setup, build executable test list
Phase 2: Execute test plan with per-test pass/fail evaluation
Phase 3: Generate test results report (with option to save)
Phase 4: Cleanup
Then execute one phase at a time.
Subsequent runs in the same session (fast path)
When the session state file (/tmp/.claude_hsb_test_session/state.sh) exists and contains _SESSION_VERIFIED=true, the skill skips Phase 0 and Phase 1 setup confirmation because connectivity, hardware, release repo, platform, and sensor/camera were already verified. Instead, inform the user and jump directly to test plan intake:
Session already verified — skipping connectivity checks.
SSH target: $SSH_TARGET
Release repo: /home/work/holoscan-sensor-bridge (HSB vX.X.X)
Platform: AGX Thor
Board: HSB Lattice | FPGA: XXXX
Sensors: Dual IMX274
Proceeding directly to test plan intake.Then execute:
Phase 1 (test plan intake and test list building — setup confirmation is skipped)
Phase 2: Execute test plan
Phase 3: Test results report
Phase 4: Cleanup
When to re-run Phase 0 from the beginning
Phase 0 must be re-run (ignoring the fast path) when:
New session: No session state file exists on the remote host, or a new Claude Code session is started.
Execution failure suggesting connectivity loss: If Phase 2 fails with symptoms indicating the board or devkit is unreachable (ping failure, SSH timeout, container launch failure,
No such deviceerrors), clear_SESSION_VERIFIEDfrom the session state and re-run Phase 0 before retrying.User explicitly requests it: If the user says "re-verify", "start over", "run from the beginning", or invokes
/hsb-test --full, run Phase 0 from scratch.
See ## Phase gate below for the full confirmation protocol.
If something fails, do not just dump raw logs. Summarize:
the exact command that failed
the likely root cause
what safe action you recommend
whether the issue is blocking
Phase details
See references/phase-details.md for full step-by-step phase instructions.
Execution rules
SSH heredoc pattern
Use the same persistent SSH session model as the other HSB skills. Each phase runs as a single SSH heredoc block:
ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s <<'REMOTE'
set -e
# restore state from previous phase
source /tmp/.claude_hsb_test_session/state.sh 2>/dev/null || true
cd "${_CLAUDE_CWD:-__REMOTE_ROOT__}"
# phase commands
echo "=== Phase N: description ==="
command1
command2
# save state for next phase (preserves _SESSION_VERIFIED if already set)
_PREV_VERIFIED="${_SESSION_VERIFIED:-}"
mkdir -p /tmp/.claude_hsb_test_session
{
echo "export _CLAUDE_CWD=\"$(pwd)\""
echo "export PATH=\"$PATH\""
echo "export REPO_DIR=\"$REPO_DIR\""
echo "export VERSION=\"$VERSION\""
echo "export HSB_PLATFORM=\"$HSB_PLATFORM\""
echo "export BOARD_TYPE=\"$BOARD_TYPE\""
echo "export SENSORS=\"$SENSORS\""
echo "export FPGA_VERSION=\"$FPGA_VERSION\""
echo "export TEST_PLAN_SOURCE=\"$TEST_PLAN_SOURCE\""
[ "$_PREV_VERIFIED" = "true" ] && echo "export _SESSION_VERIFIED=true"
} > /tmp/.claude_hsb_test_session/state.sh
REMOTEReplace __REMOTE_ROOT__ with the literal value of $REMOTE_ROOT when composing the heredoc.
Container usage for tests
Test commands run inside the demo container. Use the detached pattern with a named container and a watchdog for timeout enforcement.
Default timeout per test: 120 seconds (2 minutes). Overridden by:
--timeout Non the skill invocation (applies to all tests)Per-test timeout specified in the test plan
Cleanup after each test container
After every test run, stop and remove the container. See references/phase-details.md for the cleanup pattern.
Session teardown
Handled by Phase 4. If the workflow is aborted before Phase 4:
docker ps --filter "name=hsb_test_" --format '{{.Names}}' | xargs -r docker stop -t 2 2>/dev/null || true
ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "rm -rf /tmp/.claude_hsb_test_session"Phase gate — user confirmation between phases
After completing each phase (Phases 0–3), always prompt the user for confirmation before starting the next phase.
Exception: When --y (auto-approve mode) is active, phase gates are skipped. See "Auto-approve mode (--y)" section.
Exception: Phase 4 (cleanup) runs automatically after Phase 3 without a gate.
Proceed to Phase <N+1> (<phase description>)? [Y/n]User response handling
All prompts in this skill require explicit typed responses. Never treat a blank or Enter-only input as a selection — re-prompt the user instead.
"y", "yes", "Y", "ok", "go", "continue", "next" → proceed to the next phase.
"n", "no", "stop", "abort" → stop execution. Print:
QA testing paused after Phase N. You can resume by re-invoking the skill.Then run session teardown.
Any other text → treat as a question or instruction about the current phase. Answer it, then re-prompt.
"retry" → re-execute the current phase, show summary again, then re-prompt.
Exceptions
Phase 4 (cleanup) is the final phase — it runs automatically after Phase 3 completes or after the user declines to run another test plan.
If a phase FAILs and cannot be recovered, stop and report clearly, then run cleanup.
Built-in help (--help)
If $ARGUMENTS contains --help or -h, print the following and stop:
HSB QA Test Runner Skill
USAGE
/hsb-test [OPTIONS]
OPTIONS
--help, -h Show this help message and exit
--verbose Show full raw command output for every phase
--y Auto-approve all phase gates and skip interactive
debugging on test failures. Not recommended — a
confirmation warning is shown before proceeding.
All output is saved to a timestamped log file.
--timeout N Set per-test runtime in seconds (default: 120s).
Tests stop after N seconds or when pass/fail can
be determined, whichever comes first.
--full Force full verification from Phase 0, even if the
session was already verified
ENVIRONMENT VARIABLES (set before invoking the skill)
SSH_TARGET Remote login target (e.g. [email protected])
REMOTE_ROOT Remote working directory
REMOTE_SUDO Privilege escalation: 'sudo', 'sudo -n', or ''
REMOTE_SSH_OPTS Additional SSH options
HSB_PLATFORM Platform hint
WORKFLOW PHASES
Phase 0 Verify board connectivity, demo container readiness,
and user setup (release repo, platform, sensor/camera)
(skipped on repeat runs in the same session)
Phase 1 Obtain test plan, confirm setup, build executable test list
(setup confirmation skipped on repeat runs)
Phase 2 Execute test plan with per-test pass/fail evaluation
Phase 3 Generate and optionally save test results report
Phase 4 Cleanup (automatic)
EXAMPLES
/hsb-test
/hsb-test --verbose
/hsb-test --timeout 60
/hsb-test --y
/hsb-test --y --timeout 60
/hsb-test --full
/hsb-test --helpInvocation examples
/hsb-test/hsb-test --verbose/hsb-test --timeout 60/hsb-test --timeout 60 --verbose/hsb-test --y/hsb-test --y --timeout 60/hsb-test --full/hsb-test --full --verbose/hsb-test --help
Verbosity mode (--verbose)
The skill supports a --verbose flag:
Detecting the flag
Check whether $ARGUMENTS (the text after the slash command) contains any of: --help / -h, --verbose, --y, --timeout N, or --full (case-insensitive). Strip all flags (and their values) from arguments before further parsing.
When --full is present, ignore any cached session state and run Phase 0 from scratch.
Verbose mode (when set)
Show complete raw output of every SSH command
Show full test application output inline (all stdout/stderr)
Show detailed phase status blocks
Concise mode (default, no --verbose)
Show bullet-point summaries after each phase
Suppress raw command output
Show key test output lines (startup, errors, pass/fail indicators) but not every line
Show issues with the 4-line format (Symptom, Cause, Resolution, Blocking)
Auto-approve mode (--y)
The skill supports a --y flag that skips all phase gates and runs the entire workflow from start to finish without waiting for user confirmation between phases. This is not recommended for QA testing.
Confirmation warning
When --y is detected, display a warning and ask the user to confirm:
⚠ WARNING: Auto-approve mode (--y) is enabled.
This is NOT RECOMMENDED for QA testing. All phase gates will be skipped
and the entire test plan will execute without pausing for your
confirmation between phases or tests.
You will not be able to review intermediate results, intervene on
failures, or abort between tests. All output will be saved to a
timestamped log file.
NOTE: In auto-approve mode, you must still provide the test plan in
Phase 1. Failed tests are logged but not interactively debugged —
testing continues to the next test automatically.
Type 'yes' to confirm auto-approve mode, or anything else to cancel:If the user responds with "yes" (exact match, case-insensitive) → enable auto-approve mode.
Any other response → cancel auto-approve mode and run interactively.
Behavior when --y is active
Phase gates are skipped between phases.
Test plan approval is skipped — the generated test plan executes automatically.
Failed tests do not pause — failures are logged and testing continues to the next test case automatically.
Inter-test prompts are skipped — tests run back-to-back without confirmation.
Default timeout applies — 120 seconds per test, or
--timeout Nif specified.Log file: Created at start as
hsb-test-log-YYYY-MM-DD-HHMMSS.mdin$REMOTE_ROOT/or current directory.Phase summaries are still shown in real time.
Blocking connectivity failures still stop the workflow and trigger re-verification.
Combining with other flags
--y --verbose: Auto-approve with full raw output.--y --timeout N: Auto-approve with a custom per-test timeout.--y --full: Auto-approve with forced full verification from Phase 0.
Timeout handling (--timeout)
The skill supports a --timeout N flag where N is the number of seconds to run each test.
Behavior
When set: Each test runs for at most N seconds, then is stopped. Pass/fail is evaluated from the output collected during that window.
When not set: Each test runs for at most 120 seconds (2 minutes) by default, or until pass/fail can be determined from the output, whichever comes first.
Per-test override: If the test plan specifies a timeout for a specific test, that value takes precedence over both the default and the
--timeoutflag.
Validation
N must be a positive integer
Minimum: 5 seconds
Maximum: 3600 seconds (1 hour)
If invalid, show an error and ask the user to provide a valid timeout
Files
- ATTRIBUTION.mdAdded by AutoGineer889 B
- BENCHMARK.md4.2 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md16.3 KiB
- evals/evals.json2.0 KiB
- references/phase-details.md22.1 KiB
- skill-card.md3.8 KiB
- skill.oms.sig4.7 KiB
references/phase-details.md
Phase Details — hsb-test
Phase 0 — Verify board connectivity, demo container readiness, and user setup
Fast-path skip: If the session state file exists and contains _SESSION_VERIFIED=true, skip this entire phase. See "Subsequent runs in the same session" above.
Prerequisites
This phase assumes the devkit already has:
A working SSH connection from the user's machine
The HSB demo container built and available (from
/hsb-setupor manual setup)The HSB board physically connected and powered
If any of these are missing, offer to invoke /hsb-setup:
The devkit does not appear to have a working HSB setup.
Would you like me to run /hsb-setup to prepare the devkit for QA testing?
If you have a specific SW tag, branch, or local directory to use, provide it now:
- Tag/branch example: v2.5.0, main, feature/my-branch
- Local directory example: /home/work/holoscan-sensor-bridge
Type 'setup' to run /hsb-setup, or 'skip' to continue without setup:If the user chooses to run setup, hand off to /hsb-setup with the provided tag/branch/directory, then resume Phase 0 after setup completes.
Steps
Validate SSH connectivity to the devkit:
ssh -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "echo ok"If SSH fails, follow the same SSH key auto-remediation flow described in the
hsb-setupskill.Initialize the test session on the remote host:
ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s <<'REMOTE' mkdir -p /tmp/.claude_hsb_test_session echo "export _CLAUDE_CWD=\"__REMOTE_ROOT__\"" > /tmp/.claude_hsb_test_session/state.sh echo "test session initialized" REMOTEPing the HSB board at
192.168.0.2:ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "ping -c 4 -W 2 192.168.0.2"If ping fails, inform the user and ask if the board might be at a different IP address.
Verify the demo container image exists:
ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s <<'REMOTE' source /tmp/.claude_hsb_test_session/state.sh 2>/dev/null || true cd "${_CLAUDE_CWD:-__REMOTE_ROOT__}" for dir in holoscan-sensor-bridge*; do if [ -f "$dir/VERSION" ]; then VERSION=$(cat "$dir/VERSION") if docker image inspect "hololink-demo:$VERSION" >/dev/null 2>&1; then echo "REPO_DIR=$dir" echo "VERSION=$VERSION" echo "CONTAINER_FOUND=yes" break fi fi done REMOTEIf no demo container is found, offer to run
/hsb-setupas described in Prerequisites.Run
hololink enumerateinside the demo container to read board identity:CONTAINER_NAME="hsb_test_enumerate_$$" cd $REPO_DIR VERSION=$(cat VERSION) docker run -d --name "$CONTAINER_NAME" --rm \ --net host --gpus all --runtime=nvidia --shm-size=1gb --privileged \ -v $PWD:$PWD -v /dev:/dev -w $PWD \ -e NVIDIA_DRIVER_CAPABILITIES=graphics,video,compute,utility,display \ -e NVIDIA_VISIBLE_DEVICES=all \ hololink-demo:$VERSION \ hololink enumerate ( sleep 10; docker stop -t 2 "$CONTAINER_NAME" 2>/dev/null ) & WATCHDOG_PID=$! docker logs -f "$CONTAINER_NAME" 2>&1 || true kill $WATCHDOG_PID 2>/dev/null wait $WATCHDOG_PID 2>/dev/null docker rm -f "$CONTAINER_NAME" 2>/dev/null || trueParse the output to extract:
FPGA version
MAC address
Serial number
Board type — detect via
fpga_uuid:
fpga_uuidBoard Type 889b7ce3-65a5-4247-8b05-4ff1904c3359HSB Lattice (CPNX100-ETH-SENSOR-BRIDGE) f1627640-b4dc-48af-a360-c55b09b3d230Leopard Imaging VB1940 (Eagle Camera) If the UUID matches a known value, set
BOARD_TYPEtolatticeorvb1940. If the UUID is not reported (older firmware) or is unknown, leaveBOARD_TYPEempty — step 8 will ask the user.Verify the release repo — confirm the repo path and version found in step 4:
echo "Release repo: $REPO_DIR (HSB version $VERSION)"Save
REPO_DIRandVERSIONto the session state.Detect or confirm the platform — use
HSB_PLATFORMenvironment variable if set; otherwise ask the user:Which NVIDIA devkit platform are you using? [1] IGX Orin iGPU [2] IGX Orin dGPU [3] AGX Orin [4] AGX Thor [5] DGX Spark Select platform [1-5]:Save the result as
HSB_PLATFORMin the session state.Detect or confirm the board type — use the UUID-based detection from step 5 if available. If
BOARD_TYPEis already set (from UUID), confirm with the user. Otherwise ask:Which HSB board type is connected? [1] HSB Lattice (CPNX100-ETH-SENSOR-BRIDGE standalone board) [2] Leopard Imaging VB1940 (all-in-one Eagle Camera with integrated FPGA) Select board type [1-2]:Detect or confirm the connected sensor / camera — ask the user which sensor(s) are connected to the HSB board. Common configurations:
Which sensor(s) / camera(s) are connected? [1] Dual IMX274 cameras [2] Single IMX274 camera [3] VB1940 camera (integral to VB1940 board) [4] IMX477 camera [5] Other (please specify) Select sensor configuration:If the board type is VB1940, default the sensor to "VB1940 camera" and confirm.
Save the result as
SENSORSin the session state.Display results and mark session as verified:
Board and Environment:
- SSH target: $SSH_TARGET
- Board IP: 192.168.0.2
- Release repo: <path> (HSB version X.X.X)
- Platform: AGX Thor / IGX Orin / ...
- Board type: HSB Lattice / Leopard Imaging VB1940 (detected via UUID) / unknown
- FPGA version: XXXX
- MAC address: XX:XX:XX:XX:XX:XX
- Sensors: Dual IMX274 / VB1940 camera / ...
- Demo container: hololink-demo:X.X.X (ready)Append verification flag to session state:
echo 'export _SESSION_VERIFIED=true' >> /tmp/.claude_hsb_test_session/state.shPhase 0 summary format
**Phase 0 — Verify board connectivity, container readiness, and user setup**
- SSH connectivity to $SSH_TARGET: OK
- Board ping (192.168.0.2): 4/4 packets, 0% loss
- Release repo: /home/work/holoscan-sensor-bridge (HSB vX.X.X)
- Platform: AGX Thor
- Board type: HSB Lattice (detected via UUID)
- FPGA version: XXXX
- Sensors: Dual IMX274
- Demo container: hololink-demo:X.X.X ready
- Status: PASS
Proceed to Phase 1 (obtain test plan and build test list)? [Y/n]Phase 1 — Obtain test plan, confirm setup, build executable test list
This phase obtains the test plan from the user, confirms the hardware setup collected in Phase 0, and determines which tests can run automatically.
Step 1 — Obtain the test plan
Ask the user for the test plan source:
Please provide the QA test plan. You can provide:
- A local file path on your machine (e.g., C:\tests\hsb-qa-plan.md)
- A local file path on the devkit (e.g., /home/work/test-plan.md)
- A URL to a web page with the test plan (e.g., https://confluence.example.com/hsb-qa)
Type the path or URL:If a local file path (on the user's machine): Read the file using the Read tool.
If a remote file path (on the devkit): Fetch the file via SSH:
ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET "cat <path>"If a URL: Fetch the content using the WebFetch tool or ask the user to paste the relevant content.
After reading the test plan, confirm with the user:
Test plan loaded: <filename or URL>
Found N test cases in the document.
Type 'yes' to confirm or provide a different source:Step 2 — Confirm user setup details
Fast-path skip: If the session state already contains setup details (REPO_DIR, VERSION, HSB_PLATFORM, BOARD_TYPE, SENSORS), skip this step entirely. Show a one-line reminder of the cached setup and proceed directly to Step 3.
On a full run, all setup details should already be collected from Phase 0 (release repo, version, platform, board type, and sensors). Display the collected values and ask the user to confirm or correct:
Your Setup (from Phase 0):
- Repo path: /home/work/holoscan-sensor-bridge
- HSB version: X.X.X
- Platform: AGX Thor
- Board type: HSB Lattice
- FPGA version: XXXX
- Sensors: Dual IMX274
Type 'yes' to confirm or 'no' to correct:If the user wants to correct any value, re-prompt for that specific item only.
Step 3 — Analyze the test plan and build executable test list
After the user confirms their setup:
Parse the test plan document to extract individual test cases. For each test case, identify:
Test case ID / name
Description / purpose
Required hardware (devkit type, board type, sensor type)
Required software (HSB version, FPGA version)
Test steps / commands to execute
Pass/fail criteria (expected output, timing thresholds, error-free execution, specific log patterns)
Whether the test is manual or automatable
Whether the test requires additional equipment beyond the devkit and HSB board + sensors
Scan the
examples/directory on the remote host to map test cases to actual runnable applications:ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s <<'REMOTE' source /tmp/.claude_hsb_test_session/state.sh 2>/dev/null || true cd "$REPO_DIR" echo "=== Examples directory listing ===" find examples/ -name "*.py" -o -name "*.sh" -o -name "README*" | sort echo "=== Top-level runnable scripts ===" ls -1 *.py 2>/dev/null || true echo "=== Example READMEs ===" for readme in examples/*/README* examples/*/readme*; do if [ -f "$readme" ]; then echo "--- $readme ---" head -30 "$readme" echo "" fi done REMOTEClassify each test case into one of these categories:
Category Description Action Automatable Can run entirely via the demo container, pass/fail criteria can be evaluated from log output Include in executable test plan Manual Requires human visual inspection, physical interaction, or subjective judgment Skip — log as "SKIPPED (manual)" Extra equipment Requires hardware beyond the devkit + HSB board + connected sensors Skip — log as "SKIPPED (extra equipment needed)" Incompatible Requires a different platform, sensor, or FPGA version than the user has Skip — log as "SKIPPED (incompatible with setup)" For each automatable test, determine:
The exact command to run (e.g.,
python3 examples/imx274_player.py --headless— only if user explicitly requested headless)How to evaluate pass/fail from the output (e.g., "no ERROR lines", "pipeline started within 5s", "frames > 0", specific output patterns)
Default timeout: 120 seconds (2 minutes) unless the user specified
--timeoutor the test plan specifies a different durationAny test-specific options from the test plan
Step 4 — Present the executable test plan
Display the test plan for user approval:
Executable Test Plan
════════════════════
Setup: AGX Thor | HSB Lattice | Dual IMX274 | FPGA XXXX | HSB vX.X.X
Automatable Tests (will execute):
──────────────────────────────────
[1] TC-001: IMX274 single camera streaming
App: examples/imx274_player.py
Pass criteria: Pipeline starts, frames > 0, no ERROR in log
Timeout: 120s
[2] TC-002: Stereo IMX274 streaming
App: examples/stereo_imx274.py
Pass criteria: Both cameras produce frames, no ERROR in log
Timeout: 120s
[3] TC-003: PTP synchronization test
App: examples/linux_ptp_player.py
Pass criteria: PTP lock acquired, frame timestamps monotonic
Timeout: 120s
Skipped Tests:
──────────────
[S1] TC-010: Visual quality inspection — SKIPPED (manual)
[S2] TC-011: External trigger test — SKIPPED (extra equipment needed)
[S3] TC-015: VB1940 streaming — SKIPPED (incompatible with setup)
Total: N automatable | M skipped
Type 'yes' to approve and begin testing, or suggest changes:When --y is active: Skip this approval prompt and proceed with the test plan automatically.
Phase 1 summary format
**Phase 1 — Test plan analysis and preparation**
- Test plan loaded: <source>
- Setup confirmed: <repo path> (HSB vX.X.X) | <platform> | <board type> | <sensors>
- Total test cases in plan: N
- Automatable tests: X
- Skipped (manual): Y
- Skipped (extra equipment): Z
- Skipped (incompatible): W
- Default timeout: 120s per test
- Status: PASS
Proceed to Phase 2 (execute test plan)? [Y/n]Phase 2 — Execute test plan
This phase runs each automatable test case in sequence, evaluates pass/fail, and handles failures interactively.
Per-test execution flow
For each test case in the approved test plan:
Announce the test:
═══════════════════════════════════════════ Running TC-001: IMX274 single camera streaming App: examples/imx274_player.py Pass criteria: Pipeline starts, frames > 0, no ERROR in log Timeout: 120s ═══════════════════════════════════════════Pre-test checks:
Ping the board to confirm it's still responsive
Stop any conflicting containers:
docker ps --filter "name=hsb_" --format '{{.Names}}' | xargs -r docker stop -t 2 2>/dev/null || trueSet up display (do NOT add
--headlessunless the user explicitly requested it):DISPLAY_NUM=$(ls /tmp/.X11-unix/ 2>/dev/null | head -1 | tr -d 'X') export DISPLAY=":${DISPLAY_NUM:-0}" xhost +local:docker 2>/dev/null || true
Run the test application inside the demo container:
CONTAINER_NAME="hsb_test_run_$$" cd $REPO_DIR VERSION=$(cat VERSION) docker run -d --name "$CONTAINER_NAME" --rm \ --net host --gpus all --runtime=nvidia --shm-size=1gb --privileged \ -v $PWD:$PWD -v /dev:/dev -w $PWD \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e NVIDIA_DRIVER_CAPABILITIES=graphics,video,compute,utility,display \ -e NVIDIA_VISIBLE_DEVICES=all \ -e DISPLAY=$DISPLAY \ hololink-demo:$VERSION \ python3 <app_path> <app_options> ( sleep $TIMEOUT; docker stop -t 5 "$CONTAINER_NAME" 2>/dev/null ) & WATCHDOG_PID=$! docker logs -f "$CONTAINER_NAME" 2>&1 EXIT_CODE=$? kill $WATCHDOG_PID 2>/dev/null wait $WATCHDOG_PID 2>/dev/null docker rm -f "$CONTAINER_NAME" 2>/dev/null || trueIMPORTANT —
--headlessrule: Never add--headlessto a test command automatically. Only use--headlessif the user explicitly requests it. If a DISPLAY-related error occurs, inform the user and ask whether they want to re-run with--headless.Evaluate pass/fail against the criteria from the test plan:
Check exit code (0 = expected for timeout-stopped apps)
Search log output for ERROR / CRITICAL / traceback patterns
Check for specific pass criteria (e.g., "pipeline started", "frames captured: N > 0")
Check for specific fail indicators from the test plan
If the app ran for the full timeout without errors, and pass criteria are met → PASS
If the app crashed, produced errors, or failed pass criteria → FAIL
Report the result:
If PASS:
TC-001: IMX274 single camera streaming — PASS ✓ Duration: 120s (timeout) Key output: pipeline started, 3600 frames captured, 0 errorsIf FAIL:
TC-001: IMX274 single camera streaming — FAIL ✗ Duration: 3s (crashed) Error: ModuleNotFoundError: No module named 'cv2' Cause: OpenCV is not installed in the demo container Suggestion: Run 'pip install opencv-python-headless' inside the container Options: [1] Apply the fix and re-run this test [2] Skip this test and continue to the next [3] Stop testing and go to the report Type your choice (1, 2, or 3), or provide your own suggestion:Handle user response to failures:
Fix and re-run: Apply the suggested fix (or the user's custom fix), re-run the same test, re-evaluate. Track iterations.
Skip: Mark the test as FAIL in the report and move to the next test.
Stop: Proceed directly to Phase 3 (report).
User provides a suggestion: Try to implement the user's suggestion, re-run the test.
When
--yis active: On failure, log the failure and automatically move to the next test (no interactive debugging).Cleanup after each test:
docker stop -t 5 "$CONTAINER_NAME" 2>/dev/null || true docker rm -f "$CONTAINER_NAME" 2>/dev/null || trueBefore starting the next test, prompt the user (unless
--yis active):Test TC-001 complete. Proceed to TC-002? Type 'yes' to continue, 'skip' to skip, or 'stop' to end testing:
Connectivity-related failures trigger re-verification
If a test failure indicates a connectivity issue (SSH timeout, board ping failure, container launch failure, No such device when the device was previously working), clear the session verification flag and inform the user:
This failure suggests a connectivity issue. The session verification
will be reset. Re-running Phase 0 to check board and devkit status...Then re-run Phase 0 from scratch. After Phase 0 passes, resume testing from the test that failed.
Phase 2 summary format
**Phase 2 — Test execution**
- Tests executed: X of Y
- Passed: P
- Failed: F
- Skipped during execution: S
- Status: PASS / PARTIAL / FAIL
Proceed to Phase 3 (test results report)? [Y/n]Phase 3 — Test results report
Generate a comprehensive test results report:
═══════════════════════════════════════════════════ HSB QA Test Results Report ═══════════════════════════════════════════════════ Date: YYYY-MM-DD HH:MM:SS Operator: $USER Test Plan: <source file/URL> Environment ─────────── SSH Target : $SSH_TARGET Release Repo : /home/work/holoscan-sensor-bridge HSB Version : X.X.X Platform : AGX Thor Board Type : HSB Lattice FPGA Version : XXXX Sensors : Dual IMX274 Demo Container : hololink-demo:X.X.X Test Results Summary ──────────────────── | # | Test Case | App | Result | Duration | Notes | |---|-----------|-----|--------|----------|-------| | 1 | TC-001: IMX274 streaming | imx274_player.py | PASS | 120s | 3600 frames | | 2 | TC-002: Stereo streaming | stereo_imx274.py | FAIL | 3s | OpenCV missing | | 3 | TC-003: PTP sync test | linux_ptp_player.py | PASS | 120s | PTP locked | | - | TC-010: Visual quality | — | SKIPPED | — | Manual test | | - | TC-011: External trigger | — | SKIPPED | — | Extra equipment | Overall: P PASSED | F FAILED | S SKIPPED of N total Failed Test Details ─────────────────── [If no failures:] All executed tests passed. [If failures:] TC-002: Stereo IMX274 streaming — FAIL Error : ModuleNotFoundError: No module named 'cv2' Cause : OpenCV not installed in demo container Fix tried: pip install opencv-python-headless Outcome : Re-run passed after fix / Still failed Iterations: 2 Issues Encountered ────────────────── [If no issues:] No issues encountered during testing. [If issues:] 1. <Issue title> Symptom : <what happened> Cause : <root cause> Resolution : <how it was fixed> Blocking : Yes / No Phase Summary ───────────── | Phase | Name | Status | |-------|-------------------------|--------| | 0 | Board, container & setup | PASS | | 1 | Test plan & preparation | PASS | | 2 | Test execution | PASS | | 3 | Test results report | PASS | | 4 | Cleanup | PASS | Overall Status: PASS / FAIL ═══════════════════════════════════════════════════Offer to save the report:
Type 'yes' to save this report to a file, or 'no' to skip:If the user agrees:
Save to
$REMOTE_ROOT/hsb-test-report-YYYY-MM-DD-HHMMSS.mdon the remote hostAlso offer to save locally on the user's machine
Confirm the saved file path
Ask if the user wants to run another test plan:
Type 'yes' to run another test plan, or 'no' to proceed to cleanup:If yes, loop back to Phase 1 (test plan intake) using the fast path — Phase 0 and setup confirmation are skipped.
Phase 3 summary format
**Phase 3 — Test results report**
- Report generated
- Results: P passed, F failed, S skipped of N total
- Report saved: [path or "not saved"]
- Status: PASSPhase 4 — Cleanup
Remove all test session artifacts from the devkit.
Artifacts to remove
Stop and remove any running test containers:
docker ps --filter "name=hsb_test_" --format '{{.Names}}' | xargs -r docker stop -t 2 2>/dev/null || true docker ps -a --filter "name=hsb_test_" --format '{{.Names}}' | xargs -r docker rm -f 2>/dev/null || trueRemove the test session state directory:
rm -rf /tmp/.claude_hsb_test_sessionRemove any temporary test files created during test execution:
rm -f /tmp/hsb_test_*.log /tmp/hsb_test_*.tmp 2>/dev/null || true
Phase 4 summary format
**Phase 4 — Cleanup**
- Test containers stopped and removed
- Session state cleaned up
- Temporary files removed
- Status: PASS
QA testing session complete.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, Needs a command-line tool
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
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-test · 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-test.zip