AI Slop Code Risk Monitor

pulsejet/memories

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

Fast, modern and advanced photo management suite. Runs as a Nextcloud app.

1.3 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for pulsejet/memories, a PHP project with 3,872 GitHub stars. SynthScan examined 153,020 lines of code across 761 source files, recording 138 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.3 (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.3
Adjusted Signal
1.3
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
3.9K
Stars
PHP
Language
153.0K
Lines of Code
761
Files
138
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 2.5/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.3/100 · LOW

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

Agent Over-Engineering Ratio 4.0/100 · LOW

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

PR Review Velocity Impact 6.0/100 · LOW

Which changes need focused human review? 138 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 7MEDIUM 9LOW 122

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 138 distinct pattern matches across 14 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.

Hyper-Verbose Identifiers41 hits · 45 pts
SeverityFileLineSnippetContext
LOWtests/Unit/ExifDateParseTest.php55 public function testFormatWithEmbeddedOffset(): voidCODE
LOWtests/Unit/ExifDateParseTest.php64 public function testTimezoneOffsetTimeOriginal(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php94 public function testInvalidTimezoneFallbackToUtc(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php104 public function testVideoPrefersCreateDate(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php114 public function testImagePrefersDateTimeOriginal(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php124 public function testFallsBackToCreateDate(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php131 public function testEmbeddedOffsetDefinesInstant(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php143 public function testTrailingDstSuffixWithOffset(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php153 public function testTrailingStdSuffixWithOffset(): voidCODE
LOW⚡tests/Unit/ExifDateParseTest.php162 public function testTrailingDstSuffixWithSubseconds(): voidCODE
LOWtests/Unit/ExifDateParseTest.php188 public function testRejectsQuickTimeZeroDate(): voidCODE
LOWtests/Unit/MigrateGoogleTakeoutTest.php65 public function testZeroAndEmptyValuesAreOmitted(): voidCODE
LOWtests/Unit/ExifExtractTest.php660 public function testSetExifVideoWithLocationInformation(): voidCODE
LOWtests/Unit/BinExtTempBinTest.php21 public function testGetTempBinCopiesAndCaches(): voidCODE
LOWtests/Unit/BinExtTempBinTest.php36 public function testGetTempBinNeedsNoWritability(): voidCODE
LOWlib/Exif.php67 public function restartStaticExiftoolProc(): voidCODE
LOWlib/Exif.php493 private function initializeStaticExiftoolProc(): voidCODE
LOWlib/Exif.php506 private function getExifFromLocalPathWithStaticProc(string $path): arrayCODE
LOWlib/Exif.php543 private function getExifFromLocalPathWithSeparateProc(string $path, array $extraArgs = []): arrayCODE
LOWlib/Settings/SystemConfig.php374 public function facerecognitionIsInstalled(): boolCODE
LOWlib/Settings/SystemConfig.php386 public function previewGeneratorIsEnabled(): boolCODE
LOWlib/ClustersBackend/FaceRecognitionBackend.php267 private function getFaceRecognitionClusters(int $fileid = 0): arrayCODE
LOWlib/ClustersBackend/FaceRecognitionBackend.php334 private function getFaceRecognitionPersons(int $fileid = 0): arrayCODE
LOWlib/Controller/PublicController.php279 private function getSingleItemInitialState(\OCP\Files\File $file): arrayCODE
LOWlib/Controller/ArchiveController.php183 private function getOrCreateFolder(Folder $parent, string $name, int $tries = 3): FolderCODE
LOWlib/Db/CTEParams.php82 public static function getFolderNameBlocklistCount(IQueryBuilder $query): intCODE
LOWlib/Service/FileRobotMagick.php531 private function applyFilterNinteenSeventySeven(): voidCODE
LOWlib/Service/FileRobotMagick.php593 private function applyBaseFilterBrightness(float $value): voidCODE
LOWlib/Service/FileRobotMagick.php612 private function applyBaseFilterSaturation(float $value): voidCODE
LOWlib/Service/FileRobotMagick.php655 private function applyBaseFilterColorFilter(float $r, float $g, float $b, float $v): voidCODE
LOWsrc/components/Settings.vue456async function updateShowOwnerNameTimeline(val: boolean) {CODE
LOWsrc/components/Settings.vue493async function updateMetadataInSlideshow(val: boolean) {CODE
LOWsrc/components/Settings.vue497async function updateSkipViewerDeleteConfirm(val: boolean) {CODE
LOWsrc/components/SelectionManager.vue1039async function removeSelectionFromPerson(sel: Selection) {CODE
LOWsrc/components/Timeline.vue1838async function deleteFromViewWithAnimation(delPhotos: IPhoto[]) {CODE
LOWsrc/services/route-state.ts62export function disableRouterStatePersistence(key: string): string {CODE
LOWsrc/services/video/codec.ts39export function getPlayableVideoCodecsSync(): string[] | undefined {CODE
LOWsrc/services/video/codec.ts43async function detectPlayableVideoCodecs(): Promise<string[]> {CODE
LOWsrc/services/dav/face.ts30export async function faceRecognitionUpdatePerson(name: string, params: object, opts?: AbortOpts) {CODE
LOWsrc/services/dav/face.ts47export async function faceRecognitionRenamePerson(name: string, target: string, opts?: AbortOpts) {CODE
LOWsrc/services/dav/face.ts56export async function faceRecognitionSetPersonVisibility(name: string, visible: boolean, opts?: AbortOpts) {CODE
Unused Imports37 hits · 37 pts
SeverityFileLineSnippetContext
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py3CODE
LOWlens/nextcloud/__init__.py13CODE
LOWlens/nextcloud/__init__.py13CODE
LOWlens/nextcloud/__init__.py13CODE
LOWlens/models/__init__.py3CODE
LOWlens/models/__init__.py4CODE
LOWlens/models/__init__.py5CODE
LOWlens/models/__init__.py6CODE
LOWlens/models/__init__.py6CODE
LOWlens/models/__init__.py7CODE
LOWlens/index/__init__.py3CODE
LOWlens/index/__init__.py4CODE
LOWlens/index/__init__.py5CODE
LOWlens/routes/context.py9CODE
LOWlens/routes/context.py9CODE
LOWlens/routes/context.py10CODE
LOWlens/process/geo.py8CODE
LOWlens/process/geo.py9CODE
LOWlens/process/geo.py10CODE
LOWlens/process/__init__.py3CODE
LOWlens/process/__init__.py3CODE
LOWlens/process/__init__.py4CODE
LOWlens/store/__init__.py5CODE
LOWlens/store/__init__.py6CODE
LOWlens/store/__init__.py6CODE
LOWlens/store/__init__.py6CODE
LOWlens/store/__init__.py7CODE
LOWlens/store/__init__.py7CODE
LOWlens/store/__init__.py8CODE
LOWlens/store/__init__.py8CODE
Cross-File Repetition6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHlens/models/embedding.py0local snapshot dir, namespaced by model id for multi-model caches.STRING
HIGHlens/models/sentence.py0local snapshot dir, namespaced by model id for multi-model caches.STRING
HIGHlens/models/schema.py0local snapshot dir, namespaced by model id for multi-model caches.STRING
HIGHlens/models/embedding.py0download the pinned snapshot (retries + backoff); fatal if unreachable and uncached.STRING
HIGHlens/models/sentence.py0download the pinned snapshot (retries + backoff); fatal if unreachable and uncached.STRING
HIGHlens/models/schema.py0download the pinned snapshot (retries + backoff); fatal if unreachable and uncached.STRING
Decorative Section Separators6 hits · 22 pts
SeverityFileLineSnippetContext
MEDIUM⚡.examples/Docker/docker-compose.yml1# ===================================================================================================================COMMENT
MEDIUM⚡.examples/Docker/docker-compose.yml3# ===================================================================================================================COMMENT
MEDIUM⚡.examples/Docker/docker-compose.yml21# ===================================================================================================================COMMENT
MEDIUMscripts/e2e.sh3# ==============================================================================COMMENT
MEDIUMscripts/e2e.sh5# ==============================================================================COMMENT
MEDIUMscripts/e2e.sh23# ==============================================================================COMMENT
Excessive Try-Catch Wrapping16 hits · 16 pts
SeverityFileLineSnippetContext
LOWlens/models/embedding.py79 except Exception as exc: # noqa: BLE001CODE
LOWlens/models/sentence.py76 except Exception as exc: # noqa: BLE001CODE
LOWlens/models/schema.py94 except Exception as exc: # noqa: BLE001CODE
LOWlens/models/face.py97 except Exception as exc: # noqa: BLE001CODE
LOWlens/index/index.py28 except Exception:CODE
LOWlens/index/index.py45 except Exception as exc: # noqa: BLE001CODE
LOWlens/index/index.py81 except Exception as exc: # noqa: BLE001CODE
LOWlens/index/index.py107 except Exception as exc: # noqa: BLE001CODE
LOWlens/index/index.py167 except Exception:CODE
LOWlens/index/index.py177 except Exception:CODE
LOWlens/index/index.py202 except Exception:CODE
LOWlens/index/index.py221 except Exception as exc: # noqa: BLE001CODE
LOWlens/index/index.py264 except Exception:CODE
LOWlens/index/scan.py63 except Exception as exc:CODE
LOWlens/routes/index.py72 except Exception:CODE
LOWlens/routes/search.py51 except Exception:CODE
Over-Commented Block11 hits · 11 pts
SeverityFileLineSnippetContext
LOW.examples/Docker/docker-compose.yml1# ===================================================================================================================COMMENT
LOWgo-vod/ffmpeg/args.go41 // QF is the quality factor: CRF (x264), global_quality (VA-API), CQ (NVENC).COMMENT
LOWgo-vod/ffmpeg/args.go61 VAAPI, VAAPILowPower boolCOMMENT
LOWgo-vod/ffmpeg/args.go121 "-reconnect_delay_total_max", "30",COMMENT
LOWgo-vod/ffmpeg/args.go141// aspect-preserving downscale (hardware scaler per backend, softwareCOMMENT
LOWgo-vod/ffmpeg/args.go301// rendition into servable MPEG-TS segments:COMMENT
LOWscripts/e2e.sh1#!/bin/bashCOMMENT
LOWlib/Settings/SystemConfig.php21 // to generate the default config pageCOMMENT
LOWlib/Db/LivePhoto.php41 /** Get liveid from photo local file path */COMMENT
LOWlib/Db/LivePhoto.php61 //COMMENT
LOWlib/Db/FsManager.php161 // if this is a recursive query (e.g. timeline)COMMENT
Deep Nesting5 hits · 5 pts
SeverityFileLineSnippetContext
LOWlens/nextcloud/client.py62CODE
LOWlens/models/face.py77CODE
LOWlens/index/index.py130CODE
LOWlens/index/scan.py40CODE
LOWlens/index/scan.py87CODE
Empty Error Handlers1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHlens/nextcloud/client.py116except DaciteError:CODE
Modern Structural Boilerplate5 hits · 5 pts
SeverityFileLineSnippetContext
LOWlens/nextcloud/__init__.py15__all__ = [CODE
LOWlens/models/__init__.py9__all__ = [CODE
LOWlens/index/__init__.py7__all__ = [CODE
LOWlens/process/__init__.py6__all__ = [CODE
LOWlens/store/__init__.py10__all__ = [CODE
Self-Referential Comments1 hit · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡.examples/Docker/docker-compose.yml5# This file is provided as an example only and is not intended to be used as-is.COMMENT
Slop Phrases1 hit · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡.examples/Docker/docker-compose.yml14# If you intend to use a second reverse proxy for TLS, you can use this example:COMMENT
Redundant / Tautological Comments3 hits · 4 pts
SeverityFileLineSnippetContext
LOWgo-vod/entrypoint.sh31# Check if the current working directory is writableCOMMENT
LOWscripts/e2e.sh163# Check if a user existsCOMMENT
LOWscripts/patch-external.sh9# Check if the script is called from the root folder of the project.COMMENT
Fake / Example Data4 hits · 4 pts
SeverityFileLineSnippetContext
LOWsrc/typings/cluster.d.ts9 export type ClusterTypes = 'tags' | 'albums' | 'places' | 'recognize' | 'facerecognition' | 'plus' | 'placeholder';CODE
LOWsrc/components/ClusterGrid.vue128 case 'placeholder':CODE
LOWsrc/components/frame/Cluster.vue105 return props.data.cluster_type === 'placeholder';CODE
LOWsrc/services/dav/clusters.ts23 cluster_type: 'placeholder' as const,CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMscripts/e2e.sh224# Main entrypoint orchestrating full executionCOMMENT