Release Process

AI Grid Network (AGN) uses Semantic Versioning.
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, and grid-enrollment Helm 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.toml and regenerate Cargo.lock.
  • Update both workspace.package.version and package.version in crates/gateway/Cargo.toml and regenerate crates/gateway/Cargo.lock.
  • Update the five release-chart versions listed above.
  • Update their AGN workload appVersion values to the AGN tag.
  • Verify the praxis-gateway appVersion and default image match the intended official Praxis AI release.
  • Bump every chart value that pins an AGN image tag explicitly, such as praxis-gateway overlay.sidecar.image.tag. An empty tag there resolves to the chart appVersion, which is the Praxis AI version, so these are pinned by hand and the release workflow does not check them.
  • Run make generate-deploy and commit the result. The manifests under deploy/operator and deploy/overlays render from charts/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 lint for both workspaces, then make lint-extra.
  • Run make test and make doc for the root workspace.
  • Run cargo test --locked --manifest-path crates/gateway/Cargo.toml --workspace for the separate Gateway workspace.
  • Run make codegen-check, make crds-check, and make deploy-check.
  • Run git diff --check and validate the release workflow with actionlint.
  • 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.

AreaCommandTopology/config pathClassificationRequired whenFeature docs
Provider traffic selection and round-robincargo 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.yamlRelease qualificationRouting, provider candidates, overlay selection policy, provider attribution, or gateway compatibility changesREADME
Static weighted provider selectionGRID_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.yamlRelease qualificationweightedRandom, static placement, provider capacity, weighted overlay, final-provider withdrawal/restoration, or cross-site capacity propagation changesREADME
Distributed token quotacargo 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.yamlExperimental integration qualificationQuota, identity, Basic Auth, Valkey, gateway image, or shared-consumer changesREADME
Single-cluster multi-gatewaycargo 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.yamlRelease qualificationSame-site gateway lifecycle, overlay delivery, provider selection, concurrency, or NetworkPolicy behavior changesREADME
Combined-site lifecyclecargo 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.yamlRelease qualificationCombined-site routing, provider add/remove/re-add, session fallback, rollout, trust, or lifecycle changesREADME
GLBcargo 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.yamlRelease qualificationGLB, ingress, edge/provider boundary, mTLS, or network-boundary changesREADME
Workload inference / no ingresscargo 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.mdRelease qualificationWorkload inference, no-ingress routing, or cluster-local workload entry changesREADME
llm-d pool metrics, cross-site signals, learned ceilings, partition, and recoverycargo 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.yamlExperimental qualification; selectable in the generic triggered workflow as llmd-pool-metrics in quick or full modeEPP 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 changesREADME

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

AreaBehavior provedImages and overridesEvidence, runtime, and cleanupFeature docs
Provider traffic selection and round-robinGrid 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 selectionThree 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 quotaBasic 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-gatewayTwo 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 lifecycleCombined-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
GLBGlobal 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 ingressWorkload 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 recoveryQuick 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:

  1. verifies that the tag matches the workspace version;
  2. reruns lint, tests, and documentation validation from the tagged source;
  3. verifies the pinned official Praxis AI image and provenance;
  4. builds and publishes the version-tagged AGN container images, including grid-gateway, with SBOM and provenance attestations;
  5. validates, packages, and publishes the five release charts; and
  6. 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-gateway chart still resolve the separately released ghcr.io/praxis-proxy/ai:<tag> image; that chart is not evidence that the grid-gateway operand 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-gateway image 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.