Skip to content

Commit a491204

Browse files
authored
Merge branch 'main' into feat/recipes-l40-any
2 parents 39edf88 + 3faf301 commit a491204

6 files changed

Lines changed: 159 additions & 175 deletions

File tree

fern/docs.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ products:
3030
path: ../docs/index.yml
3131
slug: latest
3232
availability: stable
33+
- display-name: v0.20.0
34+
path: versions/v0.20.0.yml
35+
slug: v0.20.0
36+
availability: stable
3337
- display-name: v0.19.0
3438
path: versions/v0.19.0.yml
3539
slug: v0.19.0
@@ -38,10 +42,6 @@ products:
3842
path: versions/v0.17.0.yml
3943
slug: v0.17.0
4044
availability: stable
41-
- display-name: v0.16.0
42-
path: versions/v0.16.0.yml
43-
slug: v0.16.0
44-
availability: stable
4545
redirects:
4646
- source: "/aicr/index.html"
4747
destination: "/aicr/"

fern/versions/v0.16.0.yml

Lines changed: 0 additions & 110 deletions
This file was deleted.

fern/versions/v0.20.0.yml

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
navigation:
16+
- section: Overview
17+
contents:
18+
- page: Introduction
19+
path: v0.20.0-content/README.md
20+
21+
- section: User Guide
22+
contents:
23+
- page: Installation
24+
path: v0.20.0-content/user/installation.md
25+
- page: End-to-End Tutorial
26+
path: v0.20.0-content/user/tutorial.md
27+
- page: CLI Reference
28+
path: v0.20.0-content/user/cli-reference.md
29+
- page: Generating Bundles
30+
path: v0.20.0-content/user/bundling.md
31+
- page: Fabric-Attached Training
32+
path: v0.20.0-content/user/fabric-attached-training.md
33+
- page: CLI Configuration File
34+
path: v0.20.0-content/user/cli-config.md
35+
- page: Artifact Verification
36+
path: v0.20.0-content/user/artifact-verification.md
37+
- page: API Reference
38+
path: v0.20.0-content/user/api-reference.md
39+
- page: Agent Deployment
40+
path: v0.20.0-content/user/agent-deployment.md
41+
- page: Air-Gapped Mirroring
42+
path: v0.20.0-content/user/air-gap-mirror.md
43+
- page: Component Catalog
44+
path: v0.20.0-content/user/component-catalog.md
45+
- page: Recipe Health
46+
path: v0.20.0-content/user/recipe-health.md
47+
- page: TestGrid
48+
path: v0.20.0-content/user/testgrid.md
49+
- page: Evidence Dashboard
50+
path: v0.20.0-content/user/evidence-dashboard.md
51+
- page: Validation
52+
path: v0.20.0-content/user/validation.md
53+
- page: Coverage Matrix
54+
path: v0.20.0-content/user/coverage-matrix.md
55+
- page: Slurm Accounting
56+
path: v0.20.0-content/user/slinky-slurm-accounting.md
57+
- page: Slurm Enroot Configuration
58+
path: v0.20.0-content/user/slinky-slurm-enroot.md
59+
- page: Slurm Shared Storage
60+
path: v0.20.0-content/user/slinky-slurm-storage.md
61+
62+
- section: Integrator Guide
63+
contents:
64+
- page: Automation
65+
path: v0.20.0-content/integrator/automation.md
66+
- page: Data Flow
67+
path: v0.20.0-content/integrator/data-flow.md
68+
- page: Kubernetes Deployment
69+
path: v0.20.0-content/integrator/kubernetes-deployment.md
70+
- page: AKS GPU Setup
71+
path: v0.20.0-content/integrator/aks-gpu-setup.md
72+
- page: GKE GPU Setup
73+
path: v0.20.0-content/integrator/gke-gpu-setup.md
74+
- page: EKS Dynamo Networking
75+
path: v0.20.0-content/integrator/eks-dynamo-networking.md
76+
- page: GKE TCPXO Networking
77+
path: v0.20.0-content/integrator/gke-tcpxo-networking.md
78+
- page: OpenShift Deployment
79+
path: v0.20.0-content/integrator/openshift.md
80+
- page: Talos Integration
81+
path: v0.20.0-content/integrator/talos-integration.md
82+
- page: Recipe Development
83+
path: v0.20.0-content/integrator/recipe-development.md
84+
- page: Data Extension
85+
path: v0.20.0-content/integrator/data-extension.md
86+
- page: Validator Extension
87+
path: v0.20.0-content/integrator/validator-extension.md
88+
- page: Supply Chain Verification
89+
path: v0.20.0-content/integrator/supply-chain-verification.md
90+
- page: Go Library Integration
91+
path: v0.20.0-content/integrator/go-library.md
92+
- page: Public API Surface
93+
path: v0.20.0-content/integrator/public-api.md
94+
- page: Measurement Schema
95+
path: v0.20.0-content/integrator/measurement-api.md
96+
- section: Components
97+
contents:
98+
- page: Nodewright
99+
path: v0.20.0-content/integrator/components/nodewright.md
100+
101+
- section: Contributor Guide
102+
contents:
103+
- page: Architecture Overview
104+
path: v0.20.0-content/contributor/index.md
105+
- page: Recipes, Overlays, and Mixins
106+
path: v0.20.0-content/contributor/recipe.md
107+
- page: Components
108+
path: v0.20.0-content/contributor/component.md
109+
- page: Collectors
110+
path: v0.20.0-content/contributor/collector.md
111+
- page: Validators
112+
path: v0.20.0-content/contributor/validator.md
113+
- page: Evidence Ingest
114+
path: v0.20.0-content/contributor/evidence-ingest.md
115+
- page: Inference-Perf Fluctuation (investigation)
116+
path: v0.20.0-content/contributor/inference-perf-fluctuation.md
117+
- page: CLI
118+
path: v0.20.0-content/contributor/cli.md
119+
- page: API Server
120+
path: v0.20.0-content/contributor/api-server.md
121+
- page: Testing
122+
path: v0.20.0-content/contributor/tests.md
123+
- page: Registry Egress
124+
path: v0.20.0-content/contributor/registry-egress.md
125+
- page: Claude Skills
126+
path: v0.20.0-content/contributor/skills.md
127+
- page: Maintaining AICR
128+
path: v0.20.0-content/contributor/maintaining.md
129+
- page: Rekor v2 Signing
130+
path: v0.20.0-content/contributor/rekor-v2-signing.md
131+
- page: Publishing Recipe Evidence
132+
path: v0.20.0-content/contributor/evidence-publishing.md
133+
- page: Publishing the Evidence Dashboard
134+
path: v0.20.0-content/contributor/evidence-dashboard-publish.md
135+
- page: UAT Day/Night Cycle
136+
path: v0.20.0-content/contributor/uat.md

