AI Slop Code Risk Monitor

kanboard/kanboard

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

Kanban project management software

3.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for kanboard/kanboard, a PHP project with 9,935 GitHub stars. SynthScan examined 236,784 lines of code across 1841 source files, recording 794 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 3.6 (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.6
Adjusted Signal
3.6
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
9.9K
Stars
PHP
Language
236.8K
Lines of Code
1.8K
Files
794
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.7/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.0/100 · LOW

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

Agent Over-Engineering Ratio 15.6/100 · LOW

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

PR Review Velocity Impact 15.9/100 · LOW

Which changes need focused human review? 794 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 2HIGH 0MEDIUM 3LOW 789

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 794 distinct pattern matches across 6 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 Identifiers769 hits · 800 pts
SeverityFileLineSnippetContext
LOWapp/Core/DateParser.php265 public function getTimestampFromIsoFormat($value)CODE
LOWapp/Core/Security/Token.php73 public function validateReusableCSRFToken($token)CODE
LOWapp/Core/Security/AuthenticationManager.php174 public function getPostAuthenticationProvider()CODE
LOWapp/Core/Ldap/Client.php120 public function useAnonymousAuthentication()CODE
LOWapp/Core/Ldap/Client.php227 protected function checkForServerConnectionError()CODE
LOWapp/Core/User/UserSession.php79 public function getCredentialsFingerprint()CODE
LOWapp/Core/User/UserSession.php117 public function isPostAuthenticationValidated()CODE
LOWapp/Core/User/UserSession.php127 public function setPostAuthenticationAsValidated()CODE
LOWapp/Core/User/UserSession.php152 public function disablePostAuthentication()CODE
LOWapp/Core/Http/Response.php92 public function withContentSecurityPolicy(array $policies = array())CODE
LOWapp/Core/Http/Response.php122 public function withStrictTransportSecurity()CODE
LOWapp/Core/ExternalTask/ExternalTaskProviderInterface.php78 public function getModificationFormTemplate();CODE
LOWapp/Validator/UserValidator.php112 public function validatePasswordModification(array $values)CODE
LOWapp/Validator/TaskValidator.php195 public function validateProjectModification(array $values)CODE
LOWapp/Validator/BaseValidator.php46 protected function commonPasswordValidationRules()CODE
LOWapp/Controller/AnalyticController.php139 public function estimatedVsActualByColumn()CODE
LOWapp/Controller/ProjectCreationController.php97 private function isDestinationProjectPrivate(array $values)CODE
LOWapp/Controller/ProjectCreationController.php117 private function checkSourceProjectAccessAllowed($projectId)CODE
LOWapp/Controller/ProjectCreationController.php130 private function checkTeamProjectCreationAllowed()CODE
LOWapp/Controller/ProjectCreationController.php143 private function checkPrivateProjectCreationAllowed()CODE
LOWapp/Controller/ICalendarController.php108 protected function getConditionForTasksWithStartAndDueDate($start_time, $end_time, $start_column, $end_column)CODE
LOWapp/Controller/BaseController.php36 protected function checkReusableGETCSRFParam()CODE
LOWapp/Action/TaskCreation.php41 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskCreation.php52 public function getEventRequiredParameters()CODE
LOWapp/Action/StopSubtaskTimerMoveTaskColumn.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/StopSubtaskTimerMoveTaskColumn.php59 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskMoveColumnAssigned.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskMoveColumnAssigned.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskDuplicateAnotherProject.php47 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskDuplicateAnotherProject.php61 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskEmailNoActivity.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskEmailNoActivity.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskMoveSwimlaneAssigned.php48 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskMoveSwimlaneAssigned.php63 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignColorLink.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignColorLink.php59 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskCloseColumn.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskCloseColumn.php56 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignCreator.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignCreator.php58 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignColorOnStartDate.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignColorOnStartDate.php59 public function getEventRequiredParameters()CODE
LOWapp/Action/SubtaskTimerMoveTaskColumn.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/SubtaskTimerMoveTaskColumn.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignColorOnDueDate.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignColorOnDueDate.php59 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignColorSwimlane.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignColorSwimlane.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignDueDateOnMoveColumn.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignDueDateOnMoveColumn.php58 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignColorUser.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignColorUser.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskEmail.php47 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskEmail.php62 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignCategorySwimlaneChange.php46 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignCategorySwimlaneChange.php60 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskUpdateStartDateOnMoveColumn.php44 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskUpdateStartDateOnMoveColumn.php57 public function getEventRequiredParameters()CODE
LOWapp/Action/TaskAssignDueDateOnCreation.php45 public function getActionRequiredParameters()CODE
LOWapp/Action/TaskAssignDueDateOnCreation.php58 public function getEventRequiredParameters()CODE
709 more matches not shown…
Hallucination Indicators2 hits · 30 pts
SeverityFileLineSnippetContext
CRITICAL⚡assets/js/vendor.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
CRITICAL⚡assets/js/vendor.min.js8!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict"CODE
Fake / Example Data15 hits · 16 pts
SeverityFileLineSnippetContext
LOWapp/Template/task_duplication/move.php22 'placeholder' => t('Choose a project'),CODE
LOWapp/Template/task_duplication/copy.php21 'placeholder' => t('Choose a project'),CODE
LOWapp/Template/header/board_selector.php3 'placeholder' => t('Display another project'),CODE
LOWapp/Helper/FormHelper.php239 'placeholder' => t('Write your text in Markdown'),CODE
LOWtests/units/Core/User/UserPropertyTest.php120 'email' => 'admin@example.org',CODE
LOW…ts/units/Controller/UserModificationControllerTest.php28 'email' => 'admin@example.org',CODE
LOW…ts/units/Controller/UserModificationControllerTest.php63 $this->assertEquals('admin@example.org', $updatedUser['email']);CODE
LOWtests/units/Filter/ProjectActivityCreatorFilterTest.php46 $filter = new ProjectActivityCreatorFilter('John Doe');CODE
LOWtests/units/Filter/UserNameFilterTest.php14 $this->assertEquals(2, $userModel->create(array('username' => 'jdoe', 'name' => 'John Doe')));CODE
LOWassets/js/app.min.js232this.render=function(){KB.on('select.dropdown.loading.start',onLoadingStart);KB.on('select.dropdown.loading.stop',onLoadCODE
LOWassets/js/app.min.js300var textWrapper=KB.dom(containerElement).find('script');textareaElement.html(textWrapper.innerHTML);if(options.placeholdCODE
LOW⚡assets/js/vendor.min.js8!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict"CODE
LOWassets/js/vendor.min.js3234!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.eCODE
LOWassets/js/components/select-dropdown-autocomplete.js274 .attr('placeholder', getPlaceholderValue())CODE
LOWassets/js/components/text-editor.js74 textareaElement.attr('placeholder', options.placeholder);CODE
Over-Commented Block5 hits · 5 pts
SeverityFileLineSnippetContext
LOWlibs/minify/src/JS.php241 return $placeholder;COMMENT
LOWlibs/minify/src/JS.php281 // quite often, `/` after `)` is a division operator & if it happens toCOMMENT
LOWlibs/minify/src/CSS.php581 // strip units after zeroes (0px -> 0)COMMENT
LOWlibs/erusev/parsedown/Parsedown.php1<?phpCOMMENT
LOW…bs/swiftmailer/classes/Swift/Mime/SimpleMimeEntity.php81 public function __construct(Swift_Mime_HeaderSet $headers, Swift_Mime_ContentEncoder $encoder, Swift_KeyCache $cacheCOMMENT
Excessive Try-Catch Wrapping2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/scripts/commit-checker.py22 print(f"Error retrieving commit message: {e}")CODE
MEDIUM.github/workflows/scripts/commit-checker.py59 print(f"Error checking commit range: {e}")CODE
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlibs/phpqrcode/lib/PHPQRCode.php14 * Config file, feel free to modifyCOMMENT