| name | release-readiness-gate |
| description | Use when preparing releases with versioning, changelog, artifacts, smoke tests, tags, and go/no-go.
Triggers: |
| practices | ["pragmatic-programmer"] |
| skill_api_version | 1 |
| user-invocable | false |
| hexagonal_role | supporting |
| context | {"window":"inherit","intent":{"mode":"task"}} |
| metadata | {"tier":"execution","stability":"stable","category":"engineering-quality","maturity":"source","clean_room":true,"owner":"agentops","dependencies":[],"primary_artifacts":["release-readiness report","signed release artifacts","annotated version tag"]} |
| output_contract | release_readiness_report with sections: version, changelog, artifacts, smoke, gates, decision. |
Release Preparations
Use this skill to take a candidate build from "the work is merged" to a recorded
go / no-go decision, by running a fixed pre-release sequence and capturing
evidence at each step. The deliverable is a release-readiness report, not a vibe.
⚠️ Critical Constraints
- Nothing leaves the building before the go decision. No tag push, no
artifact upload, no announcement until the decision section says GO.
Why: a release is irreversible in practice — users pull it, mirrors cache
it, downstreams pin it. Order is: decide, then publish.
- WRONG:
git push --tags && gh release create while smoke tests are running.
- CORRECT: gates green + smoke green → record GO → then tag and publish.
- The version comes from the change set, not the calendar. Read what changed
and apply semver: breaking → MAJOR, feature → MINOR, fix-only → PATCH.
Why: a PATCH that hides a breaking change silently breaks every consumer
who trusted the number when they pinned it.
- WRONG: bumping
1.4.3 → 1.4.4 for a release that removed a CLI flag.
- CORRECT:
1.4.3 → 2.0.0 because a public flag was removed.
- Build and tag from a clean, committed tree. No uncommitted edits, no local
patches in the artifact. Why: an artifact built from a dirty tree is
unreproducible — you can never rebuild the exact bytes you shipped.
- WRONG:
git status shows modified files, build anyway.
- CORRECT: tree clean at the candidate commit, then build.
- Every readiness claim cites a command + exit code. "Tests pass" is not
evidence;
go test ./... → exit 0 is. Why: self-report skims; the gate is
the source of truth, and the report must be re-verifiable by the next person.
Why This Exists
Releases fail not because the code was wrong but because a step was skipped under
the pressure of shipping: the version got bumped wrong, the changelog lagged, the
artifact was built dirty, a gate was assumed green. Each skip is invisible until
a user hits it. This skill makes the pre-release sequence the same every time, so
the decision rests on evidence and the failure modes are caught before publish,
not after. It is the discipline that turns "I think it's ready" into "here is why
it is ready, step by step."
Quick Start
git status --porcelain
git --oneline LAST_TAG..HEAD
bash scripts/validate.sh