diff --git a/.claude/skills/merge-train-infra/SKILL.md b/.claude/skills/merge-train-infra/SKILL.md
index 1ef318c23add..de7ed784ad12 100644
--- a/.claude/skills/merge-train-infra/SKILL.md
+++ b/.claude/skills/merge-train-infra/SKILL.md
@@ -13,7 +13,7 @@ The merge-train system is fully automated via GitHub Actions in `.github/workflo
1. **PR Creation** (`merge-train-create-pr.yml`): Triggered on push to `merge-train/*` branches. Creates a PR targeting `next` with the `ci-no-squash` label (and `ci-full-no-test-cache` for spartan). Skips merge commits and commits already in `next`.
-2. **Body Updates** (`merge-train-update-pr-body.yml`): Triggered on push to `merge-train/**`. Updates the PR body with meaningful commits (those containing PR references like `(#1234)`). The body uses `BEGIN_COMMIT_OVERRIDE` / `END_COMMIT_OVERRIDE` markers for release-please.
+2. **Body Updates** (`merge-train-update-pr-body.yml`): Triggered on push to `merge-train/**`. Updates the PR body with meaningful commits (those containing PR references like `(#1234)`). The body wraps the commit list in `BEGIN_COMMIT_OVERRIDE` / `END_COMMIT_OVERRIDE` markers.
3. **Next Integration** (`merge-train-next-to-branches.yml`): Triggered on push to `next`. Merges `next` into each active merge-train branch via `scripts/merge-train/merge-next.sh`. Uses `continue-on-error: true` so a conflict in one branch does not block others. Skips branches whose PR already has auto-merge enabled.
diff --git a/.claude/skills/updating-changelog/SKILL.md b/.claude/skills/updating-changelog/SKILL.md
index 1af52b765da4..4da05463fb4a 100644
--- a/.claude/skills/updating-changelog/SKILL.md
+++ b/.claude/skills/updating-changelog/SKILL.md
@@ -1,6 +1,6 @@
---
name: updating-changelog
-description: Updates changelog documentation for contract developers and node operators by analyzing branch changes relative to 'next'. Use when preparing a PR, updating migration notes, documenting breaking changes, or when asked to update changelog/release notes.
+description: Updates changelog documentation for contract developers and node operators by analyzing branch changes relative to the appropriate base branch or release tag. Use when preparing a PR, updating migration notes, documenting breaking changes, or when asked to update changelog/release notes.
---
# Updating Changelog
@@ -9,7 +9,7 @@ description: Updates changelog documentation for contract developers and node op
### 1. Determine Target Files
-Read `.release-please-manifest.json` to get the version (e.g., `{"." : "4.0.0"}` → edit `v4.md`).
+Read the root `VERSION` file to get the version (e.g., `4.0.0` → edit `v4.md`). If the major-version operator changelog does not exist yet, create it from the current changelog conventions and add it to `docs/docs-operate/operators/reference/changelog/index.md`.
**Target files:**
@@ -18,7 +18,13 @@ Read `.release-please-manifest.json` to get the version (e.g., `{"." : "4.0.0"}`
### 2. Analyze Branch Changes
-Run `git diff next...HEAD --stat` for overview, then `git diff next...HEAD` for details.
+Choose the diff base before generating entries:
+
+- For a PR, use the PR target branch.
+- For `v4-next`, release branches, and backports, use that branch's upstream/base rather than `next`.
+- For release notes, diff the previous release tag against the new release tag.
+
+Run `git diff ...HEAD --stat` for overview, then `git diff ...HEAD` for details.
**Categorize changes:**
diff --git a/.github/release-please-master.json b/.github/release-please-master.json
deleted file mode 100644
index 007d5f6760cb..000000000000
--- a/.github/release-please-master.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
- "release-type": "simple",
- "bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": true,
- "group-pull-request-title-pattern": "chore(master): Release ${version}",
- "pull-request-header": ":robot: I have created a new Aztec Packages release",
- "versioning": "default",
- "include-component-in-tag": false,
- "changelog-sections": [
- { "type": "feat", "section": "Features", "hidden": false },
- { "type": "fix", "section": "Bug Fixes", "hidden": false },
- { "type": "chore", "section": "Miscellaneous", "hidden": false },
- { "type": "test", "section": "Miscellaneous", "hidden": false },
- { "type": "refactor", "section": "Miscellaneous", "hidden": false },
- { "type": "docs", "section": "Documentation", "hidden": false }
- ],
- "packages": {
- ".": {
- "release-type": "simple"
- }
- }
-}
diff --git a/.github/release-please-v2.json b/.github/release-please-v2.json
deleted file mode 100644
index 8e4e978e07f2..000000000000
--- a/.github/release-please-v2.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
- "release-type": "simple",
- "bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": true,
- "group-pull-request-title-pattern": "chore(v2): Release ${version}",
- "pull-request-header": "Pending Aztec Packages v2 release",
- "versioning": "always-bump-patch",
- "include-component-in-tag": false,
- "release-search-depth": 50,
- "commit-search-depth": 150,
- "sequential-calls": true,
- "changelog-sections": [
- { "type": "feat", "section": "Features", "hidden": false },
- { "type": "fix", "section": "Bug Fixes", "hidden": false },
- { "type": "chore", "section": "Miscellaneous", "hidden": false },
- { "type": "test", "section": "Miscellaneous", "hidden": false },
- { "type": "refactor", "section": "Miscellaneous", "hidden": false },
- { "type": "docs", "section": "Documentation", "hidden": false }
- ],
- "packages": {
- ".": {
- "release-type": "simple"
- }
- }
-}
diff --git a/.github/release-please-v3.json b/.github/release-please-v3.json
deleted file mode 100644
index a932b6082085..000000000000
--- a/.github/release-please-v3.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
- "release-type": "simple",
- "bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": true,
- "group-pull-request-title-pattern": "chore(v3): Release ${version}",
- "pull-request-header": "Pending Aztec Packages v3 release",
- "versioning": "always-bump-patch",
- "include-component-in-tag": false,
- "release-search-depth": 50,
- "commit-search-depth": 150,
- "sequential-calls": true,
- "changelog-sections": [
- { "type": "feat", "section": "Features", "hidden": false },
- { "type": "fix", "section": "Bug Fixes", "hidden": false },
- { "type": "chore", "section": "Miscellaneous", "hidden": false },
- { "type": "test", "section": "Miscellaneous", "hidden": false },
- { "type": "refactor", "section": "Miscellaneous", "hidden": false },
- { "type": "docs", "section": "Documentation", "hidden": false }
- ],
- "packages": {
- ".": {
- "release-type": "simple"
- }
- }
-}
diff --git a/.github/release-please-v4.json b/.github/release-please-v4.json
deleted file mode 100644
index af042c8872a5..000000000000
--- a/.github/release-please-v4.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
- "release-type": "simple",
- "bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": true,
- "group-pull-request-title-pattern": "chore(v4): Release ${version}",
- "pull-request-header": "Pending Aztec Packages v4 release",
- "versioning": "always-bump-patch",
- "include-component-in-tag": false,
- "release-search-depth": 50,
- "commit-search-depth": 150,
- "bootstrap-sha": "60d353cded21d7ebeed9bc64b5ae87ebba5f9a38",
- "sequential-calls": true,
- "changelog-sections": [
- { "type": "feat", "section": "Features", "hidden": false },
- { "type": "fix", "section": "Bug Fixes", "hidden": false },
- { "type": "chore", "section": "Miscellaneous", "hidden": true },
- { "type": "test", "section": "Miscellaneous", "hidden": true },
- { "type": "refactor", "section": "Miscellaneous", "hidden": true },
- { "type": "docs", "section": "Documentation", "hidden": false }
- ],
- "packages": {
- ".": {
- "release-type": "simple"
- }
- }
-}
diff --git a/.github/workflows/create-release-branch.yml b/.github/workflows/create-release-branch.yml
index 725e124ce57b..62e702167378 100644
--- a/.github/workflows/create-release-branch.yml
+++ b/.github/workflows/create-release-branch.yml
@@ -1,7 +1,7 @@
name: Create Release Branch
-# Take the current version from the release-please-manifest.json file on `next`,
-# and create a release branch for it. Then update the release-please-manifest.json file on `next` to the next version.
+# Take the current version from the VERSION file on `next`,
+# and create a release branch for it. Then update the VERSION file on `next` to the next version.
on:
workflow_dispatch:
@@ -34,8 +34,8 @@ jobs:
- name: Create release branch
run: |
- # Get the version from the release-please-manifest.json file
- CURRENT_VERSION=$(jq -r '."."' .release-please-manifest.json)
+ # Get the version from the VERSION file
+ CURRENT_VERSION=$(cat VERSION)
# grab major version
CURRENT_MAJOR_VERSION="${CURRENT_VERSION%%.*}"
@@ -57,10 +57,10 @@ jobs:
NEXT_MAJOR_VERSION=$((CURRENT_MAJOR_VERSION + 1))
NEXT_VERSION="${NEXT_MAJOR_VERSION}.0.0"
- # update release-please-manifest.json on `next` branch
+ # update VERSION on `next` branch
git fetch origin next
git checkout -B next origin/next
- jq --arg version "$NEXT_VERSION" '.["."] = $version' .release-please-manifest.json > temp.json && mv temp.json .release-please-manifest.json
- git add .release-please-manifest.json
- git commit -m "chore(release): update release-please-manifest.json to $NEXT_VERSION"
+ echo "$NEXT_VERSION" > VERSION
+ git add VERSION
+ git commit -m "chore(release): update VERSION to $NEXT_VERSION"
git push origin next
diff --git a/.github/workflows/deploy-next-net.yml b/.github/workflows/deploy-next-net.yml
index 677a75e95e8e..f393d7554c36 100644
--- a/.github/workflows/deploy-next-net.yml
+++ b/.github/workflows/deploy-next-net.yml
@@ -42,7 +42,21 @@ jobs:
SEMVER=$(echo "$TAG" | sed 's/-amd64$//' | sed 's/-spartan\.[0-9]\{8\}//')
else
# Scheduled nightly run - get latest spartan nightly tag
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ git fetch origin +next:refs/remotes/origin/next --depth=1 || true
+ current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true)
+ if [[ -z "$current_version" ]]; then
+ current_version=$(
+ git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' |
+ awk -F/ '{print $3}' |
+ sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' |
+ sort -V |
+ tail -n1
+ )
+ fi
+ if [[ -z "$current_version" ]]; then
+ echo "Unable to infer current next version from VERSION or nightly tags"
+ exit 1
+ fi
echo "Current version: $current_version"
# Format the tag as: -spartan.-amd64
diff --git a/.github/workflows/deploy-staging-public.yml b/.github/workflows/deploy-staging-public.yml
index e26a2538b650..0545549ad44c 100644
--- a/.github/workflows/deploy-staging-public.yml
+++ b/.github/workflows/deploy-staging-public.yml
@@ -4,6 +4,8 @@ on:
push:
branches:
- v4
+ tags:
+ - 'v4.*'
workflow_dispatch: {}
concurrency:
@@ -29,6 +31,19 @@ jobs:
- name: Poll for semver tag at HEAD
id: poll-tag
run: |
+ if [[ "${GITHUB_REF_TYPE:-}" == "tag" ]]; then
+ TAG="$GITHUB_REF_NAME"
+ if ! ci3/semver check "$TAG"; then
+ echo "Error: Tag $TAG is not a valid semver tag"
+ exit 1
+ fi
+ echo "Found pushed tag: $TAG"
+ SEMVER="${TAG#v}"
+ echo "tag=$TAG" >> $GITHUB_OUTPUT
+ echo "semver=$SEMVER" >> $GITHUB_OUTPUT
+ exit 0
+ fi
+
HEAD_SHA=$(git rev-parse HEAD)
MAX_ATTEMPTS=60
echo "Looking for any semver tag at HEAD ($HEAD_SHA)"
diff --git a/.github/workflows/nightly-release-tag.yml b/.github/workflows/nightly-release-tag.yml
index a02c47aa2915..bd96dfec2e58 100644
--- a/.github/workflows/nightly-release-tag.yml
+++ b/.github/workflows/nightly-release-tag.yml
@@ -26,7 +26,7 @@ jobs:
run: |
git config --global user.email "tech@aztecprotocol.com"
git config --global user.name "AztecBot"
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ current_version=$(cat VERSION)
echo "Current version: $current_version"
nightly_tag="v${current_version}-nightly.$(date -u +%Y%m%d)"
echo "Nightly tag: $nightly_tag"
@@ -46,7 +46,21 @@ jobs:
run: |
git config --global user.email "tech@aztecprotocol.com"
git config --global user.name "AztecBot"
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ git fetch origin +next:refs/remotes/origin/next --depth=1 || true
+ current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true)
+ if [[ -z "$current_version" ]]; then
+ current_version=$(
+ git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' |
+ awk -F/ '{print $3}' |
+ sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' |
+ sort -V |
+ tail -n1
+ )
+ fi
+ if [[ -z "$current_version" ]]; then
+ echo "Unable to infer current next version from VERSION or nightly tags"
+ exit 1
+ fi
echo "Current version: $current_version"
nightly_tag="v${current_version}-spartan.$(date -u +%Y%m%d)"
echo "Spartan nightly tag: $nightly_tag"
diff --git a/.github/workflows/nightly-spartan-bench.yml b/.github/workflows/nightly-spartan-bench.yml
index e331be8f8ec5..9dc203c744f6 100644
--- a/.github/workflows/nightly-spartan-bench.yml
+++ b/.github/workflows/nightly-spartan-bench.yml
@@ -29,7 +29,21 @@ jobs:
if [[ -n "${{ inputs.nightly_tag }}" ]]; then
nightly_tag="${{ inputs.nightly_tag }}"
else
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ git fetch origin +next:refs/remotes/origin/next --depth=1 || true
+ current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true)
+ if [[ -z "$current_version" ]]; then
+ current_version=$(
+ git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' |
+ awk -F/ '{print $3}' |
+ sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' |
+ sort -V |
+ tail -n1
+ )
+ fi
+ if [[ -z "$current_version" ]]; then
+ echo "Unable to infer current next version from VERSION or nightly tags"
+ exit 1
+ fi
nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)"
fi
echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT
@@ -134,7 +148,21 @@ jobs:
if [[ -n "${{ inputs.nightly_tag }}" ]]; then
nightly_tag="${{ inputs.nightly_tag }}"
else
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ git fetch origin +next:refs/remotes/origin/next --depth=1 || true
+ current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true)
+ if [[ -z "$current_version" ]]; then
+ current_version=$(
+ git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' |
+ awk -F/ '{print $3}' |
+ sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' |
+ sort -V |
+ tail -n1
+ )
+ fi
+ if [[ -z "$current_version" ]]; then
+ echo "Unable to infer current next version from VERSION or nightly tags"
+ exit 1
+ fi
nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)"
fi
echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT
diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml
deleted file mode 100644
index dd14e3153737..000000000000
--- a/.github/workflows/release-please.yml
+++ /dev/null
@@ -1,306 +0,0 @@
-name: release-please
-
-on:
- push:
- branches:
- - "v[0-9]*"
- - master
-
-permissions:
- contents: write
- pull-requests: write
-env:
- BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
-
-jobs:
- release-please:
- name: Create Release
- runs-on: ubuntu-latest
- outputs:
- release-pr: ${{ steps.release.outputs.pr }}
- release-version: ${{ steps.release.outputs.tag_name }}
- steps:
- - name: Run Release Please
- id: release
- uses: googleapis/release-please-action@7d28262f14160787a44a6be36146a18e6f575a3f
- with:
- token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
- config-file: .github/release-please-${{ github.ref_name }}.json
- target-branch: ${{ github.ref_name }}
-
- dedupe-release-notes:
- name: Deduplicate release notes
- needs: [release-please]
- if: ${{ needs.release-please.outputs.release-pr }}
- runs-on: ubuntu-latest
- permissions:
- contents: write
- pull-requests: write
- steps:
- - name: Check if release notes branch exists
- id: check-branch
- env:
- GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
- run: |
- NOTES_BRANCH="${{ fromJSON(needs.release-please.outputs.release-pr).headBranchName }}--release-notes"
- if git ls-remote --exit-code "https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git" "refs/heads/$NOTES_BRANCH" >/dev/null 2>&1; then
- echo "exists=true" >> $GITHUB_OUTPUT
- echo "branch=$NOTES_BRANCH" >> $GITHUB_OUTPUT
- else
- echo "exists=false" >> $GITHUB_OUTPUT
- echo "Release notes branch $NOTES_BRANCH does not exist, skipping deduplication"
- fi
-
- - name: Checkout release notes branch
- if: steps.check-branch.outputs.exists == 'true'
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- with:
- ref: ${{ steps.check-branch.outputs.branch }}
- fetch-depth: 1
- token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
-
- - name: Fetch dedupe script from target branch
- if: steps.check-branch.outputs.exists == 'true'
- run: |
- git fetch origin ${{ github.ref_name }} --depth=1
- git show origin/${{ github.ref_name }}:scripts/dedupe_release_notes.py > /tmp/dedupe_release_notes.py
-
- - name: Configure Git
- if: steps.check-branch.outputs.exists == 'true'
- run: |
- git config --global user.name AztecBot
- git config --global user.email tech@aztecprotocol.com
-
- - name: Deduplicate release notes
- if: steps.check-branch.outputs.exists == 'true'
- run: |
- if [ -f release-notes.md ]; then
- python3 /tmp/dedupe_release_notes.py release-notes.md
- git add release-notes.md
- if ! git diff --cached --quiet; then
- git commit -m "chore: deduplicate release notes"
- git push
- fi
- fi
-
- - name: Update PR body with deduped notes
- if: steps.check-branch.outputs.exists == 'true'
- env:
- GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
- run: |
- if [ -f release-notes.md ]; then
- PR_NUMBER=${{ fromJSON(needs.release-please.outputs.release-pr).number }}
- NOTES_SIZE=$(wc -c < release-notes.md)
- if [ "$NOTES_SIZE" -lt 60000 ]; then
- gh pr edit "$PR_NUMBER" --body "$(cat release-notes.md)"
- fi
- fi
-
- update-docs:
- name: Update docs
- env:
- GITHUB_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
- needs: [release-please]
- if: ${{ needs.release-please.outputs.release-pr }}
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout release branch
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- with:
- ref: ${{ fromJSON(needs.release-please.outputs.release-pr).headBranchName }}
- token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
-
- - name: Setup dependencies
- run: |
- sudo apt install -y --no-install-recommends doxygen
- corepack enable
-
- - name: Configure Git
- run: |
- git config --global user.name AztecBot
- git config --global user.email tech@aztecprotocol.com
-
- - name: Install Noir toolchain
- uses: noir-lang/noirup@v0.1.4
- with:
- toolchain: nightly
-
- - name: Query new version
- id: version
- run: |
- # Extract version from .release-please-manifest.json
- AZTEC_VERSION=$(jq -r '."."' .release-please-manifest.json)
-
- # Add v prefix
- AZTEC_VERSION="v$AZTEC_VERSION"
-
- echo "semver=$AZTEC_VERSION" >> $GITHUB_OUTPUT
-
- - name: Generate Aztec.nr API documentation
- working-directory: ./docs
- run: |
- ./scripts/aztec_nr_docs_generation/generate_aztec_nr_docs.sh ${{ steps.version.outputs.semver }}
- echo "Generated Aztec.nr API docs for: ${{ steps.version.outputs.semver }}"
-
- - name: Build bb (uses cache if available)
- working-directory: ./barretenberg/cpp
- run: |
- ./bootstrap.sh build_native
- echo "BB_PATH=$(pwd)/build/bin" >> $GITHUB_ENV
-
- - name: Build noir packages
- run: |
- # Initialize noir submodule (required for yarn-project portal dependencies)
- git submodule update --init --recursive noir/noir-repo
- # Build noir JS packages (creates noir/packages/ directory needed by yarn-project)
- cd noir
- ./bootstrap.sh install_deps
- ./bootstrap.sh build_packages
-
- - name: Build aztec CLI
- id: build-cli
- continue-on-error: true
- working-directory: ./yarn-project
- run: |
- ./bootstrap.sh
- echo "AZTEC_CLI_PATH=$(pwd)/aztec/dest/bin" >> $GITHUB_ENV
-
- - name: Generate TypeScript API documentation
- if: steps.build-cli.outcome == 'success'
- working-directory: ./docs
- run: |
- # Generate TypeScript API docs for this version (requires yarn-project to be built)
- ./scripts/typescript_api_generation/generate_ts_api_docs.sh ${{ steps.version.outputs.semver }}
- echo "Generated TypeScript API docs for: ${{ steps.version.outputs.semver }}"
-
- - name: Generate Aztec CLI documentation
- id: aztec-cli-docs
- if: steps.build-cli.outcome == 'success'
- working-directory: ./docs
- continue-on-error: true
- run: |
- # Add locally built binaries to PATH
- export PATH="${BB_PATH}:${PATH}"
-
- # Create wrapper for aztec CLI that runs the local build
- mkdir -p /tmp/cli-bin
- cat > /tmp/cli-bin/aztec << 'EOF'
- #!/bin/bash
- node "$AZTEC_CLI_PATH/index.js" "$@"
- EOF
- chmod +x /tmp/cli-bin/aztec
-
- # Copy aztec-up from repo (it's a standalone bash script)
- cp "$GITHUB_WORKSPACE/aztec-up/bin/aztec-up" /tmp/cli-bin/aztec-up
- chmod +x /tmp/cli-bin/aztec-up
-
- export PATH="/tmp/cli-bin:${PATH}"
-
- # Generate Aztec CLI docs using locally built binaries
- ./scripts/cli_reference_generation/generate_all_cli_docs.sh --force current
- echo "Generated Aztec CLI documentation for: ${{ steps.version.outputs.semver }}"
-
- - name: Generate BB CLI documentation
- id: bb-cli-docs
- working-directory: ./barretenberg/docs
- continue-on-error: true
- run: |
- # Add locally built bb to PATH
- export PATH="${BB_PATH}:${PATH}"
-
- # Generate BB CLI docs
- ./scripts/generate_bb_cli_docs.sh --force current
- echo "Generated BB CLI documentation for: ${{ steps.version.outputs.semver }}"
-
- - name: Comment on PR if CLI docs generation failed
- if: steps.build-cli.outcome == 'failure' || steps.aztec-cli-docs.outcome == 'failure' || steps.bb-cli-docs.outcome == 'failure'
- env:
- GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
- run: |
- FAILED_DOCS=""
- if [[ "${{ steps.build-cli.outcome }}" == "failure" ]]; then
- FAILED_DOCS="yarn-project build (cache miss)"
- fi
- if [[ "${{ steps.aztec-cli-docs.outcome }}" == "failure" ]]; then
- if [[ -n "$FAILED_DOCS" ]]; then
- FAILED_DOCS="$FAILED_DOCS, Aztec CLI"
- else
- FAILED_DOCS="Aztec CLI"
- fi
- fi
- if [[ "${{ steps.bb-cli-docs.outcome }}" == "failure" ]]; then
- if [[ -n "$FAILED_DOCS" ]]; then
- FAILED_DOCS="$FAILED_DOCS, BB CLI"
- else
- FAILED_DOCS="BB CLI"
- fi
- fi
-
- gh pr comment ${{ fromJSON(needs.release-please.outputs.release-pr).number }} --body "$(cat < versions.json
- yarn
- COMMIT_TAG=$COMMIT_TAG yarn build
- COMMIT_TAG=$COMMIT_TAG yarn docusaurus docs:version ${{ steps.version.outputs.semver }}
-
- - name: Update Barretenberg Docs versions.json with new version
- working-directory: ./barretenberg/docs/scripts
- run: |
- ./update_versions.sh
-
- - name: Commit new Barretenberg Docs version
- run: |
- git add .
- git commit -m "chore(docs): cut new barretenberg docs version for tag ${{ steps.version.outputs.semver }}"
- git push
diff --git a/.github/workflows/weekly-proving-bench.yml b/.github/workflows/weekly-proving-bench.yml
index f9f561f6d88e..d042c033006c 100644
--- a/.github/workflows/weekly-proving-bench.yml
+++ b/.github/workflows/weekly-proving-bench.yml
@@ -29,7 +29,21 @@ jobs:
if [[ -n "${{ inputs.nightly_tag }}" ]]; then
nightly_tag="${{ inputs.nightly_tag }}"
else
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ git fetch origin +next:refs/remotes/origin/next --depth=1 || true
+ current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true)
+ if [[ -z "$current_version" ]]; then
+ current_version=$(
+ git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' |
+ awk -F/ '{print $3}' |
+ sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' |
+ sort -V |
+ tail -n1
+ )
+ fi
+ if [[ -z "$current_version" ]]; then
+ echo "Unable to infer current next version from VERSION or nightly tags"
+ exit 1
+ fi
nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)"
fi
echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
deleted file mode 100644
index 83f9eb80419d..000000000000
--- a/.release-please-manifest.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- ".": "4.3.0"
-}
diff --git a/README.md b/README.md
index 1a82f2949659..557ab75d2296 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ Logging goes through the [Logger](yarn-project/foundation/src/log/) module in Ty
## Releases
-Releases are driven by [release-please](https://github.com/googleapis/release-please), which maintains a 'Release PR' containing an updated CHANGELOG.md since the last release. Triggering a new release is simply a case of merging this PR to master. A [github workflow](./.github/workflows/release-please.yml) will create the tagged release triggering ./bootstrap.sh release to build and deploy the version at that tag.
+Releases are driven by git tags. The current version is tracked in the root `VERSION` file. Pushing a semver tag (e.g. `v1.2.3`, or a nightly tag created by the [nightly release workflow](./.github/workflows/nightly-release-tag.yml)) triggers `./bootstrap.sh release` to build and deploy the version at that tag.
## Contribute
diff --git a/VERSION b/VERSION
new file mode 100644
index 000000000000..fdc6698807a9
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+4.4.0
diff --git a/barretenberg/docs/docusaurus.config.ts b/barretenberg/docs/docusaurus.config.ts
index 7fc7bf7e4253..cd35f2d3483d 100644
--- a/barretenberg/docs/docusaurus.config.ts
+++ b/barretenberg/docs/docusaurus.config.ts
@@ -262,17 +262,6 @@ const config: Config = {
className: "code-block-error-line",
line: "this-will-error",
},
- // This could be used to have release-please modify the current version in code blocks.
- // However doing so requires to manually add each md file to release-please-config.json/extra-files
- // which is easy to forget an error prone, so instead we rely on the AztecPackagesVersion() function.
- {
- line: "x-release-please-version",
- block: {
- start: "x-release-please-start-version",
- end: "x-release-please-end",
- },
- className: "not-allowed-to-be-empty",
- },
],
},
} satisfies Preset.ThemeConfig,
diff --git a/bootstrap.sh b/bootstrap.sh
index ddb0cc70dacb..5238ef7dce98 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -480,7 +480,7 @@ function release_github {
function release {
# Our releases are controlled by the REF_NAME environment variable, which should be a valid semver (but can have a leading v).
- # We ensure there is a github release for our REF_NAME, if not on latest (in which case release-please creates it).
+ # We ensure there is a github release for our REF_NAME.
# We derive a dist tag from our prerelease portion of our REF_NAME semver. It is latest if no prerelease.
# Our steps:
# barretenberg/cpp => upload binaries to github release
@@ -496,7 +496,6 @@ function release {
set -x
# Ensure we have a github release for our REF_NAME.
- # This is in case were are not going through release-please.
release_github
projects=(
@@ -803,7 +802,7 @@ case "$cmd" in
compat_min_version="4.2.0"
# Get current major version.
- current_version=$(jq -r '."."' .release-please-manifest.json)
+ current_version=$(cat VERSION)
major=$(semver major "$current_version")
if [ "$major" != "$compat_major" ]; then
echo "Compat e2e tests only apply to v${compat_major}. Current major: v${major}. Skipping."
diff --git a/ci3/source_refname b/ci3/source_refname
index 797f94fef854..e72a90eef9b5 100644
--- a/ci3/source_refname
+++ b/ci3/source_refname
@@ -51,5 +51,5 @@ if [ -z "${COMMIT_AUTHOR:-}" ]; then
fi
if [ -z "${CURRENT_VERSION:-}" ]; then
- export CURRENT_VERSION=$(jq -r '."."' $root/.release-please-manifest.json)
+ export CURRENT_VERSION=$(cat $root/VERSION)
fi
diff --git a/docs/README.md b/docs/README.md
index 158de3509dee..6730abf4f024 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -51,7 +51,7 @@ The way docs builds work is the following:
- CI runs on merge to next (the default branch), builds the dependencies needed to build the docs, then deploys on the main docs website
- [The main CI workflow](../.github/workflows/ci3.yml) runs on pull requests and builds the dependencies and the docs, giving you a preview to check that everything is correct. You can also trigger docs CI specifically with the `ci-docs` label on a PR.
-- [The nightly docs workflow](../.github/workflows/nightly-docs-release.yml) runs daily to create versioned documentation for nightly releases, automatically cutting a new version of the docs for the latest nightly tag
+- Release tags do not cut versioned docs automatically. For public releases, run the `/release-docs` or `/release-network-docs` process so API docs, CLI docs, versioned snapshots, and version config files are updated intentionally.
The preprocessing macros use environment variables to determine version numbers. For nightly builds, set `NIGHTLY_TAG` (or `COMMIT_TAG` for backwards compatibility):
@@ -215,7 +215,7 @@ yarn generate:aztec-nr-api v1.0.0
- When `aztec-nr` source code changes (new functions, updated comments, etc.)
- The `next` version docs should be committed to the repo
-- Versioned docs (e.g., `v1.0.0`) are automatically generated by CI when releases are cut
+- Versioned docs (e.g., `v1.0.0`) are generated by the release docs process when releases are cut
The generated docs are stored in `static/aztec-nr-api//` and linked from the [Aztec.nr API Reference](/developers/docs/aztec-nr/api) page.
@@ -266,7 +266,7 @@ yarn generate:typescript-api v3.0.0-devnet.6
- When TypeScript package APIs change (new exports, updated JSDoc comments, etc.)
- The `next` version docs should be committed to the repo
-- Versioned docs are automatically generated by CI during release workflows
+- Versioned docs are generated by the release docs process during releases
The generated docs are linked from the [TypeScript API Reference](/developers/docs/aztec-js/typescript_api_reference) page.
@@ -377,7 +377,7 @@ You can embed code snippets into a `.md`/`.mdx` file from code which lives elsew
### `#include_aztec_version`
-This macro will be replaced inline with the current Aztec packages tag. This value is sourced from `.release-please-manifest.json` on the project root.
+This legacy macro will be replaced inline with the current Aztec packages tag from `COMMIT_TAG`.
Alternatively, you can also use the `AztecPackagesVersion()` js function, which you need to import explicitly:
@@ -491,7 +491,7 @@ To view the protocol specs, you can run `yarn dev`. When viewing the protocol sp
## Adding Migration Notes
-When making breaking changes to Aztec, add migration notes to help users upgrade. Migration notes are organized by version and component in `docs/migration_notes.md`.
+When making breaking changes to Aztec, add migration notes to help users upgrade. Migration notes are organized by version and component in `docs/docs-developers/docs/resources/migration_notes.md`.
### Structure
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index fc942476cb53..fcf4234c2175 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -529,17 +529,6 @@ const config = {
className: "code-block-error-line",
line: "this-will-error",
},
- // This could be used to have release-please modify the current version in code blocks.
- // However doing so requires to manually add each md file to release-please-config.json/extra-files
- // which is easy to forget an error prone, so instead we rely on the AztecPackagesVersion() function.
- {
- line: "x-release-please-version",
- block: {
- start: "x-release-please-start-version",
- end: "x-release-please-end",
- },
- className: "not-allowed-to-be-empty",
- },
],
},
}),
diff --git a/docs/scripts/cli_reference_generation/CLI_DOCS_README.md b/docs/scripts/cli_reference_generation/CLI_DOCS_README.md
index 6b9e8fc5a078..3f20db4f1479 100644
--- a/docs/scripts/cli_reference_generation/CLI_DOCS_README.md
+++ b/docs/scripts/cli_reference_generation/CLI_DOCS_README.md
@@ -399,7 +399,7 @@ The documentation system uses a **unified script architecture** to reduce code d
To add support for a new CLI (e.g., `aztec-prover`):
1. Add configuration entry to `cli_docs_config.json` (single source of truth)
2. If the CLI needs special handling (e.g., version-independent), update `generate_cli_docs.sh`
-3. Update CI workflows (`.github/workflows/nightly-docs-release.yml` and `release-please.yml`) if the CLI needs to be made available during CI builds
+3. Update the release docs process and docs CI setup if the CLI needs to be made available during docs builds
## License
diff --git a/playground/src/utils/constants.ts b/playground/src/utils/constants.ts
index 105500c33596..4676376d75f6 100644
--- a/playground/src/utils/constants.ts
+++ b/playground/src/utils/constants.ts
@@ -1,6 +1,6 @@
-import releasePleaseManifest from '../../../.release-please-manifest.json';
+import versionFile from '../../../VERSION?raw';
-export const VERSION = releasePleaseManifest['.'];
+export const VERSION = versionFile.trim();
export const ContractDescriptions = {
PrivateVoting:
diff --git a/playground/update-artifacts.sh b/playground/update-artifacts.sh
index f80b41e2a80a..565c9c3b0a61 100755
--- a/playground/update-artifacts.sh
+++ b/playground/update-artifacts.sh
@@ -1,4 +1,4 @@
-VERSION=$(cat ../.release-please-manifest.json | jq -r '."."')
+VERSION=$(cat ../VERSION)
echo "Adding latest artifact for version $VERSION"
diff --git a/release-image/Dockerfile b/release-image/Dockerfile
index 4cd9d90a4407..3d7a6b952ef7 100644
--- a/release-image/Dockerfile
+++ b/release-image/Dockerfile
@@ -17,7 +17,7 @@ WORKDIR "/usr/src/yarn-project"
# Ensure the correct version shows in aztec --version
ARG VERSION
-RUN echo '{".": "'$VERSION'"}' > /usr/src/.release-please-manifest.json
+RUN echo "$VERSION" > /usr/src/VERSION
# Stamp the version into stdlib/package.json, which getPackageVersion() reads at runtime.
RUN jq --arg v "$VERSION" '.version = $v' /usr/src/yarn-project/stdlib/package.json > /tmp/p.json \
&& mv /tmp/p.json /usr/src/yarn-project/stdlib/package.json
diff --git a/release-image/Dockerfile.dockerignore b/release-image/Dockerfile.dockerignore
index 5a3681947eea..88e7b209091c 100644
--- a/release-image/Dockerfile.dockerignore
+++ b/release-image/Dockerfile.dockerignore
@@ -1,6 +1,6 @@
# We include just what's needed to run the aztec cli (none of the aztec.sh extensions).
*
-!/.release-please-manifest.json
+!/VERSION
!/barretenberg/cpp/build/bin/bb-avm
!/barretenberg/ts/dest/
!/barretenberg/ts/build/
diff --git a/spartan/aztec-node/scripts/setup-otel-resource.sh b/spartan/aztec-node/scripts/setup-otel-resource.sh
index 0861363a303d..adca32151ef7 100644
--- a/spartan/aztec-node/scripts/setup-otel-resource.sh
+++ b/spartan/aztec-node/scripts/setup-otel-resource.sh
@@ -3,14 +3,14 @@
set -ex
-VERSION_FILE="/usr/src/.release-please-manifest.json"
+VERSION_FILE="/usr/src/VERSION"
declare -A attrs_map
attrs_map["service.version"]="0.0.0";
if [[ -f "$VERSION_FILE" ]]; then
# there's a single version of the whole monocontainer
- attrs_map["service.version"]=$(jq -r '.["."]' "$VERSION_FILE")
+ attrs_map["service.version"]=$(cat "$VERSION_FILE")
fi
export OTEL_SERVICE_NAME="${OTEL_SERVICE_NAME:-unknown_service}"
diff --git a/spartan/scripts/create_devnet.ts b/spartan/scripts/create_devnet.ts
index 3972b5a97246..31a917389b47 100755
--- a/spartan/scripts/create_devnet.ts
+++ b/spartan/scripts/create_devnet.ts
@@ -7,7 +7,7 @@
*
* The script:
* 1. Validates the nightly tag format (vX.Y.Z-nightly.YYYYMMDD)
- * 2. Reads the major version from .release-please-manifest.json
+ * 2. Reads the major version from the VERSION file
* 3. Finds the next devnet iteration number
* 4. Creates a branch with a .devnet-version file
* 5. Pushes the branch
@@ -43,11 +43,8 @@ if (!/^v\d+\.\d+\.\d+-nightly\.\d{8}$/.test(nightlyTag)) {
// 2. Configure git identity in CI
configureGitIdentityInCI();
-// 3. Read major version from manifest
-const manifest = JSON.parse(
- readFileSync(".release-please-manifest.json", "utf-8"),
-);
-const version: string = manifest["."];
+// 3. Read major version from the VERSION file
+const version: string = readFileSync("VERSION", "utf-8").trim();
const majorVersion = version.split(".")[0];
console.log(`Major version: ${majorVersion}`);
diff --git a/spartan/testnet-runbook.md b/spartan/testnet-runbook.md
index 55760e513c8e..44eb1f265e59 100644
--- a/spartan/testnet-runbook.md
+++ b/spartan/testnet-runbook.md
@@ -12,7 +12,7 @@ The engineering team's public testnet responsibilities begin after code-freeze.
2. Create a named release branch (eg: `release/sassy-salamander`) from the desired `master` release (eg:`v0.64.0`).
3. Complete all QA testing against `release/sassy-salamander`.
4. For tests that do not pass, create a hotfix into the `release/sassy-salamander` release branch.
-5. After testing is complete, initiate a `release-please` CI workflow from `release/sassy-salamander` to publish release artifacts.
+5. After testing is complete, push a semver release tag from `release/sassy-salamander` to trigger the release CI workflow and publish release artifacts.
### Release Notes and Artifact Builds
diff --git a/yarn-project/BRANCHING.md b/yarn-project/BRANCHING.md
index e289f0839ece..f7fddca25f2c 100644
--- a/yarn-project/BRANCHING.md
+++ b/yarn-project/BRANCHING.md
@@ -16,9 +16,9 @@
`next` is the primary development branch. All new work should go into `next` by default.
-The current version of a branch can be found in `.release-please-manifest.json`. As of this writing, the version of `next` is `3.0.0`.
+The current version of a branch can be found in the root `VERSION` file.
-Each day at 02:00 UTC, `.github/workflows/nightly-release-tag.yml` runs, which creates a tag like `v3.0.0-nightly.20250919`.
+Each day at 02:00 UTC, `.github/workflows/nightly-release-tag.yml` runs, which creates a tag like `v$(cat VERSION)-nightly.20250919`.
The creation of a tag starting with `v` causes `.github/workflows/ci3.yml` to run.
@@ -37,9 +37,9 @@ It requires a commit SHA which SHOULD be one from a particular nightly run.
This creates a new branch for whatever the current version in `next` is, then bumps the version on `next`.
-For example, if this were run now, it would create a branch `v3`, and then bump the version in `.release-please-manifest.json` on `next` to be `4.0.0`.
+For example, if `VERSION` is `5.0.0`, it creates branch `v5`, then bumps the root `VERSION` file on `next` to `6.0.0`.
-Every push to a release branch causes a new tag to be created via the auto-tag job in .github/workflows/release-please.yml. So as soon as `v3` is created, there will be a tag that is `v3.0.0-rc.1`.
+Release-candidate tags (e.g. `v5.0.0-rc.1`) are pushed against the release branch to publish artifacts. Pick the next `rc.N` by checking existing tags for the same version, and tag the exact release-branch commit that should be tested.
Each `rc` tag causes ci3.yml to run, and creates releases because it runs `bootstrap.sh ci-nightly`.
@@ -60,9 +60,9 @@ It deploys the following networks:
- staging-public, which is used to test changes before releasing to testnet
- staging-ignition, which is use to test changes before releasing to mainnet
-Release-please has been configured on `v2`. When the release-please PR is merged, it creates a clean tag at the next minor version.
+A clean release tag at the next minor version (e.g. `v2.0.4`) is pushed against `v2` to publish a release.
-For example, at the time of writing, we are at `v2.0.3-rc.4`. When the release please PR is merged, it will create a tag `v2.0.4`.
+For example, at the time of writing, we are at `v2.0.3-rc.4`. Pushing the `v2.0.4` tag creates the next release.
This will cause ci3.yml to run a release, and then deploy-staging-networks.yml to run and deploy the two networks mentioned above as well as `testnet`.
@@ -72,7 +72,7 @@ If you are fixing a bug in production, send it into `v2` first.
If you are doing something in `next` we would like in production, you can use the `backport-to-v2` label.
-If your change produces new rollup contract addresses or VKs (and so would require a governance upgrade on testnet/mainnet), manually bump the minor version in `.release-please-manifest.json`; e.g., we would presently go to `2.1.0`. We're investigating ways to automate this.
+If your change produces new rollup contract addresses or VKs (and so would require a governance upgrade on testnet/mainnet), manually bump the minor version in the root `VERSION` file before tagging the release.
### v3 (planned)
@@ -80,12 +80,18 @@ Will be cut when we are ready to start testing release candidates for the alpha
## manual releases
-One can side-step Release Please automation by updating the version number in the root `.release-please-manifest.json`, committing, tagging the repository with e.g. `v1.2.3`, checking out the tag, and running:
+One can cut a release manually by updating the version number in the root `VERSION` file, committing, tagging the repository with e.g. `v1.2.3`, checking out the tag, and running:
```
./bootstrap.sh release
```
+Before pushing a final public release tag, update release-facing docs explicitly:
+
+- Run `/updating-changelog` and update migration notes plus the operator changelog for the branch/version being released.
+- Run `/release-docs` for developer + network docs, or `/release-network-docs` for network-only releases.
+- Ensure GitHub release notes are written or generated for the pushed tag; there is no longer an automated release PR that maintains them.
+
## release image
Aztec is released as a _single_ mono-container. That is, everything we need to ship should end up in `aztecprotocol/aztec` and published to Dockerhub with version tags.
diff --git a/yarn-project/pxe/scripts/generate_package_info.js b/yarn-project/pxe/scripts/generate_package_info.js
index 206317bdfe86..9931d047eb00 100644
--- a/yarn-project/pxe/scripts/generate_package_info.js
+++ b/yarn-project/pxe/scripts/generate_package_info.js
@@ -5,8 +5,7 @@ import { fileURLToPath } from 'url';
const currentDir = dirname(fileURLToPath(import.meta.url));
const { name } = JSON.parse(readFileSync(join(currentDir, '../package.json')));
-const versionManifest = JSON.parse(readFileSync(join(currentDir, '../../../.release-please-manifest.json')));
-const version = versionManifest['.'];
+const version = readFileSync(join(currentDir, '../../../VERSION'), 'utf-8').trim();
writeFileSync(
join(currentDir, '../src/config/package_info.ts'),
diff --git a/yarn-project/telemetry-client/src/otel_resource.ts b/yarn-project/telemetry-client/src/otel_resource.ts
index 177b13815d3f..c712b5d0e75c 100644
--- a/yarn-project/telemetry-client/src/otel_resource.ts
+++ b/yarn-project/telemetry-client/src/otel_resource.ts
@@ -1,3 +1,4 @@
+import { getPackageVersion } from '@aztec/stdlib/update-checker';
import {
type DetectorSync,
type IResource,
@@ -8,20 +9,13 @@ import {
serviceInstanceIdDetectorSync,
} from '@opentelemetry/resources';
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
-import { readFileSync } from 'fs';
-import { dirname, resolve } from 'path';
-import { fileURLToPath } from 'url';
import { AZTEC_NODE_ROLE, AZTEC_REGISTRY_ADDRESS, AZTEC_ROLLUP_ADDRESS, AZTEC_ROLLUP_VERSION } from './attributes.js';
-/** Reads the Aztec client version from the release manifest. */
+/** Reads the Aztec client version from the package-local version source. */
function getAztecVersion(): string | undefined {
try {
- const releasePleasePath = resolve(
- dirname(fileURLToPath(import.meta.url)),
- '../../../.release-please-manifest.json',
- );
- return JSON.parse(readFileSync(releasePleasePath, 'utf-8'))['.'];
+ return getPackageVersion();
} catch {
return undefined;
}