AI Slop Code Risk Monitor

facebook/memlab

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

A framework for finding JavaScript memory leaks and analyzing heap snapshots

1.8 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for facebook/memlab, a TypeScript project with 5,079 GitHub stars. SynthScan examined 166,781 lines of code across 750 source files, recording 288 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.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.

1.8
Adjusted Signal
1.8
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
5.1K
Stars
TypeScript
Language
166.8K
Lines of Code
750
Files
288
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 8.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 3.7/100 · LOW

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

PR Review Velocity Impact 8.4/100 · LOW

Which changes need focused human review? 288 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 3LOW 285

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

Over-Commented Block140 hits · 129 pts
SeverityFileLineSnippetContext
LOWwebsite/src/components/TerminalReplay/lib/Term.js561 // var term = Terminal.focus;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2001 break;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2041 // CSI Pm i Media Copy (MC).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2061 // this.disableModifiers(this.params);COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2081 break;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2101 // if (this.postfix === ' ') {COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2121 // this.setAttrInRectangle(this.params);COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2141 // case 't':COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2161 // this.restoreCursor(this.params);COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2181 // CSI Pc; Pt; Pl; Pb; Pr$ xCOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2201 // CSI Pm ' {COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js2221 // if (this.postfix === ' ') {COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3041// Ps = 2 2 -> Normal (neither bold nor faint).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3061// Ps = 4 6 -> Set background color to Cyan.COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3081// Ps = 1 0 4 -> Set background color to Blue.COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3221// Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSICOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3441// CSI Ps c Send Device Attributes (Primary DA).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3461// Ps = 0 or omitted -> request the terminal's identificationCOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3541 this.x = this.cols - 1;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3561// Ps = 9 -> Send Mouse X & Y on button press. See the sec-COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3581// Ps = 6 6 -> Application keypad (DECNKM).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3601// enables the altSendsEscape resource).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3761// Ps = 4 -> Jump (Fast) Scroll (DECSCLM).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3781// compile-time option).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js3801// Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypadCOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4041 this.tabs = {};COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4061// Set or reset resource-values used by xterm to decide whetherCOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4081// Ps = 1 -> modifyCursorKeys.COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4121};COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4141// as in the ANSI DECRQM.COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4161// Ps = 0 -> Clear all LEDS (default).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4221COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4241// Ps = 3 ; x ; y -> Move window to [x, y].COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4261// Ps = 1 4 -> Report xterm window in pixels. Result is CSICOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4281 ;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4301// cussion of "Title Modes")COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4321 ;COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4341// rectangle is disabled. Filter rectangles are always treatedCOMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4401// Enable Locator Reporting (DECELR).COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4441 // this.maxRange();COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4461// CSI Pt; Pl; Pb; Pr$ {COMMENT
LOWwebsite/src/components/TerminalReplay/lib/Term.js4481// -> CSI Pe ; Pb ; Pr ; Pc ; Pp & wCOMMENT
LOWwebsite/src/lib/ContainerAnimation.js1//COMMENT
LOWpackages/core/src/paths/TraceFinder.ts161 //COMMENT
LOWpackages/core/src/lib/Config.ts361 this.interceptScript = false;COMMENT
LOWpackages/core/src/lib/Config.ts381 // TF/IDF maximum document frequencyCOMMENT
LOWpackages/core/src/lib/Config.ts401 // Information saved in this map will beCOMMENT
LOWpackages/mcp-server/scripts/build-dist.sh1#!/bin/bashCOMMENT
LOWpackages/mcp-server/src/run-manifest.ts201 if (cyclesPerRung != null && cyclesPerRung.length !== paths.length) {COMMENT
LOWpackages/mcp-server/src/utils.ts101COMMENT
LOWpackages/mcp-server/src/snapshot-index.ts201 if (parsed.sourceMtimeMs !== Math.round(stat.mtimeMs)) return null;COMMENT
LOWpackages/mcp-server/src/tools/round-audit.ts341 status: 'info',COMMENT
LOWpackages/mcp-server/src/tools/snapshot-summary.ts81 edgeCount++;COMMENT
LOWpackages/mcp-server/src/tools/sequence-analysis.ts321 // Reuse a snapshot that is already resident rather than re-parsing it.COMMENT
LOWpackages/mcp-server/src/tools/sequence-analysis.ts661 // the browser MCP's capture_numeric_value): that mode emits one graphCOMMENT
LOWpackages/mcp-server/src/tools/sequence-analysis.ts761 // separates them is a rung captured after the app settles, and it isCOMMENT
LOWpackages/mcp-server/src/tools/rate-model.ts241 ],COMMENT
LOWpackages/mcp-server/src/tools/island-doors.ts341COMMENT
LOWpackages/mcp-server/src/tools/prune-run.ts81 return gzipAvailable;COMMENT
LOWpackages/mcp-server/src/tools/eval.ts261 truncated: true,COMMENT
80 more matches not shown…
Hyper-Verbose Identifiers123 hits · 124 pts
SeverityFileLineSnippetContext
LOW…/core/src/trace-cluster/MultiIterationSeqClustering.ts142function positiveIntOrDefaultValue(v: AnyValue, d: number): number {CODE
LOWpackages/core/src/trace-cluster/ClusterUtilsHelper.ts464 function getSimilarityByTraceElementList(CODE
LOWpackages/core/src/lib/Serializer.ts121function JSONifyDetachedHTMLElement(CODE
LOWpackages/core/src/lib/Serializer.ts232function JSONifyFiberNodeReturnTrace(CODE
LOWpackages/core/src/lib/Serializer.ts774function summarizeUnboundedObjects(CODE
LOWpackages/core/src/lib/Serializer.ts795function summarizeUnboundedObjectsToCSV(CODE
LOWpackages/core/src/lib/HeapParser.ts51async function loadSnapshotMetaDataFromFile(CODE
LOWpackages/core/src/lib/Utils.ts447function iterateDescendantFiberNodes(CODE
LOWpackages/core/src/lib/Utils.ts487function getConditionalDominatorIds(CODE
LOWpackages/core/src/lib/Utils.ts768async function getSnapshotNodeIdsFromFile(CODE
LOWpackages/core/src/lib/Utils.ts1277function extractHTMLElementNodeInfo(node: IHeapNode): string {CODE
LOWpackages/core/src/lib/Utils.ts1297function getSnapshotSequenceFilePath(): string {CODE
LOWpackages/core/src/lib/Utils.ts1389function pathHasNodeOrEdgeWithName(CODE
LOWpackages/core/src/lib/Utils.ts1572function camelCaseToReadableString(CODE
LOWpackages/core/src/lib/Utils.ts1641function getSnapshotFilesFromTabsOrder(options: AnyOptions = {}): string[] {CODE
LOWpackages/core/src/lib/Utils.ts1737function getSnapshotDirForAnalysis(): string {CODE
LOWpackages/core/src/lib/Utils.ts1745function getSingleSnapshotFileForAnalysis(): string {CODE
LOWpackages/core/src/lib/Utils.ts1811function getSnapshotFilePathWithTabType(CODE
LOWpackages/core/src/lib/Utils.ts2219function isNodeDominatedByDeletionsArray(node: IHeapNode): boolean {CODE
LOWpackages/core/src/lib/Utils.ts2295function aggregateDominatorMetrics(CODE
LOWpackages/core/src/lib/Utils.ts2366function tryToMutePuppeteerWarning() {CODE
LOWpackages/core/src/lib/Utils.ts2408function convertCLIArgsToReadableCommand(args: string[]): string {CODE
LOWpackages/core/src/lib/HeapAnonymizer.ts477function collectUnclassifiedLabelFamilies(CODE
LOWpackages/core/src/lib/HeapAnonymizer.ts916export async function anonymizeHeapSnapshotFile(CODE
LOW…ib/trace-filters/rules/FilterInternalNodeTrace.rule.ts39function internalNodeRetainsDetachedElement(path: LeakTracePathItem): boolean {CODE
LOW…filters/rules/FilterCppRootsToDetachedDOMTrace.rule.ts37function hasCppRootsToDetachedDOMNode(path: LeakTracePathItem): boolean {CODE
LOW…ters/rules/FilterAttachedDOMToDetachedDOMTrace.rule.ts39function isAttachedDOMToDetachedDOMChain(path: LeakTracePathItem): boolean {CODE
LOW…lib/trace-filters/rules/FilterStyleEngineTrace.rule.ts38function styleEngineRetainsDetachedElement(path: LeakTracePathItem): boolean {CODE
LOW…/lib/trace-filters/rules/FilterShadowRootTrace.rule.ts38function shadowRootRetainsDetachedElement(path: LeakTracePathItem): boolean {CODE
LOW…ace-filters/rules/FilterPendingActivitiesTrace.rule.ts40function pendingActivitiesRetainsDetachedElementChain(CODE
LOW…b/leak-filters/rules/FilterOverSizedNodeAsLeak.rule.ts36function isHeapNodeUsefulForLeakTraceDiffing(CODE
LOW…ib/leak-filters/rules/FilterDetachedDOMElement.rule.ts48function isDetachedDOMNodeDominatedByDehydratedMemoizedState(CODE
LOWpackages/mcp-server/src/native-context.ts189export function resolveNativeContextFilter(CODE
LOWpackages/mcp-server/src/run-manifest.ts157function cyclesFromPrecedingDrivenRung(CODE
LOWpackages/mcp-server/src/guardrail.ts118function installUnknownParamRejection(server: McpServer): void {CODE
LOWpackages/mcp-server/src/context-analysis.ts306function attributeScriptScopeInfos(CODE
LOWpackages/mcp-server/src/artifact-classes.ts224export function classifyNonProductionString(CODE
LOWpackages/mcp-server/src/artifact-classes.ts272export function isReactRefreshSignatureShape(CODE
LOWpackages/mcp-server/src/artifact-classes.ts292export function isHarnessToolManifestShape(CODE
LOWpackages/mcp-server/src/utils.ts433export function hasFreshnessTimestampSibling(node: IHeapNode): boolean {CODE
LOWpackages/mcp-server/src/utils.ts609export function filterLargestObjectsCounted(CODE
LOWpackages/mcp-server/src/utils.ts830export function boundedDominatorRetainedSize(CODE
LOWpackages/mcp-server/src/utils.ts1235export function instrumentationRetainerNote(CODE
LOWpackages/mcp-server/src/dev-edges.ts306export function shortestPathAvoidingDevEdges(CODE
LOWpackages/mcp-server/src/tools/population-vs-owners.ts45export function registerPopulationVsOwners(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/property-distribution.ts46export function registerPropertyDistribution(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/object-cost-breakdown.ts136export function registerObjectCostBreakdown(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/string-prefix-census.ts98export function registerStringPrefixCensus(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/field-release-impact.ts71export function registerFieldReleaseImpact(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/dev-subtracted-delta.ts78export function registerDevSubtractedDelta(server: McpServer): void {CODE
LOW…ckages/mcp-server/src/tools/snapshot-budget-planner.ts37export function registerSnapshotBudgetPlanner(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/closure-inspection.ts142export function registerClosureInspection(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/module-attribution.ts272export function registerModuleAttribution(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/react-update-queues.ts523export function registerReactUpdateQueues(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/anonymize-snapshot.ts107export function registerAnonymizeSnapshot(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/auto-investigate.ts346function scanDistributedAccumulation(CODE
LOWpackages/mcp-server/src/tools/auto-investigate.ts434function scanSubscriptionAccumulation(CODE
LOWpackages/mcp-server/src/tools/cache-inventory.ts102function functionPropertyCollections(CODE
LOWpackages/mcp-server/src/tools/dead-context-variables.ts108export function registerDeadContextVariables(server: McpServer): void {CODE
LOWpackages/mcp-server/src/tools/blink-native-census.ts205export function registerBlinkNativeCensus(server: McpServer): void {CODE
63 more matches not shown…
Structural Annotation Overuse13 hits · 21 pts
SeverityFileLineSnippetContext
LOW⚡packages/core/src/paths/TraceFinder.ts304 // Step 1: DFS from the root.COMMENT
LOW⚡packages/core/src/paths/TraceFinder.ts307 // Step 2: nodes may remain unreachable from the root. First bring inCOMMENT
LOWpackages/core/src/paths/TraceFinder.ts321 // Step 3: whatever is still unreachable is a clique of nodes retained onlyCOMMENT
LOWpackages/core/src/paths/TraceFinder.ts334 // Step 4: main loop, processing vertices in decreasing DFS number.COMMENT
LOWpackages/core/src/paths/TraceFinder.ts374 // Step 5: fill in the immediate dominators not computed explicitly above.COMMENT
LOWpackages/mcp-server/MCP_SKILL.md17## Step 0: Obtain the SnapshotCOMMENT
LOWpackages/mcp-server/MCP_SKILL.md41## Step 1: Load and TriageCOMMENT
LOWpackages/mcp-server/MCP_SKILL.md73## Step 2: Choose an Investigation PathCOMMENT
LOWpackages/mcp-server/MCP_SKILL.md365## Step 3: Deep DiveCOMMENT
LOWpackages/mcp-server/MCP_SKILL.md395## Step 4: Report FindingsCOMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts296 // Step 1: per-value string duplication index.COMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts329 // Step 2: For duplicated strings, sample referrers to get property × shapeCOMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts576 // Step 3: Compute savings and filterCOMMENT
Verbosity Indicators8 hits · 14 pts
SeverityFileLineSnippetContext
LOW⚡packages/core/src/paths/TraceFinder.ts304 // Step 1: DFS from the root.COMMENT
LOW⚡packages/core/src/paths/TraceFinder.ts307 // Step 2: nodes may remain unreachable from the root. First bring inCOMMENT
LOWpackages/core/src/paths/TraceFinder.ts321 // Step 3: whatever is still unreachable is a clique of nodes retained onlyCOMMENT
LOWpackages/core/src/paths/TraceFinder.ts334 // Step 4: main loop, processing vertices in decreasing DFS number.COMMENT
LOWpackages/core/src/paths/TraceFinder.ts374 // Step 5: fill in the immediate dominators not computed explicitly above.COMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts296 // Step 1: per-value string duplication index.COMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts329 // Step 2: For duplicated strings, sample referrers to get property × shapeCOMMENT
LOWpackages/mcp-server/src/tools/intern-opportunities.ts576 // Step 3: Compute savings and filterCOMMENT
AI Slop Vocabulary3 hits · 7 pts
SeverityFileLineSnippetContext
MEDIUMpackages/mcp-server/src/tools/find-nodes-by-class.ts181 // largest first, then scan order), so paging is seamless between them.COMMENT
MEDIUMpackages/e2e/static/links/min.js4!function(){"use strict";var e={725:function(e){var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=OCODE
MEDIUMpackages/e2e/static/links/min.js4!function(){"use strict";var e={725:function(e){var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=OCODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWAI.md128 await page.locator('input[name="email"]').fill('user@example.com');CODE