AI Slop Code Risk Monitor

Brooooooklyn/canvas

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

High performance Skia canvas implementation. Zero system dependencies.

1.5 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for Brooooooklyn/canvas, a TypeScript project with 2,352 GitHub stars. SynthScan examined 122,967 lines of code across 274 source files, recording 156 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 1.5 (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.5
Adjusted Signal
1.5
Raw Pattern Score
100%
Time Factor
2026-11-01
Last Push
2.4K
Stars
TypeScript
Language
123.0K
Lines of Code
274
Files
156
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 6.9/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

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

Agent Over-Engineering Ratio 0.1/100 · LOW

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

PR Review Velocity Impact 6.5/100 · LOW

Which changes need focused human review? 156 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 1HIGH 0MEDIUM 0LOW 155

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

Over-Commented Block127 hits · 125 pts
SeverityFileLineSnippetContext
LOWbuild.rs161 .flag("/clang:-ffp-contract=off")COMMENT
LOWindex.js421}COMMENT
LOWload-image.js21 // use the same buffer without copying if the source is a bufferCOMMENT
LOW__test__/text-raster.spec.ts1// Canvas text pixels and glyph boxes against Chrome 155's CPU canvas on theCOMMENT
LOW__test__/alpha-false.spec.ts681COMMENT
LOW__test__/css-color-chrome.spec.ts241// On Windows, Chrome gives 54, not the fixture's 55 (Chrome macOS), for byte 17 (pixel 4, green) ofCOMMENT
LOW__test__/pdfjs-dots.spec.ts1// PDF subpaths of zero length, drawn by pdf.js in Node as in Chrome. ISO 32000COMMENT
LOW__test__/stroke-prune-point-paths-chrome.spec.ts1// The one-point stroke prune for every path. Chrome strokes nothing for a pathCOMMENT
LOW__test__/text-bbox-chrome.spec.ts1// measureText's width and actualBoundingBox against Chrome 155 (CPU canvas,COMMENT
LOW__test__/svg-conic-gradient.spec.ts601// and the clip, written exactly, left 4 of the 10 columns. Chrome must also read the origin backCOMMENT
LOW__test__/stroke-prune-chrome.spec.ts861 tiny(c)COMMENT
LOW__test__/shadow.spec.ts821 t.true(Math.abs(r - expected) <= 3, `x=${x}: expected ~${expected} (Chrome 150), got ${r}`)COMMENT
LOW__test__/shadow.spec.ts861// Every probe below is >= 10 device px from the nearest ramp, so a sub-pixelCOMMENT
LOW__test__/shadow.spec.ts901 ctx.rotate(0.5)COMMENT
LOW__test__/shadow.spec.ts1081//COMMENT
LOWskia-c/skia_c.cpp1#include <assert.h>COMMENT
LOWskia-c/skia_c.cpp201// writes a patternTransform), so a draw whose pattern has a non-identityCOMMENT
LOWskia-c/skia_c.cpp621 static constexpr int64_t kMaxSweepPixels = 4096 * 4096;COMMENT
LOWskia-c/skia_c.cpp761 while (!ChromeReadsExactly(v)) {COMMENT
LOWskia-c/skia_c.cpp781 // this comment gives. Past it, the origin moves down to the next numberCOMMENT
LOWskia-c/skia_c.cpp1641// level the draw needs. This is ours, one per decoded Image: a copy perCOMMENT
LOWskia-c/skia_c.cpp2061// StaticBitmapImage::DrawHelper (static_bitmap_image.cc:83-116) do: clip theCOMMENT
LOWskia-c/skia_c.cpp4321// Tag decoded AVIF pixels with the file's color space, as Chrome's AVIFCOMMENT
LOWskia-c/font_scalers.cpp1// The typefaces the canvas makes from font files. By default every OS usesCOMMENT
LOWskia-c/font_scalers.cpp21// WOFF and WOFF2 are decoded to SFNT first, as Blink's OTS step hands theCOMMENT
LOWskia-c/text_words.cpp1// Word-by-word shaping like Blink's PlainTextNode: canvas text is split intoCOMMENT
LOWskia-c/text_words.cpp101 return status <= 0 &&COMMENT
LOWskia-c/text.cpp1// Canvas text: measureText, fillText and strokeText, laid out withCOMMENT
LOWskia-c/text.cpp21#if defined(SK_DEBUG) || !defined(SK_RELEASE)COMMENT
LOWskia-c/text.cpp61 std::vector<std::pair<uint32_t, BlinkRectF>> inks;COMMENT
LOWskia-c/text.cpp661 static_cast<ParagraphImpl*>(builder.Build().release()));COMMENT
LOWskia-c/text.cpp721 const float line_width = paragraph_width - blink.shift;COMMENT
LOWskia-c/text.cpp1081 AppendLineKey(&key, *request);COMMENT
LOWskia-c/svg_image.cpp1// SVG images src/svg_doc prepared, drawn by SkSVGDOM through a canvas thatCOMMENT
LOWskia-c/text_raster.cpp1// Canvas text rasterization. By default every OS draws the same way:COMMENT
LOWskia-c/text_raster.cpp21// CoreText's headers declare a global TextRange, which skia_c.hpp'sCOMMENT
LOWskia-c/text_styles.cpp1// Variable font axes and synthetic bold and italic, like Blink. A registeredCOMMENT
LOWskia-c/text_metrics.cpp1// The primary font's vertical metrics and the textBaseline offsets, likeCOMMENT
LOWskia-c/text_raster.hpp21 // The font flags skparagraph shapes with. They are the same for everyCOMMENT
LOWskia-c/text_caps.cpp1// font-variant-caps like Blink's HarfBuzzShaper: the OpenType caps featuresCOMMENT
LOWskia-c/skia_c.hpp1#ifndef SKIA_CAPI_HCOMMENT
LOWskia-c/skia_c.hpp21#include <include/core/SkPathBuilder.h>COMMENT
LOWskia-c/skia_c.hpp41#include <include/effects/SkGradient.h>COMMENT
LOWskia-c/skia_c.hpp61#include <modules/svg/include/SkSVGNode.h>COMMENT
LOWskia-c/skia_c.hpp141// The family "system-ui": CoreText's UI font and its bold, italic and boldCOMMENT
LOWskia-c/skia_c.hpp721 // font_families.cpp: every registered and system family name by itsCOMMENT
LOWskia-c/skia_c.hpp741 std::unordered_set<size_t> font_arguments;COMMENT
LOWskia-c/skia_c.hpp1101 // - Typefaces may be held by Paragraphs, Pictures, or cached rendersCOMMENT
LOWskia-c/font_families.cpp1// Which installed or registered family each canvas font family uses, likeCOMMENT
LOWskia-c/font_families.cpp21#include <algorithm>COMMENT
LOWskia-c/text.hpp1// Shared by the canvas text files (text.cpp, font_families.cpp,COMMENT
LOWskia-c/text.hpp81// for a canvas): U+0009 to U+000D are spaces, U+2028 and U+2029 draw asCOMMENT
LOWsrc/pattern.rs101 };COMMENT
LOWsrc/avif.rs21 pub alpha_quality: Option<u32>,COMMENT
LOWsrc/avif.rs41 /// Many high-end digital video formats and interfaces use this scheme:COMMENT
LOWsrc/num.rs1//! The two ways Blink turns a JS double into a float for the 2D context.COMMENT
LOWsrc/gif.rs21 /// Default: 0 (infinite)COMMENT
LOWsrc/gif.rs81/// Example usage:COMMENT
LOWsrc/gif.rs221 /// Example:COMMENT
LOWsrc/page_recorder.rs21/// arms MUST NOT share a raw id space: `Resource::id` comes from our ownCOMMENT
67 more matches not shown…
Verbosity Indicators11 hits · 24 pts
SeverityFileLineSnippetContext
LOW⚡__test__/global-fonts.spec.ts339 // Step 1: Register Font A with alias "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts343 // Step 2: Set an alias pointing to "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts350 // Step 3: Remove Font ACOMMENT
LOW⚡__test__/global-fonts.spec.ts356 // Step 4: Register Font B with the SAME alias name "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts360 // Step 5: Verify "StaleAliasX" does NOT exist (the stale alias should NOT transfer)COMMENT
LOW⚡__test__/global-fonts.spec.ts366 // Step 6: Register and remove an unrelated font to trigger rebuildCOMMENT
LOW⚡__test__/global-fonts.spec.ts370 // Step 7: Verify "StaleAliasX" STILL does not exist after rebuildCOMMENT
LOWsrc/page_recorder.rs432 // Step 1: Always end the current recording before starting theCOMMENT
LOW⚡src/page_recorder.rs452 // Step 2: Fresh recording for pixel data (clean canvas: no clip, identity transform)COMMENT
LOW⚡src/page_recorder.rs460 // Step 3: Promote the pixel data recording as a layerCOMMENT
LOW⚡src/page_recorder.rs465 // Step 4: Start new recording and restore stateCOMMENT
Structural Annotation Overuse11 hits · 24 pts
SeverityFileLineSnippetContext
LOW⚡__test__/global-fonts.spec.ts339 // Step 1: Register Font A with alias "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts343 // Step 2: Set an alias pointing to "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts350 // Step 3: Remove Font ACOMMENT
LOW⚡__test__/global-fonts.spec.ts356 // Step 4: Register Font B with the SAME alias name "StaleAliasTest"COMMENT
LOW⚡__test__/global-fonts.spec.ts360 // Step 5: Verify "StaleAliasX" does NOT exist (the stale alias should NOT transfer)COMMENT
LOW⚡__test__/global-fonts.spec.ts366 // Step 6: Register and remove an unrelated font to trigger rebuildCOMMENT
LOW⚡__test__/global-fonts.spec.ts370 // Step 7: Verify "StaleAliasX" STILL does not exist after rebuildCOMMENT
LOWsrc/page_recorder.rs432 // Step 1: Always end the current recording before starting theCOMMENT
LOW⚡src/page_recorder.rs452 // Step 2: Fresh recording for pixel data (clean canvas: no clip, identity transform)COMMENT
LOW⚡src/page_recorder.rs460 // Step 3: Promote the pixel data recording as a layerCOMMENT
LOW⚡src/page_recorder.rs465 // Step 4: Start new recording and restore stateCOMMENT
Hallucination Indicators1 hit · 10 pts
SeverityFileLineSnippetContext
CRITICALsrc/lib.rs837 self.ctx.context.surface.canvas.fill(0, 0, 0, 255);CODE
Fake / Example Data3 hits · 3 pts
SeverityFileLineSnippetContext
LOWREADME.md102 author: 'Jane Doe',CODE
LOW__test__/image-metadata.spec.ts133 author: 'Jane Doe',CODE
LOWsrc/svg_doc/select.rs182 "placeholder",CODE
Hyper-Verbose Identifiers2 hits · 2 pts
SeverityFileLineSnippetContext
LOW__test__/shadow.spec.ts948function isolationAlphaShadowScene(mode: string, shadowBlur: number) {CODE
LOW__test__/webidl-intrinsics.spec.ts18function convertWithReplacedGlobals(ctx: any) {CODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWsrc/gif.rs81/// Example usage:COMMENT