This release focuses on expanded Slurm-on-Kubernetes support, air-gapped signing and verification, parallel bundle deployment, and first-class GPU driver ownership.
Highlights
Slurm on Kubernetes
- AKS H100 Slinky/Slurm recipe with Enroot/Pyxis support and Gres/GPU configuration
- New
topographcomponent with the slinky engine for topology-aware scheduling - Snapshot support for Slinky Slurm and the MariaDB operator
- Functional Kueue with default quota CRs
Recipes & Coverage
- Kubeflow training overlay for RTX PRO 6000 on EKS, plus RTX PRO 6000 inference (Dynamo) evidence
- VR200 training and inference (Dynamo) recipe evidence on RKE2
- AKS H100 driver-only and managed-driver recipe evidence
- Recipe resolution now enforces stated-criteria coverage, failing fast when a recipe cannot satisfy its declared criteria
Air-Gapped Supply Chain - Bundles can now be signed and verified entirely offline: aicr bundle accepts --tlog-upload=false to skip transparency-log upload, and verification gains --insecure-ignore-tlog for disconnected environments. KMS-backed signing also adds HashiCorp Vault support. Verification also got stricter - bundles now verify as fully self-contained, air-gapped artifacts, recipe.yaml is covered by bundle checksums, and AICR now runs its own Rekor v2 identity monitoring for the release signer.
Parallel Deployment - The deployer now deploys independent components in parallel, following the dependency graph so unrelated components no longer wait on each other.
GPU Driver Ownership - Driver management is now an explicit contract: recipes auto-detect a pre-installed GPU driver from the snapshot, AKS defaults to the Azure-managed GPU driver profile, and a bundle-time coherence check catches conflicting driver-ownership configuration before deploy.
Validation & Evidence - The validator gains a configurable inference-perf router mode, recipe-supplied NCCL benchmark runtime via --data, a uniform-RDMA-fabric readiness gate, GPU readiness gated on runtime-required taint clearance, and fail-fast on degraded GPU nodes. The evidence dashboard at validation.aicr.run gains a cross-version combined view with deep links from recipe health.
Other Improvements
- SDK supports custom kubeconfig paths for validation jobs, and
aicr validate --kubeconfignow selects the target cluster end-to-end aicr diffcompares structured snapshot fields- GPU Operator upgraded to v26.3.3 with driver 580.173.02; nvidia-tuned bumped to 0.3.2
- AICR container images are now based on
nvcr.io/nvidia/distroless/static
Thanks to @ArangoGutierrez, @atif1996, @ayuskauskas, @kaynetu, @lockwobr, @mohityadav8, @njhensley, @tjrasche, @xdu31, @yuanchen8911, and @mchmarny.
Changelog
New Features
- d89d2c6: feat(bundle): KMS-backed signing via HashiCorp Vault (hashivault://) (#1729) (@lockwobr)
- 6f9050b: feat(bundle): air-gapped signing with --tlog-upload=false (#1797) (@lockwobr)
- 26afcca: feat(bundler): bundle-time GPU driver-ownership coherence check (#1819) (@yuanchen8911)
- 28d3c51: feat(ci): collect UAT cluster debug bundle on failure (#1764) (@njhensley)
- c5d4ede: feat(ci): consolidate KWOK tier workflows into single reusable runner (#1790) (@mohityadav8)
- 2f6367b: feat(ci): onboard GB200 AWS UAT reservation (#1774) (@njhensley)
- 65f598d: feat(ci): own Rekor v2 identity monitoring via tools/rekor-monitor (#1754) (@lockwobr)
- d1f62de: feat(config): add KMS signingKey to AICRConfig bundle attestation (#1796) (@lockwobr)
- e06d23f: feat(corroborate): add cross-version combined dashboard view (#1771) (@njhensley)
- 76cdb46: feat(deployer): deploy independent components in parallel (#1746) (@lockwobr)
- 6de53db: feat(recipe): auto-detect pre-installed GPU driver from snapshot (#1697) (@xdu31)
- ce7ede7: feat(recipes): add kubeflow training overlay for rtx-pro-6000 on EKS (#1857) (@mohityadav8)
- 13a49f5: feat(recipes): default AKS to Azure-managed GPU driver profile (#1756) (@yuanchen8911)
- 3b3e3a3: feat(recipes): functional kueue with default quota CRs (#1686) (@ArangoGutierrez)
- 709b620: feat(sdk): add support for custom kubeconfig paths for validation jobs to SDK (#1735) (@tjrasche)
- 2fdec48: feat(skills): add aicr-uat-report UAT health report skill (@mchmarny)
- 70eea6c: feat(uat): capture GPU driver state on shortfall in debug bundle (#1867) (@njhensley)
- 477285d: feat(uat): enroll nvkind (kind-h100) in the nightly batch (#1871) (@njhensley)
- de5cea3: feat(uat): nvkind H100 real-hardware evidence lane (DC5) (#1843) (@njhensley)
- ae4c014: feat(validator): configurable inference-perf router mode (#1745) (@yuanchen8911)
- fd4f7a1: feat(validator): recipe-supplied NCCL benchmark runtime via --data (#1805) (@njhensley)
- 6548f17: feat(verify): offline / air-gapped verification (--insecure-ignore-tlog) (#1798) (@lockwobr)
Bug Fixes
- 3574f80: fix(bundler): cover recipe.yaml with bundle checksums (#1750) (@yuanchen8911)
- 2e0bc38: fix(ci): defer release aliases until security gates pass (#1763) (@mchmarny)
- 16b7358: fix(ci): guard UAT image cleanup on numeric version id (#1765) (@njhensley)
- 132dadf: fix(ci): secure GCP UAT actuator execution (#1759) (@mchmarny)
- e105808: fix(cleanup): backstop check namespaces; fence out-of-band installs (#1773) (@lockwobr)
- 958e1de: fix(cli): validate --kubeconfig selects the cluster end-to-end (#1868) (@mchmarny)
- 0d0c1ed: fix(collector): address Slinky snapshot review (@mchmarny)
- 93ef7d5: fix(corroborate): partial phase rollup + show untested categories (#1845) (@njhensley)
- ee10a60: fix(diff): compare structured snapshot fields (#1760) (@mchmarny)
- 7f5f25c: fix(nfd): raise topology-updater memory limit for high-core GPU nodes (#1825) (@njhensley)
- 3fa4614: fix(oci): restore layer title annotation for file-store unpack (#1794) (@njhensley)
- 544491c: fix(recipe): enforce stated-criteria coverage on recipe resolution (#1784) (@mchmarny)
- 3aa5283: fix(recipe): require Kubernetes 1.34 for EKS GB200 training (#1747) (@yuanchen8911)
- 849b959: fix(test): scrub inherited VAULT_* env in vault KMS e2e runner (#1895) (@lockwobr)
- 57019a1: fix(uat): harness correctness bugs + budget-aware nightly time-box (#1847) (@njhensley)
- a897f34: fix(uat): nvkind os-agnostic recipe + dashboard coordinate (#1851) (@njhensley)
- 33f06c5: fix(uat): refresh the EKS STS session mid-gate on AWS (#1872) (@njhensley)
- 431bdc8: fix(validate): never emit evidence in --no-cluster dry-run mode (#1810) (@njhensley)
- 9724b49: fix(validator): fail fast on degraded GPU node; dedicated model-cache timeout (#1866) (@njhensley)
- 49c3cc4: fix(validator): gate GPU readiness on runtime-required taint clearance (#1811) (@njhensley)
- 53a43e9: fix(validator): gate deployment readiness on uniform RDMA fabric (#1865) (@njhensley)
- 1179103: fix(validator): make nodewright deployment health check value-aware (#1849) (@njhensley)
- 2b1be85: fix: enforce closed-world bundle verification (#1758) (@mchmarny)
Other Tasks
- 3cfc476: Accept renamed nvidia-smi banner fields (#1748) (@yuanchen8911)
- 1439f2f: Enable scheduled execution for Rekor Monitor (@mchmarny)
- 86272d0: Fix OCP readiness gate OLM RBAC (#1749) (@yuanchen8911)
- e0efbb5: Revert "feat(slinky-slurm): AKS H100 recipe, Enroot/Pyxis, Gres/GPU (#1744)" (#1788) (@njhensley)
- 08121ad: Update rekor-monitor.yaml (@mchmarny)
- 46b9e01: chore(deps): Update Helm release gpu-operator to v26 (#1804) (@github-actions[bot])
- c1b9653: chore(deps): Update docker.io/library/busybox Docker tag to v1.38.0 (#1880) (@github-actions[bot])
- d989e0c: chore(deps): Update ministackorg/ministack Docker tag to v1.4.3 (#1856) (@github-actions[bot])
- e63b7a3: chore(deps): Update openbao/openbao Docker tag to v2.5.5 (#1786) (@github-actions[bot])
- e3fc8fb: chore(deps): Update supply-chain (#1816) (@github-actions[bot])
- 7d8ac35: chore(deps): Update testing-tools (#1741) (@github-actions[bot])
- b8c0e63: chore(deps): Update testing-tools (#1803) (@github-actions[bot])
- dd5eebd: chore(deps): Update testing-tools (#1815) (@github-actions[bot])
- 4cee225: chore(deps): Update testing-tools (#1834) (@github-actions[bot])
- c81811f: chore(deps): Update ubuntu Docker tag to v26 (#1817) (@github-actions[bot])
- 8aa4f44: chore(deps): upgrade GPU Operator to v26.3.3 + driver 580.173.02 (#1881) (@atif1996)
- 78450b7: chore(fern): register v0.17.0 (#1739) (@github-actions[bot])
- 8a1481d: chore(recipes): remove default-equal overlay version pins (#1821) (@yuanchen8911)
- d777ca3: chore(security): drop stale oras-go grype ignore, exclude agent worktrees (@mchmarny)
- 27330a1: chore(security): vex pillow+grpc HIGHs, drop 12 stale statements (@mchmarny)
- f0e2273: chore: base AICR containers on nvcr.io/nvidia/distroless/static (#1795) (@lockwobr)
- 677ae04: chore: bump syft to v1.49.0 (@mchmarny)
- 1d10997: chore: codex skill (@mchmarny)
- 8b72e51: chore: dep upgrade (@mchmarny)
- 9458b1f: chore: dep upgrade (@mchmarny)
- 3c4875b: chore: deps: bump actions/checkout from 7.0.0 to 7.0.1 (#1831) (@dependabot[bot])
- 0afb698: chore: deps: bump actions/checkout from 7.0.0 to 7.0.1 (#1852) (@dependabot[bot])
- 2faae7e: chore: deps: bump actions/labeler from 6.2.0 to 7.0.0 (#1832) (@dependabot[bot])
- 335a9ef: chore: deps: bump actions/setup-go from 6.5.0 to 7.0.0 (#1785) (@dependabot[bot])
- ffe1d9c: chore: deps: bump actions/setup-node from 6.4.0 to 7.0.0 (#1740) (@dependabot[bot])
- 0fb467d: chore: deps: bump aws-actions/configure-aws-credentials from 6.2.2 to 6.2.3 (#1878) (@dependabot[bot])
- ca302a1: chore: deps: bump docker/setup-qemu-action from 3.6.0 to 4.2.0 (#1799) (@dependabot[bot])
- 2e57cdb: chore: deps: bump github.com/go-logr/logr from 1.4.3 to 1.4.4 (#1829) (@dependabot[bot])
- 6f01cb1: chore: deps: bump github.com/prometheus/client_golang from 1.23.2 to 1.24.0 (#1830) (@dependabot[bot])
- d5eef84: chore: deps: bump github/codeql-action/analyze from 4.37.0 to 4.37.1 (#1801) (@dependabot[bot])
- 62e52a9: chore: deps: bump github/codeql-action/analyze from 4.37.1 to 4.37.2 (#1853) (@dependabot[bot])
- aafc9ed: chore: deps: bump github/codeql-action/analyze from 4.37.2 to 4.37.3 (#1879) (@dependabot[bot])
- d5857af: chore: deps: bump github/codeql-action/init from 4.37.0 to 4.37.1 (#1802) (@dependabot[bot])
- 39deafe: chore: deps: bump github/codeql-action/init from 4.37.1 to 4.37.2 (#1855) (@dependabot[bot])
- 8e06b5e: chore: deps: bump github/codeql-action/init from 4.37.2 to 4.37.3 (#1876) (@dependabot[bot])
- b6d8c1b: chore: deps: bump github/codeql-action/upload-sarif from 4.37.0 to 4.37.1 (#1800) (@dependabot[bot])
- 5cc9c69: chore: deps: bump github/codeql-action/upload-sarif from 4.37.1 to 4.37.2 (#1854) (@dependabot[bot])
- c16cf12: chore: deps: bump github/codeql-action/upload-sarif from 4.37.2 to 4.37.3 (#1877) (@dependabot[bot])
- b89095e: chore: deps: bump renovatebot/github-action from 46.1.19 to 46.1.20 (#1814) (@dependabot[bot])
- 091edf8: chore: go dep upgrade (@mchmarny)
- 298e9a0: chore: quick cleanup (@mchmarny)
- e4eedf6: chore: sweep stale v26.3.2 refs and BOM warning after #1881 (#1882) (@mchmarny)
- 1608bc0: ci(notices): gate THIRD_PARTY_NOTICES.md freshness cross-platform (#1753) (@lockwobr)
- 1ba9d8e: ci(uat): enroll azure-h100 inference in nightly batch (#1776) (@njhensley)
- 08d2c24: ci(uat): refresh evidence dashboard on ingest, name UAT runs by intent (#1807) (@njhensley)
- e800649: docs(bom): regenerate container images for upstream ubuntu drift (#1824) (@yuanchen8911)
- 0008a57: docs(corroborate): GP6 — evidence dashboard public docs + TG⇄GP cross-link (#1406) (#1768) (@mohityadav8)
- 30ae095: docs(corroborate): fix evidence-dashboard consensus/facets accuracy (#1838) (@njhensley)
- 98540c1: docs(demos): add required --os ol to OKE/L40S query example (#1885) (@yuanchen8911)
- 73d2f66: docs(design): ADR-015 recipe-declared configuration profiles (#1762) (@yuanchen8911)
- 5dd5748: docs(recipes): align pin docs and guard messages with #1616 (#1837) (@yuanchen8911)
- ea676e1: docs(slinky-slurm): document external accounting (#1822) (@kaynetu)
- 9e8e572: evidence(aks): h100 driver-only inference + training recipe evidence (#1840) (@yuanchen8911)
- 27bb194: evidence(aks): h100 managed-driver kubeflow-training + dynamo-inference (#1863) (@yuanchen8911)
- f15089f: evidence(eks): rtx-pro-6000 inference-dynamo recipe evidence (#1823) (@yuanchen8911)
- 884be55: evidence(rke2): vr200 inference-dynamo recipe evidence (#1841) (@yuanchen8911)
- ee90f02: evidence(rke2): vr200 training recipe evidence (#1827) (@yuanchen8911)
- 0a7c385: evidence(rke2): vr200 training three-phase evidence with NCCL gate (#1850) (@yuanchen8911)
- 0c11967: feat(recipe-health): deep-link Evidence to dashboard + link-check bot (#1809) (@njhensley)
- 7e54fca: feat(slinky-slurm): add AKS H100 recipe, Enroot/Pyxis support, and Gres/GPU config (#1744) (@kaynetu)
- da4787c: feat(slinky-slurm): add AKS H100 recipe, Enroot/Pyxis support, and Gres/GPU config (#1789) (@kaynetu)
- f74b1af: feat(slinky-topograph): topograph component with slinky engine (#1737) (@ArangoGutierrez)
- 8004ee6: feat(slinky/slurm/snapshot): add snapshotting for Slinky Slurm and MariaDB operator (#1864) (@kaynetu)
- 0e046cc: fix(k8s-client): fix error classification for failed kubeconfig ingestion (#1743) (@tjrasche)
- 51232cd: fix(nodewright-customizations): bump nvidia-tuned to 0.3.2 (#1767) (@ayuskauskas)
- 11b42b2: perf(ci): cross-compile validator images to skip QEMU on arm64 (#1808) (@njhensley)
- 22c35b3: refactor(ci): consolidate UAT runners into shared phases.sh (#1769) (@njhensley)
- 833579b: test(chainsaw): remove orphaned snapshot/deploy-agent + fix README (#1846) (@njhensley)
- 7cd283a: test(recipe): guard kubeflow-trainer manifest files in conformance (@mchmarny)
- f05cc11: test(uat): add GB200 inference UAT config (#1826) (@njhensley)