[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-hsb-test":3,"mdc-70tcsl-key":34,"related-repo-nvidia-hsb-test":1992,"related-org-nvidia-hsb-test":2095},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"hsb-test","execute QA tests on Holoscan hardware","Execute QA test plans on Holoscan Sensor Bridge hardware. Reads a user-provided test document, filters tests by the user's setup, determines which tests can run automatically, executes them with pass\u002Ffail evaluation, and produces a structured test results report.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Hardware","hardware","tag",{"name":17,"slug":18,"type":15},"QA","qa",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Testing","testing",2473,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills","2026-07-14T05:27:47.796662","Apache-2.0",281,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"AI agent skills published by NVIDIA","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fhsb-test","---\nname: hsb-test\ndescription: Execute QA test plans on Holoscan Sensor Bridge hardware. Reads a user-provided test document, filters tests by the user's setup, determines which tests can run automatically, executes them with pass\u002Ffail evaluation, and produces a structured test results report.\nauthor: \"Holoscan Team \u003Choloscan-team@nvidia.com>\"\nlicense: \"Apache-2.0\"\nversion: \"1.0.0\"\ntags:\n  - holoscan-sensor-bridge\n  - hsb\n  - testing\ntools:\n  - Read\n  - Write\n  - Edit\n  - Grep\n  - Glob\n  - Bash\ndisable-model-invocation: true\nallowed-tools: Read,Write,Edit,MultiEdit,Grep,Glob,Bash\nmetadata:\n  author: \"Holoscan Team \u003Choloscan-team@nvidia.com>\"\n  team: holoscan\n  tags:\n    - holoscan-sensor-bridge\n    - hsb\n    - testing\n  agents:\n    - claude-code\n    - codex\n---\n\n# HSB QA Test Runner\n\nUse 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\u002Ffail evaluation, and produces a comprehensive results report.\n\nThis 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 `\u002Fhsb-setup` first.\n\nThis workflow runs test applications inside the demo container. Only run it when the user explicitly invokes it.\n\n## Before you start — required gates (do these first, in order)\n\n**Gate 1 — Read environment variables.** Before doing anything else, check these variables and print their resolved values to the user:\n\n```\nSSH_TARGET      Remote devkit login (e.g. nvidia@192.168.1.50). Ask the user if not set.\nREMOTE_ROOT     Remote working directory (e.g. \u002Fhome\u002Fnvidia). Ask the user if not set.\nREMOTE_SUDO     sudo \u002F sudo -n \u002F \"\" — default to \"sudo\" if not set.\nREMOTE_SSH_OPTS Additional SSH options (optional).\nHSB_PLATFORM    Platform hint (optional).\n```\n\n**SSH_TARGET and REMOTE_ROOT are required. Stop and ask the user for them if either is missing.**\n\n**Gate 2 — Present the phase plan, ask for the test document, and get confirmation.** Before taking any action:\n\n1. Show the phase plan:\n\n```\nHSB Test — Phase Plan\n  Phase 0: Verify devkit SSH, board ping, and demo container availability\n  Phase 1: Obtain test document, confirm setup, build executable test plan\n  Phase 2: Execute tests, record pass\u002Ffail, analyze failures\n  Phase 3: Produce test results report (with option to save)\n  Phase 4: Clean up test artifacts\n```\n\n2. **If 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\u002Fboard\u002Fsensor configuration and classified as automatable vs. manual.\n\n3. Ask explicitly: `Shall I proceed with Phase 0? [Y\u002Fn]` — do not start Phase 0 until the user confirms.\n\n## What this skill must do\n\n1. 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\u002Fcamera 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 `\u002Fhsb-setup` to prepare the devkit.\n2. 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\u002F` directory to determine which tests can run automatically. Skip manual tests and tests requiring additional equipment. Present the executable test plan for user approval.\n3. Execute each test case in sequence. For each test: run the application, evaluate pass\u002Ffail 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.\n4. Produce a structured test results report with per-test pass\u002Ffail status, issues encountered, and fixes applied. Offer to save the report.\n5. Clean up all test artifacts (containers, temporary files, session state).\n\n## Linux\u002FWindows-friendly wrapper variables\n\nReuse the same environment variables from the other HSB skills:\n\n- `SSH_TARGET` for the remote login target (e.g. `nvidia@agx-thor-host`)\n- `REMOTE_ROOT` for the remote working directory\n- `REMOTE_SUDO` for privileged commands\n- `REMOTE_SSH_OPTS` for additional SSH options\n- `HSB_PLATFORM` as an optional platform hint\n\nIf these are set, notify the user of these settings and use them without re-asking.\n\nBefore Phase 0, print the resolved remote execution settings.\n\n## Mandatory interaction pattern\n\n### First run in a session (no prior verification)\n\nWhen no valid session state exists, show the full phase plan:\n\n- Phase 0: Verify board connectivity, demo container readiness, and user setup (release repo, platform, sensor\u002Fcamera)\n- Phase 1: Obtain test plan, confirm setup, build executable test list\n- Phase 2: Execute test plan with per-test pass\u002Ffail evaluation\n- Phase 3: Generate test results report (with option to save)\n- Phase 4: Cleanup\n\nThen execute one phase at a time.\n\n### Subsequent runs in the same session (fast path)\n\nWhen the session state file (`\u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.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\u002Fcamera were already verified. Instead, inform the user and jump directly to test plan intake:\n\n```\nSession already verified — skipping connectivity checks.\n  SSH target: $SSH_TARGET\n  Release repo: \u002Fhome\u002Fwork\u002Fholoscan-sensor-bridge (HSB vX.X.X)\n  Platform: AGX Thor\n  Board: HSB Lattice | FPGA: XXXX\n  Sensors: Dual IMX274\n\nProceeding directly to test plan intake.\n```\n\nThen execute:\n- Phase 1 (test plan intake and test list building — setup confirmation is skipped)\n- Phase 2: Execute test plan\n- Phase 3: Test results report\n- Phase 4: Cleanup\n\n### When to re-run Phase 0 from the beginning\n\nPhase 0 must be re-run (ignoring the fast path) when:\n\n1. **New session**: No session state file exists on the remote host, or a new Claude Code session is started.\n2. **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 device` errors), clear `_SESSION_VERIFIED` from the session state and re-run Phase 0 before retrying.\n3. **User explicitly requests it**: If the user says \"re-verify\", \"start over\", \"run from the beginning\", or invokes `\u002Fhsb-test --full`, run Phase 0 from scratch.\n\nSee [## Phase gate](#phase-gate--user-confirmation-between-phases) below for the full confirmation protocol.\n\nIf something fails, do **not** just dump raw logs. Summarize:\n\n- the exact command that failed\n- the likely root cause\n- what safe action you recommend\n- whether the issue is blocking\n\n## Phase details\n\nSee [references\u002Fphase-details.md](references\u002Fphase-details.md) for full step-by-step phase instructions.\n\n## Execution rules\n\n### SSH heredoc pattern\n\nUse the same persistent SSH session model as the other HSB skills. Each phase runs as a single SSH heredoc block:\n\n```bash\nssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s \u003C\u003C'REMOTE'\nset -e\n\n# restore state from previous phase\nsource \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh 2>\u002Fdev\u002Fnull || true\ncd \"${_CLAUDE_CWD:-__REMOTE_ROOT__}\"\n\n# phase commands\necho \"=== Phase N: description ===\"\ncommand1\ncommand2\n\n# save state for next phase (preserves _SESSION_VERIFIED if already set)\n_PREV_VERIFIED=\"${_SESSION_VERIFIED:-}\"\nmkdir -p \u002Ftmp\u002F.claude_hsb_test_session\n{\n  echo \"export _CLAUDE_CWD=\\\"$(pwd)\\\"\"\n  echo \"export PATH=\\\"$PATH\\\"\"\n  echo \"export REPO_DIR=\\\"$REPO_DIR\\\"\"\n  echo \"export VERSION=\\\"$VERSION\\\"\"\n  echo \"export HSB_PLATFORM=\\\"$HSB_PLATFORM\\\"\"\n  echo \"export BOARD_TYPE=\\\"$BOARD_TYPE\\\"\"\n  echo \"export SENSORS=\\\"$SENSORS\\\"\"\n  echo \"export FPGA_VERSION=\\\"$FPGA_VERSION\\\"\"\n  echo \"export TEST_PLAN_SOURCE=\\\"$TEST_PLAN_SOURCE\\\"\"\n  [ \"$_PREV_VERIFIED\" = \"true\" ] && echo \"export _SESSION_VERIFIED=true\"\n} > \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh\nREMOTE\n```\n\nReplace `__REMOTE_ROOT__` with the literal value of `$REMOTE_ROOT` when composing the heredoc.\n\n### Container usage for tests\n\nTest commands run inside the demo container. Use the detached pattern with a named container and a watchdog for timeout enforcement.\n\nDefault timeout per test: **120 seconds** (2 minutes). Overridden by:\n- `--timeout N` on the skill invocation (applies to all tests)\n- Per-test timeout specified in the test plan\n\n### Cleanup after each test container\n\nAfter every test run, stop and remove the container. See [references\u002Fphase-details.md](references\u002Fphase-details.md) for the cleanup pattern.\n\n### Session teardown\n\nHandled by Phase 4. If the workflow is aborted before Phase 4:\n\n```bash\ndocker ps --filter \"name=hsb_test_\" --format '{{.Names}}' | xargs -r docker stop -t 2 2>\u002Fdev\u002Fnull || true\nssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET \"rm -rf \u002Ftmp\u002F.claude_hsb_test_session\"\n```\n\n## Phase gate — user confirmation between phases\n\nAfter completing each phase (Phases 0–3), **always prompt the user for confirmation** before starting the next phase.\n\n**Exception**: When `--y` (auto-approve mode) is active, phase gates are skipped. See \"Auto-approve mode (`--y`)\" section.\n\n**Exception**: Phase 4 (cleanup) runs automatically after Phase 3 without a gate.\n\n```\nProceed to Phase \u003CN+1> (\u003Cphase description>)? [Y\u002Fn]\n```\n\n### User response handling\n\nAll prompts in this skill require explicit typed responses. Never treat a blank or Enter-only input as a selection — re-prompt the user instead.\n\n- **\"y\"**, **\"yes\"**, **\"Y\"**, **\"ok\"**, **\"go\"**, **\"continue\"**, **\"next\"** → proceed to the next phase.\n- **\"n\"**, **\"no\"**, **\"stop\"**, **\"abort\"** → stop execution. Print:\n  ```\n  QA testing paused after Phase N.\n  You can resume by re-invoking the skill.\n  ```\n  Then run session teardown.\n- **Any other text** → treat as a question or instruction about the current phase. Answer it, then re-prompt.\n- **\"retry\"** → re-execute the current phase, show summary again, then re-prompt.\n\n### Exceptions\n\n- **Phase 4** (cleanup) is the final phase — it runs automatically after Phase 3 completes or after the user declines to run another test plan.\n- **If a phase FAILs** and cannot be recovered, stop and report clearly, then run cleanup.\n\n## Built-in help (`--help`)\n\nIf `$ARGUMENTS` contains `--help` or `-h`, print the following and stop:\n\n```\nHSB QA Test Runner Skill\n\nUSAGE\n  \u002Fhsb-test [OPTIONS]\n\nOPTIONS\n  --help, -h        Show this help message and exit\n  --verbose         Show full raw command output for every phase\n  --y               Auto-approve all phase gates and skip interactive\n                    debugging on test failures. Not recommended — a\n                    confirmation warning is shown before proceeding.\n                    All output is saved to a timestamped log file.\n  --timeout N       Set per-test runtime in seconds (default: 120s).\n                    Tests stop after N seconds or when pass\u002Ffail can\n                    be determined, whichever comes first.\n  --full            Force full verification from Phase 0, even if the\n                    session was already verified\n\nENVIRONMENT VARIABLES (set before invoking the skill)\n  SSH_TARGET        Remote login target (e.g. ubuntu@10.0.0.1)\n  REMOTE_ROOT       Remote working directory\n  REMOTE_SUDO       Privilege escalation: 'sudo', 'sudo -n', or ''\n  REMOTE_SSH_OPTS   Additional SSH options\n  HSB_PLATFORM      Platform hint\n\nWORKFLOW PHASES\n  Phase 0   Verify board connectivity, demo container readiness,\n            and user setup (release repo, platform, sensor\u002Fcamera)\n            (skipped on repeat runs in the same session)\n  Phase 1   Obtain test plan, confirm setup, build executable test list\n            (setup confirmation skipped on repeat runs)\n  Phase 2   Execute test plan with per-test pass\u002Ffail evaluation\n  Phase 3   Generate and optionally save test results report\n  Phase 4   Cleanup (automatic)\n\nEXAMPLES\n  \u002Fhsb-test\n  \u002Fhsb-test --verbose\n  \u002Fhsb-test --timeout 60\n  \u002Fhsb-test --y\n  \u002Fhsb-test --y --timeout 60\n  \u002Fhsb-test --full\n  \u002Fhsb-test --help\n```\n\n## Invocation examples\n\n- `\u002Fhsb-test`\n- `\u002Fhsb-test --verbose`\n- `\u002Fhsb-test --timeout 60`\n- `\u002Fhsb-test --timeout 60 --verbose`\n- `\u002Fhsb-test --y`\n- `\u002Fhsb-test --y --timeout 60`\n- `\u002Fhsb-test --full`\n- `\u002Fhsb-test --full --verbose`\n- `\u002Fhsb-test --help`\n\n## Verbosity mode (`--verbose`)\n\nThe skill supports a `--verbose` flag:\n\n### Detecting the flag\n\nCheck whether `$ARGUMENTS` (the text after the slash command) contains any of: `--help` \u002F `-h`, `--verbose`, `--y`, `--timeout N`, or `--full` (case-insensitive). Strip all flags (and their values) from arguments before further parsing.\n\nWhen `--full` is present, ignore any cached session state and run Phase 0 from scratch.\n\n### Verbose mode (when set)\n\n- Show complete raw output of every SSH command\n- Show full test application output inline (all stdout\u002Fstderr)\n- Show detailed phase status blocks\n\n### Concise mode (default, no `--verbose`)\n\n- Show bullet-point summaries after each phase\n- Suppress raw command output\n- Show key test output lines (startup, errors, pass\u002Ffail indicators) but not every line\n- Show issues with the 4-line format (Symptom, Cause, Resolution, Blocking)\n\n## Auto-approve mode (`--y`)\n\nThe 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.\n\n### Confirmation warning\n\nWhen `--y` is detected, display a warning and ask the user to confirm:\n\n```\n⚠  WARNING: Auto-approve mode (--y) is enabled.\n\nThis is NOT RECOMMENDED for QA testing. All phase gates will be skipped\nand the entire test plan will execute without pausing for your\nconfirmation between phases or tests.\n\nYou will not be able to review intermediate results, intervene on\nfailures, or abort between tests. All output will be saved to a\ntimestamped log file.\n\nNOTE: In auto-approve mode, you must still provide the test plan in\nPhase 1. Failed tests are logged but not interactively debugged —\ntesting continues to the next test automatically.\n\nType 'yes' to confirm auto-approve mode, or anything else to cancel:\n```\n\n- If the user responds with **\"yes\"** (exact match, case-insensitive) → enable auto-approve mode.\n- Any other response → cancel auto-approve mode and run interactively.\n\n### Behavior when `--y` is active\n\n1. **Phase gates are skipped** between phases.\n2. **Test plan approval is skipped** — the generated test plan executes automatically.\n3. **Failed tests do not pause** — failures are logged and testing continues to the next test case automatically.\n4. **Inter-test prompts are skipped** — tests run back-to-back without confirmation.\n5. **Default timeout applies** — 120 seconds per test, or `--timeout N` if specified.\n6. **Log file**: Created at start as `hsb-test-log-YYYY-MM-DD-HHMMSS.md` in `$REMOTE_ROOT\u002F` or current directory.\n7. **Phase summaries are still shown** in real time.\n8. **Blocking connectivity failures still stop the workflow** and trigger re-verification.\n\n### Combining with other flags\n\n- `--y --verbose`: Auto-approve with full raw output.\n- `--y --timeout N`: Auto-approve with a custom per-test timeout.\n- `--y --full`: Auto-approve with forced full verification from Phase 0.\n\n## Timeout handling (`--timeout`)\n\nThe skill supports a `--timeout N` flag where N is the number of seconds to run each test.\n\n### Behavior\n\n- **When set**: Each test runs for at most N seconds, then is stopped. Pass\u002Ffail is evaluated from the output collected during that window.\n- **When not set**: Each test runs for at most **120 seconds** (2 minutes) by default, or until pass\u002Ffail can be determined from the output, whichever comes first.\n- **Per-test override**: If the test plan specifies a timeout for a specific test, that value takes precedence over both the default and the `--timeout` flag.\n\n### Validation\n\n- N must be a positive integer\n- Minimum: 5 seconds\n- Maximum: 3600 seconds (1 hour)\n- If invalid, show an error and ask the user to provide a valid timeout\n",{"data":35,"body":56},{"name":4,"description":6,"author":36,"license":26,"version":37,"tags":38,"tools":41,"disable-model-invocation":48,"allowed-tools":49,"metadata":50},"Holoscan Team \u003Choloscan-team@nvidia.com>","1.0.0",[39,40,22],"holoscan-sensor-bridge","hsb",[42,43,44,45,46,47],"Read","Write","Edit","Grep","Glob","Bash",true,"Read,Write,Edit,MultiEdit,Grep,Glob,Bash",{"author":36,"team":51,"tags":52,"agents":53},"holoscan",[39,40,22],[54,55],"claude-code","codex",{"type":57,"children":58},"root",[59,68,74,88,93,100,111,123,131,141,151,160,195,201,244,250,255,322,327,332,338,345,350,378,383,389,417,426,431,453,459,464,521,535,547,570,576,587,593,599,604,902,923,929,934,946,965,971,982,988,993,1143,1149,1161,1186,1195,1204,1210,1215,1324,1330,1353,1366,1393,1402,1408,1491,1504,1516,1522,1574,1586,1592,1610,1622,1645,1657,1675,1681,1692,1701,1720,1733,1839,1845,1881,1894,1905,1911,1957,1963,1986],{"type":60,"tag":61,"props":62,"children":64},"element","h1",{"id":63},"hsb-qa-test-runner",[65],{"type":66,"value":67},"text","HSB QA Test Runner",{"type":60,"tag":69,"props":70,"children":71},"p",{},[72],{"type":66,"value":73},"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\u002Ffail evaluation, and produces a comprehensive results report.",{"type":60,"tag":69,"props":75,"children":76},{},[77,79,86],{"type":66,"value":78},"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 ",{"type":60,"tag":80,"props":81,"children":83},"code",{"className":82},[],[84],{"type":66,"value":85},"\u002Fhsb-setup",{"type":66,"value":87}," first.",{"type":60,"tag":69,"props":89,"children":90},{},[91],{"type":66,"value":92},"This workflow runs test applications inside the demo container. Only run it when the user explicitly invokes it.",{"type":60,"tag":94,"props":95,"children":97},"h2",{"id":96},"before-you-start-required-gates-do-these-first-in-order",[98],{"type":66,"value":99},"Before you start — required gates (do these first, in order)",{"type":60,"tag":69,"props":101,"children":102},{},[103,109],{"type":60,"tag":104,"props":105,"children":106},"strong",{},[107],{"type":66,"value":108},"Gate 1 — Read environment variables.",{"type":66,"value":110}," Before doing anything else, check these variables and print their resolved values to the user:",{"type":60,"tag":112,"props":113,"children":117},"pre",{"className":114,"code":116,"language":66},[115],"language-text","SSH_TARGET      Remote devkit login (e.g. nvidia@192.168.1.50). Ask the user if not set.\nREMOTE_ROOT     Remote working directory (e.g. \u002Fhome\u002Fnvidia). Ask the user if not set.\nREMOTE_SUDO     sudo \u002F sudo -n \u002F \"\" — default to \"sudo\" if not set.\nREMOTE_SSH_OPTS Additional SSH options (optional).\nHSB_PLATFORM    Platform hint (optional).\n",[118],{"type":60,"tag":80,"props":119,"children":121},{"__ignoreMap":120},"",[122],{"type":66,"value":116},{"type":60,"tag":69,"props":124,"children":125},{},[126],{"type":60,"tag":104,"props":127,"children":128},{},[129],{"type":66,"value":130},"SSH_TARGET and REMOTE_ROOT are required. Stop and ask the user for them if either is missing.",{"type":60,"tag":69,"props":132,"children":133},{},[134,139],{"type":60,"tag":104,"props":135,"children":136},{},[137],{"type":66,"value":138},"Gate 2 — Present the phase plan, ask for the test document, and get confirmation.",{"type":66,"value":140}," Before taking any action:",{"type":60,"tag":142,"props":143,"children":144},"ol",{},[145],{"type":60,"tag":146,"props":147,"children":148},"li",{},[149],{"type":66,"value":150},"Show the phase plan:",{"type":60,"tag":112,"props":152,"children":155},{"className":153,"code":154,"language":66},[115],"HSB Test — Phase Plan\n  Phase 0: Verify devkit SSH, board ping, and demo container availability\n  Phase 1: Obtain test document, confirm setup, build executable test plan\n  Phase 2: Execute tests, record pass\u002Ffail, analyze failures\n  Phase 3: Produce test results report (with option to save)\n  Phase 4: Clean up test artifacts\n",[156],{"type":60,"tag":80,"props":157,"children":158},{"__ignoreMap":120},[159],{"type":66,"value":154},{"type":60,"tag":142,"props":161,"children":163},{"start":162},2,[164,182],{"type":60,"tag":146,"props":165,"children":166},{},[167,172,174,180],{"type":60,"tag":104,"props":168,"children":169},{},[170],{"type":66,"value":171},"If 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",{"type":66,"value":173},": ",{"type":60,"tag":80,"props":175,"children":177},{"className":176},[],[178],{"type":66,"value":179},"Please provide the path or URL to your test document:",{"type":66,"value":181},". 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\u002Fboard\u002Fsensor configuration and classified as automatable vs. manual.",{"type":60,"tag":146,"props":183,"children":184},{},[185,187,193],{"type":66,"value":186},"Ask explicitly: ",{"type":60,"tag":80,"props":188,"children":190},{"className":189},[],[191],{"type":66,"value":192},"Shall I proceed with Phase 0? [Y\u002Fn]",{"type":66,"value":194}," — do not start Phase 0 until the user confirms.",{"type":60,"tag":94,"props":196,"children":198},{"id":197},"what-this-skill-must-do",[199],{"type":66,"value":200},"What this skill must do",{"type":60,"tag":142,"props":202,"children":203},{},[204,216,229,234,239],{"type":60,"tag":146,"props":205,"children":206},{},[207,209,214],{"type":66,"value":208},"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\u002Fcamera 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 ",{"type":60,"tag":80,"props":210,"children":212},{"className":211},[],[213],{"type":66,"value":85},{"type":66,"value":215}," to prepare the devkit.",{"type":60,"tag":146,"props":217,"children":218},{},[219,221,227],{"type":66,"value":220},"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 ",{"type":60,"tag":80,"props":222,"children":224},{"className":223},[],[225],{"type":66,"value":226},"examples\u002F",{"type":66,"value":228}," directory to determine which tests can run automatically. Skip manual tests and tests requiring additional equipment. Present the executable test plan for user approval.",{"type":60,"tag":146,"props":230,"children":231},{},[232],{"type":66,"value":233},"Execute each test case in sequence. For each test: run the application, evaluate pass\u002Ffail 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.",{"type":60,"tag":146,"props":235,"children":236},{},[237],{"type":66,"value":238},"Produce a structured test results report with per-test pass\u002Ffail status, issues encountered, and fixes applied. Offer to save the report.",{"type":60,"tag":146,"props":240,"children":241},{},[242],{"type":66,"value":243},"Clean up all test artifacts (containers, temporary files, session state).",{"type":60,"tag":94,"props":245,"children":247},{"id":246},"linuxwindows-friendly-wrapper-variables",[248],{"type":66,"value":249},"Linux\u002FWindows-friendly wrapper variables",{"type":60,"tag":69,"props":251,"children":252},{},[253],{"type":66,"value":254},"Reuse the same environment variables from the other HSB skills:",{"type":60,"tag":256,"props":257,"children":258},"ul",{},[259,278,289,300,311],{"type":60,"tag":146,"props":260,"children":261},{},[262,268,270,276],{"type":60,"tag":80,"props":263,"children":265},{"className":264},[],[266],{"type":66,"value":267},"SSH_TARGET",{"type":66,"value":269}," for the remote login target (e.g. ",{"type":60,"tag":80,"props":271,"children":273},{"className":272},[],[274],{"type":66,"value":275},"nvidia@agx-thor-host",{"type":66,"value":277},")",{"type":60,"tag":146,"props":279,"children":280},{},[281,287],{"type":60,"tag":80,"props":282,"children":284},{"className":283},[],[285],{"type":66,"value":286},"REMOTE_ROOT",{"type":66,"value":288}," for the remote working directory",{"type":60,"tag":146,"props":290,"children":291},{},[292,298],{"type":60,"tag":80,"props":293,"children":295},{"className":294},[],[296],{"type":66,"value":297},"REMOTE_SUDO",{"type":66,"value":299}," for privileged commands",{"type":60,"tag":146,"props":301,"children":302},{},[303,309],{"type":60,"tag":80,"props":304,"children":306},{"className":305},[],[307],{"type":66,"value":308},"REMOTE_SSH_OPTS",{"type":66,"value":310}," for additional SSH options",{"type":60,"tag":146,"props":312,"children":313},{},[314,320],{"type":60,"tag":80,"props":315,"children":317},{"className":316},[],[318],{"type":66,"value":319},"HSB_PLATFORM",{"type":66,"value":321}," as an optional platform hint",{"type":60,"tag":69,"props":323,"children":324},{},[325],{"type":66,"value":326},"If these are set, notify the user of these settings and use them without re-asking.",{"type":60,"tag":69,"props":328,"children":329},{},[330],{"type":66,"value":331},"Before Phase 0, print the resolved remote execution settings.",{"type":60,"tag":94,"props":333,"children":335},{"id":334},"mandatory-interaction-pattern",[336],{"type":66,"value":337},"Mandatory interaction pattern",{"type":60,"tag":339,"props":340,"children":342},"h3",{"id":341},"first-run-in-a-session-no-prior-verification",[343],{"type":66,"value":344},"First run in a session (no prior verification)",{"type":60,"tag":69,"props":346,"children":347},{},[348],{"type":66,"value":349},"When no valid session state exists, show the full phase plan:",{"type":60,"tag":256,"props":351,"children":352},{},[353,358,363,368,373],{"type":60,"tag":146,"props":354,"children":355},{},[356],{"type":66,"value":357},"Phase 0: Verify board connectivity, demo container readiness, and user setup (release repo, platform, sensor\u002Fcamera)",{"type":60,"tag":146,"props":359,"children":360},{},[361],{"type":66,"value":362},"Phase 1: Obtain test plan, confirm setup, build executable test list",{"type":60,"tag":146,"props":364,"children":365},{},[366],{"type":66,"value":367},"Phase 2: Execute test plan with per-test pass\u002Ffail evaluation",{"type":60,"tag":146,"props":369,"children":370},{},[371],{"type":66,"value":372},"Phase 3: Generate test results report (with option to save)",{"type":60,"tag":146,"props":374,"children":375},{},[376],{"type":66,"value":377},"Phase 4: Cleanup",{"type":60,"tag":69,"props":379,"children":380},{},[381],{"type":66,"value":382},"Then execute one phase at a time.",{"type":60,"tag":339,"props":384,"children":386},{"id":385},"subsequent-runs-in-the-same-session-fast-path",[387],{"type":66,"value":388},"Subsequent runs in the same session (fast path)",{"type":60,"tag":69,"props":390,"children":391},{},[392,394,400,402,407,409,415],{"type":66,"value":393},"When the session state file (",{"type":60,"tag":80,"props":395,"children":397},{"className":396},[],[398],{"type":66,"value":399},"\u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh",{"type":66,"value":401},") exists ",{"type":60,"tag":104,"props":403,"children":404},{},[405],{"type":66,"value":406},"and",{"type":66,"value":408}," contains ",{"type":60,"tag":80,"props":410,"children":412},{"className":411},[],[413],{"type":66,"value":414},"_SESSION_VERIFIED=true",{"type":66,"value":416},", the skill skips Phase 0 and Phase 1 setup confirmation because connectivity, hardware, release repo, platform, and sensor\u002Fcamera were already verified. Instead, inform the user and jump directly to test plan intake:",{"type":60,"tag":112,"props":418,"children":421},{"className":419,"code":420,"language":66},[115],"Session already verified — skipping connectivity checks.\n  SSH target: $SSH_TARGET\n  Release repo: \u002Fhome\u002Fwork\u002Fholoscan-sensor-bridge (HSB vX.X.X)\n  Platform: AGX Thor\n  Board: HSB Lattice | FPGA: XXXX\n  Sensors: Dual IMX274\n\nProceeding directly to test plan intake.\n",[422],{"type":60,"tag":80,"props":423,"children":424},{"__ignoreMap":120},[425],{"type":66,"value":420},{"type":60,"tag":69,"props":427,"children":428},{},[429],{"type":66,"value":430},"Then execute:",{"type":60,"tag":256,"props":432,"children":433},{},[434,439,444,449],{"type":60,"tag":146,"props":435,"children":436},{},[437],{"type":66,"value":438},"Phase 1 (test plan intake and test list building — setup confirmation is skipped)",{"type":60,"tag":146,"props":440,"children":441},{},[442],{"type":66,"value":443},"Phase 2: Execute test plan",{"type":60,"tag":146,"props":445,"children":446},{},[447],{"type":66,"value":448},"Phase 3: Test results report",{"type":60,"tag":146,"props":450,"children":451},{},[452],{"type":66,"value":377},{"type":60,"tag":339,"props":454,"children":456},{"id":455},"when-to-re-run-phase-0-from-the-beginning",[457],{"type":66,"value":458},"When to re-run Phase 0 from the beginning",{"type":60,"tag":69,"props":460,"children":461},{},[462],{"type":66,"value":463},"Phase 0 must be re-run (ignoring the fast path) when:",{"type":60,"tag":142,"props":465,"children":466},{},[467,477,503],{"type":60,"tag":146,"props":468,"children":469},{},[470,475],{"type":60,"tag":104,"props":471,"children":472},{},[473],{"type":66,"value":474},"New session",{"type":66,"value":476},": No session state file exists on the remote host, or a new Claude Code session is started.",{"type":60,"tag":146,"props":478,"children":479},{},[480,485,487,493,495,501],{"type":60,"tag":104,"props":481,"children":482},{},[483],{"type":66,"value":484},"Execution failure suggesting connectivity loss",{"type":66,"value":486},": If Phase 2 fails with symptoms indicating the board or devkit is unreachable (ping failure, SSH timeout, container launch failure, ",{"type":60,"tag":80,"props":488,"children":490},{"className":489},[],[491],{"type":66,"value":492},"No such device",{"type":66,"value":494}," errors), clear ",{"type":60,"tag":80,"props":496,"children":498},{"className":497},[],[499],{"type":66,"value":500},"_SESSION_VERIFIED",{"type":66,"value":502}," from the session state and re-run Phase 0 before retrying.",{"type":60,"tag":146,"props":504,"children":505},{},[506,511,513,519],{"type":60,"tag":104,"props":507,"children":508},{},[509],{"type":66,"value":510},"User explicitly requests it",{"type":66,"value":512},": If the user says \"re-verify\", \"start over\", \"run from the beginning\", or invokes ",{"type":60,"tag":80,"props":514,"children":516},{"className":515},[],[517],{"type":66,"value":518},"\u002Fhsb-test --full",{"type":66,"value":520},", run Phase 0 from scratch.",{"type":60,"tag":69,"props":522,"children":523},{},[524,526,533],{"type":66,"value":525},"See ",{"type":60,"tag":527,"props":528,"children":530},"a",{"href":529},"#phase-gate--user-confirmation-between-phases",[531],{"type":66,"value":532},"## Phase gate",{"type":66,"value":534}," below for the full confirmation protocol.",{"type":60,"tag":69,"props":536,"children":537},{},[538,540,545],{"type":66,"value":539},"If something fails, do ",{"type":60,"tag":104,"props":541,"children":542},{},[543],{"type":66,"value":544},"not",{"type":66,"value":546}," just dump raw logs. Summarize:",{"type":60,"tag":256,"props":548,"children":549},{},[550,555,560,565],{"type":60,"tag":146,"props":551,"children":552},{},[553],{"type":66,"value":554},"the exact command that failed",{"type":60,"tag":146,"props":556,"children":557},{},[558],{"type":66,"value":559},"the likely root cause",{"type":60,"tag":146,"props":561,"children":562},{},[563],{"type":66,"value":564},"what safe action you recommend",{"type":60,"tag":146,"props":566,"children":567},{},[568],{"type":66,"value":569},"whether the issue is blocking",{"type":60,"tag":94,"props":571,"children":573},{"id":572},"phase-details",[574],{"type":66,"value":575},"Phase details",{"type":60,"tag":69,"props":577,"children":578},{},[579,580,585],{"type":66,"value":525},{"type":60,"tag":527,"props":581,"children":583},{"href":582},"references\u002Fphase-details.md",[584],{"type":66,"value":582},{"type":66,"value":586}," for full step-by-step phase instructions.",{"type":60,"tag":94,"props":588,"children":590},{"id":589},"execution-rules",[591],{"type":66,"value":592},"Execution rules",{"type":60,"tag":339,"props":594,"children":596},{"id":595},"ssh-heredoc-pattern",[597],{"type":66,"value":598},"SSH heredoc pattern",{"type":60,"tag":69,"props":600,"children":601},{},[602],{"type":66,"value":603},"Use the same persistent SSH session model as the other HSB skills. Each phase runs as a single SSH heredoc block:",{"type":60,"tag":112,"props":605,"children":609},{"className":606,"code":607,"language":608,"meta":120,"style":120},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET bash -s \u003C\u003C'REMOTE'\nset -e\n\n# restore state from previous phase\nsource \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh 2>\u002Fdev\u002Fnull || true\ncd \"${_CLAUDE_CWD:-__REMOTE_ROOT__}\"\n\n# phase commands\necho \"=== Phase N: description ===\"\ncommand1\ncommand2\n\n# save state for next phase (preserves _SESSION_VERIFIED if already set)\n_PREV_VERIFIED=\"${_SESSION_VERIFIED:-}\"\nmkdir -p \u002Ftmp\u002F.claude_hsb_test_session\n{\n  echo \"export _CLAUDE_CWD=\\\"$(pwd)\\\"\"\n  echo \"export PATH=\\\"$PATH\\\"\"\n  echo \"export REPO_DIR=\\\"$REPO_DIR\\\"\"\n  echo \"export VERSION=\\\"$VERSION\\\"\"\n  echo \"export HSB_PLATFORM=\\\"$HSB_PLATFORM\\\"\"\n  echo \"export BOARD_TYPE=\\\"$BOARD_TYPE\\\"\"\n  echo \"export SENSORS=\\\"$SENSORS\\\"\"\n  echo \"export FPGA_VERSION=\\\"$FPGA_VERSION\\\"\"\n  echo \"export TEST_PLAN_SOURCE=\\\"$TEST_PLAN_SOURCE\\\"\"\n  [ \"$_PREV_VERIFIED\" = \"true\" ] && echo \"export _SESSION_VERIFIED=true\"\n} > \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh\nREMOTE\n","bash",[610],{"type":60,"tag":80,"props":611,"children":612},{"__ignoreMap":120},[613,662,670,679,688,697,706,714,723,732,741,750,758,767,776,785,794,803,812,821,830,839,848,857,866,875,884,893],{"type":60,"tag":614,"props":615,"children":618},"span",{"class":616,"line":617},"line",1,[619,625,631,636,642,646,651,657],{"type":60,"tag":614,"props":620,"children":622},{"style":621},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[623],{"type":66,"value":624},"ssh",{"type":60,"tag":614,"props":626,"children":628},{"style":627},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[629],{"type":66,"value":630}," -o",{"type":60,"tag":614,"props":632,"children":633},{"style":627},[634],{"type":66,"value":635}," BatchMode=yes",{"type":60,"tag":614,"props":637,"children":639},{"style":638},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[640],{"type":66,"value":641}," $REMOTE_SSH_OPTS $SSH_TARGET ",{"type":60,"tag":614,"props":643,"children":644},{"style":627},[645],{"type":66,"value":608},{"type":60,"tag":614,"props":647,"children":648},{"style":627},[649],{"type":66,"value":650}," -s",{"type":60,"tag":614,"props":652,"children":654},{"style":653},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[655],{"type":66,"value":656}," \u003C\u003C",{"type":60,"tag":614,"props":658,"children":659},{"style":653},[660],{"type":66,"value":661},"'REMOTE'\n",{"type":60,"tag":614,"props":663,"children":664},{"class":616,"line":162},[665],{"type":60,"tag":614,"props":666,"children":667},{"style":627},[668],{"type":66,"value":669},"set -e\n",{"type":60,"tag":614,"props":671,"children":673},{"class":616,"line":672},3,[674],{"type":60,"tag":614,"props":675,"children":676},{"emptyLinePlaceholder":48},[677],{"type":66,"value":678},"\n",{"type":60,"tag":614,"props":680,"children":682},{"class":616,"line":681},4,[683],{"type":60,"tag":614,"props":684,"children":685},{"style":627},[686],{"type":66,"value":687},"# restore state from previous phase\n",{"type":60,"tag":614,"props":689,"children":691},{"class":616,"line":690},5,[692],{"type":60,"tag":614,"props":693,"children":694},{"style":627},[695],{"type":66,"value":696},"source \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh 2>\u002Fdev\u002Fnull || true\n",{"type":60,"tag":614,"props":698,"children":700},{"class":616,"line":699},6,[701],{"type":60,"tag":614,"props":702,"children":703},{"style":627},[704],{"type":66,"value":705},"cd \"${_CLAUDE_CWD:-__REMOTE_ROOT__}\"\n",{"type":60,"tag":614,"props":707,"children":709},{"class":616,"line":708},7,[710],{"type":60,"tag":614,"props":711,"children":712},{"emptyLinePlaceholder":48},[713],{"type":66,"value":678},{"type":60,"tag":614,"props":715,"children":717},{"class":616,"line":716},8,[718],{"type":60,"tag":614,"props":719,"children":720},{"style":627},[721],{"type":66,"value":722},"# phase commands\n",{"type":60,"tag":614,"props":724,"children":726},{"class":616,"line":725},9,[727],{"type":60,"tag":614,"props":728,"children":729},{"style":627},[730],{"type":66,"value":731},"echo \"=== Phase N: description ===\"\n",{"type":60,"tag":614,"props":733,"children":735},{"class":616,"line":734},10,[736],{"type":60,"tag":614,"props":737,"children":738},{"style":627},[739],{"type":66,"value":740},"command1\n",{"type":60,"tag":614,"props":742,"children":744},{"class":616,"line":743},11,[745],{"type":60,"tag":614,"props":746,"children":747},{"style":627},[748],{"type":66,"value":749},"command2\n",{"type":60,"tag":614,"props":751,"children":753},{"class":616,"line":752},12,[754],{"type":60,"tag":614,"props":755,"children":756},{"emptyLinePlaceholder":48},[757],{"type":66,"value":678},{"type":60,"tag":614,"props":759,"children":761},{"class":616,"line":760},13,[762],{"type":60,"tag":614,"props":763,"children":764},{"style":627},[765],{"type":66,"value":766},"# save state for next phase (preserves _SESSION_VERIFIED if already set)\n",{"type":60,"tag":614,"props":768,"children":770},{"class":616,"line":769},14,[771],{"type":60,"tag":614,"props":772,"children":773},{"style":627},[774],{"type":66,"value":775},"_PREV_VERIFIED=\"${_SESSION_VERIFIED:-}\"\n",{"type":60,"tag":614,"props":777,"children":779},{"class":616,"line":778},15,[780],{"type":60,"tag":614,"props":781,"children":782},{"style":627},[783],{"type":66,"value":784},"mkdir -p \u002Ftmp\u002F.claude_hsb_test_session\n",{"type":60,"tag":614,"props":786,"children":788},{"class":616,"line":787},16,[789],{"type":60,"tag":614,"props":790,"children":791},{"style":627},[792],{"type":66,"value":793},"{\n",{"type":60,"tag":614,"props":795,"children":797},{"class":616,"line":796},17,[798],{"type":60,"tag":614,"props":799,"children":800},{"style":627},[801],{"type":66,"value":802},"  echo \"export _CLAUDE_CWD=\\\"$(pwd)\\\"\"\n",{"type":60,"tag":614,"props":804,"children":806},{"class":616,"line":805},18,[807],{"type":60,"tag":614,"props":808,"children":809},{"style":627},[810],{"type":66,"value":811},"  echo \"export PATH=\\\"$PATH\\\"\"\n",{"type":60,"tag":614,"props":813,"children":815},{"class":616,"line":814},19,[816],{"type":60,"tag":614,"props":817,"children":818},{"style":627},[819],{"type":66,"value":820},"  echo \"export REPO_DIR=\\\"$REPO_DIR\\\"\"\n",{"type":60,"tag":614,"props":822,"children":824},{"class":616,"line":823},20,[825],{"type":60,"tag":614,"props":826,"children":827},{"style":627},[828],{"type":66,"value":829},"  echo \"export VERSION=\\\"$VERSION\\\"\"\n",{"type":60,"tag":614,"props":831,"children":833},{"class":616,"line":832},21,[834],{"type":60,"tag":614,"props":835,"children":836},{"style":627},[837],{"type":66,"value":838},"  echo \"export HSB_PLATFORM=\\\"$HSB_PLATFORM\\\"\"\n",{"type":60,"tag":614,"props":840,"children":842},{"class":616,"line":841},22,[843],{"type":60,"tag":614,"props":844,"children":845},{"style":627},[846],{"type":66,"value":847},"  echo \"export BOARD_TYPE=\\\"$BOARD_TYPE\\\"\"\n",{"type":60,"tag":614,"props":849,"children":851},{"class":616,"line":850},23,[852],{"type":60,"tag":614,"props":853,"children":854},{"style":627},[855],{"type":66,"value":856},"  echo \"export SENSORS=\\\"$SENSORS\\\"\"\n",{"type":60,"tag":614,"props":858,"children":860},{"class":616,"line":859},24,[861],{"type":60,"tag":614,"props":862,"children":863},{"style":627},[864],{"type":66,"value":865},"  echo \"export FPGA_VERSION=\\\"$FPGA_VERSION\\\"\"\n",{"type":60,"tag":614,"props":867,"children":869},{"class":616,"line":868},25,[870],{"type":60,"tag":614,"props":871,"children":872},{"style":627},[873],{"type":66,"value":874},"  echo \"export TEST_PLAN_SOURCE=\\\"$TEST_PLAN_SOURCE\\\"\"\n",{"type":60,"tag":614,"props":876,"children":878},{"class":616,"line":877},26,[879],{"type":60,"tag":614,"props":880,"children":881},{"style":627},[882],{"type":66,"value":883},"  [ \"$_PREV_VERIFIED\" = \"true\" ] && echo \"export _SESSION_VERIFIED=true\"\n",{"type":60,"tag":614,"props":885,"children":887},{"class":616,"line":886},27,[888],{"type":60,"tag":614,"props":889,"children":890},{"style":627},[891],{"type":66,"value":892},"} > \u002Ftmp\u002F.claude_hsb_test_session\u002Fstate.sh\n",{"type":60,"tag":614,"props":894,"children":896},{"class":616,"line":895},28,[897],{"type":60,"tag":614,"props":898,"children":899},{"style":653},[900],{"type":66,"value":901},"REMOTE\n",{"type":60,"tag":69,"props":903,"children":904},{},[905,907,913,915,921],{"type":66,"value":906},"Replace ",{"type":60,"tag":80,"props":908,"children":910},{"className":909},[],[911],{"type":66,"value":912},"__REMOTE_ROOT__",{"type":66,"value":914}," with the literal value of ",{"type":60,"tag":80,"props":916,"children":918},{"className":917},[],[919],{"type":66,"value":920},"$REMOTE_ROOT",{"type":66,"value":922}," when composing the heredoc.",{"type":60,"tag":339,"props":924,"children":926},{"id":925},"container-usage-for-tests",[927],{"type":66,"value":928},"Container usage for tests",{"type":60,"tag":69,"props":930,"children":931},{},[932],{"type":66,"value":933},"Test commands run inside the demo container. Use the detached pattern with a named container and a watchdog for timeout enforcement.",{"type":60,"tag":69,"props":935,"children":936},{},[937,939,944],{"type":66,"value":938},"Default timeout per test: ",{"type":60,"tag":104,"props":940,"children":941},{},[942],{"type":66,"value":943},"120 seconds",{"type":66,"value":945}," (2 minutes). Overridden by:",{"type":60,"tag":256,"props":947,"children":948},{},[949,960],{"type":60,"tag":146,"props":950,"children":951},{},[952,958],{"type":60,"tag":80,"props":953,"children":955},{"className":954},[],[956],{"type":66,"value":957},"--timeout N",{"type":66,"value":959}," on the skill invocation (applies to all tests)",{"type":60,"tag":146,"props":961,"children":962},{},[963],{"type":66,"value":964},"Per-test timeout specified in the test plan",{"type":60,"tag":339,"props":966,"children":968},{"id":967},"cleanup-after-each-test-container",[969],{"type":66,"value":970},"Cleanup after each test container",{"type":60,"tag":69,"props":972,"children":973},{},[974,976,980],{"type":66,"value":975},"After every test run, stop and remove the container. See ",{"type":60,"tag":527,"props":977,"children":978},{"href":582},[979],{"type":66,"value":582},{"type":66,"value":981}," for the cleanup pattern.",{"type":60,"tag":339,"props":983,"children":985},{"id":984},"session-teardown",[986],{"type":66,"value":987},"Session teardown",{"type":60,"tag":69,"props":989,"children":990},{},[991],{"type":66,"value":992},"Handled by Phase 4. If the workflow is aborted before Phase 4:",{"type":60,"tag":112,"props":994,"children":996},{"className":606,"code":995,"language":608,"meta":120,"style":120},"docker ps --filter \"name=hsb_test_\" --format '{{.Names}}' | xargs -r docker stop -t 2 2>\u002Fdev\u002Fnull || true\nssh -o BatchMode=yes $REMOTE_SSH_OPTS $SSH_TARGET \"rm -rf \u002Ftmp\u002F.claude_hsb_test_session\"\n",[997],{"type":60,"tag":80,"props":998,"children":999},{"__ignoreMap":120},[1000,1110],{"type":60,"tag":614,"props":1001,"children":1002},{"class":616,"line":617},[1003,1008,1013,1018,1023,1028,1033,1038,1043,1048,1053,1058,1063,1068,1073,1078,1083,1089,1094,1099,1104],{"type":60,"tag":614,"props":1004,"children":1005},{"style":621},[1006],{"type":66,"value":1007},"docker",{"type":60,"tag":614,"props":1009,"children":1010},{"style":627},[1011],{"type":66,"value":1012}," ps",{"type":60,"tag":614,"props":1014,"children":1015},{"style":627},[1016],{"type":66,"value":1017}," --filter",{"type":60,"tag":614,"props":1019,"children":1020},{"style":653},[1021],{"type":66,"value":1022}," \"",{"type":60,"tag":614,"props":1024,"children":1025},{"style":627},[1026],{"type":66,"value":1027},"name=hsb_test_",{"type":60,"tag":614,"props":1029,"children":1030},{"style":653},[1031],{"type":66,"value":1032},"\"",{"type":60,"tag":614,"props":1034,"children":1035},{"style":627},[1036],{"type":66,"value":1037}," --format",{"type":60,"tag":614,"props":1039,"children":1040},{"style":653},[1041],{"type":66,"value":1042}," '",{"type":60,"tag":614,"props":1044,"children":1045},{"style":627},[1046],{"type":66,"value":1047},"{{.Names}}",{"type":60,"tag":614,"props":1049,"children":1050},{"style":653},[1051],{"type":66,"value":1052},"'",{"type":60,"tag":614,"props":1054,"children":1055},{"style":653},[1056],{"type":66,"value":1057}," |",{"type":60,"tag":614,"props":1059,"children":1060},{"style":621},[1061],{"type":66,"value":1062}," xargs",{"type":60,"tag":614,"props":1064,"children":1065},{"style":627},[1066],{"type":66,"value":1067}," -r",{"type":60,"tag":614,"props":1069,"children":1070},{"style":627},[1071],{"type":66,"value":1072}," docker",{"type":60,"tag":614,"props":1074,"children":1075},{"style":627},[1076],{"type":66,"value":1077}," stop",{"type":60,"tag":614,"props":1079,"children":1080},{"style":627},[1081],{"type":66,"value":1082}," -t",{"type":60,"tag":614,"props":1084,"children":1086},{"style":1085},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1087],{"type":66,"value":1088}," 2",{"type":60,"tag":614,"props":1090,"children":1091},{"style":653},[1092],{"type":66,"value":1093}," 2>",{"type":60,"tag":614,"props":1095,"children":1096},{"style":627},[1097],{"type":66,"value":1098},"\u002Fdev\u002Fnull",{"type":60,"tag":614,"props":1100,"children":1101},{"style":653},[1102],{"type":66,"value":1103}," ||",{"type":60,"tag":614,"props":1105,"children":1107},{"style":1106},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1108],{"type":66,"value":1109}," true\n",{"type":60,"tag":614,"props":1111,"children":1112},{"class":616,"line":162},[1113,1117,1121,1125,1129,1133,1138],{"type":60,"tag":614,"props":1114,"children":1115},{"style":621},[1116],{"type":66,"value":624},{"type":60,"tag":614,"props":1118,"children":1119},{"style":627},[1120],{"type":66,"value":630},{"type":60,"tag":614,"props":1122,"children":1123},{"style":627},[1124],{"type":66,"value":635},{"type":60,"tag":614,"props":1126,"children":1127},{"style":638},[1128],{"type":66,"value":641},{"type":60,"tag":614,"props":1130,"children":1131},{"style":653},[1132],{"type":66,"value":1032},{"type":60,"tag":614,"props":1134,"children":1135},{"style":627},[1136],{"type":66,"value":1137},"rm -rf \u002Ftmp\u002F.claude_hsb_test_session",{"type":60,"tag":614,"props":1139,"children":1140},{"style":653},[1141],{"type":66,"value":1142},"\"\n",{"type":60,"tag":94,"props":1144,"children":1146},{"id":1145},"phase-gate-user-confirmation-between-phases",[1147],{"type":66,"value":1148},"Phase gate — user confirmation between phases",{"type":60,"tag":69,"props":1150,"children":1151},{},[1152,1154,1159],{"type":66,"value":1153},"After completing each phase (Phases 0–3), ",{"type":60,"tag":104,"props":1155,"children":1156},{},[1157],{"type":66,"value":1158},"always prompt the user for confirmation",{"type":66,"value":1160}," before starting the next phase.",{"type":60,"tag":69,"props":1162,"children":1163},{},[1164,1169,1171,1177,1179,1184],{"type":60,"tag":104,"props":1165,"children":1166},{},[1167],{"type":66,"value":1168},"Exception",{"type":66,"value":1170},": When ",{"type":60,"tag":80,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":66,"value":1176},"--y",{"type":66,"value":1178}," (auto-approve mode) is active, phase gates are skipped. See \"Auto-approve mode (",{"type":60,"tag":80,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":66,"value":1176},{"type":66,"value":1185},")\" section.",{"type":60,"tag":69,"props":1187,"children":1188},{},[1189,1193],{"type":60,"tag":104,"props":1190,"children":1191},{},[1192],{"type":66,"value":1168},{"type":66,"value":1194},": Phase 4 (cleanup) runs automatically after Phase 3 without a gate.",{"type":60,"tag":112,"props":1196,"children":1199},{"className":1197,"code":1198,"language":66},[115],"Proceed to Phase \u003CN+1> (\u003Cphase description>)? [Y\u002Fn]\n",[1200],{"type":60,"tag":80,"props":1201,"children":1202},{"__ignoreMap":120},[1203],{"type":66,"value":1198},{"type":60,"tag":339,"props":1205,"children":1207},{"id":1206},"user-response-handling",[1208],{"type":66,"value":1209},"User response handling",{"type":60,"tag":69,"props":1211,"children":1212},{},[1213],{"type":66,"value":1214},"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.",{"type":60,"tag":256,"props":1216,"children":1217},{},[1218,1265,1304,1314],{"type":60,"tag":146,"props":1219,"children":1220},{},[1221,1226,1228,1233,1234,1239,1240,1245,1246,1251,1252,1257,1258,1263],{"type":60,"tag":104,"props":1222,"children":1223},{},[1224],{"type":66,"value":1225},"\"y\"",{"type":66,"value":1227},", ",{"type":60,"tag":104,"props":1229,"children":1230},{},[1231],{"type":66,"value":1232},"\"yes\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1235,"children":1236},{},[1237],{"type":66,"value":1238},"\"Y\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1241,"children":1242},{},[1243],{"type":66,"value":1244},"\"ok\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1247,"children":1248},{},[1249],{"type":66,"value":1250},"\"go\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1253,"children":1254},{},[1255],{"type":66,"value":1256},"\"continue\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1259,"children":1260},{},[1261],{"type":66,"value":1262},"\"next\"",{"type":66,"value":1264}," → proceed to the next phase.",{"type":60,"tag":146,"props":1266,"children":1267},{},[1268,1273,1274,1279,1280,1285,1286,1291,1293,1302],{"type":60,"tag":104,"props":1269,"children":1270},{},[1271],{"type":66,"value":1272},"\"n\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1275,"children":1276},{},[1277],{"type":66,"value":1278},"\"no\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1281,"children":1282},{},[1283],{"type":66,"value":1284},"\"stop\"",{"type":66,"value":1227},{"type":60,"tag":104,"props":1287,"children":1288},{},[1289],{"type":66,"value":1290},"\"abort\"",{"type":66,"value":1292}," → stop execution. Print:\n",{"type":60,"tag":112,"props":1294,"children":1297},{"className":1295,"code":1296,"language":66},[115],"QA testing paused after Phase N.\nYou can resume by re-invoking the skill.\n",[1298],{"type":60,"tag":80,"props":1299,"children":1300},{"__ignoreMap":120},[1301],{"type":66,"value":1296},{"type":66,"value":1303},"\nThen run session teardown.",{"type":60,"tag":146,"props":1305,"children":1306},{},[1307,1312],{"type":60,"tag":104,"props":1308,"children":1309},{},[1310],{"type":66,"value":1311},"Any other text",{"type":66,"value":1313}," → treat as a question or instruction about the current phase. Answer it, then re-prompt.",{"type":60,"tag":146,"props":1315,"children":1316},{},[1317,1322],{"type":60,"tag":104,"props":1318,"children":1319},{},[1320],{"type":66,"value":1321},"\"retry\"",{"type":66,"value":1323}," → re-execute the current phase, show summary again, then re-prompt.",{"type":60,"tag":339,"props":1325,"children":1327},{"id":1326},"exceptions",[1328],{"type":66,"value":1329},"Exceptions",{"type":60,"tag":256,"props":1331,"children":1332},{},[1333,1343],{"type":60,"tag":146,"props":1334,"children":1335},{},[1336,1341],{"type":60,"tag":104,"props":1337,"children":1338},{},[1339],{"type":66,"value":1340},"Phase 4",{"type":66,"value":1342}," (cleanup) is the final phase — it runs automatically after Phase 3 completes or after the user declines to run another test plan.",{"type":60,"tag":146,"props":1344,"children":1345},{},[1346,1351],{"type":60,"tag":104,"props":1347,"children":1348},{},[1349],{"type":66,"value":1350},"If a phase FAILs",{"type":66,"value":1352}," and cannot be recovered, stop and report clearly, then run cleanup.",{"type":60,"tag":94,"props":1354,"children":1356},{"id":1355},"built-in-help-help",[1357,1359,1365],{"type":66,"value":1358},"Built-in help (",{"type":60,"tag":80,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":66,"value":1364},"--help",{"type":66,"value":277},{"type":60,"tag":69,"props":1367,"children":1368},{},[1369,1371,1377,1378,1383,1385,1391],{"type":66,"value":1370},"If ",{"type":60,"tag":80,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":66,"value":1376},"$ARGUMENTS",{"type":66,"value":408},{"type":60,"tag":80,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":66,"value":1364},{"type":66,"value":1384}," or ",{"type":60,"tag":80,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":66,"value":1390},"-h",{"type":66,"value":1392},", print the following and stop:",{"type":60,"tag":112,"props":1394,"children":1397},{"className":1395,"code":1396,"language":66},[115],"HSB QA Test Runner Skill\n\nUSAGE\n  \u002Fhsb-test [OPTIONS]\n\nOPTIONS\n  --help, -h        Show this help message and exit\n  --verbose         Show full raw command output for every phase\n  --y               Auto-approve all phase gates and skip interactive\n                    debugging on test failures. Not recommended — a\n                    confirmation warning is shown before proceeding.\n                    All output is saved to a timestamped log file.\n  --timeout N       Set per-test runtime in seconds (default: 120s).\n                    Tests stop after N seconds or when pass\u002Ffail can\n                    be determined, whichever comes first.\n  --full            Force full verification from Phase 0, even if the\n                    session was already verified\n\nENVIRONMENT VARIABLES (set before invoking the skill)\n  SSH_TARGET        Remote login target (e.g. ubuntu@10.0.0.1)\n  REMOTE_ROOT       Remote working directory\n  REMOTE_SUDO       Privilege escalation: 'sudo', 'sudo -n', or ''\n  REMOTE_SSH_OPTS   Additional SSH options\n  HSB_PLATFORM      Platform hint\n\nWORKFLOW PHASES\n  Phase 0   Verify board connectivity, demo container readiness,\n            and user setup (release repo, platform, sensor\u002Fcamera)\n            (skipped on repeat runs in the same session)\n  Phase 1   Obtain test plan, confirm setup, build executable test list\n            (setup confirmation skipped on repeat runs)\n  Phase 2   Execute test plan with per-test pass\u002Ffail evaluation\n  Phase 3   Generate and optionally save test results report\n  Phase 4   Cleanup (automatic)\n\nEXAMPLES\n  \u002Fhsb-test\n  \u002Fhsb-test --verbose\n  \u002Fhsb-test --timeout 60\n  \u002Fhsb-test --y\n  \u002Fhsb-test --y --timeout 60\n  \u002Fhsb-test --full\n  \u002Fhsb-test --help\n",[1398],{"type":60,"tag":80,"props":1399,"children":1400},{"__ignoreMap":120},[1401],{"type":66,"value":1396},{"type":60,"tag":94,"props":1403,"children":1405},{"id":1404},"invocation-examples",[1406],{"type":66,"value":1407},"Invocation examples",{"type":60,"tag":256,"props":1409,"children":1410},{},[1411,1420,1429,1438,1447,1456,1465,1473,1482],{"type":60,"tag":146,"props":1412,"children":1413},{},[1414],{"type":60,"tag":80,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":66,"value":1419},"\u002Fhsb-test",{"type":60,"tag":146,"props":1421,"children":1422},{},[1423],{"type":60,"tag":80,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":66,"value":1428},"\u002Fhsb-test --verbose",{"type":60,"tag":146,"props":1430,"children":1431},{},[1432],{"type":60,"tag":80,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":66,"value":1437},"\u002Fhsb-test --timeout 60",{"type":60,"tag":146,"props":1439,"children":1440},{},[1441],{"type":60,"tag":80,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":66,"value":1446},"\u002Fhsb-test --timeout 60 --verbose",{"type":60,"tag":146,"props":1448,"children":1449},{},[1450],{"type":60,"tag":80,"props":1451,"children":1453},{"className":1452},[],[1454],{"type":66,"value":1455},"\u002Fhsb-test --y",{"type":60,"tag":146,"props":1457,"children":1458},{},[1459],{"type":60,"tag":80,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":66,"value":1464},"\u002Fhsb-test --y --timeout 60",{"type":60,"tag":146,"props":1466,"children":1467},{},[1468],{"type":60,"tag":80,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":66,"value":518},{"type":60,"tag":146,"props":1474,"children":1475},{},[1476],{"type":60,"tag":80,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":66,"value":1481},"\u002Fhsb-test --full --verbose",{"type":60,"tag":146,"props":1483,"children":1484},{},[1485],{"type":60,"tag":80,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":66,"value":1490},"\u002Fhsb-test --help",{"type":60,"tag":94,"props":1492,"children":1494},{"id":1493},"verbosity-mode-verbose",[1495,1497,1503],{"type":66,"value":1496},"Verbosity mode (",{"type":60,"tag":80,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":66,"value":1502},"--verbose",{"type":66,"value":277},{"type":60,"tag":69,"props":1505,"children":1506},{},[1507,1509,1514],{"type":66,"value":1508},"The skill supports a ",{"type":60,"tag":80,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":66,"value":1502},{"type":66,"value":1515}," flag:",{"type":60,"tag":339,"props":1517,"children":1519},{"id":1518},"detecting-the-flag",[1520],{"type":66,"value":1521},"Detecting the flag",{"type":60,"tag":69,"props":1523,"children":1524},{},[1525,1527,1532,1534,1539,1541,1546,1547,1552,1553,1558,1559,1564,1566,1572],{"type":66,"value":1526},"Check whether ",{"type":60,"tag":80,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":66,"value":1376},{"type":66,"value":1533}," (the text after the slash command) contains any of: ",{"type":60,"tag":80,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":66,"value":1364},{"type":66,"value":1540}," \u002F ",{"type":60,"tag":80,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":66,"value":1390},{"type":66,"value":1227},{"type":60,"tag":80,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":66,"value":1502},{"type":66,"value":1227},{"type":60,"tag":80,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":66,"value":1176},{"type":66,"value":1227},{"type":60,"tag":80,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":66,"value":957},{"type":66,"value":1565},", or ",{"type":60,"tag":80,"props":1567,"children":1569},{"className":1568},[],[1570],{"type":66,"value":1571},"--full",{"type":66,"value":1573}," (case-insensitive). Strip all flags (and their values) from arguments before further parsing.",{"type":60,"tag":69,"props":1575,"children":1576},{},[1577,1579,1584],{"type":66,"value":1578},"When ",{"type":60,"tag":80,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":66,"value":1571},{"type":66,"value":1585}," is present, ignore any cached session state and run Phase 0 from scratch.",{"type":60,"tag":339,"props":1587,"children":1589},{"id":1588},"verbose-mode-when-set",[1590],{"type":66,"value":1591},"Verbose mode (when set)",{"type":60,"tag":256,"props":1593,"children":1594},{},[1595,1600,1605],{"type":60,"tag":146,"props":1596,"children":1597},{},[1598],{"type":66,"value":1599},"Show complete raw output of every SSH command",{"type":60,"tag":146,"props":1601,"children":1602},{},[1603],{"type":66,"value":1604},"Show full test application output inline (all stdout\u002Fstderr)",{"type":60,"tag":146,"props":1606,"children":1607},{},[1608],{"type":66,"value":1609},"Show detailed phase status blocks",{"type":60,"tag":339,"props":1611,"children":1613},{"id":1612},"concise-mode-default-no-verbose",[1614,1616,1621],{"type":66,"value":1615},"Concise mode (default, no ",{"type":60,"tag":80,"props":1617,"children":1619},{"className":1618},[],[1620],{"type":66,"value":1502},{"type":66,"value":277},{"type":60,"tag":256,"props":1623,"children":1624},{},[1625,1630,1635,1640],{"type":60,"tag":146,"props":1626,"children":1627},{},[1628],{"type":66,"value":1629},"Show bullet-point summaries after each phase",{"type":60,"tag":146,"props":1631,"children":1632},{},[1633],{"type":66,"value":1634},"Suppress raw command output",{"type":60,"tag":146,"props":1636,"children":1637},{},[1638],{"type":66,"value":1639},"Show key test output lines (startup, errors, pass\u002Ffail indicators) but not every line",{"type":60,"tag":146,"props":1641,"children":1642},{},[1643],{"type":66,"value":1644},"Show issues with the 4-line format (Symptom, Cause, Resolution, Blocking)",{"type":60,"tag":94,"props":1646,"children":1648},{"id":1647},"auto-approve-mode-y",[1649,1651,1656],{"type":66,"value":1650},"Auto-approve mode (",{"type":60,"tag":80,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":66,"value":1176},{"type":66,"value":277},{"type":60,"tag":69,"props":1658,"children":1659},{},[1660,1661,1666,1668,1673],{"type":66,"value":1508},{"type":60,"tag":80,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":66,"value":1176},{"type":66,"value":1667}," flag that skips all phase gates and runs the entire workflow from start to finish without waiting for user confirmation between phases. This is ",{"type":60,"tag":104,"props":1669,"children":1670},{},[1671],{"type":66,"value":1672},"not recommended",{"type":66,"value":1674}," for QA testing.",{"type":60,"tag":339,"props":1676,"children":1678},{"id":1677},"confirmation-warning",[1679],{"type":66,"value":1680},"Confirmation warning",{"type":60,"tag":69,"props":1682,"children":1683},{},[1684,1685,1690],{"type":66,"value":1578},{"type":60,"tag":80,"props":1686,"children":1688},{"className":1687},[],[1689],{"type":66,"value":1176},{"type":66,"value":1691}," is detected, display a warning and ask the user to confirm:",{"type":60,"tag":112,"props":1693,"children":1696},{"className":1694,"code":1695,"language":66},[115],"⚠  WARNING: Auto-approve mode (--y) is enabled.\n\nThis is NOT RECOMMENDED for QA testing. All phase gates will be skipped\nand the entire test plan will execute without pausing for your\nconfirmation between phases or tests.\n\nYou will not be able to review intermediate results, intervene on\nfailures, or abort between tests. All output will be saved to a\ntimestamped log file.\n\nNOTE: In auto-approve mode, you must still provide the test plan in\nPhase 1. Failed tests are logged but not interactively debugged —\ntesting continues to the next test automatically.\n\nType 'yes' to confirm auto-approve mode, or anything else to cancel:\n",[1697],{"type":60,"tag":80,"props":1698,"children":1699},{"__ignoreMap":120},[1700],{"type":66,"value":1695},{"type":60,"tag":256,"props":1702,"children":1703},{},[1704,1715],{"type":60,"tag":146,"props":1705,"children":1706},{},[1707,1709,1713],{"type":66,"value":1708},"If the user responds with ",{"type":60,"tag":104,"props":1710,"children":1711},{},[1712],{"type":66,"value":1232},{"type":66,"value":1714}," (exact match, case-insensitive) → enable auto-approve mode.",{"type":60,"tag":146,"props":1716,"children":1717},{},[1718],{"type":66,"value":1719},"Any other response → cancel auto-approve mode and run interactively.",{"type":60,"tag":339,"props":1721,"children":1723},{"id":1722},"behavior-when-y-is-active",[1724,1726,1731],{"type":66,"value":1725},"Behavior when ",{"type":60,"tag":80,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":66,"value":1176},{"type":66,"value":1732}," is active",{"type":60,"tag":142,"props":1734,"children":1735},{},[1736,1746,1756,1766,1776,1793,1819,1829],{"type":60,"tag":146,"props":1737,"children":1738},{},[1739,1744],{"type":60,"tag":104,"props":1740,"children":1741},{},[1742],{"type":66,"value":1743},"Phase gates are skipped",{"type":66,"value":1745}," between phases.",{"type":60,"tag":146,"props":1747,"children":1748},{},[1749,1754],{"type":60,"tag":104,"props":1750,"children":1751},{},[1752],{"type":66,"value":1753},"Test plan approval is skipped",{"type":66,"value":1755}," — the generated test plan executes automatically.",{"type":60,"tag":146,"props":1757,"children":1758},{},[1759,1764],{"type":60,"tag":104,"props":1760,"children":1761},{},[1762],{"type":66,"value":1763},"Failed tests do not pause",{"type":66,"value":1765}," — failures are logged and testing continues to the next test case automatically.",{"type":60,"tag":146,"props":1767,"children":1768},{},[1769,1774],{"type":60,"tag":104,"props":1770,"children":1771},{},[1772],{"type":66,"value":1773},"Inter-test prompts are skipped",{"type":66,"value":1775}," — tests run back-to-back without confirmation.",{"type":60,"tag":146,"props":1777,"children":1778},{},[1779,1784,1786,1791],{"type":60,"tag":104,"props":1780,"children":1781},{},[1782],{"type":66,"value":1783},"Default timeout applies",{"type":66,"value":1785}," — 120 seconds per test, or ",{"type":60,"tag":80,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":66,"value":957},{"type":66,"value":1792}," if specified.",{"type":60,"tag":146,"props":1794,"children":1795},{},[1796,1801,1803,1809,1811,1817],{"type":60,"tag":104,"props":1797,"children":1798},{},[1799],{"type":66,"value":1800},"Log file",{"type":66,"value":1802},": Created at start as ",{"type":60,"tag":80,"props":1804,"children":1806},{"className":1805},[],[1807],{"type":66,"value":1808},"hsb-test-log-YYYY-MM-DD-HHMMSS.md",{"type":66,"value":1810}," in ",{"type":60,"tag":80,"props":1812,"children":1814},{"className":1813},[],[1815],{"type":66,"value":1816},"$REMOTE_ROOT\u002F",{"type":66,"value":1818}," or current directory.",{"type":60,"tag":146,"props":1820,"children":1821},{},[1822,1827],{"type":60,"tag":104,"props":1823,"children":1824},{},[1825],{"type":66,"value":1826},"Phase summaries are still shown",{"type":66,"value":1828}," in real time.",{"type":60,"tag":146,"props":1830,"children":1831},{},[1832,1837],{"type":60,"tag":104,"props":1833,"children":1834},{},[1835],{"type":66,"value":1836},"Blocking connectivity failures still stop the workflow",{"type":66,"value":1838}," and trigger re-verification.",{"type":60,"tag":339,"props":1840,"children":1842},{"id":1841},"combining-with-other-flags",[1843],{"type":66,"value":1844},"Combining with other flags",{"type":60,"tag":256,"props":1846,"children":1847},{},[1848,1859,1870],{"type":60,"tag":146,"props":1849,"children":1850},{},[1851,1857],{"type":60,"tag":80,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":66,"value":1856},"--y --verbose",{"type":66,"value":1858},": Auto-approve with full raw output.",{"type":60,"tag":146,"props":1860,"children":1861},{},[1862,1868],{"type":60,"tag":80,"props":1863,"children":1865},{"className":1864},[],[1866],{"type":66,"value":1867},"--y --timeout N",{"type":66,"value":1869},": Auto-approve with a custom per-test timeout.",{"type":60,"tag":146,"props":1871,"children":1872},{},[1873,1879],{"type":60,"tag":80,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":66,"value":1878},"--y --full",{"type":66,"value":1880},": Auto-approve with forced full verification from Phase 0.",{"type":60,"tag":94,"props":1882,"children":1884},{"id":1883},"timeout-handling-timeout",[1885,1887,1893],{"type":66,"value":1886},"Timeout handling (",{"type":60,"tag":80,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":66,"value":1892},"--timeout",{"type":66,"value":277},{"type":60,"tag":69,"props":1895,"children":1896},{},[1897,1898,1903],{"type":66,"value":1508},{"type":60,"tag":80,"props":1899,"children":1901},{"className":1900},[],[1902],{"type":66,"value":957},{"type":66,"value":1904}," flag where N is the number of seconds to run each test.",{"type":60,"tag":339,"props":1906,"children":1908},{"id":1907},"behavior",[1909],{"type":66,"value":1910},"Behavior",{"type":60,"tag":256,"props":1912,"children":1913},{},[1914,1924,1940],{"type":60,"tag":146,"props":1915,"children":1916},{},[1917,1922],{"type":60,"tag":104,"props":1918,"children":1919},{},[1920],{"type":66,"value":1921},"When set",{"type":66,"value":1923},": Each test runs for at most N seconds, then is stopped. Pass\u002Ffail is evaluated from the output collected during that window.",{"type":60,"tag":146,"props":1925,"children":1926},{},[1927,1932,1934,1938],{"type":60,"tag":104,"props":1928,"children":1929},{},[1930],{"type":66,"value":1931},"When not set",{"type":66,"value":1933},": Each test runs for at most ",{"type":60,"tag":104,"props":1935,"children":1936},{},[1937],{"type":66,"value":943},{"type":66,"value":1939}," (2 minutes) by default, or until pass\u002Ffail can be determined from the output, whichever comes first.",{"type":60,"tag":146,"props":1941,"children":1942},{},[1943,1948,1950,1955],{"type":60,"tag":104,"props":1944,"children":1945},{},[1946],{"type":66,"value":1947},"Per-test override",{"type":66,"value":1949},": If the test plan specifies a timeout for a specific test, that value takes precedence over both the default and the ",{"type":60,"tag":80,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":66,"value":1892},{"type":66,"value":1956}," flag.",{"type":60,"tag":339,"props":1958,"children":1960},{"id":1959},"validation",[1961],{"type":66,"value":1962},"Validation",{"type":60,"tag":256,"props":1964,"children":1965},{},[1966,1971,1976,1981],{"type":60,"tag":146,"props":1967,"children":1968},{},[1969],{"type":66,"value":1970},"N must be a positive integer",{"type":60,"tag":146,"props":1972,"children":1973},{},[1974],{"type":66,"value":1975},"Minimum: 5 seconds",{"type":60,"tag":146,"props":1977,"children":1978},{},[1979],{"type":66,"value":1980},"Maximum: 3600 seconds (1 hour)",{"type":60,"tag":146,"props":1982,"children":1983},{},[1984],{"type":66,"value":1985},"If invalid, show an error and ask the user to provide a valid timeout",{"type":60,"tag":1987,"props":1988,"children":1989},"style",{},[1990],{"type":66,"value":1991},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1993,"total":2094},[1994,2011,2025,2039,2049,2066,2080],{"slug":1995,"name":1995,"fn":1996,"description":1997,"org":1998,"tags":1999,"stars":23,"repoUrl":24,"updatedAt":2010},"accelerated-computing-cudf","accelerate data processing with cuDF","Official NVIDIA-authored guidance for NVIDIA cuDF GPU DataFrames, pandas acceleration, dask-cuDF, ETL, joins, groupby, CSV\u002FParquet I\u002FO, nullable semantics, and multi-GPU DataFrame workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2000,2003,2006,2007],{"name":2001,"slug":2002,"type":15},"Data Analysis","data-analysis",{"name":2004,"slug":2005,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":2008,"slug":2009,"type":15},"Performance","performance","2026-07-14T05:28:43.176466",{"slug":2012,"name":2012,"fn":2013,"description":2014,"org":2015,"tags":2016,"stars":23,"repoUrl":24,"updatedAt":2024},"aiq-deploy","deploy and manage NVIDIA AI-Q infrastructure","Use when asked to install, deploy, run, validate, troubleshoot, or stop NVIDIA AI-Q Blueprint infrastructure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2017,2020,2023],{"name":2018,"slug":2019,"type":15},"Deployment","deployment",{"name":2021,"slug":2022,"type":15},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":15},"2026-07-14T05:29:06.667109",{"slug":2026,"name":2026,"fn":2027,"description":2028,"org":2029,"tags":2030,"stars":23,"repoUrl":24,"updatedAt":2038},"aiq-research","conduct deep research with AI-Q","Use when asked to run deep research or AI-Q research through a reachable NVIDIA AI-Q Blueprint backend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2031,2034,2035],{"name":2032,"slug":2033,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2036,"slug":2037,"type":15},"Research","research","2026-07-14T05:28:06.816956",{"slug":2040,"name":2040,"fn":2041,"description":2042,"org":2043,"tags":2044,"stars":23,"repoUrl":24,"updatedAt":2048},"amc-run-sample-calibration","run AMC sample dataset calibration","Run end-to-end calibration on the shipped sample dataset (sdg_08_2_sample_data_010926.zip) against a running AMC microservice. Use when user says 'test sample dataset', 'run sample calibration', 'verify AMC install', or 'launch and test'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2045,2046,2047],{"name":2001,"slug":2002,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-17T05:29:03.913266",{"slug":2050,"name":2050,"fn":2051,"description":2052,"org":2053,"tags":2054,"stars":23,"repoUrl":24,"updatedAt":2065},"amc-run-video-calibration","calibrate video datasets with AutoMagicCalib","Calibrate a new dataset from pre-recorded video files via the AutoMagicCalib REST API. Use when user has local MP4s and says 'calibrate my videos', 'run AMC on these videos', or similar. For RTSP\u002Flive streams, use amc-run-rtsp-calibration instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2055,2058,2061,2062],{"name":2056,"slug":2057,"type":15},"Automation","automation",{"name":2059,"slug":2060,"type":15},"Imaging","imaging",{"name":9,"slug":8,"type":15},{"name":2063,"slug":2064,"type":15},"Video","video","2026-07-17T05:28:53.905004",{"slug":2067,"name":2067,"fn":2068,"description":2069,"org":2070,"tags":2071,"stars":23,"repoUrl":24,"updatedAt":2079},"amc-setup-calibration-stack","deploy AutoMagicCalib microservice with Docker","Launch AutoMagicCalib microservice and web UI from NGC release images via Docker Compose. Use when user says 'deploy auto calibration', 'launch auto calibration', 'launch AMC', 'start MS+UI', or 'set up auto-magic-calib'. Requires NGC API key.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2072,2073,2075,2076],{"name":2018,"slug":2019,"type":15},{"name":2074,"slug":1007,"type":15},"Docker",{"name":9,"slug":8,"type":15},{"name":2077,"slug":2078,"type":15},"Operations","operations","2026-07-17T05:28:56.913999",{"slug":2081,"name":2081,"fn":2082,"description":2083,"org":2084,"tags":2085,"stars":23,"repoUrl":24,"updatedAt":2093},"cudaq-guide","develop quantum applications with CUDA-Q","CUDA-Q onboarding guide for installation, test programs, GPU simulation, QPU hardware, and quantum applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2086,2087,2090],{"name":9,"slug":8,"type":15},{"name":2088,"slug":2089,"type":15},"Quantum Computing","quantum-computing",{"name":2091,"slug":2092,"type":15},"Simulation","simulation","2026-07-14T05:26:58.898253",305,{"items":2096,"total":2245},[2097,2115,2131,2142,2154,2168,2181,2195,2204,2213,2227,2236],{"slug":2098,"name":2098,"fn":2099,"description":2100,"org":2101,"tags":2102,"stars":2112,"repoUrl":2113,"updatedAt":2114},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2103,2106,2109],{"name":2104,"slug":2105,"type":15},"Documentation","documentation",{"name":2107,"slug":2108,"type":15},"MCP","mcp",{"name":2110,"slug":2111,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":2116,"name":2116,"fn":2117,"description":2118,"org":2119,"tags":2120,"stars":2128,"repoUrl":2129,"updatedAt":2130},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2121,2124,2125],{"name":2122,"slug":2123,"type":15},"Containers","containers",{"name":2018,"slug":2019,"type":15},{"name":2126,"slug":2127,"type":15},"Python","python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":2132,"name":2132,"fn":2133,"description":2134,"org":2135,"tags":2136,"stars":2128,"repoUrl":2129,"updatedAt":2141},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2137,2140],{"name":2138,"slug":2139,"type":15},"CI\u002FCD","ci-cd",{"name":2018,"slug":2019,"type":15},"2026-07-14T05:25:59.97109",{"slug":2143,"name":2143,"fn":2144,"description":2145,"org":2146,"tags":2147,"stars":2128,"repoUrl":2129,"updatedAt":2153},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2148,2149,2150],{"name":2138,"slug":2139,"type":15},{"name":2018,"slug":2019,"type":15},{"name":2151,"slug":2152,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":2155,"name":2155,"fn":2156,"description":2157,"org":2158,"tags":2159,"stars":2128,"repoUrl":2129,"updatedAt":2167},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2160,2163,2164],{"name":2161,"slug":2162,"type":15},"Debugging","debugging",{"name":2151,"slug":2152,"type":15},{"name":2165,"slug":2166,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":2169,"name":2169,"fn":2170,"description":2171,"org":2172,"tags":2173,"stars":2128,"repoUrl":2129,"updatedAt":2180},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2174,2177],{"name":2175,"slug":2176,"type":15},"Best Practices","best-practices",{"name":2178,"slug":2179,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":2182,"name":2182,"fn":2183,"description":2184,"org":2185,"tags":2186,"stars":2128,"repoUrl":2129,"updatedAt":2194},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2187,2190,2193],{"name":2188,"slug":2189,"type":15},"Machine Learning","machine-learning",{"name":2191,"slug":2192,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":2196,"name":2196,"fn":2197,"description":2198,"org":2199,"tags":2200,"stars":2128,"repoUrl":2129,"updatedAt":2203},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2201,2202],{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:25:53.673039",{"slug":2205,"name":2205,"fn":2206,"description":2207,"org":2208,"tags":2209,"stars":2128,"repoUrl":2129,"updatedAt":2212},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2210,2211],{"name":2018,"slug":2019,"type":15},{"name":2021,"slug":2022,"type":15},"2026-07-14T05:25:49.362534",{"slug":2214,"name":2214,"fn":2215,"description":2216,"org":2217,"tags":2218,"stars":2128,"repoUrl":2129,"updatedAt":2226},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2219,2222,2223],{"name":2220,"slug":2221,"type":15},"Code Review","code-review",{"name":2151,"slug":2152,"type":15},{"name":2224,"slug":2225,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":2228,"name":2228,"fn":2229,"description":2230,"org":2231,"tags":2232,"stars":2128,"repoUrl":2129,"updatedAt":2235},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2233,2234],{"name":17,"slug":18,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:25:54.928983",{"slug":2237,"name":2237,"fn":2238,"description":2239,"org":2240,"tags":2241,"stars":2128,"repoUrl":2129,"updatedAt":2244},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2242,2243],{"name":2056,"slug":2057,"type":15},{"name":2138,"slug":2139,"type":15},"2026-07-30T05:29:03.275638",496]