AI Slop Code Risk Monitor

portainer/portainer

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

Making Docker and Kubernetes management easy.

1.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for portainer/portainer, a TypeScript project with 38,755 GitHub stars. SynthScan examined 564,286 lines of code across 5136 source files, recording 792 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.5 (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.

1.5
Adjusted Signal
1.5
Raw Pattern Score
100%
Time Factor
2026-10-27
Last Push
38.8K
Stars
TypeScript
Language
564.3K
Lines of Code
5.1K
Files
792
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 6.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 4.7/100 · LOW

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

PR Review Velocity Impact 7.0/100 · LOW

Which changes need focused human review? 792 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 1MEDIUM 6LOW 784

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 792 distinct pattern matches across 10 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 Identifiers516 hits · 532 pts
SeverityFileLineSnippetContext
LOW…nels/node-labels-table/node-labels-table-controller.js2 function NodeLabelsTableController() {CODE
LOW…lability-select/node-availability-select-controller.js2 function NodeAvailabilitySelectController() {CODE
LOW…e-details-panel/swarm-node-details-panel-controller.js6 function SwarmNodeDetailsPanelController(NodeService, LabelHelper, Notifications, $state) {CODE
LOW⚡app/docker/components/log-viewer/logViewerController.js31 function handleLogsCollectionChange(enabled) {CODE
LOW⚡app/docker/components/log-viewer/logViewerController.js39 function handleLogsWrapLinesChange(enabled) {CODE
LOW⚡app/docker/components/log-viewer/logViewerController.js45 function handleDisplayTimestampsChange(enabled) {CODE
LOW…er/views/swarm/visualizer/swarmVisualizerController.js19 $scope.handleChangeDisplayOnlyRunningTasks = function handleChangeDisplayOnlyRunningTasks(enabled) {CODE
LOW…er/views/swarm/visualizer/swarmVisualizerController.js26 $scope.handleChangeDisplayNodeLabels = function handleChangeDisplayNodeLabels(enabled) {CODE
LOW…host/host-browser-view/host-browser-view-controller.js4 function HostBrowserViewController(SystemService, Notifications) {CODE
LOW…ews/nodes/node-details/node-details-view-controller.js9 function NodeDetailsViewController($q, $stateParams, NodeService, StateManager, AgentService, Authentication, NotificaCODE
LOW…ocker/views/networks/create/createNetworkController.js126 function prepareAuxiliaryAddresses(ipamConfig, ipFormValues) {CODE
LOW…ocker/views/networks/create/createNetworkController.js190 function modifyNetworkConfigurationForMacvlanConfigOnly(config) {CODE
LOW…ocker/views/networks/create/createNetworkController.js197 function modifyNetworkConfigurationForMacvlanConfigFrom(config, selectedNetworkConfig) {CODE
LOWapp/docker/views/volumes/edit/volumeController.js38 function getVolumeDataFromContainer(container, volumeId) {CODE
LOWapp/docker/views/services/edit/serviceController.js273 $scope.removePlacementConstraint = function removePlacementConstraint(service, index) {CODE
LOWapp/docker/views/services/edit/serviceController.js306 $scope.removePortPublishedBinding = function removePortPublishedBinding(service, index) {CODE
LOW…ocker/views/services/create/createServiceController.js323 function createMountObjectFromVolume(volumeObject, target, readonly) {CODE
LOW…ocker/views/services/create/createServiceController.js434 function prepareResourcesCpuConfig(config, input) {CODE
LOW…ocker/views/services/create/createServiceController.js445 function prepareResourcesMemoryConfig(config, input) {CODE
LOW…ocker/views/services/create/createServiceController.js574 function initSlidersMaxValuesBasedOnNodeData(nodes) {CODE
LOWapp/docker/helpers/imageHelper.js20 function createImageConfigForContainer(imageModel) {CODE
LOWapp/docker/helpers/imageHelper.js30 function removeDigestFromRepository(repository) {CODE
LOWapp/docker/helpers/serviceHelper.js11 function associateTasksToServiceAJS(service, tasks) {CODE
LOWapp/docker/helpers/taskHelper.js11 function associateContainerToTaskAJS(task, containers) {CODE
LOWapp/docker/services/networkService.js52 async function connectContainerAngularJS(environmentId, networkId, containerId) {CODE
LOWapp/docker/services/volumeService.js62 function createVolumeConfiguration(name, driver, driverOptions) {CODE
LOWapp/docker/services/buildService.js29 async function buildImageFromUploadAngularJS(environmentId, names, file, path) {CODE
LOWapp/docker/services/buildService.js40 async function buildImageFromURLAngularJS(environmentId, names, url, path) {CODE
LOWapp/docker/services/buildService.js50 async function buildImageFromDockerfileContentAngularJS(environmentId, names, content) {CODE
LOWapp/docker/services/buildService.js61 async function buildImageFromDockerfileContentAndFilesAngularJS(environmentId, names, content, files) {CODE
LOWapp/docker/services/containerService.js80 async function updateRestartPolicyAngularJS(environmentId, id, restartPolicy, maximumRetryCounts) {CODE
LOWapp/portainer/__module.js518function isTransitionRequiresAuthentication(transition) {CODE
LOW…er/settings/authentication/ldap/ldap-settings.model.js50export function buildOpenLDAPSettingsModel() {CODE
LOW…gs/authentication/ldap/ldap-settings-security/index.js42 function updateReactValuesFromSettings(settings) {CODE
LOWapp/portainer/models/registry.js21export function RegistryManagementConfigurationDefaultModel(registry) {CODE
LOWapp/portainer/models/registryRepository.js3export function RegistryRepositoryViewModel(item) {CODE
LOWapp/portainer/models/registryRepository.js13export function RegistryRepositoryGitlabViewModel(data) {CODE
LOWapp/portainer/models/group.js1export function EndpointGroupDefaultModel() {CODE
LOWapp/portainer/models/group.js19export function EndpointGroupCreateRequest(model, endpoints) {CODE
LOWapp/portainer/models/group.js26export function EndpointGroupUpdateRequest(model, endpoints) {CODE
LOWapp/portainer/models/settings.js38export function InternalAuthSettingsViewModel(data) {CODE
LOW…models/resourceControl/resourceControlCreatePayload.js7export function ResourceControlCreatePayload(resourceId, resourceType, data) {CODE
LOW…/resourceControl/resourceControlOwnershipParameters.js9export function ResourceControlOwnershipParameters(adminOnly = false, publicOnly = false, users = [], teams = [], subResCODE
LOW…ts/accessControlForm/porAccessControlFormController.js43 function setAuthorizedUsersAndTeams(authorizedUsers, authorizedTeams) {CODE
LOWapp/portainer/users/queries.ts25export function useIsCurrentUserTeamLeader() {CODE
LOWapp/portainer/users/user.helpers.ts6export function filterNonAdministratorUsers(users: User[]) {CODE
LOW…settings/edge-compute/settingsEdgeComputeController.js7export default function SettingsEdgeComputeController($q, $async, $state, Notifications, SettingsService, StateManager) CODE
LOW…ngs/authentication/settingsAuthenticationController.js11function SettingsAuthenticationController($q, $scope, $state, Notifications, SettingsService, FileUploadService, TeamSerCODE
LOW…ngs/authentication/settingsAuthenticationController.js60 $scope.authenticationMethodSelected = function authenticationMethodSelected(value) {CODE
LOW…ngs/authentication/settingsAuthenticationController.js195 function isOAuthTeamMembershipFormValid() {CODE
LOWapp/portainer/views/account/accountController.js104function confirmForceChangePassword() {CODE
LOWapp/portainer/helpers/json.ts44export function jsonObjectsToArrayHandler(data: string): unknown[] {CODE
LOWapp/portainer/helpers/stackHelper.js18 function getExternalStacksFromLabel(items, label, type) {CODE
LOW…p/portainer/services/dockerMaxApiVersionInterceptor.ts21export async function dockerMaxAPIVersionInterceptor(CODE
LOWapp/portainer/services/http-request.helper.ts9export function dispatchCacheRefreshEvent() {CODE
LOWapp/portainer/services/http-request.helper.ts15export function dispatchCacheRefreshEventIfNeeded(req: AxiosRequestConfig) {CODE
LOWapp/portainer/services/http-request.helper.ts42export function registryAuthenticationHeader() {CODE
LOWapp/portainer/services/http-request.helper.ts46export function setRegistryAuthenticationHeader(headerValue: string) {CODE
LOWapp/portainer/services/http-request.helper.ts57export function portainerAgentTargetHeader() {CODE
LOW⚡app/portainer/services/http-request.helper.ts70export function setPortainerAgentTargetHeader(headerValue: string) {CODE
456 more matches not shown…
Over-Commented Block244 hits · 244 pts
SeverityFileLineSnippetContext
LOWCONTRIBUTING.md121// @tag.name <Name of resource>COMMENT
LOWanalysis/transaction.go41// received. Unlike dataStoreCallInsideTx (a direct $store.Service().Method()COMMENT
LOWanalysis/transaction.go81 `$store.ViewTx($fn)`,COMMENT
LOWanalysis/transaction.go121 `func ($_ $_) $name($_ $_, tx $_, $_ $_, $_ $_, $_ $_) $*_ { $*_ }`,COMMENT
LOWapp/docker/models/network.ts1import { IPAM, Network, NetworkContainer } from 'docker-types';COMMENT
LOWapp/portainer/services/fileUpload.js1import { PortainerEndpointCreationTypes } from '@/portainer/models/endpoint/models';COMMENT
LOWapp/kubernetes/converters/application.js141 res.Volumes = data.spec.template.spec.volumes ? data.spec.template.spec.volumes : [];COMMENT
LOWapp/kubernetes/models/history/models.js1export const KubernetesSystem_DefaultDeploymentUniqueLabelKey = 'pod-template-hash';COMMENT
LOWapp/kubernetes/horizontal-pod-auto-scaler/payload.js41// kind: '',COMMENT
LOWapp/kubernetes/horizontal-pod-auto-scaler/payload.js61// }COMMENT
LOWapp/kubernetes/horizontal-pod-auto-scaler/payload.js81COMMENT
LOWapp/kubernetes/helpers/application/index.js501 * @param {KubernetesApplication[]} applications Application listCOMMENT
LOWapp/react/hooks/useDebounce.ts1import { debounce } from 'lodash';COMMENT
LOWapp/react/hooks/useDebounce.ts21// // This will always print the first value of the "value" prop + the updated value of "v"COMMENT
LOWapi/portainer.go141 // Path on disk to the repository hosting the Stack fileCOMMENT
LOWapi/portainer.go361 ChartPath string `json:"ChartPath,omitempty" example:"charts/my-app"`COMMENT
LOWapi/portainer.go1281 // Cluster identifier of the Swarm cluster where the stack is deployedCOMMENT
LOWapi/portainer.go1301 CreationDate int64 `example:"1587399600"`COMMENT
LOWapi/portainer.go1461 // Stack file used for this templateCOMMENT
LOWapi/portainer.go2141 // PortainerAgentHeader represents the name of the header available in any agent responseCOMMENT
LOWapi/dataservices/source/validation_rules_test.go1package sourceCOMMENT
LOWapi/dataservices/source/validation_rules_test.go21// Git: &gittypes.RepoConfig{URL: url},COMMENT
LOWapi/dataservices/source/validation_rules_test.go41COMMENT
LOWapi/dataservices/source/validation_rules_test.go61// t.Parallel()COMMENT
LOWapi/dataservices/source/validation_rules_test.go81COMMENT
LOWapi/filesystem/filesystem.go41 // PrivateKeyFile represents the name on disk of the file containing the private key.COMMENT
LOWapi/edge/edge.go21 DirEntries []filesystem.DirEntryCOMMENT
LOWapi/edge/edge.go41 // Used only for EECOMMENT
LOWapi/edge/edge.go81 // Used for adding labels to Kubernetes manifestsCOMMENT
LOWapi/http/handler/handler.go81// @title PortainerCE APICOMMENT
LOWapi/http/handler/handler.go101// @in headerCOMMENT
LOWapi/http/handler/handler.go121// @tag.x-displayName Edge agentCOMMENT
LOWapi/http/handler/handler.go141// @tag.description Operate git repositoryCOMMENT
LOWapi/http/handler/handler.go161// @tag.name rolesCOMMENT
LOWapi/http/handler/handler.go181// @tag.x-displayName TagsCOMMENT
LOWapi/http/handler/settings/settings_public.go41 CommandInterval int `json:"CommandInterval" example:"60"`COMMENT
LOWapi/http/handler/settings/settings_inspect.go1package settingsCOMMENT
LOWapi/http/handler/websocket/pod.go21// @summary Execute a websocket on podCOMMENT
LOWapi/http/handler/websocket/attach.go21// @description If the nodeName query parameter is not specified, the request will be upgraded to the websocket protocolCOMMENT
LOWapi/http/handler/websocket/exec.go21}COMMENT
LOWapi/http/handler/ssl/ssl_update.go21 return errors.New("both certificate and key files should be provided")COMMENT
LOWapi/http/handler/ssl/ssl_inspect.go1package sslCOMMENT
LOW…/http/handler/customtemplates/customtemplate_update.go41 // SourceID references an existing Source for git credentials/URL.COMMENT
LOW…/http/handler/customtemplates/customtemplate_update.go121// @security jwtCOMMENT
LOW…/http/handler/customtemplates/customtemplate_create.go101 Title string `example:"Nginx" validate:"required"`COMMENT
LOW…/http/handler/customtemplates/customtemplate_create.go141 return errors.New("Invalid note. <img> tag is not supported")COMMENT
LOW…/http/handler/customtemplates/customtemplate_create.go201 // Valid values are: 1 - 'linux', 2 - 'windows'COMMENT
LOW…/http/handler/customtemplates/customtemplate_create.go261 if !IsValidNote(payload.Note) {COMMENT
LOW…/http/handler/customtemplates/customtemplate_create.go481// @id CustomTemplateCreateFileCOMMENT
LOWapi/http/handler/customtemplates/customtemplate_list.go21// @id CustomTemplateListCOMMENT
LOW…tp/handler/customtemplates/customtemplate_git_fetch.go21COMMENT
LOWapi/http/handler/customtemplates/customtemplate_file.go21COMMENT
LOW…http/handler/customtemplates/customtemplate_inspect.go21// @description Retrieve details about a template.COMMENT
LOWapi/http/handler/docker/images/images_list.go21 Created int64 `json:"created"`COMMENT
LOW…tp/handler/docker/containers/container_gpus_inspect.go21// @id dockerContainerGpusInspectCOMMENT
LOWapi/http/handler/edgegroups/edgegroup_list.go21type decoratedEdgeGroup struct {COMMENT
LOWapi/http/handler/edgegroups/edgegroup_create.go61COMMENT
LOWapi/http/handler/stacks/create_swarm_stack.go61// @tags stacksCOMMENT
LOWapi/http/handler/stacks/create_swarm_stack.go181}COMMENT
LOWapi/http/handler/stacks/create_swarm_stack.go301 if err != nil {COMMENT
184 more matches not shown…
Fake / Example Data18 hits · 18 pts
SeverityFileLineSnippetContext
LOWapp/portainer/react/components/index.ts118 'placeholder',CODE
LOWapp/portainer/react/components/index.ts153 'placeholder',CODE
LOWapp/kubernetes/react/components/index.ts72 'placeholder',CODE
LOW…EnvironmentGroupsTable/EnvironmentGroupsTable.test.tsx402 expect(searchInput()).toHaveAttribute('placeholder', 'Filter groups...');CODE
LOW…ssManagement/PorAccessManagementUsersSelector.test.tsx105 describe('placeholder', () => {CODE
LOW…essManagement/AccessDatatable/AccessDatatable.test.tsx65 const mockAccess = createMockAccess({ Name: 'John Doe' });CODE
LOW…essManagement/AccessDatatable/AccessDatatable.test.tsx71 expect(screen.getByText('John Doe')).toBeVisible();CODE
LOW…ts/form-components/FormSection/FormSection.stories.tsx21 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam egestas turpis magna,CODE
LOW…ts/form-components/FormSection/FormSection.stories.tsx21 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam egestas turpis magna,CODE
LOWapp/react/components/datatables/TableHeaderRow.test.tsx341 { id: '1', name: 'John Doe', age: 30, status: 'active' },CODE
LOWapp/react/components/datatables/Datatable.test.tsx21 { id: '1', name: 'John Doe', age: 30 },CODE
LOWapp/react/components/datatables/Datatable.test.tsx69 expect(screen.getByText('John Doe')).toBeInTheDocument();CODE
LOWapi/kubernetes/cli/client_test.go50 token: fake-tokenCODE
LOWapi/git/git_integration_test.go371 _, err = service.ListRefs(t.Context(), repositoryUrl, username, "fake-token", false, false)CODE
LOWapi/git/git_integration_test.go420 _, err = service.ListRefs(t.Context(), repositoryUrl, username, "fake-token", false, false)CODE
LOWapi/git/git_integration_test.go424 _, err = service.ListRefs(t.Context(), repositoryUrl, username, "fake-token", true, false)CODE
LOWapi/git/git_integration_test.go459 "fake-token",CODE
LOWapi/git/git_test.go252 sig := object.Signature{Name: "Test", Email: "test@test.com", When: time.Now()}CODE
Decorative Section Separators4 hits · 12 pts
SeverityFileLineSnippetContext
MEDIUM…ents/form-components/FilePicker/FilePicker.stories.tsx42// ─── Demo data ────────────────────────────────────────────────────────────────COMMENT
MEDIUM…ents/form-components/FilePicker/FilePicker.stories.tsx140// ─── Skeleton ─────────────────────────────────────────────────────────────────COMMENT
MEDIUM…ents/form-components/FilePicker/FilePicker.stories.tsx186// ─── Default ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM…ents/form-components/FilePicker/FilePicker.stories.tsx228// ─── Huge repo (BE-13263) ──────────────────────────────────────────────────────COMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICAL…ngs/authentication/settingsAuthenticationController.js201 const hasInvalidMapping = $scope.settings.OAuthSettings.TeamMemberships.OAuthClaimMappings.some((m) => !(m.ClaimVaCODE
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMapi/internal/registryutils/access/access.go41 // validate access for kubernetes namespaces (leverage registry.RegistryAccesses[endpointId].Namespaces)COMMENT
MEDIUMapi/internal/registryutils/access/access.go70 // leverage registry.RegistryAccesses[endpointId].UserAccessPolicies (direct access)COMMENT
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHapi/docs/swagger.yaml3998 - ' ''values/secrets.yaml'']' items: type: string type: array ValuesInline: STRING
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOWapp/kubernetes/helpers/application/index.js506 // to identify the helm managed applications, we need to check if the applications pod labels includeCOMMENT
LOWapi/pendingactions/pendingactions.go83 // For Kubernetes endpoints, we need to check if the endpoint is up byCOMMENT
TODO Padding2 hits · 3 pts
SeverityFileLineSnippetContext
LOWapi/uac/custom_template.go3// TODO: implement UAC rules for Custom templatesCOMMENT
LOWapi/uac/containergroup.go3// TODO: implement UAC rules for Container groupsCOMMENT
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOW…react/components/SortableList/SortableList.stories.tsx132function getData(): Produce[] {CODE
LOW.storybook/public/mockServiceWorker.js121async function handleRequest(event, requestId, requestInterceptedAt) {CODE