AI Slop Code Risk Monitor

parallax/jsPDF

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

Client-side JavaScript PDF generation for everyone.

0.9 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for parallax/jsPDF, a JavaScript project with 31,318 GitHub stars. SynthScan examined 230,374 lines of code across 332 source files, recording 136 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 0.9 (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.9
Adjusted Signal
0.9
Raw Pattern Score
100%
Time Factor
2026-10-28
Last Push
31.3K
Stars
JavaScript
Language
230.4K
Lines of Code
332
Files
136
Pattern Hits
2026-10-31
Scan Date
0.02
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 0.9/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 3.3/100 · LOW

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

Agent Over-Engineering Ratio 0.8/100 · LOW

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

PR Review Velocity Impact 3.9/100 · LOW

Which changes need focused human review? 136 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 5HIGH 0MEDIUM 0LOW 131

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 136 distinct pattern matches across 5 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 Data86 hits · 94 pts
SeverityFileLineSnippetContext
LOWtypes/jspdf-tests.ts146 const loremipsum = "Lorem ipsum dolor sit amet, ...";CODE
LOWtypes/jspdf-tests.ts146 const loremipsum = "Lorem ipsum dolor sit amet, ...";CODE
LOW⚡types/jspdf-tests.ts480 doc.getTextWidth("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests.ts481 doc.getStringUnitWidth("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests.ts482 doc.getCharWidthsArray("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests.ts484 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doloreCODE
LOW⚡types/jspdf-tests.ts484 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doloreCODE
LOWtypes/jspdf-tests-node.ts147 const loremipsum = "Lorem ipsum dolor sit amet, ...";CODE
LOWtypes/jspdf-tests-node.ts147 const loremipsum = "Lorem ipsum dolor sit amet, ...";CODE
LOW⚡types/jspdf-tests-node.ts481 doc.getTextWidth("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests-node.ts482 doc.getStringUnitWidth("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests-node.ts483 doc.getCharWidthsArray("Lorem Ipsum");CODE
LOW⚡types/jspdf-tests-node.ts485 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doloreCODE
LOW⚡types/jspdf-tests-node.ts485 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doloreCODE
LOW⚡test/specs/split_text_to_size.spec.js13 expect(doc.getStringUnitWidth("Lorem Ipsum")).toEqual(6.599999999999999);CODE
LOW⚡test/specs/split_text_to_size.spec.js16 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js16 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js22 expect(doc.getStringUnitWidth("Lorem Ipsum")).toEqual(5.8);CODE
LOW⚡test/specs/split_text_to_size.spec.js25 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js25 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js34 expect(doc.getTextWidth("Lorem Ipsum")).toEqual(37.25333333333332);CODE
LOW⚡test/specs/split_text_to_size.spec.js37 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js37 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js43 expect(doc.getTextWidth("Lorem Ipsum")).toEqual(32.73777777777777);CODE
LOW⚡test/specs/split_text_to_size.spec.js46 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js46 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js55 for (var i = 0; i < "Lorem Ipsum".length; i++) {CODE
LOW⚡test/specs/split_text_to_size.spec.js56 expect(doc.getCharWidthsArray("Lorem Ipsum")[i]).toEqual(0.6);CODE
LOW⚡test/specs/split_text_to_size.spec.js61 expect(doc.getCharWidthsArray("Lorem Ipsum")[0]).toEqual(0.55);CODE
LOW⚡test/specs/split_text_to_size.spec.js62 expect(doc.getCharWidthsArray("Lorem Ipsum")[1]).toEqual(0.55);CODE
LOW⚡test/specs/split_text_to_size.spec.js63 expect(doc.getCharWidthsArray("Lorem Ipsum")[2]).toEqual(0.33);CODE
LOW⚡test/specs/split_text_to_size.spec.js64 expect(doc.getCharWidthsArray("Lorem Ipsum")[3]).toEqual(0.55);CODE
LOW⚡test/specs/split_text_to_size.spec.js65 expect(doc.getCharWidthsArray("Lorem Ipsum")[4]).toEqual(0.83);CODE
LOW⚡test/specs/split_text_to_size.spec.js66 expect(doc.getCharWidthsArray("Lorem Ipsum")[5]).toEqual(0.28);CODE
LOW⚡test/specs/split_text_to_size.spec.js67 expect(doc.getCharWidthsArray("Lorem Ipsum")[6]).toEqual(0.28);CODE
LOW⚡test/specs/split_text_to_size.spec.js68 expect(doc.getCharWidthsArray("Lorem Ipsum")[7]).toEqual(0.55);CODE
LOW⚡test/specs/split_text_to_size.spec.js69 expect(doc.getCharWidthsArray("Lorem Ipsum")[8]).toEqual(0.5);CODE
LOW⚡test/specs/split_text_to_size.spec.js70 expect(doc.getCharWidthsArray("Lorem Ipsum")[9]).toEqual(0.55);CODE
LOW⚡test/specs/split_text_to_size.spec.js71 expect(doc.getCharWidthsArray("Lorem Ipsum")[10]).toEqual(0.83);CODE
LOW⚡test/specs/split_text_to_size.spec.js132 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js132 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js138 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js138 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js141 ).toEqual("Lorem ipsum dolor sit amet,");CODE
LOW⚡test/specs/split_text_to_size.spec.js141 ).toEqual("Lorem ipsum dolor sit amet,");CODE
LOW⚡test/specs/split_text_to_size.spec.js144 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js144 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js150 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js150 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js156 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js156 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js162 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js162 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js168 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js168 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js177 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js177 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js183 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js183 "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et doCODE
LOW⚡test/specs/split_text_to_size.spec.js186 ).toEqual("Lorem ipsum dolor sit amet, consetetur");CODE
26 more matches not shown…
Hallucination Indicators5 hits · 60 pts
SeverityFileLineSnippetContext
CRITICALdocs/modules_acroform.js.html535 formObject.scope.internal.acroformPlugin.acroFormDictionaryRoot.Fields.push(CODE
CRITICALdocs/modules_outline.js.html270 //this.line('/Dest ' + '[' + (item.options.pageNumber - 1) + ' /XYZ 0 ' + this.ctx.pdf.internal.pageSize.gCOMMENT
CRITICALexamples/js/jquery/jquery-ui-1.8.17.custom.min.js943 return a.ui.mouse.prototype._mouseUp.call(this, b);CODE
CRITICALsrc/modules/acroform.js491 formObject.scope.internal.acroformPlugin.acroFormDictionaryRoot.Fields.push(CODE
CRITICALsrc/modules/outline.js226 //this.line('/Dest ' + '[' + (item.options.pageNumber - 1) + ' /XYZ 0 ' + this.ctx.pdf.internal.pageSize.gCOMMENT
Hyper-Verbose Identifiers38 hits · 36 pts
SeverityFileLineSnippetContext
LOWtest/specs/Uint8Array.spec.js8 function convertDataURIToArrayBuffer(dataURI) {CODE
LOWdocs/jspdf.js.html3618 function transformTextToSpecialArray(text) {CODE
LOWdocs/jspdf.js.html6056 function setPageWidthWithoutScaling(pageNumber, value) {CODE
LOWdocs/jspdf.js.html6068 function setPageHeightWithoutScaling(pageNumber, value) {CODE
LOW⚡examples/PDF.js/web/viewer.js2854 function webViewerSwitchScrollMode(evt) {CODE
LOW⚡examples/PDF.js/web/viewer.js2858 function webViewerSwitchSpreadMode(evt) {CODE
LOW⚡examples/PDF.js/web/viewer.js2862 function webViewerDocumentProperties() {CODE
LOWexamples/PDF.js/web/viewer.js2572 function webViewerTextLayerRendered(evt) {}CODE
LOWexamples/PDF.js/web/viewer.js2621 function webViewerPresentationModeChanged(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2631 function webViewerSidebarViewChanged(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2671 function webViewerScrollModeChanged(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2679 function webViewerSpreadModeChanged(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2752 fileReader.onload = function webViewerChangeFileReaderOnload(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2774 function webViewerPresentationMode() {CODE
LOWexamples/PDF.js/web/viewer.js2824 function webViewerPageNumberChanged(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2888 function webViewerUpdateFindMatchesCount(_ref9) {CODE
LOWexamples/PDF.js/web/viewer.js2900 function webViewerUpdateFindControlState(_ref10) {CODE
LOWexamples/PDF.js/web/viewer.js2925 function webViewerRotationChanging(evt) {CODE
LOWexamples/PDF.js/web/viewer.js2950 function webViewerVisibilityChange(evt) {CODE
LOWexamples/PDF.js/web/viewer.js3541 function GeneratorFunctionPrototype() {}CODE
LOWexamples/PDF.js/web/viewer.js3647 function callInvokeWithMethodAndArg() {CODE
LOWexamples/PDF.js/web/viewer.js4726 function backtrackBeforeAllVisibleElements(index, views, top) {CODE
LOWexamples/PDF.js/web/viewer.js4766 function isElementBottomAfterViewTop(view) {CODE
LOWexamples/PDF.js/web/viewer.js4773 function isElementRightAfterViewLeft(view) {CODE
LOWexamples/PDF.js/web/viewer.js5631 (function checkCanvasSizeLimitation() {CODE
LOWexamples/PDF.js/web/viewer.js10613 function isValidExplicitDestination(dest) {CODE
LOWexamples/PDF.js/web/viewer.js14046 value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {CODE
LOWexamples/PDF.js/web/viewer.js14595 function DefaultAnnotationLayerFactory() {CODE
LOWexamples/PDF.js/web/viewer.js14602 value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {CODE
LOWexamples/PDF.js/web/viewer.js17070 value: function updateLoadingIndicatorState() {CODE
LOWfontconverter/filereader.js232 function setupCustomFileProperties(files, groupID) {CODE
LOWfontconverter/filereader.js358 function checkFileReaderSyncSupport() {CODE
LOWsrc/jspdf.js3574 function transformTextToSpecialArray(text) {CODE
LOWsrc/jspdf.js6012 function setPageWidthWithoutScaling(pageNumber, value) {CODE
LOWsrc/jspdf.js6024 function setPageHeightWithoutScaling(pageNumber, value) {CODE
LOWsrc/libs/omggif.js270function GifWriterOutputLZWCodeStream(buf, p, min_code_size, index_stream) {CODE
LOWsrc/libs/omggif.js764function GifReaderLZWOutputIndexStream(code_stream, p, output, output_length) {CODE
LOWsrc/modules/png_support.js353function getPredictorFromCompression(compression) {CODE
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWsrc/jspdf.js2381 putShadingPatternDict();COMMENT
LOWsrc/jspdf.js4121COMMENT
LOWsrc/polyfills.js81 global.atob = function(data) {COMMENT
LOWsrc/libs/omggif.js301 emit_bytes_to_buffer(8);COMMENT
LOWsrc/libs/omggif.js321 // One obvious but very important consequence of the table system is thereCOMMENT
LOWsrc/modules/outline.js21 var namesOid;COMMENT
Overly Generic Function Names1 hit · 0 pts
SeverityFileLineSnippetContext
LOWexamples/PDF.js/web/viewer.js19609 getData: function getData() {CODE