Releasing Magent
This document defines Magent’s versioning policy, compatibility boundary, and release procedure. It is the canonical release policy; the release history lives in CHANGELOG.org.
Initial Release Baseline
When this policy was adopted, the source declared version 0.1.0 and Magent
had not published a Git tag or GitHub Release. The 0.1.0 line is therefore
an untagged development preview. The first intentional tagged release is
v0.2.0, establishing the baseline for subsequent compatibility decisions.
Version Source of Truth
- The tracked source of truth is the
Package-Versionheader inlisp/magent.el. - Package metadata uses
X.Y.Zwithout a leadingv. Git tags and GitHub Releases usevX.Y.Z. - After removing the tag’s leading
v, the tag andPackage-Versionmust be identical, including any pre-release suffix. - Generated package descriptors such as
magent-pkg.elmust agree with the header, but are not a second hand-maintained version source. - The Python package under
benchmark/has an independent lifecycle and is not required to share Magent’s version.
Magent intentionally has no root VERSION file. A hand-maintained VERSION
would duplicate the package header without adding information. If future
release tooling requires a raw version file, it should generate and validate
that file from lisp/magent.el rather than make maintainers update both.
Semantic Versioning Policy
Magent follows Semantic Versioning 2.0.0. The highest-impact change included in a release determines the version bump.
Before 1.0.0
The 0.Y.Z series communicates active development while still giving users a
predictable upgrade signal.
| Change | Next version |
|---|---|
| New functionality or any backward-incompatible public change | 0.(Y+1).0 |
| Backward-compatible bug or security fix only | 0.Y.(Z+1) |
| Documentation, test, CI, or internal-only maintenance | No release required on its own |
Examples:
0.2.0to0.2.1for a compatible session-save bug fix.0.2.1to0.3.0for a new Action feature.0.2.1to0.3.0when a tool argument, public command, or file format is changed incompatibly.
From 1.0.0 Onward
| Change | Version component |
|---|---|
| Backward-incompatible public change | Major |
| Backward-compatible functionality | Minor |
| Backward-compatible bug or security fix only | Patch |
Deprecating public functionality requires at least a minor release. Removing or incompatibly changing it requires a major release.
Public Compatibility Boundary
Unless a document explicitly marks an interface experimental, the release version covers:
- documented interactive commands and
defcustomoptions; - documented public Elisp functions, including the
magent-actionextension API; - project-facing agent, skill, capability, permission, and Action definition
formats under
.magent/; - canonical tool names, arguments, approval behavior, and result contracts;
- supported session and Action persistence formats, including whether sessions created by an earlier release remain readable;
- documented agent-shell/ACP frontend behavior; and
- minimum supported Emacs and direct package dependency versions.
Increasing a minimum supported runtime or dependency version is a breaking
change. Internal symbols containing --, implementation details, tests,
benchmarks, and undocumented provider-adapter internals are not public API.
User-visible behavioral changes should still be recorded in CHANGELOG.org.
Commit Signals
Magent uses Conventional Commits as input to release decisions:
fix:normally indicates a patch change;feat:normally indicates a minor change;!or aBREAKING CHANGE:footer indicates a compatibility break;docs:,test:,ci:, andchore:do not require a release by themselves; andrefactor:is classified by its observable compatibility impact.
The actual public effect wins when a commit prefix and the change disagree.
Before 1.0.0, both compatible features and breaking changes increment the
minor component. From 1.0.0 onward, a breaking change increments the major
component.
Pre-releases
Prefer stable releases unless external testing is useful. When needed, use an Emacs-compatible SemVer suffix and keep it identical in the package header and tag, for example:
Package-Version: 0.3.0-pre.1 Git tag: v0.3.0-pre.1
Increment pre.1, pre.2, and so on. A pre-release is not a compatibility
promise for the associated final version. Do not use build metadata in package
versions unless its ordering and package-archive behavior have first been
validated.
Changelog Policy
- Every user-visible pull request adds a concise entry under
Unreleased. - Describe effects for users and extension authors, not commit mechanics.
- Put breaking changes first and label them
BREAKING. - At release time, rename the accumulated section to
X.Y.Z - YYYY-MM-DDand create a new emptyUnreleasedsection above it. - Do not rewrite the notes or artifacts of an existing release. Correct a released defect with a new version.
Release Procedure
Prepare the Release Pull Request
- Start from current
masterand create a release branch. - Confirm the intended version from all changes since the previous tag. For
the first formal release, use
0.2.0and treat0.1.0as the untagged development preview. - Update
Package-Versioninlisp/magent.el. - Finalize
CHANGELOG.org: move the relevantUnreleasedentries under the version and release date, and leave a freshUnreleasedsection. - Verify package requirements, the MELPA recipe,
source-files.txt, and bundled runtime data remain aligned. - From a clean checkout, run:
make clean make compile make lint make test
- Obtain green required CI for supported Emacs versions, coverage, MELPA packaging, ELPA dependency compatibility, and documentation.
- Merge the release pull request into
master. Do not tag a feature branch.
Tag and Publish
- Update the local
masterwith a fast-forward-only pull. - Verify that
Package-Version, the changelog release heading, and the intended tag agree. - Create an annotated tag; use a signed tag when signing is configured:
git tag -a v0.2.0 -m "Magent v0.2.0" git push origin v0.2.0
- Create the GitHub Release from that tag and copy the matching changelog section into the release notes.
- Verify that the release tag installs from a clean Emacs configuration and contains all production Elisp, prompts, and bundled skills.
Tags and published release artifacts are immutable. If a problem is found
after publication, fix it on master and publish a new patch release rather
than moving or replacing the tag.
1.0.0 Readiness
Publish 1.0.0 when maintainers are prepared to preserve the documented public
compatibility boundary: installation and supported frontend behavior are
reliable, the Action extension API and project formats are documented, and
persistence compatibility has an explicit policy. Reaching 1.0.0 is a
compatibility commitment, not a measure of feature count.