AI Slop Code RIsk Monitor

kivy/python-for-android

Turn your Python application into an Android APK

13.4 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for kivy/python-for-android, a Python project with 8,930 GitHub stars. SynthScan examined 33,434 lines of code across 325 source files, recording 344 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 13.4 (Moderate 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.

13.4
Adjusted Signal
13.4
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
8.9K
Stars
Python
Language
33.4K
Lines of Code
325
Files
344
Pattern Hits
2026-10-12
Scan Date
0.04
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 40.5/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 1.8/100 · LOW

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

Agent Over-Engineering Ratio 38.5/100 · MEDIUM

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

PR Review Velocity Impact 48.8/100 · MEDIUM

Which changes need focused human review? 344 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 13MEDIUM 19LOW 312

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 344 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.

Hyper-Verbose Identifiers221 hits · 235 pts
SeverityFileLineSnippetContext
LOWtestapps/on_device_unit_tests/test_app/tools.py19def run_test_suites_into_buffer(suites):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py26def get_images_with_extension(path=APP_PATH, extension='*.png'):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py63def get_failed_unittests_from(unittests_output, set_of_tests):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py72def skip_if_not_running_from_android_device(func):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py94def get_android_python_activity():CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py166def setup_lifecycle_callbacks():CODE
LOWtestapps/on_device_unit_tests/test_app/app_flask.py39def get_html_for_tested_modules(tested_modules, failed_tests):CODE
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py103 def set_color_for_tested_modules(self, restart=False):STRING
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py136 def test_vibration_with_pyjnius(self, *args):STRING
LOWtests/test_toolchain.py14def patch_argparse_print_help():CODE
LOW⚡tests/test_prerequisites.py28 def test_is_mandatory_on_darwin(self):CODE
LOW⚡tests/test_prerequisites.py31 def test_is_mandatory_on_linux(self):CODE
LOW⚡tests/test_prerequisites.py34 def test_installer_is_supported_on_darwin(self):CODE
LOW⚡tests/test_prerequisites.py40 def test_installer_is_supported_on_linux(self):CODE
LOW⚡tests/test_prerequisites.py46 def test_darwin_pkg_config_location(self):CODE
LOW⚡tests/test_prerequisites.py49 def test_linux_pkg_config_location(self):CODE
LOW⚡tests/test_prerequisites.py53 def test_pkg_config_location_property__darwin(self):CODE
LOW⚡tests/test_prerequisites.py60 def test_pkg_config_location_property__linux(self):CODE
LOW⚡tests/test_prerequisites.py351 def test_checker_calls_linux_checker(self, mock_linux_checker):CODE
LOW⚡tests/test_prerequisites.py361 def test_checker_calls_darwin_checker(self, mock_darwin_checker):CODE
LOW⚡tests/test_prerequisites.py370 def test_checker_raises_on_unsupported_platform(self):CODE
LOW⚡tests/test_prerequisites.py382 def test_ask_to_install_user_accepts(self, mock_input):CODE
LOW⚡tests/test_prerequisites.py392 def test_ask_to_install_user_declines(self, mock_input):CODE
LOW⚡tests/test_prerequisites.py402 def test_ask_to_install_non_interactive(self, mock_info):CODE
LOW⚡tests/test_prerequisites.py426 def test_install_when_user_accepts_darwin(self, mock_installer, mock_ask):CODE
LOW⚡tests/test_prerequisites.py436 def test_install_when_user_declines(self, mock_info, mock_ask):CODE
LOW⚡tests/test_prerequisites.py445 def test_install_is_supported(self):CODE
LOWtests/test_prerequisites.py132 def test_darwin_pkg_config_location(self, _darwin_get_brew_formula_location_prefix):CODE
LOWtests/test_prerequisites.py279 def test_default_darwin_prerequisites_set(self):CODE
LOWtests/test_prerequisites.py297 def test_default_linux_prerequisites_set(self):CODE
LOWtests/test_prerequisites.py324 def test_is_valid_when_not_met_non_mandatory(self, mock_checker, mock_warning):CODE
LOWtests/test_prerequisites.py338 def test_is_valid_when_not_met_mandatory(self, mock_checker, mock_error):CODE
LOWtests/test_prerequisites.py415 def test_install_when_user_accepts_linux(self, mock_info, mock_installer, mock_ask):CODE
LOWtests/test_prerequisites.py458 def test_darwin_jdk_is_supported_valid_version(self, mock_exists, mock_popen):CODE
LOWtests/test_prerequisites.py474 def test_darwin_jdk_is_supported_invalid_version(self, mock_exists, mock_popen):CODE
LOWtests/test_prerequisites.py488 def test_darwin_jdk_is_supported_no_javac(self, mock_exists):CODE
LOWtests/test_prerequisites.py496 def test_darwin_get_libexec_jdk_path(self, mock_run):CODE
LOWtests/test_prerequisites.py509 def test_darwin_checker_uses_java_home_env(self, mock_is_supported):CODE
LOWtests/test_prerequisites.py523 def test_darwin_get_brew_formula_location_prefix_success(self, mock_popen):CODE
LOWtests/test_prerequisites.py539 def test_darwin_get_brew_formula_location_prefix_failure(self, mock_error, mock_popen):CODE
LOWtests/test_prerequisites.py552 def test_darwin_get_brew_formula_location_prefix_with_installed_flag(self, mock_popen):CODE
LOWtests/test_prerequisites.py568 def test_check_and_install_all_met(self, mock_get_prereqs):CODE
LOWtests/test_prerequisites.py589 def test_check_and_install_some_not_met(self, mock_get_prereqs):CODE
LOWtests/test_pythonpackage_basic.py51def test__extract_info_from_package():CODE
LOWtests/test_pythonpackage_basic.py86def test_get_dep_names_of_package():STRING
LOWtests/test_pythonpackage_basic.py157def test_transform_dep_for_pip():STRING
LOWtests/test_pythonpackage_basic.py195def test_parse_as_folder_reference():STRING
LOWtests/test_pythonpackage_basic.py213def test_parse_as_folder_reference_edge_cases(input_ref, expected):STRING
LOWtests/test_pythonpackage_basic.py230def test_is_filesystem_path_edge_cases(path, expected):CODE
LOW⚡tests/test_pythonpackage_basic.py241def test_transform_dep_for_pip_with_special_urls(input_dep, expected):CODE
LOW⚡tests/test_pythonpackage_basic.py246def test_transform_dep_for_pip_passthrough():CODE
LOW⚡tests/test_pythonpackage_basic.py252def test_get_package_name_with_error():CODE
LOW⚡tests/test_pythonpackage_basic.py264def test_get_dep_names_error_handling():CODE
LOW⚡tests/test_pythonpackage_basic.py276def test_extract_info_from_package_missing_metadata():CODE
LOWtests/test_pythonpackage_basic.py317 def run__get_system_python_executable(self, pybin):CODE
LOWtests/test_patching.py42 def test_is_platform_case_insensitive(self, mock_uname):CODE
LOWtests/test_patching.py49 def test_is_platform_mismatch(self, mock_uname):CODE
LOWtests/test_kivy_bootstrap.py56def test_get_activity_reflects_the_configured_class(kivy_bootstrap):CODE
LOW⚡tests/test_kivy_bootstrap.py72def test_get_activity_honours_custom_activity_class_name():CODE
LOW⚡tests/test_kivy_bootstrap.py81def test_get_activity_may_return_none(kivy_bootstrap):CODE
161 more matches not shown…
Empty Error Handlers12 hits · 60 pts
SeverityFileLineSnippetContext
HIGHsetup.py75except IOError:CODE
HIGHtestapps/on_device_unit_tests/test_app/main.py68except AttributeError:CODE
HIGHtests/test_bdistapk.py143except SystemExit:CODE
HIGHpythonforandroid/bootstrap.py470except ValueError:CODE
HIGHpythonforandroid/build.py464except Exception:CODE
HIGHpythonforandroid/build.py470except ValueError:CODE
HIGHpythonforandroid/graph.py181except ValueError:CODE
HIGHpythonforandroid/logger.py115except (KeyError, ValueError):CODE
HIGHpythonforandroid/logger.py123except Exception:CODE
HIGHpythonforandroid/recipe.py495except (sh.ErrorReturnCode_1, sh.ErrorReturnCode_2):CODE
HIGHpythonforandroid/pythonpackage.py564except KeyError:CODE
HIGH…thonforandroid/recipes/android/src/android/activity.py213except KeyError:CODE
Self-Referential Comments14 hits · 44 pts
SeverityFileLineSnippetContext
MEDIUMdistribute.sh3# This file is just a shim to report an error messaage if some toolCOMMENT
MEDIUM⚡tests/test_pythonpackage_basic.py268 # Create a setup.py that will failCOMMENT
MEDIUMtests/test_util.py240 # Create a test module fileCOMMENT
MEDIUMtests/test_logger.py142 # Create a mock error with required attributesCOMMENT
MEDIUMtests/test_logger.py187 # Create a proper exception class that mimics sh.ErrorReturnCodeCOMMENT
MEDIUMdoc/source/conf.py6# This file is execfile()d with the current directory set to itsCOMMENT
MEDIUMpythonforandroid/pythonpackage.py124 # This function is required by get_package_as_folder() to workCOMMENT
MEDIUMpythonforandroid/pythonpackage.py267 # Create a venv to install into:COMMENT
MEDIUMpythonforandroid/recipes/hostpython3/__init__.py159 # Create a subdirectory to actually perform the buildCOMMENT
MEDIUMpythonforandroid/recipes/hostpython3/__init__.py176 # Create the Setup file. This copying from Setup.dist isCOMMENT
MEDIUMpythonforandroid/recipes/python3/__init__.py360 # Create a subdirectory to actually perform the buildCOMMENT
MEDIUMpythonforandroid/recipes/android/src/android/mixer.py1# This module is, as much a possible, a clone of the pygameCOMMENT
MEDIUMpythonforandroid/recipes/librt/__init__.py23 # Create a temporary folder to add to link path with a fake librt.so:COMMENT
MEDIUMpythonforandroid/recipes/libpthread/__init__.py22 # Create a temporary folder to add to link path with a fake libpthread.so:COMMENT
Deep Nesting32 hits · 32 pts
SeverityFileLineSnippetContext
LOWtests/test_checkdependencies.py11CODE
LOWtests/test_checkdependencies.py21CODE
LOWpythonforandroid/bootstrap.py20CODE
LOWpythonforandroid/bootstrap.py453CODE
LOWpythonforandroid/bootstrap.py112CODE
LOWpythonforandroid/bootstrap.py251CODE
LOWpythonforandroid/build.py899CODE
LOWpythonforandroid/bdistapk.py35CODE
LOWpythonforandroid/util.py51CODE
LOWpythonforandroid/graph.py146CODE
LOWpythonforandroid/logger.py131CODE
LOWpythonforandroid/toolchain.py198CODE
LOWpythonforandroid/toolchain.py942CODE
LOWpythonforandroid/toolchain.py1002CODE
LOWpythonforandroid/toolchain.py1073CODE
LOWpythonforandroid/recipe.py206CODE
LOWpythonforandroid/recipe.py324CODE
LOWpythonforandroid/recipe.py394CODE
LOWpythonforandroid/recipe.py459CODE
LOWpythonforandroid/recipe.py557CODE
LOWpythonforandroid/recipe.py710CODE
LOWpythonforandroid/recipe.py722CODE
LOWpythonforandroid/recipe.py1558CODE
LOWpythonforandroid/pythonpackage.py120CODE
LOWpythonforandroid/pythonpackage.py246CODE
LOWpythonforandroid/pythonpackage.py381CODE
LOWpythonforandroid/pythonpackage.py472CODE
LOWpythonforandroid/pythonpackage.py571CODE
LOW…thonforandroid/recipes/android/src/android/activity.py38CODE
LOW…thonforandroid/recipes/android/src/android/activity.py52CODE
LOWpythonforandroid/recipes/reportlab/__init__.py15CODE
LOWpythonforandroid/recipes/scipy/wrapper.py32CODE
Excessive Try-Catch Wrapping21 hits · 24 pts
SeverityFileLineSnippetContext
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py161 except Exception as err:STRING
LOWpythonforandroid/build.py464 except Exception:CODE
LOWpythonforandroid/build.py591 except Exception:CODE
LOWpythonforandroid/build.py613 except Exception:CODE
LOWpythonforandroid/build.py644 except Exception as e:CODE
LOWpythonforandroid/build.py651 except Exception:CODE
LOWpythonforandroid/logger.py123 except Exception:CODE
MEDIUMpythonforandroid/logger.py112def get_console_width():CODE
LOWpythonforandroid/recipe.py201 except Exception as ex:CODE
LOWpythonforandroid/recipe.py1298 except Exception:CODE
LOWpythonforandroid/recipe.py1356 except Exception:CODE
LOWpythonforandroid/recipe.py1494 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py67 except Exception as e:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py91 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py103 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py126 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py227 except Exception:CODE
MEDIUM…randroid/recipes/android/src/android/display_cutout.py55def onApplyWindowInsets(self, view, insets):CODE
LOW…honforandroid/recipes/android/src/android/broadcast.py88 except Exception as e:CODE
MEDIUM…honforandroid/recipes/android/src/android/broadcast.py84def stop(self):CODE
LOWpythonforandroid/recipes/primp/__init__.py27 except Exception:CODE
Over-Commented Block16 hits · 16 pts
SeverityFileLineSnippetContext
LOWdoc/source/conf.py1# -*- coding: utf-8 -*-COMMENT
LOWdoc/source/conf.py81version = get_version()COMMENT
LOWdoc/source/conf.py101COMMENT
LOWdoc/source/conf.py121#modindex_common_prefix = []COMMENT
LOWdoc/source/conf.py141# Add any paths that contain custom themes here, relative to this directory.COMMENT
LOWdoc/source/conf.py161# relative to this directory. They are copied after the builtin static files,COMMENT
LOWdoc/source/conf.py181# Additional templates that should be rendered to pages, maps page names toCOMMENT
LOWdoc/source/conf.py201#html_show_copyright = TrueCOMMENT
LOWdoc/source/conf.py221# The name of a javascript file (relative to the configuration directory) thatCOMMENT
LOWdoc/source/conf.py241#'figure_align': 'htbp',COMMENT
LOW…onforandroid/includes/arm64-v8a/machine/cpu-features.h1#ifndef _ARM64_CPU_FEATURESCOMMENT
LOWpythonforandroid/recipes/tflite-runtime/__init__.py1from pythonforandroid.recipe import PythonRecipe, current_directory, \COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c81#include <dirent.h>COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c101#define RBRACKET ']'COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c121COMMENT
LOWpythonforandroid/recipes/libxml2/glob.h81#define GLOB_ABORTED (-2) /* Unignored error. */COMMENT
Unused Imports11 hits · 11 pts
SeverityFileLineSnippetContext
LOWtestapps/testapp_vispy/main.py14CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py20CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py61CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py117CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py276CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py287CODE
LOWtestapps/testapp_sqlite_openssl/main.py30CODE
LOWtestapps/testapp_sqlite_openssl/main.py32CODE
LOWtestapps/testapp_sqlite_openssl/main.py47CODE
LOWtests/test_pythonpackage_basic.py52CODE
LOW…thonforandroid/recipes/android/src/android/__init__.py8CODE
Redundant / Tautological Comments5 hits · 8 pts
SeverityFileLineSnippetContext
LOWci/run_emulator_tests.sh34 # Check if all success patterns are presentCOMMENT
LOWpythonforandroid/bootstrap.py266 # Check if the bootstap's dependencies have an internal conflict:COMMENT
LOWpythonforandroid/bootstrap.py272 # Check if bootstrap's dependencies conflict with chosenCOMMENT
LOWpythonforandroid/build.py741 # Output messages about what we're going to do:COMMENT
LOWpythonforandroid/pythonpackage.py462 # Check if this is either not an url, or a file URL:COMMENT
Slop Phrases5 hits · 6 pts
SeverityFileLineSnippetContext
LOWpythonforandroid/toolchain.py1067 # WARNING: We should make sure to clean the build directory before building.COMMENT
LOWpythonforandroid/recipe.py879 .. warning:: don't forget to call `super().__init__()` in any recipe'sSTRING
LOWpythonforandroid/recipes/freetype/__init__.py128 # we will make sure to only install it when the library existsCOMMENT
LOWpythonforandroid/recipes/librt/__init__.py31 # Set symlinks, and make sure to update them on every build run:COMMENT
LOWpythonforandroid/recipes/libpthread/__init__.py30 # Set symlinks, and make sure to update them on every build run:COMMENT
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGH…nforandroid/recipes/android/src/android/permissions.py564Requests Android permissions. Args: permissions (str): A list of permissions to requests (str) callSTRING
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…honforandroid/recipes/android/src/android/broadcast.py1# -------------------------------------------------------------------COMMENT
Dead Code1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMpythonforandroid/recipes/pyzmq/__init__.py50CODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/test_pythonpackage_basic.py45 Lorem Ipsum"""CODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/test_util.py244 f.write("def test_function():\n")CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…nforandroid/recipes/android/src/android/permissions.py621CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…thonforandroid/recipes/android/src/android/darkmode.py35def set_dark_mode_listener(on_dark_mode_changed: Callable[[bool], None] | None) -> None:CODE