AI Slop Code Risk Monitor

grimmory-tools/grimmory

SlopCodeMonitor badge for grimmory-tools/grimmory Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A self-hosted library for your ebooks, comics, and audiobooks

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for grimmory-tools/grimmory, a Java project with 4,636 GitHub stars. SynthScan examined 512,858 lines of code across 2785 source files, recording 328 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 0.7 (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.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
4.6K
Stars
Java
Language
512.9K
Lines of Code
2.8K
Files
328
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 1.1/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 2.1/100 · LOW

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

Agent Over-Engineering Ratio 1.2/100 · LOW

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

PR Review Velocity Impact 3.6/100 · LOW

Which changes need focused human review? 328 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 4MEDIUM 13LOW 311

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 328 distinct pattern matches across 8 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 Data218 hits · 220 pts
SeverityFileLineSnippetContext
LOW…obo-sync-settings/kobo-sync-settings-component.spec.ts40 email: 'admin@example.com',CODE
LOW…ings/user-management/user-management.component.spec.ts20 email: 'admin@example.com',CODE
LOW…ures/settings/custom-fonts/custom-fonts.component.html78 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labCODE
LOW…ures/settings/custom-fonts/custom-fonts.component.html78 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labCODE
LOW…s/font-upload-dialog/font-upload-dialog.component.html77 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dCODE
LOW…s/font-upload-dialog/font-upload-dialog.component.html77 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dCODE
LOW…eatures/command-palette/command-palette.component.html26 [placeholder]="t('placeholder')"CODE
LOW…rc/app/shared/components/setup/setup.component.spec.ts51 email: 'admin@example.com',CODE
LOW…rc/app/shared/components/setup/setup.component.spec.ts79 email: 'admin@example.com',CODE
LOW…/src/app/shared/components/setup/setup.service.spec.ts35 service.createAdmin({email: 'admin@example.com', password: 'secret'}).subscribe();CODE
LOW…/src/app/shared/components/setup/setup.service.spec.ts40 email: 'admin@example.com',CODE
LOWfrontend/src/i18n/zh.json966 "placeholder": "例如 {title} - {authors}",CODE
LOWfrontend/src/i18n/zh.json981 "placeholder": "留空以使用默认模式",CODE
LOWfrontend/src/i18n/zh.json1147 "placeholder": "例如 0 2 * * *",CODE
LOWfrontend/src/i18n/zh.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/zh.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/zh.json3391 "placeholder": "标题、作者、系列、类型或 ISBN...",CODE
LOWfrontend/src/i18n/zh.json3655 "placeholder": "在此写下您的笔记...",CODE
LOWfrontend/src/i18n/zh.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/sl.json966 "placeholder": "npr. {title} - {authors}",CODE
LOWfrontend/src/i18n/sl.json981 "placeholder": "Pusti prazno za uporabo privzetega vzorca",CODE
LOWfrontend/src/i18n/sl.json1147 "placeholder": "npr., 0 2 * * *",CODE
LOWfrontend/src/i18n/sl.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/sl.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/sl.json3391 "placeholder": "Naslov, avtor, zbirka, žanr ali ISBN...",CODE
LOWfrontend/src/i18n/sl.json3655 "placeholder": "Tukaj napiši svojo opombo...",CODE
LOWfrontend/src/i18n/sl.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json966 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json981 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json1147 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json3391 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json3655 "placeholder": "",CODE
LOWfrontend/src/i18n/hu.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json966 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json981 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json1147 "placeholder": "bijv. 0 2 * * *",CODE
LOWfrontend/src/i18n/nl.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json3391 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json3655 "placeholder": "",CODE
LOWfrontend/src/i18n/nl.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/ja.json966 "placeholder": "例: {title} - {authors}",CODE
LOWfrontend/src/i18n/ja.json981 "placeholder": "デフォルトパターンを使用するには空のままにしてください",CODE
LOWfrontend/src/i18n/ja.json1147 "placeholder": "例: 0 2 * * *",CODE
LOWfrontend/src/i18n/ja.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/ja.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/ja.json3391 "placeholder": "タイトル、著者、シリーズ、ジャンル、またはISBN...",CODE
LOWfrontend/src/i18n/ja.json3655 "placeholder": "ここにメモを書いてください...",CODE
LOWfrontend/src/i18n/ja.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/de.json966 "placeholder": "z.B. {title} - {authors}",CODE
LOWfrontend/src/i18n/de.json981 "placeholder": "Leer lassen, um Standardmuster zu verwenden",CODE
LOWfrontend/src/i18n/de.json1147 "placeholder": "z.B. 0 2 * * *",CODE
LOWfrontend/src/i18n/de.json1270 "placeholder": "",CODE
LOWfrontend/src/i18n/de.json1745 "placeholder": "",CODE
LOWfrontend/src/i18n/de.json3391 "placeholder": "Titel, Autor, Serie, Genre oder ISBN...",CODE
LOWfrontend/src/i18n/de.json3655 "placeholder": "Schreiben Sie Ihre Notiz hier...",CODE
LOWfrontend/src/i18n/de.json5062 "placeholder": "",CODE
LOWfrontend/src/i18n/ru.json966 "placeholder": "например, {title} - {authors}",CODE
158 more matches not shown…
Hyper-Verbose Identifiers75 hits · 76 pts
SeverityFileLineSnippetContext
LOW…d/tools/oxlint/anti-slop/shared/function-parameters.ts13export function functionParameterTypeAnnotation(CODE
LOW…d/tools/oxlint/anti-slop/shared/function-parameters.ts29export function functionParameterBindingName(CODE
LOW…ontend/tools/oxlint/anti-slop/shared/reflect-method.ts13export function isGlobalReflectMethodCall(CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts128function isEffectivelyEmptyTypeLiteral(type: ESTree.TSTypeLiteral): boolean {CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts132function isEffectivelyEmptyInterface(CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts144function resolvedSubstitutionArgument(CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts296export function classifyUnsafeDictionaryValue(CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts480export function isPopulatedObjectExpression(expression: ESTree.Expression): boolean {CODE
LOW…tend/tools/oxlint/anti-slop/shared/dictionary-types.ts493export function isKnownEvidenceExpression(expression: ESTree.Expression): boolean {CODE
LOW…tools/oxlint/anti-slop/shared/type-alias-resolution.ts117export function createTypeAliasEnvironment(CODE
LOW…ols/oxlint/anti-slop/shared/lexical-type-parameters.ts14function collectInferTypeParameterNames(CODE
LOW…ols/oxlint/anti-slop/shared/lexical-type-parameters.ts35export function lexicalTypeParameterNames(CODE
LOW…d/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts18function unwrapExpressionParentheses(expression: ESTree.Expression): ESTree.Expression {CODE
LOW…d/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts143function isDefinitelyNarrowerRecordType(type: ESTree.TSType): boolean {CODE
LOW…d/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts171function resolvedVariableForIdentifier(CODE
LOW…s/oxlint/anti-slop/rules/no-chained-type-assertions.ts6function isTypeAssertionExpression(node: ESTree.Node): node is TypeAssertionExpression {CODE
LOW…s/oxlint/anti-slop/rules/no-chained-type-assertions.ts10function unwrapParenthesizedExpression(expression: ESTree.Expression): ESTree.Expression {CODE
LOW…s/oxlint/anti-slop/rules/no-chained-type-assertions.ts27function isOutermostAssertionInChain(node: TypeAssertionExpression): boolean {CODE
LOW…s/oxlint/anti-slop/rules/no-chained-type-assertions.ts39function isForbiddenAssertionChain(node: TypeAssertionExpression): boolean {CODE
LOW…ools/oxlint/anti-slop/rules/no-known-value-widening.ts138function hasKnownCallArgumentEvidence(CODE
LOW…ools/oxlint/anti-slop/rules/no-known-value-widening.ts192function typePredicateSubjectIndex(CODE
LOW…ools/oxlint/anti-slop/rules/no-known-value-widening.ts253function isDictionaryAccumulatorTarget(destination: WideningTarget): boolean {CODE
LOW…ls/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts61function isInsideTypeAliasDeclaration(node: ESTree.Node): boolean {CODE
LOW…ls/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts80function isInsideTypeParameterConstraint(node: ESTree.TSType): boolean {CODE
LOW…lop/rules/require-safety-comment-for-type-assertion.ts48function hasSafetyJustificationBefore(CODE
LOWfrontend/playwright/login-and-books.fixture.ts36export function createLoginAndBooksScenario(): LoginAndBooksScenario {CODE
LOWfrontend/playwright/login-and-books.fixture.ts162export async function installLoginAndBooksRoutes(CODE
LOWfrontend/src/app/core/testing/dialog-testing.ts32export function createMessageServiceProvider(messageService: ReturnType<typeof createMessageServiceSpy>) {CODE
LOWfrontend/src/app/core/testing/dialog-testing.ts36export function createConfirmServiceProvider(confirmationService: ReturnType<typeof createConfirmServiceSpy>) {CODE
LOWfrontend/src/app/core/testing/query-testing.ts42export function flushSignalAndQueryEffects(): void {CODE
LOW…/metadata-settings/metadata-settings-component.spec.ts93function buildMetadataRefreshOptions(): MetadataRefreshOptions {CODE
LOW…es/settings/user-management/entity-view-preferences.ts23export function findEntityViewPreferenceOverride(CODE
LOW…es/settings/user-management/entity-view-preferences.ts45export function upsertEntityViewPreference(CODE
LOW…brary-shelf-menu/library-shelf-menu-items.component.ts20export function libraryShelfMenuAvailable(CODE
LOW…/app/features/book/browse/book-browse-bulk-commands.ts30export function createBookBrowseBulkCommands({selection, books, fetchIds}: BookBrowseBulkCommandsOptions) {CODE
LOW…tend/src/app/features/book/browse/book-browse-scope.ts85export function bookBrowseScopePreferenceContext(CODE
LOW…tend/src/app/features/book/browse/book-browse-scope.ts101export function bookBrowseScopeMenuTarget(CODE
LOW…rc/app/features/book/browse/book-browse-preferences.ts40export function createBookBrowsePreferences({context, availableSortKeys, urlState}: BookBrowsePreferencesOptions) {CODE
LOW…ntend/src/app/features/book/browse/book-browse-sort.ts50export function bookSortTermsFromCriteria(criteria: readonly BrowseSortCriterion[]): BookSortTerm[] {CODE
LOW…nd/src/app/features/book/browse/book-browse-columns.ts44export function normalizeBookColumnPreferences(CODE
LOW…p/features/book/service/book-command-legacy-adapter.ts179async function patchLegacyShelfMembership(CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts42async function reconcileLegacyBookChangeSet(CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts65export function invalidateLegacyBookRecommendations(queryClient: QueryClient): Promise<void> {CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts69export async function reconcileBookCacheChangeSet(CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts88async function reconcilePatchedLegacyBookChangeSet(CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts179export function invalidateDeletedBookQueries(queryClient: QueryClient, bookIds: Iterable<number>): void {CODE
LOW…end/src/app/features/book/service/legacy-book-cache.ts246export function patchAttachedBookFilesInLegacyCache(CODE
LOW…ontend/src/app/features/book/data/book-query-params.ts200export function normalizeBookCollectionFilterParams(CODE
LOW…c/app/features/book/data/book-command-pending-state.ts52export function injectPendingBookReadStatuses(): Signal<ReadonlyMap<number, BookReadStatus>> {CODE
LOW…c/app/features/book/data/book-command-pending-state.ts59export function injectPendingBookShelfMembership(): Signal<ReadonlyMap<number, PendingShelfMembership>> {CODE
LOW…c/app/features/book/data/book-command-pending-state.ts80export function injectPendingBookProgressResets(): Signal<ReadonlyMap<number, BookProgressSource>> {CODE
LOW…c/app/features/book/data/book-command-pending-state.ts87export function injectPendingBookDeletions(): Signal<ReadonlySet<number>> {CODE
LOW…app/features/book/data/shelf-definition-query-cache.ts5export function invalidateShelfDefinitions(client: QueryClient): Promise<void> {CODE
LOWfrontend/src/app/features/book/data/book-query-cache.ts18export function invalidateBookCollections(queryClient: QueryClient): Promise<void> {CODE
LOWfrontend/src/app/features/book/data/book-query-cache.ts22export function invalidateBookRecommendations(queryClient: QueryClient): Promise<void> {CODE
LOW…tures/readers/pdf-reader/utils/annotation-converter.ts31function toSerializableAnnotationTransferItem(item: AnnotationTransferItem): SerializableAnnotationTransferItem {CODE
LOW…features/readers/cbx-reader/core/cbx-reader-storage.ts13export function clampStripMaxWidthPercent(n: number | null | undefined): number {CODE
LOW…features/readers/cbx-reader/core/cbx-reader-storage.ts45export function writeStripWidthPercentPerBook(CODE
LOW…features/readers/cbx-reader/core/cbx-reader-storage.ts68export function dismissWebtoonHintForSession(bookId: number): void {CODE
LOW…features/readers/cbx-reader/core/cbx-reader-storage.ts76export function dismissWebtoonHintForever(): void {CODE
15 more matches not shown…
Decorative Section Separators12 hits · 36 pts
SeverityFileLineSnippetContext
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java52 // ── Helper methods ──────────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java122 // ── General tests ───────────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java170 // ── ISBN matching ───────────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java245 // ── External ID matching ────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java349 // ── Title + Author matching ─────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java450 // ── Directory matching ──────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java543 // ── Filename matching ───────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java632 // ── Strategy ordering (already-grouped exclusion) ───────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java695 // ── Target selection ────────────────────────────────────────COMMENT
MEDIUM…oklore/service/book/DuplicateDetectionServiceTest.java857 // ── Edge cases ──────────────────────────────────────────────COMMENT
MEDIUMscripts/release/docker-buildx-push.sh4# =======================COMMENT
MEDIUMscripts/release/docker-buildx-push.sh6# =======================COMMENT
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippetContext
HIGH…a/org/booklore/util/epub/CoverDetectorServiceTest.java0<?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">STRING
HIGH…ore/service/kobo/KoboSpanMapExtractionServiceTest.java0<?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">STRING
HIGH…vice/metadata/extractor/EpubMetadataExtractorTest.java0<?xml version="1.0" encoding="utf-8"?> <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">STRING
Over-Commented Block11 hits · 11 pts
SeverityFileLineSnippetContext
LOWfrontend/src/assets/foliate/mobi.js941 serializer = new XMLSerializer()COMMENT
LOWfrontend/src/assets/foliate/paginator.js421 this.#observer.disconnect()COMMENT
LOWfrontend/src/assets/foliate/paginator.js441 #margin = 0COMMENT
LOWfrontend/src/assets/foliate/paginator.js701 // `a` be the gap percentage. The actual percentage for the column gapCOMMENT
LOWdeploy/compose/docker-compose.yml21 # ALLOWED_ORIGINS=COMMENT
LOWdeploy/helm/grimmory/values.yaml41 enabled: falseCOMMENT
LOWdeploy/helm/grimmory/values.yaml61# This section builds out the service account more information can be found here: https://kubernetes.io/docs/concepts/seCOMMENT
LOWdeploy/helm/grimmory/values.yaml81securityContext: {}COMMENT
LOWdeploy/helm/grimmory/values.yaml101 # kubernetes.io/tls-acme: "true"COMMENT
LOWdeploy/helm/grimmory/values.yaml181COMMENT
LOW.github/cliff.toml121 { message = "^revert", group = "<!-- 9 -->Revert" },COMMENT
Structural Annotation Overuse7 hits · 10 pts
SeverityFileLineSnippetContext
LOWREADME.md64### Step 1: Environment ConfigurationCOMMENT
LOWREADME.md92### Step 2: Docker ComposeCOMMENT
LOWREADME.md154### Step 3: LaunchCOMMENT
LOWdocs/OIDC-Setup-With-PocketID.md23### Step 1: Install and Configure Pocket IDCOMMENT
LOWdocs/OIDC-Setup-With-PocketID.md27### Step 2: Add a clientCOMMENT
LOWdocs/OIDC-Setup-With-PocketID.md42### Step 3: Configure Grimmory OIDC SettingsCOMMENT
LOWdocs/OIDC-Setup-With-PocketID.md54### Step 4: Test the IntegrationCOMMENT
AI Response Leakage1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHCONTRIBUTING.md126### I've implemented something and want to submit itCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…ooklore/service/metadata/writer/CbxMetadataWriter.java423 // This is more robust than System.setProperty() because it is per-instance andCOMMENT