AI Slop Code Risk Monitor

maxrave-dev/SimpMusic

SlopCodeMonitor badge for maxrave-dev/SimpMusic Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A cross-platform music app using YouTube Music for backend

1.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for maxrave-dev/SimpMusic, a Kotlin project with 12,603 GitHub stars. SynthScan examined 149,592 lines of code across 830 source files, recording 118 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 1.3 (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.

1.3
Adjusted Signal
1.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
12.6K
Stars
Kotlin
Language
149.6K
Lines of Code
830
Files
118
Pattern Hits
2026-10-31
Scan Date
0.01
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 3.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 2.8/100 · LOW

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

PR Review Velocity Impact 6.2/100 · LOW

Which changes need focused human review? 118 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 0HIGH 5MEDIUM 24LOW 89

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 118 distinct pattern matches across 13 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.

Over-Commented Block46 hits · 46 pts
SeverityFileLineSnippetContext
LOWcast/src/main/java/org/simpmusic/cast/CastButton.kt61 // next to, and 24dp - 12dp - 12dp leaves a 0dp content rect: the glyph wouldCOMMENT
LOW…App/src/commonMain/kotlin/com/maxrave/simpmusic/App.kt241 // Last.fm sends the user back here after they approve access, carrying the requestCOMMENT
LOW…App/src/commonMain/kotlin/com/maxrave/simpmusic/App.kt641 // Floating capsule, Apple Music style: a fixed size so it neverCOMMENT
LOW…/maxrave/simpmusic/viewModel/LocalPlaylistViewModel.kt401 )COMMENT
LOW…/maxrave/simpmusic/viewModel/LocalPlaylistViewModel.kt421// updatePlaylistDownloadState(id, DownloadState.STATE_DOWNLOADING)COMMENT
LOW…/maxrave/simpmusic/viewModel/LocalPlaylistViewModel.kt621// if (yt != null) {COMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt41// font its host happens to set; at 32sp that lands around 1.6dp one line out, which is invisible.COMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt61// and past three they level off — blur is doing most of the work by then, so driving opacity anyCOMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt81 * Apple sets lyrics far larger than body copy — a line fills most of the width and wraps after aCOMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt101//COMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt121internal val AppleMusicLyricCornerRadius = 8.dpCOMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt141// single biggest signal separating the sung line from the rest; blur and opacity only refine it.COMMENT
LOW…axrave/simpmusic/ui/component/AppleMusicLyricsLines.kt201 }COMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt101COMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt141COMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt161// ...and how long it takes to come UP, which must be its own number. One tween served bothCOMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt181// moves without the line being measured again, so nothing reflows and no line ever changes height.COMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt441 // `if (this.scrollState.isTouchScrolled || isFocused) return 0`) — you are reading ahead atCOMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt461 // though Settings hides the option below Android 12 — a DataStore restored from a backup, orCOMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt841 translatedWords: String?,COMMENT
LOW…otlin/com/maxrave/simpmusic/ui/component/LyricsView.kt1281 },COMMENT
LOW…tlin/com/maxrave/simpmusic/ui/component/SettingItem.kt41 title: String = "Title",COMMENT
LOW…n/kotlin/com/maxrave/simpmusic/ui/screen/MiniPlayer.kt1221 ) {COMMENT
LOW…/simpmusic/ui/screen/home/analytics/AnalyticsScreen.kt641 // reads as broken next to "Your recently played".COMMENT
LOW…maxrave/simpmusic/ui/screen/player/NowPlayingScreen.kt261 // by the outer Modifier.scrollable on the Column) and programmaticCOMMENT
LOW…maxrave/simpmusic/ui/screen/player/NowPlayingScreen.kt281 // Keyed on the track ALONE. It used to be keyed on the queue SIZE as well, and a changing keyCOMMENT
LOW…maxrave/simpmusic/ui/screen/player/NowPlayingScreen.kt321 // STALE page was dispatched as though the user had just swiped to it.COMMENT
LOW…c/ui/screen/player/content/NowPlayingContentSpotify.kt481 ),COMMENT
LOW…i/screen/player/content/NowPlayingContentAppleMusic.kt141 sharedViewModel.lastPlayerViewTab.valueCOMMENT
LOW…i/screen/player/content/NowPlayingContentAppleMusic.kt821 // decoded bitmap. The background IS an image, so there is no reason to route it through aCOMMENT
LOW…i/screen/player/content/NowPlayingContentAppleMusic.kt1141 state.screenData.canvasData?.url?.let { url ->COMMENT
LOW…i/screen/player/content/NowPlayingContentAppleMusic.kt1461// A 3:4 animated artwork runs under the title row by design; this only stops a landscape windowCOMMENT
LOW…reen/player/content/applemusic/AppleMusicLyricsView.kt101) {COMMENT
LOW…creen/player/content/applemusic/AppleMusicQueueView.kt121 // is exactly where the Apple Music queue diverged from QueueBottomSheet — which never computesCOMMENT
LOW…src/jvmMain/kotlin/com/maxrave/simpmusic/DesktopApp.kt101fun runDesktopApp(args: Array<String> = emptyArray()) {COMMENT
LOW…src/jvmMain/kotlin/com/maxrave/simpmusic/DesktopApp.kt121 //COMMENT
LOW…src/jvmMain/kotlin/com/maxrave/simpmusic/DesktopApp.kt161 // Note: macOS does NOT pass URI as args — it uses Apple Events via setOpenURIHandlerCOMMENT
LOW…component/LiquidGlassAppBottomNavigationBar.android.kt81 reloadDestinationIfNeeded: (KClass<*>) -> Unit,COMMENT
LOWscripts/wrap-mac-dmg.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/wrap-mac-dmg.sh21# icon outside the visible window via AppleScript so it doesn't appearCOMMENT
LOWscripts/mpv-linux/stage.sh1#!/usr/bin/env bashCOMMENT
LOW.github/workflows/pr-triage.yml1# Auto-triage for unattended AI-generated pull requests.COMMENT
LOW.github/workflows/android-release.yml261COMMENT
LOW.github/workflows/android-release.yml301 # Bundle Windows installer = install.bat + simpmusic.crt + msix.COMMENT
LOW.github/workflows/desktop-package.yml1name: Build desktop packages (cross-OS via Conveyor)COMMENT
LOW…ava/com/maxrave/simpmusic/ui/widget/TurntableWidget.kt181 // The pill is a drawable background rather than a shape drawn into theCOMMENT
Decorative Section Separators11 hits · 33 pts
SeverityFileLineSnippetContext
MEDIUM…rave/simpmusic/ui/component/FullscreenLyricsContent.kt319 // ── Foreground content column ─────────────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt305// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt309// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2262// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2266// ─────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2356 // ── Preset grid: 3 columns × 2 rows ──────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2396 // ── End of Song + Custom row ─────────────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2459 // ── Custom input (animated expand) ───────────────────────COMMENT
MEDIUM…com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt2493 // ── Set button ───────────────────────────────────────────COMMENT
MEDIUM…xrave/simpmusic/ui/screen/home/ListenTogetherScreen.kt440// ───────────────────────────────── structure ─────────────────────────────────COMMENT
MEDIUM…xrave/simpmusic/ui/screen/home/ListenTogetherScreen.kt1000// ───────────────────────────────── building blocks ─────────────────────────────────COMMENT
Structural Annotation Overuse17 hits · 32 pts
SeverityFileLineSnippetContext
LOW⚡build_and_sign_apk.sh87# Step 1: Clean the projectCOMMENT
LOW⚡build_and_sign_apk.sh92# Step 2: Build the APKCOMMENT
LOW⚡build_and_sign_apk.sh97# Step 3: Locate the built APKsCOMMENT
LOW⚡build_and_sign_apk.sh105# Step 4: Align and sign each APKCOMMENT
LOW⚡CLAUDE.md209#### Step 1: Look up official documentationCOMMENT
LOW⚡CLAUDE.md213#### Step 2: Evaluate pros, cons, and alternativesCOMMENT
LOW⚡CLAUDE.md220#### Step 3: Study OSS best practicesCOMMENT
LOW⚡CLAUDE.md225#### Step 4: Make a decision and justifyCOMMENT
LOW.claude/skills/simpmusic-release-changelog/SKILL.md19## Step 1: reconcile Project #2COMMENT
LOW.claude/skills/simpmusic-release-changelog/SKILL.md52## Step 2: write `changelogs/<version>/`COMMENT
LOW.claude/skills/find-skills/SKILL.md36### Step 1: Understand What They NeedCOMMENT
LOW.claude/skills/find-skills/SKILL.md44### Step 2: Search for SkillsCOMMENT
LOW.claude/skills/find-skills/SKILL.md67### Step 3: Present Options to the UserCOMMENT
LOW.claude/skills/find-skills/SKILL.md87### Step 4: Offer to InstallCOMMENT
LOW.claude/skills/android-gradle-logic/SKILL.md33## Step 1: Configure `settings.gradle.kts`COMMENT
LOW.claude/skills/android-gradle-logic/SKILL.md56## Step 2: Define Dependencies in `libs.versions.toml`COMMENT
LOW.claude/skills/android-gradle-logic/SKILL.md76## Step 3: Create a Convention PluginCOMMENT
Excessive Try-Catch Wrapping17 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUM…kills/android-emulator-skill/scripts/build_and_test.py26 print("Error: gradlew not found in current directory tree.")CODE
MEDIUM⚡…kills/android-emulator-skill/scripts/build_and_test.py62 print("Error details (last 20 lines):")CODE
LOW⚡…kills/android-emulator-skill/scripts/build_and_test.py66 except Exception as e:CODE
MEDIUM⚡…kills/android-emulator-skill/scripts/build_and_test.py67 print(f"Error running gradle: {e}")CODE
MEDIUM…/skills/android-emulator-skill/scripts/app_launcher.py36 print(f"Error launching app: {e}")CODE
MEDIUM…/skills/android-emulator-skill/scripts/app_launcher.py53 print(f"Error installing APK: {e}")CODE
LOW…/skills/android-emulator-skill/scripts/app_launcher.py88 except Exception:CODE
MEDIUM…/skills/android-emulator-skill/scripts/app_launcher.py112 print(f"Error: {e}")CODE
MEDIUM…laude/skills/android-emulator-skill/scripts/gesture.py66 print(f"Error: {e}")CODE
LOW…ills/android-emulator-skill/scripts/emulator_manage.py26 except Exception:CODE
LOW…ills/android-emulator-skill/scripts/emulator_manage.py50 except Exception as e:CODE
MEDIUM…skills/android-emulator-skill/scripts/screen_mapper.py129 print(f"Error: {e}")CODE
MEDIUM…ude/skills/android-emulator-skill/scripts/navigator.py89 print(f"Error: {e}")CODE
LOW.claude/skills/android-emulator-skill/scripts/common.py112 except Exception:CODE
MEDIUM…e/skills/android-emulator-skill/scripts/log_monitor.py28 print(f"Error: {e}")CODE
LOW…e/skills/android-emulator-skill/scripts/log_monitor.py55 except Exception:CODE
MEDIUM…aude/skills/android-emulator-skill/scripts/keyboard.py65 print(f"Error: {e}")CODE
Empty Error Handlers4 hits · 20 pts
SeverityFileLineSnippetContext
HIGH…ills/android-emulator-skill/scripts/emulator_manage.py26except Exception:CODE
HIGH.claude/skills/android-emulator-skill/scripts/common.py25except (subprocess.CalledProcessError, FileNotFoundError):CODE
HIGH.claude/skills/android-emulator-skill/scripts/common.py112except Exception:CODE
HIGH…e/skills/android-emulator-skill/scripts/log_monitor.py55except Exception:CODE
Verbosity Indicators4 hits · 9 pts
SeverityFileLineSnippetContext
LOW⚡build_and_sign_apk.sh87# Step 1: Clean the projectCOMMENT
LOW⚡build_and_sign_apk.sh92# Step 2: Build the APKCOMMENT
LOW⚡build_and_sign_apk.sh97# Step 3: Locate the built APKsCOMMENT
LOW⚡build_and_sign_apk.sh105# Step 4: Align and sign each APKCOMMENT
Redundant / Tautological Comments5 hits · 8 pts
SeverityFileLineSnippetContext
LOWbuild_and_sign_apk.sh18# Check if KEY_PASSWORD is setCOMMENT
LOW…/skills/android-emulator-skill/scripts/app_launcher.py83 # Check if process existsCOMMENT
LOW…ills/android-emulator-skill/scripts/emulator_manage.py22 # Check if in PATHCOMMENT
LOW…lls/android-emulator-skill/scripts/emu_health_check.sh105 # Check if inside standard pathCOMMENT
LOW.claude/skills/android-emulator-skill/scripts/common.py21 # Check if adb is in PATHCOMMENT
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGH.github/workflows/pr-triage.yml1# Auto-triage for unattended AI-generated pull requests.COMMENT
Unused Imports5 hits · 5 pts
SeverityFileLineSnippetContext
LOW…/skills/android-emulator-skill/scripts/app_launcher.py10CODE
LOW…ills/android-emulator-skill/scripts/emulator_manage.py9CODE
LOW…ills/android-emulator-skill/scripts/emulator_manage.py12CODE
LOW.claude/skills/android-emulator-skill/scripts/common.py9CODE
LOW…e/skills/android-emulator-skill/scripts/log_monitor.py11CODE
Slop Phrases2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMconfig/licenses/gnu.json5 "content": "GNU GENERAL PUBLIC LICENSE\n==========================\n\nVersion 3, 29 June 2007\n\nCopyright &copy; 20CODE
MEDIUM…/commonMain/composeResources/files/aboutlibraries.json9031 "content": "GNU GENERAL PUBLIC LICENSE\n==========================\n\nVersion 3, 29 June 2007\n\nCopyright &CODE
Deep Nesting3 hits · 3 pts
SeverityFileLineSnippetContext
LOW…/skills/android-emulator-skill/scripts/app_launcher.py91CODE
LOW…laude/skills/android-emulator-skill/scripts/gesture.py13CODE
LOW…ude/skills/android-emulator-skill/scripts/navigator.py68CODE
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOW.claude/skills/android-emulator-skill/SKILL.md27python scripts/navigator.py --find-type EditText --enter-text "user@example.com"CODE
LOW…mobile-android-design/references/android-navigation.md277 "John Doe",CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/wrap-mac-dmg.sh25# Usage:COMMENT