AI Slop Code Risk Monitor

bookorbit/bookorbit

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

BookOrbit: Your Reading Space

2.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for bookorbit/bookorbit, a TypeScript project with 6,013 GitHub stars. SynthScan examined 1,275,977 lines of code across 5269 source files, recording 1542 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 2.2 (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.

2.2
Adjusted Signal
2.2
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
6.0K
Stars
TypeScript
Language
1.3M
Lines of Code
5.3K
Files
1.5K
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 3.3/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 3.6/100 · LOW

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

Agent Over-Engineering Ratio 6.5/100 · LOW

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

PR Review Velocity Impact 9.7/100 · LOW

Which changes need focused human review? 1542 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 38HIGH 7MEDIUM 337LOW 1160

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 1542 distinct pattern matches across 11 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.

Decorative Section Separators315 hits · 952 pts
SeverityFileLineSnippetContext
MEDIUMserver/test/file-rename.e2e-spec.ts61// ── Helpers ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts88// ── Suite ────────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts104 // ── 1. book_per_file — flat structure ──────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts205 // ── 2. book_per_file — nested / cross-directory move ──────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts281 // ── 3. book_per_file — series pattern ────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts322 // ── 4. book_per_folder — flat folder rename ───────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts366 // ── 5. book_per_folder — nested hierarchy ────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts404 // ── 6. book_per_folder — multi-file book ─────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts445 // ── 7. Collision detection ────────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts505 // ── 8. no_pattern — missing tokens ───────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts551 // ── 9. fileRenameEnabled=false ────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts590 // ── 10. Special characters in title ──────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts674 // ── 11. Preview API — pagination and filter ───────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts740 // ── 12. SSE streaming execute endpoint ───────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts797 // ── 13. Idempotency ───────────────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts830 // ── 14. Concurrent execution prevention ──────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts861 // ── 15. book_per_folder — no change to folder, file rename only ───────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts895 // ── 16. Empty library ─────────────────────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts925 // ── 17. Mixed mode — book_per_file with year pattern ─────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts961 // ── 18. book_per_file with original filename fallback ─────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts985 // ── 19. Preview cache invalidation ───────────────────────────────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts1014 // ── 20. book_per_folder — target folder held by another book ──────────────COMMENT
MEDIUMserver/test/file-rename.e2e-spec.ts1092 // ── 21. Non-existent library ──────────────────────────────────────────────COMMENT
MEDIUM…er/test/e2e/file-rename/file-rename-fixture-builder.ts91// ── Factory helpers ──────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/common/utils/fs-stability.utils.test.ts24// ── FAST PATHS ────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/common/utils/fs-stability.utils.test.ts44// ── POLLING UNTIL STABLE ──────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/common/utils/fs-stability.utils.test.ts84// ── DEADLINE HIT ──────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/common/utils/fs-stability.utils.test.ts102// ── FILE DISAPPEARS DURING POLLING ────────────────────────────────────────────COMMENT
MEDIUMserver/src/common/utils/fs-stability.utils.test.ts119// ── knownMtimeMs parameter ────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts15// ── Shared helpers ─────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts36// ── CBR: node-unrar-js ─────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts58// ── Freshness ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts95// ── Service ────────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts179 // ── CBZ ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts197 // ── CBR ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts251 // ── CB7 ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/reader/cbz/cbz.service.ts301 // ── Public API ────────────────────────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/library/library.controller.ts247 // ── Library access management ─────────────────────────────────────────────COMMENT
MEDIUMserver/src/modules/library/library.controller.ts296 // ── Bulk rename ────────────────────────────────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts391 // ── Highlight of the Day ────────────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts494 // ── Monthly Challenge (raw data) ────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts795 // ── Year Projection (raw data) ─────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts838 // ── Neglected Gems ──────────────────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts894 // ── Reading DNA (raw data) ──────────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts1028 // ── The Long Wait ───────────────────────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts1098 // ── Shelf Diversity Score (raw data) ────────────────────────────COMMENT
MEDIUM…r/src/modules/dashboard/dashboard-widget.repository.ts1168 // ── Reading Rhythm (raw daily data) ─────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts15// ── Date Helpers ─────────────────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts92// ── Highlight of the Day ────────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts108// ── Monthly Mini Challenge ──────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts200// ── Year-End Projection ─────────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts240// ── Reading DNA ─────────────────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts357// ── Shelf Diversity Score ───────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts414// ── Reading Rhythm Pulse ────────────────────────────────────────────COMMENT
MEDIUM…src/modules/dashboard/dashboard-widget.calculations.ts450// ── Currently Reading resume modes ──────────────────────────────────COMMENT
MEDIUM…ules/file-write/formats/fb2/fb2-description-builder.ts199 // ── title-info ─────────────────────────────────────────────────────────────COMMENT
MEDIUM…ules/file-write/formats/fb2/fb2-description-builder.ts292 // ── publish-info ───────────────────────────────────────────────────────────COMMENT
MEDIUM…ules/file-write/formats/fb2/fb2-description-builder.ts324 // ── custom-info ────────────────────────────────────────────────────────────COMMENT
MEDIUM…ules/file-write/formats/fb2/fb2-description-builder.ts341 // ── reassemble ─────────────────────────────────────────────────────────────COMMENT
MEDIUM…rc/modules/chapter-health/chapter-health.repository.ts309 // ── Worker ──────────────────────────────────────────────────────────────────COMMENT
255 more matches not shown…
Hyper-Verbose Identifiers724 hits · 766 pts
SeverityFileLineSnippetContext
LOW…ugin/bookorbit.koplugin/bookorbit_catalog_download.lua49local function resolveRelativeDownloadPath(download_dir, filename, filetype, device_path, filename_override)CODE
LOWkoreader-plugin/bookorbit.koplugin/bookorbit_sweep.lua950local function exchangeBookmarksForEntry(ctx, entry, apply_mode, pending)CODE
LOWkoreader-plugin/bookorbit.koplugin/bookorbit_sweep.lua1105local function stepAnnotationsLegacyNext(ctx)CODE
LOWserver/test/scanner-file-operations.e2e-spec.ts891async function assertScenarioExpectations(CODE
LOWserver/test/auth-session-security.e2e-spec.ts151async function findRefreshTokenByRawToken(db: Db, rawToken: string) {CODE
LOWserver/test/jump-buckets-invariant.e2e-spec.ts66function expectedCategoryBucketKey(book: SeededBook, field: 'language' | 'format' | 'readStatus'): string {CODE
LOWserver/test/jump-buckets-invariant.e2e-spec.ts71function expectedTemporalBucketKey(value: string | null, granularity: TemporalJumpBucketGranularity | null): string {CODE
LOWserver/test/metadata-write.e2e-spec.ts1849async function prepareLibraryWithAllFormats(CODE
LOWserver/test/metadata-write.e2e-spec.ts1902function buildAtomicityFailurePayload(failpoint: MetadataUpdateFailpoint) {CODE
LOWserver/test/metadata-write.e2e-spec.ts1953async function readMetadataMutationState(context: MetadataWriteE2EContext, bookId: number) {CODE
LOWserver/test/authorization-matrix.e2e-spec.ts1773 function extractKoboEntitlementIds(entitlements: unknown[]): string[] {CODE
LOWserver/test/library-admin-workflows.e2e-spec.ts63async function uploadLibraryFileWithRawQuery(CODE
LOWserver/test/auth-recovery-oidc-logout.e2e-spec.ts114async function createAuthRecoveryContext(): Promise<AuthRecoveryContext> {CODE
LOWserver/test/auth-recovery-oidc-logout.e2e-spec.ts255async function waitForStablePasswordResetTokenCount(db: Db, expected: number, stableMs = 300, timeoutMs = 4_000): PromisCODE
LOWserver/test/app-settings-oidc-contract.e2e-spec.ts230async function createOidcContractContext(): Promise<OidcContractContext> {CODE
LOWserver/test/e2e/app-harness.ts212export async function triggerAndWaitForLibraryScan(ctx: E2EContext, libraryId: number, timeoutMs = 30_000): Promise<typeCODE
LOWserver/test/e2e/app-harness.ts439export async function assertNoIntegrityViolations(db: Db): Promise<void> {CODE
LOW…ader-state-isolation/reader-state-isolation-harness.ts158export async function triggerAndWaitForLibraryScan(CODE
LOW…te-isolation/reader-state-isolation-fixture-builder.ts20export async function createReaderStateIsolationFixtureRoot(prefix = 'reader-state-isolation-e2e-'): Promise<ReaderStateCODE
LOWserver/test/e2e/opds/opds-harness.ts152export async function triggerAndWaitForLibraryScan(CODE
LOWserver/test/e2e/book-dock/book-dock-fixture-builder.ts18export async function createBookDockFixtureRoot(prefix = 'book-dock-e2e-'): Promise<BookDockFixtureRoot> {CODE
LOW…rver/test/e2e/metadata-write/metadata-write-harness.ts189export async function setLibraryFileWriteSettings(db: Db, libraryId: number, patch: LibraryFileWritePatch): Promise<voidCODE
LOW…rver/test/e2e/metadata-write/metadata-write-harness.ts209export async function triggerAndWaitForLibraryScan(CODE
LOW…t/e2e/metadata-write/metadata-write-fixture-builder.ts102export async function createMetadataWriteFixtureRoot(prefix = 'metadata-write-e2e-'): Promise<MetadataWriteFixtureRoot> CODE
LOW…test/e2e/metadata-lock/metadata-lock-test-providers.ts7export function createMetadataLockTestProviders(getCoverUrl: (providerKey: MetadataProviderKey) => string): IdentifiableCODE
LOW…test/e2e/metadata-lock/metadata-lock-test-providers.ts32export function buildMetadataLockCandidates(CODE
LOW…est/e2e/metadata-lock/metadata-lock-fixture-builder.ts45export async function createMetadataLockFixtureRoot(prefix = 'metadata-lock-e2e-'): Promise<MetadataLockFixtureRoot> {CODE
LOW…est/e2e/metadata-lock/metadata-lock-fixture-builder.ts51export async function createEpubWithCoverFixture(rootPath: string, relativePath: string, input: EpubWithCoverInput = {})CODE
LOWserver/test/e2e/metadata-lock/metadata-lock-harness.ts213export async function triggerAndWaitForLibraryScan(CODE
LOW…t/e2e/migration-booklore/migration-booklore-harness.ts104export async function resetMigrationBookloreState(ctx: MigrationBookloreE2EContext): Promise<void> {CODE
LOW…t/e2e/migration-booklore/migration-booklore-harness.ts285export function buildBookloreConnectionConfig(CODE
LOW…gration-booklore/migration-booklore-fixture-builder.ts649export async function seedCanonicalScenarioWithDuplicateUserStateRows(ctx: MigrationBookloreE2EContext): Promise<CanonicCODE
LOW…gration-booklore/migration-booklore-fixture-builder.ts677export async function seedCompatibilityScenario(ctx: MigrationBookloreE2EContext): Promise<CompatibilityScenario> {CODE
LOW…gration-booklore/migration-booklore-fixture-builder.ts836export async function seedMissingRequiredTablesScenario(ctx: MigrationBookloreE2EContext): Promise<Record<string, unknowCODE
LOW…gration-booklore/migration-booklore-fixture-builder.ts1052async function createCompatibilitySchema(conn: mysql.Connection): Promise<void> {CODE
LOW…gration-booklore/migration-booklore-fixture-builder.ts1075async function createMissingRequiredSchema(conn: mysql.Connection): Promise<void> {CODE
LOW…er/test/e2e/file-rename/file-rename-fixture-builder.ts108export async function buildBookPerFileWithSubdirs(libraryRoot: string): Promise<Array<{ relPath: string; stem: string }>CODE
LOW…er/test/e2e/file-rename/file-rename-fixture-builder.ts155export async function buildBookPerFolderMultiFile(CODE
LOW…ion-audiobookshelf/migration-audiobookshelf-harness.ts126export function buildBackupConnectionConfig(backupPath: string): Record<string, unknown> {CODE
LOW…ion-audiobookshelf/migration-audiobookshelf-harness.ts228export async function truncateMigrationScenarioTables(db: Db): Promise<void> {CODE
LOW…ion-audiobookshelf/migration-audiobookshelf-harness.ts272async function startAudiobookshelfContainer(paths: {CODE
LOW…ion-audiobookshelf/migration-audiobookshelf-harness.ts330async function stopAudiobookshelfContainer(service: AudiobookshelfService, captureLogs: boolean): Promise<void> {CODE
LOW…ion-audiobookshelf/migration-audiobookshelf-harness.ts363function setOrDeleteEnv(name: string, value: string | undefined): void {CODE
LOW…obookshelf/migration-audiobookshelf-fixture-builder.ts64export async function createAudiobookshelfMediaFixtures(sourceMediaRoot: string): Promise<void> {CODE
LOW…obookshelf/migration-audiobookshelf-fixture-builder.ts108export async function seedAudiobookshelfMigrationScenario(ctx: MigrationAudiobookshelfE2EContext): Promise<AudiobookshelCODE
LOW…ted/migration-calibre-web-automated-fixture-builder.ts72export async function seedStoppedCalibreWebAutomatedSource(instance: StoppedCalibreWebAutomatedInstance): Promise<CalibrCODE
LOW…ted/migration-calibre-web-automated-fixture-builder.ts111export async function seedCalibreWebAutomatedTargetScenario(CODE
LOW…b-automated/migration-calibre-web-automated-harness.ts130export function buildSnapshotConnectionConfig(ctx: MigrationCalibreWebAutomatedE2EContext): Record<string, unknown> {CODE
LOW…b-automated/migration-calibre-web-automated-harness.ts189async function startCalibreWebAutomatedContainer(paths: {CODE
LOW…b-automated/migration-calibre-web-automated-harness.ts256async function ensureRealProgressSchemas(service: CalibreWebAutomatedService): Promise<void> {CODE
LOW…b-automated/migration-calibre-web-automated-harness.ts289async function stopCalibreWebAutomatedContainer(service: CalibreWebAutomatedService): Promise<void> {CODE
LOW…b-automated/migration-calibre-web-automated-harness.ts293async function removeCalibreWebAutomatedContainer(service: CalibreWebAutomatedService, captureLogs: boolean, fixtureRootCODE
LOW…b-automated/migration-calibre-web-automated-harness.ts352function setOrDeleteEnv(name: string, value: string | undefined): void {CODE
LOW…e/authorization-matrix/authorization-matrix-harness.ts185export async function triggerAndWaitForLibraryScan(CODE
LOW…ization-matrix/authorization-matrix-fixture-builder.ts29export async function createAuthorizationFixtureRoot(prefix = 'authorization-matrix-e2e-'): Promise<AuthorizationMatrixFCODE
LOW…min-lifecycle/users-admin-lifecycle-fixture-builder.ts12export async function createUsersAdminLifecycleFixtureRoot(prefix = 'users-admin-lifecycle-e2e-'): Promise<UsersAdminLifCODE
LOWserver/test/e2e/email/email-harness.ts421export async function triggerAndWaitForLibraryScan(CODE
LOWserver/src/swagger.ts66async function loadSwaggerPluginMetadata(): Promise<void> {CODE
LOWserver/src/config/env.validation.ts11function isValidPostgresConnectionString(value: string): boolean {CODE
LOW⚡server/src/common/book-cover-storage.ts17export function bookCoverSlotThumbnailPath(appDataPath: string, bookId: number, medium: CoverMedium): string {CODE
664 more matches not shown…
Hallucination Indicators38 hits · 475 pts
SeverityFileLineSnippetContext
CRITICALserver/test/auth-recovery-oidc-logout.e2e-spec.ts243 const token = context.systemMailMock.sendPasswordReset.mock.calls.at(-1)?.[2];CODE
CRITICAL…c/modules/book-dock/book-dock-finalize.service.test.ts2220 expect(harness.storage.moveToPath.mock.calls.slice(3)).toHaveLength(3);CODE
CRITICAL…c/modules/book-dock/book-dock-finalize.service.test.ts2271 expect(harness.storage.moveToPath.mock.calls.map((call: string[]) => call[1])).toEqual([CODE
CRITICAL…c/modules/book-dock/book-dock-finalize.service.test.ts2290 expect(harness.storage.moveToPath.mock.calls.slice(3)).toEqual([CODE
CRITICAL…c/modules/book-dock/book-dock-finalize.service.test.ts2375 expect(harness.storage.moveToPath.mock.calls.map((call: string[]) => call[0])).toEqual([CODE
CRITICAL…ules/book-cover-store/book-cover-store.service.test.ts73 const imported = made.repository.importSlotWithoutStamp.mock.calls.map(([, medium, row]) => ({ ...row, bookId: 7, meCODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts36 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts43 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([{ oidcGroupClaim: 'admins', permissionName: 'manage_users'CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts44 db.tx.query.oidcPermissionGrants.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts45 db.tx.query.userPermissions.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts53 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([{ oidcGroupClaim: 'admins', permissionName: 'manage_users'CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts54 db.tx.query.oidcPermissionGrants.findMany.mockResolvedValue([{ userId: 42, providerId: 1, permissionName: 'manage_usCODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts55 db.tx.query.userPermissions.findMany.mockResolvedValue([{ userId: 42, permissionName: 'manage_users' }]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts63 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts67 db.tx.query.oidcPermissionGrants.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts68 db.tx.query.userPermissions.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts76 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts80 db.tx.query.oidcPermissionGrants.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts81 db.tx.query.userPermissions.findMany.mockResolvedValue([]);CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts89 db.tx.query.oidcGroupMappings.findMany.mockResolvedValue([{ oidcGroupClaim: 'admins', permissionName: 'manage_users'CODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts90 db.tx.query.oidcPermissionGrants.findMany.mockResolvedValue([{ userId: 42, providerId: 1, permissionName: 'manage_usCODE
CRITICAL⚡…c/modules/auth/oidc/oidc-group-mapping.service.test.ts91 db.tx.query.userPermissions.findMany.mockResolvedValue([{ userId: 42, permissionName: 'manage_users' }]);CODE
CRITICAL…c/modules/read-aloud/read-aloud-worker.service.test.ts471 const stored = t.activity.recordWorkerEvents.mock.calls.flatMap(([, events]) => (events as ReadAloudWorkerEvent[])CODE
CRITICAL…adata-preferences/metadata-preferences.service.test.ts240 const [globalWrite, libraryWrite] = db.__updateChain.set.mock.calls.map(([values]) => values as Record<string, unkCODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts196 db.__tx.query.appSettings.findFirst.mockResolvedValue({CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts234 db.__tx.query.appSettings.findFirst.mockResolvedValue({CODE
CRITICAL⚡…s/metadata-preferences/provider-config.service.test.ts246 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL⚡…s/metadata-preferences/provider-config.service.test.ts253 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL⚡…s/metadata-preferences/provider-config.service.test.ts260 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts277 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts289 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts299 db.__tx.query.appSettings.findFirst.mockResolvedValue({CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts316 db.__tx.query.appSettings.findFirst.mockResolvedValue({CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts329 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts341 db.__tx.query.appSettings.findFirst.mockResolvedValue(undefined);CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts352 db.__tx.query.appSettings.findFirst.mockResolvedValue({ value: '{bad-json' });CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts454 db.__tx.query.appSettings.findFirst.mockResolvedValue({CODE
CRITICAL…s/metadata-preferences/provider-config.service.test.ts468 db.__tx.query.appSettings.findFirst.mockResolvedValue({ value: JSON.stringify({ google: { enabled: true, apiKey: 'g'CODE
Fake / Example Data398 hits · 412 pts
SeverityFileLineSnippetContext
LOWserver/test/file-rename.e2e-spec.ts534 await createEpubFile(join(lib.folderPath, 'no-pattern-book.epub'), 'placeholder');CODE
LOWserver/test/file-rename.e2e-spec.ts971 await createEpubFile(join(lib.folderPath, 'original-stem.epub'), 'placeholder');CODE
LOW…er/test/e2e/file-rename/file-rename-fixture-builder.ts55export async function createDummyFile(absolutePath: string, content = 'placeholder'): Promise<void> {CODE
LOW…er/test/e2e/file-rename/file-rename-fixture-builder.ts187 await createEpubFile(join(libraryRoot, relPath), 'placeholder');CODE
LOWserver/src/common/services/permission.service.test.ts11 name: 'Jane Doe',CODE
LOWserver/src/common/guards/permission.guard.test.ts16 name: 'Jane Doe',CODE
LOWserver/src/common/guards/jwt-auth.guard.test.ts13 name: 'Jane Doe',CODE
LOWserver/src/common/guards/library-access.guard.test.ts12 name: 'Jane Doe',CODE
LOWserver/src/modules/reader/epub/epub.service.test.ts261 creator: 'Jane Doe',CODE
LOWserver/src/modules/reader/epub/epub.service.test.ts291 expect(info.metadata).toMatchObject({ title: 'Reader Test', creator: 'Jane Doe', language: 'pt-BR', identifier: '000CODE
LOWserver/src/modules/reader/epub/epub.service.test.ts308 creator: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts20 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts28 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts56 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts90 authorsRepo.findByIdForEnrichment.mockResolvedValue({ id: 5, name: 'Jane Doe', bookCount: 0 });CODE
LOW…les/authors/author-enrichment-executor.service.test.ts157 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts181 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts251 name: 'Jane Doe',CODE
LOW…les/authors/author-enrichment-executor.service.test.ts437 expect(metadataFetch.collectByProvider).toHaveBeenCalledWith(expect.objectContaining({ name: 'Jane Doe' }), expectCODE
LOW…les/authors/author-enrichment-executor.service.test.ts464 authorsRepo.findByIdForEnrichment.mockResolvedValue({ id: 5, name: 'Jane Doe', description: 'Existing bio', hasPhoCODE
LOWserver/src/modules/authors/authors.service.test.ts259 name: 'Jane Doe',CODE
LOWserver/src/modules/authors/authors.service.test.ts291 authorsRepo.findById.mockResolvedValue({ id: 25, name: 'Jane Doe', sortName: null, description: 'Bio', bookCount: 1,CODE
LOWserver/src/modules/authors/authors.service.test.ts311 name: 'John Doe',CODE
LOWserver/src/modules/authors/authors.controller.test.ts150 const candidate = { provider: 'audnexus', providerId: 'x1', name: 'Jane Doe' };CODE
LOWserver/src/modules/authors/authors.controller.test.ts215 const cached = { provider: 'audnexus', providerId: 'x1', name: 'Jane Doe', cache: { fetchedAt: '2026-09-01T00:00:00.CODE
LOW…src/modules/authors/dto/authors-dto-validation.test.ts87 q: 'Jane Doe',CODE
LOW…src/modules/authors/dto/authors-dto-validation.test.ts99 q: 'Jane Doe',CODE
LOW…src/modules/authors/dto/authors-dto-validation.test.ts107 q: 'Jane Doe',CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts330 search: vi.fn().mockResolvedValue([{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' }]),CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts331 lookupById: vi.fn().mockResolvedValue({ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe', description: 'CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts339 await service.search({ name: 'Jane Doe' });CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts377 expect(request.descriptor).toEqual({ inputs: { name: 'Jane Doe', region: 'ca' } });CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts378 expect(provider.search).toHaveBeenCalledWith(expect.objectContaining({ name: 'Jane Doe', region: 'ca' }));CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts385 value: [{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' }],CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts393 await expect(service.searchDetailed({ name: 'Jane Doe' })).resolves.toEqual({CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts394 candidates: [{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe', cache: { fetchedAt: '2026-09-01T00:00:0CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts404 const [candidate] = await service.search({ name: 'Jane Doe' });CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts412 value: [{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' }],CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts420 const emitted = await firstValueFrom(service.stream({ name: 'Jane Doe' }).pipe(toArray()));CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts423 { provider: 'audnexus', providerId: 'A1', name: 'Jane Doe', cache: { fetchedAt: '2026-08-01T00:00:00.000Z', stalCODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts430 value: { provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' },CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts452 value: [{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' }],CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts461 value: { provider: 'audnexus', providerId: 'A1', name: 'Jane Doe', description: 'Bio' },CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts470 const result = await service.quickSearchDetailed({ name: 'Jane Doe' }, { directive: { policy: 'refresh', allowFallCODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts473 candidate: { provider: 'audnexus', providerId: 'A1', name: 'Jane Doe', description: 'Bio' },CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts487 value: [{ provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' }],CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts495 value: { provider: 'audnexus', providerId: 'A1', name: 'Jane Doe' },CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts503 value: [{ provider: 'goodreads', providerId: 'G1', name: 'Jane Doe' }],CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts509 value: { provider: 'goodreads', providerId: 'G1', name: 'Jane Doe' },CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts515 const result = await service.collectByProvider({ name: 'Jane Doe' }, ['audnexus', 'goodreads'] as never, {CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts644 .mockResolvedValueOnce(jsonResponse([{ asin: 'B1', name: 'Jane Doe' }]))CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts645 .mockResolvedValueOnce(jsonResponse({ asin: 'B1', name: 'Jane Doe', description: 'Bio' }))CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts648 await service.quickSearchDetailed({ name: 'Jane Doe' });CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts649 const refreshed = await service.quickSearchDetailed({ name: 'Jane Doe' }, { directive: { policy: 'refresh', allowFCODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts662 .mockResolvedValueOnce(jsonResponse([{ asin: 'B1', name: 'Jane Doe' }]))CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts663 .mockResolvedValueOnce(jsonResponse({ asin: 'B1', name: 'Jane Doe' }))CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts666 await service.quickSearchDetailed({ name: 'Jane Doe' });CODE
LOW⚡…authors/metadata/author-metadata-fetch.service.test.ts667 const refreshed = await service.quickSearchDetailed({ name: 'Jane Doe' }, { directive: { policy: 'refresh', allowFCODE
LOW…authors/metadata/author-metadata-fetch.service.test.ts360 await service.quickSearchDetailed({ name: 'Jane Doe' }, { directive });CODE
LOW…authors/metadata/author-metadata-fetch.service.test.ts441 name: 'Jane Doe',CODE
338 more matches not shown…
Cross-Language Confusion (JS/TS)7 hits · 48 pts
SeverityFileLineSnippetContext
HIGH…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts28 print(json.dumps({"errorClass": exc.__class__.__name__, "error": str(exc), "unavailable": True}), file=sys.stderr)CODE
HIGH…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts43 return TrueCODE
HIGH⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts87 print(json.dumps(last_result))CODE
HIGH⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts90 print(json.dumps(last_result))CODE
HIGH⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts102 print(json.dumps(last_result))CODE
HIGH⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts105 print(json.dumps(last_error or {"errorClass": "KoboCloudscraperError", "error": "no response"}), file=sys.stderr)CODE
HIGH⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts113 print(json.dumps({"errorClass": exc.__class__.__name__, "error": str(exc)}), file=sys.stderr)CODE
AI Slop Vocabulary19 hits · 44 pts
SeverityFileLineSnippetContext
MEDIUM…ugin/spec/bookorbit_open_annotation_scheduler_test.lua78assertEqual(#harness.timers, 2, "replacement keeps old timer callback queued")CODE
MEDIUM…ugin/spec/bookorbit_open_annotation_scheduler_test.lua92assertEqual(#harness.timers, 1, "match success schedules another settled sync")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_chunking_test.lua64 for index = #harness.history, 1, -1 doCODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_chunking_test.lua138 assertEqual(#harness.calls.match, 0, "books verified inside the age bound issue no match request")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua93 assertEqual(#harness.calls.match, 1, "one match batch goes out")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua105 assertEqual(#harness.calls.page_stats, 1, "only that book uploads reading data")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua122 assertEqual(#harness.calls.match, 1, "one match batch goes out")CODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua241 assertEqual(#harness.calls.page_stats, 1, "a replacement server file receives historical reading data")CODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua242 assertEqual(#harness.calls.page_stats[1][1].events, 1, "the historical event is included in the upload")CODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua246 assertEqual(#harness.calls.annotation_exchanges, 1, "a replacement server file forces an annotation exchange")CODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua247 assertEqual(#harness.calls.annotation_exchanges[1].annotations, 1, "the replacement exchange carries the local annotCODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua252 assertEqual(#harness.calls.page_stats, 1, "the acknowledged history is not uploaded again")CODE
MEDIUM⚡koreader-plugin/spec/bookorbit_sweep_test.lua253 assertEqual(#harness.calls.annotation_exchanges, 1, "the acknowledged sidecar is not exchanged again")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua337 assertEqual(#harness.calls.page_stats, 1, "only the collision row with new events uploads")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua380 assertEqual(#harness.calls.page_stats, 0, "an unbound collision row is never attributed by guesswork")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua403 assertEqual(#harness.calls.match, 0, "no request has gone out yet")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua415 assertEqual(#harness.calls.match, 0, "the step scheduled by the cancelled run issues no request")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua493 assertEqual(#harness.calls.pending, case.asked, case.label .. ": pending books asked for")CODE
MEDIUMkoreader-plugin/spec/bookorbit_sweep_test.lua494 assertEqual(#harness.calls.annotation_exchanges, case.exchanged, case.label .. ": exchanges")CODE
Over-Commented Block15 hits · 15 pts
SeverityFileLineSnippetContext
LOWserver/src/db/schema/reader.ts241 koboLocationValue: varchar('kobo_location_value', { length: 255 }),COMMENT
LOWserver/src/db/schema/download-clients.ts161 // and the attempt list are read in. `created_at` served neither: two attempts inserted in oneCOMMENT
LOWserver/src/modules/tts/tts-text-extractor.service.ts41 const BLOCK_SPLIT_RE =COMMENT
LOW…/modules/file-write/formats/mobi/mobi-test-fixtures.ts1// Builds structurally valid PalmDB/MOBI buffers in memory so the writer suite neverCOMMENT
LOW…/modules/file-write/formats/mobi/mobi-header-record.ts1// Record 0 (and the KF8 boundary record in dual-format files) layout:COMMENT
LOWserver/src/modules/file-write/formats/mobi/palmdb.ts1// PalmDB container layout shared by MOBI, AZW3 and AZW:COMMENT
LOW…les/metadata-fetch/providers/metadata-search-params.ts21 // Pins a Hardcover refresh to a previously chosen edition instead of re-deriving one by ISBN.COMMENT
LOWserver/src/modules/scanner/lib/walk.test.ts901 const second = await findBookCandidates(root, [], undefined, first.dirMtimes);COMMENT
LOWserver/src/modules/scanner/lib/walk.ts141 // Safety rules:COMMENT
LOWserver/src/modules/metadata/lib/mobi-parser.ts1import { readFile } from 'fs/promises';COMMENT
LOW…/modules/reading-session/reading-session.repository.ts201 // A row already exists for this sessionId, and that is usually deliberate rather than aCOMMENT
LOWclient/public/assets/foliate/paginator.js241COMMENT
LOWclient/public/assets/foliate/paginator.js461 #footerCOMMENT
LOWclient/public/assets/foliate/paginator.js721 // To make them the same, we start by shrinking the outer paddingCOMMENT
LOWclient/src/features/book/lib/cover-tint.ts21// The winning bucket sets the hue, but its own saturation is clamped: too lowCOMMENT
Structural Annotation Overuse7 hits · 14 pts
SeverityFileLineSnippetContext
LOWdocs/DEVELOPMENT.md101#### Step 1 - Clone the repositoryCOMMENT
LOWdocs/DEVELOPMENT.md110#### Step 2 - Create your environment fileCOMMENT
LOW⚡docs/DEVELOPMENT.md122#### Step 3 - Install dependenciesCOMMENT
LOW⚡docs/DEVELOPMENT.md130#### Step 4 - Start PostgreSQLCOMMENT
LOW⚡docs/DEVELOPMENT.md140#### Step 5 - Apply database migrationsCOMMENT
LOW⚡docs/DEVELOPMENT.md148#### Step 6 - Seed baseline dataCOMMENT
LOW⚡docs/DEVELOPMENT.md156#### Step 7 - Start the appCOMMENT
Deep Nesting13 hits · 13 pts
SeverityFileLineSnippetContext
LOWkoreader-plugin/tools/build_buddy_sprites.py158CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py644CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py734CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py810CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py858CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py936CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py980CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py1098CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py1163CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py1223CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py1271CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py1365CODE
LOWkoreader-plugin/tools/build_buddy_sprites.py254CODE
Modern AI Meta-Vocabulary3 hits · 7 pts
SeverityFileLineSnippetContext
MEDIUMrelease.config.js168 // to curate. Rendered inside the scaffold's HTML comment (never shown publicly)COMMENT
MEDIUMdocs/RELEASE_PROCESS.md119semantic-release creates the GitHub release as a **draft** with a `## Highlights` scaffold (added by `release.config.js`CODE
MEDIUMdocs/DEVELOPMENT.md69├── scripts/ # Bootstrap, DB reset, E2E orchestrationCODE
Excessive Try-Catch Wrapping3 hits · 4 pts
SeverityFileLineSnippetContext
LOW…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts27except Exception as exc:CODE
LOW⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts92 except Exception as exc:CODE
LOW⚡…data-fetch/providers/kobo/kobo-cloudscraper.fetcher.ts112 except Exception as exc:CODE