AI Slop Code Risk Monitor

betaflight/betaflight

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

Open Source Flight Controller Firmware

3.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for betaflight/betaflight, a C project with 11,729 GitHub stars. SynthScan examined 2,137,352 lines of code across 3796 source files, recording 8584 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 3.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.

3.3
Adjusted Signal
3.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
11.7K
Stars
C
Language
2.1M
Lines of Code
3.8K
Files
8.6K
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 15.2/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 0.1/100 · LOW

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

PR Review Velocity Impact 18.3/100 · LOW

Which changes need focused human review? 8584 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 6MEDIUM 22LOW 8556

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 8584 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 Block8501 hits · 6926 pts
SeverityFileLineSnippetContext
LOWlib/test/gtest/inc/gtest/gtest-matchers.h1// Copyright 2007, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h41COMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h61 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used byCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h141 public:COMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h161 // "is empty" matcher probably only needs to explain what the actualCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-matchers.h601 return os;COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h1// Copyright 2005, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h41#define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h61// tests. IMPORTANT: This is an internal utility. Using it may break theCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h81//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h101//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h121// learn wherever you come from. In the following: 'A' denotes aCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h141// A* matches 0 or many occurrences of ACOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h161// simplicity, the current implementation doesn't search the PATHCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h221// since the sideeffects of the call are only visible in opt mode, and notCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h241// // opt-mode has sideeffect visible.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h261//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h281// death tests are not supported. Those macros must compile on such systemsCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h301// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTEDCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-death-test.h321 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \COMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h1// Copyright 2007, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h61 };COMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h121} // namespace testingCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h181 } \COMMENT
LOWlib/test/gtest/inc/gtest/gtest-spi.h201// - You cannot stream a failure message to this macro.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h1// Copyright 2005, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h41#include <memory>COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h61// This class is useful for two purposes:COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h81// Expected: trueCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h101// }COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h121// if ((n % 2) == 0)COMMENT
LOWlib/test/gtest/inc/gtest/gtest-assertion-result.h141// This warning is off by default starting in Visual Studio 2019 but can beCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h1// Copyright 2005, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h41// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a userCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h61COMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h81// foo << 1 << " != " << 2;COMMENT
LOWlib/test/gtest/inc/gtest/gtest-message.h121 // overloads are visible in either the std namespace or the globalCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h1// Copyright 2008, Google Inc.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h41// parameters without writing multiple copies of the same test.COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h81// Range(begin, end [, step]) - Yields values {begin, begin+step,COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h101COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h121const char* pets[] = {"cat", "dog"};COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h141//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h181#include "gtest/internal/gtest-param-util.h"COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h201// }COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h241//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h261//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h281// each with parameter values 'a' and 'b':COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h321// For example, this instantiates tests from test suite BarTest eachCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h341// Synopsis:COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h361// Combine() allows the user to combine two or more sequences to produceCOMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h381//COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h401// }COMMENT
LOWlib/test/gtest/inc/gtest/gtest-param-test.h421// Example:COMMENT
8441 more matches not shown…
Slop Phrases19 hits · 36 pts
SeverityFileLineSnippetContext
MEDIUM…/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_jpeg.c131 (#) To control JPEG state you can use the following function: HAL_JPEG_GetState()CODE
MEDIUM…/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc.c58 (#) To control LTDC state you can use the following function: HAL_LTDC_GetState()CODE
MEDIUM…/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dcmi.c42 (#) To control DCMI state you can use the function HAL_DCMI_GetState().CODE
MEDIUM…7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dsi.c41 (#) To control DSI state you can use the following function: HAL_DSI_GetState()CODE
MEDIUM…/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dcmi.c42 (#) To control DCMI state you can use the function HAL_DCMI_GetState().CODE
MEDIUM…/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c70 (#) To control LTDC state you can use the following function: HAL_LTDC_GetState()CODE
MEDIUM…7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dsi.c41 (#) To control DSI state you can use the following function: HAL_DSI_GetState()CODE
MEDIUM…/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_jpeg.c131 (#) To control JPEG state you can use the following function: HAL_JPEG_GetState()CODE
MEDIUM…/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c60 (#) To control LTDC state you can use the following function: HAL_LTDC_GetState()CODE
MEDIUM…/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c44 (#) To control DCMI state you can use the function HAL_DCMI_GetState().CODE
MEDIUM…Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_can.c52 (#) To control CAN events you can use one of the following two methods:CODE
MEDIUM…rivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash.c49 (#) To control HASH events you can use one of the following wo methods:CODE
MEDIUM…rivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp.c36 (#) To control CRYP events you can use one of the following two methods:CODE
MEDIUM…Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c40 (#) Optionally, if the Circular mode is enabled, you can use the Double buffer mode by configuringCODE
MEDIUM…Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c64 (#) To control DMA events you can use one of the following two methods:CODE
MEDIUM…Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c74 (#) Optionally, if Circular mode and Double Buffer mode are enabled, you can modifyCODE
LOWsrc/platform/GD32/exti_gd32.c124 // don't forget to match cleanup with configCOMMENT
LOWsrc/platform/STM32/exti.c233 // don't forget to match cleanup with configCOMMENT
LOWsrc/platform/APM32/eint_apm32.c123 // don't forget to match cleanup with configCOMMENT
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHsrc/test/sitl/sitl_harness.py953except socket.timeout:CODE
HIGHsrc/test/sitl/sitl_harness.py129except socket.timeout:CODE
HIGHsrc/test/sitl/sitl_harness.py623except socket.timeout:CODE
HIGHsrc/test/sitl/sitl_harness.py1072except OSError:CODE
HIGHsrc/test/sitl/sitl_harness.py1113except (TimeoutError, RuntimeError, OSError):CODE
HIGHsrc/test/sitl/sitl_harness.py842except OSError:CODE
Hyper-Verbose Identifiers31 hits · 24 pts
SeverityFileLineSnippetContext
LOW⚡src/test/sitl/sitl_harness.py3273def scenario_wing_rescue_wind(sitl, rc, fdm):CODE
LOW⚡src/test/sitl/sitl_harness.py3278def scenario_wing_rescue_armed_in_hand(sitl, rc, fdm):CODE
LOW⚡src/test/sitl/sitl_harness.py3285def scenario_wing_rx_loss_rescue(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py1315def scenario_mission_engage_backwards(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py1605def scenario_geofence_rth_rxloss(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py1687def rescue_engagement_asserts(sitl, variant="B"):CODE
LOWsrc/test/sitl/sitl_harness.py1758def scenario_rescue_fast_entry(sitl, rc, fdm, variant="B"):CODE
LOWsrc/test/sitl/sitl_harness.py1804def scenario_rescue_near_home(sitl, rc, fdm, variant="B"):CODE
LOWsrc/test/sitl/sitl_harness.py1846def scenario_rescue_heading_recovery(sitl, rc, fdm, variant="B", drift=False):CODE
LOWsrc/test/sitl/sitl_harness.py1942def scenario_rescue_near_home_no_heading(sitl, rc, fdm, variant="B"):CODE
LOWsrc/test/sitl/sitl_harness.py2035def scenario_rescue_switch_descent(sitl, rc, fdm, variant="B"):CODE
LOWsrc/test/sitl/sitl_harness.py2090def scenario_mission_vert_rate(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2106def scenario_mission_face_target(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2135def scenario_mission_face_next(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2554def scenario_wing_launch_into_althold(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2656def scenario_wing_loiter_wind(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2662def scenario_wing_loiter_gps_loss(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py2701def scenario_wing_launch_into_poshold(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3010def scenario_wing_autoland_crosswind(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3035def scenario_wing_autoland_headwind(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3040def scenario_wing_autoland_tailwind_flip(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3098def scenario_wing_go_around_stick(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3117def scenario_wing_go_around_baro(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3137def scenario_wing_go_around_gps(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3173def scenario_wing_mission_land(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3310def scenario_wing_rx_loss_continue(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3362def scenario_wing_rx_loss_land(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3392def scenario_wing_rescue_gps_loss(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3513def scenario_wing_descent_low_ground(sitl, rc, fdm):CODE
LOWsrc/test/sitl/sitl_harness.py3534def scenario_wing_descent_high_ground(sitl, rc, fdm, sloped=False):CODE
LOWsrc/test/sitl/sitl_harness.py3547def scenario_wing_descent_high_slope(sitl, rc, fdm):CODE
AI Slop Vocabulary6 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUMlib/test/gtest/inc/gtest/gtest-death-test.h152// This implementation is *not* meant to be as highly tuned or robustCOMMENT
MEDIUMlib/test/gtest/inc/gtest/gtest-death-test.h224// In practice, this can be used to test functions that utilize theCOMMENT
MEDIUMsrc/platform/STM32/sdio_h5xx.c243 // Setting all the SDIO pins to high for a short time results in more robust initialisation.COMMENT
MEDIUMsrc/platform/STM32/sdio_h7xx.c239 // Setting all the SDIO pins to high for a short time results in more robust initialisation.COMMENT
MEDIUMsrc/platform/STM32/sdio_n6xx.c307 // Setting all the SDIO pins to high for a short time results in more robust initialisation.COMMENT
MEDIUMsrc/platform/X32/sdio_x32.c273 // Setting all the SDIO pins to high for a short time results in more robust initialisation.COMMENT
Verbosity Indicators9 hits · 18 pts
SeverityFileLineSnippetContext
LOW⚡src/platform/STM32/spa06_i3c_probe.c219 // Step 0: input + pull-up. Both lines should read 1.COMMENT
LOW⚡src/platform/STM32/spa06_i3c_probe.c228 // Step 1: floating input. If the bus has an external pull-up the lineCOMMENT
LOW⚡src/platform/STM32/spa06_i3c_probe.c237 // Step 2: drive SCL (PC10) LOW as open-drain output, SDA stays floating.COMMENT
LOWsrc/platform/STM32/spa06_i3c_probe.c248 // Step 3: drive SDA (PC11) LOW open-drain.COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c195 // Step 1: Write special XYZ sign configuration value to register 0x29COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c197 // Step 2: Configure CONF1 register with continuous mode, 100Hz ODR, 8G range, and OSR1=8COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c199 // Step 3: Configure CONF2 register with OSR2=8 oversampling settingsCOMMENT
LOWsrc/main/drivers/rx/rx_sx1280.c857// Next we need to check if we need to FHSS and then do so if neededCOMMENT
LOWsrc/main/cli/cli.c2766 // Actually, we need to check if the negated value would be < INT32_MINCOMMENT
Structural Annotation Overuse7 hits · 15 pts
SeverityFileLineSnippetContext
LOW⚡src/platform/STM32/spa06_i3c_probe.c219 // Step 0: input + pull-up. Both lines should read 1.COMMENT
LOW⚡src/platform/STM32/spa06_i3c_probe.c228 // Step 1: floating input. If the bus has an external pull-up the lineCOMMENT
LOW⚡src/platform/STM32/spa06_i3c_probe.c237 // Step 2: drive SCL (PC10) LOW as open-drain output, SDA stays floating.COMMENT
LOWsrc/platform/STM32/spa06_i3c_probe.c248 // Step 3: drive SDA (PC11) LOW open-drain.COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c195 // Step 1: Write special XYZ sign configuration value to register 0x29COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c197 // Step 2: Configure CONF1 register with continuous mode, 100Hz ODR, 8G range, and OSR1=8COMMENT
LOW⚡src/main/drivers/compass/compass_qmc5883.c199 // Step 3: Configure CONF2 register with OSR2=8 oversampling settingsCOMMENT
TODO Padding2 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/platform/PICO/bus_spi_pico.c337 //TODO: implementCOMMENT
LOWsrc/main/msp/msp_protocol_v2_common.h26// TODO: implement new, extensible rangefinder protocolCOMMENT
Deep Nesting3 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/test/sitl/sitl_harness.py2773CODE
LOWsrc/test/sitl/sitl_harness.py3483CODE
LOWsrc/test/sitl/sitl_harness.py121CODE