{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-ab297de05b4d074e", "name": "Stray `console.log` in TS/JS \u2014 electron/bookshelf-server.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/bookshelf-server.ts:133"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-842c23418e9e5dbc", "name": "Stray `console.log` in TS/JS \u2014 electron/diff-cache.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/diff-cache.ts:93"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c175c9f16795936f", "name": "Stray `console.log` in TS/JS \u2014 electron/parallel-tts-bridge.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/parallel-tts-bridge.ts:100"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39460f8992ffcda4", "name": "Stray `console.log` in TS/JS \u2014 electron/bilingual-assembly-bridge.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/bilingual-assembly-bridge.ts:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54c9efbc31f9c187", "name": "Stray `console.log` in TS/JS \u2014 electron/tts-bridge.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/tts-bridge.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e9c96fb85c53d1c", "name": "Stray `console.log` in TS/JS \u2014 electron/headless-ocr.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/headless-ocr.ts:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-883051bfac0831f0", "name": "TODO/FIXME marker in shipping code \u2014 electron/pdf-analyzer.ts:4299", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 electron/pdf-analyzer.ts:4299"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-086d6ff304c08302", "name": "Stray `console.log` in TS/JS \u2014 electron/pdf-analyzer.ts:1304", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-analyzer.ts:1304"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1015730b5f626b08", "name": "Stray `console.log` in TS/JS \u2014 electron/preload.ts:3023", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/preload.ts:3023"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-464865945dd46e19", "name": "Stray `console.log` in TS/JS \u2014 electron/book-analysis.ts:451", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/book-analysis.ts:451"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b103bc737c247d2", "name": "Stray `console.log` in TS/JS \u2014 electron/pdf-bridge.ts:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-bridge.ts:134"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a762a6719cc2cfa1", "name": "Stray `console.log` in TS/JS \u2014 electron/ocr-service.ts:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/ocr-service.ts:172"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b95156720941270", "name": "Stray `console.log` in TS/JS \u2014 electron/audiobook-logger.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/audiobook-logger.ts:97"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c4fda3d08f64293c", "name": "Stray `console.log` in TS/JS \u2014 electron/mutool-bridge.ts:190", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/mutool-bridge.ts:190"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b0ed6f7368ca487", "name": "Stray `console.log` in TS/JS \u2014 electron/video-assembly-bridge.ts:382", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/video-assembly-bridge.ts:382"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a05747d627f1c41f", "name": "Stray `console.log` in TS/JS \u2014 electron/e2a-env-bootstrap.ts:267", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/e2a-env-bootstrap.ts:267"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea6c306a665ed775", "name": "Stray `console.log` in TS/JS \u2014 electron/ll-jobs.ts:238", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/ll-jobs.ts:238"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1030c159e25845a1", "name": "Stray `console.log` in TS/JS \u2014 electron/epub-processor.ts:2944", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/epub-processor.ts:2944"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc4fbfa107786e6d", "name": "Stray `console.log` in TS/JS \u2014 electron/xtts-streaming-bridge.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/xtts-streaming-bridge.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54d62f263752e3de", "name": "Stray `console.log` in TS/JS \u2014 electron/jwpub-converter.ts:631", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/jwpub-converter.ts:631"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6149ae76b1050445", "name": "Stray `console.log` in TS/JS \u2014 electron/web-fetch-bridge.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/web-fetch-bridge.ts:122"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-095072d2c9e0fa4f", "name": "Stray `console.log` in TS/JS \u2014 electron/llama-bridge.ts:492", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/llama-bridge.ts:492"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-216c9286c1c40aab", "name": "Stray `console.log` in TS/JS \u2014 electron/language-learning-jobs.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/language-learning-jobs.ts:144"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-767ca2b3a252e142", "name": "TODO/FIXME marker in shipping code \u2014 electron/main.ts:8777", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 electron/main.ts:8777"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dfc87ed334513db1", "name": "Stray `console.log` in TS/JS \u2014 electron/main.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/main.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7eafd4cce168928c", "name": "Stray `console.log` in TS/JS \u2014 electron/translation-bridge.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/translation-bridge.ts:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8af2ddd6a05bd623", "name": "Stray `console.log` in TS/JS \u2014 electron/rolling-logger.ts:181", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/rolling-logger.ts:181"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6454cc8e9327655c", "name": "Stray `console.log` in TS/JS \u2014 electron/ebook-library.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/ebook-library.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0310a49b74acf28c", "name": "Stray `console.log` in TS/JS \u2014 electron/sentence-alignment-window.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/sentence-alignment-window.ts:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94e3b5c50a8c7139", "name": "Stray `console.log` in TS/JS \u2014 electron/tts-api-server.ts:188", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/tts-api-server.ts:188"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39c70b0d0128dc5a", "name": "Stray `console.log` in TS/JS \u2014 electron/pdf-worker-proxy.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-worker-proxy.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8460f92fbbcb518a", "name": "Stray `console.log` in TS/JS \u2014 electron/ebook-convert-bridge.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/ebook-convert-bridge.ts:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbccd1f7c325a842", "name": "Stray `console.log` in TS/JS \u2014 electron/reassembly-bridge.ts:292", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/reassembly-bridge.ts:292"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-349f1137a78bd38f", "name": "Stray `console.log` in TS/JS \u2014 electron/bilingual-processor.ts:245", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/bilingual-processor.ts:245"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74f324d0b8b7a89d", "name": "Stray `console.log` in TS/JS \u2014 electron/stream-scheduler.ts:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/stream-scheduler.ts:143"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-417b319aebef0f0c", "name": "Stray `console.log` in TS/JS \u2014 electron/ai-bridge.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/ai-bridge.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c538d1c8c3ba7283", "name": "Stray `console.log` in TS/JS \u2014 electron/metadata-tools.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/metadata-tools.ts:99"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00bfcbe5e2beb2d6", "name": "Stray `console.log` in TS/JS \u2014 electron/e2a-paths.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/e2a-paths.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a5ab5b8a80bbcc6", "name": "Stray `console.log` in TS/JS \u2014 electron/tool-paths.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/tool-paths.ts:95"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4f65df483b509f2", "name": "Stray `console.log` in TS/JS \u2014 electron/content-stream-editor.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/content-stream-editor.ts:75"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a1f84befb60ac02", "name": "Stray `console.log` in TS/JS \u2014 electron/manifest-service.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/manifest-service.ts:76"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d351c7be875d25ae", "name": "Stray `console.log` in TS/JS \u2014 electron/epub-paragraph-merger.ts:182", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/epub-paragraph-merger.ts:182"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f31a0198ee8a0e8", "name": "Stray `console.log` in TS/JS \u2014 electron/xtts-worker-pool.ts:209", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/xtts-worker-pool.ts:209"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0fb5f0e0b3d73cc", "name": "Stray `console.log` in TS/JS \u2014 electron/scripts/test-image-removal.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/scripts/test-image-removal.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10f1705e7d3287e6", "name": "Stray `console.log` in TS/JS \u2014 electron/components/downloader.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/downloader.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-21474116bc0bea1e", "name": "Stray `console.log` in TS/JS \u2014 electron/components/component-manager.ts:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/component-manager.ts:166"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2755428a03ea1ee2", "name": "Stray `console.log` in TS/JS \u2014 electron/components/catalog-service.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/catalog-service.ts:93"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af81a49e46593a83", "name": "Stray `console.log` in TS/JS \u2014 electron/components/system-probe.ts:219", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/system-probe.ts:219"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26ca6a4db3112ee3", "name": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-registry.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-registry.ts:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef34eb75407818e5", "name": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-loader.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-loader.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32ce5731f0b6bd46", "name": "Stray `console.log` in TS/JS \u2014 electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:240", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:240"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31d97ba8223b7a5b", "name": "Stray `console.log` in TS/JS \u2014 scripts/download-mupdf.js:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/download-mupdf.js:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad272f170d561529", "name": "Stray `console.log` in TS/JS \u2014 scripts/download-llama-cpp.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/download-llama-cpp.js:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bef775a2827be41", "name": "Stray `console.log` in TS/JS \u2014 scripts/compare-text-extraction.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/compare-text-extraction.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-358123c98778b0f6", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-chapters.js:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-chapters.js:106"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85e541952a1fdda2", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-mutool-bridge.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mutool-bridge.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14dc2efe7b48756b", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-bridge.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-bridge.js:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0a8e322e9bfe578", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction.js:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f27ee120ba7086f", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-final.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-final.js:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bbb6790aecc6c46", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-debug.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-debug.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b566dd4660436396", "name": "Stray `console.log` in TS/JS \u2014 extension/src/background.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/background.ts:104"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6358aafa6009df7d", "name": "Stray `console.log` in TS/JS \u2014 extension/src/offscreen.ts:306", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/offscreen.ts:306"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e12ed927b23b43d0", "name": "Stray `console.log` in TS/JS \u2014 packaging/stage-resources.js:132", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packaging/stage-resources.js:132"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-024f0cf2a3649bce", "name": "Stray `console.log` in TS/JS \u2014 packaging/package-win.js:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packaging/package-win.js:70"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6b6ecd64ea8d565", "name": "Stray `console.log` in TS/JS \u2014 packaging/build-inno.js:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packaging/build-inno.js:70"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-debc7ce16785625e", "name": "Stray `console.log` in TS/JS \u2014 src/app/core/utils/diff-algorithm.ts:396", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/utils/diff-algorithm.ts:396"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5e775413bf6d575", "name": "Stray `console.log` in TS/JS \u2014 src/app/core/services/electron.service.ts:2952", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/electron.service.ts:2952"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1981a5d2f3e42794", "name": "Stray `console.log` in TS/JS \u2014 src/app/core/services/settings.service.ts:403", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/settings.service.ts:403"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d31ef3b0048571d8", "name": "Stray `console.log` in TS/JS \u2014 src/app/core/services/library.service.ts:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/library.service.ts:135"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06f1d68eea29f32b", "name": "Icon-only button without accessible name \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.t", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:744"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ae2a82319bcb846", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:2868", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:2868"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-249542d408a4cfef", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/article-preview/article-preview.component.t", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/article-preview/article-preview.component.ts:317"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b06b723e3266e61a", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/url-input/url-input.component.ts:184", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/url-input/url-input.component.ts:184"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eeb493ad611bca4a", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/bilingual-player/bilingual-player.component", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/bilingual-player/bilingual-player.component.ts:911"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-43af48544a82cab1", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/services/epub-resolver.service.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/services/epub-resolver.service.ts:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e7833ba8d9ac483", "name": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:774", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:774"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26dcb6f65f9fdda7", "name": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:9868", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:9868"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61b88b20ada9cabe", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:3315", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:3315"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58f1005b0196a1b3", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:3512", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:3512"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c739aabc517f5448", "name": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/components/ocr-settings-modal/ocr-settings-modal.", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/components/ocr-settings-modal/ocr-settings-modal.component.ts:48"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc14f2b1041a1f28", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/library-view/library-view.component.ts:1111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/library-view/library-view.component.ts:1111"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-784be2b4df90dddc", "name": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/services/export.service.ts:1596", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/services/export.service.ts:1596"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2bff70c3d6b55ab", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/export.service.ts:311", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/export.service.ts:311"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-34acf75d9c8932d1", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-post-processor.service.ts:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-post-processor.service.ts:142"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edc32b9ec1f3dd2f", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/category-learner.ts:815", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/category-learner.ts:815"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84c5a22185784090", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/editor-state.service.ts:1317", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/editor-state.service.ts:1317"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52ee19e7db3d4cf9", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-job.service.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-job.service.ts:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d9c33cb300b7d46", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/queue.component.ts:751", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/queue.component.ts:751"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f77aa20050efbea", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/components/job-progress/job-progress.component.ts:929", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/components/job-progress/job-progress.component.ts:929"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b519331add18528", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/services/queue.service.ts:729", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/services/queue.service.ts:729"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6c8d58777f0f88d9", "name": "Icon-only button without accessible name \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.componen", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.component.ts:128"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9759970ab9bfa052", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.component.ts:1148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.component.ts:1148"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d523b9d7be1725e4", "name": "Icon-only button without accessible name \u2014 src/app/features/audiobook/components/play-view/play-view.component.ts:170", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/features/audiobook/components/play-view/play-view.component.ts:170"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ee2b7a53b15dc12", "name": "TODO/FIXME marker in shipping code \u2014 src/app/features/audiobook/components/progress-panel/progress-panel.component.ts:47", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/audiobook/components/progress-panel/progress-panel.component.ts:478"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6af077f9920e92a0", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/diff.service.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/diff.service.ts:174"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab0de30ab2295510", "name": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/audio-player.service.ts:442", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/audio-player.service.ts:442"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebe5e490ec8a9540", "name": "Insecure pattern 'node_child_process' in test-simple-remove.mjs:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in test-simple-remove.mjs:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf00784f34cbb2d8", "name": "Insecure pattern 'cors_wildcard' in electron/bookshelf-server.ts:137", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in electron/bookshelf-server.ts:137"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba92169278d247c2", "name": "Insecure pattern 'node_child_process' in electron/parallel-tts-bridge.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/parallel-tts-bridge.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e382fcf3df18bfa5", "name": "Insecure pattern 'node_child_process' in electron/chapter-recovery-bridge.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/chapter-recovery-bridge.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e2a831d8e30ae24", "name": "Insecure pattern 'node_child_process' in electron/bilingual-assembly-bridge.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/bilingual-assembly-bridge.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c52efd127eca470", "name": "Insecure pattern 'node_child_process' in electron/tts-bridge.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/tts-bridge.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85032071660cb683", "name": "Insecure pattern 'node_child_process' in electron/headless-ocr.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/headless-ocr.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c01c6d436269f71", "name": "Insecure pattern 'node_child_process' in electron/pdf-analyzer.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/pdf-analyzer.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1196b06a65a09fa7", "name": "Insecure pattern 'node_child_process' in electron/ocr-service.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/ocr-service.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-532eaa57e907cf2d", "name": "Insecure pattern 'node_child_process' in electron/mutool-bridge.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/mutool-bridge.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-edeaa433c7f95480", "name": "Insecure pattern 'node_child_process' in electron/video-assembly-bridge.ts:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/video-assembly-bridge.ts:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f94c088b40f8dd0a", "name": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-assembly-bridge.ts:105", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-assembly-bridge.ts:105"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-833fd0d0fcea1567", "name": "Insecure pattern 'node_child_process' in electron/e2a-env-bootstrap.ts:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/e2a-env-bootstrap.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-336a81eb5df38b4e", "name": "Insecure pattern 'node_child_process' in electron/xtts-streaming-bridge.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/xtts-streaming-bridge.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ac073a42f4e8b65", "name": "Insecure pattern 'node_child_process' in electron/jwpub-converter.ts:197", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/jwpub-converter.ts:197"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-feb0bd9bed8f4973", "name": "Insecure pattern 'node_child_process' in electron/llama-bridge.ts:21", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/llama-bridge.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdea958c617a2fed", "name": "Insecure pattern 'node_child_process' in electron/main.ts:118", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/main.ts:118"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e6c6764ddf9aca0", "name": "Insecure pattern 'node_child_process' in electron/ebook-library.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/ebook-library.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-90ff2d324bc7d20a", "name": "Insecure pattern 'node_child_process' in electron/ebook-convert-bridge.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/ebook-convert-bridge.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1bb8022596f2e2c", "name": "Insecure pattern 'node_child_process' in electron/reassembly-bridge.ts:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/reassembly-bridge.ts:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40b126688527ae0d", "name": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-renderer.html:110", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-renderer.html:110"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d49d401bbc401055", "name": "Insecure pattern 'node_child_process' in electron/metadata-tools.ts:28", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/metadata-tools.ts:28"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20a4e10cb6bca9d5", "name": "Insecure pattern 'node_child_process' in electron/tool-paths.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/tool-paths.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-66c3946adcf029b7", "name": "Insecure pattern 'node_child_process' in electron/xtts-worker-pool.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/xtts-worker-pool.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b739dac9c4f560d", "name": "Insecure pattern 'direct_innerhtml_assignment' in electron/bookshelf-ui/bookshelf.js:219", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/bookshelf-ui/bookshelf.js:219"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce7ef6926985123f", "name": "Insecure pattern 'node_child_process' in electron/components/cuda-tts.ts:25", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/components/cuda-tts.ts:25"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c45e111ed908d59", "name": "Insecure pattern 'node_child_process' in electron/components/downloader.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/components/downloader.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2240c1630400c697", "name": "Insecure pattern 'node_child_process' in electron/components/component-manager.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/components/component-manager.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bef1594c8ba9a0ce", "name": "Insecure pattern 'node_child_process' in electron/components/system-probe.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/components/system-probe.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2df968dd5ede32ba", "name": "Insecure pattern 'exec_used' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:464", "shortDescription": {"text": "Insecure pattern 'exec_used' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:464"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0fb7943e64f96a74", "name": "Insecure pattern 'node_child_process' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-314dce5698ca51f4", "name": "Insecure pattern 'node_child_process' in scripts/download-mupdf.js:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/download-mupdf.js:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f30357043635466", "name": "Insecure pattern 'node_child_process' in scripts/download-llama-cpp.js:38", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/download-llama-cpp.js:38"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ffe9ce27dd33cd5", "name": "Insecure pattern 'node_child_process' in scripts/compare-text-extraction.js:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/compare-text-extraction.js:9"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17a84b52058552ba", "name": "Insecure pattern 'node_child_process' in scripts/apply-chapters.js:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/apply-chapters.js:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b65c13afb617ab6f", "name": "Insecure pattern 'node_child_process' in extension/package.mjs:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in extension/package.mjs:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16346abfd49127ae", "name": "Insecure pattern 'node_child_process' in packaging/build-dmg.js:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packaging/build-dmg.js:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8e24ae1eb7e1ad2", "name": "Insecure pattern 'node_child_process' in packaging/stage-resources.js:29", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packaging/stage-resources.js:29"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87e25b35970197a4", "name": "Insecure pattern 'node_child_process' in packaging/package-win.js:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packaging/package-win.js:17"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5fb582ae1da2132", "name": "Insecure pattern 'node_child_process' in packaging/build-inno.js:20", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packaging/build-inno.js:20"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98dd51f522669b6a", "name": "Very large file: electron/parallel-tts-bridge.ts (5011 lines)", "shortDescription": {"text": "Very large file: electron/parallel-tts-bridge.ts (5011 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53ca16f9e102f2bb", "name": "Very large file: electron/pdf-analyzer.ts (5958 lines)", "shortDescription": {"text": "Very large file: electron/pdf-analyzer.ts (5958 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-982cc0d23f2da4e9", "name": "Very large file: electron/preload.ts (3628 lines)", "shortDescription": {"text": "Very large file: electron/preload.ts (3628 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9949b78390665f57", "name": "Very large file: electron/ll-jobs.ts (2120 lines)", "shortDescription": {"text": "Very large file: electron/ll-jobs.ts (2120 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f39ca68b18d03c68", "name": "Very large file: electron/epub-processor.ts (3314 lines)", "shortDescription": {"text": "Very large file: electron/epub-processor.ts (3314 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da701f47b92e50f4", "name": "Very large file: electron/main.ts (10434 lines)", "shortDescription": {"text": "Very large file: electron/main.ts (10434 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dcf8166b723e4a60", "name": "Very large file: electron/reassembly-bridge.ts (1732 lines)", "shortDescription": {"text": "Very large file: electron/reassembly-bridge.ts (1732 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f557fdb0bfc69", "name": "Very large file: electron/bilingual-processor.ts (1765 lines)", "shortDescription": {"text": "Very large file: electron/bilingual-processor.ts (1765 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4d04458179a9c8d", "name": "Very large file: electron/ai-bridge.ts (3572 lines)", "shortDescription": {"text": "Very large file: electron/ai-bridge.ts (3572 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99d11d2362b4f7f5", "name": "Very large file: src/app/core/services/electron.service.ts (3571 lines)", "shortDescription": {"text": "Very large file: src/app/core/services/electron.service.ts (3571 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2bee3de9f8020a3", "name": "Very large file: src/app/features/settings/settings.component.ts (2514 lines)", "shortDescription": {"text": "Very large file: src/app/features/settings/settings.component.ts (2514 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50a050287bd96064", "name": "Very large file: src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts (4931 lines)", "shortDescription": {"text": "Very large file: src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts (4931 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0a7dd06b74daef4", "name": "Very large file: src/app/features/pdf-picker/pdf-picker.component.ts (11181 lines)", "shortDescription": {"text": "Very large file: src/app/features/pdf-picker/pdf-picker.component.ts (11181 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-590ffa929e692888", "name": "Very large file: src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts (5419 lines)", "shortDescription": {"text": "Very large file: src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts (5419 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-96ac6cfdb92ea72a", "name": "Very large file: src/app/features/pdf-picker/components/categories-panel/categories-panel.component.ts (2367 lines)", "shortDescription": {"text": "Very large file: src/app/features/pdf-picker/components/categories-panel/categories-panel.component.ts (2367 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87c8a60b8fcaf37d", "name": "Very large file: src/app/features/pdf-picker/services/export.service.ts (1843 lines)", "shortDescription": {"text": "Very large file: src/app/features/pdf-picker/services/export.service.ts (1843 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d06a4823cfc21984", "name": "Very large file: src/app/features/pdf-picker/services/editor-state.service.ts (1510 lines)", "shortDescription": {"text": "Very large file: src/app/features/pdf-picker/services/editor-state.service.ts (1510 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dbee24341beb2dd6", "name": "Very large file: src/app/features/queue/components/job-progress/job-progress.component.ts (1630 lines)", "shortDescription": {"text": "Very large file: src/app/features/queue/components/job-progress/job-progress.component.ts (1630 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4b3e9a6e93027e4", "name": "Very large file: src/app/features/queue/services/queue.service.ts (4192 lines)", "shortDescription": {"text": "Very large file: src/app/features/queue/services/queue.service.ts (4192 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7763a00e98fb365", "name": "Very large file: src/app/features/studio/studio.component.ts (2258 lines)", "shortDescription": {"text": "Very large file: src/app/features/studio/studio.component.ts (2258 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e340dcf5ebe0610e", "name": "Very large file: src/app/features/studio/components/audiobook-player/audiobook-player.component.ts (1703 lines)", "shortDescription": {"text": "Very large file: src/app/features/studio/components/audiobook-player/audiobook-player.component.ts (1703 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c909c821c2ab6e6a", "name": "Very large file: src/app/features/audiobook/components/play-view/play-view.component.ts (1899 lines)", "shortDescription": {"text": "Very large file: src/app/features/audiobook/components/play-view/play-view.component.ts (1899 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "18 test file(s) for 233 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 1672 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 167 placeholder/mock markers across 44 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f999ce00a6d14a15", "name": "Commented-code block (5 lines) in electron/parallel-tts-bridge.ts:4978", "shortDescription": {"text": "Commented-code block (5 lines) in electron/parallel-tts-bridge.ts:4978"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46e14564d90d9a21", "name": "Commented-code block (6 lines) in electron/pdf-analyzer.ts:2805", "shortDescription": {"text": "Commented-code block (6 lines) in electron/pdf-analyzer.ts:2805"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64900fe790dbeb91", "name": "Legacy-named symbol `scanLegacy` in electron/preload.ts:1947", "shortDescription": {"text": "Legacy-named symbol `scanLegacy` in electron/preload.ts:1947"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c65002d8a9dfea2f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/book-analysis.ts:309", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/book-analysis.ts:309"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1d450ddadc792c5", "name": "Commented-code block (5 lines) in electron/pdf-worker.ts:39", "shortDescription": {"text": "Commented-code block (5 lines) in electron/pdf-worker.ts:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef1f4c3329e98e71", "name": "Commented-code block (5 lines) in electron/pdf-bridge.ts:222", "shortDescription": {"text": "Commented-code block (5 lines) in electron/pdf-bridge.ts:222"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73fe718fe3e2b37a", "name": "Commented-code block (8 lines) in electron/e2a-env-bootstrap.ts:164", "shortDescription": {"text": "Commented-code block (8 lines) in electron/e2a-env-bootstrap.ts:164"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe2f4133a6240a6b", "name": "Commented-code block (5 lines) in electron/ll-jobs.ts:1412", "shortDescription": {"text": "Commented-code block (5 lines) in electron/ll-jobs.ts:1412"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfc46222c80131d7", "name": "Legacy-named symbol `normalizedOld` in electron/epub-processor.ts:1866", "shortDescription": {"text": "Legacy-named symbol `normalizedOld` in electron/epub-processor.ts:1866"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03ed5a0d7c4ee3f5", "name": "Commented-code block (5 lines) in electron/epub-processor.ts:2707", "shortDescription": {"text": "Commented-code block (5 lines) in electron/epub-processor.ts:2707"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-070d75f3cbc5a89b", "name": "Commented-code block (5 lines) in electron/language-learning-jobs.ts:377", "shortDescription": {"text": "Commented-code block (5 lines) in electron/language-learning-jobs.ts:377"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-beea7ed9dd65380b", "name": "Legacy-named symbol `hasOriginalLegacy` in electron/main.ts:4819", "shortDescription": {"text": "Legacy-named symbol `hasOriginalLegacy` in electron/main.ts:4819"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e44a502334a47e8", "name": "Commented-code block (6 lines) in electron/main.ts:29", "shortDescription": {"text": "Commented-code block (6 lines) in electron/main.ts:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ffca4c3fe777c9cc", "name": "Commented-code block (10 lines) in electron/tts-api-server.ts:80", "shortDescription": {"text": "Commented-code block (10 lines) in electron/tts-api-server.ts:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cccd69dc34abb9ca", "name": "Legacy-named symbol `completedSetOld` in electron/reassembly-bridge.ts:368", "shortDescription": {"text": "Legacy-named symbol `completedSetOld` in electron/reassembly-bridge.ts:368"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-180ad1f4821bf81e", "name": "Commented-code block (5 lines) in electron/reassembly-bridge.ts:910", "shortDescription": {"text": "Commented-code block (5 lines) in electron/reassembly-bridge.ts:910"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc55c28d8077a7b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bilingual-processor.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bilingual-processor.ts:135"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93296405abfeb8f3", "name": "Commented-code block (7 lines) in electron/xtts-voices.ts:61", "shortDescription": {"text": "Commented-code block (7 lines) in electron/xtts-voices.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34a03e5d925931b3", "name": "Commented-code block (10 lines) in electron/stream-scheduler.ts:43", "shortDescription": {"text": "Commented-code block (10 lines) in electron/stream-scheduler.ts:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3f2ca610f36c121", "name": "Commented-code block (5 lines) in electron/e2a-paths.ts:414", "shortDescription": {"text": "Commented-code block (5 lines) in electron/e2a-paths.ts:414"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d9a018243539d21", "name": "Commented-code block (9 lines) in electron/xtts-worker-pool.ts:85", "shortDescription": {"text": "Commented-code block (9 lines) in electron/xtts-worker-pool.ts:85"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20bdb9c2ad7ec779", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bookshelf-ui/bookshelf.js:432", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bookshelf-ui/bookshelf.js:432"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e13f42e4decdb63d", "name": "Commented-code block (5 lines) in electron/scripts/xtts_stream.py:36", "shortDescription": {"text": "Commented-code block (5 lines) in electron/scripts/xtts_stream.py:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b059138a59196799", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-types.ts:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-types.ts:136"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bcb7069390e40258", "name": "Commented-code block (8 lines) in electron/components/component-catalog.ts:100", "shortDescription": {"text": "Commented-code block (8 lines) in electron/components/component-catalog.ts:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b776e59cd64d481", "name": "Commented-code block (6 lines) in electron/components/component-manager.ts:1158", "shortDescription": {"text": "Commented-code block (6 lines) in electron/components/component-manager.ts:1158"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47cd2438aa6c61f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-manager.ts:374", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-manager.ts:374"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-819efed6a779e296", "name": "Commented-code block (5 lines) in electron/components/llama-cuda.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in electron/components/llama-cuda.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ed6d9e378c7d077", "name": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/llama-cuda.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/llama-cuda.ts:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35eb9709d421939e", "name": "Commented-code block (5 lines) in electron/components/system-probe.ts:249", "shortDescription": {"text": "Commented-code block (5 lines) in electron/components/system-probe.ts:249"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-960de40dc73500ba", "name": "Commented-code block (12 lines) in scripts/migrate-library-to-projects.mjs:6", "shortDescription": {"text": "Commented-code block (12 lines) in scripts/migrate-library-to-projects.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab8b14167905d012", "name": "Commented-code block (5 lines) in scripts/reverse-migration.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/reverse-migration.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03aa7ec5fa10c9c4", "name": "Commented-code block (5 lines) in extension/build.mjs:17", "shortDescription": {"text": "Commented-code block (5 lines) in extension/build.mjs:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0347991190aba0e", "name": "Commented-code block (5 lines) in extension/src/content.ts:724", "shortDescription": {"text": "Commented-code block (5 lines) in extension/src/content.ts:724"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8414fa436c5e7baa", "name": "Commented-code block (5 lines) in extension/src/protocol.ts:66", "shortDescription": {"text": "Commented-code block (5 lines) in extension/src/protocol.ts:66"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8963b4070d93f915", "name": "Commented-code block (7 lines) in extension/src/offscreen.ts:72", "shortDescription": {"text": "Commented-code block (7 lines) in extension/src/offscreen.ts:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-048e4d0a4b839519", "name": "Commented-code block (5 lines) in packaging/stage-resources.js:105", "shortDescription": {"text": "Commented-code block (5 lines) in packaging/stage-resources.js:105"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4ab0d0de8c9fee40", "name": "Commented-code block (7 lines) in src/app/app.ts:288", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/app.ts:288"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0f14bf1e77646a0", "name": "Legacy-named symbol `manifestScanLegacy` in src/app/core/services/electron.service.ts:3420", "shortDescription": {"text": "Legacy-named symbol `manifestScanLegacy` in src/app/core/services/electron.service.ts:3420"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bc8d4c66f1a7f17", "name": "Commented-code block (5 lines) in src/app/core/services/electron.service.ts:3498", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/core/services/electron.service.ts:3498"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2ca11d9e72245a8c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/core/services/electron.service.ts:432", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/core/services/electron.service.ts:432"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9681ae27df213313", "name": "Legacy-named symbol `scanLegacy` in src/app/core/services/manifest.service.ts:320", "shortDescription": {"text": "Legacy-named symbol `scanLegacy` in src/app/core/services/manifest.service.ts:320"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a904c1a79d03e1a0", "name": "Commented-code block (6 lines) in src/app/features/pdf-picker/pdf-picker.component.ts:9868", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/features/pdf-picker/pdf-picker.component.ts:9868"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44e702d49f9db8f8", "name": "Commented-code block (6 lines) in src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:2572", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:2572"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59f6618dcd162662", "name": "Commented-code block (7 lines) in src/app/features/pdf-picker/services/ocr-post-processor.service.ts:625", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/features/pdf-picker/services/ocr-post-processor.service.ts:625"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c50f56a0680a74f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/features/pdf-picker/services/pdf.service.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/features/pdf-picker/services/pdf.service.ts:92"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70976d767f012037", "name": "Commented-code block (5 lines) in src/app/features/pdf-picker/services/paragraph-detector.ts:364", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/features/pdf-picker/services/paragraph-detector.ts:364"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b68450681ec8b721", "name": "Commented-code block (7 lines) in src/app/features/queue/queue.component.ts:527", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/features/queue/queue.component.ts:527"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ac7c514217cfa90", "name": "Commented-code block (5 lines) in src/app/features/queue/services/queue.service.ts:2270", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/features/queue/services/queue.service.ts:2270"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ebf7c12c477b2f14", "name": "Commented-code block (5 lines) in src/app/features/studio/services/studio.service.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/features/studio/services/studio.service.ts:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-520cc8323ffb4941", "name": "Dangling fetch: POST /api/queue/${action} (electron/bookshelf-ui/bookshelf.js:738)", "shortDescription": {"text": "Dangling fetch: POST /api/queue/${action} (electron/bookshelf-ui/bookshelf.js:738)"}, "fullDescription": {"text": "`electron/bookshelf-ui/bookshelf.js:738` calls `POST /api/queue/${action}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/queue/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2ff9c227eae101f1", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/book-analysis.ts:350)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/book-analysis.ts:350)"}, "fullDescription": {"text": "`electron/book-analysis.ts:350` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9e272e23105f231", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/book-analysis.ts:394)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/book-analysis.ts:394)"}, "fullDescription": {"text": "`electron/book-analysis.ts:394` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f72edc32054ae5f", "name": "Dangling fetch: POST http://127.0.0.1:${this.port}/v1/chat/completions (electron/llama-bridge.ts:609)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${this.port}/v1/chat/completions (electron/llama-bridge.ts:609)"}, "fullDescription": {"text": "`electron/llama-bridge.ts:609` calls `POST http://127.0.0.1:${this.port}/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-89d56bd8c694a0b9", "name": "Dangling fetch: POST http://localhost:11434/api/generate (electron/main.ts:7556)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (electron/main.ts:7556)"}, "fullDescription": {"text": "`electron/main.ts:7556` calls `POST http://localhost:11434/api/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce9c2a24f648ffcd", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/translation-bridge.ts:252)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/translation-bridge.ts:252)"}, "fullDescription": {"text": "`electron/translation-bridge.ts:252` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bbd59fba0969114", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/translation-bridge.ts:303)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/translation-bridge.ts:303)"}, "fullDescription": {"text": "`electron/translation-bridge.ts:303` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b1fe9f76c4f57e5", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/bilingual-processor.ts:166)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/bilingual-processor.ts:166)"}, "fullDescription": {"text": "`electron/bilingual-processor.ts:166` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6be9cf9470c8ed96", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/bilingual-processor.ts:205)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/bilingual-processor.ts:205)"}, "fullDescription": {"text": "`electron/bilingual-processor.ts:205` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-862e356c0b4eb483", "name": "Dangling fetch: GET https://api.anthropic.com/v1/models (electron/ai-bridge.ts:986)", "shortDescription": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (electron/ai-bridge.ts:986)"}, "fullDescription": {"text": "`electron/ai-bridge.ts:986` calls `GET https://api.anthropic.com/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39448282a2e8ec74", "name": "Dangling fetch: GET https://api.openai.com/v1/models (electron/ai-bridge.ts:1113)", "shortDescription": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (electron/ai-bridge.ts:1113)"}, "fullDescription": {"text": "`electron/ai-bridge.ts:1113` calls `GET https://api.openai.com/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30466e6cef5c09a8", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/ai-bridge.ts:1292)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/ai-bridge.ts:1292)"}, "fullDescription": {"text": "`electron/ai-bridge.ts:1292` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a33bff84aca9b83", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/ai-bridge.ts:1499)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/ai-bridge.ts:1499)"}, "fullDescription": {"text": "`electron/ai-bridge.ts:1499` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-986b9867d86663f8", "name": "Dangling fetch: GET http://localhost:5848/api/browse?path=${encodeURIComponent(dirPath)} (src/app/core/services/electron", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5848/api/browse?path=${encodeURIComponent(dirPath)} (src/app/core/services/electron.service.ts:432)"}, "fullDescription": {"text": "`src/app/core/services/electron.service.ts:432` calls `GET http://localhost:5848/api/browse?path=${encodeURIComponent(dirPath)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5848/api/browse`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9ca1be710ba07b63", "name": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/language-learning/components/ll-wizard/ll-wizard.c", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:3051)"}, "fullDescription": {"text": "`src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:3051` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5597c0707e23f156", "name": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/studio/components/studio-insights/studio-insights.", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/studio/components/studio-insights/studio-insights.component.ts:405)"}, "fullDescription": {"text": "`src/app/features/studio/components/studio-insights/studio-insights.component.ts:405` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2d1840fbf3cc9943", "name": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/audiobook/components/translation-panel/translation", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/audiobook/components/translation-panel/translation-panel.component.ts:460)"}, "fullDescription": {"text": "`src/app/features/audiobook/components/translation-panel/translation-panel.component.ts:460` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85cf24efe3105301", "name": "Unused endpoint: OPTIONS /api/audio", "shortDescription": {"text": "Unused endpoint: OPTIONS /api/audio"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `OPTIONS /api/audio` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e73369d325056697", "name": "Unused endpoint: GET /api/books", "shortDescription": {"text": "Unused endpoint: GET /api/books"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/books` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cacbd8e82f2940dd", "name": "Unused endpoint: GET /api/download", "shortDescription": {"text": "Unused endpoint: GET /api/download"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/download` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f91165c63eb1c9e", "name": "Unused endpoint: GET /api/audio", "shortDescription": {"text": "Unused endpoint: GET /api/audio"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/audio` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f90bfe720c1d950e", "name": "Unused endpoint: GET /api/tags", "shortDescription": {"text": "Unused endpoint: GET /api/tags"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/tags` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8bb8e7009d3ad6a", "name": "Unused endpoint: GET /api/ebooks", "shortDescription": {"text": "Unused endpoint: GET /api/ebooks"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/ebooks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37b0cd0330912b66", "name": "Unused endpoint: GET /api/ebook-download", "shortDescription": {"text": "Unused endpoint: GET /api/ebook-download"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/ebook-download` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c5750dfa4b3af21", "name": "Unused endpoint: POST /api/queue/start", "shortDescription": {"text": "Unused endpoint: POST /api/queue/start"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `POST /api/queue/start` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f7559498a4c9b23", "name": "Unused endpoint: POST /api/queue/pause", "shortDescription": {"text": "Unused endpoint: POST /api/queue/pause"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `POST /api/queue/pause` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`electron/bookshelf-server.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20962"}, "properties": {"repository": "telltaleatheist/bookforge", "repoUrl": "https://github.com/telltaleatheist/bookforge", "branch": "main"}, "results": [{"ruleId": "scanner-ab297de05b4d074e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/bookshelf-server.ts:133"}, "properties": {"repobilityId": "cbb25570a8ab9f85", "scanner": "scanner-primary", "fingerprint": "ab297de05b4d074e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-842c23418e9e5dbc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/diff-cache.ts:93"}, "properties": {"repobilityId": "5118b1a615cf5cf1", "scanner": "scanner-primary", "fingerprint": "842c23418e9e5dbc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c175c9f16795936f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/parallel-tts-bridge.ts:100"}, "properties": {"repobilityId": "1ff5de479a8084b6", "scanner": "scanner-primary", "fingerprint": "c175c9f16795936f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39460f8992ffcda4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/bilingual-assembly-bridge.ts:55"}, "properties": {"repobilityId": "ad1b9fbe97a86cb7", "scanner": "scanner-primary", "fingerprint": "39460f8992ffcda4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54c9efbc31f9c187", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/tts-bridge.ts:33"}, "properties": {"repobilityId": "f96f1368373c0c89", "scanner": "scanner-primary", "fingerprint": "54c9efbc31f9c187", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e9c96fb85c53d1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/headless-ocr.ts:86"}, "properties": {"repobilityId": "edab3e2bbacba7ce", "scanner": "scanner-primary", "fingerprint": "2e9c96fb85c53d1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-883051bfac0831f0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 electron/pdf-analyzer.ts:4299"}, "properties": {"repobilityId": "c0555d24ddba490d", "scanner": "scanner-primary", "fingerprint": "883051bfac0831f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-086d6ff304c08302", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-analyzer.ts:1304"}, "properties": {"repobilityId": "c9791b5adf3ce459", "scanner": "scanner-primary", "fingerprint": "086d6ff304c08302", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1015730b5f626b08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/preload.ts:3023"}, "properties": {"repobilityId": "7c81ae1c0d6bdc72", "scanner": "scanner-primary", "fingerprint": "1015730b5f626b08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-464865945dd46e19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/book-analysis.ts:451"}, "properties": {"repobilityId": "4d5728b9884f2437", "scanner": "scanner-primary", "fingerprint": "464865945dd46e19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b103bc737c247d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-bridge.ts:134"}, "properties": {"repobilityId": "65c6d85c3bae2662", "scanner": "scanner-primary", "fingerprint": "1b103bc737c247d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a762a6719cc2cfa1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/ocr-service.ts:172"}, "properties": {"repobilityId": "d8d6ed87f70531d9", "scanner": "scanner-primary", "fingerprint": "a762a6719cc2cfa1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b95156720941270", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/audiobook-logger.ts:97"}, "properties": {"repobilityId": "84fab06d3239a842", "scanner": "scanner-primary", "fingerprint": "2b95156720941270", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c4fda3d08f64293c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/mutool-bridge.ts:190"}, "properties": {"repobilityId": "d0ecff2a8c3c0ad5", "scanner": "scanner-primary", "fingerprint": "c4fda3d08f64293c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b0ed6f7368ca487", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/video-assembly-bridge.ts:382"}, "properties": {"repobilityId": "80db7b393e03b4c5", "scanner": "scanner-primary", "fingerprint": "0b0ed6f7368ca487", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a05747d627f1c41f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/e2a-env-bootstrap.ts:267"}, "properties": {"repobilityId": "6c715e5ebc8c4d63", "scanner": "scanner-primary", "fingerprint": "a05747d627f1c41f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea6c306a665ed775", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/ll-jobs.ts:238"}, "properties": {"repobilityId": "cd39afab54a20fb9", "scanner": "scanner-primary", "fingerprint": "ea6c306a665ed775", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1030c159e25845a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/epub-processor.ts:2944"}, "properties": {"repobilityId": "0a97214989fc00d0", "scanner": "scanner-primary", "fingerprint": "1030c159e25845a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc4fbfa107786e6d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/xtts-streaming-bridge.ts:98"}, "properties": {"repobilityId": "a55a69fd74d55a3d", "scanner": "scanner-primary", "fingerprint": "fc4fbfa107786e6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54d62f263752e3de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/jwpub-converter.ts:631"}, "properties": {"repobilityId": "aada6b9c71887aca", "scanner": "scanner-primary", "fingerprint": "54d62f263752e3de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6149ae76b1050445", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/web-fetch-bridge.ts:122"}, "properties": {"repobilityId": "96b30e79f3b898a7", "scanner": "scanner-primary", "fingerprint": "6149ae76b1050445", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-095072d2c9e0fa4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/llama-bridge.ts:492"}, "properties": {"repobilityId": "ef5e9fd9172fec90", "scanner": "scanner-primary", "fingerprint": "095072d2c9e0fa4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-216c9286c1c40aab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/language-learning-jobs.ts:144"}, "properties": {"repobilityId": "a936da5d8bcda3a1", "scanner": "scanner-primary", "fingerprint": "216c9286c1c40aab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-767ca2b3a252e142", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 electron/main.ts:8777"}, "properties": {"repobilityId": "1746d2931df9ed83", "scanner": "scanner-primary", "fingerprint": "767ca2b3a252e142", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dfc87ed334513db1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/main.ts:109"}, "properties": {"repobilityId": "2d2efb6cb297cadd", "scanner": "scanner-primary", "fingerprint": "dfc87ed334513db1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7eafd4cce168928c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/translation-bridge.ts:91"}, "properties": {"repobilityId": "9b42cdf5e79c58ed", "scanner": "scanner-primary", "fingerprint": "7eafd4cce168928c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8af2ddd6a05bd623", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/rolling-logger.ts:181"}, "properties": {"repobilityId": "4e3010aba45fd28a", "scanner": "scanner-primary", "fingerprint": "8af2ddd6a05bd623", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6454cc8e9327655c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/ebook-library.ts:109"}, "properties": {"repobilityId": "eab85f2115625573", "scanner": "scanner-primary", "fingerprint": "6454cc8e9327655c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0310a49b74acf28c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/sentence-alignment-window.ts:64"}, "properties": {"repobilityId": "d7ecb3af060a974d", "scanner": "scanner-primary", "fingerprint": "0310a49b74acf28c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94e3b5c50a8c7139", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/tts-api-server.ts:188"}, "properties": {"repobilityId": "493ea5e3b73ace18", "scanner": "scanner-primary", "fingerprint": "94e3b5c50a8c7139", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39c70b0d0128dc5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/pdf-worker-proxy.ts:56"}, "properties": {"repobilityId": "e8e59a52d2f1a33c", "scanner": "scanner-primary", "fingerprint": "39c70b0d0128dc5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8460f92fbbcb518a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/ebook-convert-bridge.ts:88"}, "properties": {"repobilityId": "7c0cf06d0d5e9f96", "scanner": "scanner-primary", "fingerprint": "8460f92fbbcb518a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbccd1f7c325a842", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/reassembly-bridge.ts:292"}, "properties": {"repobilityId": "d9662c3c5a76eab4", "scanner": "scanner-primary", "fingerprint": "cbccd1f7c325a842", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-349f1137a78bd38f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/bilingual-processor.ts:245"}, "properties": {"repobilityId": "13ef0f9af104fa08", "scanner": "scanner-primary", "fingerprint": "349f1137a78bd38f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74f324d0b8b7a89d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/stream-scheduler.ts:143"}, "properties": {"repobilityId": "ce7089326c7519a4", "scanner": "scanner-primary", "fingerprint": "74f324d0b8b7a89d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-417b319aebef0f0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/ai-bridge.ts:24"}, "properties": {"repobilityId": "f663020d3d736afd", "scanner": "scanner-primary", "fingerprint": "417b319aebef0f0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c538d1c8c3ba7283", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/metadata-tools.ts:99"}, "properties": {"repobilityId": "67964dd06181092a", "scanner": "scanner-primary", "fingerprint": "c538d1c8c3ba7283", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00bfcbe5e2beb2d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/e2a-paths.ts:53"}, "properties": {"repobilityId": "d2d9dbda0770b037", "scanner": "scanner-primary", "fingerprint": "00bfcbe5e2beb2d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a5ab5b8a80bbcc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/tool-paths.ts:95"}, "properties": {"repobilityId": "98365c6f69ce0e27", "scanner": "scanner-primary", "fingerprint": "3a5ab5b8a80bbcc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4f65df483b509f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/content-stream-editor.ts:75"}, "properties": {"repobilityId": "06b23677f8d8527e", "scanner": "scanner-primary", "fingerprint": "b4f65df483b509f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a1f84befb60ac02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/manifest-service.ts:76"}, "properties": {"repobilityId": "3d6bcd60375e0400", "scanner": "scanner-primary", "fingerprint": "0a1f84befb60ac02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d351c7be875d25ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/epub-paragraph-merger.ts:182"}, "properties": {"repobilityId": "46ebd958350521c6", "scanner": "scanner-primary", "fingerprint": "d351c7be875d25ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f31a0198ee8a0e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/xtts-worker-pool.ts:209"}, "properties": {"repobilityId": "74286388de8f6ea9", "scanner": "scanner-primary", "fingerprint": "8f31a0198ee8a0e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0fb5f0e0b3d73cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/scripts/test-image-removal.ts:23"}, "properties": {"repobilityId": "b100f57096e98f74", "scanner": "scanner-primary", "fingerprint": "b0fb5f0e0b3d73cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10f1705e7d3287e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/downloader.ts:109"}, "properties": {"repobilityId": "2652b68a9487159f", "scanner": "scanner-primary", "fingerprint": "10f1705e7d3287e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21474116bc0bea1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/component-manager.ts:166"}, "properties": {"repobilityId": "07e34200a400ad75", "scanner": "scanner-primary", "fingerprint": "21474116bc0bea1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2755428a03ea1ee2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/catalog-service.ts:93"}, "properties": {"repobilityId": "aaa6deee456fe305", "scanner": "scanner-primary", "fingerprint": "2755428a03ea1ee2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af81a49e46593a83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/components/system-probe.ts:219"}, "properties": {"repobilityId": "6f5a6303ab77db17", "scanner": "scanner-primary", "fingerprint": "af81a49e46593a83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26ca6a4db3112ee3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-registry.ts:52"}, "properties": {"repobilityId": "43b254cbb28c0387", "scanner": "scanner-primary", "fingerprint": "26ca6a4db3112ee3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef34eb75407818e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/plugin-loader.ts:12"}, "properties": {"repobilityId": "6bb6d5646f3cb1a4", "scanner": "scanner-primary", "fingerprint": "ef34eb75407818e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32ce5731f0b6bd46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:240"}, "properties": {"repobilityId": "332c7463e05f2a2b", "scanner": "scanner-primary", "fingerprint": "32ce5731f0b6bd46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31d97ba8223b7a5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/download-mupdf.js:39"}, "properties": {"repobilityId": "cb0d5a23f7090f1d", "scanner": "scanner-primary", "fingerprint": "31d97ba8223b7a5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad272f170d561529", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/download-llama-cpp.js:55"}, "properties": {"repobilityId": "7518fceba4a49e73", "scanner": "scanner-primary", "fingerprint": "ad272f170d561529", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bef775a2827be41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/compare-text-extraction.js:16"}, "properties": {"repobilityId": "8cdafd3bf16c719f", "scanner": "scanner-primary", "fingerprint": "3bef775a2827be41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-358123c98778b0f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-chapters.js:106"}, "properties": {"repobilityId": "551ac436f150241f", "scanner": "scanner-primary", "fingerprint": "358123c98778b0f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85e541952a1fdda2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mutool-bridge.js:19"}, "properties": {"repobilityId": "7e645364cf2a109d", "scanner": "scanner-primary", "fingerprint": "85e541952a1fdda2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14dc2efe7b48756b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-bridge.js:38"}, "properties": {"repobilityId": "189ba5b5c70c28a5", "scanner": "scanner-primary", "fingerprint": "14dc2efe7b48756b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0a8e322e9bfe578", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction.js:28"}, "properties": {"repobilityId": "aea6f9f7d0c0c3a8", "scanner": "scanner-primary", "fingerprint": "c0a8e322e9bfe578", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f27ee120ba7086f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-final.js:48"}, "properties": {"repobilityId": "82cd57ff145c42db", "scanner": "scanner-primary", "fingerprint": "0f27ee120ba7086f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bbb6790aecc6c46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-mupdf-redaction-debug.js:13"}, "properties": {"repobilityId": "15c638f9a19314a7", "scanner": "scanner-primary", "fingerprint": "5bbb6790aecc6c46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b566dd4660436396", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/background.ts:104"}, "properties": {"repobilityId": "e23065209f507de4", "scanner": "scanner-primary", "fingerprint": "b566dd4660436396", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6358aafa6009df7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/offscreen.ts:306"}, "properties": {"repobilityId": "519fa7b062fd01ba", "scanner": "scanner-primary", "fingerprint": "6358aafa6009df7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e12ed927b23b43d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packaging/stage-resources.js:132"}, "properties": {"repobilityId": "91a2891e1f6e9c59", "scanner": "scanner-primary", "fingerprint": "e12ed927b23b43d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-024f0cf2a3649bce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packaging/package-win.js:70"}, "properties": {"repobilityId": "95af6c2f141a58f3", "scanner": "scanner-primary", "fingerprint": "024f0cf2a3649bce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6b6ecd64ea8d565", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packaging/build-inno.js:70"}, "properties": {"repobilityId": "5c235f741c07013e", "scanner": "scanner-primary", "fingerprint": "f6b6ecd64ea8d565", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-debc7ce16785625e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/utils/diff-algorithm.ts:396"}, "properties": {"repobilityId": "c12f095f34ee384f", "scanner": "scanner-primary", "fingerprint": "debc7ce16785625e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5e775413bf6d575", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/electron.service.ts:2952"}, "properties": {"repobilityId": "76d5335872399dce", "scanner": "scanner-primary", "fingerprint": "b5e775413bf6d575", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1981a5d2f3e42794", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/settings.service.ts:403"}, "properties": {"repobilityId": "86cf4e98e81ab91c", "scanner": "scanner-primary", "fingerprint": "1981a5d2f3e42794", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d31ef3b0048571d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/core/services/library.service.ts:135"}, "properties": {"repobilityId": "7f18459fa3765073", "scanner": "scanner-primary", "fingerprint": "d31ef3b0048571d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06f1d68eea29f32b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:744"}, "properties": {"repobilityId": "31e5a623439276cb", "scanner": "scanner-primary", "fingerprint": "06f1d68eea29f32b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-5ae2a82319bcb846", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:2868"}, "properties": {"repobilityId": "c274fc393093bfec", "scanner": "scanner-primary", "fingerprint": "5ae2a82319bcb846", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-249542d408a4cfef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/article-preview/article-preview.component.ts:317"}, "properties": {"repobilityId": "a11a0bdb218aa294", "scanner": "scanner-primary", "fingerprint": "249542d408a4cfef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b06b723e3266e61a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/url-input/url-input.component.ts:184"}, "properties": {"repobilityId": "7a6d6baa884fd5d6", "scanner": "scanner-primary", "fingerprint": "b06b723e3266e61a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eeb493ad611bca4a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/components/bilingual-player/bilingual-player.component.ts:911"}, "properties": {"repobilityId": "c0b55ec96200e30b", "scanner": "scanner-primary", "fingerprint": "eeb493ad611bca4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43af48544a82cab1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/language-learning/services/epub-resolver.service.ts:51"}, "properties": {"repobilityId": "b8e77e5cdfdf8243", "scanner": "scanner-primary", "fingerprint": "43af48544a82cab1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e7833ba8d9ac483", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:774"}, "properties": {"repobilityId": "846677d5b411f9af", "scanner": "scanner-primary", "fingerprint": "9e7833ba8d9ac483", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-26dcb6f65f9fdda7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:9868"}, "properties": {"repobilityId": "471e5a58c1d80fb5", "scanner": "scanner-primary", "fingerprint": "26dcb6f65f9fdda7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-61b88b20ada9cabe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/pdf-picker.component.ts:3315"}, "properties": {"repobilityId": "a4f891a8d78cdce7", "scanner": "scanner-primary", "fingerprint": "61b88b20ada9cabe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-58f1005b0196a1b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:3512"}, "properties": {"repobilityId": "864b8f40f6a8e86e", "scanner": "scanner-primary", "fingerprint": "58f1005b0196a1b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c739aabc517f5448", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/features/pdf-picker/components/ocr-settings-modal/ocr-settings-modal.component.ts:48"}, "properties": {"repobilityId": "8f9bb8a13e9b44f8", "scanner": "scanner-primary", "fingerprint": "c739aabc517f5448", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cc14f2b1041a1f28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/components/library-view/library-view.component.ts:1111"}, "properties": {"repobilityId": "fbbba1f9551ff7d2", "scanner": "scanner-primary", "fingerprint": "cc14f2b1041a1f28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-784be2b4df90dddc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/pdf-picker/services/export.service.ts:1596"}, "properties": {"repobilityId": "8b99260f5ca80aef", "scanner": "scanner-primary", "fingerprint": "784be2b4df90dddc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d2bff70c3d6b55ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/export.service.ts:311"}, "properties": {"repobilityId": "9291c523f9ab0aa0", "scanner": "scanner-primary", "fingerprint": "d2bff70c3d6b55ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34acf75d9c8932d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-post-processor.service.ts:142"}, "properties": {"repobilityId": "316cf00e497eb713", "scanner": "scanner-primary", "fingerprint": "34acf75d9c8932d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edc32b9ec1f3dd2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/category-learner.ts:815"}, "properties": {"repobilityId": "0d19dee28d8e9f59", "scanner": "scanner-primary", "fingerprint": "edc32b9ec1f3dd2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84c5a22185784090", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/editor-state.service.ts:1317"}, "properties": {"repobilityId": "acab5d5a7d850995", "scanner": "scanner-primary", "fingerprint": "84c5a22185784090", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52ee19e7db3d4cf9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/pdf-picker/services/ocr-job.service.ts:119"}, "properties": {"repobilityId": "47ef387220ba18fb", "scanner": "scanner-primary", "fingerprint": "52ee19e7db3d4cf9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d9c33cb300b7d46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/queue.component.ts:751"}, "properties": {"repobilityId": "340baa37e3ad3acb", "scanner": "scanner-primary", "fingerprint": "9d9c33cb300b7d46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f77aa20050efbea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/components/job-progress/job-progress.component.ts:929"}, "properties": {"repobilityId": "499149ae4c5b2fb7", "scanner": "scanner-primary", "fingerprint": "5f77aa20050efbea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b519331add18528", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/queue/services/queue.service.ts:729"}, "properties": {"repobilityId": "2c2bdb1d89479802", "scanner": "scanner-primary", "fingerprint": "3b519331add18528", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c8d58777f0f88d9", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.component.ts:128"}, "properties": {"repobilityId": "f59978c85edcdab7", "scanner": "scanner-primary", "fingerprint": "6c8d58777f0f88d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9759970ab9bfa052", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/studio/components/audiobook-player/audiobook-player.component.ts:1148"}, "properties": {"repobilityId": "98efd8e57cead6e6", "scanner": "scanner-primary", "fingerprint": "9759970ab9bfa052", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d523b9d7be1725e4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/features/audiobook/components/play-view/play-view.component.ts:170"}, "properties": {"repobilityId": "cb63eb2390163531", "scanner": "scanner-primary", "fingerprint": "d523b9d7be1725e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7ee2b7a53b15dc12", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/features/audiobook/components/progress-panel/progress-panel.component.ts:478"}, "properties": {"repobilityId": "5ec4c57e8a128c34", "scanner": "scanner-primary", "fingerprint": "7ee2b7a53b15dc12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6af077f9920e92a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/diff.service.ts:174"}, "properties": {"repobilityId": "4fba916ad497445c", "scanner": "scanner-primary", "fingerprint": "6af077f9920e92a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab0de30ab2295510", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/features/audiobook/services/audio-player.service.ts:442"}, "properties": {"repobilityId": "8268a8ed0f55419c", "scanner": "scanner-primary", "fingerprint": "ab0de30ab2295510", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ebe5e490ec8a9540", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in test-simple-remove.mjs:7"}, "properties": {"repobilityId": "36c5755f749dfbb5", "scanner": "scanner-primary", "fingerprint": "ebe5e490ec8a9540", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test-simple-remove.mjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-bf00784f34cbb2d8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in electron/bookshelf-server.ts:137"}, "properties": {"repobilityId": "c3ead5094f1138a6", "scanner": "scanner-primary", "fingerprint": "bf00784f34cbb2d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/bookshelf-server.ts"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-ba92169278d247c2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/parallel-tts-bridge.ts:15"}, "properties": {"repobilityId": "29394ce68ed3d943", "scanner": "scanner-primary", "fingerprint": "ba92169278d247c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/parallel-tts-bridge.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-e382fcf3df18bfa5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/chapter-recovery-bridge.ts:16"}, "properties": {"repobilityId": "2a4eb63714d1733b", "scanner": "scanner-primary", "fingerprint": "e382fcf3df18bfa5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/chapter-recovery-bridge.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-4e2a831d8e30ae24", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/bilingual-assembly-bridge.ts:11"}, "properties": {"repobilityId": "25f3f583d796bef8", "scanner": "scanner-primary", "fingerprint": "4e2a831d8e30ae24", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/bilingual-assembly-bridge.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-8c52efd127eca470", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/tts-bridge.ts:8"}, "properties": {"repobilityId": "27eeb006e78e58d7", "scanner": "scanner-primary", "fingerprint": "8c52efd127eca470", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/tts-bridge.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-85032071660cb683", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/headless-ocr.ts:14"}, "properties": {"repobilityId": "e85383ad5a17b61c", "scanner": "scanner-primary", "fingerprint": "85032071660cb683", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/headless-ocr.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-2c01c6d436269f71", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/pdf-analyzer.ts:10"}, "properties": {"repobilityId": "ae277f4782071bd4", "scanner": "scanner-primary", "fingerprint": "2c01c6d436269f71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/pdf-analyzer.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-1196b06a65a09fa7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/ocr-service.ts:4"}, "properties": {"repobilityId": "03afc4d59747a847", "scanner": "scanner-primary", "fingerprint": "1196b06a65a09fa7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/ocr-service.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-532eaa57e907cf2d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/mutool-bridge.ts:16"}, "properties": {"repobilityId": "02cba66c3f2739c9", "scanner": "scanner-primary", "fingerprint": "532eaa57e907cf2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/mutool-bridge.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-edeaa433c7f95480", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/video-assembly-bridge.ts:12"}, "properties": {"repobilityId": "8795bb7463bc1bd8", "scanner": "scanner-primary", "fingerprint": "edeaa433c7f95480", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/video-assembly-bridge.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-f94c088b40f8dd0a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-assembly-bridge.ts:105"}, "properties": {"repobilityId": "91e934be373af657", "scanner": "scanner-primary", "fingerprint": "f94c088b40f8dd0a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/video-assembly-bridge.ts"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-833fd0d0fcea1567", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/e2a-env-bootstrap.ts:22"}, "properties": {"repobilityId": "1326d8831af74511", "scanner": "scanner-primary", "fingerprint": "833fd0d0fcea1567", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/e2a-env-bootstrap.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-336a81eb5df38b4e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/xtts-streaming-bridge.ts:8"}, "properties": {"repobilityId": "0cb33312bf14da53", "scanner": "scanner-primary", "fingerprint": "336a81eb5df38b4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/xtts-streaming-bridge.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-6ac073a42f4e8b65", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/jwpub-converter.ts:197"}, "properties": {"repobilityId": "d8b0e0c1a49be65f", "scanner": "scanner-primary", "fingerprint": "6ac073a42f4e8b65", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/jwpub-converter.ts"}, "region": {"startLine": 197}}}]}, {"ruleId": "scanner-feb0bd9bed8f4973", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/llama-bridge.ts:21"}, "properties": {"repobilityId": "9c5720f1908fe56a", "scanner": "scanner-primary", "fingerprint": "feb0bd9bed8f4973", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/llama-bridge.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-fdea958c617a2fed", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/main.ts:118"}, "properties": {"repobilityId": "f70c947555263ce6", "scanner": "scanner-primary", "fingerprint": "fdea958c617a2fed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/main.ts"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-8e6c6764ddf9aca0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/ebook-library.ts:11"}, "properties": {"repobilityId": "b671ec4c45fe3931", "scanner": "scanner-primary", "fingerprint": "8e6c6764ddf9aca0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/ebook-library.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-90ff2d324bc7d20a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/ebook-convert-bridge.ts:10"}, "properties": {"repobilityId": "be4bb501ed4a34d0", "scanner": "scanner-primary", "fingerprint": "90ff2d324bc7d20a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/ebook-convert-bridge.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-f1bb8022596f2e2c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/reassembly-bridge.ts:7"}, "properties": {"repobilityId": "72f5b8894ebd6885", "scanner": "scanner-primary", "fingerprint": "f1bb8022596f2e2c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/reassembly-bridge.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-40b126688527ae0d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/video-renderer.html:110"}, "properties": {"repobilityId": "b52f0831976905e8", "scanner": "scanner-primary", "fingerprint": "40b126688527ae0d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/video-renderer.html"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-d49d401bbc401055", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/metadata-tools.ts:28"}, "properties": {"repobilityId": "277fcfd2b4d05c95", "scanner": "scanner-primary", "fingerprint": "d49d401bbc401055", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/metadata-tools.ts"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-20a4e10cb6bca9d5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/tool-paths.ts:16"}, "properties": {"repobilityId": "0fcaef867be5ed9d", "scanner": "scanner-primary", "fingerprint": "20a4e10cb6bca9d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/tool-paths.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-66c3946adcf029b7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/xtts-worker-pool.ts:8"}, "properties": {"repobilityId": "7a119612d2070b33", "scanner": "scanner-primary", "fingerprint": "66c3946adcf029b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/xtts-worker-pool.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-4b739dac9c4f560d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in electron/bookshelf-ui/bookshelf.js:219"}, "properties": {"repobilityId": "99989bdb3fdf5dae", "scanner": "scanner-primary", "fingerprint": "4b739dac9c4f560d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/bookshelf-ui/bookshelf.js"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-ce7ef6926985123f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/components/cuda-tts.ts:25"}, "properties": {"repobilityId": "3856bc1f816b36ce", "scanner": "scanner-primary", "fingerprint": "ce7ef6926985123f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/components/cuda-tts.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-6c45e111ed908d59", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/components/downloader.ts:15"}, "properties": {"repobilityId": "c46e88ac1db8770f", "scanner": "scanner-primary", "fingerprint": "6c45e111ed908d59", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/components/downloader.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-2240c1630400c697", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/components/component-manager.ts:15"}, "properties": {"repobilityId": "fb9467315c818b84", "scanner": "scanner-primary", "fingerprint": "2240c1630400c697", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/components/component-manager.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-bef1594c8ba9a0ce", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/components/system-probe.ts:10"}, "properties": {"repobilityId": "20ccd89bc0ae8895", "scanner": "scanner-primary", "fingerprint": "bef1594c8ba9a0ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/components/system-probe.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-2df968dd5ede32ba", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:464"}, "properties": {"repobilityId": "884e092b11f9e8aa", "scanner": "scanner-primary", "fingerprint": "2df968dd5ede32ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts"}, "region": {"startLine": 464}}}]}, {"ruleId": "scanner-0fb7943e64f96a74", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts:14"}, "properties": {"repobilityId": "7fec57b25adb17f3", "scanner": "scanner-primary", "fingerprint": "0fb7943e64f96a74", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "electron/plugins/builtin/apple-vision-ocr/apple-vision-ocr-plugin.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-314dce5698ca51f4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/download-mupdf.js:15"}, "properties": {"repobilityId": "469822f80aeb70bf", "scanner": "scanner-primary", "fingerprint": "314dce5698ca51f4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/download-mupdf.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-2f30357043635466", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/download-llama-cpp.js:38"}, "properties": {"repobilityId": "93d3b418af8d6332", "scanner": "scanner-primary", "fingerprint": "2f30357043635466", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/download-llama-cpp.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-3ffe9ce27dd33cd5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/compare-text-extraction.js:9"}, "properties": {"repobilityId": "7a190705abb311ce", "scanner": "scanner-primary", "fingerprint": "3ffe9ce27dd33cd5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/compare-text-extraction.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-17a84b52058552ba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/apply-chapters.js:10"}, "properties": {"repobilityId": "084d76c377f9d9e1", "scanner": "scanner-primary", "fingerprint": "17a84b52058552ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/apply-chapters.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-b65c13afb617ab6f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in extension/package.mjs:10"}, "properties": {"repobilityId": "bf853e79d0749aa7", "scanner": "scanner-primary", "fingerprint": "b65c13afb617ab6f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/package.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-16346abfd49127ae", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packaging/build-dmg.js:15"}, "properties": {"repobilityId": "0a44d4584301b1a5", "scanner": "scanner-primary", "fingerprint": "16346abfd49127ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packaging/build-dmg.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-c8e24ae1eb7e1ad2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packaging/stage-resources.js:29"}, "properties": {"repobilityId": "65460f4e5039bd90", "scanner": "scanner-primary", "fingerprint": "c8e24ae1eb7e1ad2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packaging/stage-resources.js"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-87e25b35970197a4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packaging/package-win.js:17"}, "properties": {"repobilityId": "af0b45f3a99b618d", "scanner": "scanner-primary", "fingerprint": "87e25b35970197a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packaging/package-win.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-e5fb582ae1da2132", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packaging/build-inno.js:20"}, "properties": {"repobilityId": "6c69918635d1212d", "scanner": "scanner-primary", "fingerprint": "e5fb582ae1da2132", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packaging/build-inno.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-98dd51f522669b6a", "level": "note", "message": {"text": "Very large file: electron/parallel-tts-bridge.ts (5011 lines)"}, "properties": {"repobilityId": "ece44e64de3abb34", "scanner": "scanner-primary", "fingerprint": "98dd51f522669b6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-53ca16f9e102f2bb", "level": "note", "message": {"text": "Very large file: electron/pdf-analyzer.ts (5958 lines)"}, "properties": {"repobilityId": "a1160751c3fb51f3", "scanner": "scanner-primary", "fingerprint": "53ca16f9e102f2bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-982cc0d23f2da4e9", "level": "note", "message": {"text": "Very large file: electron/preload.ts (3628 lines)"}, "properties": {"repobilityId": "b07ac5e1d124d6dc", "scanner": "scanner-primary", "fingerprint": "982cc0d23f2da4e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9949b78390665f57", "level": "note", "message": {"text": "Very large file: electron/ll-jobs.ts (2120 lines)"}, "properties": {"repobilityId": "e2fcdfcc0d3c918f", "scanner": "scanner-primary", "fingerprint": "9949b78390665f57", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f39ca68b18d03c68", "level": "note", "message": {"text": "Very large file: electron/epub-processor.ts (3314 lines)"}, "properties": {"repobilityId": "0a8108081e2cf719", "scanner": "scanner-primary", "fingerprint": "f39ca68b18d03c68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da701f47b92e50f4", "level": "note", "message": {"text": "Very large file: electron/main.ts (10434 lines)"}, "properties": {"repobilityId": "0ac3fff01134c6fa", "scanner": "scanner-primary", "fingerprint": "da701f47b92e50f4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dcf8166b723e4a60", "level": "note", "message": {"text": "Very large file: electron/reassembly-bridge.ts (1732 lines)"}, "properties": {"repobilityId": "a1fefc17f4720f6d", "scanner": "scanner-primary", "fingerprint": "dcf8166b723e4a60", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea8f557fdb0bfc69", "level": "note", "message": {"text": "Very large file: electron/bilingual-processor.ts (1765 lines)"}, "properties": {"repobilityId": "b910fa3326c03a8e", "scanner": "scanner-primary", "fingerprint": "ea8f557fdb0bfc69", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f4d04458179a9c8d", "level": "note", "message": {"text": "Very large file: electron/ai-bridge.ts (3572 lines)"}, "properties": {"repobilityId": "c246891d693550b8", "scanner": "scanner-primary", "fingerprint": "f4d04458179a9c8d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-99d11d2362b4f7f5", "level": "note", "message": {"text": "Very large file: src/app/core/services/electron.service.ts (3571 lines)"}, "properties": {"repobilityId": "25a605aae13e2f4d", "scanner": "scanner-primary", "fingerprint": "99d11d2362b4f7f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c2bee3de9f8020a3", "level": "note", "message": {"text": "Very large file: src/app/features/settings/settings.component.ts (2514 lines)"}, "properties": {"repobilityId": "2e9cd9d6782ced2c", "scanner": "scanner-primary", "fingerprint": "c2bee3de9f8020a3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-50a050287bd96064", "level": "note", "message": {"text": "Very large file: src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts (4931 lines)"}, "properties": {"repobilityId": "c1fc7959233de0cf", "scanner": "scanner-primary", "fingerprint": "50a050287bd96064", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b0a7dd06b74daef4", "level": "note", "message": {"text": "Very large file: src/app/features/pdf-picker/pdf-picker.component.ts (11181 lines)"}, "properties": {"repobilityId": "2bbb1504395856ab", "scanner": "scanner-primary", "fingerprint": "b0a7dd06b74daef4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-590ffa929e692888", "level": "note", "message": {"text": "Very large file: src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts (5419 lines)"}, "properties": {"repobilityId": "72bae3d0f85ead9b", "scanner": "scanner-primary", "fingerprint": "590ffa929e692888", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-96ac6cfdb92ea72a", "level": "note", "message": {"text": "Very large file: src/app/features/pdf-picker/components/categories-panel/categories-panel.component.ts (2367 lines)"}, "properties": {"repobilityId": "6eaa70b96b2bab76", "scanner": "scanner-primary", "fingerprint": "96ac6cfdb92ea72a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-87c8a60b8fcaf37d", "level": "note", "message": {"text": "Very large file: src/app/features/pdf-picker/services/export.service.ts (1843 lines)"}, "properties": {"repobilityId": "b476780ec2f60af0", "scanner": "scanner-primary", "fingerprint": "87c8a60b8fcaf37d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d06a4823cfc21984", "level": "note", "message": {"text": "Very large file: src/app/features/pdf-picker/services/editor-state.service.ts (1510 lines)"}, "properties": {"repobilityId": "5df019044a19779b", "scanner": "scanner-primary", "fingerprint": "d06a4823cfc21984", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dbee24341beb2dd6", "level": "note", "message": {"text": "Very large file: src/app/features/queue/components/job-progress/job-progress.component.ts (1630 lines)"}, "properties": {"repobilityId": "50a78ec9461553dc", "scanner": "scanner-primary", "fingerprint": "dbee24341beb2dd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b4b3e9a6e93027e4", "level": "note", "message": {"text": "Very large file: src/app/features/queue/services/queue.service.ts (4192 lines)"}, "properties": {"repobilityId": "6c8e06abb7a648ca", "scanner": "scanner-primary", "fingerprint": "b4b3e9a6e93027e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d7763a00e98fb365", "level": "note", "message": {"text": "Very large file: src/app/features/studio/studio.component.ts (2258 lines)"}, "properties": {"repobilityId": "6ec3a2bd7f4d68ca", "scanner": "scanner-primary", "fingerprint": "d7763a00e98fb365", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e340dcf5ebe0610e", "level": "note", "message": {"text": "Very large file: src/app/features/studio/components/audiobook-player/audiobook-player.component.ts (1703 lines)"}, "properties": {"repobilityId": "750d915efda4995c", "scanner": "scanner-primary", "fingerprint": "e340dcf5ebe0610e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c909c821c2ab6e6a", "level": "note", "message": {"text": "Very large file: src/app/features/audiobook/components/play-view/play-view.component.ts (1899 lines)"}, "properties": {"repobilityId": "3169ecb24cd9bd83", "scanner": "scanner-primary", "fingerprint": "c909c821c2ab6e6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "76d97ad4cc3faf69", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "924d6a0141a0b4af", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "05bdb30007bb4119", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "30bb86d150ca7392", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "1e2a76adb7749c52", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "73e9a0a880397ec9", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "8997ef243132393c", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "b6a2f24798df04bf", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f999ce00a6d14a15", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/parallel-tts-bridge.ts:4978"}, "properties": {"repobilityId": "99965f3082b71ba8", "scanner": "scanner-primary", "fingerprint": "f999ce00a6d14a15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46e14564d90d9a21", "level": "none", "message": {"text": "Commented-code block (6 lines) in electron/pdf-analyzer.ts:2805"}, "properties": {"repobilityId": "c69201bd4942846b", "scanner": "scanner-primary", "fingerprint": "46e14564d90d9a21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64900fe790dbeb91", "level": "note", "message": {"text": "Legacy-named symbol `scanLegacy` in electron/preload.ts:1947"}, "properties": {"repobilityId": "bf6e2a68d6aa9310", "scanner": "scanner-primary", "fingerprint": "64900fe790dbeb91", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c65002d8a9dfea2f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/book-analysis.ts:309"}, "properties": {"repobilityId": "8c300abc65e0c8d4", "scanner": "scanner-primary", "fingerprint": "c65002d8a9dfea2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1d450ddadc792c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/pdf-worker.ts:39"}, "properties": {"repobilityId": "66712b9000ad44c8", "scanner": "scanner-primary", "fingerprint": "a1d450ddadc792c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef1f4c3329e98e71", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/pdf-bridge.ts:222"}, "properties": {"repobilityId": "01ca9cb180171035", "scanner": "scanner-primary", "fingerprint": "ef1f4c3329e98e71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73fe718fe3e2b37a", "level": "none", "message": {"text": "Commented-code block (8 lines) in electron/e2a-env-bootstrap.ts:164"}, "properties": {"repobilityId": "c6bd91f66a7c0a26", "scanner": "scanner-primary", "fingerprint": "73fe718fe3e2b37a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe2f4133a6240a6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/ll-jobs.ts:1412"}, "properties": {"repobilityId": "68f164d6fee541e1", "scanner": "scanner-primary", "fingerprint": "fe2f4133a6240a6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfc46222c80131d7", "level": "note", "message": {"text": "Legacy-named symbol `normalizedOld` in electron/epub-processor.ts:1866"}, "properties": {"repobilityId": "7fef8aee37c3d835", "scanner": "scanner-primary", "fingerprint": "bfc46222c80131d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-03ed5a0d7c4ee3f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/epub-processor.ts:2707"}, "properties": {"repobilityId": "7e1cf0701290bd04", "scanner": "scanner-primary", "fingerprint": "03ed5a0d7c4ee3f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-070d75f3cbc5a89b", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/language-learning-jobs.ts:377"}, "properties": {"repobilityId": "37f8a344cd3c5ab0", "scanner": "scanner-primary", "fingerprint": "070d75f3cbc5a89b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-beea7ed9dd65380b", "level": "note", "message": {"text": "Legacy-named symbol `hasOriginalLegacy` in electron/main.ts:4819"}, "properties": {"repobilityId": "d62c2f2c5aa5cb39", "scanner": "scanner-primary", "fingerprint": "beea7ed9dd65380b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e44a502334a47e8", "level": "none", "message": {"text": "Commented-code block (6 lines) in electron/main.ts:29"}, "properties": {"repobilityId": "e04def77b7ff27d7", "scanner": "scanner-primary", "fingerprint": "5e44a502334a47e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ffca4c3fe777c9cc", "level": "none", "message": {"text": "Commented-code block (10 lines) in electron/tts-api-server.ts:80"}, "properties": {"repobilityId": "2cb73b4c5ad48e34", "scanner": "scanner-primary", "fingerprint": "ffca4c3fe777c9cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cccd69dc34abb9ca", "level": "note", "message": {"text": "Legacy-named symbol `completedSetOld` in electron/reassembly-bridge.ts:368"}, "properties": {"repobilityId": "82b60709dd01809c", "scanner": "scanner-primary", "fingerprint": "cccd69dc34abb9ca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-180ad1f4821bf81e", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/reassembly-bridge.ts:910"}, "properties": {"repobilityId": "7c76a5b3fc8637fb", "scanner": "scanner-primary", "fingerprint": "180ad1f4821bf81e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc55c28d8077a7b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bilingual-processor.ts:135"}, "properties": {"repobilityId": "c5a9b2fc777e3a9f", "scanner": "scanner-primary", "fingerprint": "fc55c28d8077a7b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93296405abfeb8f3", "level": "none", "message": {"text": "Commented-code block (7 lines) in electron/xtts-voices.ts:61"}, "properties": {"repobilityId": "5d3c59ac78d9722b", "scanner": "scanner-primary", "fingerprint": "93296405abfeb8f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34a03e5d925931b3", "level": "none", "message": {"text": "Commented-code block (10 lines) in electron/stream-scheduler.ts:43"}, "properties": {"repobilityId": "1a62c7b7cb7efafb", "scanner": "scanner-primary", "fingerprint": "34a03e5d925931b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3f2ca610f36c121", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/e2a-paths.ts:414"}, "properties": {"repobilityId": "9e65ca765385575a", "scanner": "scanner-primary", "fingerprint": "f3f2ca610f36c121", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d9a018243539d21", "level": "none", "message": {"text": "Commented-code block (9 lines) in electron/xtts-worker-pool.ts:85"}, "properties": {"repobilityId": "79f0c7b4e0b0cbd7", "scanner": "scanner-primary", "fingerprint": "9d9a018243539d21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20bdb9c2ad7ec779", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/bookshelf-ui/bookshelf.js:432"}, "properties": {"repobilityId": "fd5b5742cb59dd8b", "scanner": "scanner-primary", "fingerprint": "20bdb9c2ad7ec779", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e13f42e4decdb63d", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/scripts/xtts_stream.py:36"}, "properties": {"repobilityId": "44a84a36c892f6a6", "scanner": "scanner-primary", "fingerprint": "e13f42e4decdb63d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b059138a59196799", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-types.ts:136"}, "properties": {"repobilityId": "920ade0f2eed2ce8", "scanner": "scanner-primary", "fingerprint": "b059138a59196799", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcb7069390e40258", "level": "none", "message": {"text": "Commented-code block (8 lines) in electron/components/component-catalog.ts:100"}, "properties": {"repobilityId": "ca0cdc7dadea0a11", "scanner": "scanner-primary", "fingerprint": "bcb7069390e40258", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b776e59cd64d481", "level": "none", "message": {"text": "Commented-code block (6 lines) in electron/components/component-manager.ts:1158"}, "properties": {"repobilityId": "df6b64ca5f64550e", "scanner": "scanner-primary", "fingerprint": "2b776e59cd64d481", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47cd2438aa6c61f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/component-manager.ts:374"}, "properties": {"repobilityId": "7e09dccc10391e92", "scanner": "scanner-primary", "fingerprint": "47cd2438aa6c61f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-819efed6a779e296", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/components/llama-cuda.ts:30"}, "properties": {"repobilityId": "c9f64a1c6bd1d3d3", "scanner": "scanner-primary", "fingerprint": "819efed6a779e296", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ed6d9e378c7d077", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 electron/components/llama-cuda.ts:73"}, "properties": {"repobilityId": "df69aed29f6c7553", "scanner": "scanner-primary", "fingerprint": "1ed6d9e378c7d077", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35eb9709d421939e", "level": "none", "message": {"text": "Commented-code block (5 lines) in electron/components/system-probe.ts:249"}, "properties": {"repobilityId": "8d4a5f8ea37160b6", "scanner": "scanner-primary", "fingerprint": "35eb9709d421939e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-960de40dc73500ba", "level": "none", "message": {"text": "Commented-code block (12 lines) in scripts/migrate-library-to-projects.mjs:6"}, "properties": {"repobilityId": "a7775dec3b00c00e", "scanner": "scanner-primary", "fingerprint": "960de40dc73500ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab8b14167905d012", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/reverse-migration.mjs:4"}, "properties": {"repobilityId": "7b51f7d380df68d0", "scanner": "scanner-primary", "fingerprint": "ab8b14167905d012", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03aa7ec5fa10c9c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in extension/build.mjs:17"}, "properties": {"repobilityId": "06b8947a3372e1c6", "scanner": "scanner-primary", "fingerprint": "03aa7ec5fa10c9c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0347991190aba0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in extension/src/content.ts:724"}, "properties": {"repobilityId": "165d2b9c6ebf1865", "scanner": "scanner-primary", "fingerprint": "a0347991190aba0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8414fa436c5e7baa", "level": "none", "message": {"text": "Commented-code block (5 lines) in extension/src/protocol.ts:66"}, "properties": {"repobilityId": "cec7cee8c5c83178", "scanner": "scanner-primary", "fingerprint": "8414fa436c5e7baa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8963b4070d93f915", "level": "none", "message": {"text": "Commented-code block (7 lines) in extension/src/offscreen.ts:72"}, "properties": {"repobilityId": "3213a2b01e0c2627", "scanner": "scanner-primary", "fingerprint": "8963b4070d93f915", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-048e4d0a4b839519", "level": "none", "message": {"text": "Commented-code block (5 lines) in packaging/stage-resources.js:105"}, "properties": {"repobilityId": "b1aea45d9be9c2e3", "scanner": "scanner-primary", "fingerprint": "048e4d0a4b839519", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ab0d0de8c9fee40", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/app.ts:288"}, "properties": {"repobilityId": "8007a8794fa76e76", "scanner": "scanner-primary", "fingerprint": "4ab0d0de8c9fee40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0f14bf1e77646a0", "level": "note", "message": {"text": "Legacy-named symbol `manifestScanLegacy` in src/app/core/services/electron.service.ts:3420"}, "properties": {"repobilityId": "e45dfc17485d34fd", "scanner": "scanner-primary", "fingerprint": "d0f14bf1e77646a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5bc8d4c66f1a7f17", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/core/services/electron.service.ts:3498"}, "properties": {"repobilityId": "a51f42768110a68a", "scanner": "scanner-primary", "fingerprint": "5bc8d4c66f1a7f17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ca11d9e72245a8c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/core/services/electron.service.ts:432"}, "properties": {"repobilityId": "8180f7a1c9be0c7d", "scanner": "scanner-primary", "fingerprint": "2ca11d9e72245a8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9681ae27df213313", "level": "note", "message": {"text": "Legacy-named symbol `scanLegacy` in src/app/core/services/manifest.service.ts:320"}, "properties": {"repobilityId": "bfb310bbd4f22817", "scanner": "scanner-primary", "fingerprint": "9681ae27df213313", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a904c1a79d03e1a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/features/pdf-picker/pdf-picker.component.ts:9868"}, "properties": {"repobilityId": "04daab6c727ceddb", "scanner": "scanner-primary", "fingerprint": "a904c1a79d03e1a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44e702d49f9db8f8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/features/pdf-picker/components/pdf-viewer/pdf-viewer.component.ts:2572"}, "properties": {"repobilityId": "b9c421fc066b3bef", "scanner": "scanner-primary", "fingerprint": "44e702d49f9db8f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59f6618dcd162662", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/features/pdf-picker/services/ocr-post-processor.service.ts:625"}, "properties": {"repobilityId": "d92c41d957f8cdde", "scanner": "scanner-primary", "fingerprint": "59f6618dcd162662", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c50f56a0680a74f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/features/pdf-picker/services/pdf.service.ts:92"}, "properties": {"repobilityId": "bb0d42b984dbe2f6", "scanner": "scanner-primary", "fingerprint": "c50f56a0680a74f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-70976d767f012037", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/features/pdf-picker/services/paragraph-detector.ts:364"}, "properties": {"repobilityId": "db0badeef5bbcf65", "scanner": "scanner-primary", "fingerprint": "70976d767f012037", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b68450681ec8b721", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/features/queue/queue.component.ts:527"}, "properties": {"repobilityId": "b64373c99c2f1fbb", "scanner": "scanner-primary", "fingerprint": "b68450681ec8b721", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ac7c514217cfa90", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/features/queue/services/queue.service.ts:2270"}, "properties": {"repobilityId": "b51e65382f4a86be", "scanner": "scanner-primary", "fingerprint": "8ac7c514217cfa90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ebf7c12c477b2f14", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/features/studio/services/studio.service.ts:84"}, "properties": {"repobilityId": "a4ac38826a17fe3c", "scanner": "scanner-primary", "fingerprint": "ebf7c12c477b2f14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-520cc8323ffb4941", "level": "error", "message": {"text": "Dangling fetch: POST /api/queue/${action} (electron/bookshelf-ui/bookshelf.js:738)"}, "properties": {"repobilityId": "5f959955768aeb7c", "scanner": "scanner-primary", "fingerprint": "520cc8323ffb4941", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ff9c227eae101f1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/book-analysis.ts:350)"}, "properties": {"repobilityId": "d833e7a7f0a77e04", "scanner": "scanner-primary", "fingerprint": "2ff9c227eae101f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c9e272e23105f231", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/book-analysis.ts:394)"}, "properties": {"repobilityId": "aefa85b400481d36", "scanner": "scanner-primary", "fingerprint": "c9e272e23105f231", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f72edc32054ae5f", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${this.port}/v1/chat/completions (electron/llama-bridge.ts:609)"}, "properties": {"repobilityId": "96b53be50437c221", "scanner": "scanner-primary", "fingerprint": "5f72edc32054ae5f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89d56bd8c694a0b9", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (electron/main.ts:7556)"}, "properties": {"repobilityId": "2fb135cbf63db42d", "scanner": "scanner-primary", "fingerprint": "89d56bd8c694a0b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce9c2a24f648ffcd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/translation-bridge.ts:252)"}, "properties": {"repobilityId": "484e833c9f28e5d0", "scanner": "scanner-primary", "fingerprint": "ce9c2a24f648ffcd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bbd59fba0969114", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/translation-bridge.ts:303)"}, "properties": {"repobilityId": "eead891b5a043578", "scanner": "scanner-primary", "fingerprint": "7bbd59fba0969114", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b1fe9f76c4f57e5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/bilingual-processor.ts:166)"}, "properties": {"repobilityId": "d0c33a7ead4d29be", "scanner": "scanner-primary", "fingerprint": "1b1fe9f76c4f57e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6be9cf9470c8ed96", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/bilingual-processor.ts:205)"}, "properties": {"repobilityId": "99893713e2309113", "scanner": "scanner-primary", "fingerprint": "6be9cf9470c8ed96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-862e356c0b4eb483", "level": "error", "message": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (electron/ai-bridge.ts:986)"}, "properties": {"repobilityId": "6f9cd02209a92a5f", "scanner": "scanner-primary", "fingerprint": "862e356c0b4eb483", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39448282a2e8ec74", "level": "error", "message": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (electron/ai-bridge.ts:1113)"}, "properties": {"repobilityId": "a7fba4a8fee805f6", "scanner": "scanner-primary", "fingerprint": "39448282a2e8ec74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30466e6cef5c09a8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (electron/ai-bridge.ts:1292)"}, "properties": {"repobilityId": "2bb323d854c11ff8", "scanner": "scanner-primary", "fingerprint": "30466e6cef5c09a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3a33bff84aca9b83", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (electron/ai-bridge.ts:1499)"}, "properties": {"repobilityId": "fb152baf039a6da5", "scanner": "scanner-primary", "fingerprint": "3a33bff84aca9b83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-986b9867d86663f8", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5848/api/browse?path=${encodeURIComponent(dirPath)} (src/app/core/services/electron.service.ts:432)"}, "properties": {"repobilityId": "700a8aa6e0eb67bd", "scanner": "scanner-primary", "fingerprint": "986b9867d86663f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ca1be710ba07b63", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/language-learning/components/ll-wizard/ll-wizard.component.ts:3051)"}, "properties": {"repobilityId": "63501529ddaf275b", "scanner": "scanner-primary", "fingerprint": "9ca1be710ba07b63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5597c0707e23f156", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/studio/components/studio-insights/studio-insights.component.ts:405)"}, "properties": {"repobilityId": "7182546bafbf2ee8", "scanner": "scanner-primary", "fingerprint": "5597c0707e23f156", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d1840fbf3cc9943", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (src/app/features/audiobook/components/translation-panel/translation-panel.component.ts:460)"}, "properties": {"repobilityId": "436695c40c8d1efd", "scanner": "scanner-primary", "fingerprint": "2d1840fbf3cc9943", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85cf24efe3105301", "level": "note", "message": {"text": "Unused endpoint: OPTIONS /api/audio"}, "properties": {"repobilityId": "d8e32e64bafa5011", "scanner": "scanner-primary", "fingerprint": "85cf24efe3105301", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e73369d325056697", "level": "note", "message": {"text": "Unused endpoint: GET /api/books"}, "properties": {"repobilityId": "c8b00c4c383bef93", "scanner": "scanner-primary", "fingerprint": "e73369d325056697", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cacbd8e82f2940dd", "level": "note", "message": {"text": "Unused endpoint: GET /api/download"}, "properties": {"repobilityId": "02995cfe3d66e3b7", "scanner": "scanner-primary", "fingerprint": "cacbd8e82f2940dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f91165c63eb1c9e", "level": "note", "message": {"text": "Unused endpoint: GET /api/audio"}, "properties": {"repobilityId": "be2d47cf707b80de", "scanner": "scanner-primary", "fingerprint": "5f91165c63eb1c9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f90bfe720c1d950e", "level": "note", "message": {"text": "Unused endpoint: GET /api/tags"}, "properties": {"repobilityId": "5002f2a570b904d4", "scanner": "scanner-primary", "fingerprint": "f90bfe720c1d950e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8bb8e7009d3ad6a", "level": "note", "message": {"text": "Unused endpoint: GET /api/ebooks"}, "properties": {"repobilityId": "aeb87b4b5154c193", "scanner": "scanner-primary", "fingerprint": "d8bb8e7009d3ad6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37b0cd0330912b66", "level": "note", "message": {"text": "Unused endpoint: GET /api/ebook-download"}, "properties": {"repobilityId": "cab13445bdff4c68", "scanner": "scanner-primary", "fingerprint": "37b0cd0330912b66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c5750dfa4b3af21", "level": "note", "message": {"text": "Unused endpoint: POST /api/queue/start"}, "properties": {"repobilityId": "2c817e7ad538511a", "scanner": "scanner-primary", "fingerprint": "3c5750dfa4b3af21", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f7559498a4c9b23", "level": "note", "message": {"text": "Unused endpoint: POST /api/queue/pause"}, "properties": {"repobilityId": "70be744ac3030191", "scanner": "scanner-primary", "fingerprint": "1f7559498a4c9b23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "c54ea71424a7a562", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}