AI Slop Code Risk Monitor

HeliBorg/HeliBoard

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

Customizable and privacy-conscious open-source keyboard

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for HeliBorg/HeliBoard, a Kotlin project with 6,468 GitHub stars. SynthScan examined 201,858 lines of code across 2076 source files, recording 123 pattern matches distributed across 9 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-31
Last Push
6.5K
Stars
Kotlin
Language
201.9K
Lines of Code
2.1K
Files
123
Pattern Hits
2026-10-31
Scan Date
0.00
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.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.4/100 · LOW

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

Agent Over-Engineering Ratio 0.1/100 · LOW

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

PR Review Velocity Impact 3.1/100 · LOW

Which changes need focused human review? 123 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 0MEDIUM 3LOW 120

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 123 distinct pattern matches across 9 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 Block96 hits · 96 pts
SeverityFileLineSnippetContext
LOW…eys/src/main/resources/emoji/android-emoji-support.txt1# This file defines emoji compatibility through different Android releases.COMMENT
LOW…-keys/src/main/resources/emoji/ucd/14.0/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/14.0/emoji-test.txt21# unqualified — a unqualified emoji (See ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/14.0/emoji-test.txt4981COMMENT
LOW…-keys/src/main/resources/emoji/ucd/17.0/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/17.0/emoji-test.txt21# unqualified — an unqualified emoji (see ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/13.1/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/13.1/emoji-test.txt21# unqualified — a unqualified emoji (See ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/16.0/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/16.0/emoji-test.txt21# unqualified — a unqualified emoji (See ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/16.0/emoji-test.txt5321COMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.0/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.0/emoji-test.txt21# unqualified — a unqualified emoji (See ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.0/emoji-test.txt5021# unqualified : 242COMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.1/emoji-test.txt1# emoji-test.txtCOMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.1/emoji-test.txt21# unqualified — a unqualified emoji (See ED-19 in UTS #51)COMMENT
LOW…-keys/src/main/resources/emoji/ucd/15.1/emoji-test.txt5321# minimally-qualified : 1009COMMENT
LOW…/main/java/helium314/keyboard/settings/SearchScreen.kt81 // a solution would be using a list(visible to key)COMMENT
LOW…java/helium314/keyboard/latin/RichInputConnection.java441 }COMMENT
LOW…java/helium314/keyboard/latin/RichInputConnection.java981 final int oldSelEnd, final int newSelEnd, final int composingSpanStart, final int composingSpanEnd) {COMMENT
LOW…java/helium314/keyboard/latin/RichInputConnection.java1101 (!TextUtils.isEmpty(selectedText) && mExpectedSelEnd == mExpectedSelStart)) {COMMENT
LOW…p/src/main/java/helium314/keyboard/latin/LatinIME.java841COMMENT
LOW…/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt341 // Even if the user capitalizes manually, they most likely don't want the capitalized form suggested.COMMENT
LOW…ain/java/helium314/keyboard/latin/utils/TextRange.java61 // extends from 0 to 7. But if we call #getSpans(-1, 5) we'll get both the 0~4 andCOMMENT
LOW…/helium314/keyboard/latin/utils/NgramContextUtils.java21 // Intentional empty constructor for utility class.COMMENT
LOW…ain/java/helium314/keyboard/latin/utils/ScriptUtils.kt81 // Russian and are not used by our dictionary.COMMENT
LOW…in/java/helium314/keyboard/latin/utils/SubtypeUtils.kt101COMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java61 // CAP_MODE_CHARACTERS is always on.COMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java141 // if i == j clause), so we need MODE_WORDS to be on. And we don't need to evaluateCOMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java181 | TextUtils.CAP_MODE_SENTENCES) & reqModes;COMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java201 // letter => WORDCOMMENT
LOW…a/helium314/keyboard/latin/common/WordBreakIterator.kt121 // also we might want to treat ' and - differently (that's our only word connectors atm)COMMENT
LOW…14/keyboard/latin/makedict/BinaryDictEncoderUtils.java221 // to merge tails, and removing the node from the list would be necessary. However,COMMENT
LOW…14/keyboard/latin/makedict/BinaryDictEncoderUtils.java581 // until this is done, we'll write 0 and slightly overestimate this case.COMMENT
LOW…va/helium314/keyboard/latin/inputlogic/InputLogic.java401COMMENT
LOW…va/helium314/keyboard/latin/inputlogic/InputLogic.java421 // into account, which means we have to reset the entire composing state whenever thereCOMMENT
LOW…va/helium314/keyboard/latin/inputlogic/InputLogic.java1041 // and not for a correctionCOMMENT
LOW…va/helium314/keyboard/latin/inputlogic/InputLogic.java1061 // We never go into composing state if suggestions are not requested.COMMENT
LOW…va/helium314/keyboard/latin/inputlogic/InputLogic.java1201 // If we are in phantom space state, and the user presses a separator, we want toCOMMENT
LOW…va/helium314/keyboard/latin/inputlogic/SpaceState.java21 public static final int NONE = 0;COMMENT
LOW…/main/java/helium314/keyboard/event/DeadKeyCombiner.kt101 // U+030B: COMBINING DOUBLE ACUTE ACCENTCOMMENT
LOW…/main/java/helium314/keyboard/event/DeadKeyCombiner.kt121 // U+0315: COMBINING COMMA ABOVE RIGHTCOMMENT
LOW…/main/java/helium314/keyboard/event/DeadKeyCombiner.kt141 // U+0344: COMBINING GREEK DIALYTIKA TONOSCOMMENT
LOWapp/src/main/java/helium314/keyboard/event/Event.kt21 * user has slid out of the key), etc. It may also be a batch input from a gesture or handwritingCOMMENT
LOWapp/src/main/java/helium314/keyboard/event/Event.kt41 val keyCode: Int = NOT_A_KEY_CODE,COMMENT
LOWapp/src/main/java/helium314/keyboard/event/Event.kt101 private enum class EventType {COMMENT
LOW…/src/main/java/helium314/keyboard/event/HapticEvent.kt1package helium314.keyboard.eventCOMMENT
LOW…/src/main/java/helium314/keyboard/event/HapticEvent.kt21// } else {COMMENT
LOW…ium314/keyboard/keyboard/KeyboardActionListenerImpl.kt421 // current stateCOMMENT
LOW…va/helium314/keyboard/keyboard/internal/WeakStack.java1// SPDX-License-Identifier: GPL-3.0-onlyCOMMENT
LOW…4/keyboard/keyboard/internal/KeyPreviewDrawParams.java21 // <-width->COMMENT
LOWapp/src/main/jni/run-tests.sh1#!/bin/bashCOMMENT
LOW…jni/com_android_inputmethod_latin_BinaryDictionary.cpp21#include <cstring> // for memset()COMMENT
LOWapp/src/main/jni/src/defines.h21COMMENT
LOWapp/src/main/jni/src/defines.h101#ifndef LOG_TAGCOMMENT
LOWapp/src/main/jni/src/defines.h161#define DO_ASSERT_TESTCOMMENT
LOWapp/src/main/jni/src/defines.h181#define DEBUG_NODE DEBUG_DICT_FULLCOMMENT
LOWapp/src/main/jni/src/defines.h201COMMENT
LOWapp/src/main/jni/src/defines.h221COMMENT
LOWapp/src/main/jni/src/defines.h241#define NOT_A_WORD_ID (S_INT_MIN)COMMENT
36 more matches not shown…
Fake / Example Data11 hits · 14 pts
SeverityFileLineSnippetContext
LOWlayouts.md145* use keys with `"type": "placeholder"` forCOMMENT
LOW…src/test/java/helium314/keyboard/KeyboardParserTest.kt604 { "type": "placeholder" }CODE
LOW…src/test/java/helium314/keyboard/KeyboardParserTest.kt616 { "type": "placeholder" }, { "label": "k" }CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json3 { "$": "keyboard_state_selector", "dpad": { "type": "placeholder", "width": 0.1 } },CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json4 { "type": "placeholder" },CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json8 { "type": "placeholder" }CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json11 { "$": "keyboard_state_selector", "dpad": { "type": "placeholder", "width": 0.1 } },CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json12 { "type": "placeholder" },CODE
LOW⚡…/assets/layouts/functional/functional_keys_tablet.json17 { "type": "placeholder" },CODE
LOW…rc/main/assets/layouts/functional/functional_keys.json4 { "type": "placeholder" },CODE
LOW…/assets/layouts/functional/functional_keys_khipro.json8 { "type": "placeholder" },CODE
Verbosity Indicators5 hits · 9 pts
SeverityFileLineSnippetContext
LOWapp/src/main/java/helium314/keyboard/latin/Suggest.kt233 // We have a high score, so we need to check if this suggestion is in the correctCOMMENT
LOW⚡…java/helium314/keyboard/latin/utils/CapsModeUtils.java72 // Step 1 : check for cap MODE_CHARACTERS. If it's looked for, it's always on.COMMENT
LOW⚡…java/helium314/keyboard/latin/utils/CapsModeUtils.java79 // Step 2 : Skip (ignore at the end of input) any opening punctuation. This includesCOMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java101 // Step 3 : Search for the start of a paragraph. From the starting point computed in step 2,COMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java148 // Step 4 : Search for MODE_SENTENCES.COMMENT
Structural Annotation Overuse4 hits · 8 pts
SeverityFileLineSnippetContext
LOW⚡…java/helium314/keyboard/latin/utils/CapsModeUtils.java72 // Step 1 : check for cap MODE_CHARACTERS. If it's looked for, it's always on.COMMENT
LOW⚡…java/helium314/keyboard/latin/utils/CapsModeUtils.java79 // Step 2 : Skip (ignore at the end of input) any opening punctuation. This includesCOMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java101 // Step 3 : Search for the start of a paragraph. From the starting point computed in step 2,COMMENT
LOW…java/helium314/keyboard/latin/utils/CapsModeUtils.java148 // Step 4 : Search for MODE_SENTENCES.COMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMapp/src/main/java/helium314/keyboard/latin/Suggest.kt309 // TODO: Find a more robust way to detect distracters.COMMENT
MEDIUM…va/helium314/keyboard/latin/inputlogic/InputLogic.java1058 // We only start composing if this is a word code point. Essentially that means it's aCOMMENT
Hyper-Verbose Identifiers2 hits · 2 pts
SeverityFileLineSnippetContext
LOWtools/release.py41def check_default_values_diff():CODE
LOWtools/release.py147def update_localized_number_row():CODE
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUM…/keyboard/settings/screens/gesturedata/ReviewScreen.kt468 TopAppBar( // not in the scaffold, thus will not cover data column in wide screen layoutCODE
Unused Imports1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtools/diacritics.py3CODE
Deep Nesting1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtools/diacritics.py32CODE