{"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-33274ebf39a9fbeb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DocumentDetailScreen.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DocumentDetailScreen.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a51f8f96e870c71e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/SettingsScreen.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/SettingsScreen.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2f2d5754ca07d8a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ActivityScreen.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ActivityScreen.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f67fbabdb674cbe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DashboardScreen.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DashboardScreen.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38223a1bfb735d9b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ReviewQueueScreen.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ReviewQueueScreen.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b99b3da04d3fa07e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CaptureSheet.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CaptureSheet.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2d17a36c8f265f7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/ProcessingTray.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/ProcessingTray.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a26bc4b9cc0bcf41", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/test_db_conn.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/test_db_conn.js:8"}, "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-a0437daa76d365b7", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/verify_deployment.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/verify_deployment.js:4"}, "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-4d64e16164a40b56", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/scripts/send_reminders.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/scripts/send_reminders.js:35"}, "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-ecd68b252e332e70", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/prisma/seed.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/prisma/seed.ts:9"}, "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-e6f439485ef1dcb2", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.ts:8"}, "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-ea01cb7042edb14e", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/app.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/app.ts:29"}, "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-88ef2910eb78563a", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/middleware/authMiddleware.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/middleware/authMiddleware.ts:50"}, "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-5a7786d63f40f1b9", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/webhookController.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/webhookController.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-2800f0017f1b5ae7", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/uploadController.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/uploadController.ts:25"}, "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-fb87684bb6cd4cc3", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/documentController.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/documentController.ts:69"}, "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-7820a2a6a0f4a20a", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/staleSweepService.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/staleSweepService.ts:31"}, "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-84567e79feb7d525", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/normalizationService.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/normalizationService.ts:65"}, "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-9237936ef2c67082", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/entityResolution.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/entityResolution.ts:37"}, "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-3b5f8df3a4724388", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/persistence.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/persistence.ts: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-0db85325d12e7a41", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/ingestionService.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/ingestionService.ts:35"}, "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-e0d571efffa7ea5c", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/query/intentParser.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/query/intentParser.ts:11"}, "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-8ca6ab635d0a8aef", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/extraction/geminiAdapter.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/extraction/geminiAdapter.ts:77"}, "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-b2bbfb767d70e8e7", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/storage/supabaseStorage.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/storage/supabaseStorage.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-e4cf595ca8982b6d", "name": "Runtime dotenv file present in repo: apps/frontend/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: apps/frontend/.env.production"}, "fullDescription": {"text": "`apps/frontend/.env.production` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2d79700b32b115e2", "name": "Possible secret in apps/frontend/src/i18n/strings.ts", "shortDescription": {"text": "Possible secret in apps/frontend/src/i18n/strings.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-186a27508423ad77", "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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "13 tests / 104 src (ratio 0.12)."}, "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 61 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 19 placeholder/mock markers across 9 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-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-3f939133d8bc6988", "name": "Commented-code block (5 lines) in apps/frontend/vite.config.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/vite.config.ts: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-46493e10b26e6f11", "name": "Commented-code block (5 lines) in apps/frontend/capacitor.config.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/capacitor.config.ts:3"}, "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-750c6b7ed1f564b6", "name": "Commented-code block (5 lines) in apps/frontend/src/contexts/ProcessingContext.tsx:111", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/src/contexts/ProcessingContext.tsx:111"}, "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-9a867c24f525277a", "name": "Commented-code block (5 lines) in apps/frontend/src/services/apiConfig.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/src/services/apiConfig.ts:5"}, "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-3728aedec27b344f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/frontend/src/services/documentService.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/frontend/src/services/documentService.ts:28"}, "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-5c3b137045b97563", "name": "Commented-code block (6 lines) in apps/frontend/src/native/camera.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in apps/frontend/src/native/camera.ts: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-62b53aa60315ad6b", "name": "Commented-code block (5 lines) in apps/frontend/src/native/overlayStack.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/src/native/overlayStack.ts:3"}, "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-a64868a65bfb4bb9", "name": "Commented-code block (5 lines) in apps/frontend/src/native/shell.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/src/native/shell.ts:9"}, "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-81d4321d5fdad1fd", "name": "Commented-code block (7 lines) in apps/frontend/src/native/NativeBackButton.tsx:12", "shortDescription": {"text": "Commented-code block (7 lines) in apps/frontend/src/native/NativeBackButton.tsx:12"}, "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-bff8c5887c7763c5", "name": "Commented-code block (6 lines) in apps/backend/src/corsOrigin.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in apps/backend/src/corsOrigin.ts:8"}, "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-a01ca7915ea3825f", "name": "Commented-code block (6 lines) in apps/backend/src/routes/documentRoutes.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in apps/backend/src/routes/documentRoutes.ts:9"}, "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-2a8fe830734a65b3", "name": "Commented-code block (5 lines) in apps/backend/src/controllers/webhookController.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in apps/backend/src/controllers/webhookController.ts: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-fa03eb84ff0b8047", "name": "Commented-code block (6 lines) in apps/backend/src/services/staleSweepService.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in apps/backend/src/services/staleSweepService.ts:3"}, "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-ab4bbcc128b5877b", "name": "Commented-code block (9 lines) in apps/backend/src/services/extraction/geminiAdapter.ts:168", "shortDescription": {"text": "Commented-code block (9 lines) in apps/backend/src/services/extraction/geminiAdapter.ts:168"}, "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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALLOWED_ORIGINS`, `API_URL`, `BLOCKED_ORGANIZATION_IDS`, `NODE_ENV`, `PROD`, `RESEND_API_KEY`, `VERCEL_ENV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ffccb5100c06a4b", "name": "Frontend route `documents/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `documents/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-58a0466cfb5ac30a", "name": "Frontend route `/documents/:id` has no Link/navigate to it \u2014 apps/frontend/tests/reviewQueueActions.test.tsx", "shortDescription": {"text": "Frontend route `/documents/:id` has no Link/navigate to it \u2014 apps/frontend/tests/reviewQueueActions.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8fdbadcb1e1f317f", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c41ed7345438a7cd", "name": "Frontend route `activity` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `activity` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e88aea681db75b5", "name": "Frontend route `search` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `search` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-894484dad65bf5f2", "name": "Frontend route `queue` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `queue` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe34bdaed03ad082", "name": "Frontend route `settings` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a91f35f565a5c63", "name": "Dangling fetch: POST https://api.resend.com/emails (apps/backend/scripts/send_reminders.js:19)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/backend/scripts/send_reminders.js:19)"}, "fullDescription": {"text": "`apps/backend/scripts/send_reminders.js:19` calls `POST https://api.resend.com/emails` 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.resend.com/emails`\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-1b01ef04895bc656", "name": "Unused endpoint: POST /api/webhook/paddle", "shortDescription": {"text": "Unused endpoint: POST /api/webhook/paddle"}, "fullDescription": {"text": "`apps/backend/src/app.ts` declares `POST /api/webhook/paddle` 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": "`apps/backend/src/app.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}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`apps/backend/src/app.ts` declares `USE /api` 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-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /stats` 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-bc8121c4b0d774a7", "name": "Unused endpoint: GET /review", "shortDescription": {"text": "Unused endpoint: GET /review"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /review` 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-c924d9b3c26c9d64", "name": "Unused endpoint: GET /export.csv", "shortDescription": {"text": "Unused endpoint: GET /export.csv"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /export.csv` 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-955005a6da85f786", "name": "Unused endpoint: GET /recent", "shortDescription": {"text": "Unused endpoint: GET /recent"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /recent` 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-2c3d1d103b19a7f6", "name": "Unused endpoint: GET /all", "shortDescription": {"text": "Unused endpoint: GET /all"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /all` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `GET /:id` 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-f39249a345a19765", "name": "Unused endpoint: PATCH /:id/status", "shortDescription": {"text": "Unused endpoint: PATCH /:id/status"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `PATCH /:id/status` 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-ebe1fa4405e6dd60", "name": "Unused endpoint: POST /:id/action", "shortDescription": {"text": "Unused endpoint: POST /:id/action"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `POST /:id/action` 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-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`apps/backend/src/routes/documentRoutes.ts` declares `POST /upload` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`apps/backend/src/routes/userRoutes.ts` declares `GET /me` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/backend/src/routes/searchRoutes.ts` declares `POST /` 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-44a8d35cd092dc20", "name": "Unused endpoint: USE /search", "shortDescription": {"text": "Unused endpoint: USE /search"}, "fullDescription": {"text": "`apps/backend/src/routes/index.ts` declares `USE /search` 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-7a8f40a426fdfb45", "name": "Unused endpoint: USE /reports", "shortDescription": {"text": "Unused endpoint: USE /reports"}, "fullDescription": {"text": "`apps/backend/src/routes/index.ts` declares `USE /reports` 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-428d7ebee5918103", "name": "Unused endpoint: USE /documents", "shortDescription": {"text": "Unused endpoint: USE /documents"}, "fullDescription": {"text": "`apps/backend/src/routes/index.ts` declares `USE /documents` 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-998aed95457284e2", "name": "Unused endpoint: USE /user", "shortDescription": {"text": "Unused endpoint: USE /user"}, "fullDescription": {"text": "`apps/backend/src/routes/index.ts` declares `USE /user` 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-f29f9bdfc54146dc", "name": "Unused endpoint: USE /expenses", "shortDescription": {"text": "Unused endpoint: USE /expenses"}, "fullDescription": {"text": "`apps/backend/src/routes/index.ts` declares `USE /expenses` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`apps/backend/src/routes/expenseRoutes.ts` declares `GET /summary` 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/21556"}, "properties": {"repository": "tornidomaroc-web/scan-and-action", "repoUrl": "https://github.com/tornidomaroc-web/scan-and-action", "branch": "main"}, "results": [{"ruleId": "scanner-33274ebf39a9fbeb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DocumentDetailScreen.tsx:114"}, "properties": {"repobilityId": "f8bc4cf42737ce63", "scanner": "scanner-primary", "fingerprint": "33274ebf39a9fbeb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a51f8f96e870c71e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/SettingsScreen.tsx:61"}, "properties": {"repobilityId": "102d9696480b944f", "scanner": "scanner-primary", "fingerprint": "a51f8f96e870c71e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2f2d5754ca07d8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ActivityScreen.tsx:121"}, "properties": {"repobilityId": "72b6fb369e3b97ba", "scanner": "scanner-primary", "fingerprint": "e2f2d5754ca07d8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f67fbabdb674cbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/DashboardScreen.tsx:210"}, "properties": {"repobilityId": "bc513ad93c55153a", "scanner": "scanner-primary", "fingerprint": "3f67fbabdb674cbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38223a1bfb735d9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/screens/ReviewQueueScreen.tsx:130"}, "properties": {"repobilityId": "b5d1c2bbc1f3839e", "scanner": "scanner-primary", "fingerprint": "38223a1bfb735d9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b99b3da04d3fa07e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CaptureSheet.tsx:210"}, "properties": {"repobilityId": "a2ca9ff9f6141f95", "scanner": "scanner-primary", "fingerprint": "b99b3da04d3fa07e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2d17a36c8f265f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/ProcessingTray.tsx:94"}, "properties": {"repobilityId": "9924cbceab99c209", "scanner": "scanner-primary", "fingerprint": "d2d17a36c8f265f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a26bc4b9cc0bcf41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/test_db_conn.js:8"}, "properties": {"repobilityId": "5abb79532586827c", "scanner": "scanner-primary", "fingerprint": "a26bc4b9cc0bcf41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0437daa76d365b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/verify_deployment.js:4"}, "properties": {"repobilityId": "1a73bdf9b70405a0", "scanner": "scanner-primary", "fingerprint": "a0437daa76d365b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d64e16164a40b56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/scripts/send_reminders.js:35"}, "properties": {"repobilityId": "828e1f1a821e408d", "scanner": "scanner-primary", "fingerprint": "4d64e16164a40b56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ecd68b252e332e70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/prisma/seed.ts:9"}, "properties": {"repobilityId": "418f71b13c11ab60", "scanner": "scanner-primary", "fingerprint": "ecd68b252e332e70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6f439485ef1dcb2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.ts:8"}, "properties": {"repobilityId": "71ca2f20da7b1e52", "scanner": "scanner-primary", "fingerprint": "e6f439485ef1dcb2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea01cb7042edb14e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/app.ts:29"}, "properties": {"repobilityId": "3e4bfc0aee3d6869", "scanner": "scanner-primary", "fingerprint": "ea01cb7042edb14e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88ef2910eb78563a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/middleware/authMiddleware.ts:50"}, "properties": {"repobilityId": "3dd1a210bd486409", "scanner": "scanner-primary", "fingerprint": "88ef2910eb78563a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a7786d63f40f1b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/webhookController.ts:91"}, "properties": {"repobilityId": "647dddbe718b372c", "scanner": "scanner-primary", "fingerprint": "5a7786d63f40f1b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2800f0017f1b5ae7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/uploadController.ts:25"}, "properties": {"repobilityId": "2979bb8ce5a0a3eb", "scanner": "scanner-primary", "fingerprint": "2800f0017f1b5ae7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb87684bb6cd4cc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/controllers/documentController.ts:69"}, "properties": {"repobilityId": "6bc86f80bc96bc55", "scanner": "scanner-primary", "fingerprint": "fb87684bb6cd4cc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7820a2a6a0f4a20a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/staleSweepService.ts:31"}, "properties": {"repobilityId": "8567cab873fec723", "scanner": "scanner-primary", "fingerprint": "7820a2a6a0f4a20a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84567e79feb7d525", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/normalizationService.ts:65"}, "properties": {"repobilityId": "75cd86fd50727da3", "scanner": "scanner-primary", "fingerprint": "84567e79feb7d525", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9237936ef2c67082", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/normalization/entityResolution.ts:37"}, "properties": {"repobilityId": "88789d10c359bab8", "scanner": "scanner-primary", "fingerprint": "9237936ef2c67082", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b5f8df3a4724388", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/persistence.ts:70"}, "properties": {"repobilityId": "78e9915fd21e1132", "scanner": "scanner-primary", "fingerprint": "3b5f8df3a4724388", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0db85325d12e7a41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/ingestion/ingestionService.ts:35"}, "properties": {"repobilityId": "240e1bfe67714750", "scanner": "scanner-primary", "fingerprint": "0db85325d12e7a41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0d571efffa7ea5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/query/intentParser.ts:11"}, "properties": {"repobilityId": "85c227acde35873f", "scanner": "scanner-primary", "fingerprint": "e0d571efffa7ea5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ca6ab635d0a8aef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/extraction/geminiAdapter.ts:77"}, "properties": {"repobilityId": "f3db936625ec0de3", "scanner": "scanner-primary", "fingerprint": "8ca6ab635d0a8aef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2bbfb767d70e8e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/services/storage/supabaseStorage.ts:24"}, "properties": {"repobilityId": "d0dcb8696e37e4b2", "scanner": "scanner-primary", "fingerprint": "b2bbfb767d70e8e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4cf595ca8982b6d", "level": "error", "message": {"text": "Runtime dotenv file present in repo: apps/frontend/.env.production"}, "properties": {"repobilityId": "c9647399206c8e31", "scanner": "scanner-primary", "fingerprint": "e4cf595ca8982b6d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d79700b32b115e2", "level": "error", "message": {"text": "Possible secret in apps/frontend/src/i18n/strings.ts"}, "properties": {"repobilityId": "9bed03fb35ae1561", "scanner": "scanner-primary", "fingerprint": "2d79700b32b115e2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/src/i18n/strings.ts"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-2d79700b32b115e2", "level": "error", "message": {"text": "Possible secret in apps/frontend/src/i18n/strings.ts"}, "properties": {"repobilityId": "9bed03fb35ae1561", "scanner": "scanner-primary", "fingerprint": "2d79700b32b115e2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/src/i18n/strings.ts"}, "region": {"startLine": 454}}}]}, {"ruleId": "scanner-2d79700b32b115e2", "level": "error", "message": {"text": "Possible secret in apps/frontend/src/i18n/strings.ts"}, "properties": {"repobilityId": "9bed03fb35ae1561", "scanner": "scanner-primary", "fingerprint": "2d79700b32b115e2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/src/i18n/strings.ts"}, "region": {"startLine": 686}}}]}, {"ruleId": "scanner-186a27508423ad77", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "173faf94bea2783c", "scanner": "scanner-primary", "fingerprint": "186a27508423ad77", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "b16e7def445538d5", "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": "bd396ba29a9c8aad", "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": "820841337b5ab079", "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": "a62c28e507fb3859", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "0fd168954f04dfd4", "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": "4c15d86b4f28da0e", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-3f939133d8bc6988", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/vite.config.ts:4"}, "properties": {"repobilityId": "e8808e1cca6884a6", "scanner": "scanner-primary", "fingerprint": "3f939133d8bc6988", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46493e10b26e6f11", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/capacitor.config.ts:3"}, "properties": {"repobilityId": "f103d97d8007c7ff", "scanner": "scanner-primary", "fingerprint": "46493e10b26e6f11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-750c6b7ed1f564b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/src/contexts/ProcessingContext.tsx:111"}, "properties": {"repobilityId": "7ce6347eaa070530", "scanner": "scanner-primary", "fingerprint": "750c6b7ed1f564b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a867c24f525277a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/src/services/apiConfig.ts:5"}, "properties": {"repobilityId": "32dd8388c75c3dc4", "scanner": "scanner-primary", "fingerprint": "9a867c24f525277a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3728aedec27b344f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/frontend/src/services/documentService.ts:28"}, "properties": {"repobilityId": "4c0bcf66b33af975", "scanner": "scanner-primary", "fingerprint": "3728aedec27b344f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c3b137045b97563", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/frontend/src/native/camera.ts:4"}, "properties": {"repobilityId": "b8842d626b7c29c2", "scanner": "scanner-primary", "fingerprint": "5c3b137045b97563", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62b53aa60315ad6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/src/native/overlayStack.ts:3"}, "properties": {"repobilityId": "e71cecaea8db0eaf", "scanner": "scanner-primary", "fingerprint": "62b53aa60315ad6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a64868a65bfb4bb9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/src/native/shell.ts:9"}, "properties": {"repobilityId": "ca23ca52a288726c", "scanner": "scanner-primary", "fingerprint": "a64868a65bfb4bb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81d4321d5fdad1fd", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/frontend/src/native/NativeBackButton.tsx:12"}, "properties": {"repobilityId": "efb9d8ab35679840", "scanner": "scanner-primary", "fingerprint": "81d4321d5fdad1fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bff8c5887c7763c5", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/backend/src/corsOrigin.ts:8"}, "properties": {"repobilityId": "0aa554fa59995bd0", "scanner": "scanner-primary", "fingerprint": "bff8c5887c7763c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a01ca7915ea3825f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/backend/src/routes/documentRoutes.ts:9"}, "properties": {"repobilityId": "42a75e72578e8469", "scanner": "scanner-primary", "fingerprint": "a01ca7915ea3825f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a8fe830734a65b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/backend/src/controllers/webhookController.ts:6"}, "properties": {"repobilityId": "e41dbd00747c5f55", "scanner": "scanner-primary", "fingerprint": "2a8fe830734a65b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa03eb84ff0b8047", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/backend/src/services/staleSweepService.ts:3"}, "properties": {"repobilityId": "ab8d9386cebbac4a", "scanner": "scanner-primary", "fingerprint": "fa03eb84ff0b8047", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab4bbcc128b5877b", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/backend/src/services/extraction/geminiAdapter.ts:168"}, "properties": {"repobilityId": "9906ea5b2d5fdb7e", "scanner": "scanner-primary", "fingerprint": "ab4bbcc128b5877b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-9ffccb5100c06a4b", "level": "warning", "message": {"text": "Frontend route `documents/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "d86302bed02a1d54", "scanner": "scanner-primary", "fingerprint": "9ffccb5100c06a4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-58a0466cfb5ac30a", "level": "warning", "message": {"text": "Frontend route `/documents/:id` has no Link/navigate to it \u2014 apps/frontend/tests/reviewQueueActions.test.tsx"}, "properties": {"repobilityId": "01a4064f02c22947", "scanner": "scanner-primary", "fingerprint": "58a0466cfb5ac30a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8fdbadcb1e1f317f", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "570367963f340b62", "scanner": "scanner-primary", "fingerprint": "8fdbadcb1e1f317f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c41ed7345438a7cd", "level": "warning", "message": {"text": "Frontend route `activity` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "6c3c9213576de372", "scanner": "scanner-primary", "fingerprint": "c41ed7345438a7cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8e88aea681db75b5", "level": "warning", "message": {"text": "Frontend route `search` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "73a61b3b4b16ad74", "scanner": "scanner-primary", "fingerprint": "8e88aea681db75b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-894484dad65bf5f2", "level": "warning", "message": {"text": "Frontend route `queue` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "45e16d1f8575e84e", "scanner": "scanner-primary", "fingerprint": "894484dad65bf5f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe34bdaed03ad082", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "e121063052853653", "scanner": "scanner-primary", "fingerprint": "fe34bdaed03ad082", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6a91f35f565a5c63", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/backend/scripts/send_reminders.js:19)"}, "properties": {"repobilityId": "301fa73da2bfe0bb", "scanner": "scanner-primary", "fingerprint": "6a91f35f565a5c63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b01ef04895bc656", "level": "note", "message": {"text": "Unused endpoint: POST /api/webhook/paddle"}, "properties": {"repobilityId": "b917790fe4744b80", "scanner": "scanner-primary", "fingerprint": "1b01ef04895bc656", "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": "44ac8d65d6fd343b", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "9bc65c6d4bcd23e4", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "764bfed9ba86ade9", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc8121c4b0d774a7", "level": "note", "message": {"text": "Unused endpoint: GET /review"}, "properties": {"repobilityId": "409a4805996be6ed", "scanner": "scanner-primary", "fingerprint": "bc8121c4b0d774a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c924d9b3c26c9d64", "level": "note", "message": {"text": "Unused endpoint: GET /export.csv"}, "properties": {"repobilityId": "6aaf5675ca267934", "scanner": "scanner-primary", "fingerprint": "c924d9b3c26c9d64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-955005a6da85f786", "level": "note", "message": {"text": "Unused endpoint: GET /recent"}, "properties": {"repobilityId": "b46bf199fe2433f1", "scanner": "scanner-primary", "fingerprint": "955005a6da85f786", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c3d1d103b19a7f6", "level": "note", "message": {"text": "Unused endpoint: GET /all"}, "properties": {"repobilityId": "fb28e5229cb9e79a", "scanner": "scanner-primary", "fingerprint": "2c3d1d103b19a7f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "d4663ad17dd9bcb1", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f39249a345a19765", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/status"}, "properties": {"repobilityId": "56a97e147d0b897b", "scanner": "scanner-primary", "fingerprint": "f39249a345a19765", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebe1fa4405e6dd60", "level": "note", "message": {"text": "Unused endpoint: POST /:id/action"}, "properties": {"repobilityId": "059861e421aaca85", "scanner": "scanner-primary", "fingerprint": "ebe1fa4405e6dd60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "d4b11a82457bb7cf", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "c0176396d79eb3fd", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "e1ced1e207bf0371", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44a8d35cd092dc20", "level": "note", "message": {"text": "Unused endpoint: USE /search"}, "properties": {"repobilityId": "337be894400aa7ac", "scanner": "scanner-primary", "fingerprint": "44a8d35cd092dc20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a8f40a426fdfb45", "level": "note", "message": {"text": "Unused endpoint: USE /reports"}, "properties": {"repobilityId": "596566e46247a5b8", "scanner": "scanner-primary", "fingerprint": "7a8f40a426fdfb45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-428d7ebee5918103", "level": "note", "message": {"text": "Unused endpoint: USE /documents"}, "properties": {"repobilityId": "8543568fb29fc6df", "scanner": "scanner-primary", "fingerprint": "428d7ebee5918103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-998aed95457284e2", "level": "note", "message": {"text": "Unused endpoint: USE /user"}, "properties": {"repobilityId": "4abaef0ba4c5b6fe", "scanner": "scanner-primary", "fingerprint": "998aed95457284e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f29f9bdfc54146dc", "level": "note", "message": {"text": "Unused endpoint: USE /expenses"}, "properties": {"repobilityId": "ef489e41c7a173f7", "scanner": "scanner-primary", "fingerprint": "f29f9bdfc54146dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "50a1f7bffdfbeccc", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}