AI Slop Code Risk Monitor

mobxjs/mobx

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

Simple, scalable state management.

0.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for mobxjs/mobx, a TypeScript project with 28,220 GitHub stars. SynthScan examined 147,630 lines of code across 315 source files, recording 116 pattern matches distributed across 4 syntactic categories. The legacy adjusted pattern signal is 0.8 (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.8
Adjusted Signal
0.8
Raw Pattern Score
100%
Time Factor
2026-10-28
Last Push
28.2K
Stars
TypeScript
Language
147.6K
Lines of Code
315
Files
116
Pattern Hits
2026-10-31
Scan Date
0.01
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 3.3/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.7/100 · LOW

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

Agent Over-Engineering Ratio 2.5/100 · LOW

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

PR Review Velocity Impact 4.5/100 · LOW

Which changes need focused human review? 116 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 1LOW 113

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 116 distinct pattern matches across 4 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 Identifiers89 hits · 74 pts
SeverityFileLineSnippetContext
LOWdocs/reactions.md340function createSomeDisposableResource() {}CODE
LOW⚡…s/getting-started-assets/javascripts/JSXTransformer.js13926 function collectClosureIdentsAndTraverse(node, path, state) {CODE
LOW⚡…s/getting-started-assets/javascripts/JSXTransformer.js13936 function collectBlockIdentsAndTraverse(node, path, state) {CODE
LOW⚡…s/getting-started-assets/javascripts/JSXTransformer.js13946 function visitLocalClosureIdentifiers(node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js132 function createSourceCodeErrorMessage(code, e) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js3311 function scanUnicodeCodePointEscape() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js4527 function markerCreatePreserveWhitespace() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js5953 function parsePropertyMethodFunction(options) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6232 function parseObjectSpreadProperty() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6511 function parseSpreadOrAssignmentExpression() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6564 function parseLeftHandSideExpressionAllowCall() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6617 function parseLeftHandSideExpression() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6919 function parseConditionalExpression() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js6953 function reinterpretAsAssignmentBindingPattern(expr) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7004 function reinterpretAsDestructuredParameter(options, expr) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7047 function reinterpretAsCoverFormalsList(expressions) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7112 function parseArrowFunctionExpression(options, marker) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7148 function parseAssignmentExpression() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7355 function parseTypeParameterDeclaration() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7374 function parseTypeParameterInstantiation() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7462 function parseObjectTypeCallProperty(marker, isStatic) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7883 function parseTypeAnnotatableIdentifier(CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js7953 function parseVariableDeclarationList(kind) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js8017 function parseExportBatchSpecifier() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js8244 function parseImportDefaultSpecifier() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js8254 function parseImportNamespaceSpecifier() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js8447 function parseForVariableDeclaration() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js9001 function parseFunctionSourceElements() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js10445 function parseJSXExpressionContainer() {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js13215 function compareByOriginalPositions(CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js13260 function compareByGeneratedPositions(CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js13980 function visitLocalBlockIdentifiers(node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js14349 function getNextSyntacticCharOffset(char, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js14586 function getLexicalBindingMetadata(identName, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js14669 function enqueueNodeWithStartIndex(queue, node) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js14739 function injectTempVarDeclarations(state, index) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15235 function visitClassFunctionExpression(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15687 function visitSuperMemberExpression(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15799 function getDestructuredComponents(node, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15888 function visitStructuredAssignment(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15966 function visitFunctionBodyForStructuredParameter(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js15982 function renderDestructuredComponents(funcNode, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16129 function visitObjectLiteralShortNotation(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16197 function visitFunctionParamsWithRestParam(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16254 function visitFunctionBodyWithRestParam(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16366 function visitTaggedTemplateExpression(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16861 function visitInterfaceDeclaration(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16884 function visitFunctionParametricAnnotation(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16898 function visitFunctionReturnAnnotation(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16907 function visitOptionalFunctionParameterAnnotation(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16921 function visitTypeAnnotatedIdentifier(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js16930 function visitTypeAnnotatedObjectOrArrayPattern(traverse, node, path, state) {CODE
LOW…s/getting-started-assets/javascripts/JSXTransformer.js17081 function renderJSXExpressionContainer(traverse, object, isLast, path, state) {CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js197 function throwingComputedValueSetter() {CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js555 function observeObservableProperty(CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js799 function checkIfStateModificationsAreAllowed() {CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js1081 function getValueModeFromModifierFunc(func) {CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js1724 function setObservableObjectProperty(adm, propName, value) {CODE
LOW…/assets/getting-started-assets/javascripts/mobx.umd.js1933 function assertPropertyConfigurable(object, prop) {CODE
LOW…tarted-assets/javascripts/codemirror/lib/codemirror.js2134 function conflictingCollapsedRange(doc, lineNo, from, to, marker) {CODE
29 more matches not shown…
Over-Commented Block24 hits · 22 pts
SeverityFileLineSnippetContext
LOWdocs/custom-observables.md41 // - Callback for when this atom transitions from observed to unobserved.COMMENT
LOW…s/getting-started-assets/javascripts/JSXTransformer.js2261 // following conditions:COMMENT
LOW…s/getting-started-assets/javascripts/JSXTransformer.js11501 // length quantities we use in the source map spec, the first bit is the sign,COMMENT
LOW…s/getting-started-assets/javascripts/JSXTransformer.js11661 * @param aNeedle The element being searched for.COMMENT
LOW…s/getting-started-assets/javascripts/JSXTransformer.js11861 // are lazily instantiated, accessed via the `_generatedMappings` andCOMMENT
LOW…tarted-assets/javascripts/codemirror/lib/codemirror.js481 // One-char codes used for character types:COMMENT
LOW…tarted-assets/javascripts/codemirror/lib/codemirror.js3701 lineObj = getLine(cm.doc, pos.line)COMMENT
LOW…tarted-assets/javascripts/codemirror/lib/codemirror.js6241 // the scroll effect that the first few mouse wheel events have,COMMENT
LOW…tarted-assets/javascripts/codemirror/lib/codemirror.js8021 )COMMENT
LOW…mobx-react/__tests__/utils/killFinalizationRegistry.ts1// We want to be able to test reaction cleanup code that based on FinalizationRegistry & timers on the same runCOMMENT
LOWpackages/mobx-react/src/observerClass.ts121 // Happens with `<Suspend>` see #3492COMMENT
LOWpackages/mobx/__tests__/base/strict-mode.js121 mobx.configure({ enforceActions: "observed" })COMMENT
LOWpackages/mobx/src/types/observablemap.ts381 replace(values: IObservableMapInitialValues<K, V>): ObservableMap<K, V> {COMMENT
LOWpackages/mobx/src/core/observable.ts41COMMENT
LOWpackages/mobx/src/core/observable.ts201 queueForUnobservation(observable)COMMENT
LOWpackages/mobx-react-lite/__tests__/observer.test.tsx781 const element = React.createElement(ObserverTestComponent, { a: 1 })COMMENT
LOWpackages/mobx-react-lite/__tests__/observer.test.tsx801// return <span>{data.x}</span>COMMENT
LOWpackages/mobx-react-lite/__tests__/observer.test.tsx821// })COMMENT
LOWpackages/mobx-react-lite/__tests__/observer.test.tsx841// inc = () => this.counter++COMMENT
LOWpackages/mobx-react-lite/__tests__/observer.test.tsx861// })COMMENT
LOW…/__tests__/strictAndConcurrentModeUsingTimers.test.tsx61})COMMENT
LOW…/__tests__/strictAndConcurrentModeUsingTimers.test.tsx121COMMENT
LOW…react-lite/__tests__/utils/killFinalizationRegistry.ts1// We want to be able to test reaction cleanup code that based on FinalizationRegistry & timers on the same runCOMMENT
LOWpackages/mobx-react-lite/src/useObserver.ts21}COMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICAL…getting-started-assets/javascripts/jquery-2.1.4.min.js3752 n.each(n.expr.match.bool.source.match(/\w+/g), function(a, b) {CODE
CRITICAL…tarted-assets/javascripts/codemirror/lib/codemirror.js12669 return this.cm.display.wrapper.ownerDocument.getSelection()CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/mobx-react/__tests__/finalizationRegistry.tsx16 // There is no profound reason why that's the case, if you know a simpler or more robust setupCOMMENT