{"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-1eb77c2fd2813b7b", "name": "Stray `console.log` in TS/JS \u2014 backend/src/app.js:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/app.js:121"}, "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-f9fbf500ab516c91", "name": "Stray `console.log` in TS/JS \u2014 backend/src/config/storage.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/config/storage.js:49"}, "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-00a7187d7bb191af", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-po-number.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-po-number.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-bbe3f3cf813addd7", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-white-label.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-white-label.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-e5772fa0ee68a6af", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-org-email-settings.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-org-email-settings.js:26"}, "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-c50a610cf68535b3", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-contact-login.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-contact-login.js:10"}, "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-b63ee762cd069dc4", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-audit.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-audit.js:17"}, "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-40aff8c6d86ed0cc", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-contacts.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-contacts.js:20"}, "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-40306f60fef32856", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-schedule-documents-columns.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-schedule-documents-columns.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-1aba561d2eba8163", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seedScheduleHistory.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seedScheduleHistory.js: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-e156b6a802d4034b", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-multitenancy.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-multitenancy.js: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-becf7709bd0566d5", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-docs-and-recipients.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-docs-and-recipients.js: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-387f4e040545429a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china.js:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china.js: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-e5bd89a02fe77634", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china-locations.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china-locations.js:59"}, "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-00250bbd53372556", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-documents.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-documents.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-9df09439385ded01", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-document-flow.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-document-flow.js: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-88534aef2ceabff4", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-indexes.js:202", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-indexes.js:202"}, "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-4336796c108e8dc0", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/setup-db.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/setup-db.js:30"}, "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-003b274eb17b62f4", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-users.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-users.js:15"}, "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-e13d861eec47eb5a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-end-date.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-end-date.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-f4ce5232918bcaa0", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-remarks.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-remarks.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-2341f565f4bc3950", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-activity-logs.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-activity-logs.js: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-9dbfddceceb6b77a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed.js:6"}, "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-ed4a115d23c658c2", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-companies.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-companies.js: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-645fefb0f1368319", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoice-payments.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoice-payments.js: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-e29f97cf5f14bbf9", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoices.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoices.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-44f19682767c7aa0", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-lockout-progression.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-lockout-progression.js: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-120b27bb146a649c", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-scope-of-inspection.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-scope-of-inspection.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-5bcc7b356c08fb72", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-coordinator.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-coordinator.js:17"}, "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-32a0da794ac0c971", "name": "Stray `console.log` in TS/JS \u2014 backend/src/lib/socket.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/lib/socket.js:27"}, "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-7c4847234e97f019", "name": "Stray `console.log` in TS/JS \u2014 backend/src/lib/redis.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/lib/redis.js: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-264d2a21baffc263", "name": "Stray `console.log` in TS/JS \u2014 backend/src/routes/schedules.js:785", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/schedules.js:785"}, "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-be8c44c0df70f000", "name": "Stray `console.log` in TS/JS \u2014 backend/src/routes/ai.js:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/ai.js:170"}, "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-3607e0f4e94f0a61", "name": "Stray `console.log` in TS/JS \u2014 backend/src/routes/billing.js:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/billing.js:114"}, "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-502a0d22c14d08d6", "name": "Stray `console.log` in TS/JS \u2014 backend/src/routes/microsoft.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/microsoft.js:67"}, "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-8cd948969c1b1e21", "name": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.js:89"}, "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-728d5ddd011b1479", "name": "Stray `console.log` in TS/JS \u2014 backend/src/services/microsoft.js:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/microsoft.js:138"}, "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-770e567d76b5334e", "name": "Stray `console.log` in TS/JS \u2014 backend/src/services/reportAi.js:120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/reportAi.js:120"}, "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-3d77fa4b801651e1", "name": "Stray `console.log` in TS/JS \u2014 backend/src/jobs/dailyDigest.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/jobs/dailyDigest.js: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-8f5c96151ab6a91b", "name": "Very large file: backend/src/routes/schedules.js (1599 lines)", "shortDescription": {"text": "Very large file: backend/src/routes/schedules.js (1599 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-145ba04c3307286f", "name": "Very large file: backend/src/services/email.js (1267 lines)", "shortDescription": {"text": "Very large file: backend/src/services/email.js (1267 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": "0 test file(s) for 91 source file(s) (ratio 0.00). 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 194 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-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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, 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": "low", "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-33de039d687d89ab", "name": "Commented-code block (7 lines) in deploy/ecosystem.config.cjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in deploy/ecosystem.config.cjs:1"}, "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-b745185b99da597f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/ImapService.js:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/ImapService.js:124"}, "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-70722ba4545ca94d", "name": "Commented-code block (6 lines) in backend/src/services/microsoft.js:163", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/services/microsoft.js:163"}, "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-93b8acb0f93b3982", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/microsoft.js:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/microsoft.js:100"}, "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-01e55a29105c3e34", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/reportAi.js:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/reportAi.js:133"}, "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-d30f85c43b86dcf0", "name": "27 env vars used in code but missing from .env.example", "shortDescription": {"text": "27 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APP_NAME`, `APP_URL`, `DAILY_DIGEST_CRON`, `DAILY_DIGEST_TZ`, `EMAIL_FROM`, `EMAIL_FROM_NOREPLY`, `EMAIL_FROM_REPORTS`, `ENCRYPT_SECRET` + 19 more. 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-92c8cdeb669e4db2", "name": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${draft.id} (backend/src/services/microsoft.js:390)", "shortDescription": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${draft.id} (backend/src/services/microsoft.js:390)"}, "fullDescription": {"text": "`backend/src/services/microsoft.js:390` calls `PATCH https://graph.microsoft.com/v1.0/me/messages/${draft.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me/messages/<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-316351162d49248e", "name": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/sendMail (backend/src/services/microsoft.js:453)", "shortDescription": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/sendMail (backend/src/services/microsoft.js:453)"}, "fullDescription": {"text": "`backend/src/services/microsoft.js:453` calls `POST https://graph.microsoft.com/v1.0/me/sendMail` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me/sendmail`\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-d83a63705f893877", "name": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/outlook/masterCategories (backend/src/services/microsoft.js:499", "shortDescription": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/outlook/masterCategories (backend/src/services/microsoft.js:499)"}, "fullDescription": {"text": "`backend/src/services/microsoft.js:499` calls `POST https://graph.microsoft.com/v1.0/me/outlook/masterCategories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me/outlook/mastercategories`\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-0625408bed08c17c", "name": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${msg.id} (backend/src/services/microsoft.js:529)", "shortDescription": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${msg.id} (backend/src/services/microsoft.js:529)"}, "fullDescription": {"text": "`backend/src/services/microsoft.js:529` calls `PATCH https://graph.microsoft.com/v1.0/me/messages/${msg.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me/messages/<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-e302fb8e9377e6e1", "name": "Dangling fetch: POST https://ark.cn-beijing.volces.com/api/v3/chat/completions (backend/src/services/reportAi.js:133)", "shortDescription": {"text": "Dangling fetch: POST https://ark.cn-beijing.volces.com/api/v3/chat/completions (backend/src/services/reportAi.js:133)"}, "fullDescription": {"text": "`backend/src/services/reportAi.js:133` calls `POST https://ark.cn-beijing.volces.com/api/v3/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:/ark.cn-beijing.volces.com/api/v3/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-946dc627de4f272d", "name": "Unused endpoint: USE /api/billing", "shortDescription": {"text": "Unused endpoint: USE /api/billing"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/billing` 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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/auth` 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": "`backend/src/app.js` 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-4ff40cb10f7c8519", "name": "Unused endpoint: USE /api/users", "shortDescription": {"text": "Unused endpoint: USE /api/users"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/users` 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-ac562b89a7398927", "name": "Unused endpoint: USE /api/inspectors", "shortDescription": {"text": "Unused endpoint: USE /api/inspectors"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/inspectors` 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-e7a7ad2bafa4fcc0", "name": "Unused endpoint: USE /api/clients", "shortDescription": {"text": "Unused endpoint: USE /api/clients"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/clients` 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-429ab099bb88de4d", "name": "Unused endpoint: USE /api/schedules", "shortDescription": {"text": "Unused endpoint: USE /api/schedules"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/schedules` 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-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/notifications` 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-1e1ec70ce9b71de8", "name": "Unused endpoint: USE /api/invoices", "shortDescription": {"text": "Unused endpoint: USE /api/invoices"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/invoices` 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-dbdbc13210e7149b", "name": "Unused endpoint: USE /api/dashboard", "shortDescription": {"text": "Unused endpoint: USE /api/dashboard"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/dashboard` 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-bb789cf847f59e24", "name": "Unused endpoint: USE /api/companies", "shortDescription": {"text": "Unused endpoint: USE /api/companies"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/companies` 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-ad5a7bbfb273c244", "name": "Unused endpoint: USE /api/documents/share", "shortDescription": {"text": "Unused endpoint: USE /api/documents/share"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/documents/share` 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-b90a25f6d5f27707", "name": "Unused endpoint: USE /api/documents", "shortDescription": {"text": "Unused endpoint: USE /api/documents"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/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-94a287d30609042b", "name": "Unused endpoint: USE /api/inspector-documents", "shortDescription": {"text": "Unused endpoint: USE /api/inspector-documents"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/inspector-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-316c43db307befc3", "name": "Unused endpoint: USE /api/ai", "shortDescription": {"text": "Unused endpoint: USE /api/ai"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/ai` 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-ece4eb9a309e335b", "name": "Unused endpoint: USE /api/organization", "shortDescription": {"text": "Unused endpoint: USE /api/organization"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/organization` 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-c24f0fc9b7bd86e2", "name": "Unused endpoint: USE /api/email-settings", "shortDescription": {"text": "Unused endpoint: USE /api/email-settings"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/email-settings` 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-6d282a209b7ddd1e", "name": "Unused endpoint: USE /api/email-triage", "shortDescription": {"text": "Unused endpoint: USE /api/email-triage"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/email-triage` 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-16fa9c9b3af51c81", "name": "Unused endpoint: USE /api/microsoft", "shortDescription": {"text": "Unused endpoint: USE /api/microsoft"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/microsoft` 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-4b27e2f1ed16ef07", "name": "Unused endpoint: USE /api/imap", "shortDescription": {"text": "Unused endpoint: USE /api/imap"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/imap` 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-66959c6559ae4776", "name": "Unused endpoint: USE /api/locations", "shortDescription": {"text": "Unused endpoint: USE /api/locations"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/locations` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/admin` 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-686b0d6e2011a59b", "name": "Unused endpoint: USE /api/user/prefs", "shortDescription": {"text": "Unused endpoint: USE /api/user/prefs"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/user/prefs` 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-af74116085195f95", "name": "Unused endpoint: USE /api/comments", "shortDescription": {"text": "Unused endpoint: USE /api/comments"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/comments` 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-1cd12942b374ad26", "name": "Unused endpoint: USE /api/custom-fields", "shortDescription": {"text": "Unused endpoint: USE /api/custom-fields"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/custom-fields` 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-9962a2df99fa7781", "name": "Unused endpoint: USE /api/portal", "shortDescription": {"text": "Unused endpoint: USE /api/portal"}, "fullDescription": {"text": "`backend/src/app.js` declares `USE /api/portal` 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-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`backend/src/middleware/cache.js` declares `GET /dashboard` 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-0d9abfdbc1cc9788", "name": "Unused endpoint: GET /schedules", "shortDescription": {"text": "Unused endpoint: GET /schedules"}, "fullDescription": {"text": "`backend/src/middleware/cache.js` declares `GET /schedules` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/src/routes/organization.js` declares `GET /` 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-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`backend/src/routes/organization.js` declares `PUT /` 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-6d05b1f5adfd3eac", "name": "Unused endpoint: PATCH /", "shortDescription": {"text": "Unused endpoint: PATCH /"}, "fullDescription": {"text": "`backend/src/routes/organization.js` declares `PATCH /` 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-36bdda20de441744", "name": "Unused endpoint: GET /:scheduleId", "shortDescription": {"text": "Unused endpoint: GET /:scheduleId"}, "fullDescription": {"text": "`backend/src/routes/comments.js` declares `GET /:scheduleId` 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-75db1ace2fd5c671", "name": "Unused endpoint: POST /:scheduleId", "shortDescription": {"text": "Unused endpoint: POST /:scheduleId"}, "fullDescription": {"text": "`backend/src/routes/comments.js` declares `POST /:scheduleId` 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-e35f9c406ff9f249", "name": "Unused endpoint: PUT /:commentId", "shortDescription": {"text": "Unused endpoint: PUT /:commentId"}, "fullDescription": {"text": "`backend/src/routes/comments.js` declares `PUT /:commentId` 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-e486954e1864d149", "name": "Unused endpoint: DELETE /:commentId", "shortDescription": {"text": "Unused endpoint: DELETE /:commentId"}, "fullDescription": {"text": "`backend/src/routes/comments.js` declares `DELETE /:commentId` 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-323743f763dc275b", "name": "Unused endpoint: GET /:id(\\\\d+)", "shortDescription": {"text": "Unused endpoint: GET /:id(\\\\d+)"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `GET /:id(\\\\d+)` 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-cc2b0c4e0e9cc8bd", "name": "Unused endpoint: GET /autocomplete", "shortDescription": {"text": "Unused endpoint: GET /autocomplete"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `GET /autocomplete` 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-f384bfdd0243b115", "name": "Unused endpoint: GET /by-ids", "shortDescription": {"text": "Unused endpoint: GET /by-ids"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `GET /by-ids` 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-be831fe03a2136f1", "name": "Unused endpoint: GET /by-noi", "shortDescription": {"text": "Unused endpoint: GET /by-noi"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `GET /by-noi` 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-c345fd67aab3c2c8", "name": "Unused endpoint: GET /inspector-bookings", "shortDescription": {"text": "Unused endpoint: GET /inspector-bookings"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `GET /inspector-bookings` 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": "`backend/src/routes/schedules.js` 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-6607d1d4cc563d9c", "name": "Unused endpoint: PUT /:id(\\\\d+)", "shortDescription": {"text": "Unused endpoint: PUT /:id(\\\\d+)"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `PUT /:id(\\\\d+)` 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-cd2ed68acd377010", "name": "Unused endpoint: DELETE /:id(\\\\d+)", "shortDescription": {"text": "Unused endpoint: DELETE /:id(\\\\d+)"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `DELETE /:id(\\\\d+)` 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-6e17a328909b3320", "name": "Unused endpoint: PATCH /:id(\\\\d+)/rate", "shortDescription": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/rate"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `PATCH /:id(\\\\d+)/rate` 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-be518a2514e10d86", "name": "Unused endpoint: PATCH /:id(\\\\d+)/remarks", "shortDescription": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/remarks"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `PATCH /:id(\\\\d+)/remarks` 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-13d908f2fe94e141", "name": "Unused endpoint: PATCH /:id(\\\\d+)/visibility", "shortDescription": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/visibility"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `PATCH /:id(\\\\d+)/visibility` 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-851dee390a368ddd", "name": "Unused endpoint: POST /:id/flash-report", "shortDescription": {"text": "Unused endpoint: POST /:id/flash-report"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `POST /:id/flash-report` 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-01ba1970614b75f7", "name": "Unused endpoint: POST /:id/inspector-report", "shortDescription": {"text": "Unused endpoint: POST /:id/inspector-report"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `POST /:id/inspector-report` 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-284458d24ff75736", "name": "Unused endpoint: DELETE /:id(\\\\d+)/flash-report", "shortDescription": {"text": "Unused endpoint: DELETE /:id(\\\\d+)/flash-report"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `DELETE /:id(\\\\d+)/flash-report` 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-2bab83d916ff8cad", "name": "Unused endpoint: DELETE /:id(\\\\d+)/inspector-report", "shortDescription": {"text": "Unused endpoint: DELETE /:id(\\\\d+)/inspector-report"}, "fullDescription": {"text": "`backend/src/routes/schedules.js` declares `DELETE /:id(\\\\d+)/inspector-report` 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/22386"}, "properties": {"repository": "vndamodar/inspection-scheduler", "repoUrl": "https://github.com/vndamodar/inspection-scheduler", "branch": "main"}, "results": [{"ruleId": "scanner-1eb77c2fd2813b7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/app.js:121"}, "properties": {"repobilityId": "30d2b2734ad3f944", "scanner": "scanner-primary", "fingerprint": "1eb77c2fd2813b7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9fbf500ab516c91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/config/storage.js:49"}, "properties": {"repobilityId": "b3184b8230ad9c44", "scanner": "scanner-primary", "fingerprint": "f9fbf500ab516c91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00a7187d7bb191af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-po-number.js:16"}, "properties": {"repobilityId": "4380b6b75f0b3bfe", "scanner": "scanner-primary", "fingerprint": "00a7187d7bb191af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbe3f3cf813addd7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-white-label.js:8"}, "properties": {"repobilityId": "bbb16c465e134921", "scanner": "scanner-primary", "fingerprint": "bbe3f3cf813addd7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5772fa0ee68a6af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-org-email-settings.js:26"}, "properties": {"repobilityId": "084410790d798613", "scanner": "scanner-primary", "fingerprint": "e5772fa0ee68a6af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c50a610cf68535b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-contact-login.js:10"}, "properties": {"repobilityId": "489d26cf033398bf", "scanner": "scanner-primary", "fingerprint": "c50a610cf68535b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b63ee762cd069dc4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-audit.js:17"}, "properties": {"repobilityId": "0645d810df3b2250", "scanner": "scanner-primary", "fingerprint": "b63ee762cd069dc4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40aff8c6d86ed0cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-contacts.js:20"}, "properties": {"repobilityId": "f49415d08c94d6bd", "scanner": "scanner-primary", "fingerprint": "40aff8c6d86ed0cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40306f60fef32856", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-schedule-documents-columns.js:8"}, "properties": {"repobilityId": "c0301c4c8ae2576d", "scanner": "scanner-primary", "fingerprint": "40306f60fef32856", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1aba561d2eba8163", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seedScheduleHistory.js:50"}, "properties": {"repobilityId": "c3250f453cd925c7", "scanner": "scanner-primary", "fingerprint": "1aba561d2eba8163", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e156b6a802d4034b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-multitenancy.js:37"}, "properties": {"repobilityId": "90067bc66606dd04", "scanner": "scanner-primary", "fingerprint": "e156b6a802d4034b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-becf7709bd0566d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-docs-and-recipients.js:25"}, "properties": {"repobilityId": "832d09a58747f797", "scanner": "scanner-primary", "fingerprint": "becf7709bd0566d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-387f4e040545429a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china.js:174"}, "properties": {"repobilityId": "b3f8b77ebf7203dd", "scanner": "scanner-primary", "fingerprint": "387f4e040545429a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5bd89a02fe77634", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed-china-locations.js:59"}, "properties": {"repobilityId": "4b0e6115f2e75c7c", "scanner": "scanner-primary", "fingerprint": "e5bd89a02fe77634", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00250bbd53372556", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-documents.js:19"}, "properties": {"repobilityId": "ebad0f67ff29c0e9", "scanner": "scanner-primary", "fingerprint": "00250bbd53372556", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9df09439385ded01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-document-flow.js:12"}, "properties": {"repobilityId": "8b51581c3701576b", "scanner": "scanner-primary", "fingerprint": "9df09439385ded01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88534aef2ceabff4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-indexes.js:202"}, "properties": {"repobilityId": "26a8cefafed642ef", "scanner": "scanner-primary", "fingerprint": "88534aef2ceabff4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4336796c108e8dc0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/setup-db.js:30"}, "properties": {"repobilityId": "fd9594e5f2010764", "scanner": "scanner-primary", "fingerprint": "4336796c108e8dc0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-003b274eb17b62f4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-client-users.js:15"}, "properties": {"repobilityId": "4e228ed1fd6d9e75", "scanner": "scanner-primary", "fingerprint": "003b274eb17b62f4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e13d861eec47eb5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-end-date.js:16"}, "properties": {"repobilityId": "51b5da676be4b49a", "scanner": "scanner-primary", "fingerprint": "e13d861eec47eb5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4ce5232918bcaa0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-remarks.js:8"}, "properties": {"repobilityId": "723d2ca5ca89e62c", "scanner": "scanner-primary", "fingerprint": "f4ce5232918bcaa0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2341f565f4bc3950", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-activity-logs.js:24"}, "properties": {"repobilityId": "ebdef89c45d799ff", "scanner": "scanner-primary", "fingerprint": "2341f565f4bc3950", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9dbfddceceb6b77a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/seed.js:6"}, "properties": {"repobilityId": "256c96dee7c824a6", "scanner": "scanner-primary", "fingerprint": "9dbfddceceb6b77a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed4a115d23c658c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-companies.js:25"}, "properties": {"repobilityId": "f2f5a6ac49867b9d", "scanner": "scanner-primary", "fingerprint": "ed4a115d23c658c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-645fefb0f1368319", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoice-payments.js:12"}, "properties": {"repobilityId": "866004ea6a781ef8", "scanner": "scanner-primary", "fingerprint": "645fefb0f1368319", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e29f97cf5f14bbf9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-invoices.js:13"}, "properties": {"repobilityId": "d94ba83c8a082508", "scanner": "scanner-primary", "fingerprint": "e29f97cf5f14bbf9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44f19682767c7aa0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-lockout-progression.js:9"}, "properties": {"repobilityId": "61028a9319f135d1", "scanner": "scanner-primary", "fingerprint": "44f19682767c7aa0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-120b27bb146a649c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-scope-of-inspection.js:16"}, "properties": {"repobilityId": "49e7e8a7d6f6186e", "scanner": "scanner-primary", "fingerprint": "120b27bb146a649c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bcc7b356c08fb72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/migrate-coordinator.js:17"}, "properties": {"repobilityId": "f4ffff02c050e1f3", "scanner": "scanner-primary", "fingerprint": "5bcc7b356c08fb72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32a0da794ac0c971", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/lib/socket.js:27"}, "properties": {"repobilityId": "3c3eef559e10e567", "scanner": "scanner-primary", "fingerprint": "32a0da794ac0c971", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c4847234e97f019", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/lib/redis.js:29"}, "properties": {"repobilityId": "e0609bb29bd090f9", "scanner": "scanner-primary", "fingerprint": "7c4847234e97f019", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-264d2a21baffc263", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/schedules.js:785"}, "properties": {"repobilityId": "47ca46f2941b5df4", "scanner": "scanner-primary", "fingerprint": "264d2a21baffc263", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be8c44c0df70f000", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/ai.js:170"}, "properties": {"repobilityId": "0a24d33a08939a10", "scanner": "scanner-primary", "fingerprint": "be8c44c0df70f000", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3607e0f4e94f0a61", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/billing.js:114"}, "properties": {"repobilityId": "95e0e39de25f21e5", "scanner": "scanner-primary", "fingerprint": "3607e0f4e94f0a61", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-502a0d22c14d08d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/routes/microsoft.js:67"}, "properties": {"repobilityId": "62c4b1f4b3ec0b61", "scanner": "scanner-primary", "fingerprint": "502a0d22c14d08d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cd948969c1b1e21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.js:89"}, "properties": {"repobilityId": "464aabe28cee7422", "scanner": "scanner-primary", "fingerprint": "8cd948969c1b1e21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-728d5ddd011b1479", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/microsoft.js:138"}, "properties": {"repobilityId": "4816bdeffa3a8b27", "scanner": "scanner-primary", "fingerprint": "728d5ddd011b1479", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-770e567d76b5334e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/reportAi.js:120"}, "properties": {"repobilityId": "089879f949102b9c", "scanner": "scanner-primary", "fingerprint": "770e567d76b5334e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d77fa4b801651e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/jobs/dailyDigest.js:11"}, "properties": {"repobilityId": "b6832716d450ac2b", "scanner": "scanner-primary", "fingerprint": "3d77fa4b801651e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f5c96151ab6a91b", "level": "note", "message": {"text": "Very large file: backend/src/routes/schedules.js (1599 lines)"}, "properties": {"repobilityId": "df6ea7d31e5d7b69", "scanner": "scanner-primary", "fingerprint": "8f5c96151ab6a91b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-145ba04c3307286f", "level": "note", "message": {"text": "Very large file: backend/src/services/email.js (1267 lines)"}, "properties": {"repobilityId": "c55dc69656614579", "scanner": "scanner-primary", "fingerprint": "145ba04c3307286f", "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": "8c174b21c12e5d1e", "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": "ad5a133f4a507c48", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "ae7ffeef90ad85ab", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "ef97103f255ee484", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "061ec2bb00fa6aaa", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "00b0eab2c3260a65", "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": "b2e2e4736d5e7fd3", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-33de039d687d89ab", "level": "none", "message": {"text": "Commented-code block (7 lines) in deploy/ecosystem.config.cjs:1"}, "properties": {"repobilityId": "f90aa0184647e5d6", "scanner": "scanner-primary", "fingerprint": "33de039d687d89ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b745185b99da597f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/ImapService.js:124"}, "properties": {"repobilityId": "7fe37b7005a5cc14", "scanner": "scanner-primary", "fingerprint": "b745185b99da597f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-70722ba4545ca94d", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/services/microsoft.js:163"}, "properties": {"repobilityId": "0ae49fa28386e69f", "scanner": "scanner-primary", "fingerprint": "70722ba4545ca94d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93b8acb0f93b3982", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/microsoft.js:100"}, "properties": {"repobilityId": "efc9db139df75e49", "scanner": "scanner-primary", "fingerprint": "93b8acb0f93b3982", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01e55a29105c3e34", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/services/reportAi.js:133"}, "properties": {"repobilityId": "1aa0b749fff7ea41", "scanner": "scanner-primary", "fingerprint": "01e55a29105c3e34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d30f85c43b86dcf0", "level": "note", "message": {"text": "27 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "4816db1c74a26e4a", "scanner": "scanner-primary", "fingerprint": "d30f85c43b86dcf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-92c8cdeb669e4db2", "level": "error", "message": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${draft.id} (backend/src/services/microsoft.js:390)"}, "properties": {"repobilityId": "a88eda181d4e7fa8", "scanner": "scanner-primary", "fingerprint": "92c8cdeb669e4db2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-316351162d49248e", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/sendMail (backend/src/services/microsoft.js:453)"}, "properties": {"repobilityId": "80422027a0f7206c", "scanner": "scanner-primary", "fingerprint": "316351162d49248e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d83a63705f893877", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/me/outlook/masterCategories (backend/src/services/microsoft.js:499)"}, "properties": {"repobilityId": "a3699213d1b662b6", "scanner": "scanner-primary", "fingerprint": "d83a63705f893877", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0625408bed08c17c", "level": "error", "message": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/me/messages/${msg.id} (backend/src/services/microsoft.js:529)"}, "properties": {"repobilityId": "99bc86a8fe7fccd0", "scanner": "scanner-primary", "fingerprint": "0625408bed08c17c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e302fb8e9377e6e1", "level": "error", "message": {"text": "Dangling fetch: POST https://ark.cn-beijing.volces.com/api/v3/chat/completions (backend/src/services/reportAi.js:133)"}, "properties": {"repobilityId": "daf8fcf1d367252a", "scanner": "scanner-primary", "fingerprint": "e302fb8e9377e6e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-946dc627de4f272d", "level": "note", "message": {"text": "Unused endpoint: USE /api/billing"}, "properties": {"repobilityId": "ad70d379a8f65260", "scanner": "scanner-primary", "fingerprint": "946dc627de4f272d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "a92a59147a6055e6", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "03ed2f4e07b7a32e", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff40cb10f7c8519", "level": "note", "message": {"text": "Unused endpoint: USE /api/users"}, "properties": {"repobilityId": "6d27f932e8da1668", "scanner": "scanner-primary", "fingerprint": "4ff40cb10f7c8519", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac562b89a7398927", "level": "note", "message": {"text": "Unused endpoint: USE /api/inspectors"}, "properties": {"repobilityId": "6aed552a7eaa30cf", "scanner": "scanner-primary", "fingerprint": "ac562b89a7398927", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7a7ad2bafa4fcc0", "level": "note", "message": {"text": "Unused endpoint: USE /api/clients"}, "properties": {"repobilityId": "f5c6f82c5cbb3bae", "scanner": "scanner-primary", "fingerprint": "e7a7ad2bafa4fcc0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-429ab099bb88de4d", "level": "note", "message": {"text": "Unused endpoint: USE /api/schedules"}, "properties": {"repobilityId": "ae741027bd50c314", "scanner": "scanner-primary", "fingerprint": "429ab099bb88de4d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "554c86dbc4541e23", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e1ec70ce9b71de8", "level": "note", "message": {"text": "Unused endpoint: USE /api/invoices"}, "properties": {"repobilityId": "84ebdf0126742271", "scanner": "scanner-primary", "fingerprint": "1e1ec70ce9b71de8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbdbc13210e7149b", "level": "note", "message": {"text": "Unused endpoint: USE /api/dashboard"}, "properties": {"repobilityId": "3adf4735b5d0d9df", "scanner": "scanner-primary", "fingerprint": "dbdbc13210e7149b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb789cf847f59e24", "level": "note", "message": {"text": "Unused endpoint: USE /api/companies"}, "properties": {"repobilityId": "1721f5a3683a9f22", "scanner": "scanner-primary", "fingerprint": "bb789cf847f59e24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad5a7bbfb273c244", "level": "note", "message": {"text": "Unused endpoint: USE /api/documents/share"}, "properties": {"repobilityId": "0626b8086fb02f14", "scanner": "scanner-primary", "fingerprint": "ad5a7bbfb273c244", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b90a25f6d5f27707", "level": "note", "message": {"text": "Unused endpoint: USE /api/documents"}, "properties": {"repobilityId": "ed3a4f1ef1662afe", "scanner": "scanner-primary", "fingerprint": "b90a25f6d5f27707", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94a287d30609042b", "level": "note", "message": {"text": "Unused endpoint: USE /api/inspector-documents"}, "properties": {"repobilityId": "8fa0b5a68ba5b970", "scanner": "scanner-primary", "fingerprint": "94a287d30609042b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-316c43db307befc3", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai"}, "properties": {"repobilityId": "eef6daa752af62aa", "scanner": "scanner-primary", "fingerprint": "316c43db307befc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ece4eb9a309e335b", "level": "note", "message": {"text": "Unused endpoint: USE /api/organization"}, "properties": {"repobilityId": "48a16277f129303e", "scanner": "scanner-primary", "fingerprint": "ece4eb9a309e335b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c24f0fc9b7bd86e2", "level": "note", "message": {"text": "Unused endpoint: USE /api/email-settings"}, "properties": {"repobilityId": "0153c6ca85cf71ac", "scanner": "scanner-primary", "fingerprint": "c24f0fc9b7bd86e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d282a209b7ddd1e", "level": "note", "message": {"text": "Unused endpoint: USE /api/email-triage"}, "properties": {"repobilityId": "0f64f3c96e37d60d", "scanner": "scanner-primary", "fingerprint": "6d282a209b7ddd1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16fa9c9b3af51c81", "level": "note", "message": {"text": "Unused endpoint: USE /api/microsoft"}, "properties": {"repobilityId": "60b8953b0978914e", "scanner": "scanner-primary", "fingerprint": "16fa9c9b3af51c81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b27e2f1ed16ef07", "level": "note", "message": {"text": "Unused endpoint: USE /api/imap"}, "properties": {"repobilityId": "d706e7d309814d81", "scanner": "scanner-primary", "fingerprint": "4b27e2f1ed16ef07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66959c6559ae4776", "level": "note", "message": {"text": "Unused endpoint: USE /api/locations"}, "properties": {"repobilityId": "bdd06f7be47eefe7", "scanner": "scanner-primary", "fingerprint": "66959c6559ae4776", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "b5789393b804b79e", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-686b0d6e2011a59b", "level": "note", "message": {"text": "Unused endpoint: USE /api/user/prefs"}, "properties": {"repobilityId": "0853d631cca07980", "scanner": "scanner-primary", "fingerprint": "686b0d6e2011a59b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af74116085195f95", "level": "note", "message": {"text": "Unused endpoint: USE /api/comments"}, "properties": {"repobilityId": "97c6b6bff7554e5a", "scanner": "scanner-primary", "fingerprint": "af74116085195f95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1cd12942b374ad26", "level": "note", "message": {"text": "Unused endpoint: USE /api/custom-fields"}, "properties": {"repobilityId": "030c94b7c94b0fde", "scanner": "scanner-primary", "fingerprint": "1cd12942b374ad26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9962a2df99fa7781", "level": "note", "message": {"text": "Unused endpoint: USE /api/portal"}, "properties": {"repobilityId": "153a4c2ba19d3fbe", "scanner": "scanner-primary", "fingerprint": "9962a2df99fa7781", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "8f0a6fdce78b78d4", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d9abfdbc1cc9788", "level": "note", "message": {"text": "Unused endpoint: GET /schedules"}, "properties": {"repobilityId": "d3a6e9f4e089473f", "scanner": "scanner-primary", "fingerprint": "0d9abfdbc1cc9788", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "974e5bf5604d0df2", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "6c3347583e2acb71", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d05b1f5adfd3eac", "level": "note", "message": {"text": "Unused endpoint: PATCH /"}, "properties": {"repobilityId": "2ecb8b5fd848c74d", "scanner": "scanner-primary", "fingerprint": "6d05b1f5adfd3eac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36bdda20de441744", "level": "note", "message": {"text": "Unused endpoint: GET /:scheduleId"}, "properties": {"repobilityId": "66e6d99b021b07af", "scanner": "scanner-primary", "fingerprint": "36bdda20de441744", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75db1ace2fd5c671", "level": "note", "message": {"text": "Unused endpoint: POST /:scheduleId"}, "properties": {"repobilityId": "219909af0f524d41", "scanner": "scanner-primary", "fingerprint": "75db1ace2fd5c671", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e35f9c406ff9f249", "level": "note", "message": {"text": "Unused endpoint: PUT /:commentId"}, "properties": {"repobilityId": "89202cd43c934a6a", "scanner": "scanner-primary", "fingerprint": "e35f9c406ff9f249", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e486954e1864d149", "level": "note", "message": {"text": "Unused endpoint: DELETE /:commentId"}, "properties": {"repobilityId": "069bdfac4ba65f2f", "scanner": "scanner-primary", "fingerprint": "e486954e1864d149", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-323743f763dc275b", "level": "note", "message": {"text": "Unused endpoint: GET /:id(\\\\d+)"}, "properties": {"repobilityId": "a7cfaa1b51237414", "scanner": "scanner-primary", "fingerprint": "323743f763dc275b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc2b0c4e0e9cc8bd", "level": "note", "message": {"text": "Unused endpoint: GET /autocomplete"}, "properties": {"repobilityId": "4ab0882bdd85c3fc", "scanner": "scanner-primary", "fingerprint": "cc2b0c4e0e9cc8bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f384bfdd0243b115", "level": "note", "message": {"text": "Unused endpoint: GET /by-ids"}, "properties": {"repobilityId": "ea3947364273509c", "scanner": "scanner-primary", "fingerprint": "f384bfdd0243b115", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be831fe03a2136f1", "level": "note", "message": {"text": "Unused endpoint: GET /by-noi"}, "properties": {"repobilityId": "24ec83e3759cbf48", "scanner": "scanner-primary", "fingerprint": "be831fe03a2136f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c345fd67aab3c2c8", "level": "note", "message": {"text": "Unused endpoint: GET /inspector-bookings"}, "properties": {"repobilityId": "657bea7cf588dcfe", "scanner": "scanner-primary", "fingerprint": "c345fd67aab3c2c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "9f4d0c359d88528e", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6607d1d4cc563d9c", "level": "note", "message": {"text": "Unused endpoint: PUT /:id(\\\\d+)"}, "properties": {"repobilityId": "2b1f4c5bc2240bde", "scanner": "scanner-primary", "fingerprint": "6607d1d4cc563d9c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd2ed68acd377010", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id(\\\\d+)"}, "properties": {"repobilityId": "2a4bc9327486a830", "scanner": "scanner-primary", "fingerprint": "cd2ed68acd377010", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e17a328909b3320", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/rate"}, "properties": {"repobilityId": "15dc7194e4f77ecf", "scanner": "scanner-primary", "fingerprint": "6e17a328909b3320", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be518a2514e10d86", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/remarks"}, "properties": {"repobilityId": "0c23a07a4af93569", "scanner": "scanner-primary", "fingerprint": "be518a2514e10d86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13d908f2fe94e141", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id(\\\\d+)/visibility"}, "properties": {"repobilityId": "d71bb901bb17183e", "scanner": "scanner-primary", "fingerprint": "13d908f2fe94e141", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-851dee390a368ddd", "level": "note", "message": {"text": "Unused endpoint: POST /:id/flash-report"}, "properties": {"repobilityId": "43f7ceb28728fde4", "scanner": "scanner-primary", "fingerprint": "851dee390a368ddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01ba1970614b75f7", "level": "note", "message": {"text": "Unused endpoint: POST /:id/inspector-report"}, "properties": {"repobilityId": "437141cf6d8e7981", "scanner": "scanner-primary", "fingerprint": "01ba1970614b75f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-284458d24ff75736", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id(\\\\d+)/flash-report"}, "properties": {"repobilityId": "0c3adeefb78ec404", "scanner": "scanner-primary", "fingerprint": "284458d24ff75736", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2bab83d916ff8cad", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id(\\\\d+)/inspector-report"}, "properties": {"repobilityId": "74f5bdc5c9e1f098", "scanner": "scanner-primary", "fingerprint": "2bab83d916ff8cad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}