This release focuses on SDK completeness, digest-pinned OCI recipes, runtime AI inventory, and validation and bundler reliability.
Highlights
Complete SDK Contract - Users can now verify and sign artifacts through the pkg/client/v1 facade. Compiled examples ship with the package, the CLI and server signing paths use the facade, and API compatibility remains gated.
Digest-Pinned OCI Recipe Sources - SDK consumers can load digest-pinned recipe catalogs from OCI registries. Each OCI-backed client uses a private workspace cleaned by Client.Close().
Runtime AI Inventory (ADR-019) - AICR adds optional k8s-aibom v1.3.0 to generate CycloneDX ML-BOMs for selected namespaces, with stock GKE adoption and CRD storage-version health checks.
Validation Hardening - GKE recipes now fail during deployment when required GPU NIC networks are missing, GPU host-driver floors are enforced, and build suffixes are compared correctly. Kubeflow Trainer lifecycle follows the recipe, partial installs roll back, and controller waits use the discovered name. Deadline-killed validators report the actual failure, while evidence verdicts require cleanup, avoid over-claiming, and clarify operator SKIP and Trainer namespace semantics.
Bundler & Deployer Reliability - Flux upgrades can replace component-owned CRDs, empty sources/ directories are omitted, and transient Helm index failures retry automatically. NVSentinel misconfigurations and unsupported --dynamic use with local-chart argocd-helm components now fail closed. Mixed vendored components receive a tracked -post release, and bundle vendoring is hardened against SSRF and resource exhaustion.
Recipes & Components
- NVSentinel v1.20.0, configured for AKS, GKE-COS, OKE, and Kind
topographmoved to v1.0.0 across recipes; GAIE v1.5.0 CRDs vendored for agentgateway- Slinky/Slurm gained configurable Enroot settings with epilog/prolog examples
- Nodewright tuning resources changed to whole-number equivalents
Other Improvements - nodes is now metadata-only for overlay selection while --nodes still satisfies CLI specificity checks. NIM gains a pinned, credential-free CNCF AI conformance example, and the toolchain moves to Go 1.27.
Thanks to @ayuskauskas, @bmcadams1, @Dhirenderchoudhary, @framsouza, @kaynetu, @Kevin-Hawkins, @lalitadithya, @lockwobr, @njhensley, @pdmack, @ravisoundar, @rorajani, @srao-nv, @TerryHowe, @tjrasche, @varmesh, @yuanchen8911, and @mchmarny.
Changelog
New Features
- def13e0: feat(demos): credential-free NIM for CNCF AI conformance evidence (#2244) (@yuanchen8911)
- 916dae3: feat(recipe): add generation-time runtime inventory selection (#2317) (@mchmarny)
- af9099f: feat(recipes): add qualified k8s-aibom component (#2259) (@mchmarny)
- 7ba3ac9: feat(recipes): adopt k8s-aibom in the h100-gke-cos-inference recipe (#2328) (@mchmarny)
- 8af10c1: feat(recipes): assert k8s-aibom CRD storage version in the health check (#2305) (@mchmarny)
- 42d35a6: feat(recipes): requalify and re-pin k8s-aibom to v1.3.0 (#2309) (@mchmarny)
- 9dc8b6e: feat(sdk): add Client.LoadSnapshot (#2229) (@mchmarny)
- 710b2b9: feat(sdk): bind AICRConfig to the facade for verify and recipe (#2243) (@mchmarny)
- 9fc11bd: feat(sdk): expose snapshot criteria relaxation as a resolve option (#2247) (@mchmarny)
- 06d2cbb: feat(sdk): expose snapshot diff facade (#2307) (@tjrasche)
- 39d5867: feat(sdk): expose verification and signing on pkg/client/v1 (#2218) (@mchmarny)
- c69db7e: feat(sdk): load digest-pinned OCI recipe sources (#2212) (@tjrasche)
- 5e55a8e: feat(uat): add argocd deployer variant on aws-h100 training (#2250) (@framsouza)
- 78b97cd: feat(validation): detect missing GKE GPU NIC networks at deployment phase (#2248) (@yuanchen8911)
Bug Fixes
- 131aeb0: fix(api): normalize legacy recipe kind on bundle ingest (#2162) (@yuanchen8911)
- 26eef38: fix(bom): support digest field in structured image descriptors (#2263) (@TerryHowe)
- b349a59: fix(bundler): create flux sources/ only when populated (#2161) (@yuanchen8911)
- 534b540: fix(bundler): fail closed on silent NVSentinel misconfigurations (#2183) (@yuanchen8911)
- 3d76752: fix(bundler): let CRD-owning components replace their CRDs on Flux upgrade (#2312) (@mchmarny)
- 67f5d1b: fix(bundler): reject --dynamic on local-chart argocd-helm components (#2200) (@rorajani)
- 1c7aa96: fix(bundler): retry transient Helm index fetch failures (#2268) (@yuanchen8911)
- f1a5213: fix(bundler): tracked -post release for vendored mixed components (#2061) (@rorajani)
- 4cae5aa: fix(ci): code-block-aware MDX sanitization in Fern workflows (#2319) (@pdmack)
- 63c79ec: fix(ci): count in-flight release runs in rekor monitor allowlist (#2154) (@lockwobr)
- b8a6ead: fix(ci): dispatch TestGrid from evidence ingest (#2330) (@srao-nv)
- 875006c: fix(ci): pin UAT GPU worker AMIs to Ubuntu 24.04 (guard 26.04 drift) (#2191) (@njhensley)
- c17850f: fix(ci): re-pin golangci-lint install.sh checksum for v2.13.1 (@mchmarny)
- 27af274: fix(ci): watch the license gate's own inputs in the deps path filter (#2166) (@yuanchen8911)
- 427c2ec: fix(constraints): compare GKE build suffixes in version constraints (#2252) (@Kevin-Hawkins)
- 0dc556e: fix(coverage): resolve UAT wiring from the reservation registry (#2138) (@Dhirenderchoudhary)
- 68be22f: fix(deps): bump golang.org/x/mod to v0.40.0 for GO-2026-6179/6180 (#2205) (@mchmarny)
- 21b538d: fix(evidence): clarify operator SKIP, pin Trainer namespace split (#2269) (@yuanchen8911)
- 1e0ea13: fix(evidence): gate verdicts on cleanup and stop over-claiming (#2222) (@yuanchen8911)
- 6f5eb1e: fix(lint): resolve gofmt and SA4023 failures from golangci-lint v2.13.1 (@mchmarny)
- 508074c: fix(mirror): fail closed when component values cannot be hydrated (#2285) (@mchmarny)
- 908a2ca: fix(notices): anchor go-licenses test guards and cover the fail-closed path (#2163) (@yuanchen8911)
- b2e5908: fix(notices): resolve GOROOT explicitly for go-licenses (#2159) (@mchmarny)
- 619cf93: fix(recipe): fold the OS guard into one joint-coverage rule (#2322) (@lockwobr)
- 7227511: fix(recipes)!: configure NVSentinel for AKS, GKE-COS, OKE and Kind (#2249) (@yuanchen8911)
- 76a8024: fix(sdk): address OCI source follow-up feedback (#2313) (@tjrasche)
- effd3b5: fix(sdk): harden transparent alias API diff (#2157) (@tjrasche)
- 142c792: fix(server): harden bundle vendor path against SSRF and resource exhaustion (#2170) (@framsouza)
- 484c9e0: fix(skills): cross-review sandbox probe and companion resolution (#2172) (@yuanchen8911)
- 1ec0796: fix(skills): reap leaked cross-review refs/cr/* and temp diffs (#2195) (@yuanchen8911)
- db8dcb9: fix(snapshotter): default live agent tolerations (#2320) (@yuanchen8911)
- 78e9bf3: fix(uat): pin helm-diff plugin with verified checksum (#2267) (@lockwobr)
- 31970aa: fix(validator): decide Trainer lifecycle from recipe, not cluster (#2321) (@yuanchen8911)
- 9dfb678: fix(validator): enforce GPU host-driver version floors (#2257) (@rorajani)
- ea6aaee: fix(validator): report deadline-killed validator as failed, not "pod not found" (#2187) (@yuanchen8911)
- 8c27768: fix(validators): roll back partial Kubeflow Trainer installs (#2171) (@mchmarny)
- 6bf2bd5: fix(validators): wait on the discovered Trainer controller name (#2173) (@yuanchen8911)
- aa6d5c5: fix(vendor): correct k8s-launch-kit vendor path casing (#2158) (@rorajani)
- 4130a48: fix: enable Go build cache for CodeQL and freshness gates (#2272) (@bmcadams1)
- 90a7f41: fix: overlap Kind cluster creation with host Go builds in E2E (#2289) (@bmcadams1)
- 3ba53ce: fix: pin the E2E Kind node image to .settings.yaml (#2284) (@bmcadams1)
- 16e0773: fix: suffix UAT artifact names with run_attempt (#2196) (@bmcadams1)
Other Tasks
- 49ad450: chore(deps): Update dependency go to v1.26.6 (#2208) (@github-actions[bot])
- b82c438: chore(deps): Update dependency go to v1.27.0 (#2353) (@github-actions[bot])
- 1aa8045: chore(deps): Update dependency google/go-containerregistry to v0.21.9 (#2184) (@github-actions[bot])
- 3fc2f80: chore(deps): Update dependency sigstore/cosign to v3.1.3 (#2185) (@github-actions[bot])
- 2ca6b11: chore(deps): Update linting (#2351) (@github-actions[bot])
- 8c0908e: chore(deps): Update ministackorg/ministack Docker tag to v1.4.15 (#2197) (@github-actions[bot])
- 4358e46: chore(deps): Update module github.com/stretchr/testify to v1.12.0 (#2232) (@github-actions[bot])
- 6ff2e02: chore(deps): Update module github.com/urfave/cli/v3 to v3.11.0 (#2303) (@github-actions[bot])
- 2790953: chore(deps): Update module golang.org/x/exp to v0.0.0-20260813180055-c1d0aacb2297 (#2209) (@github-actions[bot])
- 6bdeb79: chore(deps): Update supply-chain (#2198) (@github-actions[bot])
- b918fb8: chore(deps): Update testing-tools (#2156) (@github-actions[bot])
- 332c507: chore(deps): Update testing-tools (#2210) (@github-actions[bot])
- fc674f0: chore(deps): Update testing-tools (#2231) (@github-actions[bot])
- a000783: chore(deps): Update testing-tools (#2302) (@github-actions[bot])
- 92c2148: chore(deps): Update testing-tools (#2352) (@github-actions[bot])
- 13c389b: chore(deps): Update ubuntu:26.04 Docker digest to 2260313 (#2301) (@github-actions[bot])
- 141e5e2: chore(deps): Update ubuntu:26.04 Docker digest to 6df9e8d (#2255) (@github-actions[bot])
- c0aead3: chore(deps): bump goreleaser to v2.18.0 and oras to 1.3.3 (@mchmarny)
- 735a311: chore(deps): upgrade Go dependencies and bump go directive to 1.27 (@mchmarny)
- dbddffb: chore(fern): register v0.19.0 (#2150) (@github-actions[bot])
- 516a7b9: chore(recipes): vendor GAIE v1.5.0 CRDs for agentgateway (#2214) (@varmesh)
- f675fad: chore(sdk): prune stale v0.18.0 API-diff acknowledgement (#2167) (@yuanchen8911)
- 8703d8c: chore(topograph): Updated the recipes to use topograph v1.0.0 (#2254) (@ravisoundar)
- 6e20fd8: chore: add bmcadams1 to copy-pr-bot trustees (#2188) (@bmcadams1)
- 8d63bc2: chore: bump nvsentinel to v1.20.0 (#2333) (@lalitadithya)
- 13f6057: chore: dep upgrade (@mchmarny)
- 8121ab1: chore: deps: bump docker/setup-buildx-action from 4.2.0 to 4.3.0 (#2300) (@dependabot[bot])
- b208b57: chore: deps: bump github.com/stretchr/testify from 1.12.0 to 1.12.1 (#2325) (@dependabot[bot])
- db6787f: chore: deps: bump renovatebot/github-action from 46.2.1 to 46.2.2 (#2182) (@dependabot[bot])
- 571bb8c: chore: deps: bump the codeql-action group with 3 updates (#2207) (@dependabot[bot])
- 99287d0: chore: deps: bump the codeql-action group with 3 updates (#2350) (@dependabot[bot])
- f7c64ef: chore: deps: bump the kubernetes group with 3 updates (#2349) (@dependabot[bot])
- 55044f3: chore: go upgrade (@mchmarny)
- d6b3bc4: ci: exclude Markdown from GPU test path filters (#2151) (@yuanchen8911)
- 032cd43: ci: lint PR titles against Conventional Commits (#2221) (@yuanchen8911)
- 9591f11: ci: reject whitespace-only PR title subjects; sync agent rules (#2224) (@yuanchen8911)
- e6b3f22: ci: route go-build-release through install-go-licenses (#2199) (@rorajani)
- 69700f6: docs(adr): amend ADR-019 for stock adoption on one GKE recipe (#2304) (@mchmarny)
- 1d94a04: docs(aibom): correct the record left stale by the v1.3.0 re-pin (#2327) (@mchmarny)
- 11c9901: docs(bundling): add -n to Helm adoption kubectl examples (#2190) (@rorajani)
- ce34464: docs(defaults): correct MirrorDefaultKubeVersion rationale comment (#2336) (@yuanchen8911)
- 9e951e4: docs(sdk): add compiled examples and close the integrator contract (#2253) (@mchmarny)
- 05e5e03: docs(sdk): attach each criteria converter's godoc to its own function (#2246) (@mchmarny)
- 96d7aec: feat(slinky-slurm): add configurable Enroot settings and update Slinky CUJ with epilog/prolog examples (#2169) (@kaynetu)
- ac87688: fix(nodewright-customization/tuning): Change resources to whole number equivalents (#2193) (@ayuskauskas)
- cdbd7db: recipe: demote nodes criteria dimension to metadata-only (#2155) (@Kevin-Hawkins)
- 669c3bb: test(releasepolicy): fix flaky blocked-command timing assertions (#2202) (@yuanchen8911)
- a8be697: test(serializer): cover cancellation during HTTP body read (#2242) (@mchmarny)