|
| 1 | +# Release Plan |
| 2 | + |
| 3 | +Release process for `rustyfarian-network`. |
| 4 | +Covers versioning, pre-flight checks, publish targets, and post-release steps. |
| 5 | + |
| 6 | +## Versioning |
| 7 | + |
| 8 | +- **Scheme:** SemVer (pre-1.0 — minor bumps signal breaking changes) |
| 9 | +- **Lockstep:** all 13 workspace crates move together at the same version |
| 10 | +- **Snapshot convention:** none (we tag the release commit, no `-SNAPSHOT` between releases) |
| 11 | +- **Who decides version:** maintainer, based on `CHANGELOG.md` `[Unreleased]` content |
| 12 | + |
| 13 | +## Branch and Tag Convention |
| 14 | + |
| 15 | +- **Release branch:** `prepare-release` → merged to `main` after publish |
| 16 | +- **Tag format:** `vX.Y.Z` (annotated) |
| 17 | +- **Tagging:** manual on the release commit on `main` |
| 18 | + |
| 19 | +## Pre-flight Checklist |
| 20 | + |
| 21 | +Before any release: |
| 22 | +- [ ] Working tree clean on `prepare-release` (untracked `review-queue/` is OK) |
| 23 | +- [ ] `just fmt` clean |
| 24 | +- [ ] `just verify` passes (fmt-check + cargo deny + check + clippy) |
| 25 | +- [ ] `just test` passes (all pure-crate host tests) |
| 26 | +- [ ] At least one hardware example builds via `just build-example <name>` for each tier touched (sanity check; not exhaustive) |
| 27 | +- [ ] `cargo audit` shows no new advisories beyond those allow-listed in `deny.toml` |
| 28 | +- [ ] `CHANGELOG.md` `[Unreleased]` has entries for the target version |
| 29 | +- [ ] All 13 crates' `version = "X.Y.Z"` in `crates/*/Cargo.toml` are consistent |
| 30 | + |
| 31 | +## Version Bump |
| 32 | + |
| 33 | +Files to update when bumping the version: |
| 34 | +- `crates/espnow-pure/Cargo.toml` — `version` |
| 35 | +- `crates/lora-pure/Cargo.toml` — `version` |
| 36 | +- `crates/ota-pure/Cargo.toml` — `version` |
| 37 | +- `crates/wifi-pure/Cargo.toml` — `version` |
| 38 | +- `crates/rustyfarian-network-pure/Cargo.toml` — `version` |
| 39 | +- `crates/rustyfarian-esp-hal-lora/Cargo.toml` — `version` |
| 40 | +- `crates/rustyfarian-esp-hal-ota/Cargo.toml` — `version` |
| 41 | +- `crates/rustyfarian-esp-hal-wifi/Cargo.toml` — `version` |
| 42 | +- `crates/rustyfarian-esp-idf-espnow/Cargo.toml` — `version` |
| 43 | +- `crates/rustyfarian-esp-idf-lora/Cargo.toml` — `version` |
| 44 | +- `crates/rustyfarian-esp-idf-mqtt/Cargo.toml` — `version` |
| 45 | +- `crates/rustyfarian-esp-idf-ota/Cargo.toml` — `version` |
| 46 | +- `crates/rustyfarian-esp-idf-wifi/Cargo.toml` — `version` |
| 47 | + |
| 48 | +Post-release bump target: none (next-version bump happens when the next `[Unreleased]` block is finalised) |
| 49 | + |
| 50 | +## Publish |
| 51 | + |
| 52 | +**Target registry:** none — tag-only on GitHub |
| 53 | +**Publish command:** `git push origin main --follow-tags` |
| 54 | +**Credentials:** standard GitHub push credentials (no registry tokens needed) |
| 55 | +**Signing:** not required (commit / tag GPG signing optional, follow whatever git is already configured to do) |
| 56 | + |
| 57 | +## Changelog |
| 58 | + |
| 59 | +**Location:** `CHANGELOG.md` |
| 60 | +**Format:** Keep a Changelog 1.1.0 |
| 61 | +**Process:** rename `## [Unreleased]` to `## [X.Y.Z] - YYYY-MM-DD`; create a fresh empty `## [Unreleased]` block above it for next cycle |
| 62 | + |
| 63 | +## GitHub Release |
| 64 | + |
| 65 | +- [ ] Create release page at: `https://github.com/datenkollektiv/rustyfarian-network/releases/new` |
| 66 | +- [ ] Use tag `vX.Y.Z` |
| 67 | +- [ ] Title: `vX.Y.Z` |
| 68 | +- [ ] Body: paste the `## [X.Y.Z]` section from `CHANGELOG.md` |
| 69 | +- [ ] No artifact attachments (workspace is library crates; users consume via git dep) |
| 70 | + |
| 71 | +## Post-release Steps |
| 72 | + |
| 73 | +- [ ] Merge `prepare-release` → `main` (fast-forward) |
| 74 | +- [ ] Update `docs/ROADMAP.md` if any items shipped in this release are still listed as in-progress |
| 75 | +- [ ] Verify the GitHub release page is publicly visible and the tag resolves |
| 76 | + |
| 77 | +## Rollback Procedure |
| 78 | + |
| 79 | +If a release must be retracted after tagging: |
| 80 | +1. Delete remote tag: `git push --delete origin vX.Y.Z` |
| 81 | +2. Delete local tag: `git tag -d vX.Y.Z` |
| 82 | +3. Delete the GitHub release page (via web UI or `gh release delete vX.Y.Z`) |
| 83 | +4. Revert the release commit on `main`: `git revert <release-commit-sha>` and push |
| 84 | + |
| 85 | +Note: because nothing is published to a registry, rollback is fully reversible. |
| 86 | + |
| 87 | +## Release Record Location |
| 88 | + |
| 89 | +Each release produces files in `release/`: |
| 90 | +1. `YYYY-MM-DD-<version>-preflight.md` — pre-flight assessment |
| 91 | +2. `YYYY-MM-DD-<version>-plan.md` — ordered execution plan |
| 92 | +3. `YYYY-MM-DD-<version>-record.md` — what was published and what remains |
0 commit comments