AI Slop Code Risk Monitor

excalidraw/excalidraw

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

Virtual whiteboard for sketching hand-drawn like diagrams

1.4 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for excalidraw/excalidraw, a TypeScript project with 134,893 GitHub stars. SynthScan examined 289,593 lines of code across 930 source files, recording 360 pattern matches distributed across 9 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-30
Last Push
134.9K
Stars
TypeScript
Language
289.6K
Lines of Code
930
Files
360
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 1.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 4.8/100 · LOW

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

Agent Over-Engineering Ratio 0.7/100 · LOW

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

PR Review Velocity Impact 6.4/100 · LOW

Which changes need focused human review? 360 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 2MEDIUM 6LOW 352

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

Fake / Example Data288 hits · 288 pts
SeverityFileLineSnippetContext
LOWpackages/element/tests/resize.test.tsx1289 const topArrowLabel = await UI.editText(topArrow.get(), "lorem ipsum");CODE
LOWpackages/element/tests/resize.test.tsx1360 await UI.editText(topText, "lorem ipsum");CODE
LOWpackages/excalidraw/locales/az-AZ.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/az-AZ.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/az-AZ.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/az-AZ.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/az-AZ.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/kk-KZ.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/kk-KZ.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/kk-KZ.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/kk-KZ.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/kk-KZ.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/my-MM.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/my-MM.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/my-MM.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/my-MM.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/my-MM.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/kaa.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/kaa.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/kaa.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/kaa.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/kaa.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/lv-LV.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/lv-LV.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/lv-LV.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/lv-LV.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/lv-LV.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/el-GR.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/el-GR.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/el-GR.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/el-GR.json709 "placeholder": "Γρήγορη αναζήτηση"CODE
LOWpackages/excalidraw/locales/el-GR.json738 "placeholder": "Αναζητήστε μενού, εντολές και ανακαλύψτε κρυμμένα διαμάντια",CODE
LOWpackages/excalidraw/locales/it-IT.json221 "placeholder": "Trova testo sulla tela...",CODE
LOWpackages/excalidraw/locales/it-IT.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/it-IT.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/it-IT.json709 "placeholder": "Ricerca rapida"CODE
LOWpackages/excalidraw/locales/it-IT.json738 "placeholder": "Cerca menu, comandi e scopri gemme nascoste",CODE
LOWpackages/excalidraw/locales/th-TH.json221 "placeholder": "ค้นหาข้อความในผืนผ้าใบ",CODE
LOWpackages/excalidraw/locales/th-TH.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/th-TH.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/th-TH.json709 "placeholder": "ค้นหาด่วน"CODE
LOWpackages/excalidraw/locales/th-TH.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/ko-KR.json221 "placeholder": "캔버스에서 텍스트 찾기...",CODE
LOWpackages/excalidraw/locales/ko-KR.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/ko-KR.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/ko-KR.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/ko-KR.json738 "placeholder": "메뉴와 명령을 검색하고 숨겨진 기능을 찾아보세요",CODE
LOWpackages/excalidraw/locales/nn-NO.json221 "placeholder": "",CODE
LOWpackages/excalidraw/locales/nn-NO.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/nn-NO.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/nn-NO.json709 "placeholder": ""CODE
LOWpackages/excalidraw/locales/nn-NO.json738 "placeholder": "",CODE
LOWpackages/excalidraw/locales/es-ES.json221 "placeholder": "Encontrar texto en lienzo...",CODE
LOWpackages/excalidraw/locales/es-ES.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/es-ES.json682 "placeholder": {CODE
LOWpackages/excalidraw/locales/es-ES.json709 "placeholder": "Búsqueda rápida"CODE
LOWpackages/excalidraw/locales/es-ES.json738 "placeholder": "Busca menús, comandos y descubre gemas ocultas",CODE
LOWpackages/excalidraw/locales/ja-JP.json221 "placeholder": "キャンバス内のテキストを検索…",CODE
LOWpackages/excalidraw/locales/ja-JP.json490 "placeholder": {CODE
LOWpackages/excalidraw/locales/ja-JP.json682 "placeholder": {CODE
228 more matches not shown…
Over-Commented Block37 hits · 37 pts
SeverityFileLineSnippetContext
LOWpackages/element/tests/resize.test.tsx181COMMENT
LOWpackages/element/tests/resize.test.tsx781 // it("resizes with bound arrow", async () => {COMMENT
LOWpackages/element/tests/resize.test.tsx981 expect(image.width).toBeCloseTo(70);COMMENT
LOWpackages/element/tests/resize.test.tsx1001 // expect(arrow.endBinding?.elementId).toEqual(image.id);COMMENT
LOWpackages/element/tests/resize.test.tsx1201 expect(diagLine.y).toBeCloseTo((selectionHeight - 40) * (1 - scale) + 40);COMMENT
LOWpackages/element/tests/resize.test.tsx1221 // y: 50,COMMENT
LOWpackages/element/tests/resize.test.tsx1241 // elementId: string;COMMENT
LOWpackages/element/tests/resize.test.tsx1261 // leftArrowBinding.elementId,COMMENT
LOWpackages/element/tests/textWrapping.test.ts601 // 'ち', 'は', '世', '界!',COMMENT
LOWpackages/element/src/delta.ts1441 throw e;COMMENT
LOWpackages/element/src/renderElement.ts901 if (canSnapElement(element, appState)) {COMMENT
LOWpackages/element/src/bucketFill.ts721 const eps = options.snapEpsilon;COMMENT
LOWpackages/element/src/bucketFill.ts941 // nothing usable — not an error, just no enclosed regionCOMMENT
LOWpackages/element/src/bucketFill.ts1241): FaceSelection | null => {COMMENT
LOWpackages/element/src/bucketFill.ts1721 for (const index of splicedHoleIndices) {COMMENT
LOWpackages/element/src/bucketFill.ts1741 // mark lies inside the region (a floating line, a label, an icon — anCOMMENT
LOWpackages/element/src/arrowEndpointText.ts181 ? HEADING_DOWNCOMMENT
LOWpackages/element/src/convertToShape.ts81COMMENT
LOWpackages/element/src/convertToShape.ts101COMMENT
LOWpackages/element/src/convertToShape.ts121// Minimum |skew| along the major axis for an open, straight stroke to be anCOMMENT
LOWpackages/element/src/convertToShape.ts201 // Skew of the points projected onto the major axis. Signed so that it isCOMMENT
LOWpackages/excalidraw/charts.test.ts841 // On epsilon axis, first series should dominate strongly.COMMENT
LOWpackages/excalidraw/types.ts1301 offset: { x: number; y: number };COMMENT
LOWpackages/excalidraw/types.ts1321 // pointer interactionCOMMENT
LOWpackages/excalidraw/types.ts1341 drag: {COMMENT
LOW…ckages/excalidraw/subset/harfbuzz/harfbuzz-bindings.ts81 hbSubsetWasm.hb_set_invert(layoutFeatures);COMMENT
LOW…ckages/excalidraw/subset/harfbuzz/harfbuzz-bindings.ts101 const inputUnicodes = hbSubsetWasm.hb_subset_input_unicode_set(input);COMMENT
LOW…ckages/excalidraw/subset/harfbuzz/harfbuzz-bindings.ts121 // `hb_subset_input_pin_axis_location (harfbuzz) returned zero when pinning ${axisName} to ${value}, indicatCOMMENT
LOW…ckages/excalidraw/subset/harfbuzz/harfbuzz-bindings.ts141 // value.min,COMMENT
LOWpackages/excalidraw/wysiwyg/textWysiwyg.tsx1261COMMENT
LOWpackages/excalidraw/tests/history.test.tsx1101 // expect(API.getRedoStack().length).toBe(4);COMMENT
LOWpackages/excalidraw/tests/history.test.tsx1161 ]);COMMENT
LOWpackages/excalidraw/tests/data/reconcile.test.ts141 // -------------------------------------------------------------------------COMMENT
LOWpackages/excalidraw/components/App.arrowText.ts61 this.app.state.zoom,COMMENT
LOWpackages/excalidraw/components/Sidebar/Sidebar.tsx201 return () => setMounted(false);COMMENT
LOWpackages/excalidraw/data/library.ts621 }COMMENT
LOWpackages/common/src/constants.ts441export const ELEMENT_PENDING_DRAW_SHAPE_OPACITY = 70;COMMENT
Hyper-Verbose Identifiers25 hits · 25 pts
SeverityFileLineSnippetContext
LOWpackages/element/tests/frame.test.tsx72 function selectElementAndDuplicate(CODE
LOWpackages/element/src/frame.ts80export function isElementIntersectingFrame(CODE
LOWpackages/element/src/renderElement.ts1362export function getFreedrawOutlineAsSegments(CODE
LOWpackages/element/src/utils.ts129export function deconstructLinearOrFreeDrawElement(CODE
LOWpackages/element/src/utils.ts206export function getLinearElementPathSegments(CODE
LOWpackages/element/src/utils.ts245export function deconstructRectanguloidElement(CODE
LOWpackages/element/src/utils.ts457export function deconstructDiamondElement(CODE
LOWpackages/element/src/zindex.ts543function shiftElementsAccountingForFrames(CODE
LOWpackages/element/src/linearElementEditor.ts2805function getLinearElementPathMetrics(CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts599 function updateGlobalBufferAndViews(buf) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts960 function receiveInstantiatedSource(output) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1383 function whenDependentTypesAreResolved(CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1508 function shallowCopyInternalPointer(o) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1519 function throwInstanceAlreadyDeleted(obj) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1708 function constNoSmartPtrRawPointerToWireType(destructors, handle) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1812 function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1842 function simpleReadValueFromPointer(pointer) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1874 function getInheritedInstanceCount() {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts1877 function getLiveInheritedInstances() {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts2566 function floatReadValueFromPointer(name, shift) {CODE
LOWpackages/excalidraw/subset/woff2/woff2-bindings.ts2632 function integerReadValueFromPointer(name, shift, signed) {CODE
LOWpackages/laser-pointer/src/math.ts54export function getCircleAndPerpendicularLineIntersectionsAtPoint(CODE
LOWpackages/math/src/curve.ts336export function curveCatmullRomQuadraticApproxPoints(CODE
LOWpackages/math/src/curve.ts414export function offsetPointsForQuadraticBezier(CODE
LOWpackages/common/src/constants.ts172export function getGenericFontFamilyFallback(CODE
Decorative Section Separators4 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUM⚡packages/excalidraw/snapping.ts67 // ┌───────────┐◄───────────────►COMMENT
MEDIUM⚡packages/excalidraw/snapping.ts68 // │ │-----------------┌───────────┐COMMENT
MEDIUM⚡packages/excalidraw/snapping.ts72 // └───────────┘-----------------│ │COMMENT
MEDIUM⚡packages/excalidraw/snapping.ts73 // └───────────┘COMMENT
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGH…w/components/TTDDialog/utils/mermaidValidation.test.ts167 // Simulates partial AI-generated content during streamingCOMMENT
HIGHpackages/excalidraw/data/blob.ts535 // with AI generated images)COMMENT
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMpackages/excalidraw/tests/interactivity.test.tsx634 // The placement scaffold remains for host UI, but default controls don't.COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…ges/excalidraw/components/TopPicksDnD/TopPicksDnD.scss55 // one full dash+gap period per cycle → seamless loopCOMMENT
Verbosity Indicators1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpackages/element/src/elbowArrow.ts1709 // We need to check if the path we have arrived at this neighbor is the shortest one we have seen yet.COMMENT
Slop Phrases1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/release.js164 "Skipping commit. Don't forget to commit manually later!",CODE