Version: 1.0.0 Created: 2025-12-15 (W18.1) Purpose: Prevent post-release hotfixes by validating releases locally before publication
This checklist ensures releases are validated before publication, preventing post-release hotfixes like those required for v0.3.0 (4 emergency hotfixes due to missing pre-release validation).
Key Lessons from v0.3.0:
| Issue | Root Cause | Prevention |
|---|---|---|
| Clippy errors in CI | --all-targets not run locally |
Phase 1 validation |
| SIGILL crash | target-cpu=native in CI |
Phase 2 CI simulation |
| 40+ min runtime | 36,600 proptest cases | Environment variables |
| 60s+ test hang | 10,000 vectors in tests | NUM_VECTORS control |
For experienced maintainers, run the automated validation:
./scripts/pre-release-check.shIf ALL checks pass, proceed to Phase 5 (Branch-Based Release).
| Platform | Requirement |
|---|---|
| Linux | Native execution |
| macOS | Native execution |
| Windows | WSL required (Windows Subsystem for Linux) |
Windows Users: The pre-release script requires bash. Install WSL:
wsl --installThen run the script from within WSL:
wsl
cd /mnt/c/path/to/edgevec
./scripts/pre-release-check.shRun these checks in your development environment:
# 1. Formatting check
cargo fmt -- --check
# 2. Clippy with ALL targets (catches test/bench issues)
cargo clippy --all-targets -- -D clippy::correctness -W clippy::suspicious -W clippy::style
# 3. Documentation (no warnings)
cargo doc --no-deps 2>&1 | grep -c "warning" && echo "WARN: Doc warnings found" || echo "OK: Docs clean"Checklist:
-
cargo fmt -- --checkpasses -
cargo clippy --all-targetspasses with no errors -
cargo doc --no-depsproduces no warnings
This phase prevents SIGILL crashes and timeout issues.
Set environment variables to match CI configuration:
# CI-equivalent environment variables
export RUSTFLAGS="-C target-cpu=x86-64-v2"
export PROPTEST_CASES=32
export NUM_VECTORS=1000
# Run test suite
time cargo test --allVerify:
- All tests pass
- Test suite completes in < 15 minutes
- No SIGILL or illegal instruction errors
- No timeout or hanging tests
Why these values?
| Variable | CI Value | Local Default | Purpose |
|---|---|---|---|
RUSTFLAGS |
-C target-cpu=x86-64-v2 |
native | Prevents SIGILL on CI runners |
PROPTEST_CASES |
32 | 256 | Reduces proptest runtime |
NUM_VECTORS |
1000 | 10000 | Reduces integration test vectors |
# Check WASM target compilation
cargo check --target wasm32-unknown-unknown
# Build WASM package
wasm-pack build --release
# Verify bundle size
ls -la pkg/edgevec_bg.wasm
# Should be < 500KBChecklist:
-
cargo check --target wasm32-unknown-unknownpasses -
wasm-pack build --releasesucceeds - Bundle size < 500KB
These dry runs catch packaging issues before publication.
# Cargo publish dry run
cargo publish --dry-run
# NPM pack dry run
cd pkg
npm pack --dry-run
cd ..Checklist:
-
cargo publish --dry-runsucceeds -
npm pack --dry-runsucceeds - No missing files in package
Never release directly from main. Always use a release branch.
# Create release branch
git checkout -b release/vX.Y.Z
# Verify you're on the release branch
git branch --show-current
# Should output: release/vX.Y.Z# Edit Cargo.toml version
# Edit pkg/package.json version
# Edit CHANGELOG.md (move Unreleased to vX.Y.Z)
# Commit version bump
git add -A
git commit -m "chore: bump version to vX.Y.Z"# Push release branch
git push -u origin release/vX.Y.Z
# Wait for ALL CI checks to pass
# DO NOT PROCEED until CI is greenChecklist:
- CI is green on release branch
- All workflow jobs completed successfully:
buildjob (all platforms)testjob (unit, integration, proptest)clippyjob (lint checks)wasmjob (WASM build + browser tests)
- No warnings in CI logs
- Test duration < 15 minutes (watch for timeout issues)
# Merge release branch to main
git checkout main
git pull origin main
git merge release/vX.Y.Z
# Push merged main
git push origin main# Create annotated tag
git tag -a vX.Y.Z -m "Release vX.Y.Z"
# Push tag (triggers release workflow)
git push origin vX.Y.Z# Final verification
cargo publish --dry-run
# Publish (requires authentication)
cargo publishcd pkg
# Final verification
npm pack --dry-run
# Publish (requires OTP)
npm publish
cd ..- Go to GitHub Releases
- Click "Draft a new release"
- Select tag:
vX.Y.Z - Title:
EdgeVec vX.Y.Z - Body: Copy from CHANGELOG.md
- Attach any relevant assets
- Click "Publish release"
Verify the release is accessible and functional.
# Check crates.io page
curl -s https://crates.io/api/v1/crates/edgevec | jq '.crate.max_version'
# Should return "X.Y.Z"
# Test installation
cargo new /tmp/test-edgevec && cd /tmp/test-edgevec
echo 'edgevec = "X.Y.Z"' >> Cargo.toml
cargo build# Check npm page
npm view edgevec version
# Should return "X.Y.Z"
# Test installation
npm init -y
npm install edgevec@X.Y.Z- CI remains green on main
- No new issues reported
- Documentation site updated (if applicable)
If critical issues are discovered post-release, see:
- ROLLBACK_PROCEDURES.md for detailed rollback instructions
Quick Reference:
| Scenario | Action | Command |
|---|---|---|
| Bad crates.io release | Yank version | cargo yank --version X.Y.Z |
| Bad npm release | Deprecate | npm deprecate edgevec@X.Y.Z "reason" |
| CI broken after merge | Revert commit | git revert <sha> |
For convenience, use the pre-release check script:
./scripts/pre-release-check.shThis runs Phases 1-4 automatically and reports any failures.
-
cargo fmt -- --checkpasses -
cargo clippy --all-targetspasses -
cargo doc --no-depshas no warnings - CI simulation passes (with env vars)
- WASM build succeeds
- Bundle size < 500KB
-
cargo publish --dry-runsucceeds -
npm pack --dry-runsucceeds
- Release branch created
- Version numbers updated
- CI green on release branch
- Merged to main
- Tag pushed
- crates.io accessible
- npm installable
- GitHub release created
- CI green on main
| Version | Date | Change |
|---|---|---|
| 1.0.0 | 2025-12-15 | Initial release (W18.1) |
| 1.1.0 | 2025-12-15 | Added Windows/WSL docs, clarified CI checks (hostile review fixes) |
Maintainer: EdgeVec Team Last Updated: 2025-12-15