KEDA is a Kubernetes-based Event Driven Autoscaling component. It provides event driven scale for any container running in Kubernetes
This report summarizes scanner evidence for kedacore/keda, a Go project with 10,684 GitHub stars. SynthScan examined 209,738 lines of code across 706 source files, recording 124 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.2 (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.
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.
Can maintainers explain intent, assumptions, and trade-offs? 105 finding(s).
Are imports declared and package/API names verified? 10 finding(s).
Are wrappers, guards, and repeated structures necessary? 22 finding(s).
Which changes need focused human review? 124 finding(s).
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.
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.
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.
The scanner identified 124 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .golangci.yml | 199 | # Exclude gci check for //+kubebuilder:scaffold:imports comments. Waiting to | COMMENT |
| MEDIUM | .golangci.yml | 199 | # Exclude gci check for //+kubebuilder:scaffold:imports comments. Waiting to | COMMENT |
| MEDIUM | cmd/webhooks/main.go | 53 | //+kubebuilder:scaffold:scheme | COMMENT |
| MEDIUM | cmd/webhooks/main.go | 127 | //+kubebuilder:scaffold:builder | COMMENT |
| MEDIUM | cmd/operator/main.go | 70 | //+kubebuilder:scaffold:scheme | COMMENT |
| MEDIUM | cmd/operator/main.go | 350 | //+kubebuilder:scaffold:builder | COMMENT |
| MEDIUM | apis/keda/v1alpha1/suite_test.go | 99 | //+kubebuilder:scaffold:scheme | COMMENT |
| MEDIUM | apis/keda/v1alpha1/suite_test.go | 130 | //+kubebuilder:scaffold:webhook | COMMENT |
| MEDIUM | apis/eventing/v1alpha1/cloudeventsource_webhook_test.go | 93 | //+kubebuilder:scaffold:scheme | COMMENT |
| MEDIUM | apis/eventing/v1alpha1/cloudeventsource_webhook_test.go | 118 | //+kubebuilder:scaffold:webhook | COMMENT |
| MEDIUM⚡ | config/crd/kustomization.yaml | 11 | # +kubebuilder:scaffold:crdkustomizeresource | COMMENT |
| MEDIUM⚡ | config/crd/kustomization.yaml | 20 | # +kubebuilder:scaffold:crdkustomizewebhookpatch | COMMENT |
| MEDIUM⚡ | config/crd/kustomization.yaml | 26 | # +kubebuilder:scaffold:crdkustomizecainjectionpatch | COMMENT |
| MEDIUM | config/samples/kustomization.yaml | 9 | # +kubebuilder:scaffold:manifestskustomizesamples | COMMENT |
| MEDIUM | controllers/keda/suite_test.go | 124 | // +kubebuilder:scaffold:scheme | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 353 | // Step 1: Start worker with 1 replica to register the deployment version | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 359 | // Step 2: Set this version as current | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 365 | // Step 3: Scale worker back to 0 and apply the ScaledObject | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 372 | // Step 4: Submit workflows to create backlog → scale out | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 380 | // Step 5: Scale in after workflows drain | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 253 | // Step 1: wait for the ES pod to be ready. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 260 | // Step 2: activate trial licence so ML features are available. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 264 | // Step 3: create the index that will hold training data. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 277 | // Step 4: ingest synthetic training data. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 281 | // Step 5: create the ML anomaly-detection job. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 340 | // Step 9: wait until the datafeed has finished processing the historical window. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 344 | // Step 10: verify the ML job has processed enough buckets to produce a meaningful forecast. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 348 | // Step 11: re-open the ML job. | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 294 | // Step 6: create the datafeed that links the job to the index. | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 311 | // Step 7: open the job (required before starting the datafeed). | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 324 | // Step 8: start the datafeed over the full 2-hour historical window. | COMMENT |
| LOW | pkg/scalers/kafka_scaler.go | 981 | // Step 1: build one OffsetRequest instance per broker. | COMMENT |
| LOW | pkg/scalers/kafka_scaler.go | 999 | // Step 2: send requests, one per broker, and collect topicPartitionsOffsets | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 542 | // Step 1: build one OffsetRequest | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 551 | // Step 2: send request | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 560 | // Step 3: parse response and return | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 353 | // Step 1: Start worker with 1 replica to register the deployment version | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 359 | // Step 2: Set this version as current | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 365 | // Step 3: Scale worker back to 0 and apply the ScaledObject | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 372 | // Step 4: Submit workflows to create backlog → scale out | COMMENT |
| LOW⚡ | tests/scalers/temporal/temporal_test.go | 380 | // Step 5: Scale in after workflows drain | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 253 | // Step 1: wait for the ES pod to be ready. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 260 | // Step 2: activate trial licence so ML features are available. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 264 | // Step 3: create the index that will hold training data. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 277 | // Step 4: ingest synthetic training data. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 281 | // Step 5: create the ML anomaly-detection job. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 340 | // Step 9: wait until the datafeed has finished processing the historical window. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 344 | // Step 10: verify the ML job has processed enough buckets to produce a meaningful forecast. | COMMENT |
| LOW⚡ | tests/scalers/elastic_forecast/elastic_forecast_test.go | 348 | // Step 11: re-open the ML job. | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 294 | // Step 6: create the datafeed that links the job to the index. | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 311 | // Step 7: open the job (required before starting the datafeed). | COMMENT |
| LOW | tests/scalers/elastic_forecast/elastic_forecast_test.go | 324 | // Step 8: start the datafeed over the full 2-hour historical window. | COMMENT |
| LOW | pkg/scalers/kafka_scaler.go | 981 | // Step 1: build one OffsetRequest instance per broker. | COMMENT |
| LOW | pkg/scalers/kafka_scaler.go | 999 | // Step 2: send requests, one per broker, and collect topicPartitionsOffsets | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 542 | // Step 1: build one OffsetRequest | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 551 | // Step 2: send request | COMMENT |
| LOW⚡ | pkg/scalers/apache_kafka_scaler.go | 560 | // Step 3: parse response and return | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apis/keda/v1alpha1/triggerauthentication_types.go | 21 | ) | COMMENT |
| LOW | apis/keda/v1alpha1/scaledjob_types.go | 61 | // +optional | COMMENT |
| LOW | apis/keda/v1alpha1/scaledobject_types.go | 21 | "reflect" | COMMENT |
| LOW | apis/keda/v1alpha1/scaledobject_types.go | 101 | // +kubebuilder:validation:XValidation:rule="!has(self.minReplicaCount) || self.minReplicaCount <= (has(self.maxReplicaC | COMMENT |
| LOW | apis/keda/v1alpha1/scaledobject_webhook.go | 61 | // namespace List scans on every admission. Without these indexes each | COMMENT |
| LOW | apis/keda/v1alpha1/condition_types.go | 21 | ) | COMMENT |
| LOW | config/default/kustomization.yaml | 1 | # Adds namespace to all resources. | COMMENT |
| LOW | config/minimal/kustomization.yaml | 1 | # Adds namespace to all resources. | COMMENT |
| LOW | tests/helper/helper.go | 1341 | // KedaEventually checks if the provided conditionFunc eventually returns true | COMMENT |
| LOW | hack/verify_go_versions_test.py | 1 | # Copyright 2026 The KEDA Authors. | COMMENT |
| LOW | hack/verify-manifests.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | hack/verify_go_versions.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | hack/verify-schema.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/scorecards.yml | 41 | # - you want to enable the Branch-Protection check on a *public* repository, or | COMMENT |
| LOW | controllers/keda/scaledobject_controller.go | 61 | // +kubebuilder:rbac:groups="",resources=configmaps;configmaps/status,verbs=get;list;watch | COMMENT |
| LOW | pkg/util/value_by_path.go | 1 | package util | COMMENT |
| LOW | pkg/util/watch.go | 41 | if len(nss) == 0 || err != nil { | COMMENT |
| LOW | pkg/util/watch.go | 61 | // Example: "environment=production" reconciles only resources labelled | COMMENT |
| LOW | pkg/scalers/temporal_scaler.go | 241 | return []external_metrics.ExternalMetricValue{metric}, isActive, nil | COMMENT |
| LOW | pkg/scalers/azure_cosmosdb_scaler.go | 381 | resourceLink := fmt.Sprintf("dbs/%s/colls/%s", c.leaseDatabaseID, c.leaseContainerID) | COMMENT |
| LOW | pkg/scalers/azure_cosmosdb_scaler.go | 581 | COMMENT | |
| LOW | pkg/scalers/selenium_grid_scaler.go | 201 | COMMENT | |
| LOW | pkg/scalers/arangodb_scaler.go | 41 | // +optional | COMMENT |
| LOW | pkg/scalers/externalscaler/externalscaler_grpc.pb.go | 141 | // | COMMENT |
| LOW | pkg/scalers/azure/azure_service_principal.go | 41 | // stackCloud is the cloud name for Azure Stack, whose environment is | COMMENT |
| LOW | pkg/scalers/aws/aws_http.go | 21 | COMMENT | |
| LOW | pkg/scaling/scale_handler_raw_metrics.go | 41 | // RawMetricsMode defines the different modes for sending raw metrics | COMMENT |
| LOW | pkg/scaling/scale_handler.go | 141 | ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, | COMMENT |
| LOW | pkg/scaling/cache/scalers_cache.go | 281 | // uid and generation. The identity guard prevents a stale streaming watcher | COMMENT |
| LOW | pkg/scaling/executor/scale_scaledobjects.go | 141 | return | COMMENT |
| LOW | pkg/metricsservice/client.go | 101 | grpcClient := GrpcClient{client: api.NewMetricsServiceClient(conn), connection: conn} | COMMENT |
| LOW | pkg/metricsservice/api/metrics_grpc.pb.go | 1 | // | COMMENT |
| LOW | pkg/metricsservice/api/metrics.pb.go | 1 | // | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/scalers/gcp/gcp_spanner/gcp_spanner_test.go | 68 | // ── Kubernetes manifest templates ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/scalers/gcp/gcp_spanner/gcp_spanner_test.go | 190 | // ── Test entry point ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/scalers/gcp/gcp_spanner/gcp_spanner_test.go | 216 | // ── Spanner setup / teardown ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/scalers/gcp/gcp_spanner/gcp_spanner_test.go | 326 | // ── Scaling scenarios ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/scalers/gcp/gcp_spanner/gcp_spanner_test.go | 362 | // ── Helpers ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/scalers/gcp_spanner_scaler_test.go | 55 | // ── required fields ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/scalers/gcp_spanner_scaler_test.go | 87 | // ── authentication methods ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/scalers/gcp_spanner_scaler_test.go | 113 | // ── optional numeric parameters ─────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/scalers/gcp_spanner_scaler_test.go | 204 | // ── metric name generation ──────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | pkg/scalers/mssql_scaler.go | 246 | if s.metadata.azureAuthContext.token != nil && s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now()) { | CODE |
| CRITICAL | pkg/scalers/postgresql_scaler.go | 206 | if s.metadata.azureAuthContext.token.ExpiresOn.Before(time.Now()) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hack/verify_go_versions_test.py | 37 | def test_patch_versions_can_differ(self): | CODE |
| LOW | hack/verify_go_versions_test.py | 40 | def test_checks_every_image_location(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 53 | def test_original_devcontainer_mismatch(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 57 | def test_all_references_in_workflow_are_checked(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 61 | def test_major_version_mismatch(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 65 | def test_image_suffix_and_digest(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 69 | def test_digest_only_workflow_images_are_rejected(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 78 | def test_tagged_and_pinned_workflow_images_are_checked(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 88 | def test_comments_and_unrelated_images_are_ignored(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 92 | def test_go_directive_without_patch(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 96 | def test_missing_go_directive(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 100 | def test_unversioned_image_is_rejected(self): | CODE |
| LOW⚡ | hack/verify_go_versions_test.py | 104 | def test_missing_image_is_rejected(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/scalers/opensearch/opensearch_test.go | 199 | parameters: "dummy_value:1;dumb_value:oOooo" | CODE |
| LOW | tests/scalers/opensearch/opensearch_test.go | 291 | "dummy": "{{dummy_value}}" | CODE |
| LOW | tests/scalers/elasticsearch/elasticsearch_test.go | 230 | parameters: "dummy_value:1;dumb_value:oOooo" | CODE |
| LOW | tests/scalers/elasticsearch/elasticsearch_test.go | 322 | "dummy": "{{dummy_value}}" | CODE |
| LOW | pkg/scalers/loki_scaler_test.go | 53 | {map[string]string{"serverAddress": "http://localhost:3100", "threshold": "1", "query": "sum(rate({filename=\"/var/log/ | CODE |
| LOW | pkg/scalers/arangodb_scaler_test.go | 60 | {map[string]string{"endpoints": "https://http://34.162.13.192:8529,https://34.162.13.193:8529", "collection": "demo", " | CODE |
| LOW | …/scalers/authentication/authentication_helpers_test.go | 96 | _, err := w.Write([]byte(`{"access_token":"fake_token","token_type":"Bearer","expires_in":3600}`)) | CODE |
| LOW | …/scalers/authentication/authentication_helpers_test.go | 124 | assert.Equal(t, "fake_token", token.AccessToken) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/pr-bot-welcome.yml | 27 | body: 'Thank you for your contribution! 🙏\n\nPlease understand that we will do our best to review your PR | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hack/verify_go_versions.py | 28 | CODE |