A horizontally scalable, highly available, multi-tenant, long term Prometheus.
This report summarizes scanner evidence for cortexproject/cortex, a Go project with 5,877 GitHub stars. SynthScan examined 383,726 lines of code across 1242 source files, recording 710 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 1.7 (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? 677 finding(s).
Are imports declared and package/API names verified? 13 finding(s).
Are wrappers, guards, and repeated structures necessary? 20 finding(s).
Which changes need focused human review? 710 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 710 distinct pattern matches across 11 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 |
|---|---|---|---|---|
| LOW | integration/util.go | 61 | if err != nil { | COMMENT |
| LOW | …tegration/integration_memberlist_single_binary_test.go | 361 | COMMENT | |
| LOW | …tegration/integration_memberlist_single_binary_test.go | 381 | // SuspicionMaxTimeoutMult (6x) that value and only shrinking as other nodes confirm the | COMMENT |
| LOW | integration/query_fuzz_test.go | 2281 | // by the PromQL "found duplicate series for the match group" many-to-many error. | COMMENT |
| LOW | integration/query_fuzz_test.go | 2561 | if strings.Contains(queryStr, "predict_linear") { | COMMENT |
| LOW | integration/e2e/service.go | 241 | // NetworkEndpoint returns internal service endpoint (host:port) for given internal port. | COMMENT |
| LOW | website/config.toml | 101 | # Enable Lunr.js offline search | COMMENT |
| LOW | …cs/configuration/single-process-config-blocks-tls.yaml | 61 | sync_dir: /tmp/cortex/tsdb-sync | COMMENT |
| LOW | docs/configuration/single-process-config-blocks.yaml | 61 | # secret_access_key: "TODO" | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 61 | [target: <string> | default = "all"] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 101 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 181 | # CLI flag: -parquet-converter.conversion-interval | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 281 | # Time since last heartbeat before parquet-converter will be removed from | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 301 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 321 | # The scanning strategy depends on the | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 361 | # If a querier disconnects without sending notification about graceful | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 401 | # Maximum delay when backing off. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 421 | # certificate to be configured. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 461 | # Alertmanager is served via a reverse proxy). Used for generating relative and | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 541 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 561 | # shutdown and restored at startup. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 581 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 621 | # Time to wait between peers to send notifications. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 641 | # Maximum number of concurrent GET API requests before returning an error. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 661 | # with the server. Also requires the key path to be configured. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 701 | # The interval between persisting the current alertmanager state (notification | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 761 | # be useful in local dev/test environments while using an S3-compatible | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 801 | # CLI flag: -alertmanager-storage.s3.http.insecure-skip-verify | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 841 | # CLI flag: -alertmanager-storage.azure.account-name | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 861 | [endpoint_suffix: <string> | default = "blob.core.windows.net"] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 881 | [idle_conn_timeout: <duration> | default = 1m30s] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 961 | # OpenStack Swift user's domain name. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1001 | # data is received on a request. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1041 | # CLI flag: -alertmanager-storage.oci.private-key-passphrase | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1101 | # CLI flag: -blocks-storage.backend | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1121 | # CLI flag: -blocks-storage.s3.disable-dualstack | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1141 | [signature_version: <string> | default = "v4"] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1181 | # the request headers if the request has an Expect header. 0 to send the | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1201 | # GCS bucket name | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1221 | # ignored if `connection-string` is set. Use this method over `account-key` if | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1241 | # CLI flag: -blocks-storage.azure.msi-resource | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1261 | # CLI flag: -blocks-storage.azure.http.insecure-skip-verify | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1341 | # OpenStack Swift project name (v2,v3 auth only). | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1361 | [container_name: <string> | default = ""] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1421 | # The maximum number of request attempts when encountering recoverable errors. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1441 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 1461 | # When the limit is reached, new requests are rejected with HTTP 503. 0 to | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1481 | # (roughly) strongly consistent. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1501 | [enabled_items: <list of string> | default = []] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1521 | # CLI flag: -blocks-storage.bucket-store.index-cache.memcached.max-async-concurrency | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1541 | # stored. If set to 0, no maximum size is enforced. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1561 | # becomes half-open. If set to 0, by default open duration is 60 | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1581 | [enabled_items: <list of string> | default = []] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1641 | # Client write timeout. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1661 | # If not set, the host's root CA certificates are used. | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1681 | # CLI flag: -blocks-storage.bucket-store.index-cache.redis.set-async.circuit-breaker.enabled | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1701 | [consecutive_failures: <int> | default = 5] | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1741 | memcached: | COMMENT |
| LOW | docs/configuration/config-file-reference.md | 1761 | COMMENT | |
| LOW | docs/configuration/config-file-reference.md | 1781 | [max_item_size: <int> | default = 1048576] | COMMENT |
| 570 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | pkg/cortex/modules.go | 379 | // ┌──────────────────┐ QF to ┌──────────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 381 | // │ router │──────────────▶│ frontend worker │ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 383 | // └──────────────────┘ └──────────────────┘ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 387 | // microservice ┌──────────────────┐ │ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 389 | // ─ ─ ─ ─▶│ router │◀─────┘ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 391 | // └──────────────────┘ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 394 | // /metadata & /chunk ┌─────────────────────┼─────────────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 398 | // ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 402 | // └──────────────────┘ └──────────────────┘ └──────────────────┘ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 404 | // │ └──────────┬──────────┘ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 406 | // │ ┌──────────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 408 | // └──────────────────────│ Prometheus API │ | COMMENT |
| MEDIUM⚡ | pkg/cortex/modules.go | 410 | // └──────────────────┘ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 44 | // ┌────────────────────────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 47 | // ┌─────┐ ┌──────────┐ ┌─────────┐ ┌──────────┐ ┌────────────┐ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 48 | // │ New │─────▶│ Starting │─────▶│ Running │────▶│ Stopping │───┬─▶│ Terminated │ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 49 | // └─────┘ └──────────┘ └─────────┘ └──────────┘ │ └────────────┘ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 52 | // │ │ ┌────────┐ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 53 | // └──────────────────────────────────────────┴──▶│ Failed │ | COMMENT |
| MEDIUM⚡ | pkg/util/services/service.go | 54 | // └────────┘ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …site/content/en/blog/2025/readonly-ingester-scaling.md | 38 | ### Step 1: Transition to READONLY | COMMENT |
| LOW⚡ | …site/content/en/blog/2025/readonly-ingester-scaling.md | 47 | ### Step 2: Monitor Data Status (Optional) | COMMENT |
| LOW⚡ | …site/content/en/blog/2025/readonly-ingester-scaling.md | 54 | ### Step 3: Choose Removal Strategy | COMMENT |
| LOW⚡ | …site/content/en/blog/2025/readonly-ingester-scaling.md | 62 | ### Step 4: Remove Ingesters | COMMENT |
| LOW | docs/blocks-storage/migrate-from-chunks-to-blocks.md | 33 | ## Step 1: Preparation | COMMENT |
| LOW | docs/blocks-storage/migrate-from-chunks-to-blocks.md | 77 | ## Step 2: Ingesters migration | COMMENT |
| LOW | docs/blocks-storage/migrate-from-chunks-to-blocks.md | 104 | ## Step 3: Cleanup | COMMENT |
| LOW | docs/getting-started/single-binary.md | 62 | ## Step 1: Clone the Repository | COMMENT |
| LOW | docs/getting-started/single-binary.md | 71 | ## Step 2: Start the Services | COMMENT |
| LOW | docs/getting-started/single-binary.md | 94 | ## Step 3: Verify Services Are Running | COMMENT |
| LOW | docs/getting-started/single-binary.md | 113 | ## Step 4: Verify Data Flow | COMMENT |
| LOW | docs/getting-started/single-binary.md | 152 | ## Step 5: Configure Recording and Alerting Rules (Optional) | COMMENT |
| LOW | docs/getting-started/single-binary.md | 196 | ## Step 6: Configure Alertmanager (Optional) | COMMENT |
| LOW | docs/getting-started/single-binary.md | 210 | ## Step 7: Per-Tenant Alert Generator URLs (Optional) | COMMENT |
| LOW | docs/getting-started/microservices.md | 84 | ## Step 1: Create a Kubernetes Cluster | COMMENT |
| LOW | docs/getting-started/microservices.md | 105 | ## Step 2: Configure Helm Repositories | COMMENT |
| LOW⚡ | docs/getting-started/microservices.md | 116 | ## Step 3: Clone the Repository | COMMENT |
| LOW⚡ | docs/getting-started/microservices.md | 125 | ## Step 4: Create the Cortex Namespace | COMMENT |
| LOW⚡ | docs/getting-started/microservices.md | 133 | ## Step 5: Deploy SeaweedFS (S3-Compatible Storage) | COMMENT |
| LOW | docs/getting-started/microservices.md | 187 | ## Step 6: Deploy Cortex | COMMENT |
| LOW | docs/getting-started/microservices.md | 229 | ## Step 7: Deploy Prometheus | COMMENT |
| LOW | docs/getting-started/microservices.md | 252 | ## Step 8: Deploy Grafana | COMMENT |
| LOW | docs/getting-started/microservices.md | 292 | ## Step 9: Access the Services | COMMENT |
| LOW | docs/getting-started/microservices.md | 317 | ## Step 10: Verify Data Flow | COMMENT |
| LOW | docs/getting-started/microservices.md | 365 | ## Step 11: Configure Rules and Alerts (Optional) | COMMENT |
| LOW | docs/getting-started/microservices.md | 412 | ## Step 12: Configure Alertmanager (Optional) | COMMENT |
| LOW⚡ | pkg/util/grpcclient/signing_handler_test.go | 168 | // Step 2: Distributor redeployed with newKey; ingester still in transition. | COMMENT |
| LOW⚡ | pkg/util/grpcclient/signing_handler_test.go | 173 | // Step 3: Ingester redeployed with newKey only. | COMMENT |
| LOW | pkg/ingester/pushstream_security_test.go | 119 | // Step 2: Attacker requests to write into "tenant-B" | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | pkg/ingester/ingester.go | 3031 | blockRanges := i.cfg.BlocksStorageConfig.TSDB.BlockRanges.ToMilliseconds() | CODE |
| CRITICAL | pkg/ingester/ingester.go | 3075 | blockRetentionPeriod: i.cfg.BlocksStorageConfig.TSDB.Retention.Milliseconds(), | CODE |
| CRITICAL | pkg/ingester/ingester.go | 3093 | RetentionDuration: i.cfg.BlocksStorageConfig.TSDB.Retention.Milliseconds(), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …nfiguration/single-process-config-blocks-gossip-1.yaml | 73 | # Cortex of course supports multiple options (S3, GCS, Azure), but for demonstration purposes | COMMENT |
| MEDIUM | …nfiguration/single-process-config-blocks-gossip-2.yaml | 72 | # Cortex of course supports multiple options (S3, GCS, Azure), but for demonstration purposes | COMMENT |
| MEDIUM⚡ | docs/getting-started/grafana-values.yaml | 456 | ## 3. attach a policy to the role, you can use a built in policy called CloudWatchReadOnlyAccess | COMMENT |
| LOW⚡ | docs/getting-started/grafana-values.yaml | 466 | ## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn | COMMENT |
| LOW⚡ | docs/getting-started/grafana-values.yaml | 466 | ## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/guides/overrides-exporter.md | 30 | # In this example, we're overriding ingestion limits for a single tenant. | COMMENT |
| HIGH | docs/guides/overrides-exporter-runtime.yaml | 2 | # In this example, we're overriding ingestion limits for a single tenant. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …blocks-storage-swift-single-binary/config/runtime.yaml | 1 | # This file is left empty. It can be configured with overrides or other runtime config. | COMMENT |
| MEDIUM | docs/getting-started/runtime-config.yaml | 2 | # This file is hot-reloaded by Cortex without requiring a restart. | COMMENT |
| MEDIUM | docs/getting-started/grafana-values.yaml | 51 | ## Create a headless service for the deployment | COMMENT |
| MEDIUM | docs/getting-started/grafana-values.yaml | 1326 | # Create a dynamic manifests via values: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …opment/tsdb-blocks-storage-s3/config/alertmanager.yaml | 5 | smtp_from: 'alertmanager@example.org' | CODE |
| LOW | docs/guides/alert-manager-configuration.md | 39 | smtp_from: 'alertmanager@example.org' | CODE |
| LOW | docs/api/_index.md | 877 | smtp_from: 'youraddress@example.org' | CODE |
| LOW | docs/api/_index.md | 885 | - to: 'youraddress@example.org' | CODE |
| LOW | pkg/alertmanager/multitenant_test.go | 1137 | smtp_from: 'youraddress@example.org' | CODE |
| LOW | pkg/alertmanager/multitenant_test.go | 1143 | - to: 'youraddress@example.org' | CODE |
| LOW | pkg/alertmanager/multitenant_test.go | 1214 | smtp_from: 'youraddress@example.org' | CODE |
| LOW | pkg/alertmanager/multitenant_test.go | 1220 | - to: 'youraddress@example.org' | CODE |
| LOW | pkg/alertmanager/alertstore/local/store_test.go | 135 | smtp_from: 'alertmanager@example.org' | CODE |
| LOW | pkg/storage/bucket/client_test.go | 43 | "client_email": "test@test.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | integration/e2ecortex/client.go | 709 | // TODO: Upgrade to Alertmanager v0.20.0+ and utilize vendored structs | COMMENT |
| MEDIUM | website/package-lock.json | 1114 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | pkg/api/api.go | 249 | // UI components lead to a large number of routes to support, utilize a path prefix instead | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | pkg/util/grpcclient/signing_handler_test.go | 168 | // Step 2: Distributor redeployed with newKey; ingester still in transition. | COMMENT |
| LOW⚡ | pkg/util/grpcclient/signing_handler_test.go | 173 | // Step 3: Ingester redeployed with newKey only. | COMMENT |
| LOW | pkg/ingester/pushstream_security_test.go | 119 | // Step 2: Attacker requests to write into "tenant-B" | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | GENAI_POLICY.md | 29 | 4. **Honour the DCO.** Your `Signed-off-by` line on each commit certifies the [Developer Certificate of Origin](https:// | CODE |