diff --git a/.env b/.env index 64a1b3f6b..8e3da25f1 100644 --- a/.env +++ b/.env @@ -12,7 +12,7 @@ PROJECT_NAME="airstack" # If you've run ./airstack.sh setup, then this will auto-generate from the git commit hash every time a change is made # to a Dockerfile or docker-compose.yaml file. Otherwise this can also be set explicitly to make a release version. # auto-generated from git commit hash -VERSION="0.20.0-alpha.17" +VERSION="0.20.0-alpha.18" # Image-tag discriminator ONLY (appears in the image tag suffix, e.g. ..._robot-x86-64_dev). # No Dockerfile consumes it: "prebuilt" does NOT bake the built ros_ws into the image today — # a real prebuilt (workspace-baked) stage is future work. Keep "dev" (mounted code, built live). diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index 5c019e945..804538520 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -505,7 +505,9 @@ jobs: python-version: "3.12" - name: Install report dependencies - run: pip install tabulate + # parse_metrics.py imports the tests/harness package, so it needs the + # full test requirements (pyyaml et al.), not just tabulate. + run: pip install -r tests/requirements.txt - name: Resolve PR base branch if: github.event_name == 'issue_comment' || github.event_name == 'pull_request' @@ -655,8 +657,11 @@ jobs: - name: Fail on regression if: steps.report.outcome == 'failure' + # parse_metrics.py writes report.md before exiting 1 on a regression; + # an uncaught crash also exits 1 but never writes the report. Require + # both so a parser crash cannot masquerade as a metric regression. run: | - if [ "${{ steps.report.outputs.parser_exit }}" = "1" ]; then + if [ "${{ steps.report.outputs.parser_exit }}" = "1" ] && [ -f report.md ]; then echo "::error::Metric regression detected — see the report above for details." else echo "::error::Metrics report generation failed — see the report step log." diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index a2bf33022..b2c58d466 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -21,6 +21,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + # The tests/meta contract tests exercise `airstack up --dry-run`, + # whose preflight requires the PegasusSimulator submodule, and the + # docs-catalog contract resolves nav entries that live inside + # submodules (e.g. vdb_mapping_ros2/README.md). + submodules: recursive - name: Set up Python uses: actions/setup-python@v5 @@ -32,6 +38,20 @@ jobs: - name: Install test dependencies run: python -m pip install -r tests/requirements.txt + # `airstack up --dry-run --sim isaac` preflight hard-errors without + # Nucleus credentials. Provision the same guest stub that + # module-system-tests.yml creates; hosted runners never launch Isaac. + - name: Create Isaac Sim omni_pass.env (preflight stub) + run: | + mkdir -p simulation/isaac-sim/docker + cat > simulation/isaac-sim/docker/omni_pass.env <<'EOF' + OMNI_USER=guest + OMNI_PASS=guest + OMNI_SERVER="omniverse://airlab-nucleus.andrew.cmu.edu/NVIDIA/Assets/Isaac/5.1" + ACCEPT_EULA=Y + OMNI_ENV_PRIVACY_CONSENT=Y + EOF + - name: Run unit tests env: AIRSTACK_ROOT: ${{ github.workspace }} diff --git a/docs/release_notes/index.md b/docs/release_notes/index.md index b8d93e369..43c052bff 100644 --- a/docs/release_notes/index.md +++ b/docs/release_notes/index.md @@ -19,6 +19,22 @@ its own notes. --> ## 0.20.0 (Unreleased) +- **CI un-redded: Metrics Report and Unit Tests fixed.** Every PR had been + failing since ~2026-08-20 for reasons unrelated to the code under test. + The system-tests **Metrics Report** job installed only `tabulate`, so + `tests/parse_metrics.py` (which imports the `tests/harness` package) + crashed with `ModuleNotFoundError: No module named 'yaml'` — and the crash + was misreported as "Metric regression detected"; the job now installs + `tests/requirements.txt`, and the regression verdict additionally requires + a written `report.md` so a parser crash can never masquerade as a metric + regression. The **Unit Tests** workflow ran the `tests/meta/` contract + suite on a checkout with no submodules and no `omni_pass.env`, so every + `airstack up --dry-run --sim isaac` contract hard-failed preflight and the + docs-catalog contract missed the submodule-resident vdb_mapping_ros2 + README; the workflow now checks out submodules recursively and provisions + the same guest `omni_pass.env` stub that `module-system-tests.yml` uses + (preflight itself stays strict). + - **New reference stack `full_mighty` + registered `mighty` module.** The MIGHTY Hermite-spline local planner (MIT ACL, RA-L 2026) with its acl-mapping voxel world model and a NavigateTask/trajectory_controller