ATR release runbook (Apache Trusted Releases)
The Apache Trusted Releases (ATR) backend for an Apache release:
compose a signed release candidate in the ATR web platform, let ATR
run the policy checks and drive the [VOTE], then finish the
release so it is published to dist.apache.org and announced.
This runbook is the ATR counterpart of the
svn-release-runbook.md. Both describe the
same 14-step lifecycle and are driven by the same
release-management skills — they differ only in the
distribution / approval / announce backend the mechanical middle
runs against:
svnpubsub runbook |
ATR runbook (this doc) | |
|---|---|---|
| Stage RC | svn import to dist/dev/<rc>/ |
Compose phase: upload to ATR |
| Run checks | RM/voters run release-verify-rc locally |
Compose checks run automatically in ATR + local verify |
| Vote | RM sends [VOTE], tallies by hand |
Vote phase: ATR sends [VOTE], tabulates |
| Promote | svn mv dist/dev → dist/release |
Finish phase: ATR strips -rcN, publishes |
| Announce | RM sends [ANNOUNCE] |
Finish phase: ATR-assisted announce |
atr is a value of the release_dist_backend
switch, alongside svnpubsub. The 14 abstract steps are identical;
only the commands the RM (and the skills) emit change.
Why ATR
The traditional svnpubsub flow scatters a release across a signed
tag, a hand-built .zip, a detached signature, a checksum, an
svn import to dist/dev/, a manually-composed [VOTE] email, a
manual tally, and an svn mv to dist/release/. Every one of those
is a place to get the mechanics wrong (bad signature, md5 instead
of sha512, a stray file in the .zip, staging to the wrong
bucket).
ATR moves the mechanical middle onto a platform that:
- Runs the policy checks for you, on upload. Signature, checksum,
LICENSE,NOTICE, and source-header checks fire asynchronously the moment a candidate is composed, so the RM gets fast feedback on policy compliance before asking anyone to vote. - Automates the vote. ATR sends the
[VOTE]email todev@and tabulates the replies over the 72-hour window. - Publishes atomically on finish. Finishing strips the
-rcNtags from filenames, rearranges the directory structure, and publishes todist.apache.org— replacing the error-pronesvn mvpromotion.
This keeps the release policy-compliant by construction, which is the point of ATR: releases that are trusted because the platform, not a tired human at 2am, enforced the mechanics.
Status: beta
The three ATR phases vs the 14-step lifecycle
ATR organises a release into three phases. They map onto the 14-step lifecycle — and onto the release skills that own each step — like this:
| ATR phase | Lifecycle steps | Owning skill(s) | What happens |
|---|---|---|---|
| (pre-phase) | 1 Plan · 2 Changelog/NOTICE/LICENSE | release-prepare |
Planning issue + version-bump PR. Off-platform; unchanged. |
| (pre-phase) | 3 KEYS |
release-keys-sync |
RM’s public key added to the committee’s KEYS in ATR. |
| Compose | 4 Cut RC · 5 Stage · 6 Verify | release-rc-cut, release-verify-rc |
Build the source artefact, sign it, upload it to ATR as a draft; ATR runs signature/checksum/license/notice/source-header checks automatically. |
| Vote | 7 [VOTE] · 8 Window · 9 Tally |
release-vote-draft, release-vote-tally |
ATR sends the [VOTE] to dev@ and tabulates replies over ≥72h. The skills draft the body and cross-check the tally against the PMC roster. |
| Finish | 10 Promote · 11 Announce | release-promote, release-announce-draft |
ATR strips -rcN, rearranges the tree, publishes to dist.apache.org, and assists the [ANNOUNCE]. Records downstream distributions (PyPI, Maven Central). |
| (post-phase) | 12 Archive · 13 Audit · 14 Post-bump | release-archive-sweep, release-audit-report, release-prepare |
Archiving in ATR, audit-log record, -SNAPSHOT/.dev bump. |
The takeaway: ATR replaces the mechanics of Steps 5–12, including archiving. Steps 1–4 (plan, changelog, keys, build) and 13–14 (audit, post-bump) are the same regardless of backend, and the same skills drive them.
What ATR does not change
- The source package is still the release. ATR votes on the source artefact; binaries/wheels remain convenience (release-policy § what is a release).
- The vote is still a
dev@list vote with a ≥72h window, ≥3 binding+1, and more+1than-1(release-policy § release approval). ATR drives it; it does not replace the PMC’s binding vote. - The RM still signs. ATR verifies signatures; it never holds the
RM’s private key. Signing happens on the RM’s machine (or a hardware
key), exactly as with
svnpubsub. announce@apache.orgis still mandatory for the TLP announcement (release-policy § announcements).
State-change boundaries (unchanged from svnpubsub)
The two non-negotiable spec boundaries hold identically on the ATR backend — ATR changes where artefacts live, not who acts:
- The agent never holds, invokes, or proxies the RM’s signing key. The build-and-sign of the artefact (Step 4) runs on the RM’s machine; the agent emits the recipe, the RM runs it and signs. (spec § Boundary 1).
- The agent never publishes the release. Composing a draft and starting a vote are RM actions in ATR; finishing (publishing) is the moment of release and is an RM/PMC action in the ATR UI or via the authenticated client. The skills draft; the human confirms and clicks/commits. (spec § Boundary 2).
Concretely: the release skills that emit paste-ready commands
(release-rc-cut, release-promote) now emit ATR client commands
instead of svn commands, but they still emit — they do not run the
publishing step themselves.
Prerequisites
Before you start, confirm:
- You are a committer on the Magpie committee and can authenticate to ATR with your ASF credentials.
- Your OpenPGP key is registered in ATR for the Magpie committee
(the ATR equivalent of being in the
KEYSfile — see Step B). If this is your first release, runrelease-keys-sync(Step 3) first. - The prep PR is merged — version strings,
CHANGELOG,NOTICE/LICENSEreflect<version>(release-prepare, Step 2). git,gpg, and Python 3.12+ are installed locally (theatrclient needs 3.12+).
One-time setup: the atr client
The atr client
lets you drive a release from the machine where the artefacts were
built. Install it once:
# Option 1 — uv (recommended)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install "apache-trusted-releases @ git+https://github.com/apache/tooling-releases-client"
# Option 2 — pip in a venv
python3 -m venv venv && source venv/bin/activate
pip3 install -U pip setuptools wheel
pip3 install "git+https://github.com/apache/tooling-releases-client"
atr --version
Authenticate against the ATR deployment (get the PAT from your profile page in the ATR web UI):
atr set asf.uid <your-asf-id>
atr set tokens.pat "<personal-access-token-from-atr-site>"
atr jwt refresh # exchanges the PAT for a short-lived JWT
Step A: Prep + version bump (unchanged)
Identical to the svnpubsub flow. Run
release-prepare:
- It opens the release-planning issue (Step 1).
- It drafts the version-bump +
CHANGELOG+NOTICE/LICENSEPR (Step 2). Merge it before composing the RC.
No ATR interaction yet — this is ordinary repo work.
Step B: KEYS in ATR (Step 3)
On svnpubsub, your public key must appear in
dist/release/magpie/KEYS. On ATR, the committee’s keys live in the
platform: ATR stores the KEYS set and validates candidate
signatures against it during Compose.
If this is your first Magpie release, run
release-keys-sync to
produce the public-key block, then register it:
# Register your public key with the Magpie committee in ATR
# (web UI: Committee → Keys → Add key; or the client/API equivalent
# of POST /api/key/add — confirm the exact verb with `atr --help`)
gpg --armor --export <your-key-fingerprint> > my-public-key.asc
# upload my-public-key.asc via the ATR UI or client
The agent drafts the key block and the diff; you own the private key and perform the registration (spec § Boundary 1).
Step C: Compose the release candidate (Steps 4-6)
Compose is the ATR replacement for svn import + local verify.
-
Build and sign the source artefact locally — this half is unchanged from the
svnpubsubrunbook Steps 2–5.release-rc-cutemits the recipe fromrelease-build.md:export VERSION=0.1.0 export RC=rc1 export RC_TAG="${VERSION}-${RC}" export ARTIFACT="apache-magpie-${VERSION}-source.zip" git tag -s "${RC_TAG}" -m "Apache Magpie ${VERSION} ${RC}" HEAD git push origin "${RC_TAG}" git archive --format=zip \ --prefix="apache-magpie-${VERSION}/" \ -o "${ARTIFACT}" "${RC_TAG}" gpg --armor --detach-sign "${ARTIFACT}" # -> ${ARTIFACT}.asc sha512sum "${ARTIFACT}" > "${ARTIFACT}.sha512"The build and the signature happen on your machine, with your key. ATR receives an already-signed artefact; it never signs for you.
-
Create the draft release and upload to ATR (Compose):
# Start a draft release for magpie <version>, then upload the artefact # + signature + checksum. ATR tracks *revisions*, not rc-numbers: each # upload adds to the current revision (the rcN identity lives in the tag # and the [VOTE] subject, not in the ATR release name). `atr upload` takes # PROJECT VERSION PATH FILEPATH — PATH is the file's name inside the # release, FILEPATH the local file — so upload one file per call. # (Verbs per the client's COMMANDS.md; run `atr <cmd> --help` for flags.) atr release start magpie "${VERSION}" atr upload magpie "${VERSION}" "${ARTIFACT}" "${ARTIFACT}" atr upload magpie "${VERSION}" "${ARTIFACT}.asc" "${ARTIFACT}.asc" atr upload magpie "${VERSION}" "${ARTIFACT}.sha512" "${ARTIFACT}.sha512" -
Let the checks run. On upload, ATR fires asynchronous checks: signature (against the committee
KEYS), checksum, license, notice, and source-header (RAT-style) checks. Poll them:atr revisions magpie "${VERSION}" # list revisions; note the revision id atr check status magpie "${VERSION}" --verbose # poll checks # review a specific revision's hard blockers and non-blocking concerns: # atr check blockers magpie "${VERSION}" <revision> # atr check concerns magpie "${VERSION}" <revision>Fix any failing check and re-upload a new revision before voting. This is the platform-run equivalent of
release-verify-rc; you can still runrelease-verify-rclocally for a second, independent read (voters can too, in their own dev loop).
Step D: Vote (Steps 7-9)
ATR automates the mechanics of the dev@ vote; the PMC still casts
the binding votes.
-
Draft the
[VOTE]body withrelease-vote-draft. It produces the subject ([VOTE] Release Apache Magpie <version> from <version>-rcN) and body — pointing voters at the ATR candidate page and its check results, and carrying the How to verify this candidate section every Magpie[VOTE]has: the reproducibility record (source commit,SOURCE_DATE_EPOCH, sha512 from the planning issue), the agentic one-liner (/magpie-release-management:verify-rc <version>-rcN), the human-readable page (manual-release-process.md§ Manual verification at the RC tag), the reproducibility background, and the voter-obligation sentence. ATR’s default vote text links only the candidate page, so the drafted body is what the RM supplies to ATR (the client’s body option or the vote form on the candidate page; confirm withatr vote start --help) — do not let the default stand. -
Start the vote in ATR. The RM triggers the vote for the composed candidate; ATR sends the
[VOTE]email todev@magpie.apache.organd opens the tabulation. Starting the vote is an RM action — the agent drafts, the RM starts:# atr vote start PROJECT VERSION REVISION -m LIST [--duration H] [--subject S] [CONCERNS-NOTED] # REVISION comes from `atr revisions magpie "${VERSION}"` (or the candidate page). # If `atr check concerns` flagged non-blocking concerns, start the vote WITH the # concerns-noted flag so they're acknowledged in the thread (see `atr vote start --help`). atr vote start magpie "${VERSION}" <revision> \ -m dev@magpie.apache.org --duration "${VOTE_WINDOW_HOURS:-72}" \ --subject "[VOTE] Release Apache Magpie ${VERSION} from ${RC_TAG}" -
72-hour window (Step 8). Minimum per release-policy § release approval; the Magpie config may lengthen but not shorten it (
release-management-config.md§ Vote). What a PMC member does during the window, in either order:- Agentic:
/magpie-release-management:verify-rc <version>-rcNfrom any Magpie-enabled agent — read-only; it fetches the staged artefacts, checks signature / checksum / RAT / LICENSE-NOTICE / binaries / links / version strings, rebuilds the source archive from the tag and reportsidentical,content-identicalordiffers. - Manual: the linked verification page at the RC tag — the same checks longhand, ending with a build and test run from the unpacked source.
- Reply on the thread using the
reply template:
the commit you verified, the
compareverdict, and what you built and tested on. A binding+1is the voter’s own statement, not the tool’s.
- Agentic:
-
Tally (Step 9). ATR tabulates the replies; cross-check with
release-vote-tally, which classifies each reply binding-vs-non-binding against thepmc-roster.mdand drafts the[RESULT] [VOTE]. On any ambiguity the skill refuses to count and flagsAMBIGUOUS, needs RM call— the binding tally is the PMC’s, not the platform’s. If the vote fails, bumpRCand return to Step C.
Step E: Finish + announce (Steps 10-11)
Finish is the ATR replacement for the svn mv dist/dev → dist/release promotion and the [ANNOUNCE]. This is the moment of
release.
-
Finish the release in ATR once the vote has passed. Finishing:
- strips the
-rcNtag from artefact filenames, - rearranges the directory structure into the release layout,
- publishes the artefacts to
dist.apache.org(the release area) via ATR.
release-promotenow emits the Finish command (the client/API equivalent of the promote) instead of thesvn mv. Finishing is an RM/PMC action — the agent drafts the command; the human runs it (spec § Boundary 2).# Publish the voted candidate as the release. Confirm the exact # verb with `atr --help`. atr release finish magpie "${VERSION}" - strips the
-
Announce (Step 11).
release-announce-draftdrafts the[ANNOUNCE]body (subject[ANNOUNCE] Apache Magpie <version> released) forannounce@apache.org, ccdev@— mandatory per release-policy § announcements — and the site-bump PR againstsite-repo.md. ATR can assist the announce; the agent never sends the mail and never merges the site PR. -
Record downstream distributions. If Magpie ships convenience artefacts (e.g. a PyPI package), record each downstream location in ATR (
POST /api/distribution/record) so the release catalog and audit trail are complete.
Step F: Archive, audit, post-release bump (Steps 12-14)
- Archive sweep (Step 12): follow the retention rule in
release-management-config.md§ Archive. Releases committed todist/releaseare copied toarchive.apache.orgautomatically. Archiving a release in ATR updates the release catalog and removes its files fromdist/releasein the background. If enabled in the project settings, select “Auto archive prior release” to archive the previous release in the same cycle when announcing the new release. See Promoting to release. - Audit log (Step 13) —
release-audit-reportappends the per-release record (RM, binding voters, artefacts + sigs + checksums, the ATR candidate/finish references,[ANNOUNCE]archive URL) to the audit log. - Post-release version bump (Step 14) —
release-preparedrafts the-SNAPSHOT/.devbump PR somainis open for the next line.
GitHub Actions path (reproducible builds)
For a project with a reproducible build, ATR can compose a
candidate directly from CI using
apache/tooling-actions,
authenticating to ATR with GitHub OIDC (no long-lived token in the
repo). The workflow builds the artefact, uploads it to ATR, and
triggers the checks — the same Compose phase, driven from Actions
instead of the RM’s laptop.
This does not move the signing key into CI unless the project has
adopted a reproducible-build + trusted-publishing model the PMC has
explicitly signed off on. For Magpie’s first releases, prefer the
local atr client path above (Step C); revisit CI-driven compose once
the build is demonstrably reproducible. When it is, release-prepare automated-signing drafts the Infra key request, the Security Team
notification and the workflow PR (template:
projects/_template/workflows/release-candidate.yml)
under the conditions in
Infra § Automated release signing;
see reproducibility.md. See the
tooling-asf-example
repository for a worked GitHub Actions example.
Release Manager checklist
Cross-references
process.md— the 14-step lifecycle this runbook drives against the ATR backend.svn-release-runbook.md— thesvnpubsubcounterpart; same lifecycle, different backend.spec.md— the state-change boundaries (agent never holds the key, never publishes) that hold identically on ATR.README.md— the release-management skill family that drives every step.release-management-config.md— where theatrdistribution backend is selected.- ATR platform —
beta deployment ·
release catalogue ·
user docs ·
API docs ·
platform source ·
atrclient · GitHub Actions · worked example. Discussion:dev@tooling.apache.org/#apache-trusted-releaseson ASF Slack. - ASF release policy, release distribution, release signing — the canonical foundation references ATR enforces.