AI Slop Code Risk Monitor

LawnchairLauncher/lawnchair

SlopCodeMonitor badge for LawnchairLauncher/lawnchair Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

No clever tagline needed.

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for LawnchairLauncher/lawnchair, a Java project with 13,832 GitHub stars. SynthScan examined 1,050,282 lines of code across 6811 source files, recording 130 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 0.7 (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.

0.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
13.8K
Stars
Java
Language
1.1M
Lines of Code
6.8K
Files
130
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 0.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 2.6/100 · LOW

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

Agent Over-Engineering Ratio 0.1/100 · LOW

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

PR Review Velocity Impact 3.1/100 · LOW

Which changes need focused human review? 130 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 51HIGH 3MEDIUM 27LOW 49

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 130 distinct pattern matches across 12 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 Indicators51 hits · 540 pts
SeverityFileLineSnippetContext
CRITICALlawnchair/src/app/lawnchair/theme/ComposeColorScheme.kt81fun dev.kdrag0n.monet.theme.ColorScheme.toComposeColorScheme(isDark: Boolean): ColorScheme = remember(this, isDark) {CODE
CRITICAL⚡lawnchair/src/app/lawnchair/font/FontCache.kt419 androidx.compose.ui.text.font.Font(CODE
CRITICAL⚡lawnchair/src/app/lawnchair/font/FontCache.kt421 variationSettings = androidx.compose.ui.text.font.FontVariation.Settings(CODE
CRITICAL⚡lawnchair/src/app/lawnchair/font/FontCache.kt423 androidx.compose.ui.text.font.FontVariation.Setting(it.key, it.value)CODE
CRITICALlawnchair/src/app/lawnchair/font/FontCache.kt505 androidx.compose.ui.text.googlefonts.Font(CODE
CRITICAL…c/com/android/launcher3/taskbar/TaskbarOverflowTest.kt613 context.baseContext.appComponent.launcherAppState.model.addCallbacks(modelCallback)CODE
CRITICAL…c/com/android/quickstep/util/AppPairsControllerTest.kt355 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…c/com/android/quickstep/util/AppPairsControllerTest.kt383 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…c/com/android/quickstep/util/AppPairsControllerTest.kt414 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…c/com/android/quickstep/util/AppPairsControllerTest.kt445 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…c/com/android/quickstep/util/AppPairsControllerTest.kt473 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…/launcher3/taskbar/TaskbarLauncherStateController.java432 com.android.launcher3.taskbar.Utilities.setOverviewDragState(CODE
CRITICAL…com/android/quickstep/RecentsAnimationDeviceState.java362 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICALquickstep/src/com/android/quickstep/GestureState.java346 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…src/com/android/quickstep/util/AppPairsController.java462 if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {CODE
CRITICAL…ndroid/quickstep/recents/ui/viewmodel/TaskViewModel.kt113 com.android.launcher3.util.coroutines.combine(CODE
CRITICAL…om/android/wm/shell/common/DisplayControllerTests.java100 androidx.test.platform.app.InstrumentationRegistry.getInstrumentation()CODE
CRITICAL…ndroid/wm/shell/windowdecor/WindowDecorationTests.java1259 if (com.android.window.flags.Flags.relativeInsets()) {CODE
CRITICAL…ndroid/wm/shell/windowdecor/WindowDecorationTests.java1270 if (com.android.window.flags.Flags.relativeInsets()) {CODE
CRITICAL…ndroid/wm/shell/windowdecor/WindowDecorationTests.java1281 if (com.android.window.flags.Flags.relativeInsets()) {CODE
CRITICAL…ll/windowdecor/DesktopModeWindowDecorViewModelTests.kt534 decor.mTaskInfo.configuration.windowConfiguration.bounds.set(movedMaximizedBounds)CODE
CRITICAL…ll/windowdecor/DesktopModeWindowDecorViewModelTests.kt558 decor.mTaskInfo.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS)CODE
CRITICAL…android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt62 Assume.assumeTrue(com.android.wm.shell.Flags.enablePip2())CODE
CRITICAL…/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java37 && com.android.window.flags2.Flags.excludeTaskFromRecents();CODE
CRITICAL⚡…/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java63 if (!com.android.window.flags2.Flags.enableSeeThroughTaskFragments()) {CODE
CRITICAL⚡…/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java68 if (!com.android.window.flags2.Flags.respectLeafTaskBounds()) {CODE
CRITICAL⚡…/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java72 return com.android.window.flags2.Flags.rootTaskForBubble();CODE
CRITICAL…roid/wm/shell/transition/DefaultTransitionHandler.java365 final boolean isTaskTransition = com.android.window.flags2.Flags.transitionHandlerCujTags()CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java115 com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition();CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java138 com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition();CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java154 com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition();CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java169 com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition();CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java246 new com.android.wm.shell.nano.WmShellTransitionTraceProto();CODE
CRITICAL…m/shell/transition/tracing/LegacyTransitionTracer.java270 new com.android.wm.shell.nano.HandlerMapping();CODE
CRITICAL…ll/src/com/android/wm/shell/draganddrop/DragUtils.java60 if (com.android.window.flags2.Flags.delegateUnhandledDrags()CODE
CRITICAL…com/android/wm/shell/splitscreen/StageCoordinator.java1066 if (com.android.window.flags.Flags.fixLayoutRestoredTask()CODE
CRITICAL…com/android/wm/shell/splitscreen/StageCoordinator.java1078 } else if (com.android.window.flags.Flags.fixLayoutRestoredTask()) {CODE
CRITICAL…/android/wm/shell/taskview/TaskViewTaskController.java416 if (com.android.window.flags2.Flags.relativeInsets()) {CODE
CRITICAL…src/com/android/wm/shell/bubbles/BubbleController.java565 if (com.android.window.flags2.Flags.enableExperimentalBubblesController()) {CODE
CRITICAL…src/com/android/wm/shell/bubbles/BubbleController.java1428 if (com.android.window.flags2.Flags.rootTaskForBubble()) {CODE
CRITICAL…rc/com/android/wm/shell/bubbles/BubbleTransitions.java216 if (com.android.wm.shell.Flags.enableBubbleBar()CODE
CRITICAL…rc/com/android/wm/shell/bubbles/BubbleTransitions.java226 if (com.android.wm.shell.Flags.enableBubbleBar()) {CODE
CRITICAL…android/wm/shell/windowdecor/WindowDecorationInsets.kt42 if (com.android.window.flags.Flags.relativeInsets()) {CODE
CRITICAL…Lib/src/main/java/android/window/RemoteTransition.java79 com.android.internal.util.AnnotationValidations.validate(CODE
CRITICAL…Lib/src/main/java/android/window/RemoteTransition.java116 com.android.internal.util.AnnotationValidations.validate(CODE
CRITICAL…Lib/src/main/java/android/window/RemoteTransition.java179 com.android.internal.util.AnnotationValidations.validate(CODE
CRITICAL…systemui/shared/rotation/RotationButtonController.java727 if (android.hardware.devicestate.feature.flags.Flags.deviceStatePropertyMigration()) {CODE
CRITICALsrc/com/android/launcher3/Workspace.java678 com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(mPreferenceManager2.getSmartspaceMode(),CODE
CRITICALsrc/com/android/launcher3/Workspace.java3933 com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(mPreferenceManager2.getDefaultHomePage(), pageInCODE
CRITICALsrc/com/android/launcher3/Hotseat.java148 com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(preferenceManager2.getHotseatMode(), hotseatCODE
CRITICALsrc/com/android/launcher3/views/OptionsPopupView.java281 com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(preferenceManager2.getLockHomeScreen(), !oldValuCODE
AI Slop Vocabulary20 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUM…earch/algorithms/engine/provider/FileSearchProvider.kt277 // However, it's more robust to check the file system attributes if possible,COMMENT
MEDIUM…/launcher3/taskbar/TaskbarLauncherStateController.java549 // We're about to be paused, set immediately to ensure seamless handoff.COMMENT
MEDIUM…/launcher3/taskbar/TaskbarLauncherStateController.java1144 // Update the visible state immediately to ensure a seamless handoffCOMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java978 // Seamless if all tasks are seamlessCOMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java987 // Not seamless if there is PiP (or any other non-seamless task)COMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java998 // Not seamless if there is no changed task.COMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java1005 // Not seamless if the nav bar cares rotation and one of rotations is upside-down.COMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java1017 // Not seamless if system alert windowsCOMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java1028 // Seamless if display is explicitly seamless.COMMENT
MEDIUM…/android/wm/shell/transition/ShellTransitionTests.java1910 // By default we ignore nav bar in deciding if a seamless rotation is allowed.COMMENT
MEDIUM…/com/android/wm/shell/ConnectedDisplayCujSmokeTests.kt73// TODO(b/416608975) - Move the utility methods to shared library or/and utilize existing library (COMMENT
MEDIUM…roid/wm/shell/transition/DefaultTransitionHandler.java258 // We only enable seamless rotation if all the visible task windows requested it.COMMENT
MEDIUM…roid/wm/shell/transition/DefaultTransitionHandler.java296 // so do not use seamless rotation.COMMENT
MEDIUM…/src/com/android/wm/shell/pip2/phone/PipScheduler.java368 // Take a screenshot of PiP and fade it out after resize is finished if seamless resizeCOMMENT
MEDIUM…com/android/wm/shell/back/BackAnimationController.java1370 // merged transition must be applied with the first transition to ensure a seamlessCOMMENT
MEDIUMwmshell/src/com/android/wm/shell/pip/PipTransition.java538 // done at the start. But if it is running fixed rotation, there will be a seamlessCOMMENT
MEDIUMwmshell/src/com/android/wm/shell/pip/PipTransition.java675 // Fade out the existing PiP to avoid jump cut during seamless rotation.COMMENT
MEDIUMwmshell/src/com/android/wm/shell/pip/PipTransition.java803 // utilize fixed rotation transitions for exiting pip) is enabled (See b/288910069).COMMENT
MEDIUM…ell/src/com/android/wm/shell/pip/PipTaskOrganizer.java1530 // Animate with a cross-fade if enabled and seamless resize is disables by the app.COMMENT
MEDIUMsrc/com/android/launcher3/CellLayout.java1122 // We leverage the actual layout logic in the layout params and hence need to modifyCOMMENT
Over-Commented Block32 hits · 32 pts
SeverityFileLineSnippetContext
LOWflowerpot/merge.py1 # This file is part of Lawnchair Launcher.COMMENT
LOWflowerpot/playstore.py1# This file is part of Lawnchair Launcher.COMMENT
LOW…ava/app/lawnchair/baseline/BaselineProfileGenerator.kt41 @TestCOMMENT
LOW…/main/java/app/lawnchair/baseline/StartupBenchmarks.kt61 // TODO Add interactions to wait for when your app is fully drawn.COMMENT
LOW…c/com/android/launcher3/model/GridSizeMigrationTest.kt581 addItem(ITEM_TYPE_DEEP_SHORTCUT, 1, CONTAINER_HOTSEAT, 0, 0, testPackage7)COMMENT
LOW…nchair/src/com/androidinternal/graphics/cam/Frame.java41 // sRGB ambient illuminance = 64 lux (per sRGB spec). However, the spec notes this isCOMMENT
LOW…nchair/src/com/androidinternal/graphics/cam/Frame.java141 float c = (f >= 0.9) ? MathUtils.lerp(0.59f, 0.69f, ((f - 0.9f) * 10.0f)) : MathUtils.lerp(COMMENT
LOWlawnchair/src/com/androidinternal/graphics/cam/Cam.java341 * inCOMMENT
LOWlawnchair/src/com/androidinternal/graphics/cam/Cam.java361 // outside 0-255COMMENT
LOW…m/android/launcher3/taskbar/TaskbarViewController.java1201 // Note that there is no All Apps button in the hotseat,COMMENT
LOW…id/launcher3/taskbar/bubbles/BubbleDragController.java401 private enum State {COMMENT
LOW…/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt261 // the arrow stays at the same distance from the left edge of the barCOMMENT
LOWquickstep/src/com/android/quickstep/TaskViewUtils.java361 // at t = 0, we know that the simulator matches the thumbnailView. So if we apply K(0)`COMMENT
LOW…/quickstep/util/LauncherUnfoldAnimationController.java161 mUnfoldMoveFromCenterWorkspaceAnimator.updateRegisteredViewsIfNeeded();COMMENT
LOWquickstep/src/com/android/quickstep/views/TaskView.kt1521 val failureListener = TaskRemovedDuringLaunchListener(context.applicationContext)COMMENT
LOW…t/src/com/android/wm/shell/bubbles/BubbleDataTest.java1021 sendUpdatedEntryAtTime(mEntryB1, 6000); // [B2=4000, A2=3000, B1=6000, A1=1000]COMMENT
LOW…roid/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt101 override fun visibleLayersShownMoreThanOneConsecutiveEntry() {COMMENT
LOW…hell/desktopmode/multidesks/DesksTransitionObserver.kt481 val taskInfo = checkNotNull(change.taskInfo) { "Expected non-null task info" }COMMENT
LOW…rc/com/android/wm/shell/pip/phone/PipTouchHandler.java661 if (resize) {COMMENT
LOW…m/shell/startingsurface/SplashscreenWindowCreator.java141 suggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREENCOMMENT
LOW…oid/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java521 if (bbev == null) {COMMENT
LOW…/wm/shell/windowdecor/DesktopModeWindowDecoration.java401 // The visibility, crop and position of the task should only be set when a task isCOMMENT
LOW…ctivityembedding/ActivityEmbeddingAnimationRunner.java361 // For the first iteration, we prepare the animation for the change type windows. This isCOMMENT
LOWcompatLib/src/main/java/android/view/InsetsSource.java521 // |boundingRect| was provided relative to |frame|. Make it absolute to be in the sameCOMMENT
LOW…emUI/animation/src/com/android/systemui/util/Dialog.kt81 return nullCOMMENT
LOW…c/com/android/systemui/animation/TransitionAnimator.kt1021 // the dialog overlay back to its original position, and this change must be reflectedCOMMENT
LOW…ystemui/surfaceeffects/shaderutil/ShaderUtilLibrary.kt101 // Return range roughly [-1,1].COMMENT
LOW…ystemui/surfaceeffects/shaderutil/ShaderUtilLibrary.kt121 // For example in 2D, we can find the triangle (simplex shape in 2D) that we are inCOMMENT
LOW…/android/systemui/shared/system/QuickStepContract.java81 // The search feature is disabled (either by SUW/SysUI/device policy)COMMENT
LOW…/android/systemui/shared/system/QuickStepContract.java121 // Note that the device is awake on while waking up on, but not while going to sleep.COMMENT
LOW…ndroid/launcher3/util/WallpaperOffsetInterpolator.java81 return;COMMENT
LOWsrc/com/android/launcher3/views/BaseDragLayer.java81 public void set(LayoutParams lp, Integer y) {COMMENT
Excessive Try-Catch Wrapping7 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUM⚡ci.py46 print(f"Error: Beta artifact not found at {beta_path}")CODE
LOW⚡ci.py67 except Exception as e:CODE
MEDIUM⚡ci.py68 print(f"Error processing directory {full_path}: {e}")CODE
MEDIUM⚡ci.py76 print(f"Error fetching commits: {error}")CODE
LOWflowerpot/playstore.py222 except Exception as e:CODE
MEDIUMflowerpot/playstore.py271 print(f'Error at app: {id}')CODE
MEDIUMflowerpot/playstore.py315 print(f'Error at app: {id}')CODE
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGH…ui/shared/recents/utilities/PreviewPositionHelper.java125 // > the final clipped position has same aspect ratio as requested by canvasCOMMENT
HIGH…c/com/android/launcher3/statemanager/StateManager.java273 // We are running the same animation as requested, and/or target state should not beCOMMENT
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMflowerpot/merge.py1 # This file is part of Lawnchair Launcher.COMMENT
MEDIUMflowerpot/playstore.py1# This file is part of Lawnchair Launcher.COMMENT
Hyper-Verbose Identifiers4 hits · 6 pts
SeverityFileLineSnippetContext
LOWci.py19def send_message_to_telegram_chat(chat_id, message, silent):CODE
LOW⚡ci.py31def send_document_to_telegram_chat(chat_id, document):CODE
LOW⚡ci.py38def send_artifact_to_telegram_chat(chat_id):CODE
LOW⚡ci.py70def send_internal_notifications():CODE
Unused Imports5 hits · 5 pts
SeverityFileLineSnippetContext
LOWci.py5CODE
LOWflowerpot/playstore.py16CODE
LOWflowerpot/playstore.py19CODE
LOWflowerpot/playstore.py21CODE
LOWtools/translations_importer/apkutils.py1CODE
Empty Error Handlers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHflowerpot/playstore.py222except Exception as e:CODE
Slop Phrases3 hits · 4 pts
SeverityFileLineSnippetContext
LOW…oid/launcher3/taskbar/NavbarButtonsViewController.java807 * Does not call {@link #applyState()}. Don't forget to!COMMENT
LOW…/com/android/launcher3/taskbar/TaskbarControllers.java89 * Want to add a new controller? Don't forget to:COMMENT
LOW…droid/launcher3/taskbar/bubbles/BubbleControllers.java54 * Want to add a new controller? Don't forget to:COMMENT
Deep Nesting2 hits · 2 pts
SeverityFileLineSnippetContext
LOWci.py38CODE
LOWtools/translations_importer/apkutils.py24CODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…nchair/src/app/lawnchair/ui/placeholder/Placeholder.kt117 name = "placeholder"CODE