AI Slop Code Risk Monitor

teamhanko/hanko

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

Modern authentication, on your terms. Open source alternative to Auth0, Clerk, WorkOS, Stytch.

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for teamhanko/hanko, a Go project with 9,053 GitHub stars. SynthScan examined 124,067 lines of code across 852 source files, recording 73 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 0.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.

0.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-29
Last Push
9.1K
Stars
Go
Language
124.1K
Lines of Code
852
Files
73
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 2.1/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.1/100 · LOW

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

Agent Over-Engineering Ratio 0.1/100 · LOW

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

PR Review Velocity Impact 2.9/100 · LOW

Which changes need focused human review? 73 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 0MEDIUM 0LOW 73

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 73 distinct pattern matches across 5 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 Block45 hits · 45 pts
SeverityFileLineSnippetContext
LOWfrontend/frontend-sdk/README.md181 // public_key: "...",COMMENT
LOWfrontend/frontend-sdk/README.md201 // created_at: "2025-01-01T10:00:00Z",COMMENT
LOWfrontend/frontend-sdk/README.md241 // Example output:COMMENT
LOWdeploy/docker-compose/quickstart.keycloak.yaml1# Override file for manually testing SAML/OIDC/custom-claims against a local KeycloakCOMMENT
LOWdeploy/docker-compose/config-keycloak.yaml141 acme_corp:COMMENT
LOWbackend/dto/user.go61//COMMENT
LOWbackend/handler/utils.go41//func storeSession(cfg *config.Config, persister persistence.Persister, userId uuid.UUID, rawToken jwt.Token, httpConteCOMMENT
LOWbackend/handler/utils.go61// ID: uuid.FromStringOrNil(sessionID.(string)),COMMENT
LOWbackend/handler/utils.go81//COMMENT
LOWbackend/cmd/user/format.go81}COMMENT
LOWbackend/config/config.go21 // `debug`, if set to `true`, adds additional debugging information to flow API responses.COMMENT
LOWbackend/config/config.go61 // `security_notifications` configures security notifications for important security-related events.COMMENT
LOWbackend/config/config_third_party.go21// is matched by scheme alone at runtime, with no host check at all, so it carries none of theCOMMENT
LOWbackend/config/config_third_party.go41 //COMMENT
LOWbackend/config/config_third_party.go61 // successful.COMMENT
LOWbackend/config/config_third_party.go81 // See [here](https://pkg.go.dev/github.com/gobwas/glob#Compile) for more on globbing.COMMENT
LOWbackend/config/config_third_party.go301 //COMMENT
LOWbackend/config/config_third_party.go321 //COMMENT
LOWbackend/config/config_third_party.go341 ID string `jsonschema:"-" yaml:"-" json:"-" koanf:"-"`COMMENT
LOWbackend/config/config_third_party.go361 // - consentCOMMENT
LOWbackend/config/config_database.go21 Database string `yaml:"database" json:"database,omitempty" koanf:"database" jsonschema:"default=hanko"`COMMENT
LOWbackend/config/config_username.go1package configCOMMENT
LOWbackend/config/config_webauthn.go61 // `display_name` is the service's name that some WebAuthn Authenticators will display to the user during registrationCOMMENT
LOWbackend/config/config_server.go41}COMMENT
LOWbackend/config/config_session.go21 // `cookie` contains configuration for the session cookie issued on successful registration or login.COMMENT
LOWbackend/config/config_session.go41 // These claims are processed at JWT generation time and can include static values,COMMENT
LOWbackend/config/config_session.go61 // is_verified: "{{.User.Email.IsVerified}}" # Boolean from user dataCOMMENT
LOWbackend/config/config_session.go81 // - subCOMMENT
LOWbackend/config/config_saml.go21 AudienceUri string `yaml:"audience_uri" json:"audience_uri" koanf:"audience_uri"`COMMENT
LOWbackend/thirdparty/helper.go21 // The user-controlled redirect target must be a real absolute URL. UnlikeCOMMENT
LOWbackend/thirdparty/helper.go41 // Unlike before, we no longer hard-code the scheme to http/https here.COMMENT
LOWbackend/thirdparty/helper.go61 // because it can confuse "trusted host as prefix" with "trusted host asCOMMENT
LOWbackend/thirdparty/helper.go81 return falseCOMMENT
LOWbackend/thirdparty/helper.go121 // and vice versa. Keeping this strict avoids surprising behavior.COMMENT
LOWbackend/thirdparty/helper.go161 // Example:COMMENT
LOWbackend/thirdparty/helper.go181}COMMENT
LOWbackend/thirdparty/helper.go221COMMENT
LOWbackend/thirdparty/helper.go281// "127.0.0.1**", "127.0.0.1**[a-z]", "127.0.0.1**.*"). Such a "**"COMMENT
LOWbackend/thirdparty/helper.go321 // (e.g. "127.0.0.1**", but also "*.example.com**"). Strip it andCOMMENT
LOWbackend/thirdparty/helper.go361COMMENT
LOWbackend/thirdparty/helper.go381// without requiring the entire allowlist entry to be a valid URL.COMMENT
LOWbackend/thirdparty/linking.go81 }COMMENT
LOWbackend/thirdparty/custom_claims.go181// without a DB.COMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml61 # ℹ️ Command-line programs to run using the OS shell.COMMENT
Fake / Example Data22 hits · 28 pts
SeverityFileLineSnippetContext
LOWfrontend/frontend-sdk/README.md193 // address: "user@example.com",COMMENT
LOWfrontend/frontend-sdk/README.md208 // name: "John Doe",COMMENT
LOWfrontend/frontend-sdk/README.md251 // email: { address: "user@example.com", is_primary: true, is_verified: true },COMMENT
LOWbackend/README.md602 "name": "Acme Corp",CODE
LOWbackend/handler/user_admin_test.go151 body := fmt.Sprintf(`{"id": "%s", "emails": [{"address": "test@test.com", "is_primary": true}]}`, sharedID)CODE
LOW⚡backend/handler/user_admin_test.go339 body: `{"emails": [{"address": "test@test.com", "is_primary": true}]}`,CODE
LOW⚡backend/handler/user_admin_test.go344 body: `{"id": "98a46ea2-51f6-4e30-bd29-8272de77c8c8", "emails": [{"address": "test@test.com", "is_primaCODE
LOW⚡backend/handler/user_admin_test.go349 body: `{"emails": [{"address": "test@test.com", "is_primary": true}, {"address": "test2@test.com"}]}`,CODE
LOW⚡backend/handler/user_admin_test.go354 body: `{"emails": [{"address": "test@test.com", "is_primary": true}], "created_at": "2023-06-07T13:42:4CODE
LOW⚡backend/handler/user_admin_test.go359 body: `{"id": "b5dd5267-b462-48be-b70d-bcd6f1bbe7a5", "emails": [{"address": "test@test.com", "is_primaCODE
LOW⚡backend/handler/user_admin_test.go364 body: `{"id": "customId", "emails": [{"address": "test@test.com", "is_primary": true}]}`,CODE
LOW⚡backend/handler/user_admin_test.go379 body: `{"emails": [{"address": "test@test.com"}]}`,CODE
LOW⚡backend/handler/user_admin_test.go384 body: `{"emails": [{"address": "test@test.com", "is_primary": true"}, {"address": "test2@test.com", "isCODE
LOW⚡backend/handler/user_admin_test.go389 body: `{"emails": [{"address": "test@test.com", "is_primary": true"}, {"address": "test@test.com"}]}`,CODE
LOWbackend/handler/user_test.go82 s.Equal("John Doe", response.Name)CODE
LOWbackend/handler/organization_admin_test.go58 body: `{"name": "Acme Corp"}`,CODE
LOWbackend/handler/thirdparty_callback_test.go151 Name: "John Doe",CODE
LOWbackend/handler/thirdparty_callback_test.go222 Name: "John Doe",CODE
LOWbackend/session/template_test.go83 Name: "John Doe",CODE
LOWbackend/session/template_test.go97 "name": "John Doe",CODE
LOWbackend/session/template_test.go128 Name: "John Doe",CODE
LOWbackend/session/template_test.go149 "full_name": "John Doe",CODE
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOWfrontend/elements/src/contexts/AppProvider.tsx352 // Step 1: Set the authComponentFlow from props.modeCOMMENT
LOWfrontend/elements/src/contexts/AppProvider.tsx364 // Step 2: Call init after authComponentFlow has been updatedCOMMENT
Structural Annotation Overuse2 hits · 3 pts
SeverityFileLineSnippetContext
LOWfrontend/elements/src/contexts/AppProvider.tsx352 // Step 1: Set the authComponentFlow from props.modeCOMMENT
LOWfrontend/elements/src/contexts/AppProvider.tsx364 // Step 2: Call init after authComponentFlow has been updatedCOMMENT
Hyper-Verbose Identifiers2 hits · 2 pts
SeverityFileLineSnippetContext
LOWe2e/helper/Matchers.ts54export async function toHaveLocalStorageEntryForUserWithCredential(CODE
LOWe2e/helper/Matchers.ts96export async function toHaveLocalStorageEntryForUserWithPasscode(CODE