AI Slop Code Risk Monitor

permissionlesstech/bitchat-android

SlopCodeMonitor badge for permissionlesstech/bitchat-android Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

decentralized mesh chat

22.1 Elevated pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for permissionlesstech/bitchat-android, a Kotlin project with 7,940 GitHub stars. SynthScan examined 158,425 lines of code across 682 source files, recording 361 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 22.1 (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.

22.1
Adjusted Signal
22.1
Raw Pattern Score
100%
Time Factor
2026-10-27
Last Push
7.9K
Stars
Kotlin
Language
158.4K
Lines of Code
682
Files
361
Pattern Hits
2026-10-31
Scan Date
0.44
HC Hit Rate

Risk Review · Payload v1

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.

Cognitive Ownership Risk 1.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 65.9/100 · HIGH

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

Agent Over-Engineering Ratio 1.9/100 · LOW

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

PR Review Velocity Impact 62.1/100 · HIGH

Which changes need focused human review? 361 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 297HIGH 4MEDIUM 9LOW 51

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 361 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 Indicators297 hits · 3400 pts
SeverityFileLineSnippetContext
CRITICAL…rc/test/java/com/bitchat/android/ui/ChatUIUtilsTest.kt180 private fun androidx.compose.ui.graphics.Color.isSpecified() =CODE
CRITICAL…hat/android/ui/MeshDelegateHandlerStateContractTest.kt43 com.bitchat.android.services.AppStateStore.clear()CODE
CRITICAL…hat/android/ui/MeshDelegateHandlerStateContractTest.kt71 com.bitchat.android.services.AppStateStore.clear()CODE
CRITICAL…bitchat/android/nostr/GeohashMessageHandlerSpamTest.kt34 com.bitchat.android.services.AppStateStore.clear()CODE
CRITICAL…bitchat/android/nostr/GeohashMessageHandlerSpamTest.kt52 com.bitchat.android.services.AppStateStore.clear()CODE
CRITICAL…at/android/nostr/GeohashMessageHandlerSignatureTest.kt42 com.bitchat.android.services.AppStateStore.clear()CODE
CRITICAL…at/android/nostr/GeohashMessageHandlerSignatureTest.kt59 com.bitchat.android.services.AppStateStore.clear()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.kt49 com.bitchat.android.spam.SpamFilterPreferences.init(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt55 com.bitchat.android.ui.theme.ChatUiModeManager.init(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt58 try { com.bitchat.android.ui.debug.DebugPreferenceManager.init(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt62 val enabled = com.bitchat.android.ui.debug.DebugPreferenceManager.getWifiAwareEnabled(false)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt63 com.bitchat.android.wifiaware.WifiAwareController.initialize(this, enabled)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt68 com.bitchat.android.nostr.GeohashAliasRegistry.initialize(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt69 com.bitchat.android.nostr.GeohashConversationRegistry.initialize(this)CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt74 try { com.bitchat.android.nostr.NostrBackgroundRuntime.initialize(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt77 try { com.bitchat.android.service.MeshServicePreferences.init(this) } catch (_: Exception) { }CODE
CRITICAL⚡…rc/main/java/com/bitchat/android/BitchatApplication.kt80 try { com.bitchat.android.service.MeshForegroundService.start(this) } catch (_: Exception) { }CODE
CRITICAL…/main/java/com/bitchat/android/mesh/PacketProcessor.kt21 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.kt1048 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
237 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.py788def 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 Block16 hits · 16 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…/main/java/com/bitchat/android/ui/MessageComponents.kt261 // A fresh scroll position per conversation. Sharing one state meant a switch inherited theCOMMENT
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.py770except 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.py938CODE
LOWtools/release_gate/mesh_lab.py1011CODE
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