infra/uat/reservations.yaml

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -147,51 +147,6 @@ reservations:
147147
nightly-intent-min-versions:
148148
inference: v0.18.0
149149
training: v0.18.0
150-
- name: aws-gb200
151-
slug: ag2
152-
cloud: aws
153-
# CROSS-ACCOUNT: the GB200 Capacity Block lives in a SEPARATE tenancy
154-
# (dgx-cloud-runai-prod-22, account 897722687756), not the standard UAT
155-
# account. The account is NOT a field here: the AWS pipeline derives the
156-
# tenancy it assumes the OIDC role into from the target cluster-config's
157-
# .deployment.tenancy (cluster-config-gb200.yaml sets it to 897722687756),
158-
# the single source of truth. Prereq: apply infra/uat-aws-account in
159-
# 897722687756 (GitHub OIDC provider + github-actions-role-aicr).
160-
# GB200 reservations are Capacity Blocks (marketType: capacity-block in
161-
# cluster-config-gb200.yaml), not standing on-demand CRs like the h100 rows,
162-
# so a run must fall inside the block's active window or actuator apply
163-
# fails to acquire capacity. This particular block (cr-0e2f3833a602809a6,
164-
# CapacityBlockId cbr-0a6a5543dd5c74727) is booked long: State=active,
165-
# StartDate 2025-11-15, EndDate 2029-08-22 (TotalInstanceCount 18). A 04:00
166-
# UTC nightly cron therefore always falls inside the window today, which is
167-
# why nightly enrollment below is safe without broker window-awareness. If
168-
# the block is ever re-booked to a shorter window, add a scheduling gate to
169-
# the broker (or revert to `nightly-intents: []`) before it lapses.
170-
reservation-id: cr-0e2f3833a602809a6
171-
accelerator: gb200
172-
# 4 Blackwell GPUs per p6e-gb200.36xlarge node; the cluster-config runs 2
173-
# nodes (activates the multi-node NCCL East-West fabric check).
174-
gpu-count: 4
175-
cluster-config-path: tests/uat/aws/cluster-config-gb200.yaml
176-
test-config-dir: tests/uat/aws/tests
177-
# Enrolled in the nightly batch with both intents, matching the aws-h100
178-
# row. Training runs the Kubeflow TrainJob CUJ; inference stands up and
179-
# validates the served inference stack (the vLLM serve run itself stays
180-
# disabled repo-wide, #1644). Each (version × intent) is a full
181-
# provision→CUJ→teardown cell dispatched through the shared per-reservation
182-
# lease, so the two intents serialize with no contention. Safe to enroll
183-
# because the Capacity Block is booked active through 2029 (see the block
184-
# note above) and the GB200 EKS UAT config first shipped in v0.18.0.
185-
nightly-intents: [training, inference]
186-
# Gate release cells to v0.18.0: cluster-config-gb200.yaml and the GB200 EKS
187-
# UAT lane first shipped in v0.18.0 (absent in v0.17.0 and earlier), so a
188-
# release cell below that tag has no GB200 config to run and would fail
189-
# closed. `main` always runs both intents (built from source); older
190-
# releases are skipped until v0.18.0 is the oldest cell in the window. Bump
191-
# if the actual first-supported tag differs.
192-
nightly-intent-min-versions:
193-
training: v0.18.0
194-
inference: v0.18.0
195150
- name: kind-h100
196151
slug: kh1
197152
cloud: kind

