Release Process
On this page
Versioning
AI Grid Network (AGN) uses Semantic Versioning. The workspace version
is defined in workspace.package.version in the root Cargo.toml. Workspace
crates inherit that version. Keep the separate crates/gateway/Cargo.toml
workspace version and its explicit gateway package version aligned with the
root workspace; root version changes do not update them. Package versions alone
do not establish image compatibility: qualify the tagged source and intended
consumer below.
The five charts published by this release (grid-operator, grid-site,
praxis-gateway, grid-mock-providers, and grid-enrollment) have versions
matching the AGN release. The appVersion for AGN-owned workloads in the
release charts also matches the AGN tag. The praxis-gateway chart is
different: its appVersion identifies the default Praxis AI image and may
advance independently of AGN.
grid-enrollment joined the release line in 0.2.0. Before that it versioned
independently and its image was published elsewhere, so a reader installing
from chart defaults could not pull it.
The project-owned grid-gateway operand is versioned with AGN and must be
built from the same tagged AGN source. It is distinct from the separately
released Praxis AI image used by the praxis-gateway chart.
Release Artifacts
An AGN release publishes:
ghcr.io/praxis-proxy/grid-gateway:v<version>;ghcr.io/praxis-proxy/grid-operator;ghcr.io/praxis-proxy/grid-mock-providers;ghcr.io/praxis-proxy/grid-overlay-sync;ghcr.io/praxis-proxy/grid-enrollment;- the
grid-operator,grid-site,praxis-gateway,grid-mock-providers, andgrid-enrollmentHelm charts; and - a GitHub Release containing generated notes and immutable artifact digests.
Build grid-gateway:v<version> from the matching AGN release tag and record
its immutable digest in the release manifest. Image publication does not depend
on a chart or operator consuming the image.
The praxis-gateway chart uses the separately released
ghcr.io/praxis-proxy/ai:<tag> image. Qualify any chart or operator that
consumes grid-gateway separately, as described below.
AGN does not publish a Praxis AI image or an AI rollup. The release workflow
verifies the pinned official Praxis AI image used by the praxis-gateway chart,
including its digest and OCI provenance.
Optional Praxis AI filters are an explicit deployment dependency. Examples or qualifications that require optional filters must document the required Cargo features and require the caller to provide a compatible image. They must not silently substitute a custom-built Praxis AI image.
Pre-release Checklist
Before opening a release preparation pull request:
- Update the workspace version in
Cargo.tomland regenerateCargo.lock. - Update both
workspace.package.versionandpackage.versionincrates/gateway/Cargo.tomland regeneratecrates/gateway/Cargo.lock. - Update the five release-chart versions listed above.
- Update their AGN workload
appVersionvalues to the AGN tag. - Verify the
praxis-gatewayappVersionand default image match the intended official Praxis AI release. - Bump every chart value that pins an AGN image tag explicitly, such as
praxis-gatewayoverlay.sidecar.image.tag. An empty tag there resolves to the chartappVersion, which is the Praxis AI version, so these are pinned by hand and the release workflow does not check them. - Run
make generate-deployand commit the result. The manifests underdeploy/operatoranddeploy/overlaysrender fromcharts/grid-operator, so they carry the operator image tag and the kind version label. - Confirm the release workflow builds
ghcr.io/praxis-proxy/grid-gateway:v<version>from the same tagged AGN source, publishes the version tag, and records the resulting immutable digest. - Update the release workflow’s pinned AI tag, digest, and source revision when the default Praxis AI image changes.
- Run
make lintfor both workspaces, thenmake lint-extra. - Run
make testandmake docfor the root workspace. - Run
cargo test --locked --manifest-path crates/gateway/Cargo.toml --workspacefor the separate Gateway workspace. - Run
make codegen-check,make crds-check, andmake deploy-check. - Run
git diff --checkand validate the release workflow withactionlint. - Lint and render the five release charts with their required values.
- Validate affected Forge topologies.
- Run the relevant integration qualifications when routing, overlay, or gateway compatibility changes.
- Confirm generated evidence and local build artifacts are not committed.
- Review pull request labels so generated release notes are useful.
The first-class integration qualifications are documented in the documentation index. They build isolated Kind environments, exercise runtime behavior, record evidence, and clean up their resources.
Integration qualification checklist
Run the individual qualification commands below against fresh source builds and fresh, uniquely tagged images. There is deliberately no aggregate release qualification command. Run the commands sequentially in a dedicated checkout: several use shared Forge state, Kind cluster names, or Docker network names. Until Forge teardown is run-scoped, a concurrent run using the same state directory can lose its clusters even when it uses a different config file.
| Area | Command | Topology/config path | Classification | Required when | Feature docs |
|---|---|---|---|---|---|
| Provider traffic selection and round-robin | cargo xtask env run-grid-provider-traffic-qualification --forge-config tests/e2e/topologies/grid-provider-traffic/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-provider-traffic/forge.yaml | Release qualification | Routing, provider candidates, overlay selection policy, provider attribution, or gateway compatibility changes | README |
| Static weighted provider selection | GRID_XTASK_SIM_IMAGE=ghcr.io/llm-d/llm-d-inference-sim:v0.10.2 cargo xtask env run-grid-static-weighted-qualification --forge-config tests/e2e/topologies/grid-static-weighted/forge.yaml --quick --teardown --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-static-weighted/forge.yaml | Release qualification | weightedRandom, static placement, provider capacity, weighted overlay, final-provider withdrawal/restoration, or cross-site capacity propagation changes | README |
| Distributed token quota | cargo xtask env run-grid-token-rate-limit-qualification --forge-config tests/e2e/topologies/grid-token-rate-limit/forge.yaml --image-tag "$IMAGE_TAG" --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-token-rate-limit/forge.yaml | Experimental integration qualification | Quota, identity, Basic Auth, Valkey, gateway image, or shared-consumer changes | README |
| Single-cluster multi-gateway | cargo xtask env run-grid-single-cluster-multi-gateway-qualification --forge-config tests/e2e/topologies/grid-single-cluster-multi-gateway/forge.yaml --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-single-cluster-multi-gateway/forge.yaml | Release qualification | Same-site gateway lifecycle, overlay delivery, provider selection, concurrency, or NetworkPolicy behavior changes | README |
| Combined-site lifecycle | cargo xtask env run-grid-combined-site-demo --forge-config tests/e2e/topologies/grid-combined-site/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-combined-site/forge.yaml | Release qualification | Combined-site routing, provider add/remove/re-add, session fallback, rollout, trust, or lifecycle changes | README |
| GLB | cargo xtask env run-grid-glb-demo --forge-config tests/e2e/topologies/grid-glb-demo/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-glb-demo/forge.yaml | Release qualification | GLB, ingress, edge/provider boundary, mTLS, or network-boundary changes | README |
| Workload inference / no ingress | cargo xtask env run-grid-glb-demo --forge-config tests/e2e/topologies/grid-glb-demo/forge.yaml --no-ingress --full --teardown --evidence-dir "$EVIDENCE_DIR" | Reuses tests/e2e/topologies/grid-glb-demo/forge.yaml; documented by tests/e2e/topologies/grid-workload-inference/README.md | Release qualification | Workload inference, no-ingress routing, or cluster-local workload entry changes | README |
| llm-d pool metrics, cross-site signals, learned ceilings, partition, and recovery | cargo xtask env run-grid-llmd-pool-metrics-demo --forge-config tests/e2e/topologies/grid-llmd-pool-metrics/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR" | tests/e2e/topologies/grid-llmd-pool-metrics/forge.yaml | Experimental qualification; selectable in the generic triggered workflow as llmd-pool-metrics in quick or full mode | EPP metrics, operator peer polling, Grid Gateway site selection and stale-signal gauge clearing, KV-cache saturation or learned-ceiling lifecycle, provider topology withdrawal/re-addition, pressure transitions, recovery, partition, or metrics mTLS changes | README |
Use the following one-line command stack after setting IMAGE_TAG and
EVIDENCE_DIR for each run. The quota qualification additionally requires a
Praxis AI image built with the optional features shown below; the other
topologies require the filters documented in their READMEs and may use the
official compatible AI image where applicable.
cargo xtask env run-grid-provider-traffic-qualification --forge-config tests/e2e/topologies/grid-provider-traffic/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR"
GRID_XTASK_SIM_IMAGE=ghcr.io/llm-d/llm-d-inference-sim:v0.10.2 cargo xtask env run-grid-static-weighted-qualification --forge-config tests/e2e/topologies/grid-static-weighted/forge.yaml --quick --teardown --evidence-dir "$EVIDENCE_DIR"
cargo xtask env run-grid-token-rate-limit-qualification --forge-config tests/e2e/topologies/grid-token-rate-limit/forge.yaml --image-tag "$IMAGE_TAG" --evidence-dir "$EVIDENCE_DIR"
cargo xtask env run-grid-single-cluster-multi-gateway-qualification --forge-config tests/e2e/topologies/grid-single-cluster-multi-gateway/forge.yaml --evidence-dir "$EVIDENCE_DIR"
cargo xtask env run-grid-combined-site-demo --forge-config tests/e2e/topologies/grid-combined-site/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR"
cargo xtask env run-grid-glb-demo --forge-config tests/e2e/topologies/grid-glb-demo/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR"
cargo xtask env run-grid-glb-demo --forge-config tests/e2e/topologies/grid-glb-demo/forge.yaml --no-ingress --full --teardown --evidence-dir "$EVIDENCE_DIR"
GRID_XTASK_OPERATOR_IMAGE="${GRID_XTASK_OPERATOR_IMAGE:?build a source-matched Grid operator; see the llm-d README}" GRID_XTASK_GRID_GATEWAY_IMAGE="${GRID_XTASK_GRID_GATEWAY_IMAGE:?build a source-matched Grid Gateway; see the llm-d README}" cargo xtask env run-grid-llmd-pool-metrics-demo --forge-config tests/e2e/topologies/grid-llmd-pool-metrics/forge.yaml --full --teardown --evidence-dir "$EVIDENCE_DIR"
For release evidence, use the triggered workflow’s immutable EPP and simulator
image references, or reject the run if either reference lacks a sha256
digest or the recorded container image ID is missing. The command above uses
mutable defaults when these image variables are unset and does not enforce
those evidence requirements by itself.
The checked-in Praxis configurations for these Kind qualifications explicitly
enable both insecure_options.allow_private_endpoints and
insecure_options.allow_private_upstreams because their test backends use
private Kind Service addresses and reserved cluster IPs. These are
qualification-only settings; production configurations retain the default
private-upstream rejection.
Images and optional features
Each run must use exact image references that are materialized into the
resolved Forge configuration and loaded into Kind when imagePullPolicy: Never is used. Record the image IDs or immutable digests in the evidence.
Typical local overrides are:
export GRID_XTASK_GATEWAY_IMAGE=praxis-ai:$IMAGE_TAG
export GRID_XTASK_OPERATOR_IMAGE=grid-operator:$IMAGE_TAG
export GRID_XTASK_OVERLAY_SYNC_IMAGE=grid-overlay-sync:$IMAGE_TAG
export GRID_XTASK_MOCK_PROVIDER_IMAGE=grid-mock-providers:$IMAGE_TAG
export GRID_XTASK_SIM_IMAGE=ghcr.io/neuralmagic/vllm-vcr:vllm0.23
export GRID_XTASK_IMAGE_PULL_POLICY=Never
In the current qualification tooling, GRID_XTASK_GATEWAY_IMAGE names the
Praxis AI gateway image used by the fixtures. It does not refer to the
project-owned grid-gateway operand.
The distributed token-quota qualification requires the optional Praxis AI
token-rate-limit-filter. Praxis AI 0.4.0 already includes Basic Auth; a
custom quota image only needs to enable the token filter. The qualification’s
image label still declares both available filters:
token-rate-limit-filter,praxis-filter/basic-auth-filter
The image label and runtime registrations must match the compiled feature set. The standard official AI image may be suitable for provider selection and other gateway paths, but a quota run must be BLOCKED, never marked PASS, if the required filters are absent or its feature label is unavailable or inaccurate. See the provider traffic README, quota README, and the other topology READMEs for exact image preparation.
Evidence, cleanup, and release gates
Create a new UTC-stamped evidence directory for every run, normally beneath
evidence/. Evidence from an older commit, source tree, image tag, or image
digest is not valid for the current release. Generated evidence must not be
committed.
Use --teardown where the command accepts it; the quota and single-cluster
qualifications attempt cleanup by default unless --keep is set. SIGKILL can
stop either qualification before cleanup runs, and the quota runner’s default
SIGINT path also skips its cleanup guard. Verify the actual cleanup results
and ownership before removing anything manually. A missing
prerequisite, unavailable image, missing Forge binary, or failed
readiness/convergence check is BLOCKED or FAIL, never PASS. Preserve
non-2xx responses and first failures in the evidence; do not hide them with
retries or reinterpret them as successful routing.
cargo xtask env validate-all is a separate legacy/local validation suite. It
does not run the release qualification matrix above and must not be presented
as a substitute for these topology-specific commands.
Experimental classification means that a topology is outside the default supported release surface; it does not permit weakening assertions or ignoring failed results. When an experimental path is changed or claimed in release notes, run it and report its evidence independently.
Qualification details
| Area | Behavior proved | Images and overrides | Evidence, runtime, and cleanup | Feature docs |
|---|---|---|---|---|
| Provider traffic selection and round-robin | Grid publishes stable provider candidates and groups; Praxis AI accepts the overlay and returns trusted attribution while eligible providers receive round-robin traffic. | Official compatible Praxis AI gateway image, plus locally built grid-operator, grid-overlay-sync, and VCR simulator images. Use the GRID_XTASK_*_IMAGE overrides above when validating unreleased Grid code. | Write to the run’s UTC-stamped EVIDENCE_DIR; the full run is typically several minutes. Verify teardown against the run inventory. | README |
| Static weighted provider selection | Three weighted distributions, followed by sequential withdrawal to an authoritative empty revision and restoration. The proof checks the published and mounted revisions, Praxis accepted/serving revision, affinity-bound and new no-route responses, provider/backend counters, and gateway restart identity. | Requires the planned Praxis AI 0.7.0 image, built from Praxis 0.7.4, with support for empty versioned routing snapshots. Also use locally built grid-operator and VCR images. | Write structured results and the revision transition under EVIDENCE_DIR; runtime is typically several minutes. A run with an incompatible gateway image is failed, not a completed release qualification. Verify teardown against the run inventory. | README |
| Distributed token quota | Basic Auth precedes admission; Alice’s sliding-window budget is shared across consumers; routing spans sites; concurrency, expiry, restart persistence, Valkey fail-closed behavior, recovery, and NetworkPolicy are exercised. | Praxis AI 0.4.0 includes Basic Auth; a custom quota image must enable token-rate-limit-filter and declare both available filters in its image label. Use --image-tag and the exact image required by the README. | Record structured quota and routing evidence under EVIDENCE_DIR; runtime is variable and materially longer than a smoke test. The command attempts cleanup on normal completion or handled failure; do not use --keep for release evidence. | README |
| Single-cluster multi-gateway | Two consumer gateways independently accept and serve the same three-provider overlay inside one Kubernetes cluster and one GridSite; attributed round-robin selection, provider withdrawal/restoration, consumer failure/recovery, concurrent traffic, and NetworkPolicy boundaries are exercised. | The fixed grid-operator:single-cluster-qualification, grid-overlay-sync:single-cluster-qualification, and praxis-ai:single-cluster-qualification references are local-development defaults. Release validation should set GRID_XTASK_OPERATOR_IMAGE, GRID_XTASK_OVERLAY_SYNC_IMAGE, and GRID_XTASK_GATEWAY_IMAGE to unique references; set GRID_XTASK_SIM_IMAGE as needed. All resolved references are loaded into Kind under imagePullPolicy: Never. | The command records timestamped structured evidence and attempts cleanup unless --keep is explicitly supplied. It does not claim multi-site SWIM, WAN behavior, or a globally shared round-robin cursor. | README |
| Combined-site lifecycle | Combined-site bootstrap, trusted round-robin, provider drain and restoration, secondary add/remove/re-add, session fallback, revision convergence, and lifecycle cleanup. | Official compatible Praxis AI image plus local grid-operator, grid-overlay-sync, and VCR simulator images through the overrides above. | Save lifecycle timelines and request attribution under EVIDENCE_DIR; a full run is typically on the order of tens of minutes. Run alone and verify teardown against the run inventory. | README |
| GLB | Global load-balancing and network-boundary behavior, including provider attribution and the configured ingress path. | Official compatible Praxis AI image plus the topology’s required local grid-operator, grid-overlay-sync, and VCR simulator images; use the listed overrides and Never pull policy for local images. | Save results under EVIDENCE_DIR; use --quick for bounded diagnostics or --full for qualification. Run alone and verify teardown against the run inventory. | README |
| Workload inference / no ingress | Workload inference through the no-ingress path and its provider/network behavior. This reuses the GLB command with --no-ingress; it is not a separate invented CLI command. | Same image set and overrides as GLB, with any optional AI features required by that topology’s README. | Save no-ingress evidence under EVIDENCE_DIR; use --quick for diagnostics or --full for qualification. Run alone and verify teardown against the run inventory. | README |
| llm-d pool metrics, cross-site signals, learned ceilings, partition, and recovery | Quick mode proves deterministic local metric scoring and recovery. Full mode additionally checks operator-to-operator mTLS signal polling, Gateway polling of its local operator, live pressure selection, stale-signal exclusion with SWIM connected, wrong-pin rejection and recovery, a deployed network partition and reconvergence, response attribution headers, the learned-ceiling lifecycle, and KV-cache-driven routing and hard-bound behavior. The lifecycle requires verified running-request metrics with zero waiting and held work, proves the ceiling persists while idle, removes the exact (site, cluster) pair from both published and mounted serving topology and verifies Gateway acceptance, then returns the same pair under lower load and fails if the old ceiling survives. For KV-only routing, the pinned EPP reports asymmetric endpoint cache values while running load is low and waiting/held work is zero; the deployed operator signal path must deliver the mean and spread to the Gateway, which must report the resulting saturation and near-full combined rho without a hard ceiling or counted saturation. A matched 2,048-request sample must reduce pool-B’s share by at least eight percentage points. A separate saturated-KV hard-bound sample must learn a ceiling below the queue-free soft value from running plus one waiting request per ready endpoint, with zero flow-control-held work. The matched 2,048-request samples require pool B to receive at least 75% under its queue-free soft ceiling, at most 65% under the hard bound, and drop by at least 15 percentage points. With that saturation sample active, full mode also removes one simulator endpoint, requires EPP and both operator views to report fewer ready units, waits the Gateway load window, and requires the old soft ceiling to clear while the hard/effective ceiling is relearned for the reduced size; cleanup restores original replica counts. Cross-site pressure samples check the live Gateway’s queue-score order and compare attributed traffic to its capacity-weighted two-site share, integrating the live weighted share across bounded request batches if saturation changes during sampling. | Full mode requires Grid Operator and Grid Gateway images built from the same Grid checkout and set through GRID_XTASK_OPERATOR_IMAGE and GRID_XTASK_GRID_GATEWAY_IMAGE. Pool-B’s pinned EPP enables flowControl to expose held-work evidence. | Save signal, serving-revision, mounted-config, soft/hard ceiling, saturation, route, partition, image, and restoration evidence under EVIDENCE_DIR; verify teardown against the run inventory. The proof restores its run-owned provider policy, simulator replica counts and configuration, and reconcile annotations on success and failure. | README |
Coverage gaps that remain visible
The llm-d qualification separately rejects a wrong peer certificate pin while
SWIM remains connected, then tests a deployed network partition with both
operators and the Grid Gateway running. The standalone
verify-failover-under-lost-peer operator check stops an operator process and
does not cover that deployed boundary.
Geography-first selection after peer auto-discovery remains unqualified.
Auto-discovered GridSite resources do not currently carry region and zone
from SWIM; a deployed three-tier proof needs that metadata propagation before
it can assert geography without manually patching discovered resources.
The optional GLB external-provider proof is a separately configured live check.
When its protected credential is absent, the runner reports SKIPPED; that
does not count as a passed external-provider qualification.
Tagging A Release
Tags use v<MAJOR>.<MINOR>.<PATCH>. Create the tag only
from the reviewed commit after its pull request and CI checks pass. Sign the tag
using the project’s normal Git signing configuration:
VERSION="${VERSION:?set VERSION to the workspace release version}"
TAG="v${VERSION}"
git tag -s "$TAG" -m "AGN $TAG"
git push origin "$TAG"
Do not move or recreate a published release tag. Prepare a new patch release for corrections.
Automated Publication
Pushing a valid release tag triggers the Release workflow. The workflow:
- verifies that the tag matches the workspace version;
- reruns lint, tests, and documentation validation from the tagged source;
- verifies the pinned official Praxis AI image and provenance;
- builds and publishes the version-tagged AGN container images, including
grid-gateway, with SBOM and provenance attestations; - validates, packages, and publishes the five release charts; and
- creates the GitHub Release with generated notes and immutable digests.
The workflow can also be dispatched for an existing immutable release tag. A manual dispatch does not replace the requirement for a reviewed, signed tag.
Post-publication Verification
For every release:
- Confirm
ghcr.io/praxis-proxy/grid-gateway:v<version>exists and its registry digest matches the digest recorded in the GitHub Release manifest. - Confirm that deployments using the
praxis-gatewaychart still resolve the separately releasedghcr.io/praxis-proxy/ai:<tag>image; that chart is not evidence that thegrid-gatewayoperand is wired.
grid-gateway consumer qualification
Before deploying the grid-gateway operand:
- Identify the intended chart or operator consumer and verify that its
rendered image reference uses the release’s
grid-gatewayimage by its recorded immutable digest, or a version tag that resolves to that digest. - Preserve the rendered consumer reference with the deployment evidence.
Until that consumer exists and passes this check, record grid-gateway
consumption as NOT QUALIFIED. This does not block publication of
grid-gateway or the other AGN release artifacts.
Release Notes
AGN uses GitHub Releases for release notes. There is no committed version-specific changelog. Add the user-facing summary, compatibility notes, upgrade considerations, qualification results, and demonstration links to the GitHub Release page.
Release Branches
Release branches are optional. Create one from a release tag only when a
supported line needs a backport. Use release/v<MAJOR>.<MINOR>.x, cherry-pick
the focused fix, and publish a new patch tag through the normal workflow.