Repository navigation
v0.22.0
As our last v0 release before v1 (scheduled on October 5th), this release focuses on component upgrade safety, validation hardening, and bundler and deployer reliability, landing alongside new platform and accelerator coverage and the last phase of ADR-022 described apiVersion migration that v1.0.0 will complete.
Highlights
Component Upgrade Safety - v1 commits AICR to safe component upgrades, and this release adds additional capabilities to that mechanism. ADR-021 defined a transition record, a per-component, per-version-boundary statement of safe, manual, or blocked, with the steps and the evidence that backs it, and a fail-closed loader that reports unknown rather than guessing. The new aicr upgrade-check command reads those records and reports the verdict for the boundary you are about to cross. Records also live beside the component they describe, so the obligation renews on each pin bump rather than decaying.
Validation Hardening - Every check that v1 will stand behind has to fail for the right reason. The DRA support check now gains an MNNVL IMEX channel subtest. The NCCL benchmark is derived from the shipped TCPXO runtime rather than a separately pinned image, with AICR_NCCL_RUNTIME_IMAGE available where a site needs its own. The GB200 NET preflight is now driver-version-aware, unsupported Hyperdisk types are rejected on a4x nodes, AKS cluster autoscaling is validated, NodeWright is read by discovery, and Job deadlines get headroom over the check budget so a slow check fails as a check rather than a timeout.
Bundler and Deployer Reliability — The bundle layout is a frozen v1 surface, so what it emits has to be right on every deployer, not just the common one. bundle-info.yaml now records the deployer and layout that produced the bundle. recipe.yaml is written for every deployer, not only Helm; ownsCRDs is honored on the helm and helmfile deployers; helm connection flags are translated for the CRD step, with the flag value redacted when the step rejects it; and dry-run no longer previews a stale cached chart archive.
Recipes and Coverage
k0sjoins the supported services, with a validated H200 training leaf, a setup guide, and Preview coordinate coverage- GKE gains a GB200 (a4X) recipe with NVLS NCCL validation, and a
torch-distributed-tcpxoruntime with the network mapping TCPXO requires - Five new
training-kubeflowleaves, each with its evidence link kept intact - GB300 gets node tuning enabled and bumped NodeWright packages, plus its own NCCL thresholds
- Kueue moves to 0.19.3 and kai-scheduler to v0.16.9
Other Improvements
- Five opt-in NVSentinel mixins widen what a cluster reports about itself: audit logging and tracing, a Kubernetes Object Monitor, a preflight mixin, Node Problem Detector conditions consumed as NVSentinel signal, and NIC and fabric fault detection on Mellanox platforms.
- SLSA provenance is attested per platform manifest; recipe digests are content-only via
PredicateTypeV3; evidence fails closed on a mutable validator image tag; and overlay recipe digests are canonicalized so the same recipe hashes the same way - New signed evidence for GB300 EKS training and inference, VR200 training-kubeflow, and the H100 AKS training-kubeflow and inference-dynamo coordinates
- A recipe can pin deployment identity so registry defaults can move underneath it; a profile value can tighten a composed constraint; and a direct
-roverlay whose mixins were not applied is rejected rather than silently under-resolved
Thanks to @ArangoGutierrez, @atif1996, @ayuskauskas, @chris320211, @coffeepac, @lockwobr, @mikecook, @mohityadav8, @njhensley, @ramessesii2, @rorajani, @srao-nv, @sylvesterkaczmarek, @varmesh, @vineeth-bandi, @yuanchen8911, and @mchmarny.
Changelog
New Features
- 693a7f8: feat(api): switch artifact emitters to ADR-022 target apiVersions (#2703) (@mchmarny)
- c7d0825: feat(bundler): derive the DRA eviction label with dra-node-labeler (#2813) (@atif1996)
- 85d1280: feat(bundler): record deployer and layout in bundle-info.yaml (#2816) (@mchmarny)
- 6e880a2: feat(ci): attest SLSA provenance per platform manifest (#2729) (@lockwobr)
- c113877: feat(ci): notify Slack when main goes red (@mchmarny)
- 3462ada: feat(ci): report registry chart drift to Slack weekly (#2779) (@mchmarny)
- bc29f9a: feat(cli): aicr upgrade-check reports ADR-021 upgrade verdicts (#2760) (@lockwobr)
- 79b89df: feat(evidence): publish GB300 EKS training and inference evidence at v0.21.1 (#2812) (@yuanchen8911)
- a4e952f: feat(gb300): enable node tuning and bump nodewright packages (#2772) (@ayuskauskas)
- 9fc4f86: feat(recipe)!: ship NodeWright CRs, move default namespace (#2861) (@lockwobr)
- 1f27c0d: feat(recipe): pin deployment identity so registry defaults can move (#2839) (@lockwobr)
- 4e3e8f0: feat(recipes)!: ship torch-distributed-tcpxo GKE runtime with required network mapping (#2705) (@srao-nv)
- b73f08d: feat(recipes): add GKE GB200 (A4X) recipe with NVLS NCCL validation (#2338) (@mikecook)
- 758b552: feat(recipes): add five training-kubeflow leaves, keep evidence links (#2717) (@yuanchen8911)
- e665888: feat(recipes): add k0s service overlays with validated H200 training leaf (#2656) (@ramessesii2)
- 3d9dac5: feat(recipes): add opt-in nvsentinel-preflight mixin (#2778) (@varmesh)
- 3351de8: feat(recipes): bump kueue chart to 0.19.3 (#2598) (@ArangoGutierrez)
- c9a5230: feat(recipes): consume Node Problem Detector conditions in NVSentinel (#2804) (@varmesh)
- f8ca115: feat(recipes): detect NIC and fabric faults on Mellanox platforms (#2823) (@varmesh)
- 4f97dbc: feat(upgrade): add ADR-021 transition record schema and loader (#2704) (@ayuskauskas)
- 640a114: feat(upgrade): nodewright v0.18.0 record; relax rule 2 to safe only (#2815) (@ayuskauskas)
- f451468: feat(validator): derive NCCL benchmark from the shipped TCPXO runtime (#2751) (@yuanchen8911)
- 9f5ca25: feat(validator): dra-support MNNVL IMEX channel subtest (v1 milestone) (#2770) (@yuanchen8911)
- 764932b: feat(validators): add inference-model-cache-storage-class recipe cons… (#2669) (@mikecook)
- ddefb8f: feat(validators): support AICR_NCCL_RUNTIME_IMAGE override for NCCL checks (#2386) (@mohityadav8)
- de89f27: feat: GB300 nccl thresholds (#2782) (@coffeepac)
- f2c3fa4: feat: add opt-in NVSentinel Kubernetes Object Monitor mixin (#2763) (@varmesh)
- 031b010: feat: add opt-in NVSentinel audit logging and tracing mixin (#2712) (@varmesh)
Bug Fixes
- 87bcb45: fix(build): pin distroless static v4.1.3 so images ship /app (#2771) (@lockwobr)
- 4aa8337: fix(bundler): honor ownsCRDs on the helm and helmfile deployers (#2725) (@lockwobr)
- ebddbb2: fix(bundler): redact the flag value when the CRD step rejects it (#2856) (@mchmarny)
- b510a0f: fix(bundler): stop dry-run previewing a stale cached chart archive (#2855) (@lockwobr)
- 6f1e622: fix(bundler): translate helm connection flags for the CRD step (#2849) (@mchmarny)
- cdfb814: fix(bundler): write recipe.yaml for every deployer, not just helm (#2759) (@lockwobr)
- b99c8e4: fix(ci): gate gcp-h100 training UAT cell to v0.22.0+ (@mchmarny)
- ec7fef4: fix(ci): ignore CSIDriver schema-lag field in KWOK's Argo CD instance (#2592) (@mikecook)
- eb405a0: fix(ci): install ORAS directly instead of via setup-oras (#2657) (@mchmarny)
- 5849fb4: fix(ci): release-gate fixes for cache, oasdiff, checksums, docs gate (#2673) (@mchmarny)
- ccebdce: fix(ci): remove go install from the qualification gate (#2713) (@mchmarny)
- 8b24cff: fix(ci): stop fork runs writing caches from lint, e2e and cli-e2e (#2680) (@mchmarny)
- 8efa372: fix(ci): stop merge gate duplicating and cancelling main push runs (@mchmarny)
- 5bb01eb: fix(ci): validate YAML code blocks in documentation (#2750) (@chris320211)
- 0ab0c2e: fix(errors): distinguish context cancellation from deadline expiry (#2852) (@lockwobr)
- 81555ac: fix(evidence): fail closed on mutable validator image tags (#2884) (@mchmarny)
- 2e7f69f: fix(evidence): make recipe digest content-only via PredicateTypeV3 (#2789) (@mikecook)
- 3a346c7: fix(issues): quote "No" dropdown option in feature request issue form (#2707) (@vineeth-bandi)
- 9912fa4: fix(recipe): let a profile value tighten a composed constraint (#2643) (@yuanchen8911)
- b707c93: fix(recipe): reject a direct -r overlay whose mixins were not applied (#2744) (@yuanchen8911)
- 54c395d: fix(recipes): add two missing conformance checks to GB training bases (#2716) (@yuanchen8911)
- 852f57b: fix(recipes): bump kai-scheduler to v0.16.9 (#2647) (@mikecook)
- 8544b9b: fix(recipes): drop gpu-operator's dead accelerated nodeSelector route (#2768) (@srao-nv)
- 74b194d: fix(recipes): require node selector for kube-prometheus-stack PVC (#2591) (@mikecook)
- 214c24e: fix(recipes): restore slinky-topograph after the upstream repo move (#2795) (@yuanchen8911)
- 3157a22: fix(security): VEX CVE-2026-82049 CPython tarfile filters (@mchmarny)
- ee6b39e: fix(security): bump aiperf-bench base to distroless python 3.13-v4.1.4 (#2805) (@mchmarny)
- ed59a3b: fix(testgrid): derive renamed GCS bucket for testgrid-publish (#2555) (@srao-nv)
- 9fdb0e1: fix(testgrid): register GB300 and GB200 EKS coordinates for evidence linking (#2872) (@yuanchen8911)
- b2cd290: fix(tests): scope interrupted-snapshot assertions to the run's own PIDs (#2881) (@mchmarny)
- 245c427: fix(tests): scope the tool-pin scan to git, not the whole worktree (#2880) (@mchmarny)
- 48892db: fix(tools): enforce exact Helm version pin in check-tools/setup-tools (#2702) (@mikecook)
- 50c3249: fix(tools): install ctlptl, goreleaser, oasdiff from binary releases (#2665) (@mchmarny)
- 3bf4d04: fix(uat): capture driver-dead GPU nodes (#1860) and MOFED/NCCL crash logs (#2634) (@njhensley)
- 8e645e5: fix(validator)!: give the Job deadline headroom over the check budget (#2682) (@ayuskauskas)
- d45ad62: fix(validator): guard against stale DaemonSet rollouts in health checks (#2727) (@mikecook)
- 142c5a4: fix(validator): make GB200 NET preflight driver-version-aware (#2607) (@varmesh)
- 90cd415: fix(validator): read NodeWright by discovery; pin nodewright v0.19.0 (#2829) (@ayuskauskas)
- e80b6e6: fix(validator): skip secure-accelerator-access for Slinky Slurm leaves (#2724) (@mikecook)
- c35f475: fix(validator): suppress dra-node-labeler health check when eviction not opted in (#2847) (@njhensley)
- 51f7990: fix(validators): reject unsupported Hyperdisk types on a4x nodes (#2668) (@mikecook)
- 7a86a1e: fix: canonicalize overlay recipe digests (#2659) (@sylvesterkaczmarek)
- 6f2dd95: fix: clean up JobSet CRDs during teardown (#2651) (@sylvesterkaczmarek)
- b8c790f: fix: place robust-controller and secure-accelerator-access correctly (#2755) (@mikecook)
- b416441: fix: validate AKS cluster autoscaling (#2649) (@sylvesterkaczmarek)
Other Tasks
- 462eeb1: chore(ci): retire the hosted demo API service (#2654) (@mchmarny)
- 385d450: chore(ci): trim the drift digest to counts, link, and call to action (@mchmarny)
- dd12092: chore(deps): Update dependency oasdiff/oasdiff to v1.31.0 (#2645) (@github-actions[bot])
- e7be218: chore(deps): Update dependency oasdiff/oasdiff to v1.32.0 (#2802) (@github-actions[bot])
- e8ee810: chore(deps): Update dependency yaml to v2.9.1 (#2774) (@github-actions[bot])
- b53c731: chore(deps): Update ministackorg/ministack Docker tag to v1.5.10 (#2740) (@github-actions[bot])
- 68477bb: chore(deps): Update ministackorg/ministack Docker tag to v1.5.9 (#2710) (@github-actions[bot])
- 6946f4a: chore(deps): Update module golang.org/x/term to v0.46.0 (#2742) (@github-actions[bot])
- d005470: chore(deps): Update testing-tools (#2801) (@github-actions[bot])
- c6d8a55: chore(deps): Update ubuntu:26.04 Docker digest to 513c074 (#2678) (@github-actions[bot])
- 19af4ca: chore(deps): Update ubuntu:26.04 Docker digest to 5cf058a (#2773) (@github-actions[bot])
- 45f2df9: chore(deps): bump goreleaser, ctlptl and helm pins (@mchmarny)
- e5da98d: chore(deps): make go.mod the only pin for module-built tools (#2754) (@lockwobr)
- 3bdfa86: chore(deps): refresh ubuntu:26.04 digest and its derived artifacts (#2827) (@mchmarny)
- c4ef89f: chore(deps): settle bot ownership and cap cel-go below its rename (#2826) (@mchmarny)
- 2b17097: chore(deps): upgrade Go modules and refresh tool pins (#2824) (@mchmarny)
- b4d3c79: chore(evidence): vr200 training-kubeflow three-phase attestation (#2720) (@yuanchen8911)
- aa1d15c: chore(fern): register v0.21.0 (#2642) (@github-actions[bot])
- a11f2fe: chore(fern): register v0.21.1 (#2662) (@github-actions[bot])
- 7e3078d: chore(security): resolve both OpenVEX deferred verifications (@mchmarny)
- 578854e: chore: deps: bump actions/setup-go from 6.2.0 to 7.0.0 (#2709) (@dependabot[bot])
- 2468637: chore: deps: bump aws-actions/configure-aws-credentials from 6.2.4 to 6.3.0 (#2820) (@dependabot[bot])
- 388d085: chore: deps: bump azure/login from 3.0.2 to 3.1.0 (#2738) (@dependabot[bot])
- 3243955: chore: deps: bump docker/build-push-action from 7.3.0 to 7.4.0 (#2821) (@dependabot[bot])
- 9877070: chore: deps: bump docker/setup-buildx-action from 4.3.0 to 4.4.0 (#2819) (@dependabot[bot])
- de67f39: chore: deps: bump docker/setup-qemu-action from 4.3.0 to 4.4.0 (#2818) (@dependabot[bot])
- 8d57509: chore: deps: bump github.com/sigstore/sigstore from 1.10.9 to 1.10.10 (#2736) (@dependabot[bot])
- 7db239c: chore: deps: bump github.com/sigstore/sigstore/pkg/signature/kms/aws from 1.10.9 to 1.10.10 (#2733) (@dependabot[bot])
- 100bb41: chore: deps: bump github.com/sigstore/sigstore/pkg/signature/kms/azure from 1.10.9 to 1.10.10 (#2734) (@dependabot[bot])
- 2f110fc: chore: deps: bump github.com/sigstore/sigstore/pkg/signature/kms/gcp from 1.10.9 to 1.10.10 (#2732) (@dependabot[bot])
- efe0b9f: chore: deps: bump github.com/sigstore/sigstore/pkg/signature/kms/hashivault from 1.10.9 to 1.10.10 (#2735) (@dependabot[bot])
- 72224a0: chore: deps: bump golang.org/x/term from 0.45.0 to 0.46.0 in the golang-x group across 1 directory (#2731) (@dependabot[bot])
- 5b0e372: chore: deps: bump renovatebot/github-action from 46.2.5 to 46.2.6 (#2677) (@dependabot[bot])
- 9369b07: chore: deps: bump renovatebot/github-action from 46.2.6 to 46.3.0 (#2739) (@dependabot[bot])
- 981801a: chore: deps: bump renovatebot/github-action from 46.3.0 to 46.3.1 (#2798) (@dependabot[bot])
- f12c7ad: chore: deps: bump sigs.k8s.io/controller-runtime from 0.25.0 to 0.25.1 in the kubernetes group (#2797) (@dependabot[bot])
- 3ec05a7: chore: deps: bump the codeql-action group with 3 updates (#2737) (@dependabot[bot])
- ca9d432: chore: deps: bump the codeql-action group with 3 updates (#2885) (@dependabot[bot])
- b7321d1: chore: deps: bump the golang-x group with 4 updates (#2644) (@dependabot[bot])
- 879f7b4: ci(uat): drop pinned GCP cpu-worker pool and reap state-only orphans (#2776) (@rorajani)
- c130db4: ci: add a dispatchable DGXC Go proxy diagnostic for #2667 (#2708) (@mchmarny)
- 7eb12c6: ci: gate .settings.yaml checksum pins against their pinned versions (#2825) (@mchmarny)
- 7d6aafa: ci: refresh the render golden on Renovate PRs (#2780) (@mchmarny)
- 519c921: docs(ci): correct what the on-push concurrency group guarantees (@mchmarny)
- b790e85: docs(evidence): attest gb300-eks-ubuntu-training-kubeflow and gb300-eks-ubuntu-inference-dynamo recipe-evidence (#2871) (@yuanchen8911)
- 8be4c82: docs(evidence): attest gb300-generic-ubuntu-training recipe-evidence v3 (#2851) (@atif1996)
- 670f5aa: docs(evidence): attest h100-aks-ubuntu-training-kubeflow and h100-aks-ubuntu-inference-dynamo recipe-evidence (#2867) (@yuanchen8911)
- 515209b: docs(evidence): link the VR200 Kubeflow coordinate on the dashboard (#2722) (@yuanchen8911)
- d7cd1da: docs(k0s): add H200 setup guide and Preview coordinate coverage (#2777) (@ramessesii2)
- 297940b: docs(recipe): note that custom mixins need their own --data entry (#2757) (@yuanchen8911)
- 7a40531: docs(recipe): update stale Skyhook terminology in NodeWright manifests (#2869) (@lockwobr)
- c61d8d2: docs(triage): backfill Done priorities and assert board completeness (@mchmarny)
- c25512b: docs(v1): record enum coverage policy, SDK carve-out, and evidence trust class (@mchmarny)
- 9706fd5: docs(validator): document the Slinky Slurm secure-access skip (#2723) (@yuanchen8911)
- 24dcb2d: fix(supply-chain): move OpenVEX carried state out of the tooling field (#2726) (@lockwobr)
- 9019281: refactor(sdk): move signing-mode exclusivity to the Resolve boundary (#2719) (@mchmarny)
- a07a649: refactor(upgrade): co-locate transition records, amend ADR-021 (#2749) (@ayuskauskas)
- 7abe663: style(bundler): reflow orphan comment line in deploy.sh template (#2809) (@yuanchen8911)
- 8ff4882: test(bundler): pin render golden per file so its diff names what changed (#2814) (@yuanchen8911)
- 23c8699: test(bundler): refresh render golden for the tcpxo ubuntu digest (@mchmarny)
- 10299d9: test(cli): add chainsaw suites for aicr query and aicr diff (#2746) (@yuanchen8911)
- 8fcc07c: test(cli): add offline chainsaw suite for aicr evidence publish (#2747) (@yuanchen8911)
- 1a60d08: test(uat): emit CTRF for the snapshot step and KWOK deployer matrix (#2748) (@yuanchen8911)