AI Slop Code RIsk Monitor

motiondivision/motion

A modern animation library for React and JavaScript

4.1 Low pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for motiondivision/motion, a TypeScript project with 33,944 GitHub stars. SynthScan examined 188,921 lines of code across 1829 source files, recording 503 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 4.1 (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.

4.1
Adjusted Signal
4.1
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
33.9K
Stars
TypeScript
Language
188.9K
Lines of Code
1.8K
Files
503
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 18.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.1/100 · LOW

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

Agent Over-Engineering Ratio 0.9/100 · LOW

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

PR Review Velocity Impact 12.5/100 · LOW

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

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 503 distinct pattern matches across 6 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.

Structural Annotation Overuse430 hits · 694 pts
SeverityFileLineSnippetContext
LOWplans/024-hover-double-start-during-press.md106### Step 1: Write the failing testCOMMENT
LOWplans/024-hover-double-start-during-press.md121### Step 2: Guard re-entry while a hover is activeCOMMENT
LOWplans/024-hover-double-start-during-press.md143### Step 3: LintCOMMENT
LOWplans/008-correct-box-shadow-single-parse.md85### Step 1: Export `buildTransformer` from the complex value moduleCOMMENT
LOWplans/008-correct-box-shadow-single-parse.md91### Step 2: Refactor `correctBoxShadow` to a single parseCOMMENT
LOWplans/008-correct-box-shadow-single-parse.md117### Step 3: Add one regression testCOMMENT
LOWplans/008-correct-box-shadow-single-parse.md123### Step 4: Full gatesCOMMENT
LOWplans/033-findspring-closed-form.md107### Step 1: Pin current behavior with a tolerance-based equivalence testCOMMENT
LOWplans/033-findspring-closed-form.md139### Step 2: Replace the solverCOMMENT
LOWplans/033-findspring-closed-form.md197### Step 3: Handle the exact-string toString testCOMMENT
LOWplans/033-findspring-closed-form.md205### Step 4: Full verification + size measurementCOMMENT
LOWplans/023-press-keyboard-listener-lifecycle.md112### Step 1: Write the failing testsCOMMENT
LOWplans/023-press-keyboard-listener-lifecycle.md122### Step 2: Remove keyup/blur listeners once the press resolvesCOMMENT
LOWplans/023-press-keyboard-listener-lifecycle.md158### Step 3: Register the focus listener with the gesture's optionsCOMMENT
LOWplans/026-inview-feature-stale-once.md96### Step 1: Write the failing testCOMMENT
LOWplans/026-inview-feature-stale-once.md111### Step 2: Read `once` fresh in the callbackCOMMENT
LOWplans/026-inview-feature-stale-once.md133### Step 3: Regression sweepCOMMENT
LOWplans/002-view-transition-target-resolution.md97### Step 1: Investigate and write the design note (no code yet)COMMENT
LOWplans/002-view-transition-target-resolution.md107### Step 2: Implement name assignment and resolutionCOMMENT
LOWplans/002-view-transition-target-resolution.md118### Step 3: Unit testsCOMMENT
LOWplans/002-view-transition-target-resolution.md124### Step 4: Playwright E2ECOMMENT
LOWplans/002-view-transition-target-resolution.md136### Step 5: Remove the TODOs and full gatesCOMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md108### Step 1: Extract the shared projection tree into `layout/layout-tree.ts`COMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md138### Step 2: Define `DragOptions` and the options adapterCOMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md192### Step 3: Implement `drag()`COMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md251### Step 4: Unit tests for the pure partsCOMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md267### Step 5: Cypress HTML fixtures + specsCOMMENT
LOWplans/020-vanilla-drag-on-shared-projection-tree.md281### Step 6: Full gateCOMMENT
LOWplans/007-ci-lint-gate-and-monorepo-lint-coverage.md73### Step 1: Add lint scriptsCOMMENT
LOWplans/007-ci-lint-gate-and-monorepo-lint-coverage.md83### Step 2: Fix surfaced violationsCOMMENT
LOWplans/007-ci-lint-gate-and-monorepo-lint-coverage.md96### Step 3: Add the CI lint jobCOMMENT
LOWplans/007-ci-lint-gate-and-monorepo-lint-coverage.md123### Step 4: Full-repo lint passCOMMENT
LOWplans/034-move-inview-to-motion-dom.md112### Step 1: Create the motion-dom module (verbatim move)COMMENT
LOWplans/034-move-inview-to-motion-dom.md142### Step 2: Unit-test the moved function in motion-domCOMMENT
LOW⚡plans/034-move-inview-to-motion-dom.md157### Step 3: Repoint framer-motion and delete the old fileCOMMENT
LOW⚡plans/034-move-inview-to-motion-dom.md165### Step 4: Confirm the public surface is intactCOMMENT
LOW⚡plans/034-move-inview-to-motion-dom.md172### Step 5: Dedupe the threshold table in the React featureCOMMENT
LOW⚡plans/034-move-inview-to-motion-dom.md178### Step 6: Full gatesCOMMENT
LOWplans/028-frameloop-same-step-cancel.md114### Step 1: Record baselinesCOMMENT
LOWplans/028-frameloop-same-step-cancel.md124### Step 2: Write the failing testsCOMMENT
LOWplans/028-frameloop-same-step-cancel.md162### Step 3: Fix `cancel`COMMENT
LOWplans/028-frameloop-same-step-cancel.md182### Step 4: Blast-radius verificationCOMMENT
LOW⚡plans/032-spring-complex-value-nan-investigation.md80### Step 1: Obtain the reproductionCOMMENT
LOW⚡plans/032-spring-complex-value-nan-investigation.md86### Step 2: Reproduce at the lowest layer that failsCOMMENT
LOW⚡plans/032-spring-complex-value-nan-investigation.md96### Step 3: DiagnoseCOMMENT
LOW⚡plans/032-spring-complex-value-nan-investigation.md100### Step 4: FixCOMMENT
LOW⚡plans/032-spring-complex-value-nan-investigation.md106### Step 5: E2E confirmation (if the repro was unit-level)COMMENT
LOWplans/027-frameloop-exception-recovery.md219### Step 1: Record the baselineCOMMENT
LOWplans/027-frameloop-exception-recovery.md227### Step 2: Write the failing testsCOMMENT
LOWplans/027-frameloop-exception-recovery.md288### Step 3: Fix `render-step.ts` — step-level try/finallyCOMMENT
LOWplans/027-frameloop-exception-recovery.md329### Step 4: Fix `batcher.ts` — batch-level try/finally + flag gatingCOMMENT
LOWplans/027-frameloop-exception-recovery.md384### Step 5: Full verificationCOMMENT
LOWplans/037-scale-correctors-tree-shake-leak.md165### Step 1: Empty the eager registryCOMMENT
LOWplans/037-scale-correctors-tree-shake-leak.md176### Step 2: Create `default-scale-correctors.ts`COMMENT
LOWplans/037-scale-correctors-tree-shake-leak.md196### Step 3: Register from the projection nodeCOMMENT
LOWplans/037-scale-correctors-tree-shake-leak.md212### Step 4: Prove the leak is gone and behavior is intactCOMMENT
LOWplans/019-port-drag-pan-engine-to-motion-dom.md117### Step 1: Move the leaf helpers into motion-domCOMMENT
LOW⚡plans/019-port-drag-pan-engine-to-motion-dom.md143### Step 2: Move constraints.tsCOMMENT
LOW⚡plans/019-port-drag-pan-engine-to-motion-dom.md149### Step 3: Move PanSessionCOMMENT
LOW⚡plans/019-port-drag-pan-engine-to-motion-dom.md155### Step 4: Move VisualElementDragControls with the options-resolver seamCOMMENT
370 more matches not shown…
Hyper-Verbose Identifiers34 hits · 34 pts
SeverityFileLineSnippetContext
LOWtests/react/scroll-view-timeline-parity.spec.ts87 async function findMismatchesWithResizes(CODE
LOW…otion-dom/src/render/svg/utils/scrape-motion-values.ts7export function scrapeMotionValuesFromProps(CODE
LOWpackages/motion-dom/src/render/utils/motion-values.ts10export function updateMotionValuesFromProps(CODE
LOWpackages/motion-dom/src/render/utils/setters.ts28function resolveFinalValueInKeyframes(CODE
LOW…tion-dom/src/render/html/utils/scrape-motion-values.ts6export function scrapeMotionValuesFromProps(CODE
LOW…ges/motion-dom/src/animation/utils/notify-inspector.ts77export function notifyLayoutAnimationStart(CODE
LOW…n-dom/src/animation/keyframes/utils/unit-conversion.ts37export function removeNonTranslationalTransform(visualElement: WithRender) {CODE
LOW…/src/animation/keyframes/utils/make-none-animatable.ts14export function makeNoneKeyframesAnimatable(CODE
LOW…ion-dom/src/animation/__tests__/GroupAnimation.test.ts5function createTestAnimationControls(CODE
LOW…dom/src/gestures/press/utils/is-keyboard-accessible.ts13export function isElementKeyboardAccessible(element: Element) {CODE
LOWpackages/motion-dom/src/view/utils/assign-names.ts78export function assignViewTransitionNames(CODE
LOWpackages/motion-dom/src/view/utils/assign-names.ts177export function releaseViewTransitionNames(CODE
LOWpackages/motion-dom/src/view/utils/get-layer-info.ts1export function getViewAnimationLayerInfo(pseudoElement: string) {CODE
LOWpackages/motion-dom/src/resize/handle-window.ts7function createWindowResizeHandler() {CODE
LOW…tion-dom/src/projection/node/create-projection-node.ts122function cancelTreeOptimisedTransformAnimations(CODE
LOW…tion-dom/src/projection/node/create-projection-node.ts2395function ensureDraggedNodesSnapshotted(node: IProjectionNode) {CODE
LOW…tion-dom/src/projection/node/create-projection-node.ts2507function shouldAnimatePositionOnly(CODE
LOW…kages/framer-motion/cypress/integration/drag-nested.ts176function testNestedDragConstraints(CODE
LOW…kages/framer-motion/cypress/integration/drag-nested.ts286function testNestedDragConstraintsAndAnimation(CODE
LOW…ages/framer-motion/src/context/MotionContext/create.ts22function variantLabelsAsDependency(CODE
LOW…-motion/src/render/dom/scroll/utils/offset-to-range.ts46export function offsetToViewTimelineRange(CODE
LOW…r-motion/src/render/dom/scroll/__tests__/index.test.ts534 function createOverscrollContainer(style: Partial<CSSStyleDeclaration>) {CODE
LOW…/framer-motion/src/animation/optimized-appear/start.ts37function resumeSuspendedAnimations() {CODE
LOW…/framer-motion/src/animation/optimized-appear/start.ts45export function startOptimizedAppearAnimation(CODE
LOW…ramer-motion/src/animation/optimized-appear/handoff.ts5export function handoffOptimizedAppearAnimation(CODE
LOWpackages/framer-motion/src/animation/sequence/create.ts43export function createAnimationsFromSequence(CODE
LOW…ages/framer-motion/src/utils/use-instant-transition.ts43export function disableInstantTransitions() {CODE
LOWpackages/framer-motion/src/motion/index.tsx205function getProjectionFunctionality(props: MotionProps) {CODE
LOW…kages/framer-motion/src/motion/features/definitions.ts55export function getInitializedFeatureDefinitions(): Partial<FeatureDefinitions> {CODE
LOW…-motion/src/gestures/drag/VisualElementDragControls.ts846export function expectsResolvedDragConstraints({CODE
LOW…s/framer-motion/src/gestures/drag/utils/constraints.ts62export function calcRelativeAxisConstraints(CODE
LOW…s/framer-motion/src/gestures/drag/utils/constraints.ts93export function calcViewportAxisConstraints(CODE
LOW…s/framer-motion/src/gestures/drag/utils/constraints.ts148export function calcProgressWithinConstraints(CODE
LOW…motion/src/projection/use-instant-layout-transition.ts3export function useInstantLayoutTransition(): (CODE
Over-Commented Block34 hits · 34 pts
SeverityFileLineSnippetContext
LOWpackages/motion/src/react.ts1// Re-export everything from framer-motion.COMMENT
LOW…/src/projection/geometry/__tests__/delta-apply.test.ts81// }COMMENT
LOW…/src/projection/geometry/__tests__/delta-apply.test.ts101// })COMMENT
LOWpackages/framer-motion/cypress/plugins/index.js1/// <reference types="cypress" />COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts121})COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts141// height: 50,COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts161// .get("#item-child")COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts181// width: 600,COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts201// .should(([$box]: any) => {COMMENT
LOW…ypress/integration/layout-shared-lightbox-crossfade.ts221// })COMMENT
LOW…ges/framer-motion/cypress/integration/layout-shared.ts581 // width: 100,COMMENT
LOWpackages/framer-motion/cypress/integration/drag.ts161 // .trigger("pointermove", 200, 10, { force: true })COMMENT
LOWpackages/framer-motion/cypress/integration/drag.ts541 })COMMENT
LOWpackages/framer-motion/cypress/integration/drag-svg.ts81 })COMMENT
LOWpackages/framer-motion/cypress/integration/drag-svg.ts101 // const { left, top } = draggable.getBoundingClientRect()COMMENT
LOWpackages/framer-motion/cypress/integration/drag-svg.ts261 // .wait(50)COMMENT
LOWpackages/framer-motion/cypress/integration/drag-svg.ts281 // .trigger("pointermove", 50, 200, { force: true })COMMENT
LOW…tion/cypress/integration/use-scroll-target-late-ref.ts1describe("useScroll with target ref hydrated after useScroll's own effects", () => {COMMENT
LOW…er-motion/cypress/integration/layout-percent-x-flex.ts21 // animate={{ x: 0 }}, latestValues.x = "100%"COMMENT
LOWpackages/framer-motion/cypress/support/commands.js1// ***********************************************COMMENT
LOW…on/src/animation/animators/waapi/__tests__/polyfill.js1// Copyright 2014 Google Inc. All rights reserved.COMMENT
LOW.github/workflows/claude.yml41 actions: readCOMMENT
LOWdev/next/next-env.d.ts1/// <reference types="next" />COMMENT
LOWdev/html/public/benchmarks/warm-start-gsap.html61 gsap.to(box, {COMMENT
LOW…ublic/projection/shared-promote-new-mix-interrupt.html81 // matchVisibility(newBox, "visible")COMMENT
LOW…ublic/projection/shared-promote-new-mix-interrupt.html101 // matchVisibility(box, "visible")COMMENT
LOWdev/html/public/projection/animate-relative.html81 parent.classList.add("b")COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html301 // openControls.time = 0.5COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html321 // const midImage = {COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html341 // const actualModalTitle = modalTitleContainer.getBoundingClientRect()COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html361 // top: actualModalImage.top,COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html381 // // Check at t=1 (end)COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html401 // width: endModalImageContainer.width,COMMENT
LOW…lic/animate-layout/shared-element-nested-children.html421 // right: finalCardContentBox.right,COMMENT
Verbosity Indicators2 hits · 4 pts
SeverityFileLineSnippetContext
LOW⚡…nts/AnimatePresence/__tests__/AnimatePresence.test.tsx1891 // Step 1: trigger exit. Child still renders motion.div, soCOMMENT
LOW⚡…nts/AnimatePresence/__tests__/AnimatePresence.test.tsx1896 // Step 2: child internally re-renders without the motionCOMMENT
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/motion-dom/src/node/types.ts688 * See {@link https://motion.dev/docs/react-motion-component#dragtransition | Inertia} for all properties you can usCOMMENT
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWdev/react/src/examples/Layout-Projection-scale-size.tsx5It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layCODE
LOW…eact/src/examples/Layout-Projection-scale-position.tsx5It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layCODE