AI Slop Code RIsk Monitor

permissionlesstech/bitchat-android

decentralized mesh chat

23.2 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for permissionlesstech/bitchat-android, a Kotlin project with 7,785 GitHub stars. SynthScan examined 148,172 lines of code across 618 source files, recording 352 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 23.2 (Elevated 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.

23.2
Adjusted Signal
23.2
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
7.8K
Stars
Kotlin
Language
148.2K
Lines of Code
618
Files
352
Pattern Hits
2026-10-12
Scan Date
0.47
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 1.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 45 finding(s).

Hallucinated Dependency & Supply Chain Risk 67.6/100 · HIGH

Are imports declared and package/API names verified? 295 finding(s).

Agent Over-Engineering Ratio 2.0/100 · LOW

Are wrappers, guards, and repeated structures necessary? 33 finding(s).

PR Review Velocity Impact 63.5/100 · HIGH

Which changes need focused human review? 352 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 289HIGH 4MEDIUM 9LOW 50

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 352 distinct pattern matches across 11 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.

Hallucination Indicators289 hits · 3335 pts
SeverityFileLineSnippetContext
CRITICAL…rc/test/java/com/bitchat/android/ui/ChatUIUtilsTest.kt180 private fun androidx.compose.ui.graphics.Color.isSpecified() =CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/MainActivity.kt115 com.bitchat.android.service.AppShutdownCoordinator.cancelPendingShutdown()CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/MainActivity.kt124 meshService = com.bitchat.android.service.MeshServiceHolder.getOrCreate(applicationContext)CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/MainActivity.kt125 unifiedMeshService = com.bitchat.android.service.MeshServiceHolder.getUnifiedOrCreate(applicationContext)CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt397 val bleRequired = try { com.bitchat.android.ui.debug.DebugPreferenceManager.getBleEnabled(true) } catch (_: ExceCODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt436 !com.bitchat.android.onboarding.BackgroundLocationPreferenceManager.isSkipped(this@MainActivity)CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt499 com.bitchat.android.wifiaware.WifiAwareController.startIfPossible()CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt564 val bleRequired2 = try { com.bitchat.android.ui.debug.DebugPreferenceManager.getBleEnabled(true) } catch (_: ExcCODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt606 com.bitchat.android.service.MeshForegroundService.start(applicationContext)CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt690 com.bitchat.android.nostr.LocationNotesInitializer.initialize(this@MainActivity)CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt731 com.bitchat.android.service.AppShutdownCoordinator.cancelPendingShutdown()CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt759 val bleRequired = try { com.bitchat.android.ui.debug.DebugPreferenceManager.getBleEnabled(true) } catch (_: CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt777 com.bitchat.android.wifiaware.WifiAwareController.startIfPossible()CODE
CRITICALapp/src/main/java/com/bitchat/android/MainActivity.kt838 val channelId = com.bitchat.android.geohash.ChannelID.Location(geohashChannel)CODE
CRITICAL…rc/main/java/com/bitchat/android/BitchatApplication.kt17 com.bitchat.android.mesh.PowerManager.getInstance(this).start()CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt29 try { com.bitchat.android.nostr.LocationNotesInitializer.initialize(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt33 com.bitchat.android.favorites.FavoritesPersistenceService.initialize(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt40 com.bitchat.android.services.AppStateStore.initializeConversationPersistence(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt45 com.bitchat.android.nostr.NostrIdentityBridge.getCurrentNostrIdentity(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt52 com.bitchat.android.ui.theme.ChatUiModeManager.init(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt55 try { com.bitchat.android.ui.debug.DebugPreferenceManager.init(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt59 val enabled = com.bitchat.android.ui.debug.DebugPreferenceManager.getWifiAwareEnabled(false)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt60 com.bitchat.android.wifiaware.WifiAwareController.initialize(this, enabled)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt65 com.bitchat.android.nostr.GeohashAliasRegistry.initialize(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt66 com.bitchat.android.nostr.GeohashConversationRegistry.initialize(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt71 try { com.bitchat.android.nostr.NostrBackgroundRuntime.initialize(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt74 try { com.bitchat.android.service.MeshServicePreferences.init(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt77 try { com.bitchat.android.service.MeshForegroundService.start(this) } catch (_: Exception) { }CODE
CRITICAL…/main/java/com/bitchat/android/mesh/PacketProcessor.kt19 private val debugManager by lazy { try { com.bitchat.android.ui.debug.DebugSettingsManager.getInstance() } catch (e:CODE
CRITICAL…com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt85 val manager = com.bitchat.android.ui.debug.DebugSettingsManager.getInstance()CODE
CRITICAL⚡…com/bitchat/android/mesh/BluetoothGattServerManager.kt57 com.bitchat.android.ui.debug.DebugSettingsManager.getInstance().bleEnabled.valueCODE
CRITICAL⚡…com/bitchat/android/mesh/BluetoothGattServerManager.kt59 try { com.bitchat.android.ui.debug.DebugPreferenceManager.getBleEnabled(true) } catch (_: Exception) { true CODE
CRITICAL⚡…com/bitchat/android/mesh/BluetoothGattServerManager.kt65 (try { com.bitchat.android.ui.debug.DebugSettingsManager.getInstance().gattServerEnabled.value } catch (_: ECODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt219 try { com.bitchat.android.services.AppStateStore.setTransportPeers(transport.id, peerIDs) } catch (_: ExCODE
CRITICAL⚡app/src/main/java/com/bitchat/android/mesh/MeshCore.kt415 com.bitchat.android.services.AppStateStore.updatePrivateMessageStatus(CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/mesh/MeshCore.kt417 com.bitchat.android.model.DeliveryStatus.Delivered(peerID, java.util.Date())CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/mesh/MeshCore.kt425 com.bitchat.android.services.AppStateStore.updatePrivateMessageStatus(CODE
CRITICAL⚡app/src/main/java/com/bitchat/android/mesh/MeshCore.kt427 com.bitchat.android.model.DeliveryStatus.Read(peerID, java.util.Date())CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt787 data = com.bitchat.android.services.VerificationService.buildVerifyChallenge(noiseKeyHex, nonceA)CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt793 val tlv = com.bitchat.android.services.VerificationService.buildVerifyResponse(noiseKeyHex, nonceA) ?: returnCODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt875 tlvPayload += com.bitchat.android.services.meshgraph.GossipTLV.encodeNeighbors(directPeersForGossip)CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt877 com.bitchat.android.services.meshgraph.MeshGraphService.getInstance()CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt891 try { com.bitchat.android.services.AppStateStore.setTransportDirectPeers(transport.id, localDirect) } catch CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt893 com.bitchat.android.services.AppStateStore.getDirectPeers().ifEmpty { localDirect }CODE
CRITICALapp/src/main/java/com/bitchat/android/mesh/MeshCore.kt1049 val path = com.bitchat.android.services.meshgraph.RoutePlanner.shortestPath(CODE
CRITICAL…c/main/java/com/bitchat/android/mesh/MessageHandler.kt84 val noisePayload = com.bitchat.android.model.NoisePayload.decode(decryptedData)CODE
CRITICAL…c/main/java/com/bitchat/android/mesh/MessageHandler.kt93 val privateMessage = com.bitchat.android.model.PrivateMessagePacket.decode(noisePayload.data)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt128 val file = com.bitchat.android.model.BitchatFilePacket.decode(noisePayload.data)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt132 val savedPath = com.bitchat.android.features.file.FileUtils.saveIncomingFile(appContext, file)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt137 type = com.bitchat.android.features.file.FileUtils.messageTypeForMime(file.mimeType),CODE
CRITICAL…c/main/java/com/bitchat/android/mesh/MessageHandler.kt353 val neighborsOrNull = com.bitchat.android.services.meshgraph.GossipTLV.decodeNeighborsFromAnnouncementPayloaCODE
CRITICAL…c/main/java/com/bitchat/android/mesh/MessageHandler.kt354 com.bitchat.android.services.meshgraph.MeshGraphService.getInstance()CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt466 val isFileTransfer = com.bitchat.android.protocol.MessageType.fromValue(packet.type) == com.bitchat.android.CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt467 val file = com.bitchat.android.model.BitchatFilePacket.decode(packet.payload)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt470 val savedPath = com.bitchat.android.features.file.FileUtils.saveIncomingFile(appContext, file)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt475 type = com.bitchat.android.features.file.FileUtils.messageTypeForMime(file.mimeType),CODE
CRITICAL…c/main/java/com/bitchat/android/mesh/MessageHandler.kt506 val isFileTransfer = com.bitchat.android.protocol.MessageType.fromValue(packet.type) ==CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt526 val file = com.bitchat.android.model.BitchatFilePacket.decode(packet.payload)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt529 val savedPath = com.bitchat.android.features.file.FileUtils.saveIncomingFile(appContext, file)CODE
CRITICAL⚡…c/main/java/com/bitchat/android/mesh/MessageHandler.kt534 type = com.bitchat.android.features.file.FileUtils.messageTypeForMime(file.mimeType),CODE
229 more matches not shown…
Hyper-Verbose Identifiers21 hits · 22 pts
SeverityFileLineSnippetContext
LOWtools/release_gate/test_release_gate.py102 def test_manifest_covers_every_release_category(self):CODE
LOW⚡tools/release_gate/test_release_gate.py116 def test_documented_matrix_template_is_schema_valid_but_not_runnable(self):CODE
LOW⚡tools/release_gate/test_release_gate.py122 def test_matrix_enforces_distinct_api_manufacturer_and_counterpart_clients(self):CODE
LOW⚡tools/release_gate/test_release_gate.py132 def test_privacy_policy_rejects_identifiers_paths_addresses_and_long_ids(self):CODE
LOWtools/release_gate/test_release_gate.py146 def test_initialize_creates_disposable_fixtures_and_pending_results(self):CODE
LOWtools/release_gate/test_release_gate.py174 def test_record_requires_structured_evidence_and_rejects_pii(self):CODE
LOWtools/release_gate/test_release_gate.py206 def test_complete_run_requires_all_evidence_traces_and_endurance_bounds(self):CODE
LOWtools/release_gate/test_release_gate.py258 def test_manifest_tampering_after_initialization_is_detected(self):CODE
LOWtools/release_gate/test_release_gate.py268 def test_trace_accepts_only_aggregate_metrics(self):CODE
LOWtools/release_gate/test_release_gate.py283 def test_evidence_parser_is_typed_and_privacy_checked(self):CODE
LOWtools/release_gate/test_release_gate.py292 def test_adb_device_count_never_returns_selectors(self, _find_adb):CODE
LOWtools/release_gate/test_release_gate.py303 def test_adb_probe_emits_only_logical_device_metadata(self, run_adb):CODE
LOWtools/release_gate/test_release_gate.py316 def test_disposable_cleanup_targets_the_real_application_id(self, run_adb):CODE
LOWtools/release_gate/test_release_gate.py336 def test_resource_snapshot_returns_only_aggregate_metrics(self, run_adb):CODE
LOWtools/release_gate/mesh_lab.py320def make_private_media_fixtures(directory: Path, seed: int = 7331) -> dict[str, dict]:CODE
LOWtools/release_gate/mesh_lab.py384def wait_for_mutual_discovery(a: Device, b: Device) -> None:CODE
LOWtools/release_gate/mesh_lab.py427def scenario_favorite_verification(a: Device, b: Device) -> dict:CODE
LOWtools/release_gate/mesh_lab.py764def scenario_session_recovery(a: Device, b: Device) -> dict:CODE
LOWtools/release_gate/android_lab.py109def prepare_disposable_device(serial: str, confirmed: bool) -> None:CODE
LOWtools/release_gate/android_lab.py118def collect_resource_snapshot(serial: str) -> dict[str, int | bool]:CODE
LOWapp/src/main/java/com/bitchat/android/ui/DataManager.kt13class DataManager(private val context: Context) {CODE
Decorative Section Separators6 hits · 21 pts
SeverityFileLineSnippetContext
MEDIUM⚡tools/arti-build/build-arti.sh22# ==============================================================================COMMENT
MEDIUM⚡tools/arti-build/build-arti.sh24# ==============================================================================COMMENT
MEDIUMtools/arti-build/build-arti.sh138# ==============================================================================COMMENT
MEDIUMtools/arti-build/build-arti.sh140# ==============================================================================COMMENT
MEDIUMtools/arti-build/build-arti.sh606# ==============================================================================COMMENT
MEDIUMtools/arti-build/build-arti.sh608# ==============================================================================COMMENT
Over-Commented Block15 hits · 15 pts
SeverityFileLineSnippetContext
LOWtools/arti-build/build-arti.sh1#!/usr/bin/env bashCOMMENT
LOWapp/src/test/kotlin/com/bitchat/FileTransferTest.kt321 // Additional assertions would test different file typesCOMMENT
LOW…com/bitchat/android/mesh/BluetoothConnectionManager.kt241 // try {COMMENT
LOW…itchat/android/noise/southernstorm/crypto/NewHope.java721 1036095,929607,995151,962391,896859,1027935,946023,1011567,COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt1//package com.bitchat.android.servicesCOMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt21// companion object {COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt41// retentionDir.mkdirs()COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt61// prefs.edit().putStringSet(KEY_FAVORITE_CHANNELS, currentFavorites).apply()COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt81//COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt101// return@withContextCOMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt121// if (!isChannelBookmarked(channel)) {COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt141// channelFile.delete()COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt161//COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt181// }COMMENT
LOW…om/bitchat/android/services/MessageRetentionService.kt201//COMMENT
Empty Error Handlers3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHtools/release_gate/mesh_lab.py143except Exception:CODE
HIGHtools/release_gate/mesh_lab.py252except Exception:CODE
HIGHtools/release_gate/mesh_lab.py746except MeshLabError:CODE
AI Slop Vocabulary3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUM…in/java/com/bitchat/android/ui/MessageSpecialParser.kt62 // 1) Use Android's WEB_URL for robust detection of http(s) and www.*COMMENT
MEDIUM…in/java/com/bitchat/android/protocol/BinaryProtocol.kt385 // Try decode as-is first (robust when padding wasn't applied) - iOS fixCOMMENT
MEDIUM…in/java/com/bitchat/android/nostr/NostrRelayManager.kt91 // Persistent subscription tracking for robust reconnectionCOMMENT
Unused Imports6 hits · 6 pts
SeverityFileLineSnippetContext
LOWtools/release_gate/mesh_lab.py20CODE
LOWtools/release_gate/release_gate.py10CODE
LOWtools/release_gate/android_lab.py8CODE
LOW…reenshot-studio/scripts/validate_readme_screenshots.py4CODE
LOW…-ui-visual-review/scripts/validate_capture_manifest.py4CODE
LOW…s/android-ui-visual-review/scripts/upload_pr_images.py4CODE
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGH…in/java/com/bitchat/android/model/BitchatFilePacket.kt63 val contentLenFieldLen = 4 // UInt32 for CONTENT TLV as requestedCODE
Deep Nesting4 hits · 4 pts
SeverityFileLineSnippetContext
LOWtools/release_gate/mesh_lab.py912CODE
LOWtools/release_gate/mesh_lab.py985CODE
LOWtools/release_gate/release_gate.py685CODE
LOWtools/release_gate/android_lab.py178CODE
Excessive Try-Catch Wrapping3 hits · 3 pts
SeverityFileLineSnippetContext
LOWtools/release_gate/mesh_lab.py143 except Exception:CODE
LOWtools/release_gate/mesh_lab.py241 except Exception as error:CODE
LOWtools/release_gate/mesh_lab.py252 except Exception:CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡tools/arti-build/build-arti.sh14# Usage:COMMENT