This document describes how to create a new release of the agentic-workflow-firewall (awf).
- Ability to trigger workflows (Actions tab or
ghCLI)
From the CLI:
# Patch release (0.1.0 -> 0.1.1)
gh workflow run release.yml -f bump=patch
# Minor release (0.1.1 -> 0.2.0)
gh workflow run release.yml -f bump=minor
# Major release (0.2.0 -> 1.0.0)
gh workflow run release.yml -f bump=majorOr from the GitHub UI: go to Actions > Release > Run workflow, select the bump type, and click Run workflow.
The workflow will:
- Bump the version in
package.json - Commit the version change and create a git tag
- Build and push Docker images to GHCR
- Create Linux x64 and arm64 binaries
- Create NPM tarball and checksums
- Generate versioned JSON Schema files with the release tag embedded in their
$idURLs - Publish the GitHub Release with auto-generated changelog
Git tags, not main's package.json, are the authoritative published versions.
The workflow synchronizes the package and lockfile to the latest version tag,
bumps them, and creates a tag-only version commit on the selected source.
It does not push that commit to protected main. All release build jobs check
out the new tag. Thus main remaining at 0.23.1 while v0.28.31 contains
package version 0.28.31 is intentional, not an artifact publication bug.
Cloud Hypervisor production preflight requires both artifact sets to match
the running package version; an arbitrary source checkout must not consume a
newer release's artifacts. Enclave live acceptance must therefore build AWF
from the exact published release tag, with that tag containing the reviewed
acceptance implementation. The acceptance workflow additionally requires a
full acceptance_commit SHA and verifies its ancestry and harness presence
before the Copilot credential is introduced. Both downloaded manifests must
identify the checked-out tag commit; signature and digest verification still
run through production preflight.
A maintainer must merge the acceptance implementation and separately authorize
the normal release workflow to publish its package-matched signed Cloud
Hypervisor archive/manifest/bundle and both enclave role rootfs, SBOM and
provenance sets. No package bump on main, retagging, or local artifact
substitution is needed. See the explicit acceptance dispatch
procedure
for the separate, credential-bearing acceptance authorization.
Successful Cloud Hypervisor preflight fixtures must derive their manifest tag,
rootfs/supervisor versions, and configured release tag from
CLOUD_HYPERVISOR_ARTIFACT_RELEASE_TAG, rather than the version currently on
main. Validate deterministic acceptance and foundation preflight tests with
the package and lockfile coherently set to another release version as well as
the source version, then restore both files before committing. Negative tests
must still reject mismatched release identities and reach their intended gate.
A source fixture fix does not change an immutable published tag. In particular,
the deterministic fixture failures on v0.28.33 require a future release
containing the fix before live acceptance can proceed; rerunning that old tag
cannot consume the corrected tests.
Once the workflow completes:
- Go to Releases page
- Verify the new release is published with:
- Linux x64 binary (
awf-linux-x64) - Linux arm64 binary (
awf-linux-arm64) - NPM tarball (
awf.tgz) - Checksums file (
checksums.txt) - Container digest manifest (
containers.txt) - JSON Schema files (
awf-config.schema.json,audit.schema.json,token-usage.schema.json) - Installation instructions with GHCR image references
- Linux x64 binary (
- Go to Packages page (in repository)
- Verify Docker images are published:
squid:<version>andsquid:latestagent:<version>andagent:latestapi-proxy:<version>andapi-proxy:latestcli-proxy:<version>andcli-proxy:latestagent-act:<version>andagent-act:latest(GitHub Actions parity image)enclave-script:<version>andenclave-script:latestenclave-agent:<version>andenclave-agent:latestenclave-mcp-server:<version>andenclave-mcp-server:latest
Each release includes:
awf-linux-x64- Linux x64 standalone executableawf-linux-arm64- Linux arm64 standalone executableawf.tgz- NPM package tarball (alternative installation method)checksums.txt- SHA256 checksums for all filescontainers.txt- Digest-pinned container manifest for published runtime imagesawf-config.schema.json- AWF config JSON Schemaawf-config.v1.schema.json- Deprecated alias ofawf-config.schema.json(kept for backward compatibility)audit.schema.json- AWF audit JSONL record JSON Schematoken-usage.schema.json- AWF token-usage JSONL record JSON Schema
Each release generates all three schemas with a $id URL that includes the release tag, creating stable, pinnable references:
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/awf-config.schema.json
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/audit.schema.json
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/token-usage.schema.json
External consumers (e.g. the gh-aw compiler) should pin to the release URL or the stable raw URL:
| Schema | Pinned to release tag | Always-latest from main |
|---|---|---|
| Config | https://github.com/github/gh-aw-firewall/releases/download/<tag>/awf-config.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/docs/awf-config.schema.json |
| Audit | https://github.com/github/gh-aw-firewall/releases/download/<tag>/audit.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/schemas/audit.schema.json |
| Token usage | https://github.com/github/gh-aw-firewall/releases/download/<tag>/token-usage.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/schemas/token-usage.schema.json |
Migration note: The previously documented URL
…/releases/download/<tag>/awf-config.v1.schema.jsonand the raw URL…/main/docs/awf-config.v1.schema.jsonare now deprecated.awf-config.v1.schema.jsoncontinues to be published as a compatibility alias (identical content toawf-config.schema.json) so existing consumers are not broken, but new consumers should useawf-config.schema.jsoninstead. Thedocs/awf-config.v1.schema.jsonfile in the repository has been removed; usedocs/awf-config.schema.jsonfor the always-latest copy.
JSONL _schema field: Each JSONL record embeds the AWF version in its _schema field, e.g. "_schema": "audit/v0.26.0". For audit logs, the version reflects the AWF CLI version that configured the Squid proxy. For token-usage logs, the version is baked into the api-proxy container image at release build time (via --build-arg AWF_VERSION=…), so it correctly reflects the api-proxy image version even when --image-tag pins the proxy to a different release. Dev/local builds use audit/v<package.json-version> and token-usage/v0.0.0-dev respectively. Consumers should use a prefix match (_schema.startsWith("audit/")) rather than an exact match to handle any version gracefully.
Schema evolution: Breaking changes (field removal, rename, type change, new required field) should be documented in the changelog. Since the repo version is used as the schema version, consumers can pin to a specific release tag to ensure compatibility.
Docker images are published to ghcr.io/github/gh-aw-firewall:
squid:<version>andsquid:latest- Squid proxy containeragent:<version>andagent:latest- Agent execution environment (minimal, ~200MB)api-proxy:<version>andapi-proxy:latest- API proxy sidecar for credential isolationcli-proxy:<version>andcli-proxy:latest- CLI proxy sidecar for gh CLI access via mcpg DIFC proxyagent-act:<version>andagent-act:latest- Agent with GitHub Actions parity (~2GB)enclave-script:<version>andenclave-script:latest- No-network script executor, built fromcontainers/enclave/Dockerfiletargetenclave-scriptenclave-agent:<version>andenclave-agent:latest- Single-use agent executor, built fromcontainers/enclave/Dockerfiletargetenclave-agentenclave-mcp-server:<version>andenclave-mcp-server:latest- Shared enclave MCP server, built fromcontainers/enclave/Dockerfiletargetenclave-mcp-server
These images are automatically pulled by the CLI when running commands.
The agent-act image is used when running with --agent-image act for workflows that need closer parity with GitHub Actions runner environments.
Before releasing, you can test the build process locally:
# Install pkg globally
npm install -g pkg
# Build TypeScript
npm run build
# Create Linux binary
mkdir -p release
pkg . --targets node18-linux-x64 --output release/awf
# Test the binary (requires Docker images - see below)
./release/awf-linux --help# Build images locally
docker build -t awf-test/squid:local ./containers/squid
docker build -t awf-test/agent:local ./containers/agent
docker build -t awf-test/api-proxy:local ./containers/api-proxy
docker build -t awf-test/cli-proxy:local ./containers/cli-proxy
# Test with local images
sudo ./dist/cli.js \
--build-local \
--allow-domains github.com \
'curl https://github.com'
# Or test with existing GHCR images
sudo ./dist/cli.js \
--allow-domains github.com \
'curl https://github.com'- Check the Actions tab for error logs
- Common issues:
- Build errors: Check TypeScript compilation locally with
npm run build - Docker build errors: Test image builds locally in
containers/directories - GHCR push errors: Ensure
packages: writepermission is granted - Permission errors: Ensure repository has
contents: writepermission
- Build errors: Check TypeScript compilation locally with
- Test locally before release
- Ensure all dependencies are bundled (check
pkg.assetsin package.json) - For dynamic requires, you may need to mark files/directories in
pkg.assets
If users report that Docker images can't be pulled:
- Check Packages page to verify images were published
- Verify image visibility is set to Public (not Private)
- Check image tags match what the CLI expects (version + latest)
- Users can use
--build-localas a workaround while troubleshooting
To make packages public:
- Go to repository Packages page
- Click on the package (squid, agent, api-proxy, cli-proxy, or agent-act)
- Go to Package settings
- Change visibility to Public
If you accidentally released the wrong version:
- Delete the tag remotely:
git push origin :refs/tags/v0.1.0 - Delete the release from GitHub UI
- Delete or retag the GHCR images if needed
- Re-run the workflow with the correct bump type
Pre-release versions are not currently supported via the workflow dispatch input. To create a pre-release, manually bump the version locally and push:
npm version prerelease --preid=alpha # 0.1.0 -> 0.1.1-alpha.0
git push origin main --tagsThe release workflow can then be triggered manually (it will read the pre-release version from package.json and skip the bump step since the tag already exists).
For backporting fixes to older major versions:
- Create a maintenance branch:
git checkout -b v0.x - Cherry-pick or apply fixes
- Push branch:
git push origin v0.x - Run the release workflow on the maintenance branch (select the
v0.xbranch in the UI)