AI Slop Code Risk Monitor

RaspberryPiFoundation/blockly

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

The web-based visual programming editor.

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for RaspberryPiFoundation/blockly, a TypeScript project with 13,600 GitHub stars. SynthScan examined 352,600 lines of code across 1604 source files, recording 192 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 0.8 (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.8
Adjusted Signal
0.8
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
13.6K
Stars
TypeScript
Language
352.6K
Lines of Code
1.6K
Files
192
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 2.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.8/100 · LOW

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

Agent Over-Engineering Ratio 2.0/100 · LOW

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

PR Review Velocity Impact 4.1/100 · LOW

Which changes need focused human review? 192 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 1HIGH 15MEDIUM 8LOW 168

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 192 distinct pattern matches across 15 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 Identifiers101 hits · 102 pts
SeverityFileLineSnippetContext
LOW…ugins/field-multilineinput/src/field_multilineinput.ts683export function registerFieldMultilineInput() {CODE
LOW…kages/plugins/block-shareable-procedures/test/index.js115function createSerializationListener(workspace, textAreaId) {CODE
LOW…ck-shareable-procedures/test/procedure_test_helpers.js23export function createGenUidStubWithReturns(returnIds) {CODE
LOW…ck-shareable-procedures/test/procedure_test_helpers.js57export function assertCallBlockArgsStructure(callBlock, args) {CODE
LOW…ckages/plugins/block-shareable-procedures/src/index.ts47export function unregisterProcedureBlocks() {CODE
LOW…ckages/plugins/block-shareable-procedures/src/index.ts58export function registerProcedureSerializer() {CODE
LOW…lugins/suggested-blocks/test/suggested_blocks.mocha.js135 function assertSuggestedListEquals(blockList, expectedBlockIds) {CODE
LOW…block-plus-minus/test/procedures_test_helpers.mocha.js182function assertProcBlocksStructure(CODE
LOW…kages/plugins/block-plus-minus/test/text_join.mocha.js33 function assertTextJoinBlockStructure(block, inputCount) {CODE
LOW…ges/plugins/workspace-backpack/src/backpack_helpers.ts20function registerRemoveFromBackpack() {CODE
LOW…gins/block-dynamic-connection/test/dynamic_if.mocha.js40 function connectBooleanBlockToConnection(workspace, connection) {CODE
LOW…gins/block-dynamic-connection/test/dynamic_if.mocha.js52 function connectStatementBlockToConnection(workspace, connection) {CODE
LOW…rs/test/field_colour_hsv_sliders_test_helpers.mocha.js17function assertColourHsvSlidersField(CODE
LOW…rs/test/field_colour_hsv_sliders_test_helpers.mocha.js29function assertColourHsvSlidersFieldDefault(colourHsvSlidersField) {CODE
LOW…s/workspace-search/test/workspace_search_test.mocha.js68 function assertNoExtraCurrentStyling(blocks, expectedCurrent = undefined) {CODE
LOW…s/shadow-block-converter/src/shadow_block_converter.ts319export function shadowBlockConversionChangeListener(CODE
LOWpackages/plugins/dev-tools/src/screenshot.js124export function downloadWorkspaceScreenshot(workspace) {CODE
LOWpackages/plugins/dev-tools/src/debug.js21export function registerDebugRendererFromName(name) {CODE
LOWpackages/plugins/dev-tools/src/playground/options.js442function openFolderIfOptionSelected(folder, guiState, mainObj, options) {CODE
LOWpackages/plugins/dev-tools/src/playground/options.js608function populateToolboxSidesOption(CODE
LOWpackages/plugins/dev-tools/src/playground/options.js924function populateDebugOptionsFolder(CODE
LOWpackages/plugins/continuous-toolbox/src/index.ts33export function registerContinuousToolbox() {CODE
LOWpackages/blockly/core/contextmenu_items.ts441export function registerCollapseExpandBlock() {CODE
LOWpackages/blockly/core/hints.ts30export function showUnconstrainedMoveHint(CODE
LOWpackages/blockly/core/hints.ts53export function showConstrainedMovementHint(workspace: WorkspaceSvg) {CODE
LOWpackages/blockly/core/hints.ts111export function showWorkspaceNavigationHint(workspace: WorkspaceSvg) {CODE
LOWpackages/blockly/core/hints.ts124export function showFlyoutLabelActionHint(workspace: WorkspaceSvg) {CODE
LOWpackages/blockly/core/touch.ts123export function getTouchIdentifierFromEvent(e: PointerEvent): string {CODE
LOWpackages/blockly/core/widgetdiv.ts406export function repositionForWindowResize(): void {CODE
LOWpackages/blockly/core/common.ts285export function defineBlocksWithJsonArray(jsonArray: AnyDuringMigration[]) {CODE
LOWpackages/blockly/core/common.ts292function defineBlocksWithJsonArrayInternal(jsonArray: AnyDuringMigration[]) {CODE
LOWpackages/blockly/core/common.ts304export function createBlockDefinitionsFromJsonArray(CODE
LOWpackages/blockly/core/extensions.ts292function checkHasMutatorProperties(CODE
LOWpackages/blockly/core/extensions.ts429function checkDropdownOptionsInTable(CODE
LOWpackages/blockly/core/extensions.ts463export function buildTooltipWithFieldText(CODE
LOWpackages/blockly/core/connection.ts791function getConnectionForOrphanedOutput(CODE
LOWpackages/blockly/core/xml.ts429export function clearWorkspaceAndLoadFromXml(CODE
LOWpackages/blockly/core/shortcut_items.ts511export function registerMovementShortcuts() {CODE
LOWpackages/blockly/core/shortcut_items.ts912export function registerReadExtendedInformation() {CODE
LOWpackages/blockly/core/shortcut_items.ts1094export function registerHeadingNavigation() {CODE
LOWpackages/blockly/core/shortcut_items.ts1321export function registerToggleScreenreaderMode() {CODE
LOWpackages/blockly/core/shortcut_items.ts1919export function registerWorkspaceScrollShortcuts() {CODE
LOWpackages/blockly/core/shortcut_items.ts1984export function registerKeyboardNavigationShortcuts() {CODE
LOWpackages/blockly/core/shortcut_items.ts2002export function registerScreenReaderShortcuts() {CODE
LOWpackages/blockly/core/shortcut_items.ts2014export function registerNavigationShortcuts() {CODE
LOWpackages/blockly/core/dropdowndiv.ts614function getPositionTopOfPageMetrics(CODE
LOWpackages/blockly/core/dropdowndiv.ts844export function repositionForWindowResize() {CODE
LOWpackages/blockly/core/variables.ts140function generateVariableFieldJson(variable: IVariableModel<IVariableState>) {CODE
LOWpackages/blockly/core/variables.ts287function generateUniqueNameInternal(workspace: Workspace): string {CODE
LOWpackages/blockly/core/variables.ts306export function generateUniqueNameFromOptions(CODE
LOWpackages/blockly/core/variables.ts358export function createVariableButtonHandler(CODE
LOWpackages/blockly/core/variables.ts573export function nameUsedWithConflictingParam(CODE
LOWpackages/blockly/core/variables.ts587function checkForConflictingParamWithProcedureModels(CODE
LOWpackages/blockly/core/variables.ts613function checkForConflictingParamWithLegacyProcedures(CODE
LOWpackages/blockly/core/variables.ts666export function getOrCreateVariablePackage(CODE
LOWpackages/blockly/core/variables.ts666export function getOrCreateVariablePackage(CODE
LOWpackages/blockly/core/block_aria_composer.ts499function findStartOfStatementSection(CODE
LOWpackages/blockly/core/block_aria_composer.ts532function getParentToolboxCategoryLabel(block: BlockSvg) {CODE
LOWpackages/blockly/core/block_aria_composer.ts607function computeMoveConnectionLabel(CODE
LOWpackages/blockly/core/utils/dom.ts284export function getFastTextWidthWithSizeString(CODE
41 more matches not shown…
Over-Commented Block54 hits · 51 pts
SeverityFileLineSnippetContext
LOW…eld-dependent-dropdown/src/field_dependent_dropdown.ts201 this.dependencyData.parentField = parentField;COMMENT
LOW…s/shadow-block-converter/src/shadow_block_converter.ts261 // principle that ought to be possible since they don't need to coexist at theCOMMENT
LOWpackages/blockly/tsconfig.json21 // This does not understand enums only used to define other enums, so weCOMMENT
LOWpackages/blockly/core/main.ts21// the generated msg/*.js files, which consists of lines like:COMMENT
LOWpackages/blockly/core/tooltip.ts301 // Compute the distance between the mouse position when the tooltip wasCOMMENT
LOWpackages/blockly/core/utils/useragent.ts41 }COMMENT
LOWpackages/blockly/core/events/utils.ts281 // Selection events are a bit quirky; they are fired by both the itemCOMMENT
LOWpackages/blockly/msg/messages.js901Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = 'Returns true if the provided text is empty.';COMMENT
LOWpackages/blockly/msg/messages.js921/// [[File:Blockly-find-text.png]].COMMENT
LOWpackages/blockly/msg/messages.js941// etc.) from a given piece of text.COMMENT
LOWpackages/blockly/msg/messages.js961/// [[File:Blockly-text-get.png]]COMMENT
LOWpackages/blockly/msg/messages.js981/// [[File:Blockly-text-get.png]]COMMENT
LOWpackages/blockly/msg/messages.js1001Blockly.Msg.TEXT_CHARAT_TOOLTIP = 'Returns the letter at the specified position.';COMMENT
LOWpackages/blockly/msg/messages.js1021Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = 'get substring from letter #';COMMENT
LOWpackages/blockly/msg/messages.js1041/// dropdown - Indicates that the following number specifies the position (relative toCOMMENT
LOWpackages/blockly/msg/messages.js1061/// [[File:Blockly-get-substring.png]]COMMENT
LOWpackages/blockly/msg/messages.js1101/// dropdown - Removes spaces from the beginning and end of a piece of text. SeeCOMMENT
LOWpackages/blockly/msg/messages.js1121/// {{Optional}} url - Information about displaying text on computers.COMMENT
LOWpackages/blockly/msg/messages.js1141/** @type {string} */COMMENT
LOWpackages/blockly/msg/messages.js1281/// [[File:Blockly-list-find.png]]COMMENT
LOWpackages/blockly/msg/messages.js1301/// [https://github.com/RaspberryPiFoundation/blockly/wiki/Lists#removing-an-itemCOMMENT
LOWpackages/blockly/msg/messages.js1321Blockly.Msg.LISTS_GET_INDEX_FIRST = 'first';COMMENT
LOWpackages/blockly/msg/messages.js1441/** @type {string} */COMMENT
LOWpackages/blockly/msg/messages.js1461/// [[File:Blockly-get-sublist.png]]COMMENT
LOWpackages/blockly/msg/messages.js1581/// function definition].COMMENT
LOWpackages/blockly/msg/messages.js1601/// definition block is disabled. SeeCOMMENT
LOWpackages/blockly/msg/messages.js1661/// block text - This text appears on a block in a window that appears when the user clicksCOMMENT
LOWpackages/blockly/msg/messages.js1981/// This type of workspace appears when a user clicks on the gear icon of a block that has a mutator, andCOMMENT
LOWpackages/blockly/msg/messages.js2021/** @type {string} */COMMENT
LOWpackages/blockly/msg/messages.js2081/// Accessibility label for an empty connection that can hold a value block.COMMENT
LOWpackages/blockly/msg/messages.js2241/** @type {string} */COMMENT
LOWpackages/blockly/msg/messages.js2261Blockly.Msg.ANNOUNCE_MOVE_INSIDE = 'Moving %1 inside %2.';COMMENT
LOWpackages/blockly/msg/messages.js2341Blockly.Msg.FIELD_LABEL_VARIABLE = 'Variable "%1"';COMMENT
LOWpackages/blockly/appengine/index.yaml1indexes:COMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh1#!/bin/bashCOMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh21# Q4 2020 4.20201217.0 653624COMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh41# Size of blocks_compressed.jsCOMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh61# Q4 2023 10.2.2 90269COMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh81# Q2 2022 8.0.0 173997COMMENT
LOWpackages/blockly/tests/scripts/check_metadata.sh101# Q4 2020 4.20201217.0 15224COMMENT
LOWpackages/blockly/scripts/i18n/dedup_json.py1#!/usr/bin/python3COMMENT
LOWpackages/blockly/scripts/i18n/common.py1#!/usr/bin/python3COMMENT
LOWpackages/blockly/scripts/i18n/js_to_json.py1#!/usr/bin/python3COMMENT
LOWpackages/blockly/scripts/i18n/tests.py1#!/usr/bin/python3COMMENT
LOWpackages/blockly/scripts/i18n/create_messages.py1#!/usr/bin/python3COMMENT
LOWpackages/blockly/scripts/themes/create_blockStyles.py1# !/usr/bin/env pythonCOMMENT
LOWpackages/blockly/scripts/themes/create_blockStyles.py21#COMMENT
LOWpackages/blockly/generators/python/python_generator.ts101 // https://github.com/microsoft/TypeScript/issues/55713 this (asCOMMENT
LOWpackages/blockly/generators/dart/dart_generator.ts61 // TODO(#7085): deprecate these in due course. (Could initiallyCOMMENT
LOWpackages/blockly/generators/php/php_generator.ts101 // see https://github.com/microsoft/TypeScript/issues/10530.COMMENT
LOWpackages/blockly/generators/lua/lua_generator.ts61 // deprecate.warn().)COMMENT
LOW…/blockly/generators/javascript/javascript_generator.ts101COMMENT
LOW…/demos/blockfactory/workspacefactory/wfactory_model.js21WorkspaceFactoryModel = function() {COMMENT
LOW.github/workflows/deploy-docusaurus.yml1# .github/workflows/deploy-docusaurus.ymlCOMMENT
Cross-Language Confusion (JS/TS)5 hits · 38 pts
SeverityFileLineSnippetContext
HIGH⚡packages/blockly/generators/python/math.ts204 return FalseCODE
HIGH⚡packages/blockly/generators/python/math.ts206 return TrueCODE
HIGH⚡packages/blockly/generators/python/math.ts209 return FalseCODE
HIGH⚡packages/blockly/generators/python/math.ts213 return FalseCODE
HIGH⚡packages/blockly/generators/python/math.ts214 return TrueCODE
Cross-File Repetition4 hits · 20 pts
SeverityFileLineSnippetContext
HIGHpackages/blockly/appengine/expiration.py0blockly demo: storage copyright 2012 google llc licensed under the apache license, version 2.0 (the "license"); you may STRING
HIGHpackages/blockly/appengine/main.py0blockly demo: storage copyright 2012 google llc licensed under the apache license, version 2.0 (the "license"); you may STRING
HIGHpackages/blockly/appengine/add_timestamps.py0blockly demo: storage copyright 2012 google llc licensed under the apache license, version 2.0 (the "license"); you may STRING
HIGHpackages/blockly/appengine/storage.py0blockly demo: storage copyright 2012 google llc licensed under the apache license, version 2.0 (the "license"); you may STRING
Docstring Block Structure3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHpackages/blockly/scripts/i18n/common.py39Read a JSON file as UTF-8 into a dictionary, discarding @metadata. Args: filename: The filename, which must end "STRING
HIGHpackages/blockly/scripts/i18n/common.py66Creates a qqq.json file with message documentation for translatewiki.net. The file consists of key-value pairs, wheSTRING
HIGHpackages/blockly/scripts/i18n/common.py119Creates a <lang>.json file for translatewiki.net. The file consists of metadata, followed by key-value pairs, whereSTRING
Decorative Section Separators4 hits · 12 pts
SeverityFileLineSnippetContext
MEDIUMpackages/blockly/tests/mocha/rect_test.ts957 // ┌─────┐COMMENT
MEDIUMpackages/blockly/tests/mocha/rect_test.ts958 // └─────┘COMMENT
MEDIUMpackages/blockly/tests/mocha/rect_test.ts986 // ┌─────┐COMMENT
MEDIUMpackages/blockly/tests/mocha/rect_test.ts989 // └─────┘COMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICAL…es/blockly/tests/mocha/comment_deserialization_test.js80 this.workspace.trashcan.flyout.svgGroup_.querySelector('.blocklyPath'),CODE
Fake / Example Data7 hits · 7 pts
SeverityFileLineSnippetContext
LOWpackages/plugins/field-multilineinput/test/index.ts50 text: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sedCODE
LOWpackages/plugins/field-multilineinput/test/index.ts50 text: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sedCODE
LOWpackages/plugins/field-multilineinput/test/index.ts82 text: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sedCODE
LOWpackages/plugins/field-multilineinput/test/index.ts82 text: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sedCODE
LOW…kages/plugins/workspace-search/src/workspace_search.ts262 textInput.setAttribute('placeholder', this.textInputPlaceholder);CODE
LOW…kages/plugins/workspace-search/src/workspace_search.ts459 this.inputElement.setAttribute('placeholder', this.textInputPlaceholder);CODE
LOWpackages/blockly/core/comments/comment_editor.ts68 'placeholder',CODE
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMpackages/plugins/migration/bin/fix-imports.js61// TODO (#1211): Make this database format more robust.COMMENT
MEDIUMpackages/plugins/migration/bin/fix-imports.js61// TODO (#1211): Make this database format more robust.COMMENT
Cross-Language Confusion2 hits · 5 pts
SeverityFileLineSnippetContext
HIGHpackages/blockly/appengine/add_timestamps.py34Start a venv: `python3 -m venv venv && source venv/bin/activate`STRING
HIGHpackages/blockly/scripts/i18n/create_messages.py129var Blockly = Blockly || {{ Msg: Object.create(null) }};STRING
Empty Error Handlers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpackages/blockly/scripts/i18n/common.py226except (ValueError, IOError):CODE
Deep Nesting4 hits · 4 pts
SeverityFileLineSnippetContext
LOWpackages/blockly/appengine/storage.py59CODE
LOWpackages/blockly/scripts/i18n/js_to_json.py56CODE
LOWpackages/blockly/scripts/i18n/create_messages.py49CODE
LOWpackages/blockly/scripts/themes/create_blockStyles.py52CODE
Excessive Try-Catch Wrapping2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMpackages/blockly/scripts/i18n/dedup_json.py54 print('Error reading ' + filename)CODE
MEDIUMpackages/blockly/scripts/i18n/common.py61 print('Error reading ' + filename)CODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpackages/blockly/scripts/i18n/dedup_json.py64 # Output results.COMMENT
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpackages/blockly/tests/generators/golden/generated.py1248def test_function():CODE