Skip to content

Publishing

This document describes the canonical publishing model for Agent Governance Toolkit as it moves through AAIF contribution finalization. AGT is currently proposed for AAIF hosting in aaif/project-proposals#19; do not describe the project as donated until TC approval, Governing Board approval, governance finalization, and the contribution agreement are complete.

Canonical AGT release artifacts are built and attested from GitHub Actions. Registry publication temporarily uses Azure DevOps ESRP while PyPI trusted publisher configuration and npm/NuGet GitHub credentials are completed.

Release authority

Authority Current target
Release approval Maintainers for release workflows
Build and attest .github/workflows/publish.yml and .github/workflows/sbom.yml
Package registries Temporary ESRP ADO pipeline; registry-native GitHub publishing after credentials are ready
Containers Foundation or repository-owner GHCR namespace
Security advisories GitHub Security Advisories for the canonical repository

Release managers must be able to build, attest, and inspect canonical artifacts from GitHub Actions. Registry publication remains temporarily bound to Microsoft ESRP/ADO publishing authority until registry-native GitHub credentials are ready.

Dry-run releases and release manifest

Use workflow_dispatch on Publish Packages with dry_run: true to build, pack, attest, and upload artifacts without publishing to public registries. The workflow always uploads release-manifest.json, generated by scripts/ci/generate_release_manifest.py.

The manifest records every expected artifact family, source path, release automation status, requested package, release tag, and dry-run state. Review it before publishing to confirm no package family is silently missing.

Use workflow_dispatch on Publish Container Images with dry_run: true to build container images without pushing GHCR tags or attestations. Only release events or explicit dry_run: false manual dispatches publish container images.

Package identity

The package identity source of truth is docs/package-migration.md. That document records:

  • canonical package name,
  • current package name,
  • source path,
  • release workflow,
  • legacy or compatibility behavior.

Do not add a package to a release matrix without adding it to the package map.

PyPI

Python packages are built and attested by .github/workflows/publish.yml. Temporary registry publication uses .github/pipelines/esrp-publish.yml.

Required release behavior:

  • build wheels for each published package;
  • use hash-pinned release build tools from .github/release-tools/;
  • attest build provenance;
  • publish through ESRP until PyPI trusted publishers are configured for all package names;
  • preserve legacy package names only through explicit stubs or documented deprecation.

npm

npm packages are packed and attested by .github/workflows/publish.yml. Temporary registry publication uses .github/pipelines/esrp-publish.yml.

Required release behavior:

  • install with npm ci --ignore-scripts;
  • run package build checks before packing;
  • publish tarballs through ESRP until GitHub has an npm token or trusted publishing configuration;
  • treat @microsoft/* package names as compatibility names, not the long-term foundation identity;
  • document package renames in docs/package-migration.md.

NuGet

NuGet packages are built, packed, and attested from GitHub Actions. Temporary registry publication uses .github/pipelines/esrp-publish.yml. Microsoft.AgentGovernance* package IDs are compatibility names for the Microsoft-origin package family. Foundation-owned canonical package IDs must be recorded in docs/package-migration.md before registry migration.

NuGet release signing uses ESRP while Microsoft-origin package IDs remain under Microsoft registry authority. Do not add plaintext signing or registry secrets to GitHub workflow YAML.

Rust crates

Rust crates are packaged and published through crates.io ownership controlled by the project release managers.

Canonical crates currently include:

Crate Source
agentmesh agent-governance-rust/agentmesh
agentmesh-mcp agent-governance-rust/agentmesh-mcp
agent_control_specification_core policy-engine/core
agent_control_specification policy-engine/sdk/rust

Crate ownership must be transferred or delegated to foundation/project release managers before canonical AAIF publication.

Go module

Go modules are published by git tags and indexed by the Go module proxy. The current module path is:

github.com/microsoft/agent-governance-toolkit/agent-governance-golang

If the repository moves to a foundation-owned GitHub organization, the Go module path migration must be documented in docs/package-migration.md before tags are cut from the new location.

OCI images

Container images are published by .github/workflows/publish-containers.yml. Canonical images must use a foundation or repository-owner namespace, not ghcr.io/microsoft/*.

The previous Microsoft image paths are compatibility paths only and must have a documented support window if they remain available.

Manual container runs default to dry_run: true and tag dry-run so release rehearsals do not overwrite latest or versioned tags.

SBOM and provenance

Every release should include:

  • SPDX and CycloneDX SBOMs from .github/workflows/sbom.yml;
  • GitHub provenance attestations for package and container artifacts;
  • checksums or registry-native verification guidance;
  • release notes that list package identity changes and compatibility aliases.

Release checklist

  1. Confirm main is green for relevant CI.
  2. Confirm package map and release matrix agree.
  3. Run a dry-run release and inspect release-manifest.json.
  4. Run the ESRP ADO pipeline for package registry publication until registry credentials are configured for GitHub.
  5. Confirm SBOM and provenance workflows are enabled.
  6. Create a signed release tag.
  7. Publish container artifacts from GitHub Actions and package artifacts through the ESRP ADO pipeline.
  8. Verify artifacts are available from canonical registries.
  9. Post any compatibility/deprecation notices for legacy package names.