7.6 KiB
Meshtastic Android (KMP) Constitution
Core Principles
I. Kotlin Multiplatform Core
Business logic MUST reside exclusively in commonMain source sets. KMP-equivalent libraries
MUST be used in place of JVM/Android-specific APIs:
- MUST use Okio (not
java.io), Ktor (notjava.net/OkHttp in common), Mutex/atomicfu (notjava.util.concurrent), Room KMP, DataStore KMP, and Koin 4.2+. - MUST NOT import
java.*orandroid.*in anycommonMainmodule. - Platform-specific implementations belong in
androidMain/desktopMainactual declarations only. - Rationale: The project goal is multi-platform parity (Android, Desktop, iOS). Framework
bleed in
commonMainbreaks compilability on non-Android targets and undermines the entire decoupling effort.
II. Zero Lint Tolerance
All code contributions MUST pass static analysis before merge:
./gradlew spotlessApplyMUST be run andspotlessCheckMUST pass with no violations.detektMUST pass with no new violations introduced.- A task or PR is considered incomplete if either check fails.
- Rationale: Consistent code style and static analysis gates prevent technical debt accumulation and catch bugs that tests alone miss.
III. Compose Multiplatform UI
All UI MUST use JetBrains Compose Multiplatform, not Android-only Jetpack Compose APIs:
- MUST use
MeshtasticNavDisplayandNavigationBackHandlerfor navigation across all entry points. - Floats MUST be pre-formatted using
NumberFormatter.format()before display in any composable. - UI MUST compile and render correctly on all supported targets (Android, Compose Desktop).
- Rationale: Compose Multiplatform ensures UI consistency across platforms and enforces the project's multi-platform architecture goal.
IV. Privacy First
The application handles sensitive mesh network data; user privacy MUST be protected at all times:
- MUST NOT log or expose PII, location data, or cryptographic keys in logs, crash reports, or any debug output.
- Secrets MUST be git-ignored and MUST NOT be committed to the repository under any circumstances.
core/protois a read-only upstream submodule (meshtastic/protobufs). MUST NOT modify.protofiles directly; proto changes require an upstream issue labeledupstream.- Rationale: Meshtastic users rely on the mesh for private, off-grid communications. Data leaks could endanger users in sensitive or adversarial deployments.
V. Design Standards Compliance
All user-facing UI MUST conform to the Meshtastic Client Design Standards:
- The canonical reference lives at:
https://raw.githubusercontent.com/meshtastic/design/refs/heads/master/standards/meshtastic_design_standards_latest.md - New screens and significant UI changes MUST be reviewed against the design standards before merge.
- Deviations from the design standards require explicit justification in the PR description with a rationale for why the standard cannot or should not be followed.
- Rationale: Consistent cross-platform UX across Android, iOS, and other clients ensures users have a predictable experience regardless of platform. The design standards are maintained collaboratively across all Meshtastic client teams.
VI. Verify Before Push
Local verification MUST complete successfully before any git push:
- MUST run
./gradlew spotlessApply spotlessCheck detektplus relevant module:testtasks for all modules touched. - After pushing, CI status MUST be confirmed via
gh pr checks <PR>orgh run list --branch <branch> --limit 5. Phrases like "CI should be green" are explicitly prohibited. - Rationale: CI has failed repeatedly due to skipped local checks. Verification is a hard gate, not an optimistic assumption.
Development Workflow
The following workflow steps are non-negotiable for all contributors and agents:
- Bootstrap First: The mandatory bootstrap steps in
.skills/project-overview/SKILL.mdMUST be executed before any build operation in a new session. - Baseline Verification: Before any PR is opened or pushed, run:
./gradlew spotlessApply spotlessCheck detekt assembleDebug test allTests - String Resources: After adding any string resource, run
python3 scripts/sort-strings.pyto maintain alphabetical organization and regeneratestrings-index.txt. Consultstrings-index.txtbefore reading large string files. - Memory Persistence:
.agent_memory/session_context.mdMUST be updated at the end of every agent session or major task to preserve context across sessions. - Plan Before Execution: Complex refactors MUST have a plan written in
.agent_plans/(git-ignored) before execution begins. - Context Discipline: Agents MUST NOT read binary files (PNG, MP3, etc.) or vacuum the entire codebase for localized fixes. Limit context reads to relevant modules.
Architecture Constraints
The following module boundaries and technology choices are fixed for this project:
- KMP Modules:
core:domain(business logic),core:data(repositories),core:database(Room KMP),core:datastore(preferences),core:network(Ktor),core:ble(Kable multiplatform BLE). - State Management: Unidirectional Data Flow (UDF) with ViewModels, Kotlin Coroutines,
and Flow. No reactive frameworks other than Coroutines/Flow in
commonMain. - Dependency Injection: Koin 4.2+ with Koin Annotations and the K2 Compiler Plugin. No alternative DI framework may be introduced.
- Navigation: JetBrains Navigation 3 for multiplatform routing with RESTful deep
linking. All navigation MUST use
MeshtasticNavDisplay. - Data Protocol: Protobuf for device communications (read-only upstream submodule). Room KMP for local persistence. DataStore for user preferences.
- Language & Toolchain: Kotlin 2.3+ targeting JDK 21. Java source files MUST NOT be introduced in KMP modules.
Governance
This constitution supersedes all other practices, coding guidelines, and agent instructions.
AGENTS.md is the authoritative source of truth. The files
.github/copilot-instructions.md, CLAUDE.md, and GEMINI.md MUST redirect to
AGENTS.md and MUST NOT diverge from it.
Amendment Procedure:
- Propose the amendment with rationale and a migration plan in a PR description.
- Update
AGENTS.mdand this constitution atomically in the same commit. - Increment
CONSTITUTION_VERSIONper the versioning policy below. - All PRs and code reviews MUST verify compliance with the current constitution version.
Versioning Policy:
- MAJOR: Backward-incompatible principle removal or fundamental redefinition.
- MINOR: New principle or section added, or materially expanded guidance.
- PATCH: Clarifications, wording fixes, or non-semantic refinements.
Compliance Review: Every implementation plan and PR description MUST include a Constitution Check confirming all six principles were evaluated. Complexity violations require explicit justification in the Complexity Tracking table of the plan document.
Version: 1.1.1 | Ratified: 2026-05-07 | Last Amended: 2026-05-08