AI Slop Code Risk Monitor

TanStack/virtual

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

🤖 Headless UI for Virtualizing Large Element Lists in JS/TS, React, Solid, Vue and Svelte

3.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for TanStack/virtual, a TypeScript project with 7,178 GitHub stars. SynthScan examined 72,634 lines of code across 729 source files, recording 122 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 3.6 (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.

3.6
Adjusted Signal
3.6
Raw Pattern Score
100%
Time Factor
2026-10-30
Last Push
7.2K
Stars
TypeScript
Language
72.6K
Lines of Code
729
Files
122
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 7.7/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 10.5/100 · LOW

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

PR Review Velocity Impact 14.9/100 · LOW

Which changes need focused human review? 122 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 56LOW 66

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

Decorative Section Separators46 hits · 144 pts
SeverityFileLineSnippetContext
MEDIUMpackages/virtual-core/tests/range.test.ts9// ─── defaultRangeExtractor ───────────────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/range.test.ts132// ─── Lazy fast path (lanes === 1) edge cases ─────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-deferral.test.ts14// ─── iOS momentum-safe scroll adjustments ───────────────────────────────────COMMENT
MEDIUM⚡packages/virtual-core/tests/ios-deferral.test.ts383// ─── #1307: orderings the hold has to get right, and ones to keep ───────────COMMENT
MEDIUM⚡packages/virtual-core/tests/ios-deferral.test.ts383// ─── #1307: orderings the hold has to get right, and ones to keep ───────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-deferral.test.ts645// ─── Phase 1: touch event distinction ────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-deferral.test.ts1082// ─── Phase 2a: subpixel scrollTop reconciliation ─────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-deferral.test.ts1154// ─── Phase 2b: scrollTopMax elastic-overscroll clamp ─────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/index.test.ts257// ─── setOptions behavioral contract ──────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/index.test.ts489// ─── Public-exports lockdown ─────────────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/measurement.test.ts8// ─── resizeItem / measurement cache invalidation ─────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/measurement.test.ts267// ─── elementsCache leak: disconnected node cleanup ───────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/measurement.test.ts618// ─── pending min pointer for measure storms ──────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/measurement.test.ts735// ─── ResizeObserver batching ─────────────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts25// ─── Exp 1: Cold-mount cost — getMeasurements with no measured items ─────────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts61// ─── Layer 1: Map clone bug — resizeItem under measure storm ─────────────────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts175// ─── Layer 2: setOptions per render ──────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts203// ─── Scroll loop: per-scroll-frame cost (calculateRange + memo machinery) ─────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts230// ─── Layer 6: defaultRangeExtractor ──────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/bench.bench.ts247// ─── Multi-lane: cold-mount lane assignment (getFurthestMeasurement) ──────────COMMENT
MEDIUMpackages/virtual-core/tests/dom-observers.test.ts11// ─── elementScroll / windowScroll public exports ─────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/dom-observers.test.ts79// ─── observeElementOffset / observeWindowOffset ──────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/dom-observers.test.ts158// ─── cleanup resets the scroll flags ─────────────────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1028// ─── a prepend must not strand a travelling smooth scroll ────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1137// ─── #1257: paddingEnd must not make scrollToIndex(last) overshoot the last item ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1137// ─── #1257: paddingEnd must not make scrollToIndex(last) overshoot the last item ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1198// ─── #1001: getMaxScrollOffset() preserves lane-max for multi-lane layouts ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1198// ─── #1001: getMaxScrollOffset() preserves lane-max for multi-lane layouts ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1255// ─── #1257: paddingEnd=0 is a no-op ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1255// ─── #1257: paddingEnd=0 is a no-op ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1300// ─── #1257: scrollPaddingEnd still applies to the last item ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1300// ─── #1257: scrollPaddingEnd still applies to the last item ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1360// ─── #1257: scrollToEnd() still reaches the DOM bottom ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/scroll-commands.test.ts1360// ─── #1257: scrollToEnd() still reaches the DOM bottom ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-fling-wait.test.ts5// ─── #1307 step 3: iOS 27, where a fling carries on past a write ────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-fling-wait.test.ts5// ─── #1307 step 3: iOS 27, where a fling carries on past a write ────────────COMMENT
MEDIUMpackages/virtual-core/tests/ios-fling-wait.test.ts538// ─── Android: a fling carries on from a write ───────────────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/adjustment.test.ts157// ─── scroll direction vs. self-write read-backs ─────────────────────────────COMMENT
MEDIUM⚡packages/virtual-core/tests/adjustment.test.ts439// ─── #1218: viewport-spanning item growth must not drift the viewport ─────────COMMENT
MEDIUM⚡packages/virtual-core/tests/adjustment.test.ts439// ─── #1218: viewport-spanning item growth must not drift the viewport ─────────COMMENT
MEDIUMpackages/virtual-core/tests/anchor-end.test.ts8// ─── end anchoring / chat-style reverse virtualization ──────────────────────COMMENT
MEDIUMpackages/virtual-core/tests/anchor-end.test.ts428// ─── #1229: negative tracked scrollOffset must not survive compensation ─────COMMENT
MEDIUMpackages/virtual-core/tests/anchor-end.test.ts428// ─── #1229: negative tracked scrollOffset must not survive compensation ─────COMMENT
MEDIUMpackages/virtual-core/tests/anchor-end.test.ts536// ─── #1258: compensation write clamped by a not-yet-grown sizer ─────────────COMMENT
MEDIUMpackages/virtual-core/tests/anchor-end.test.ts536// ─── #1258: compensation write clamped by a not-yet-grown sizer ─────────────COMMENT
MEDIUMpackages/virtual-core/src/index.ts1698 // ─── Fast path: single-lane lazy materialization ────────────────────COMMENT
Over-Commented Block34 hits · 34 pts
SeverityFileLineSnippetContext
LOWexamples/svelte/infinite-scroll/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWexamples/svelte/dynamic/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWexamples/svelte/sticky/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWexamples/svelte/fixed/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWexamples/svelte/table/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWexamples/svelte/smooth-scroll/src/vite-env.d.ts1/// <reference types="svelte" />COMMENT
LOWbenchmarks/src/lib/harness.ts241 ) {COMMENT
LOWpackages/marko-virtual/e2e/app/playwright.config.ts1import { defineConfig } from '@playwright/test'COMMENT
LOWpackages/marko-virtual/e2e/app/playwright.config.ts21 // are sensitive to machine load; one worker keeps a failure meaningful. The wholeCOMMENT
LOW…marko-virtual/e2e/app/src/routes/api/reply/+handler.ts1// The chat fixtures POST to an absolute /api/reply, so the streaming handler isCOMMENT
LOW…s/marko-virtual/src/tags/window-virtualizer/options.ts41 // Two instances measuring the SAME element (a grid cell) need distinct attributes.COMMENT
LOW…s/marko-virtual/src/tags/window-virtualizer/options.ts61 isRtl?: booleanCOMMENT
LOWpackages/marko-virtual/src/tags/virtualizer/options.ts41 initialMeasurementsCache?: Array<VirtualItem>COMMENT
LOWpackages/marko-virtual/src/tags/virtualizer/options.ts61 // Use the native scrollend event instead of the isScrollingResetDelay timer.COMMENT
LOWpackages/virtual-core/tests/ios-deferral.test.ts481 h.scroll(true)COMMENT
LOWpackages/virtual-core/tests/scroll-commands.test.ts1141// scroll past the rendered end of the last item. The fix usesCOMMENT
LOWpackages/virtual-core/tests/lane-equivalence.test.ts1// Differential ("oracle") test for the multi-lane lane-assignment optimization.COMMENT
LOWpackages/virtual-core/tests/scroll-trace.test.ts1import { describe, expect, test } from 'vitest'COMMENT
LOWpackages/virtual-core/tests/scroll-trace.test.ts21// that changes behaviour updates it (`vitest -u`), and the snapshot diff showsCOMMENT
LOWpackages/virtual-core/tests/adjustment.test.ts341})COMMENT
LOWpackages/virtual-core/tests/prepend-hold.test.ts1import { expect, test } from 'vitest'COMMENT
LOWpackages/virtual-core/src/scroll-classifier.ts1import { approxEqual } from './utils'COMMENT
LOWpackages/virtual-core/src/scroll-classifier.ts101 }COMMENT
LOWpackages/virtual-core/src/scroll-classifier.ts161 // are the fling's events.COMMENT
LOWpackages/virtual-core/src/index.ts521 private _holdOffset = 0COMMENT
LOWpackages/virtual-core/src/index.ts581 this._writeAwaitingCommand()COMMENT
LOWpackages/virtual-core/src/index.ts601 // further by the time it reports.COMMENT
LOWpackages/virtual-core/src/index.ts881 if (edgeKeysChanged) {COMMENT
LOWpackages/virtual-core/src/index.ts981 // Eagerly carry the intended target in `scrollOffset` so callers thatCOMMENT
LOWpackages/virtual-core/src/index.ts1041 // The debounce cancelled above is the only thing that writes `isScrolling`COMMENT
LOWpackages/virtual-core/src/index.ts2101 )COMMENT
LOWpackages/virtual-core/src/index.ts2501 // frame and the fling carries on along its own path (#1307, step 3);COMMENT
LOWpackages/virtual-core/src/index.ts2681 // somewhere on the way) and without a command, so a write the browserCOMMENT
LOWpackages/virtual-core/src/ios-gesture.ts61// a finger drags the content (one resting on it does not stop the write)COMMENT
Modern AI Meta-Vocabulary9 hits · 27 pts
SeverityFileLineSnippetContext
MEDIUMexamples/angular/infinite-scroll/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/dynamic/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/variable/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/sticky/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/fixed/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/table/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/window/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/padding/README.md9## Code scaffoldingCOMMENT
MEDIUMexamples/angular/smooth-scroll/README.md9## Code scaffoldingCOMMENT
Verbosity Indicators8 hits · 18 pts
SeverityFileLineSnippetContext
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts13 // Step 1: Expand A → should grow to ~160pxCOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts17 // Step 2: Collapse A → back to ~36pxCOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts21 // Step 3: Delete ACOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts25 // Step 4: Expand B → should grow to ~160pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts13 // Step 1: Expand A → should grow to ~160pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts17 // Step 2: Collapse A → back to ~36pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts21 // Step 3: Delete ACOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts25 // Step 4: Expand B → should grow to ~160pxCOMMENT
Structural Annotation Overuse8 hits · 18 pts
SeverityFileLineSnippetContext
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts13 // Step 1: Expand A → should grow to ~160pxCOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts17 // Step 2: Collapse A → back to ~36pxCOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts21 // Step 3: Delete ACOMMENT
LOW⚡…s/angular-virtual/e2e/app/test/measure-element.spec.ts25 // Step 4: Expand B → should grow to ~160pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts13 // Step 1: Expand A → should grow to ~160pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts17 // Step 2: Collapse A → back to ~36pxCOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts21 // Step 3: Delete ACOMMENT
LOW⚡…ges/react-virtual/e2e/app/test/measure-element.spec.ts25 // Step 4: Expand B → should grow to ~160pxCOMMENT
Hyper-Verbose Identifiers16 hits · 17 pts
SeverityFileLineSnippetContext
LOWexamples/react/dynamic/src/main.tsx292function RowVirtualizerExperimental() {CODE
LOWexamples/react/variable/src/main.tsx107function ColumnVirtualizerVariable({ columns }: { columns: Array<number> }) {CODE
LOWexamples/react/variable/src/main.tsx236function MasonryVerticalVirtualizerVariable({ rows }: { rows: Array<number> }) {CODE
LOWexamples/react/variable/src/main.tsx287function MasonryHorizontalVirtualizerVariable({CODE
LOWscripts/verify-links.ts51function fileExistsForMarkdownLink(CODE
LOWpackages/angular-virtual/src/index.ts51function injectScheduleDomFlushViaAppRefTick() {CODE
LOW⚡packages/virtual-core/tests/ios-deferral.test.ts392function landedIndexScrollWithResizeAbove(ios = true) {CODE
LOWpackages/virtual-core/tests/ios-deferral.test.ts647function makeIOSVirtualizerWithRealEl(CODE
LOWpackages/virtual-core/tests/ios-deferral.test.ts958function makeIOSVirtualizerWithSwappableEl(CODE
LOWpackages/virtual-core/tests/measurement.test.ts1001function createDeferredVirtualizer(el: HTMLDivElement) {CODE
LOWpackages/virtual-core/tests/scroll-commands.test.ts1037function createSmoothPrependVirtualizer() {CODE
LOWpackages/virtual-core/tests/adjustment.test.ts169function createAdjustmentVirtualizer({CODE
LOW⚡packages/virtual-core/tests/adjustment.test.ts444function makeAdjustmentVirtualizer(scrollTop: number) {CODE
LOWpackages/virtual-core/src/index.ts2760function findNearestBinarySearchFlat(CODE
LOWpackages/virtual-core/src/lazy-measurements.ts14export function createLazyMeasurementsView(CODE
LOWpackages/react-virtual/e2e/app/test/chat.spec.ts64async function waitForFirstVisibleAtOffset(page: Page, scrollTop: number) {CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/marko-virtual/e2e/app/e2e/ssr-fetch.spec.ts10// contiguous chunks, so emails are the robust view-source probe for serialized data.COMMENT