release-automationlisted
Install: claude install-skill agigante80/forge-kit
<!-- release-automation-version: 9 -->
# Release automation
Make the missing release impossible. The `release` skill is the *invoked* ship someone runs;
this is the *unattended* CI layer that runs without being invoked, so a merge to the production
branch with no version bump is **blocked** (or, where appropriate, auto-bumped), never silently
shipped. It is a generic template: `forge-adapt` tailors the production branch, the version
source, and the CI provider.
> **Composition, not duplication.** Semver rules and the version source live in
> `docs/versioning.md` and the `release` skill. This skill *enforces* them, it does not restate
> them. See `references/semver-operator-contract.md` and `references/source-of-truth.md`.
## The one mechanism: version vs latest tag
All lanes share a single primitive (`assets/version-lib.sh`) that compares the working-tree
version against the latest **released tag** (not the previous commit; the tag is the only truth
for "what is released") and prints one verdict:
| Verdict | Meaning | What a lane does with it |
|---|---|---|
| `first-release` | no release tag yet | allow |
| `ahead` | version > latest tag, already bumped deliberately | **ship as-is, never re-bump** |
| `equal` | version == latest tag, nobody bumped | the lane's policy decides (block, or auto-patch) |
| `behind` | version < latest tag, branch is stale | **hard stop (regression)** |
The `ahead`/`behind` handling is the load-bearing part: it is what stops a naive "always