AI Slop Code Risk Monitor

sindresorhus/eslint-plugin-unicorn

SlopCodeMonitor badge for sindresorhus/eslint-plugin-unicorn Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

More than 300 powerful ESLint rules

1.4 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for sindresorhus/eslint-plugin-unicorn, a JavaScript project with 5,284 GitHub stars. SynthScan examined 344,795 lines of code across 1575 source files, recording 473 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 1.4 (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.4
Adjusted Signal
1.4
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
5.3K
Stars
JavaScript
Language
344.8K
Lines of Code
1.6K
Files
473
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.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.3/100 · LOW

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

Agent Over-Engineering Ratio 6.2/100 · LOW

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

PR Review Velocity Impact 6.9/100 · LOW

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

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 473 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.

Hyper-Verbose Identifiers442 hits · 439 pts
SeverityFileLineSnippetContext
LOW⚡test/prefer-regexp-test.js597 function stringSearchAssertionPattern(pattern: string) {CODE
LOW⚡test/prefer-regexp-test.js601 function stringMatchAssertionPattern(pattern: string) {CODE
LOW⚡test/prefer-regexp-test.js609 function functionActionCreatorMatcher(actionCreator: (() => void) & {match(action: unknown): boolean}, action: unknowCODE
LOW⚡test/prefer-regexp-test.js617 function stringOrObjectExecReceiver(regexp: string | object, value: string) {CODE
LOW⚡test/prefer-regexp-test.js629 function regexpOrObjectExecArgument(regexp: RegExp, value: RegExp | object) {CODE
LOW⚡test/prefer-regexp-test.js637 function stringOrNumberMatchPattern(pattern: string | number) {CODE
LOW⚡test/prefer-regexp-test.js641 function stringOrRegExpMatchPattern(pattern: string | RegExp) {CODE
LOW⚡test/prefer-regexp-test.js645 function stringOrUndefinedSearchPattern(pattern: string | undefined) {CODE
LOWtest/prefer-regexp-test.js661 function genericReadonlyArraySearchPattern(pattern: ReadonlyArray<string>) {CODE
LOWtest/unit/boolean.js38function findFirstMemberExpression(code, languageOptions = {}) {CODE
LOWtest/utils/test.js65function assertNoManualEmptyFileTestCases(ruleId, testCases) {CODE
LOW…shared/no-unnecessary-length-or-infinity-rule-tests.js4function createArgumentEvaluationFixtures(method) {CODE
LOWscripts/rename-rule.js69function replaceRuleIdInRulesIndex(text, from, to) {CODE
LOWrules/no-break-in-nested-loop.js22function isNestedControlFlowStatement(node, sourceCode) {CODE
LOWrules/prefer-switch.js133function getBlockStatementLastNode(blockStatement) {CODE
LOWrules/prefer-switch.js155function shouldInsertBreakStatement(node) {CODE
LOWrules/prefer-group-by.js326function isBlockWithSingleExpression(block, predicate) {CODE
LOWrules/prefer-group-by.js357function getMapGroupVariableDeclaration(statement, callbackParts) {CODE
LOWrules/prefer-group-by.js475function getGroupByMethodForBinding(initialValue, declaration, context) {CODE
LOWrules/prefer-group-by.js485function hasRepeatedSideEffectfulKey(statements, key, context) {CODE
LOWrules/prefer-iterator-zip.js188function getSupportedLoopInformation(node, context) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js110function isPromiseFulfilledResultArrayTypeAnnotation(node) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js114function isUnsafePromiseSettledResultType(type) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js123function isPromiseFulfilledResultType(type) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js147function isPromiseSettledResultArrayFromTypeInformation(node, context) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js154function isPromiseFulfilledResultFromTypeInformation(node, context) {CODE
LOW⚡rules/no-unsafe-promise-all-settled-values.js158function isPromiseFulfilledResultArrayFromTypeInformation(node, context) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js58function getArrayElementTypeAnnotation(node) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js80function isUnsafePromiseSettledResultTypeAnnotation(node) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js93function isUnsafePromiseSettledResultArrayTypeAnnotation(node) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js97function isPromiseFulfilledResultTypeAnnotation(node) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js173function isPromiseSettledResultVariable(node, context, visitedVariables) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js202function isPromiseFulfilledResultVariable(node, context, visitedVariables) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js231function isPromiseSettledResultArray(node, context, visitedVariables = new Set()) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js365function hasFulfilledStatusCheckInConjunction(node, statusContext) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js380function hasUnfulfilledStatusCheckInDisjunction(node, statusContext) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js443function isGuardedByPreviousUnfulfilledExit(node, statusContext, context, branchAlwaysExits) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js473function isKnownFulfilledResultArray(node, context, visitedVariables = new Set()) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js494function isGuardedByFulfilledCheck(node, readContext) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js581function isDerivedFromVariableThroughFilters(node, variable, context) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js592function hasFulfilledFilterInChain(node) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js664function getThenMapCallbackProblem(node, resultsVariable, context, branchAlwaysExits) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js664function getThenMapCallbackProblem(node, resultsVariable, context, branchAlwaysExits) {CODE
LOWrules/no-unsafe-promise-all-settled-values.js696function getThenCallbackProblem(callExpression, context, branchAlwaysExits) {CODE
LOWrules/prefer-uint8array-hex.js96function getZeroPrefixedExpression(node) {CODE
LOWrules/no-unreadable-array-destructuring.js32function getMaximumConsecutiveIgnoredElements(elements) {CODE
LOWrules/no-lonely-if.js114function getOuterConditionGapTextPieces(outerConditionGap, outerLeadingContent) {CODE
LOWrules/prefer-export-from.js32function hasAttachedJSDocumentComment(node, sourceCode) {CODE
LOWrules/prefer-export-from.js73function getSourceAndAssertionsText(declaration, context) {CODE
LOWrules/prefer-aggregate-error.js97function isErrorArrayTypeReferenceAnnotation(node, scope, context, visitedTypeVariables) {CODE
LOWrules/prefer-aggregate-error.js126function isErrorArrayTypeAnnotation(node, scope, context, visitedTypeVariables = new Set()) {CODE
LOWrules/prefer-aggregate-error.js223function isErrorArrayTypeFromTypeInformation(node, context) {CODE
LOWrules/prefer-aggregate-error.js227function hasErrorCollectionEvidence(node, context) {CODE
LOWrules/prefer-aggregate-error.js299function getPositiveLengthCheckObject(node, context) {CODE
LOWrules/prefer-aggregate-error.js328function getGuardedErrorCollection(node, context) {CODE
LOWrules/prefer-uint8array-base64.js41function unwrapTransparentExpression(node) {CODE
LOWrules/prefer-uint8array-base64.js97function shouldIgnoreBufferFromInput(node, context) {CODE
LOWrules/no-multiple-promise-resolver-calls.js40function isNonThrowingReturnBranch(node) {CODE
LOWrules/no-multiple-promise-resolver-calls.js69function registerResolverReferences(executor, resolverReferenceExecutors, sourceCode) {CODE
LOWrules/no-multiple-promise-resolver-calls.js150function cloneFinallyBlocksByCatchClause(finallyBlocksByCatchClause) {CODE
382 more matches not shown…
Over-Commented Block26 hits · 26 pts
SeverityFileLineSnippetContext
LOWtest/package.js521COMMENT
LOWtest/package.js541// result[key] = languageOptions;COMMENT
LOWtest/prefer-optional-catch-binding.js101 // code: outdent`COMMENT
LOWtest/no-manually-wrapped-comments.js41 outdent`COMMENT
LOWtest/no-manually-wrapped-comments.js361 // MARK: - NetworkingCOMMENT
LOWtest/no-manually-wrapped-comments.js421 outdent`COMMENT
LOWtest/comment-content.js201 '// applications and application',COMMENT
LOWtest/comment-content.js221 // gifCOMMENT
LOWtest/comment-content.js241 `// cpuCOMMENT
LOWtest/comment-content.js261 // nginxCOMMENT
LOWtest/comment-content.js281 // nfcCOMMENT
LOWtest/comment-content.js301 `// We sanitize the input,COMMENT
LOWtest/comment-content.js841 t.assert.strictEqual(result.fixed, true);COMMENT
LOWtest/comment-content.js861// JSON/XML formats.COMMENT
LOWtest/comment-content.js901// api [deprecated]. uses json.COMMENT
LOWtest/comment-content.js1041// - {api: json}COMMENT
LOWtest/comment-content.js1061test('ignores prompt-prefixed command-line snippets', t => {COMMENT
LOWtest/comment-content.js1081COMMENT
LOWtest/comment-content.js1101});COMMENT
LOWtest/comment-content.js1121COMMENT
LOWdocs/rules/expiring-todo-comments.md261- CSS, HTML, JSONC, JSON5, Markdown, SOML, TOML, and YAML comments are supported with their respective ESLint plugins.COMMENT
LOWdocs/rules/expiring-todo-comments.md281// TODO [peer:eslint@>=8]: Whoops, our minimum supported `eslint` is already >= 8.COMMENT
LOWrules/prefer-dispose.js101// Without it, `using` would throw a `TypeError` at runtime, so this avoids suggesting broken code.COMMENT
LOWrules/no-unused-builtin-method-return.js161 // - explicitly supported typed variablesCOMMENT
LOWrules/no-unused-builtin-method-return.js241 // - trivial identifier aliases to that same initializer, like `const alias = values`COMMENT
LOWrules/shared/name-replacements.js301 // Ember class nameCOMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALrules/text-encoding-identifier-case.js71 && node.parent.parent.name.name.toLowerCase() === element;CODE
CRITICALrules/no-useless-fallback-in-spread.js28 && node.parent.parent.parent.properties.includes(node.parent.parent)CODE
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOWtest/try-complexity.js35 function doSomething() {CODE
LOWscripts/create-rule.js45async function getData() {CODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWrules/consistent-compound-words.js53 placeHolder: 'placeholder',CODE