Guides
Local Release Gate
Komms development uses one long-lived local branch and one complete local release matrix. Feature work is not pushed merely to ask hosted CI whether it compiles. Publication, a draft pull request, and any hosted repetition happen only after the roadmap implementation is complete, local evidence is green, and the maintainer explicitly authorizes the remote action.
This policy reduces private-repository runner cost without weakening the test
bar. The commands are pinned in
scripts/local-release-matrix.sh.
1. Toolchains and platform prerequisites
The core and desktop Cargo workspaces require Rust 1.88 or newer. CI has a dedicated build-compatibility job at exactly 1.88; normal local work should use a current stable toolchain. The complete matrix also needs:
- nightly Rust with
cargo-fuzz, pluscargo-deny; - the desktop system libraries listed in
apps/desktop/README.md; - JDK 17 or newer and Gradle 8.14.3 for the Android host/core gate;
- Android SDK 35, an NDK,
cargo-ndk, and the configured Rust Android targets for APK/lint; - Swift 5.9 or newer for the iOS host/core gate; and
- full Xcode, XcodeGen, and the configured Rust Apple targets for the unsigned iOS Simulator application gate.
The platform READMEs are authoritative for individual build commands. Missing optional platform SDKs become explicit deferrals; missing tools for a gate that the current release requires are failures.
2. Complete local matrix
The script runs:
- workspace formatting, all-target/all-feature warnings-as-errors clippy, all
tests,
no_stdcrypto/protocol builds, andcargo-deny; - the desktop workspace's independent format, clippy, test, and deny gates;
- generated Kotlin UniFFI bindings plus the Android JVM/core two-node suite;
- generated Swift UniFFI bindings plus the iOS/macOS host two-node suite;
- Android APK/lint and the unsigned iOS Simulator application build when their complete SDKs are installed;
- every crypto and protocol fuzz target for 60 seconds, including C2 device records and C7 call-control/call-media parsers; and
- final Git whitespace and worktree review.
Run from the repository root:
scripts/local-release-matrix.shKOMMS_FUZZ_SECONDS may shorten a developer smoke pass, but the release record
uses the default 60 seconds. Set KOMMS_REQUIRE_ANDROID_APP=1 or
KOMMS_REQUIRE_IOS_APP=1 when that platform gate must fail rather than be
reported as deferred.
3. Deferred and external gates are explicit
A missing SDK is not a passing result. The script prints DEFERRED and keeps the
rest of the matrix running unless the matching KOMMS_REQUIRE_* flag is set.
The release handoff must list each deferred item with its reason. A host without
the Android SDK/NDK can still prove the generated bindings and JVM/core behavior;
a host without full Xcode can still run the Swift host/core suite. Per-push CI
also assembles a real Android debug APK, but that evidence neither changes a
local DEFERRED record nor substitutes for hands-on device qualification.
External evidence is outside this script and cannot be replaced by a green host test:
- the physical two-radio Meshtastic bench;
- real distinct-NAT/DCUtR and live-call network/audio-route matrices;
- hands-on Android/iOS accessibility, lifecycle, and device qualification;
- reproducible installer/store artifacts; and
- an independent security audit.
4. Hosted evidence
Hosted automation complements the local checkpoint:
.github/workflows/ci.ymlrepeats core/desktop format, lint, tests,no_std, dependency policy, fuzz smoke, generated Android/iOS host suites, MSRV 1.88, and Android debug-APK assembly;- the iOS Simulator job exists behind the
IOS_APP_CI=1repository variable so a maintainer can authorize the higher-cost macOS repetition; .github/workflows/audit.ymlruns weekly and on demand: advisories for both Cargo workspaces, core tests on macOS, and an informational coverage snapshot; and.github/workflows/hil-nightly.ymlremains dormant until a trustedmeshtastic-hilbench is online andHIL_BENCH=armed.
A green build is evidence for the exact commit and environment it ran on. It is not evidence for unsigned code from another commit, a physical device path that was not exercised, or one of the external gates above.
5. Version, packaging, and signing boundary
All current build surfaces report 0.1.0: the Cargo workspace and desktop
crate, Tauri bundle, Android versionName, and iOS short version. This alignment
does not make 0.1.0 a supported binary release.
- Desktop bundle targets and platform icon files are configured for Linux, macOS, and Windows. No certificate, notarization credential, package-repository signature, or updater endpoint is configured.
- Android release signing is conditional. A maintainer may supply the
git-ignored
apps/android/keystore.propertiesfile or theKOMMS_ANDROID_KEYSTORE*environment variables described in the Android README. Without them, release builds remain unsigned and debug/CI builds are unchanged. - The iOS gate builds an unsigned Simulator application. App Store signing, provisioning, notarized distribution, and store metadata are not configured.
Signing keys and credentials never enter the repository. Reproducible signed artifacts, store/package-manager publication, provenance, and update-channel policy remain M6 work and must not be implied by the existing scaffolds.
6. Publication discipline
Before any remote action:
- record the exact branch and commit;
- preserve the local matrix results and deferred-gate list;
- confirm the worktree contains only intentional changes;
- obtain explicit authorization to push/open a pull request; and
- separately obtain explicit authorization before merge.
Do not create repeated fixup pushes to use hosted CI as an interactive compiler. If a final hosted run is authorized, push the already-green local checkpoint once, cancel obsolete duplicate runs, and treat remote-only failures as new local reproduction work before another publication attempt.