Skip to content

feat(recipes): requalify and re-pin k8s-aibom to v1.3.0 - #2309

Merged
mchmarny merged 2 commits into
mainfrom
feat/aibom-requalify-v1.3.0
Aug 20, 2026
Merged

mchmarny merged 2 commits into
mainfrom
feat/aibom-requalify-v1.3.0

Conversation

@mchmarny

Copy link
Copy Markdown
Member

Summary

Re-runs all four ADR-019 adoption gates against upstream v1.3.0, the API-graduation release, and moves the registry pin to it.

Motivation / Context

ADR-019 Decision 4: chart, image, CRDs, and the public status contract are one versioned set, and a CRD change requires requalification rather than a version bump. v1.3.0 adds v1beta1 alongside v1alpha1 and moves CRD storage to it, so this is a requalification.

Fixes: #2282
Related: #2271, #2264

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactoring (no functional changes)
  • Build/CI/tooling

Component(s) Affected

  • CLI (cmd/aicr, pkg/cli)
  • API server (cmd/aicrd, pkg/server)
  • Recipe engine / data (pkg/recipe)
  • Bundlers (pkg/bundler, pkg/component/*)
  • Collectors / snapshotter (pkg/collector, pkg/snapshotter)
  • Validator (pkg/validator)
  • Core libraries (pkg/errors, pkg/k8s)
  • Docs/examples (docs/, examples/)
  • Other: component health check

Implementation Notes

Qualified artifact set

Item Value
Source v1.3.0 at 30af41abbe0bed3c41a42289ccf294be8c4779bb
Image ghcr.io/googlecloudplatform/k8s-aibom@sha256:f8e48d4edc44e6ee8e40a2ac6c5f60b190aa18d411a75702dc5798a77a039e8d
Chart oci://ghcr.io/googlecloudplatform/charts/k8s-aibom:1.3.0 at sha256:4ffa933e272a977e0b60f2eca1c4326176e6196e2ee69e1bf4f72c8b5a511c90

Gate 1 — release and supply chain

Three attestations verified with gh attestation verify --owner GoogleCloudPlatform --deny-self-hosted-runners, inspected as JSON rather than trusting the exit code:

Predicate Subject Ref Runner Source digest
https://slsa.dev/provenance/v1 image refs/tags/v1.3.0 github-hosted 30af41ab…
https://cyclonedx.org/bom image refs/tags/v1.3.0 github-hosted —
https://slsa.dev/provenance/v1 chart refs/tags/v1.3.0 github-hosted 30af41ab…

Build config resolves to the upstream release.yaml workflow in GoogleCloudPlatform/k8s-aibom.

Gate 2 — Helm and Kubernetes lifecycle

Rendered both versions against our values.yaml. Resource set is unchanged: ServiceAccount, ClusterRole, ClusterRoleBinding, Deployment, AIBOMControllerConfig. The only template differences are helm.sh/chart and app.kubernetes.io/version labels.

The chart still renders AIBOMControllerConfig at aibom.k8saibom.dev/v1alpha1. Only CRD storage moved. This is the finding that shaped the health-check change below — a blanket v1alpha1 → v1beta1 replacement would have broken the check against a correctly-deployed cluster.

Also confirmed readiness.strictConfig: true still reaches the rendered output as the container arg --strict-config-readiness; it is a controller flag, not a CR spec field.

Gate 3 — security, RBAC, privacy

Rendered RBAC diffed 1.2.0 → 1.3.0: byte-identical. No permission change accompanies the graduation.

Gate 4 — operational safety

The readiness fixes ship in the image, not the chart. Probe configuration renders identically across both versions, so the corrected readiness behavior (upstream's start-ordering race fix plus the per-probe informer assertion) is obtained only by re-pinning the image digest. That is the substantive half of this change and the reason a chart-version-only bump would have been wrong.

Health check

Both CRD storage assertions flip to v1beta1; the controller-config step deliberately keeps reading v1alpha1, with a comment explaining the asymmetry so it is not "fixed" later.

The test helper now builds each CRD in the shape its chart actually ships — 1.3.0 serves both versions with storage on v1beta1, 1.2.0 and earlier serve only v1alpha1 ��� so a stranded case models a real pre-upgrade cluster rather than an invented hybrid. The four CRD cases invert accordingly, which is itself evidence they were testing the literal rather than something incidental.

Also corrects a stale comment missed in #2305: the partial-apply case still attributed that state to AICR's documented CRD-apply step, a claim tested and retracted on that PR.

Deliberately out of scope

Cross-boundary upgrade, rollback, and uninstall evidence on real GKE. That is an ADR-019 Follow-Up Decisions requirement governing stock adoption, not a Decision 4 requalification requirement — I had over-scoped #2282 by folding it in. It moves to its own issue under #2271, where the real-GKE demo already needs a cluster.

One unrelated line

The regenerated BOM also picks up an ubuntu:26.04 digest that #2301 changed in a rendered manifest without regenerating the doc — the same gate gap that broke TestStockRenderParityGolden on main earlier today. make bom-docs regenerates wholesale, so it cannot be excluded without leaving the doc inconsistent.

Testing

make qualify

Codebase qualification completed, no failures.

Verified the storage-version flip is load-bearing: reverting the two literals to v1alpha1 fails the healthy case and every negative case's wantOutput assertion, because the default CRD fixture now models 1.3.0.

Gate commands are reproducible from the tables above; chart renders were compared with helm template against the committed values.yaml.

Risk Assessment

  • Low — Isolated change, well-tested, easy to revert
  • Medium — Touches multiple components or has broader impact
  • High — Breaking change, affects critical paths, or complex rollout

No stock recipe references k8s-aibom, so no stock recipe changes. Medium rather than low because existing adopters on a custom recipe move to a new chart and image on their next bundle, and clusters upgrading through Helm, Helmfile, or Flux must apply the new CRDs first — the storage version genuinely changes here, which is precisely what the health check added in #2305 now detects.

Rollout notes: Adopters upgrading through Helm, Helmfile, or Flux must run the pre-upgrade CRD step documented in the component catalog. Argo CD applies CRDs each sync and needs nothing. Without it the health check fails naming the stranded CRD, which is the intended behavior.

Checklist

  • Tests pass locally (make test with -race)
  • Linter passes (make lint)
  • I did not skip/disable tests to make CI green
  • I added/updated tests for new functionality
  • I updated docs if user-facing behavior changed
  • Changes follow existing patterns in the codebase
  • Commits are cryptographically signed (git commit -S)
Re-runs all four ADR-019 adoption gates against the upstream graduation
release and moves the registry pin to it. Per Decision 4 the chart, image,
CRDs, and public status contract are one versioned set, so a CRD change
requires requalification rather than a version bump.

Qualified set: source v1.3.0 at 30af41abbe0bed3c41a42289ccf294be8c4779bb,
chart 1.3.0 at sha256:4ffa933e..., image sha256:f8e48d4e....

Gate findings that changed AICR-visible behavior:

Rendered RBAC is byte-identical to 1.2.0, so no permission change accompanies
the graduation.

The rendered resource set is unchanged and the chart still renders
AIBOMControllerConfig at aibom.k8saibom.dev/v1alpha1. Only CRD storage moved
to v1beta1. The health check now reflects that asymmetry deliberately: both
CRD storage assertions flip to v1beta1 while the controller-config step keeps
reading v1alpha1. Replacing every v1alpha1 occurrence would have broken it.

The readiness fixes ship in the image, not the chart. Probe configuration
renders identically across the two versions, so the corrected readiness
behavior is obtained only by re-pinning the image digest, which is the
substantive half of this change.

The health-check test helper now builds each CRD in the shape its chart
actually ships (1.3.0 serves both versions with storage on v1beta1; 1.2.0 and
earlier serve only v1alpha1), so a stranded case models a real pre-upgrade
cluster rather than an invented hybrid.

Also corrects a stale comment missed in #2305: the partial-apply test case
still attributed that state to AICR's documented CRD-apply step, a claim that
was tested and retracted there.

The regenerated BOM additionally picks up an unrelated ubuntu:26.04 digest
that #2301 changed in a rendered manifest without regenerating the doc.

Fixes: #2282
Related: #2271, #2264
Signed-off-by: Mark Chmarny <mark@chmarny.com>
@mchmarny
mchmarny requested review from a team as code owners August 20, 2026 16:02
@mchmarny mchmarny added theme/recipes Recipe expansion, overlays, mixins, and component registry theme/supply-chain SLSA, SBOM, Sigstore, and provenance verification labels Aug 20, 2026
@mchmarny mchmarny self-assigned this Aug 20, 2026
@mchmarny
mchmarny enabled auto-merge (squash) August 20, 2026 16:03
@github-actions

Copy link
Copy Markdown
Contributor
@github-actions

Copy link
Copy Markdown
Contributor

Recipe evidence check

Registry change: scoped to recipes that reference a changed component
entry in recipes/registry.yaml (not every leaf).

No leaf overlays affected by this PR.

This gate is warning-only and never blocks merge.

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: e4a2ba99-b72c-4bcb-a3df-57fe5eb7eca0

📥 Commits

Reviewing files that changed from the base of the PR and between 8af10c1 and 11bfeb4.

📒 Files selected for processing (7)
  • docs/design/019-k8s-aibom-runtime-inventory.md
  • docs/user/component-catalog.md
  • docs/user/container-images.md
  • pkg/chainsaw/k8s_aibom_check_states_test.go
  • recipes/checks/k8s-aibom/health-check.yaml
  • recipes/components/k8s-aibom/values.yaml
  • recipes/registry.yaml

Included review availability: Your plan provides up to 12 included reviews per hour; 11 remain after this review.


📝 Walkthrough

Walkthrough

The PR requalifies k8s-aibom against chart version 1.3.0. It updates source, chart, image, and digest pins, records the v1beta1 CRD storage transition, and refreshes Kubernetes support documentation. The health check now asserts v1beta1 storage. Chainsaw fixtures cover pre-upgrade and partially upgraded CRD states.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 11bfe

This PR requalifies and re-pins the k8s-aibom chart and image to v1.3.0 while updating the related health checks and documentation; no actionable merge-blocking risk remains after normal checks and review.

Suggested reviewers: arangogutierrez

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR omits required GKE upgrade, rollback, and uninstall evidence and retains the controller-config assertion at v1alpha1 instead of flipping it to v1beta1. Add the required cross-boundary GKE evidence and update the controller-config health-check assertion to v1beta1, or revise the linked issue scope explicitly.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the k8s-aibom requalification and re-pin to v1.3.0.
Description check ✅ Passed The description explains the requalification, artifact updates, health-check changes, testing, and scope decisions.
Out of Scope Changes check ✅ Passed The changes support requalification, artifact pinning, health checks, tests, and required documentation regeneration; no unrelated code changes are evident.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/aibom-requalify-v1.3.0

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Report ✅

Metric Value
Coverage 83.2%
Threshold 80%
Status Pass
Coverage Badge
![Coverage](https://img.shields.io/badge/coverage-83.2%25-brightgreen)

No Go source files changed in this PR.

@mchmarny
mchmarny merged commit 42d35a6 into main Aug 20, 2026
83 checks passed
@mchmarny
mchmarny deleted the feat/aibom-requalify-v1.3.0 branch August 20, 2026 16:21
mchmarny added a commit that referenced this pull request Aug 21, 2026
The ADR-019 requirement-status table pointed the upgrade-evidence row at
#2282, which closed as the requalification and never carried that evidence,
and the managed-cluster row at the epic rather than the issue. Point both at
the issues that track them: #2310 and #2311.

The component values still described the pinned digest as a v1.2.0 artifact
set after #2309 moved it to v1.3.0, and stated the Kind-measured resource
envelope without saying it was Kind, or that neither the v1.3.0 image nor a
managed control plane has been re-measured against it.

Signed-off-by: Mark Chmarny <mark@chmarny.com>
mchmarny added a commit that referenced this pull request Aug 21, 2026
Two places in the record went stale when #2309 re-pinned k8s-aibom to
chart v1.3.0.

ADR-019's requirement-status table pointed the upgrade-evidence row at
#2282, which closed as the requalification and never carried that
evidence, and pointed the managed-cluster row at the epic rather than the
issue tracking it. Both now point at #2310 and #2311, which have since
closed with that evidence.

The component values described the pinned digest as a v1.2.0 artifact set
after the re-pin moved it to v1.3.0, and stated a Kind-measured resource
envelope that had never been checked against a managed control plane.
#2310 measured it: 67-69MiB and 1-2m steady-state CPU at 1,001 workloads
on GKE, well inside the declared requests. The v1.2.0 Kind figures are
dropped rather than carried forward as a comparison, since the upgrade
validation they existed for is complete.

Signed-off-by: Mark Chmarny <mark@chmarny.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/docs area/recipes size/M theme/recipes Recipe expansion, overlays, mixins, and component registry theme/supply-chain SLSA, SBOM, Sigstore, and provenance verification

2 participants