pkg/uatbroker/registry_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -809,15 +809,14 @@ func TestDaytimeAssignmentsNone(t *testing.T) {
809809
}
810810

811811
// TestCommittedRegistryValid guards the actual checked-in registry: it must
812-
// parse, validate, and carry the launch reservations plus the aws-gb200
813-
// bring-up row. A bad data edit fails here before it can break the broker
814-
// workflows.
812+
// parse, validate, and carry the launch reservations. A bad data edit fails
813+
// here before it can break the broker workflows.
815814
func TestCommittedRegistryValid(t *testing.T) {
816815
reg, err := LoadRegistryFile(filepath.Join("..", "..", "infra", "uat", "reservations.yaml"))
817816
if err != nil {
818817
t.Fatalf("committed reservations.yaml invalid: %v", err)
819818
}
820-
want := map[string]string{"aws-h100": CloudAWS, "gcp-h100": CloudGCP, "azure-h100": CloudAzure, "aws-gb200": CloudAWS, "kind-h100": CloudKind}
819+
want := map[string]string{"aws-h100": CloudAWS, "gcp-h100": CloudGCP, "azure-h100": CloudAzure, "kind-h100": CloudKind}
821820
for name, cloud := range want {
822821
res, err := reg.Lookup(name)
823822
if err != nil {
@@ -829,6 +828,17 @@ func TestCommittedRegistryValid(t *testing.T) {
829828
}
830829
}
831830

831+
// The registry must carry EXACTLY these reservations. The positive lookup
832+
// loop above would still pass if the retired aws-gb200 row (or any other)
833+
// were re-added, so lock the full set here — a re-add or a stray row fails
834+
// closed rather than sliding in unnoticed.
835+
gotNames := append([]string(nil), reg.Names()...)
836+
slices.Sort(gotNames)
837+
wantNames := []string{"aws-h100", "azure-h100", "gcp-h100", "kind-h100"}
838+
if !slices.Equal(gotNames, wantNames) {
839+
t.Errorf("committed registry reservations = %v, want exactly %v", gotNames, wantNames)
840+
}
841+
832842
// The committed daytime-name discovery slugs (ADR-017). Locked here so a
833843
// future edit cannot silently rename or collide a slug — the daytime
834844
// cluster name (aicr-uat-day-<slug>-<slot>-<run_id>) and its guard/teardown
@@ -837,7 +847,6 @@ func TestCommittedRegistryValid(t *testing.T) {
837847
"aws-h100": "ah1",
838848
"gcp-h100": "gh1",
839849
"azure-h100": "zh1",
840-
"aws-gb200": "ag2",
841850
"kind-h100": "kh1",
842851
}
843852
for name, slug := range wantSlug {
@@ -890,13 +899,6 @@ func TestCommittedRegistryValid(t *testing.T) {
890899
// acceptance run (29125390442); inference joined after a green
891900
// manual intent=inference dispatch.
892901
"azure-h100": {IntentTraining, IntentInference},
893-
// aws-gb200 enrolled with both intents once the GB200 EKS UAT lane
894-
// shipped (v0.18.0) and the Capacity Block was confirmed booked active
895-
// through 2029 (cr-0e2f3833a602809a6). Release cells are gated to
896-
// v0.18.0 via nightly-intent-min-versions (the config first shipped
897-
// there), so only `main` runs GB200 nightly until v0.18.0 ages into the
898-
// window.
899-
"aws-gb200": {IntentTraining, IntentInference},
900902
// kind-h100 (nvkind real-silicon lane, DC5 #1278) enrolled with both
901903
// intents after green manual H100 acceptance runs (training 29954092703,
902904
// inference 29965464868). Release cells are gated to v0.18.0 via
@@ -920,12 +922,10 @@ func TestCommittedRegistryValid(t *testing.T) {
920922
// a future edit cannot silently drop a gate — which would let a release cell
921923
// run a pre-fix aicr and emit failing/unusable evidence. azure-h100 gates its
922924
// AKS perf + driver-only fixes; kind-h100 gates the uat-kind lane + the
923-
// os-agnostic coordinate fix (#1851); aws-gb200 gates the GB200 EKS UAT
924-
// config, which first shipped in v0.18.0. All landed post-v0.17.0.
925+
// os-agnostic coordinate fix (#1851). All landed post-v0.17.0.
925926
wantMinVersions := map[string]map[string]string{
926927
"azure-h100": {IntentTraining: "v0.18.0", IntentInference: "v0.18.0"},
927928
"kind-h100": {IntentTraining: "v0.18.0", IntentInference: "v0.18.0"},
928-
"aws-gb200": {IntentTraining: "v0.18.0", IntentInference: "v0.18.0"},
929929
}
930930
for name, want := range wantMinVersions {
931931
res, lookupErr := reg.Lookup(name)

0 commit comments

Comments
 (0)