Step 1 · Pre-Release Check
Goal
Verify that the codebase is in a shippable state before creating a release. Catch everything that would embarrass the team or break users before it reaches production.
Instructions
You are in workflow step 1 of the release-cycle. A release is being prepared. Your job is to run every quality gate and produce a go/no-go decision.
Tasks to Perform
1. Confirm the Release Scope
# What changes are included in this release?
git log [last-release-tag]..HEAD --oneline
# What is the correct version number?
# PATCH: bug fixes only → 1.2.3 → 1.2.4
# MINOR: new features, backward compatible → 1.2.3 → 1.3.0
# MAJOR: breaking changes → 1.2.3 → 2.0.0
2. Run the Full Test Suite
[full test runner command]
- [ ] All tests pass — zero failures, zero errors
- [ ] Test output is clean (no unexpected warnings)
If any test fails: STOP. This is not a go. Fix the failures before proceeding.
3. Run Static Analysis and Linting
[lint command]
[static analysis command if available]
- [ ] No lint errors
- [ ] No type errors (if typed language)
4. Run Security Checks
# Dependency vulnerability scan
npm audit --audit-level=high
composer audit
pip-audit
# or equivalent for your stack
# Hunt for secrets accidentally left in
grep -rn -E "(password|secret|token|api.?key)\s*[=:]\s*['\"][^'\"]{8,}" \
--include="*.{php,js,ts,py,go,rb,json,yaml}" src/ | grep -v test | grep -v node_modules
# Confirm debug mode is off
grep -rn "APP_DEBUG.*true\|debug.*=.*true\|DEBUG.*=.*1" .env .env.production 2>/dev/null
- [ ] No critical or high severity vulnerabilities in dependencies
- [ ] No secrets in source code
- [ ] Debug mode is disabled for production
5. Verify the Changelog
cat CHANGELOG.md | head -50
- [ ]
[Unreleased]section exists and is non-empty - [ ] Every user-facing change is described clearly
- [ ] Breaking changes are explicitly labelled with
BREAKING: - [ ] No entries reference internal implementation details that mean nothing to users
6. Verify Documentation
- [ ]
README.mdreflects the current state of the project - [ ] Any new configuration variables are in
.env.example - [ ] Any new API endpoints are documented
- [ ] Any deprecated features carry a deprecation notice
7. Verify Pending Migrations
# Check if there are pending/unapplied migrations
[migration status command]
- [ ] Any required migrations are included in this release
- [ ] Migrations are safe to run during the deployment (no table locks, no data loss)
- [ ] Rollback (down) methods are defined for each migration
8. Final Review
# Full diff from last release to now
git diff [last-tag]..HEAD -- src/ | wc -l # line count
Do a final human-eye scan of the diff. Look for:
TODO,FIXME,HACKcomments in new code- Hard-coded values that should be configuration
- Any code that was clearly intended to be temporary
Go / No-Go Decision
| Check | Status |
|---|---|
| All tests pass | ✅ / ❌ |
| No lint errors | ✅ / ❌ |
| No dependency vulnerabilities | ✅ / ❌ |
| No secrets in code | ✅ / ❌ |
| Changelog complete | ✅ / ❌ |
| Documentation up to date | ✅ / ❌ |
| Migrations safe | ✅ / ❌ |
Decision: GO / NO-GO
Any ❌ is a NO-GO. Fix the item, re-run the check, flip it to ✅.
If any blocker is identified, add it to TODO.md with a source reference before stopping:
- [ ] fix: [blocking issue description] _(ref: workflows/release-cycle/01-pre-release-check.md)_
Status rules: [ ] = not started · [~] = in progress (one at a time) · [x] = done (prefix the date).
Exit Criteria
This step is complete when:
- [ ] All checks above show ✅
- [ ] GO decision is confirmed
- [ ] Ready to proceed to Step 2 (Release)