AI Slop Code Risk Monitor

papra-hq/papra

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

The minimalistic document archiving platform.

3.6 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for papra-hq/papra, a TypeScript project with 5,609 GitHub stars. SynthScan examined 181,980 lines of code across 1461 source files, recording 641 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 3.6 (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.

3.6
Adjusted Signal
3.6
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
5.6K
Stars
TypeScript
Language
182.0K
Lines of Code
1.5K
Files
641
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 12.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 5.3/100 · LOW

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

Agent Over-Engineering Ratio 11.3/100 · LOW

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

PR Review Velocity Impact 16.3/100 · LOW

Which changes need focused human review? 641 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 1MEDIUM 1LOW 639

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

Hyper-Verbose Identifiers436 hits · 436 pts
SeverityFileLineSnippetContext
LOWpackages/lecture/src/utils/archive.ts3export async function getFileContentFromArchive({CODE
LOWpackages/lecture/src/tesseract/tesseract.usecases.ts30export function createTesseractCliExtractor({CODE
LOWpackages/lecture/src/tesseract/tesseract.usecases.ts53export function createTesseractJsExtractor({CODE
LOW…/cli/src/commands/import/paperless/paperless.wizard.ts422function isDocumentAlreadyExistsError(error: unknown): boolean {CODE
LOW⚡packages/webhooks/src/handler/handler.errors.ts1export function createInvalidSignatureError() {CODE
LOW⚡packages/webhooks/src/handler/handler.errors.ts7export function createUnsupportedSignatureVersionError() {CODE
LOW⚡packages/webhooks/src/handler/handler.errors.ts16export function createInvalidSignatureFormatError() {CODE
LOWapps/papra-server/src/scripts/create-migration.ts20async function getLastMigrationFilePrefixNumber() {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts22export function buildOrganizationsApiRoutes(deps: ApiDependencies) {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts33function setupGetOrganizationsRoute({ resolveAuthenticationContext, db }: ApiDependencies) {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts53function setupGetDeletedOrganizationsRoute({ resolveAuthenticationContext, db }: ApiDependencies) {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts75function setupCreateOrganizationRoute({CODE
LOW…/src/modules/organizations/organizations.api.routes.ts107function setupGetOrganizationRoute({ resolveAuthenticationContext, db }: ApiDependencies) {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts131function setupUpdateOrganizationRoute({ resolveAuthenticationContext, db }: ApiDependencies) {CODE
LOW…/src/modules/organizations/organizations.api.routes.ts156function setupSoftDeleteOrganizationRoute({CODE
LOW…rver/src/modules/organizations/organizations.models.ts6export function canUserRemoveMemberFromOrganization({CODE
LOW…rver/src/modules/organizations/organizations.models.ts28export function getUserMaxOrganizationCount({CODE
LOW…/src/modules/organizations/organizations.repository.ts31export function createOrganizationsRepository({ db }: { db: Database }) {CODE
LOW…/src/modules/organizations/organizations.repository.ts179async function clearUserDeletedByReferences({ userId, db }: { userId: string; db: Database }) {CODE
LOW…/src/modules/organizations/organizations.repository.ts203async function getUserOwnedOrganizationCount({ userId, db }: { userId: string; db: Database }) {CODE
LOW…/src/modules/organizations/organizations.repository.ts256async function getOrganizationMembersCount({CODE
LOW…/src/modules/organizations/organizations.repository.ts310async function removeUserFromOrganization({CODE
LOW…/src/modules/organizations/organizations.repository.ts329async function updateOrganizationMemberRole({CODE
LOW…/src/modules/organizations/organizations.repository.ts347async function getOrganizationMemberByUserId({CODE
LOW…/src/modules/organizations/organizations.repository.ts369async function getOrganizationMemberByMemberId({CODE
LOW…/src/modules/organizations/organizations.repository.ts391async function saveOrganizationInvitation({CODE
LOW…/src/modules/organizations/organizations.repository.ts435async function getTodayUserInvitationCount({CODE
LOW…/src/modules/organizations/organizations.repository.ts467async function getPendingOrganizationInvitationsForEmail({CODE
LOW…/src/modules/organizations/organizations.repository.ts502async function getOrganizationInvitationById({CODE
LOW…/src/modules/organizations/organizations.repository.ts521async function updateOrganizationInvitation({CODE
LOW…/src/modules/organizations/organizations.repository.ts553async function getPendingInvitationsCount({CODE
LOW…/src/modules/organizations/organizations.repository.ts587async function getPendingInvitationForEmailAndOrganization({CODE
LOW…/src/modules/organizations/organizations.repository.ts612async function getOrganizationMemberByEmail({CODE
LOW…/src/modules/organizations/organizations.repository.ts634async function getOrganizationInvitations({CODE
LOW…/src/modules/organizations/organizations.repository.ts653async function updateExpiredPendingInvitationsStatus({CODE
LOW…/src/modules/organizations/organizations.repository.ts676async function getOrganizationPendingInvitationsCount({CODE
LOW…/src/modules/organizations/organizations.repository.ts706async function deleteAllMembersFromOrganization({CODE
LOW…/src/modules/organizations/organizations.repository.ts718async function deleteAllOrganizationInvitations({CODE
LOW…/src/modules/organizations/organizations.repository.ts770async function getUserDeletedOrganizations({CODE
LOW…/src/modules/organizations/organizations.repository.ts795async function getExpiredSoftDeletedOrganizations({CODE
LOW…dules/organizations/organizations.repository.models.ts30export function createSearchOrganizationWhereClause({ search }: { search?: string }) {CODE
LOW…er/src/modules/organizations/organizations.usecases.ts66export async function ensureUserIsInOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts85export async function checkIfUserCanCreateNewOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts108export async function getOrCreateOrganizationCustomerId({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts108export async function getOrCreateOrganizationCustomerId({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts145export async function ensureUserIsOwnerOfOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts163export async function removeMemberFromOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts212export async function checkIfUserHasReachedOrganizationInvitationLimit({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts233export function buildInviteMemberToOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts377export async function sendOrganizationInvitationEmail({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts416export async function updateOrganizationMemberRole({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts463export function buildResendOrganizationInvitation({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts598export async function getOrganizationStorageLimits({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts710export async function purgeExpiredSoftDeletedOrganization({CODE
LOW…er/src/modules/organizations/organizations.usecases.ts765export async function purgeExpiredSoftDeletedOrganizations({CODE
LOW…rver/src/modules/organizations/organizations.routes.ts28export function registerOrganizationsRoutes(context: RouteDefinitionContext) {CODE
LOW…rver/src/modules/organizations/organizations.routes.ts38function setupGetOrganizationMembersRoute({ app, db }: RouteDefinitionContext) {CODE
LOW…rver/src/modules/organizations/organizations.routes.ts62function setupRemoveOrganizationMemberRoute({ app, db }: RouteDefinitionContext) {CODE
LOW…rver/src/modules/organizations/organizations.routes.ts92function setupUpdateOrganizationMemberRoute({ app, db }: RouteDefinitionContext) {CODE
LOW…rver/src/modules/organizations/organizations.routes.ts158function setupInviteOrganizationMemberRoute({CODE
376 more matches not shown…
Fake / Example Data187 hits · 193 pts
SeverityFileLineSnippetContext
LOW…kages/lecture/src/tesseract/tesseract.usecases.test.ts6 // Lorem ipsum image in base64COMMENT
LOW…kages/lecture/src/tesseract/tesseract.usecases.test.ts20 expect(result).to.eql('Lorem ipsum dolor sit amet');CODE
LOW…kages/lecture/src/tesseract/tesseract.usecases.test.ts20 expect(result).to.eql('Lorem ipsum dolor sit amet');CODE
LOW…c/modules/organizations/organizations.usecases.test.ts464 { id: 'user-2', email: 'admin@example.com' },CODE
LOW…c/modules/organizations/organizations.usecases.test.ts1550 { id: 'admin-user', email: 'admin@example.com' },CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts253 email: 'user@example.com',CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts260 email: 'user@example.com',CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts272 email: 'user@example.com',CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts292 email: 'user@example.com',CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts317 email: 'user@example.com',CODE
LOW…/papra-server/src/modules/app/auth/auth.models.test.ts383 email: 'user@example.com',CODE
LOW…ra-server/src/modules/app/auth/auth.middleware.test.ts30 users: [{ id: 'user-1', email: 'user@example.com' }],CODE
LOW…ra-server/src/modules/app/auth/auth.middleware.test.ts54 users: [{ id: 'user-1', email: 'user@example.com' }],CODE
LOW…ra-server/src/modules/app/auth/auth.middleware.test.ts112 users: [{ id: 'user-1', email: 'user@example.com' }],CODE
LOW…ra-server/src/modules/app/auth/auth.middleware.test.ts143 users: [{ id: 'user-1', email: 'user@example.com' }],CODE
LOW…ra-server/src/modules/app/auth/auth.middleware.test.ts174 users: [{ id: 'user-1', email: 'user@example.com' }],CODE
LOW…les/admin/organizations/organizations.usecases.test.ts34 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts87 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts167 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts223 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts277 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts311 { id: adminId, email: 'admin@example.com' },CODE
LOW…les/admin/organizations/organizations.usecases.test.ts354 { id: adminId, email: 'admin@example.com' },CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts11 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts37 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts66 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts95 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts139 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts162 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts181 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts231 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts260 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts279 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts317 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts349 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts368 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts406 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts439 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts458 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts496 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts521 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…ules/admin/organizations/e2e/organizations.e2e.test.ts540 users: [{ id: 'usr_regular', email: 'user@example.com' }],CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts19 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts62 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts105 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts143 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts189 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts214 users: [{ id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' }],CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts239 { id: 'usr_regular', email: 'user@example.com' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts289 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts326 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts368 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts392 { id: 'usr_regular', email: 'user@example.com' },CODE
LOW…/modules/admin/users/e2e/plan-entitlements.e2e.test.ts429 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…a-server/src/modules/admin/users/e2e/users.e2e.test.ts15 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…a-server/src/modules/admin/users/e2e/users.e2e.test.ts16 { id: 'usr_regular', email: 'user@example.com', name: 'Regular User' },CODE
LOW…a-server/src/modules/admin/users/e2e/users.e2e.test.ts40 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
LOW…a-server/src/modules/admin/users/e2e/users.e2e.test.ts41 { id: 'usr_regular', email: 'user@example.com', name: 'Regular User' },CODE
LOW⚡…a-server/src/modules/admin/users/e2e/users.e2e.test.ts59 expect(body.users[0]?.email).to.eql('admin@example.com');CODE
LOW⚡…a-server/src/modules/admin/users/e2e/users.e2e.test.ts65 { id: 'usr_admin', email: 'admin@example.com', name: 'Admin User' },CODE
127 more matches not shown…
Verbosity Indicators6 hits · 10 pts
SeverityFileLineSnippetContext
LOW⚡…rver/src/modules/subscriptions/subscriptions.routes.ts161 // Step 1: Expire any active checkout sessions before creating a new oneCOMMENT
LOW⚡…rver/src/modules/subscriptions/subscriptions.routes.ts165 // Step 2: Cancel any incomplete subscriptions from previous failed attemptsCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts430 // Step 1: Upload a fileCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts444 // Step 2: Delete the document (soft delete)COMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts459 // Step 3: Upload the same file again - this should restore the original documentCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts472 // Step 5: Verify no orphan files remain in storageCOMMENT
Structural Annotation Overuse6 hits · 10 pts
SeverityFileLineSnippetContext
LOW⚡…rver/src/modules/subscriptions/subscriptions.routes.ts161 // Step 1: Expire any active checkout sessions before creating a new oneCOMMENT
LOW⚡…rver/src/modules/subscriptions/subscriptions.routes.ts165 // Step 2: Cancel any incomplete subscriptions from previous failed attemptsCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts430 // Step 1: Upload a fileCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts444 // Step 2: Delete the document (soft delete)COMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts459 // Step 3: Upload the same file again - this should restore the original documentCOMMENT
LOW…erver/src/modules/documents/documents.usecases.test.ts472 // Step 5: Verify no orphan files remain in storageCOMMENT
Magic Placeholder Names1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpackages/cli/src/commands/config/config.command.ts154 valueHint: 'your-api-key',CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWpackages/search-parser/README.md41// expression: {COMMENT
LOWpackages/search-parser/README.md101// operands: [COMMENT
LOWpackages/search-parser/README.md121// },COMMENT
LOW…erver/src/modules/ai-credits/rates/ai-credits.rates.ts21};COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…pra-server/src/modules/documents/documents.usecases.ts143 // We optimistically save the file to leverage streaming, if the file already exists, we will delete itCOMMENT