feat: migrate API domain to aicr.run, bump v1alpha2/v1beta2#1499
Conversation
Recipe evidence check
Protected recipesRecipes with committed evidence (
Other affected recipes without evidence yet: 61These recipes are affected by this PR but carry no committed evidence pointer, so there is
How to refresh evidenceRun on a cluster matching the recipe's aicr snapshot -o snapshot.yaml
aicr validate \
-r recipes/overlays/<slug>.yaml \
-s snapshot.yaml \
--emit-attestation ./out \
--push ghcr.io/<your-fork>/aicr-evidence
# Copy to the per-source path printed in the emit 'copyTo' hint:
# recipes/evidence/<slug>/<source>/<bundle-digest>.yamlThis gate is warning-only and never blocks merge. See ADR-007 for the trust model. |
Coverage Report ✅
Coverage BadgeCoverage unchanged by this PR. |
Hard-break migration of the AICR artifact API domain aicr.nvidia.com -> aicr.run, with the artifact version bumped v1alpha1 -> v1alpha2 and the build-spec version v1beta1 -> v1beta2. Centralized via pkg/header.Domain; legacy apiVersion fails closed with an actionable error (no transition window). Closes #1486, #1487, #1488, #1490, #1491, #1493.
525f3fb to
69916b2
Compare
This comment was marked as resolved.
This comment was marked as resolved.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (10)
📝 WalkthroughWalkthroughThe PR updates artifact API versions, label and annotation keys, attestation URIs, manifests, docs, tests, and fixtures from Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related issues
Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 3 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
njhensley
left a comment
There was a problem hiding this comment.
📋 Multi-Persona Review — PR #1499 migrate API domain to aicr.run, bump v1alpha2/v1beta2
▎ Method: 4 persona lenses (Supply-chain/Provenance, Correctness, Migration-completeness/API-contract, Docs-Operability), each finding independently confirmed against the resolved code (verifier path, gates, fixtures) by an adversarial meta-pass. Line links pinned to head a77b3784.
▎ Tier legend: 🔴 Blocker · 🟠 Major · 🟡 Minor · 🔵 Nitpick · ✅ Confirmed non-issue
Overall assessment — ✅ Approve with comments
This is a well-executed hard-break domain migration: every semantic role (apiVersion group, K8s label/annotation keys, attestation/build-type URIs, UUIDv5 seed) now derives from a single header.Domain constant, the fail-closed gates (IsSupportedAPIVersion, build.Validate) have table-driven legacy-rejection tests, and the rename is complete — the only residual aicr.nvidia.com strings are in ADRs, rejection tests, and one explanatory comment. The one substantive issue is in the signed-evidence layer: two checked-in evidence pointers had their predicateType rewritten while their pinned OCI digests stayed the same, which silently breaks end-to-end verification of those bundles. It does not break CI and is pre-v1 demo data, so it's a Major, not a Blocker.
✅ Confirmed non-issues (checked and cleared)
- Migration completeness — grepped the PR head: no
aicr.nvidia.comremains in any runtime-loaded data (recipes/,pkg/,cmd/,examples/,kwok/,api/) or non-test Go. Residuals are confined to ADRs, legacy-rejection tests, and one doc comment — all intentional. pkg/cli/validate.golog-line change —kubectl logs -l aicr.run/run-id=<runID>is correct;labels.RunIDis genuinely applied to validation Jobs (job_plan.go:256,ctrf/configmap.go:70). The oldaicr.nvidia.com/jobselector matched no actual label key, so this is a fix, not a regression.build.Validate— correctly gates onExpectedAPIVersion = header.Domain + "/v1beta2"(spec.go:131) with new tests rejecting bothaicr.nvidia.com/v1beta1and the staleaicr.run/v1beta1.- UUIDv5 namespace reset — intentional, documented in ADR-013 and the
aicrBundleNamespacecomment; no golden/testdata bundle IDs left stale. - Hard-break gate —
IsSupportedAPIVersionrejects legacy group, old-group/new-version, and new-group/old-version combos, all covered by table-driven tests.
Summary
| Tier | Count | Items |
|---|---|---|
| 🔴 Blocker | 0 | — |
| 🟠 Major | 1 | Evidence pointer predicateType rewritten without re-signing → verification fails for 2 bundles |
| 🟡 Minor | 1 | Install one-liner depends on get.aicr.run being live |
| 🔵 Nitpick | 0 | — |
Recommendation: Approve with comments. Resolve the 🟠 before relying on those evidence bundles (re-sign + re-digest the two pointers, or revert/delete them) — it ships an unverifiable signed artifact while CI stays green; the 🟡 is a pre-merge sanity check on the new install host.
… unverifiable demo evidence (NVIDIA#1499 follow-up) Follow-up to NVIDIA#1499 (aicr.run domain migration). That PR's sweep introduced two defects: F3 (docs): ValidatorCatalog examples were swept aicr.nvidia.com/v1 -> aicr.run/v1, but the validator catalog is a separate schema that is NOT part of the domain migration. The loader (pkg/validator/catalog) fail-closes on anything other than validator.nvidia.com/v1alpha1, so a copied example errors at load. Fix all four user-facing occurrences, and align the ValidatorCatalog fixtures in pkg/recipe/provider_test.go to match. F2 (evidence): the two committed demo evidence pointers had predicateType edited in place to aicr.run, but still pin the pre-migration, immutable OCI artifacts whose signed in-toto statements carry the old predicate type. 'aicr evidence verify' materializes the bundle then fails with 'unexpected predicateType https://aicr.nvidia.com/recipe-evidence/v1' (verify.go / signature.go compare the fetched statement). A YAML-only fix is impossible in either direction; the only true fix is regenerate+republish the signed bundles. Since that needs signing keys + OCI push, remove the two stale pointers (they also pinned a personal fork org, ghcr.io/yuanchen8911) and the now-orphaned community allowlist anchor, and switch the two docs that showed the deleted pointer as the preferred 'aicr evidence verify' example to the generic recipes/evidence/<recipe>/<src>/<digest>.yaml form. Regenerating proper signed demo evidence under the NVIDIA org is a separate follow-up. Updates the allowlist TestClassify fixture case accordingly. Signed-off-by: Yuan Chen <[email protected]>
… unverifiable demo evidence (NVIDIA#1499 follow-up) Follow-up to NVIDIA#1499 (aicr.run domain migration). That PR's sweep introduced two defects: F3 (docs): ValidatorCatalog examples were swept aicr.nvidia.com/v1 -> aicr.run/v1, but the validator catalog is a separate schema that is NOT part of the domain migration. The loader (pkg/validator/catalog) fail-closes on anything other than validator.nvidia.com/v1alpha1, so a copied example errors at load. Fix all four user-facing occurrences, and align the ValidatorCatalog fixtures in pkg/recipe/provider_test.go to match. F2 (evidence): the two committed demo evidence pointers had predicateType edited in place to aicr.run, but still pin the pre-migration, immutable OCI artifacts whose signed in-toto statements carry the old predicate type. 'aicr evidence verify' materializes the bundle then fails with 'unexpected predicateType https://aicr.nvidia.com/recipe-evidence/v1' (verify.go / signature.go compare the fetched statement). A YAML-only fix is impossible in either direction; the only true fix is regenerate+republish the signed bundles. Since that needs signing keys + OCI push, remove the two stale pointers (they also pinned a personal fork org, ghcr.io/yuanchen8911) and the now-orphaned community allowlist anchor, and switch the two docs that showed the deleted pointer as the preferred 'aicr evidence verify' example to the generic recipes/evidence/<recipe>/<src>/<digest>.yaml form. Regenerating proper signed demo evidence under the NVIDIA org is a separate follow-up. Updates the allowlist TestClassify fixture case accordingly. Signed-off-by: Yuan Chen <[email protected]>
…verifiable demo evidence (#1499 follow-up) (#1507) Signed-off-by: Yuan Chen <[email protected]>
- Restore .github/workflows/rekor-monitor.yaml lost during squash (was added in #1480, absent from stale branch base) - Remove verifyClusterPolicyReady call and function reverted by squash (#1495 had removed it; stale branch base brought it back) - Update apiVersion aicr.nvidia.com/v1alpha1 → aicr.run/v1alpha2 in l40s-any, l40s-oke-training, l40s-oke-inference overlays (post-#1499 domain migration) - Add `ol` to OS enum description in pkg/client/v1/types.go and pkg/fingerprint/doc.go Signed-off-by: Atif Mahmood <[email protected]> Signed-off-by: Atif Mahmood <[email protected]>
- Restore .github/workflows/rekor-monitor.yaml lost during squash (was added in #1480, absent from stale branch base) - Remove verifyClusterPolicyReady call and function reverted by squash (#1495 had removed it; stale branch base brought it back) - Update apiVersion aicr.nvidia.com/v1alpha1 → aicr.run/v1alpha2 in l40s-any, l40s-oke-training, l40s-oke-inference overlays (post-#1499 domain migration) - Add `ol` to OS enum description in pkg/client/v1/types.go and pkg/fingerprint/doc.go Signed-off-by: Atif Mahmood <[email protected]> Signed-off-by: Atif Mahmood <[email protected]>
Summary
Hard-break migration of the AICR artifact API domain
aicr.nvidia.com→aicr.run, with the artifact version bumpedv1alpha1→v1alpha2and the build-spec versionv1beta1→v1beta2. Centralized through a singlepkg/header.Domainconstant.Motivation / Context
Tying the artifact contract to
nvidia.comcouples a vendor-neutral format to one company's brand/DNS and is verbose in everyapiVersion, label key, and attestation URI. A group rename is a breaking change, so it is cheapest to land before v1 while still on alpha/beta. The version bump is signal-only (no schema change) — it makes the breaking rename explicit so consumers can distinguish migrated artifacts at a glance. See ADR-013.Fixes: #1486, #1487, #1488, #1490, #1491, #1493
Related: #1489 (closed as won't-do — superseded by the hard-break decision below)
Type of Change
Component(s) Affected
cmd/aicr,pkg/cli)cmd/aicrd,pkg/server)pkg/recipe)pkg/bundler,pkg/component/*)pkg/collector,pkg/snapshotter)pkg/validator)docs/,examples/)pkg/header,pkg/evidence, OpenAPI, CI SLSA buildTypeImplementation Notes
Three coordinated changes land atomically so CI is never left half-migrated:
header.Domain.aicr.run/v1alpha2; build spec (AICRRuntime) →aicr.run/v1beta2.IsSupportedAPIVersion(andpkg/build.Validate) accept only the new values; legacyaicr.nvidia.com/*and never-published intermediates (aicr.run/v1alpha1) fail closed with an actionableregenerate with …error. This supersedes the dual-accept window originally planned in Transition window: dual-accept aicr.nvidia.com and aicr.run apiVersion on read #1489 — pre-v1 alpha, all internal fixtures regenerate in-PR, external consumers are demo-only/owner-handled.Three breaking effects to note:
aicr.nvidia.com/v1alpha1no longer load — regenerate them.aicr.run/v1alpha2(artifacts) /aicr.run/v1beta2(build spec).aicrBundleNamespaceUUIDv5 seed moves tohttps://aicr.run/bundle/v1, so deterministic-mode bundle IDs change (one-time).Attestation/provenance URI paths (
/bundle/v1,/recipe-evidence/v1,/recipe-catalog/v1,/binary/v1) are unchanged — only the host moved. Theverifiedtrust tier still requires NVIDIA-CI identity. The documented install one-liner now useshttps://get.aicr.run.Testing
Added/updated tests: table-driven
IsSupportedAPIVersion(accepts only new, rejects legacy + intermediates), build-spec legacy-rejection cases, loader fail-closed cases.make qualify's e2e + grype-scan legs run in CI (cluster/network not available locally).Risk Assessment
Rollout notes: Pre-v1, no compatibility promise. Hard break — legacy artifacts must be regenerated (actionable error guides users). Deterministic bundle-ID reset is one-time and documented. External attestation consumers are demo-only and handled offline by the maintainer.
Checklist
make testwith-race) — except sandbox-only sigstore network testsmake lint)git commit -S)