-
Notifications
You must be signed in to change notification settings - Fork 93
feat(api): deprecation channel, CLI surface gate, ADR-022 emit guards #2436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e267654
ff45530
a83d14b
bb23fcc
a004b8d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,6 +14,11 @@ already accepts `aicr.run/v1beta1`; a kind introduced now can start at its | |
| target without violating §7's rule that a new kind is never stamped with a | ||
| version the tree does not accept, and without a shipped alpha version to retire. | ||
|
|
||
| Revised 2026-08-28 for [#2421](https://github.com/NVIDIA/aicr/issues/2421): §3 | ||
| states which clause governs a catalog kind that arrives through the direct | ||
| recipe-input path, and scopes the surviving empty-`apiVersion` tolerance to | ||
| `RecipeResult`. | ||
|
|
||
| Amends [ADR-011](011-artifact-apiversion-policy.md): §1 keeps `pkg/header` as the | ||
| single source of version strings but replaces its single-version alias rule; | ||
| §3 becomes kind/schema-scoped, covers AICR catalog inputs, and retires its | ||
|
|
@@ -27,7 +32,7 @@ kind-scoped version evolution as an amendment to ADR-011. | |
| ## Problem | ||
|
|
||
| Every artifact AICR generates today carries an alpha `apiVersion`. ROADMAP | ||
| [§2](../../ROADMAP.md#2-stability) promises a frozen, diff-gated surface at v1, | ||
| [§1](../../ROADMAP.md#1-defensible-api-stability) promises a frozen, diff-gated surface at v1, | ||
| and the Kubernetes convention that `v1alpha2` invokes — may be dropped or changed | ||
| without notice — is the opposite of that promise. Two alpha schema tracks coexist: | ||
| `aicr.run/v1alpha2` for general kinds and default/catalog forms, and | ||
|
|
@@ -68,7 +73,7 @@ Four questions have no recorded answer: | |
| ### 1. Project v1 and artifact `v1` are separate axes | ||
|
|
||
| AICR reaching v1.0.0 does not require every artifact kind to reach | ||
| `aicr.run/v1`. ROADMAP §2 asks for a committed baseline, a CI diff-gate, and a | ||
| `aicr.run/v1`. ROADMAP §1 asks for a committed baseline, a CI diff-gate, and a | ||
| deprecation channel. A gate over a `v1beta1` schema is a real gate: it catches | ||
| *unintended* breakage, which is what the freeze promises. The maturity string | ||
| governs *intended* breakage. It is selected by wire kind and current schema | ||
|
|
@@ -190,6 +195,24 @@ predating the field; `AICRConfig` already rejects it. After N+1 emits only | |
| target versions, an unversioned artifact would otherwise pass those gates | ||
| unchallenged — the fail-open shape §8 exists to close. | ||
|
|
||
| **A catalog kind is governed by §8 on every path it can arrive by.** The | ||
| tolerance above is scoped by wire kind, not by entry point. A `RecipeMetadata` | ||
| reaching AICR as a direct recipe input (`aicr recipe -r overlay.yaml`, | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same invalid command in the clause defining which paths the gate governs. The direct-input paths are |
||
| `aicr bundle -r overlay.yaml`) is the same catalog document it would be inside a | ||
| `--data` tree, so it is held to the same fail-closed authoring gate the catalog | ||
| scanner applies, including the rejection of an empty value. §3 step 1's | ||
| "existing empty-value tolerances remain where they already exist" does not | ||
| extend a tolerance to a document the catalog path already rejects; where the two | ||
| paths disagreed, the stricter one governs. | ||
|
|
||
| This resolves [#2421](https://github.com/NVIDIA/aicr/issues/2421), where | ||
| `pkg/recipe/loader.go` short-circuited on an empty value before it inspected the | ||
| kind, so a headerless overlay was rejected from a `--data` tree and silently | ||
| hydrated when passed with `-r`. Closing it in Release N rather than deferring to | ||
| N+1 keeps the two paths from disagreeing across the release where the emitter | ||
| switch rewrites every committed header. The empty-value tolerance survives for | ||
| `RecipeResult` inputs only, and retires with the rest at N+2. | ||
|
|
||
| ### 4. The deprecation window is conditional on the level being retired | ||
|
|
||
| This **replaces ADR-011 §4**, whose dual-accept rule was stated unconditionally. | ||
|
|
@@ -351,5 +374,5 @@ intent; silent downgrade is not. | |
| - [ADR-011](011-artifact-apiversion-policy.md) — artifact `apiVersion` policy and compatibility gate | ||
| - [ADR-013](013-aicr-run-domain-migration.md) — `aicr.run` domain migration, the precedent for a pre-v1 hard break | ||
| - [ADR-015](015-recipe-configuration-profiles.md) — recipe configuration profiles, which introduced kind-scoped evolution | ||
| - [ROADMAP §2 Stability](../../ROADMAP.md#2-stability) | ||
| - [ROADMAP §1 Defensible API stability](../../ROADMAP.md#1-defensible-api-stability) | ||
| - [Kubernetes deprecation policy](https://kubernetes.io/docs/reference/using-api/deprecation-policy/) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -137,6 +137,16 @@ embedded one and silently carried forward. Unrelated YAML in the tree keeps its | |
| existing skip behavior, and `ValidatorCatalog` sits on a separate API domain | ||
| outside this contract. | ||
|
|
||
| This gate follows the document, not the entry point. Passing a single overlay | ||
| directly — `aicr recipe -r overlay.yaml`, `aicr bundle -r overlay.yaml` — | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same invalid command. |
||
| applies the same check as a `--data` catalog scan, so a `RecipeMetadata` | ||
| with a missing or empty `apiVersion` is rejected on both paths. Through v0.20 | ||
| the direct path accepted it and hydrated silently | ||
| ([#2421](https://github.com/NVIDIA/aicr/issues/2421)); if you author overlays | ||
| outside a catalog tree, confirm each one carries a header. The empty-value | ||
| tolerance that remains is for hydrated `RecipeResult` inputs only, and it | ||
| retires in v0.23. | ||
|
|
||
| ## Adding a criteria value | ||
|
|
||
| Criteria value validation (`service`, `accelerator`, `intent`, `os`, | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -599,11 +599,15 @@ CLI file loader for the same values — `aicr bundle -r` accepts a | |
| The shared artifact gate rejects any `apiVersion` outside | ||
| `aicr.run/v1alpha2`, `aicr.run/v1`, `aicr.run/v1alpha3`, and | ||
| `aicr.run/v1beta2` with a 400, on this endpoint as well as on the CLI file-load | ||
| path. An absent or empty `apiVersion` is still admitted as the legacy shape | ||
| through v0.22, and v0.23 stops admitting it along with the alpha values. The | ||
| reader and emitter clocks are separate: v0.21 and v0.22 both read the alpha | ||
| values, the target values, and the empty header, while generated recipes keep | ||
| their alpha headers until v0.22 switches the emitters. See | ||
| path. An absent or empty `apiVersion` is still admitted as the legacy shape on | ||
| `RecipeResult` inputs through v0.22, and v0.23 stops admitting it along with the | ||
| alpha values. The tolerance is scoped to `RecipeResult`, which predates the | ||
| field: a `RecipeMetadata` overlay is a catalog document however it arrives, so | ||
| `aicr recipe -r` and `aicr bundle -r` reject a headerless one exactly as a | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same invalid command: |
||
| `--data` catalog scan does. The reader and emitter clocks are separate: v0.21 | ||
| and v0.22 both read the alpha values, the target values, and the empty header, | ||
| while generated recipes keep their alpha headers until v0.22 switches the | ||
| emitters. See | ||
| [Catalog and binary compatibility](../integrator/data-extension.md#catalog-and-binary-compatibility) | ||
| for the release-by-release table. | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🟡 Minor — RELEASING.md says release notes carry a
## Deprecations(h2) section, but the aicr-release-notes skill requires### Deprecations(h3)This item says "A
## Deprecationssection in the release notes," but the authoritative generator (.agents/skills/aicr-release-notes/SKILL.md:108) adds### Deprecationsas an h3 sibling of### Highlights. Someone following RELEASING.md literally would emit an h2 that breaks the heading hierarchy the skill enforces.Fix: Change this to
### Deprecationsto match the skill's h3 level.