Quick Start Guide
Run a regression test on a deployed SIL stack.
This quickstart shows two ways to run a test:
- Via the skill — enable the
hoisa-generate-regression-reportskill in your coding agent and describe the run in plain language. Recommended for demos: the agent orchestrates every phase and gates on readiness signals. - Manually — run
scripts/run_multi.shyourself (one command per test).
Regression Testing Reporter runs on top of an already-deployed SIL stack. It does not deploy Halos or VSS — do that first (see SIL — 2D Perception). See Overview for what the Regression Testing Reporter is and what a run produces.
Isaac Sim publishes ground truth; VSS + the Safety Core produce the MUTE / UNMUTE decision; the Regression Testing Reporter service records both at 30 Hz and grades the result. See Architecture for the architecture diagram and the full data flow.
Step 1: Prerequisites
The SIL stack (VSS Warehouse 3.3 + the Halos sil profile) must be deployed and healthy before you run the Regression Testing Reporter. If it is not up yet, deploy it first:
- SIL — 2D Perception — manual SIL bring-up, or
- Agentic Deployment — agent-driven bring-up.
Confirm the stack is healthy:
Host tooling: Docker + Compose (usable without sudo), jq (for the VST API checks), and python3. No host ROS 2 install is required — every ros2 check in this guide runs inside a container (comm-layer here, srr from Step 5 on).
Phase 2 (perception scoring) requires the 3D pipeline (mdx-bev + mdx-behavior, i.e. Sparse4D) to be flowing. A 2D-only feed still works and gives Phase 1 (the safety decision) only — that is expected, not a failure.
The Regression Testing Reporter scores the ATL decision only: it subscribes to /safety/command and /safety/is_muted. Run it with PSF_APP=atl; on a pxc run it prints PSF_FEED_DEAD and scores every frame as UNMUTED.
Step 2: Get the repo
Regression Testing Reporter lives inside the Halos Outside-In Safety repo, which you already cloned when deploying the SIL stack:
If you are on a fresh machine and don’t have it yet:
The rest of this guide runs from the Regression Testing Reporter directory:
Step 3: Configure the Regression Testing Reporter .env
Regression Testing Reporter inherits shared values (HOST_IP, ROS_DOMAIN_ID, VST_BASE_URL, MDX_DATA_DIR, …) from the Halos profile env, so its own .env only needs a few paths. Copy the example and fill it in:
Edit .env:
Step 4: Sync Regression Testing Reporter fixtures into the Isaac SIL tree (one-time)
Isaac Sim reads the scenario behavior trees + navmesh from its bind-mounted sil/configs/ directory. The Regression Testing Reporter keeps the canonical copies under scenarios/, so copy them into the SIL tree once:
This copies the IRA 1.7 behavior trees + navmesh.json into sil/configs/, the Script-Editor utilities into sil/scripts/isaac/, and installs the Regression Testing Reporter default_config_ros.yaml template (IRA config 1.7.0: Isaac Sim 6.1 refuses 1.6.0, and the scene shuts down at startup). It is idempotent — safe to re-run.
Re-run it after cloning on a new machine, or after regenerating behavior trees. See Test Scenarios for the scenario fixtures and how to regenerate them.
Step 5: Build and start the Regression Testing Reporter service
Pass --env-file ../.env on every Compose command: the .env you filled in at Step 3 lives at the regression-reporter root, one level above srr-service. Compose only auto-loads .env from the current directory, so without the flag ${HOISA_ROOT_PATH} / ${CALIBRATION_JSON} resolve to empty strings and the container fails to start (invalid spec: ... empty section between colons).
The container joins the host network so it can reach ROS 2 and Kafka directly. Verify it is up and can see ROS:
You should see the srr container and the /safety/is_muted topic listed.
Step 6: Run a regression test
Pick one of the two paths below. Both run the same pipeline; the skill adds automatic readiness checks and a demo-friendly log.
The available scenarios (all 5 minutes by default):
See Test Scenarios for full details on each case.
Option A — Via the skill
Enable the hoisa-generate-regression-report skill in your coding agent, then describe the run in plain language. The skill parses the scenarios and durations, orchestrates each phase, and gates on readiness signals.
Examples:
The skill does not deploy Halos/VSS, and always restarts both the Halos and Regression Testing Reporter compose stacks between scenarios (Safety Core counter drift otherwise carries across runs and corrupts the next result).
Option B — Manually
Run one command from the Regression Testing Reporter directory. The script does the full plumbing — compose restart, scene load, record, split, aggregate, and per-clip video pull — for each scenario in turn:
When it finishes it prints the output location:
Under the hood (optional)
run_multi.sh performs these phases per scenario. Run them by hand only if you need to debug a single step — otherwise use Option A or B above.
-
Restart both stacks for fresh Safety Core state:
-
Select the scenario’s behavior trees + recording length. Copy the three
srr_<name>_char{0,1,2}.bt.jsononto the fixed active names insil/configs/, then setsimulation_durationindefault_config_ros.yaml. -
Start the scene (
--srr-gtwires the ground-truth publishers — see Regression Testing Reporter Ground-Truth Graph (opt-in)): -
Wait for the 3 RTSP streams + perception FPS to come up, then give the Safety Core ~30 s to warm up (avoids a cold-start outlier on the first clip).
-
Record:
-
Analyze — split into clips, aggregate, and pull the per-clip videos:
See Architecture for what each phase does.
Step 7: Read the results
Open the top-level summary first:
What the headline metrics mean:
Verdict buckets: PASS (≥ 95% match), NEAR (80–95%), FAIL (< 80%).
For the full metric reference, drill-down workflow, and how to read a per-clip report, see Interpreting the Report.
Step 8: Evidence bundle, debug viewer, heatmaps (optional)
Package a self-contained evidence bundle (per-clip CSVs + manifest + Safety Core log slice + MP4):
Open the browser viewer for scrub-synced per-clip drill-down (MP4 ↔ GT ↔ Safety Core state ↔ BA events ↔ Safety Core log). See Debug Viewer for the full walkthrough:
Cleanup
Leave the containers running to inspect results. To free disk space, drop old runs (videos live inside the run dir):
Stop the Regression Testing Reporter service when you’re done:
Tear down the SIL stack (Halos + VSS) via the deploy skills or SIL — 2D Perception — not here.
Troubleshooting
Empty parquet / no BA events during recording
Perception isn’t feeding the Regression Testing Reporter. Usual causes: nvstreamer still running alongside Isaac (stop it — Isaac must be the sole camera source), stale VST Camera sensors piling up across restarts, or perception FPS at 0. Restart perception and re-check:
tw_split reports 0 clips
Either the recording is too short to contain a forklift trailer crossing (use ≥ 3 minutes), or the parquet footer wasn’t flushed yet — wait a few seconds and re-run the split.
VST record API returns 503, or sensor/add gets 400
Stale VST state. Delete leftover online Camera* sensors, and if the record API is still 503 run the VSS reset recipe (see the hoisa-generate-regression-report skill’s “When VSS is corrupted” section, or the vss-build-vision-ai skill teardown).
Container runs stale code
If clip_logs is missing, videos land in the wrong folder, or there is no Phase 2 section, the image is older than the host source — rebuild:
Low Mute correct% on a long run, or alternating PASS/FAIL
If PASS/FAIL alternates in step with the forklift entering the trailer, this is the known Safety Core counter-drift signature (fix planned upstream). Restart the Halos compose between runs; don’t file it as a new regression. See Interpreting the Report for the full signature.