AI Slop Code Risk Monitor

storytold/vectorcraft

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

VectorCraft: An open-source, vector art tool written by scratch in pure Rust

1.0 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for storytold/vectorcraft, a Rust project with 11,155 GitHub stars. SynthScan examined 776,709 lines of code across 2040 source files, recording 704 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 1.0 (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.0
Adjusted Signal
1.0
Raw Pattern Score
100%
Time Factor
2026-11-01
Last Push
11.2K
Stars
Rust
Language
776.7K
Lines of Code
2.0K
Files
704
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 4.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.2/100 · LOW

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

Agent Over-Engineering Ratio 0.2/100 · LOW

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

PR Review Velocity Impact 4.8/100 · LOW

Which changes need focused human review? 704 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 2HIGH 1MEDIUM 16LOW 685

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 704 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 Block666 hits · 666 pts
SeverityFileLineSnippetContext
LOWpackaging/env.sh1# shellcheck shell=bashCOMMENT
LOWpackaging/macos/package.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/freebsd/package.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/linux/flatpak-oci.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/linux/package.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/linux/flatpak-bundle.sh1#!/usr/bin/env bashCOMMENT
LOW…ng/linux/flatpak/ai.storyteller.vectorcraft.bundle.yml1# Flatpak manifest for the single-file bundle attached to every GitHub releaseCOMMENT
LOW…ng/linux/flatpak/ai.storyteller.vectorcraft.bundle.yml21 # X11 shared memory (MIT-SHM). Without it the X11 fallback is slow or fails.COMMENT
LOW…ng/linux/flatpak/ai.storyteller.vectorcraft.bundle.yml41 - --env=XCURSOR_PATH=/run/host/user-share/icons:/run/host/share/iconsCOMMENT
LOWpackaging/linux/flatpak/ai.storyteller.vectorcraft.yml1# Flatpak manifest for VectorCraft, ready for a Flathub submission.COMMENT
LOWpackaging/linux/flatpak/ai.storyteller.vectorcraft.yml21 # Keep identical to ai.storyteller.vectorcraft.bundle.yml (the release bundle); comments there.COMMENT
LOWcrates/svg/tests/convolve_overflow.rs1//! A `<feConvolveMatrix>` whose `order` overflows usvg's `order_x * order_y` u32 multiply must beCOMMENT
LOWcrates/svg/src/export.rs261 warnings: Vec<String>,COMMENT
LOWcrates/svg/src/lib.rs1//! VectorCraft SVG import and export.COMMENT
LOWcrates/svg/src/lib.rs21//!COMMENT
LOWcrates/svg/src/lib.rs41//! describes dither as the gradient converted to pixels with subtle noiseCOMMENT
LOWcrates/svg/src/lib.rs61//! none).COMMENT
LOWcrates/svg/src/lib.rs81//! * Text lines after the first start at the first line's x; text in a clip path is ignored;COMMENT
LOWcrates/svg/src/lib.rs121 #[serde(rename = "entities")]COMMENT
LOWcrates/svg/src/lib.rs141}COMMENT
LOWcrates/svg/src/lib.rs181#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]COMMENT
LOWcrates/svg/src/lib.rs201/// presentation attributes and a fixed size, the most portable output. The SVG Options dialogCOMMENT
LOWcrates/svg/src/lib.rs221 pub images: ImageMode,COMMENT
LOWcrates/svg/src/lib.rs561 // usvg converts the tree by recursion, in large stack frames: the nesting it is given isCOMMENT
LOWcrates/svg/src/import.rs61 roxmltree::Document::parse_with_options(svg, roxmltree::ParsingOptions { allow_dtd: true, ..Default::default() })COMMENT
LOWcrates/svg/src/export/output.rs421 /// `p` written with `m` as the SVG basic shape it exactly is, as the reference app's SVGCOMMENT
LOWcrates/svg/src/export/text.rs61 self.stroke_props(&layer, layer.width, Some(layer.paint_bounds(bounds)), &mut p);COMMENT
LOWcrates/svg/src/export/text.rs621 y: f64,COMMENT
LOWcrates/svg/src/import/files.rs21/// The files an SVG's images link to.COMMENT
LOWcrates/svg/src/import/layers.rs41 c.kind = sub.kind;COMMENT
LOWcrates/svg/src/import/symbol_units.rs1//! Percentage lengths inside a `<symbol>` with a `viewBox`, as numbers, for usvg.COMMENT
LOWcrates/svg/src/import/text.rs1//! `<text>` import.COMMENT
LOWcrates/svg/src/import/depth.rs1//! How deep an SVG's elements nest, found in the XML before usvg runs: usvg converts the tree byCOMMENT
LOWcrates/svg/src/import/depth.rs21use super::css::{Styles, XNode, parse_decls};COMMENT
LOWcrates/svg/src/import/prepass.rs101 last = r.end;COMMENT
LOWcrates/three-d/src/solid/inflate.rs101 let camera = Camera::new(view, bounds, o.depth + 2.0 * height.max(reach));COMMENT
LOWcrates/metafile/src/lib.rs1//! Windows metafiles: hand-written EMF and WMF writers and readers.COMMENT
LOWcrates/tools/src/pie.rs1//! Pie widgets: two handles just outside a selected live ellipse, at its Pie Start Angle and PieCOMMENT
LOWcrates/tools/src/cut.rs1//! Mirror & Cut, Line Cut and Rectangle Cut: drag across the selected art.COMMENT
LOWcrates/tools/src/cursors.toml1# The cursors VectorCraft needs: one [[cursor]] per `Cursor` value (crates/tools/src/cursor.rs).COMMENT
LOWcrates/tools/src/distort.rs1//! Distortion tools: Width (Shift+W), the Liquify family (Warp Shift+R, Twirl, Pucker, Bloat,COMMENT
LOWcrates/tools/src/lib.rs161 /// be `Other`, never `InputMethod`.COMMENT
LOWcrates/tools/src/lib.rs241 falseCOMMENT
LOWcrates/tools/src/intertwine.rs1//! Object › Intertwine (#1763): the overlap areas of an Intertwine group, and the tool thatCOMMENT
LOWcrates/tools/src/pen.rs1//! The Pen tool (P).COMMENT
LOWcrates/tools/src/pen.rs41 /// ...this one, once the engine made it: another path selected meanwhile isn't drawn on.COMMENT
LOWcrates/tools/src/cursor.rs81 Blend,COMMENT
LOWcrates/tools/src/cursor.rs101 /// The Lasso tool.COMMENT
LOWcrates/tools/src/cursor.rs121 PencilContinue,COMMENT
LOWcrates/tools/src/cursor.rs181 MeasureInspect,COMMENT
LOWcrates/tools/src/select.rs1//! The Selection tool (V): click/shift-click, marquee (Shift-drag toggles the objects it reaches:COMMENT
LOWcrates/tools/src/select.rs21//! bracket drag) cancels it: the art returns to its state at the press.COMMENT
LOWcrates/tools/src/direct.rs1//! Direct Selection (A) and Group Selection tools.COMMENT
LOWcrates/tools/src/direct.rs21//! Both move objects selected as a whole as the Selection tool does, snapping alike. When theCOMMENT
LOWcrates/tools/src/direct.rs201 /// What the point holding a move of objects snaps to while the move takes direct-selectedCOMMENT
LOWcrates/tools/src/text.rs1//! The Type tools: Type (T), Area Type and Type on a Path.COMMENT
LOWcrates/tools/src/text.rs181 /// Smart Guides for where new type goes.COMMENT
LOWcrates/tools/src/meshblend.rs1//! Blend tool (W) and Mesh tool (U).COMMENT
LOWcrates/tools/src/shape.rs1//! Shape tools: Rectangle, Rounded Rectangle, Ellipse, Polygon, Star, Line Segment.COMMENT
LOWcrates/tools/src/settings.rs1//! Tool options that persist: a tool keeps them when another tool is chosen and they are savedCOMMENT
606 more matches not shown…
Decorative Section Separators10 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMcrates/tools/src/cursors.toml22# ── Selection ─────────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml138# ── Pen family ────────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml238# ── Type ──────────────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml257# ── Transform and resize ──────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml355# ── Navigation ────────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml405# ── Colour and gradient ───────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml449# ── Width, blend, slice and shape builder ─────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml528# ── Drawing and editing tools ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml725# ── Symbolism tools ───────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcrates/tools/src/cursors.toml776# ── Not needed ────────────────────────────────────────────────────────────────────────────────────COMMENT
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALcrates/ui-egui/src/panels/gradient/tests.rs368 assert_eq!(app.session.last_gradient.gradient.stops.len(), 2, "the Tools panel's Gradient button shows it");CODE
CRITICALcrates/ui-egui/src/dialogs/tests_perspective.rs202 assert_eq!(app.session.prefs.perspective_widget.position.id(), "bottomLeft");CODE
Fake / Example Data18 hits · 18 pts
SeverityFileLineSnippetContext
LOWcrates/tools/src/text.rs670 json!({"path": pid.0, "mode": mode, "text": "", "at": [start.x, start.y], "vertical": vertical, "plaCODE
LOWcrates/tools/src/text.rs687 params["placeholder"] = json!(cx.placeholder_text);CODE
LOWcrates/ui-egui/src/canvas/tests.rs7943 let made = app.run("text.create", json!({"x": 200, "y": 150, "text": "Lorem ipsum", "size": 36})).unwrap();CODE
LOWcrates/cad/src/tests.rs188 let holder = objects.iter().find(|o| kind(o) == "ACDBPLACEHOLDER").expect("placeholder");CODE
LOWcrates/text/src/tests.rs61const LOREM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut laboreCODE
LOWcrates/text/src/tests.rs61const LOREM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut laboreCODE
LOWcrates/engine/src/cmd/create.rs708 check_switches(p, &["vertical", "placeholder"], "text.create")?;CODE
LOWcrates/engine/src/cmd/create.rs733 if bool_or(p, "placeholder", false) {CODE
LOWcrates/engine/src/cmd/textedit.rs1042 check_switches(p, &["vertical", "placeholder"], C)?;CODE
LOWcrates/engine/src/cmd/textedit.rs1076 if bool_or(p, "placeholder", false) {CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs454 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs467 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs493 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs538 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs571 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/cmd/fileio/tests_aiimport.rs792 assert!(e.contains("placeholder"), "{e}");CODE
LOWcrates/engine/src/tests/textedit.rs321 ("text.create", json!({"x": 0, "y": 0, "placeholder": 1}), "placeholder"),CODE
LOWcrates/engine/src/tests/textedit.rs323 ("text.createInPath", json!({"path": frame, "placeholder": "true"}), "placeholder"),CODE
AI Slop Vocabulary6 hits · 17 pts
SeverityFileLineSnippetContext
MEDIUMcrates/svg/src/import/text.rs942 // Absolutely placed characters: lay the text out left-aligned and kern each one onto its x.COMMENT
MEDIUMcrates/pathops/src/boolean.rs1//! Curve-preserving boolean operations built on `linesweeper`'s robust sweep-line topology.COMMENT
MEDIUMcrates/pathops/src/fit.rs16/// Direction the curve leaves `p0` (robust to retracted handles).COMMENT
MEDIUMcrates/pathops/src/lib.rs4//! Booleans are curve-preserving: `linesweeper`'s robust sweep-line works directly on cubicCOMMENT
MEDIUMcrates/geom/src/bez.rs42/// Unit tangent of `s` at `t`, robust at ends where control points coincide with the end point.COMMENT
MEDIUMxtask/src/stats.rs104 println!("\n(#[test] counts source attributes; macro-generated tests count once. Use --exact for harness counts.CODE
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHcrates/brush/src/warp.rs232/// Art turned so it runs left → right, flipped as requested; returns it with its bounds.COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpackaging/linux/flatpak-oci.sh5# Usage:COMMENT