AI Slop Code Risk Monitor

storytold/photocraft

SlopCodeMonitor badge for storytold/photocraft Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).
1.1 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for storytold/photocraft. SynthScan examined 837,268 lines of code across 2390 source files, recording 785 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 1.1 (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.1
Adjusted Signal
1.1
Raw Pattern Score
100%
Time Factor
—
Last Push
—
Stars
—
Language
837.3K
Lines of Code
2.4K
Files
785
Pattern Hits
2026-10-31
Scan Date
0.01
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.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.9/100 · LOW

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

Agent Over-Engineering Ratio 0.0/100 · LOW

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

PR Review Velocity Impact 5.4/100 · LOW

Which changes need focused human review? 785 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 13HIGH 0MEDIUM 15LOW 757

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

Over-Commented Block723 hits · 723 pts
SeverityFileLineSnippetContext
LOWCargo.toml101# Test builds compile ui-egui without optimization: its library and unit tests were the biggestCOMMENT
LOWpackaging/env.sh1# shellcheck shell=bashCOMMENT
LOWpackaging/macos/verify.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/macos/package.sh1#!/usr/bin/env bashCOMMENT
LOWpackaging/web/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
LOWpackaging/linux/flatpak/ai.storyteller.photocraft.yml1# Flatpak manifest for PhotoCraft, ready for a Flathub submission.COMMENT
LOWpackaging/linux/flatpak/ai.storyteller.photocraft.yml21 - --filesystem=xdg-data/ArtCraft/versions:roCOMMENT
LOW…ing/linux/flatpak/ai.storyteller.photocraft.bundle.yml1# Flatpak manifest for the single-file bundle attached to every GitHub releaseCOMMENT
LOW…ing/linux/flatpak/ai.storyteller.photocraft.bundle.yml21 # Display: Wayland first; X11 only when no Wayland compositor is running.COMMENT
LOW.config/nextest.toml1# Refuse to run under a nextest older than the fixed release: GHSA-vc25-qg58-w57c is fixed inCOMMENT
LOWcrates/paint/src/retouch.rs1//! Generic dab-driven stroke machinery for the retouching tools (Clone Stamp, Healing Brush, SpotCOMMENT
LOWcrates/paint/src/render.rs161 r.clamp(0.0, 1.0)COMMENT
LOWcrates/paint/src/lib.rs1//! Brush engine: Photoshop-grade brushes (computed and sampled tips, Shape Dynamics, Scattering,COMMENT
LOWcrates/paint/src/tile.rs81/// thousand big sampled brushes costs a few small previews in memory, not gigabytes of bitmaps.COMMENT
LOWcrates/paint/src/brush.rs561 pub flow: f32,COMMENT
LOWcrates/paint/src/brush.rs781 /// dialog's boxes.COMMENT
LOWcrates/paint/src/curve.rs1//! A response curve: how a 0..1 input (pen pressure, tilt, wheel, a fade ramp) maps to a 0..1COMMENT
LOWcrates/tablet/src/lib.rs1//! Pen tablet input that the windowing layer (winit 0.30) drops: pressure, tilt, barrel rotationCOMMENT
LOWcrates/tablet/src/lib.rs21//! pointer for the pen, so pen motion would have to be re-injected into egui as well. WithoutCOMMENT
LOWcrates/tablet/src/x11.rs1//! XInput2 raw tablet events on X11, over a separate pure-Rust X connection (x11rb'sCOMMENT
LOWcrates/tablet/src/xi.rs1//! XInput2 tablet valuators → [`Sample`]s. Pure (no X calls), so it is tested on every platform;COMMENT
LOWcrates/tablet/src/appkit.rs1//! AppKit `NSEvent` tablet fields → [`Sample`]s. Pure (no AppKit calls), so it is tested onCOMMENT
LOWcrates/gpu/tests/it/timing.rs1//! The canvas timing must measure GPU *execution*, not encode-and-submit (#7186).COMMENT
LOWcrates/gpu/src/camera_raw.rs1//! Camera Raw's per-pixel develop on the GPU, for the dialog's interactive preview (#6916).COMMENT
LOWcrates/gpu/src/consts.rs41pub const PATTERN_IDLE_FRAMES: u64 = 240;COMMENT
LOWcrates/gpu/src/health.rs1//! Device health (#243): notices a lost wgpu device or an uncaptured wgpu error so callers stopCOMMENT
LOWcrates/gpu/src/health.rs121 /// on a poll, and `Device::poll` panics on a lost device).COMMENT
LOWcrates/gpu/src/lib.rs1//! GPU compositor (architecture §7.2, milestone M5).COMMENT
LOWcrates/gpu/src/lib.rs21//! RGBA32F accumulators, reused) that bind only that cell's pages, and each finished chunk isCOMMENT
LOWcrates/gpu/src/prefix.rs1//! One lower-stack composite, held in bounded chunk textures. Exact COW snapshots deliberatelyCOMMENT
LOWcrates/gpu/src/plan.rs1//! Planner: walks the layer tree into a linear list of GPU passes over abstract buffer slots.COMMENT
LOWcrates/gpu/src/paging.rs101/// [`Unsupported`] instead of letting it escape to wgpu's panic handler.COMMENT
LOWcrates/gpu/src/fx.rs1//! Effect maps on the GPU (`photocraft_compose::effects::build_maps`).COMMENT
LOWcrates/gpu/src/fx.rs361/// [`field_radius`], so a part is computed from a window grown by it.COMMENT
LOWcrates/gpu/src/timing.rs1//! GPU execution time of a composite (#7186), measured with wgpu timestamp queries.COMMENT
LOWcrates/gpu/src/timing.rs21//! the render targets. Measured against a waited-for wall clock on Intel UHD P630 / Mesa, withCOMMENT
LOWcrates/gpu/src/timing.rs81 read: wgpu::Buffer,COMMENT
LOWcrates/codecs/tests/it/exr_cryptomatte.rs1//! Cryptomatte (specification 1.2): the hash function is checked against the officialCOMMENT
LOWcrates/codecs/tests/it/deep_exr.rs1//! Deep EXR: a synthetic generator builds deep chunks per the OpenEXR file layoutCOMMENT
LOWcrates/codecs/src/exif_color.rs1//! The EXIF ColorSpace tag (0xA001, in the Exif sub-IFD that IFD0's tag 0x8769 points to):COMMENT
LOWcrates/codecs/src/lib.rs1//! `photocraft-codecs`: symmetric, depth- and metadata-preserving codecs forCOMMENT
LOWcrates/codecs/src/orientation.rs1//! EXIF / TIFF orientation (tag 274): reading it, applying it to the pixels,COMMENT
LOWcrates/codecs/src/options.rs1//! Decode limits and encode options.COMMENT
LOWcrates/codecs/src/options.rs301 /// Write an `sTER` chunk marking the image as a stereo pair (PNG Extensions 1.4.0, §3.6),COMMENT
LOWcrates/codecs/src/source_settings.rs1//! The encoder settings a lossy file was written with, read back from its own data, so a saveCOMMENT
LOWcrates/codecs/src/image.rs141 pub text: Vec<(String, String)>,COMMENT
LOWcrates/codecs/src/image.rs181/// held more than was decoded, or less than it should.COMMENT
LOWcrates/codecs/src/image.rs281 pub name: String,COMMENT
LOWcrates/codecs/src/resolution.rs1//! Image resolution (pixels per inch) recorded in metadata blocks: EXIF / TIFF IFD0COMMENT
LOWcrates/codecs/src/cicp.rs1//! ITU-T H.273 colour descriptions (CICP: coding-independent code points), as HEIF `colr`COMMENT
LOWcrates/codecs/src/codecs/iff.rs1//! Amiga IFF/ILBM reader and writer (EA "Interchange File Format", "InterLeaved BitMap" and theCOMMENT
LOWcrates/codecs/src/codecs/jpeg.rs1//! JPEG: decode via `zune-jpeg` (gray, YCbCr, CMYK, YCCK; arithmetic-coded and 12-bit filesCOMMENT
LOWcrates/codecs/src/codecs/tiff_exif.rs1//! EXIF in a TIFF file: the Exif (34665) and GPS (34853) directories that IFD0 points to, plusCOMMENT
LOWcrates/codecs/src/codecs/tiff_exif.rs21/// IFD0's pointer to the GPS directory.COMMENT
LOWcrates/codecs/src/codecs/fits.rs1//! FITS (Flexible Image Transport System, FITS Standard 4.0), implemented here: the image in theCOMMENT
LOWcrates/codecs/src/codecs/tiff.rs1//! TIFF and BigTIFF: 1/2/4/8/16/32/64-bit integer and 16/32/64-bit float samples, gray / RGB /COMMENT
663 more matches not shown…
Hallucination Indicators13 hits · 130 pts
SeverityFileLineSnippetContext
CRITICALcrates/ui-egui/src/tools/crop_shield.rs206 let rgb = app.ui.tool_options.crop_shield.custom_color.map(|v| v as f32 / 255.0);CODE
CRITICALcrates/ui-egui/src/tools/retouch_ui.rs53 json!({"mode": app.session.tools.brush.mode.label()})CODE
CRITICALcrates/ui-egui/src/tools/retouch_ui.rs102 "mode": app.session.tools.brush.mode.label(),CODE
CRITICALcrates/ui-egui/src/tools/gradient_ui/tests.rs350 let before = app.session.presets.gradient.stops.len();CODE
CRITICALcrates/ui-egui/src/panels/brush_panel.rs459 let texture = app.session.tools.brush.texture.clone();CODE
CRITICALcrates/ui-egui/src/canvas/strokes.rs73 let overlay = app.session.presets.clone.overlay.clone();CODE
CRITICALcrates/ui-egui/src/canvas/tests.rs1864 assert!(app.session.tools.mixer.spatial.is_some());CODE
CRITICALcrates/ui-egui/src/canvas/tests.rs2050 assert!(app.session.tools.mixer.spatial.is_none(), "the held Move tool doesn't sample");CODE
CRITICALcrates/ui-egui/src/canvas/tests.rs2053 assert!(app.session.tools.mixer.spatial.is_some(), "⌥ with the Mixer Brush itself samples");CODE
CRITICALcrates/ui-egui/src/canvas/background_redraw.rs232 app.session.color.settings.blend_text_gamma.to_bits()CODE
CRITICALcrates/engine/src/cmd/brush_cmds/tests.rs434 let chalk_pattern = s.tools.brush.texture.pattern.clone();CODE
CRITICALcrates/engine/src/cmd/brush_cmds/tests.rs1303 assert!(s.tools.brush.shape_dynamics.size.curve.is_linear());CODE
CRITICALcrates/engine/src/preset_store/tests.rs589 assert_eq!(t.tools.brush.texture.pattern.bitmap(), Some(&tips[1]));CODE
AI Slop Vocabulary12 hits · 35 pts
SeverityFileLineSnippetContext
MEDIUMcrates/paint/src/procedural.rs36/// Generate a seamless pattern tile.COMMENT
MEDIUMcrates/compose/src/pattern.rs6//! exactly and scaled ones stay seamless. Below 100 % each document pixel averages anCOMMENT
MEDIUMcrates/algo/examples/bench_retouch.rs1//! Timing of the retouch kernels alone (no document plumbing): Poisson seamless clone andCOMMENT
MEDIUMcrates/algo/src/features.rs2//! robust model fitting.COMMENT
MEDIUMcrates/algo/src/dff.rs49 /// `min(1, robust / |d − u|)` (in layers) and the system is solved once more. 0 = off.COMMENT
MEDIUMcrates/algo/src/hdr.rs129/// neighbourhood is flat in the middle exposure (robust to small misalignment), stratified byCOMMENT
MEDIUMcrates/algo/src/inpaint/solver.rs571 // σ² from the 75th percentile of match costs (Wexler et al. use a robust scale like this).COMMENT
MEDIUMcrates/ui-egui/examples/perf_scenarios.rs977/// #9328: the whole app (kittest harness, CPU canvas) with a 24 MP document; each sample togglesCOMMENT
MEDIUMcrates/ui-egui/src/jobs_ui/tests.rs1//! UI tests for background jobs (#210): the whole app (eframe harness, CPU canvas) keepsCOMMENT
MEDIUMcrates/ui-egui/src/canvas/pattern_preview.rs2//! seamless tile, so what leaves one edge is seen coming back at the opposite one. The copiesCOMMENT
MEDIUMcrates/engine/src/cmd/retouch_cmds/patch.rs5//! `destination` mode the selected pixels are copied to the dragged outline and repair it. Either way the copied texturCOMMENT
MEDIUMxtask/src/stats.rs104 println!("\n(#[test] counts source attributes; macro-generated tests count once. Use --exact for harness counts.CODE
Fake / Example Data25 hits · 29 pts
SeverityFileLineSnippetContext
LOWcrates/io/tests/it/psd_style_sheets.rs93 "LOREM IPSUM",CODE
LOWcrates/io/tests/it/psd_style_sheets.rs99 let t = layer("LOREM IPSUM", &ed);CODE
LOWcrates/io/tests/it/psd_style_sheets.rs182 "LOREM IPSUM",CODE
LOWcrates/io/tests/it/psd_style_sheets.rs188 let mut t = layer("LOREM IPSUM", &ed);CODE
LOWcrates/io/tests/it/psd_style_sheets.rs207 "LOREM IPSUM",CODE
LOWcrates/io/tests/it/psd_style_sheets.rs213 let mut t = layer("LOREM IPSUM", &ed);CODE
LOWcrates/ui-egui/src/menu_catalog.rs502 (&["Type"], "Paste Lorem Ipsum", None, "type.pasteLoremIpsum"),CODE
LOWcrates/ui-egui/src/prefs/prefs_ui/tests.rs138 assert!(contains("placeholder", "type"));CODE
LOWcrates/ui-egui/src/tools/type_tool.rs84pub const PLACEHOLDER: &str = "Lorem Ipsum";CODE
LOWcrates/text/src/tests.rs2905 for text in ["a", "a\n", "a\n\n", "", "Lorem ipsum dolor sit amet"] {CODE
LOWcrates/text/src/tests.rs2905 for text in ["a", "a\n", "a\n\n", "", "Lorem ipsum dolor sit amet"] {CODE
LOWcrates/engine/src/tests.rs1431 let r = s.execute("type.create", json!({"x": 50, "y": 200, "text": "Lorem Ipsum", "size": 48, "coalesce": "k"})).unwCODE
LOWcrates/engine/src/cmd/type_extra_cmds.rs2//! Convert to Shape, Rasterize, Warp Text, the OpenType toggles, Paste Lorem Ipsum, Update AllCOMMENT
LOW⚡crates/engine/src/cmd/type_extra_cmds.rs23/// Photoshop's Paste Lorem Ipsum filler.COMMENT
LOW⚡crates/engine/src/cmd/type_extra_cmds.rs24pub const LOREM_IPSUM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididuntCODE
LOW⚡crates/engine/src/cmd/type_extra_cmds.rs24pub const LOREM_IPSUM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididuntCODE
LOWcrates/engine/src/cmd/type_extra_cmds.rs542// ---------- lorem ipsum / update / fonts / defaults ----------COMMENT
LOWcrates/engine/src/cmd/type_extra_cmds.rs549 let caret = with_text(s, p, "Paste Lorem Ipsum", |t, _| {CODE
LOWcrates/engine/src/cmd/type_extra_cmds.rs811 "Paste Lorem Ipsum",CODE
LOWcrates/engine/src/cmd/web_cmds/tests.rs476 (40, "mailto:hello@example.org"),CODE
LOWcrates/engine/src/cmd/type_extra_cmds/tests.rs255 assert!(text(&s, id).text.starts_with("Hi Lorem ipsum"));CODE
LOWcrates/engine/src/cmd/type_extra_cmds/tests.rs421 // #4188: Lock All stopped type.edit (#3132) but not Paste Lorem Ipsum into the layer.COMMENT
LOWcrates/engine/src/cmd/type_cmds/tests.rs158 let id = s.execute("type.create", json!({"x": 0, "y": 40, "text": "Lorem Ipsum", "coalesce": "k"})).unwrap()["layer"CODE
LOWcrates/engine/src/cmd/type_cmds/tests.rs159 assert_eq!(layer_name_of(&s, id), "Lorem Ipsum");CODE
LOWdocs/ui-design.md56| Type tool | `type_tool.rs` | Click: point text with the placeholder "Lorem Ipsum" selected. Drag: paragraph box. InlinCODE
Verbosity Indicators4 hits · 8 pts
SeverityFileLineSnippetContext
LOWcrates/algo/src/segment/subject.rs95/// Step 5: GrabCut again with a background model that only knows the backdrop. A colour modelCOMMENT
LOW⚡crates/ui-egui/src/dialogs/layer_style/tests.rs1068 // Step 4: disable the stroke row — a pending edit, the document is untouched.COMMENT
LOW⚡crates/ui-egui/src/dialogs/layer_style/tests.rs1070 // Step 5: add a Color Overlay (a new instance: no fx snapshot, factory defaults).COMMENT
LOWcrates/ui-egui/src/dialogs/layer_style/tests.rs1083 // Step 6: untick Preview — the canvas shows the real document, whose stroke isCOMMENT
Structural Annotation Overuse4 hits · 8 pts
SeverityFileLineSnippetContext
LOWcrates/algo/src/segment/subject.rs95/// Step 5: GrabCut again with a background model that only knows the backdrop. A colour modelCOMMENT
LOW⚡crates/ui-egui/src/dialogs/layer_style/tests.rs1068 // Step 4: disable the stroke row — a pending edit, the document is untouched.COMMENT
LOW⚡crates/ui-egui/src/dialogs/layer_style/tests.rs1070 // Step 5: add a Color Overlay (a new instance: no fx snapshot, factory defaults).COMMENT
LOWcrates/ui-egui/src/dialogs/layer_style/tests.rs1083 // Step 6: untick Preview — the canvas shows the real document, whose stroke isCOMMENT
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMcrates/engine/src/cmd/smart_cmds.rs11//! ──transform (exact shift, or bicubic warp)──────► placed (document pixels)COMMENT
MEDIUMcrates/engine/src/cmd/smart_cmds.rs13//! ──filter mask mix (unfiltered ↔ filtered)───────► cacheCOMMENT
Modern AI Meta-Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMdocs/architecture.md521kurbo = "*" # pin at scaffold timeCODE
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpackaging/linux/flatpak-oci.sh5# Usage:COMMENT