From 28a9a245ef3b32de87b437e137e06c627a0bb37f Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:18:10 -0500 Subject: [PATCH 1/2] docs(changelog): prepare v0.1.0 release notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Promote [Unreleased] to [0.1.0] — 2026-07-16 and retitle the 2026-05-01 section to [0.1.0-rc1], matching the only tag that actually exists. The rc1 tag was an internal team-share and never published, so v0.1.0 ships everything; the [0.1.0] section documents the rc1 → final delta and the Breaking preamble now explains why these ship in 0.1.0 rather than a MINOR bump. Co-Authored-By: Claude Fable 5 Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- CHANGELOG.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd1e603..8f07629 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,24 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +### Changed + +### Removed + +### Fixed + +## [0.1.0] — 2026-07-16 + +First published release (Maven Central). Everything under [0.1.0-rc1] below is included; the +sections here cover the rc cycle — changes between `v0.1.0-rc1` and `v0.1.0`. + ### Breaking -Pre-1.0 policy: breaking changes ship in a MINOR bump (0.2.0). Nothing below has ever been -published to Maven Central (0.1.0 was tagged `rc1` only), so these break no external consumer. +Breaking relative to the unpublished `v0.1.0-rc1` tag only. Pre-1.0 policy would put breaking +changes in a MINOR bump (see `docs/versioning.md`), but nothing has ever been published to +Maven Central, so these break no external consumer and ship in 0.1.0. - **`RadioClient.close()` / `AutoCloseable` removed** — the blocking bridge (`runBlocking { disconnect() }`) was an ANR/deadlock trap on Android and iOS main threads. @@ -94,9 +108,10 @@ published to Maven Central (0.1.0 was tagged `rc1` only), so these break no exte - **docs(SPEC.md):** Bumped spec from v2.1 to v2.2 — full post-audit sync aligning spec with shipped implementation. Key areas synchronized: AdminApi expansion (~15 → ~45 methods), `StoreForwardApi`, presence tracking (`WentOffline`/`CameOnline`), `AutoReconnectConfig`, `CongestionWarning`/`ExternalConfigChange`/`StorageDegraded` MeshEvent variants, send DSL, `connectAndAwaitReady()`, `SessionPasskey`, `ConfigBundle.deviceUIConfig`, `SendFailure.IdCollision`/`AckTimeout`/`HandshakeFailed`, `AdminResult` extensions, `ConnectionState` extensions, `MeshtasticException` context fields, convention plugin + version catalog correction (JVM 17→21, Android SDK→36, Kotlin 2.3.20). - **docs:** Synchronized `api-reference.md`, `error-taxonomy.md`, `roadmap.md`, `module-graph.md`, `README.md`, `CONTRIBUTING.md` with spec v2.2 changes. -## [0.1.0] — 2026-05-01 +## [0.1.0-rc1] — 2026-05-01 -Initial release of the Meshtastic Kotlin Multiplatform SDK. +Initial release candidate of the Meshtastic Kotlin Multiplatform SDK (internal team-share; +never published to Maven Central). ### Highlights From 59b43c53191a4ed5ce8ee6b3a03c047644f24451 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:18:10 -0500 Subject: [PATCH 2/2] ci(release): document rc tags as dispatch-only; sync runbook with live workflows The release workflow's tag pattern v[0-9]+.[0-9]+.[0-9]+ never matched -rcN suffixes, so pushing v0.1.0-rc1 silently published nothing. Keep stable-only auto-publish (Maven Central is immutable; rc publishes should be explicit) and document the workflow_dispatch path for rcs, in release.yml comments and a new runbook section. Also drop the stale 'all workflows are .yml.disabled' runbook note (ci/release/docs workflows are live), align the tag command with the signed-tag convention (-s), and correct the publish task name to publishAndReleaseToMavenCentral per docs/ci-cd.md. Co-Authored-By: Claude Fable 5 Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- .github/workflows/release.yml | 11 ++++++--- docs/release-runbook.md | 43 ++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a67361a..5c8f552 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,8 +3,10 @@ name: Release # Release pipeline. See docs/release-runbook.md. # # Triggers: -# - Tag push (vX.Y.Z) — automatic publish. -# - workflow_dispatch — manual fallback / dry-run support. +# - Tag push (vX.Y.Z, stable only) — automatic publish. +# - workflow_dispatch — manual fallback, dry-runs, and pre-release tags +# (vX.Y.Z-rcN). Pre-release tags deliberately do NOT auto-publish; see +# docs/release-runbook.md §Release candidates. # # Pre-flight (done before tagging): # - main is green @@ -14,11 +16,14 @@ name: Release on: push: tags: + # Stable tags only. A vX.Y.Z-rcN tag does NOT match and will not publish — + # publish rcs via workflow_dispatch instead (v0.1.0-rc1 once silently + # did nothing because of this pattern; the exclusion is now intentional). - 'v[0-9]+.[0-9]+.[0-9]+' workflow_dispatch: inputs: version: - description: 'Release version (e.g. 0.1.0). Must match a pushed tag vX.Y.Z.' + description: 'Release version (e.g. 0.1.0 or 0.1.0-rc2). Must match a pushed tag vX.Y.Z or vX.Y.Z-rcN.' required: true type: string dry_run: diff --git a/docs/release-runbook.md b/docs/release-runbook.md index c8d2fdc..c7daab9 100644 --- a/docs/release-runbook.md +++ b/docs/release-runbook.md @@ -83,10 +83,11 @@ git commit -s -m "docs(changelog): prepare vX.Y.Z release notes" ## Tag and push -axion-release derives the version from the most recent annotated tag: +axion-release derives the version from the most recent annotated tag. Tags +are signed (the Release workflow header documents the same convention): ```bash -git tag -a vX.Y.Z -m "vX.Y.Z" +git tag -s vX.Y.Z -m "vX.Y.Z" git push origin main --tags ``` @@ -95,21 +96,37 @@ suffix) on the tagged commit. ## Publish -Stable releases publish via the manual `release` workflow in -[`.github/workflows/`](../.github/workflows/) — trigger it via -`gh workflow run release.yml -f version=X.Y.Z` or the GitHub Actions UI. +Pushing a stable `vX.Y.Z` tag triggers the `release` workflow in +[`.github/workflows/release.yml`](../.github/workflows/release.yml) +automatically. `workflow_dispatch` remains as a manual fallback and +dry-run path — `gh workflow run release.yml -f version=X.Y.Z +[-f dry_run=true]` or the GitHub Actions UI. -> **Currently disabled.** All workflows are suffixed `.yml.disabled` for -> the internal 0.1.0 team-share; until they're re-enabled, run the -> publish steps locally (`./gradlew publish`) per the workflow's -> intended sequence below. +### Release candidates + +The tag-push trigger matches **stable tags only** — pushing a `vX.Y.Z-rcN` +tag does not start the workflow. This is deliberate: Maven Central is +immutable, so pre-release publishes should be an explicit act, not a tag +side-effect. (`v0.1.0-rc1` was pushed expecting auto-publish and silently +did nothing; the exclusion is now documented rather than accidental.) + +To publish an rc, push the tag and dispatch the workflow with the rc +version: + +```bash +gh workflow run release.yml -f version=X.Y.Z-rcN +``` + +The workflow's "Verify version matches tag" step confirms axion resolves +the rc tag to `X.Y.Z-rcN`; if it does not, the run fails before anything +is published. The workflow: -1. Re-runs `./gradlew check`. -2. Runs `./gradlew publishAggregationToCentralPortal` (per - [`docs/ci-cd.md`](ci-cd.md)). -3. Promotes the staged release on Sonatype Central Portal. +1. Builds all artifacts (`./gradlew assemble`) and re-runs `./gradlew check`. +2. Runs `./gradlew publishAndReleaseToMavenCentral` (per + [`docs/ci-cd.md`](ci-cd.md)), which publishes and promotes the release + on Sonatype Central Portal. Snapshot releases publish automatically on every push to `main` — no manual step needed.