Android application for Meshtastic
This report summarizes scanner evidence for meshtastic/Meshtastic-Android, a Kotlin project with 1,900 GitHub stars. SynthScan examined 738,060 lines of code across 4670 source files, recording 428 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 2.0 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 161 finding(s).
Are imports declared and package/API names verified? 71 finding(s).
Are wrappers, guards, and repeated structures necessary? 204 finding(s).
Which changes need focused human review? 428 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 428 distinct pattern matches across 16 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …n/kotlin/org/meshtastic/schemastrings/SchemaCatalog.kt | 125 | val jar = File(FieldMetadataRegistry::class.java.protectionDomain.codeSource.location.toURI()) | CODE |
| CRITICAL | …in/org/meshtastic/core/ui/component/NodeItemCompact.kt | 543 | val nowSeconds = org.meshtastic.core.common.util.nowSeconds.toInt() | CODE |
| CRITICAL | …in/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt | 149 | androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult(), | CODE |
| CRITICAL | …in/kotlin/org/meshtastic/core/ui/util/PlatformUtils.kt | 206 | androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult(), | CODE |
| CRITICAL | …in/org/meshtastic/core/takserver/TAKMeshIntegration.kt | 374 | val protoBytes = org.meshtastic.proto.TAKPacketV2.ADAPTER.encode(takPacketV2) | CODE |
| CRITICAL | …tlin/org/meshtastic/core/network/radio/MockScenario.kt | 516 | wb.latitude_i = org.meshtastic.core.model.Position.degI(latitude) | CODE |
| CRITICAL | …tlin/org/meshtastic/core/network/radio/MockScenario.kt | 517 | wb.longitude_i = org.meshtastic.core.model.Position.degI(longitude) | CODE |
| CRITICAL | …stic/core/service/ConversationShortcutPublisherTest.kt | 224 | androidx.core.content.pm.ShortcutInfoCompat.Builder(context, id) | CODE |
| CRITICAL | …stic/core/service/ConversationShortcutPublisherTest.kt | 228 | androidx.core.content.pm.ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) | CODE |
| CRITICAL | …eshtastic/core/data/repository/PacketRepositoryImpl.kt | 598 | org.meshtastic.core.model.util.getShortDateTime( | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 535 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 569 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = nodeInfo.num) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 596 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = firstNode.num) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 622 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 864 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 1052 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 1080 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …tic/core/data/manager/MeshConfigFlowManagerImplTest.kt | 1109 | val testNode = org.meshtastic.core.testing.TestDataFactory.createTestNode(num = 100) | CODE |
| CRITICAL | …/meshtastic/core/data/manager/CommandSenderImplTest.kt | 538 | val sent = org.meshtastic.proto.Position.ADAPTER.decode(decoded.payload) | CODE |
| CRITICAL | …/meshtastic/core/data/manager/CommandSenderImplTest.kt | 552 | val sent = org.meshtastic.proto.Position.ADAPTER.decode(requireNotNull(packets.single().decoded).payload) | CODE |
| CRITICAL | …/meshtastic/core/data/manager/CommandSenderImplTest.kt | 656 | org.meshtastic.proto.Config.PositionConfig.Builder() | CODE |
| CRITICAL | …in/usecase/settings/ProcessRadioResponseUseCaseTest.kt | 228 | org.meshtastic.proto.Config.LoRaConfig.Builder().also { wb -> wb.use_preset = true }.build() | CODE |
| CRITICAL | …in/usecase/settings/ProcessRadioResponseUseCaseTest.kt | 256 | org.meshtastic.proto.ModuleConfig.MQTTConfig.Builder().also { wb -> wb.enabled = true }.build() | CODE |
| CRITICAL | …stic/feature/settings/radio/SchemaFieldCoverageTest.kt | 284 | val jar = File(FieldMetadataRegistry::class.java.protectionDomain.codeSource.location.toURI()) | CODE |
| CRITICAL | …ture/settings/radio/component/NetworkConfigItemList.kt | 342 | Config.NetworkConfig.ProtocolFlags.UDP_BROADCAST.value.inv() | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 753 | org.meshtastic.proto.ModuleConfig.MQTTConfig.Builder() | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 923 | RadioResponseResult.Error(org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached")) | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 968 | RadioResponseResult.Error(org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached")) | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 1784 | org.meshtastic.proto.ModuleConfig.MQTTConfig.Builder().also { wb -> wb.enabled = true }.build() | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 1895 | org.meshtastic.proto.ModuleConfig.TelemetryConfig.Builder() | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 1919 | RadioResponseResult.Error(org.meshtastic.core.resources.UiText.DynamicString("Fail")) | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 1941 | val failure = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 1960 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 2012 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 2090 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 2149 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 2272 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL | …tic/feature/settings/radio/RadioConfigViewModelTest.kt | 2357 | val maxRetransmit = org.meshtastic.core.resources.UiText.DynamicString("Max Retransmission Reached") | CODE |
| CRITICAL⚡ | …astic/feature/settings/debugging/DebugViewModelTest.kt | 212 | nodeRepository.setMyNodeInfo(org.meshtastic.core.testing.TestDataFactory.createMyNodeInfo(myNodeNum = 12345678)) | CODE |
| CRITICAL⚡ | …astic/feature/settings/debugging/DebugViewModelTest.kt | 218 | val before = org.meshtastic.core.common.util.nowInstant.toEpochMilliseconds() | CODE |
| CRITICAL⚡ | …astic/feature/settings/debugging/DebugViewModelTest.kt | 220 | val after = org.meshtastic.core.common.util.nowInstant.toEpochMilliseconds() | CODE |
| CRITICAL⚡ | …astic/feature/settings/debugging/DebugViewModelTest.kt | 224 | org.meshtastic.core.common.util.DateFormatter.formatShortDate(before), | CODE |
| CRITICAL⚡ | …astic/feature/settings/debugging/DebugViewModelTest.kt | 225 | org.meshtastic.core.common.util.DateFormatter.formatShortDate(after), | CODE |
| CRITICAL | …astic/feature/settings/debugging/DebugViewModelTest.kt | 249 | org.meshtastic.core.testing.TestDataFactory.createTestPacket( | CODE |
| CRITICAL | …astic/feature/settings/debugging/DebugViewModelTest.kt | 284 | val packet = org.meshtastic.core.testing.TestDataFactory.createTestPacket(from = 0xDEADBEEF.toInt(), to = -1) | CODE |
| CRITICAL | …astic/feature/settings/debugging/DebugViewModelTest.kt | 306 | org.meshtastic.core.testing.TestDataFactory.createTestNode( | CODE |
| CRITICAL | …astic/feature/settings/debugging/DebugViewModelTest.kt | 314 | val packet = org.meshtastic.core.testing.TestDataFactory.createTestPacket(from = 5, to = -1, relayNode = 0xAA) | CODE |
| CRITICAL | …astic/feature/settings/debugging/DebugViewModelTest.kt | 332 | val packet = org.meshtastic.core.testing.TestDataFactory.createTestPacket(from = 5, to = -1, relayNode = 0xF5) | CODE |
| CRITICAL | …stic/feature/firmware/FirmwareUpdateIntegrationTest.kt | 184 | FirmwareUpdateState.Error(org.meshtastic.core.resources.UiText.DynamicString("Transfer failed")), | CODE |
| CRITICAL | …/kotlin/org/meshtastic/feature/docs/ui/DocsPreviews.kt | 280 | org.meshtastic.feature.docs.model.DocPageContent( | CODE |
| CRITICAL | …rg/meshtastic/feature/node/detail/NodeDetailScreens.kt | 231 | val locationPermission = org.meshtastic.core.ui.util.rememberLocationPermissionState() | CODE |
| CRITICAL | …rg/meshtastic/feature/node/detail/NodeDetailScreens.kt | 232 | val openLocationSettings = org.meshtastic.core.ui.util.rememberOpenLocationSettings() | CODE |
| CRITICAL | …lin/org/meshtastic/feature/node/list/NodeListScreen.kt | 153 | val showToast = org.meshtastic.core.ui.util.rememberShowToastResource() | CODE |
| CRITICAL | …ain/kotlin/org/meshtastic/feature/messaging/Message.kt | 587 | org.meshtastic.feature.messaging.component.handleQuickChatAction( | CODE |
| CRITICAL | …App/src/main/kotlin/org/meshtastic/app/MainActivity.kt | 265 | org.meshtastic.app.map.node.NodeTrackMap( | CODE |
| CRITICAL | …App/src/main/kotlin/org/meshtastic/app/MainActivity.kt | 277 | org.meshtastic.app.map.traceroute.TracerouteMap( | CODE |
| CRITICAL | …App/src/main/kotlin/org/meshtastic/app/MainActivity.kt | 286 | org.meshtastic.app.map.discovery.DiscoveryMap(userLat, userLon, nodes, modifier) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 111 | // ── Constants ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 131 | // ── Public API ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 243 | // ── Main Content ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 288 | // ── Search Bar ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 331 | // ── Category Tabs ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 363 | // ── Emoji Grid ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 488 | // ── Grid Item Model ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 565 | // ── Cell Components ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 680 | // ── Skin Tone Popup ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 722 | // ── Frequency Tracking ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt | 762 | // ── Previews ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt | 58 | // ── JSON models (compact wire format) ────────────────────────────────────────── | COMMENT |
| MEDIUM | …kotlin/org/meshtastic/core/ui/emoji/EmojiRepository.kt | 71 | // ── Repository ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 94 | // ── Helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 159 | // ── updateLastReadMessage ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 320 | // ── updatePacketByKey ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 389 | // ── updateReactionByKey ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 503 | // ── applySFPPStatus ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 773 | // ── applySFPPStatusByHash ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ic/core/database/dao/PacketDaoAtomicTransactionTest.kt | 881 | // ── deleteMessagesAtomic ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/repository/AdminController.kt | 41 | // ── Local configuration ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/repository/AdminController.kt | 71 | // ── Remote configuration ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/repository/AdminController.kt | 116 | // ── Remote queries ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/repository/AdminController.kt | 139 | // ── Device lifecycle ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …tlin/org/meshtastic/core/repository/AdminController.kt | 159 | // ── Batch edit ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …n/org/meshtastic/core/takserver/TAKServerJvmTlsTest.kt | 147 | // ── helpers ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/org/meshtastic/core/takserver/TAKMeshIntegration.kt | 190 | // ── Send: TAK client → mesh ───────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/org/meshtastic/core/takserver/TAKMeshIntegration.kt | 381 | // ── Receive: mesh → TAK client ────────────────────────────────────────── | COMMENT |
| MEDIUM | …in/kotlin/org/meshtastic/core/takserver/TAKDefaults.kt | 77 | // ── Mesh-to-CoT (synthesized node contacts) ───────────────────────────────── | COMMENT |
| MEDIUM | …t/kotlin/org/meshtastic/core/takserver/XmlUtilsTest.kt | 24 | // ── xmlEscaped ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t/kotlin/org/meshtastic/core/takserver/XmlUtilsTest.kt | 62 | // ── geoChatSenderUid ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …t/kotlin/org/meshtastic/core/takserver/XmlUtilsTest.kt | 80 | // ── geoChatMessageId ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 65 | // ── Fakes ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 163 | // ── Helpers ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 190 | // ── Lifecycle tests ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 232 | // ── TAK-Talk strip preservation (regression) ──────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 265 | // ── Inbound mesh → TAK client (V1) ────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 326 | // ── Firmware gating ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 361 | // ── Outbound channel selection ─────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 410 | // ── Dropped-outcome discrimination (regression: #6583 self-test blind spot) ──────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 410 | // ── Dropped-outcome discrimination (regression: #6583 self-test blind spot) ──────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 446 | // ── GeoChat callsign enrichment ────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/takserver/TAKMeshIntegrationTest.kt | 472 | // ── Helpers ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …otlin/org/meshtastic/core/takserver/TAKDefaultsTest.kt | 28 | // ── toTakTeamName ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …otlin/org/meshtastic/core/takserver/TAKDefaultsTest.kt | 56 | // ── toTakRoleName ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …otlin/org/meshtastic/core/takserver/TAKDefaultsTest.kt | 89 | // ── toTakCallsign ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …otlin/org/meshtastic/core/takserver/TAKDefaultsTest.kt | 130 | // ── keepalive / idle timeout constants ───────────────────────────────────── | COMMENT |
| MEDIUM | …est/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt | 27 | // ── PLI round-trip ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt | 64 | // ── Chat round-trip ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt | 88 | // ── XML escaping ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …est/kotlin/org/meshtastic/core/takserver/CoTXmlTest.kt | 108 | // ── Structure ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/org/meshtastic/core/takserver/TAKServerManagerTest.kt | 173 | // ── T076: Port conflict / start failure ───────────────────────────────────── | COMMENT |
| MEDIUM | …org/meshtastic/core/takserver/TakMeshTestRunnerTest.kt | 99 | // ── runAll() covers both protocols ────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/network/radio/MockRadioTransport.kt | 245 | // ── Handshake ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/network/radio/MockRadioTransport.kt | 396 | // ── Simulated traffic ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …rg/meshtastic/core/network/radio/MockRadioTransport.kt | 547 | // ── Packet builders ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/network/radio/BleRadioTransportReconnectCrashTest.kt | 97 | // ─── close() triggers disconnect ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/network/radio/BleRadioTransportReconnectCrashTest.kt | 136 | // ─── disconnect called on connection failure ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/network/radio/BleRadioTransportReconnectCrashTest.kt | 177 | // ─── transient onDisconnect after failure threshold ────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/network/radio/BleRadioTransportReconnectCrashTest.kt | 224 | // ─── CancellationException is not silently swallowed ───────────────────────────────────────── | COMMENT |
| 130 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | store-screenshots/capture-android.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | store-screenshots/capture-desktop.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …kotlin/org/meshtastic/core/database/DatabaseManager.kt | 161 | COMMENT | |
| LOW | …in/org/meshtastic/core/takserver/TAKMeshIntegration.kt | 221 | * (DrawnShape, Marker, Route, Aircraft, Casevac, Emergency, Task, plus PLI / GeoChat). Wire format: `[flags | COMMENT |
| LOW | …org/meshtastic/core/network/radio/BleRadioTransport.kt | 221 | // Guards against duplicate callbacks when multiple writes or a write + fromRadio failure | COMMENT |
| LOW | …org/meshtastic/core/network/radio/BleRadioTransport.kt | 401 | // Wait for the StateFlow to actually reflect Connected before watching for the next | COMMENT |
| LOW | …org/meshtastic/core/network/radio/BleRadioTransport.kt | 641 | "[${address.anonymize()}] BLE Radio Session Ready. " + | COMMENT |
| LOW | …org/meshtastic/core/service/MeshServiceOrchestrator.kt | 81 | ) { | COMMENT |
| LOW | …org/meshtastic/core/service/MeshServiceOrchestrator.kt | 101 | val address = radioInterfaceService.currentDeviceAddressFlow.first(::isValidDeviceAddress) | COMMENT |
| LOW | …org/meshtastic/core/service/MeshServiceOrchestrator.kt | 181 | newScope.handledLaunch { coldStartConnect() } | COMMENT |
| LOW | …meshtastic/core/service/SharedRadioInterfaceService.kt | 561 | COMMENT | |
| LOW | …meshtastic/core/service/SharedRadioInterfaceService.kt | 741 | transportMutex.withLock { | COMMENT |
| LOW | …meshtastic/core/service/SharedRadioInterfaceService.kt | 761 | // recovery path by creating a transport directly via startTransportLocked(). | COMMENT |
| LOW | …meshtastic/core/service/SharedRadioInterfaceService.kt | 781 | // connectionRequested mutators (connect/disconnect/setDeviceAddress) hold | COMMENT |
| LOW | …meshtastic/core/service/SharedRadioInterfaceService.kt | 1061 | // double liveness-timeout (timer not cancelled between fires) does not produce | COMMENT |
| LOW | …lin/org/meshtastic/core/service/RadioControllerImpl.kt | 181 | // arrives (nodeNum + deviceId from the same MyNodeInfo), tell the DatabaseManager to claim | COMMENT |
| LOW | …ore/service/SharedRadioInterfaceServiceLivenessTest.kt | 121 | // complete(Unit) is called — if testDispatcher is ever changed to StandardTestDispatcher, | COMMENT |
| LOW | …ore/service/SharedRadioInterfaceServiceLivenessTest.kt | 1541 | // [SharedRadioInterfaceService.restartTransport] is the app-level handshake-stall recovery | COMMENT |
| LOW | …ore/service/SharedRadioInterfaceServiceLivenessTest.kt | 1821 | // Past the 60s threshold → first checkLiveness CAS-sets isRestarting=true and | COMMENT |
| LOW | …ore/service/SharedRadioInterfaceServiceLivenessTest.kt | 1981 | // presence via [SerialDevicePresence.deviceKeys] combined with [currentDeviceAddressFlow] and | COMMENT |
| LOW | …in/org/meshtastic/core/data/manager/NodeManagerImpl.kt | 441 | */ | COMMENT |
| LOW | …htastic/core/data/manager/MeshConnectionManagerImpl.kt | 301 | if (serviceRepository.connectionState.value != ConnectionState.Connected) { | COMMENT |
| LOW | …htastic/core/data/manager/MeshConnectionManagerImpl.kt | 361 | // Collapse cancel+reassign into one atomic swap so a concurrent re-arm cannot orphan a | COMMENT |
| LOW | …htastic/core/data/manager/MeshConnectionManagerImpl.kt | 481 | // | COMMENT |
| LOW | …tic/core/data/manager/MeshConnectionManagerImplTest.kt | 761 | // Under the FIXED ordering, the fresh Connected arrives with app state already | COMMENT |
| LOW | config/detekt/detekt.yml | 1 | config: | COMMENT |
| LOW | .claude/hooks/pre-bash-guard.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .claude/hooks/post-edit.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .claude/hooks/subagent-audit.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | gradle/libs.versions.toml | 41 | COMMENT | |
| LOW | …main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt | 101 | } | COMMENT |
| LOW | …aries/mapsplatform/secrets_gradle_plugin/Extensions.kt | 1 | // Copyright 2021 Google LLC | COMMENT |
| LOW | …es/mapsplatform/secrets_gradle_plugin/SecretsPlugin.kt | 1 | // Copyright 2021 Google LLC | COMMENT |
| LOW | …atform/secrets_gradle_plugin/SecretsPluginExtension.kt | 1 | // Copyright 2021 Google LLC | COMMENT |
| LOW | scripts/build-appimage.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/check-doc-aliases.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | scripts/play-track-preflight.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/sync-android-docs.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | scripts/verify-rb-selftest.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/ai-guardrail.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/docs/publish-to-gh-pages.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/lib/stripped-libs.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | scripts/lib/abi-parity.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | scripts/verify-flatpak/verify.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/verify-flatpak/desktop-offline.yaml | 1 | # Local offline verification of org.meshtastic.MeshtasticDesktop. | COMMENT |
| LOW | .github/actionlint.yaml | 1 | # actionlint validates `runs-on` against a built-in list of GitHub-hosted labels, and | COMMENT |
| LOW | .github/homebrew/meshtastic-desktop.rb | 1 | # Homebrew Cask template for Meshtastic Desktop. | COMMENT |
| LOW | .github/workflows/msstore-publish.yml | 1 | name: Publish to Microsoft Store | COMMENT |
| LOW | .github/workflows/msstore-publish.yml | 81 | # Center rejects Win32 installers whose binaries don't chain to a | COMMENT |
| LOW | .github/workflows/release.yml | 281 | COMMENT | |
| LOW | .github/workflows/docs-release.yml | 1 | name: Docs Release | COMMENT |
| LOW | .github/workflows/post-release-cleanup.yml | 121 | git worktree add --quiet -B gh-pages "$work" FETCH_HEAD | COMMENT |
| LOW | .github/workflows/winget-publish.yml | 1 | name: Publish to winget | COMMENT |
| LOW | .github/workflows/winget-publish.yml | 41 | env: | COMMENT |
| LOW | .github/workflows/pr-closed-cleanup.yml | 1 | name: PR Closed Cleanup | COMMENT |
| LOW | .github/workflows/pull-request.yml | 141 | # scripts/verify-flatpak/ entirely. | COMMENT |
| LOW | .github/workflows/pull-request.yml | 161 | run: python3 scripts/sync-play-changelog.py --check | COMMENT |
| LOW | .github/workflows/promote.yml | 81 | - name: Decode Play Store credentials | COMMENT |
| LOW | .github/workflows/main-check.yml | 21 | # Every commit on main arrives via the merge queue, which already ran lint, | COMMENT |
| LOW | .github/workflows/main-check.yml | 141 | **Obtainium:** enable *Include prereleases*. Each build's APK filename carries the versionCode, so updates are | COMMENT |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | specs/006-kmp-project-structure/quickstart.md | 13 | ### Step 1: Harden convention plugin defaults | COMMENT |
| LOW | specs/006-kmp-project-structure/quickstart.md | 35 | ### Step 2: Migrate Tier 1 modules (minimal — 6 modules) | COMMENT |
| LOW | specs/006-kmp-project-structure/quickstart.md | 65 | ### Step 3: Migrate Tier 2 modules (withHostTest — 18 modules) | COMMENT |
| LOW | specs/006-kmp-project-structure/quickstart.md | 104 | ### Step 4: Migrate Tier 3 modules (special — 3 modules) | COMMENT |
| LOW | specs/006-kmp-project-structure/quickstart.md | 143 | ### Step 5: Full verification | COMMENT |
| LOW | specs/006-kmp-project-structure/quickstart.md | 166 | ### Step 6: Validate success criteria | COMMENT |
| LOW⚡ | specs/20260520-153412-nav-tab-labels/quickstart.md | 12 | ### Step 1: Add String Resources | COMMENT |
| LOW⚡ | specs/20260520-153412-nav-tab-labels/quickstart.md | 22 | ### Step 2: Rename Enum Entries | COMMENT |
| LOW⚡ | specs/20260520-153412-nav-tab-labels/quickstart.md | 30 | ### Step 3: Update All References | COMMENT |
| LOW | specs/20260520-153412-nav-tab-labels/quickstart.md | 42 | ### Step 4: Verify | COMMENT |
| LOW | …260511-211823-compose-screenshot-testing/quickstart.md | 12 | ## Step 1: Create a Preview Composable | COMMENT |
| LOW | …260511-211823-compose-screenshot-testing/quickstart.md | 38 | ## Step 2: Add a Screenshot Test Wrapper | COMMENT |
| LOW⚡ | …260511-211823-compose-screenshot-testing/quickstart.md | 58 | ## Step 3: Generate Reference Images | COMMENT |
| LOW⚡ | …260511-211823-compose-screenshot-testing/quickstart.md | 66 | ## Step 4: Validate | COMMENT |
| LOW⚡ | …260511-211823-compose-screenshot-testing/quickstart.md | 74 | ## Step 5: Commit Reference Images | COMMENT |
| LOW | specs/20260520-153504-udp-label-rename/quickstart.md | 15 | ### Step 1: Edit the string resource | COMMENT |
| LOW⚡ | specs/20260520-153504-udp-label-rename/quickstart.md | 30 | ### Step 2: Run the string sort script | COMMENT |
| LOW⚡ | specs/20260520-153504-udp-label-rename/quickstart.md | 38 | ### Step 3: Verify the build | COMMENT |
| LOW⚡ | specs/20260520-153504-udp-label-rename/quickstart.md | 44 | ### Step 4: Confirm CI (after push) | COMMENT |
| LOW | …60520-153428-remove-admin-channel-toggle/quickstart.md | 15 | ### Step 1: Remove unused import (Line 49) | COMMENT |
| LOW | …60520-153428-remove-admin-channel-toggle/quickstart.md | 24 | ### Step 2: Remove toggle block (Lines 207–214) | COMMENT |
| LOW | …60520-153428-remove-admin-channel-toggle/quickstart.md | 40 | ### Step 3: Verify | COMMENT |
| LOW⚡ | .specify/extensions/verify/README.md | 100 | # Step 1: Create specification | COMMENT |
| LOW⚡ | .specify/extensions/verify/README.md | 103 | # Step 2: Plan and generate tasks | COMMENT |
| LOW⚡ | .specify/extensions/verify/README.md | 107 | # Step 3: Implement | COMMENT |
| LOW⚡ | .specify/extensions/verify/README.md | 110 | # Step 4: Verify implementation | COMMENT |
| LOW⚡ | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 270 | // Step 1: Get firmware file | COMMENT |
| LOW⚡ | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 273 | // Step 2: Read firmware once and calculate hash | COMMENT |
| LOW | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 293 | // Step 3: Preflight — wait for the firmware to confirm OTA entry BEFORE tearing down the mesh | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .coderabbit.yaml | 60 | # Spec Kit scaffolding — vendored tooling, not hand-maintained here. | COMMENT |
| MEDIUM⚡ | …in/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt | 79 | // column and the two-pane scaffold (e.g. on resize / fold), and so neither slot is emitted directly from two | COMMENT |
| MEDIUM⚡ | …in/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt | 89 | // unbounded constraints (the scaffold branch below leaves composition on that flip). | COMMENT |
| MEDIUM⚡ | …in/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt | 93 | // Expanded: split side-by-side. Only a bounded host may use the pane scaffold; an unbounded one | COMMENT |
| MEDIUM | …/meshtastic/core/ui/component/AdaptiveTwoPaneUiTest.kt | 49 | // Crashlytics 788308c5 (fatal, tablets): the split scaffold echoed the LazyColumn item's infinite | COMMENT |
| MEDIUM | …/meshtastic/core/ui/component/AdaptiveTwoPaneUiTest.kt | 68 | // No drag handle: the unbounded host must get the Row fallback, not the scaffold. | COMMENT |
| MEDIUM | …/meshtastic/core/ui/component/AdaptiveTwoPaneUiTest.kt | 89 | // survive the host flipping to unbounded constraints (scaffold disposed) and back. | COMMENT |
| MEDIUM | …kotlin/org/meshtastic/core/database/DatabaseManager.kt | 460 | * (#6608). Only the first emission per latch is bounded; later emissions are event-driven and legitimately sparse. | COMMENT |
| MEDIUM | specs/20260507-161858-app-docs-markdown/plan.md | 344 | ### Safety/UX guardrails | COMMENT |
| MEDIUM | .claude/skills/proto-bump/SKILL.md | 45 | ## PR + guardrails | COMMENT |
| MEDIUM | scripts/build-appimage.sh | 7 | # AppImage bundle format. This script builds the AppDir scaffolding (AppRun, | COMMENT |
| MEDIUM | .specify/extensions/optimize/config-template.yml | 22 | # Flag if total governance tokens exceed this % of context window | COMMENT |
| MEDIUM | .specify/extensions/optimize/config-template.yml | 32 | # Target AI context window size (tokens) for budget calculations | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .specify/extensions/git/scripts/bash/git-common.sh | 6 | # Check if we have git available at the repo root | COMMENT |
| LOW | .specify/extensions/git/scripts/bash/auto-commit.sh | 34 | # Check if git is available | COMMENT |
| LOW | .specify/extensions/git/scripts/bash/auto-commit.sh | 106 | # Check if event section existed at all | COMMENT |
| LOW | .specify/extensions/git/scripts/bash/auto-commit.sh | 120 | # Check if there are changes to commit | COMMENT |
| LOW | .specify/extensions/git/scripts/bash/initialize-repo.sh | 37 | # Check if git is available | COMMENT |
| LOW | .specify/extensions/git/scripts/bash/initialize-repo.sh | 43 | # Check if already a git repo | COMMENT |
| LOW | …cify/extensions/git/scripts/bash/create-new-feature.sh | 249 | # Check if git is available at this repo root | COMMENT |
| LOW | .specify/scripts/bash/common.sh | 104 | # Check if we have git available at the spec-kit root level | COMMENT |
| LOW | .specify/scripts/bash/common.sh | 111 | # Check if .git exists (directory or file for worktrees/submodules) | COMMENT |
| LOW | .specify/scripts/bash/common.sh | 305 | # Check if jq is available for safe JSON construction | COMMENT |
| LOW | .specify/scripts/bash/common.sh | 576 | # Check if any layer uses a non-replace strategy | COMMENT |
| LOW | .specify/scripts/bash/setup-plan.sh | 54 | # Output results | COMMENT |
| LOW | .specify/scripts/bash/setup-tasks.sh | 65 | # Output results | COMMENT |
| LOW | .specify/scripts/bash/check-prerequisites.sh | 154 | # Output results | COMMENT |
| LOW | .specify/scripts/bash/create-new-feature.sh | 32 | # Check if the next argument is another option (starts with --) | COMMENT |
| LOW | .specify/scripts/bash/create-new-feature.sh | 197 | # Check if git is available at this repo root (not a parent) | COMMENT |
| LOW | .specify/scripts/bash/create-new-feature.sh | 333 | # Check if branch already exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .specify/extensions/review/tests/bats/test_helper.bash | 15 | # Create a temporary working directory for each test | COMMENT |
| MEDIUM | .specify/extensions/review/tests/bats/test_helper.bash | 45 | # Create a bare repo to act as origin (explicitly use main) | COMMENT |
| MEDIUM | .specify/extensions/review/tests/bats/test_helper.bash | 50 | # Create the working repo | COMMENT |
| MEDIUM | .specify/scripts/bash/setup-plan.sh | 50 | # Create a basic plan file if template doesn't exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/sync-android-docs.js | 358 | function collectVersionedImageReferences() { | CODE |
| LOW | …s/agent-governance/scripts/refresh_agent_governance.py | 141 | def repository_evidence_summary(root: Path, state: dict[str, Any], init_options: dict[str, Any]) -> str: | CODE |
| LOW | …s/agent-governance/scripts/refresh_agent_governance.py | 147 | def repository_evidence_lines(root: Path, state: dict[str, Any], init_options: dict[str, Any]) -> list[str]: | CODE |
| LOW | …s/agent-governance/scripts/refresh_agent_governance.py | 232 | def development_command_lines(root: Path) -> list[str]: | CODE |
| LOW⚡ | …s/agent-governance/scripts/refresh_agent_governance.py | 477 | def repository_evidence_default() -> list[str]: | CODE |
| LOW⚡ | …s/agent-governance/scripts/refresh_agent_governance.py | 485 | def directory_governance_default() -> list[str]: | CODE |
| LOW⚡ | …s/agent-governance/scripts/refresh_agent_governance.py | 495 | def development_commands_default() -> list[str]: | CODE |
| LOW | …s/agent-governance/scripts/refresh_agent_governance.py | 518 | def extract_section_from_text(text: str, heading: str) -> list[str]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …in/kotlin/org/meshtastic/core/ui/component/NodeChip.kt | 87 | wb.long_name = "John Doe" | CODE |
| LOW | …org/meshtastic/core/ui/component/DropDownPreference.kt | 236 | summary = "Lorem ipsum dolor sit amet", | CODE |
| LOW | …org/meshtastic/core/ui/component/DropDownPreference.kt | 236 | summary = "Lorem ipsum dolor sit amet", | CODE |
| LOW | …g/meshtastic/core/ui/component/preview/PreviewUtils.kt | 36 | wb.long_name = "John Doe" | CODE |
| LOW | …/meshtastic/core/ui/share/SharedContactImportDialog.kt | 152 | wb.long_name = "John Doe" | CODE |
| LOW | …re/connections/ui/components/CurrentlyConnectedInfo.kt | 207 | wb.long_name = "John Doe" | CODE |
| LOW | .skills/project-overview/SKILL.md | 66 | datadogApplicationId=dummy_id | CODE |
| LOW | .skills/project-overview/SKILL.md | 67 | datadogClientToken=dummy_token | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/sort-strings.py | 106 | print(f"Error: {xml_file} not found.") | CODE |
| MEDIUM | …s/agent-governance/scripts/refresh_agent_governance.py | 58 | print("Error: .specify/ not found. Run from a Spec Kit project root.", file=sys.stderr) | CODE |
| LOW | .specify/scripts/bash/common.sh | 373 | except Exception: | CODE |
| LOW | .specify/scripts/bash/common.sh | 461 | except Exception: | CODE |
| LOW | .specify/scripts/bash/common.sh | 492 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …tic/core/data/manager/MeshConnectionManagerImplTest.kt | 737 | // test stays robust against small timeout tweaks. | COMMENT |
| MEDIUM | .claude/hooks/pre-bash-guard.sh | 17 | # robust, unlike a settings.json prefix pattern. Asks, never hard-denies. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …laude/skills/run-meshtastic-android/driver_emulator.py | 162 | CODE | |
| LOW | .claude/skills/run-meshtastic-android/driver.py | 211 | CODE | |
| LOW | obtainium/generate-links.py | 257 | CODE | |
| LOW | scripts/sort-strings.py | 9 | CODE | |
| LOW | scripts/sort-strings.py | 58 | CODE | |
| LOW | scripts/docs/sync-locale-front-matter.py | 153 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-string-escapes.py | 23 | CODE | |
| LOW | scripts/check-store-metadata.py | 22 | CODE | |
| LOW | scripts/docs/sync-locale-front-matter.py | 33 | CODE | |
| LOW | scripts/docs/regenerate-versions.py | 23 | CODE | |
| LOW | scripts/verify-flatpak/check-platform-deps.py | 24 | CODE | |
| LOW | …s/agent-governance/scripts/refresh_agent_governance.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 270 | // Step 1: Get firmware file | COMMENT |
| LOW⚡ | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 273 | // Step 2: Read firmware once and calculate hash | COMMENT |
| LOW | …shtastic/feature/firmware/ota/Esp32OtaUpdateHandler.kt | 293 | // Step 3: Preflight — wait for the firmware to confirm OTA entry BEFORE tearing down the mesh | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .claude/skills/run-meshtastic-android/driver.py | 158 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/verify-flatpak/verify.sh | 15 | # Usage: | COMMENT |