{"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-68dca89962fa058b", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/App.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/App.tsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-92db1446c816ee93", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CompanySwitcher.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CompanySwitcher.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec0c5edb784b91c7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/NotificationBell.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/NotificationBell.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba11c27a670872e4", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Onboarding.tsx:378", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Onboarding.tsx:378"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba3bb965eb64d1a4", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/smart/SmartInput.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/smart/SmartInput.tsx:244"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7dc0a3993decbfe9", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/layout/PortalLayout.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/layout/PortalLayout.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c43f8949a289e93", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:75", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:75"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce54ec474adf3702", "name": "Stray `console.log` in TS/JS \u2014 client/src/lib/push.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 client/src/lib/push.ts:14"}, "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-ad2ab238260809bb", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Admin.tsx:1502", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Admin.tsx:1502"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daa56b25afab43c2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ChartOfAccounts.tsx:291", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ChartOfAccounts.tsx:291"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb90a80cea15c6e2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Receipts.tsx:1700", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Receipts.tsx:1700"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8a202ebfdb5a08a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDocuments.tsx:436", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDocuments.tsx:436"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ead6103aaa5562d8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/WhatsAppDashboard.tsx:1127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/WhatsAppDashboard.tsx:1127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00fde2fbda892661", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PaymentChasing.tsx:939", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PaymentChasing.tsx:939"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61379b4b97577b33", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Inventory.tsx:533", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Inventory.tsx:533"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3af039387c450ec7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AIFeatures.tsx:542", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AIFeatures.tsx:542"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da9c9a7ff6fe4bf3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TaskCenter.tsx:416", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TaskCenter.tsx:416"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-edfb828bd76c85e8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientTasks.tsx:398", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientTasks.tsx:398"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbfc8a6cdde6682d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Dashboard.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Dashboard.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e362a5a014490631", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:352", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:352"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb32fbb6cda9a225", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientDashboard.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientDashboard.tsx:306"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ebc308d1aa3b9de9", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CostCenters.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CostCenters.tsx:355"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73c659297ec2871d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CustomerContacts.tsx:636", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CustomerContacts.tsx:636"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ded1c518ff5ebbae", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/FirmCommandCenter.tsx:680", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/FirmCommandCenter.tsx:680"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a640d8535ea1629c", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DocumentVersions.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DocumentVersions.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b9c3e30e46b3e91", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DeveloperSettings.tsx:599", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DeveloperSettings.tsx:599"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12c32442b9a311f3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Companies.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Companies.tsx:212"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9014ba3ed386e56", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AICategorize.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AICategorize.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e8785d64e88da37", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/BankReconciliation.tsx:744", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/BankReconciliation.tsx:744"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13ee5e13cfb46f75", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ComplianceCalendar.tsx:336", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ComplianceCalendar.tsx:336"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b70f858cf9eec13", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AutoReconcile.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AutoReconcile.tsx:355"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b641cedf060b431b", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ReconciliationRules.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ReconciliationRules.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8c4dd55fc9ae95e", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AccountLedger.tsx:529", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AccountLedger.tsx:529"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-212fecbfee27657f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/BulkOperations.tsx:324", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/BulkOperations.tsx:324"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2964fe9e33ba1bf", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/FirmComms.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/FirmComms.tsx:289"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5789a529d9e8cfd1", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ValueOps.tsx:423", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ValueOps.tsx:423"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-380bd52ffcd76f25", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ClientPortfolio.tsx:695", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ClientPortfolio.tsx:695"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3842874eaf9fa9e9", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/StaffManagement.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/StaffManagement.tsx:306"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4dfb59b04fc9b6c4", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/LeadPipeline.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/LeadPipeline.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20f92dafd1712f09", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalMessages.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalMessages.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cdd3a777be38e145", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalDocuments.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalDocuments.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d1f71b8d6345dae", "name": "TODO/FIXME marker in shipping code \u2014 server/routes/billing.routes.ts:98", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/routes/billing.routes.ts:98"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b5eea06b4a6efce", "name": "Docker base image is tag-pinned but not digest-pinned: node:20.19-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.19-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01f8fa2e5abf1811", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:75", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:75"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a41b5a8e75823879", "name": "Possible secret in client/src/lib/i18n.ts", "shortDescription": {"text": "Possible secret in client/src/lib/i18n.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ebe83d7341fc66ef", "name": "Insecure pattern 'node_child_process' in scripts/audit-campaign.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/audit-campaign.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f14c55c41004c0e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in extensions/whatsapp-bridge/src/popup.js:16", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extensions/whatsapp-bridge/src/popup.js:16"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cd0e87e8d3bd18a", "name": "Very large file: client/src/pages/Invoices.tsx (2381 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Invoices.tsx (2381 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-a6344b1f14b3739e", "name": "Very large file: client/src/pages/Admin.tsx (1701 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Admin.tsx (1701 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-17c602de9c7957e6", "name": "Very large file: client/src/pages/Receipts.tsx (2500 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Receipts.tsx (2500 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-e2ab8dc573f31ef4", "name": "Very large file: client/src/pages/MuhasibLanding.tsx (1594 lines)", "shortDescription": {"text": "Very large file: client/src/pages/MuhasibLanding.tsx (1594 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-6dd2462062605c86", "name": "Very large file: client/src/pages/WhatsAppDashboard.tsx (1413 lines)", "shortDescription": {"text": "Very large file: client/src/pages/WhatsAppDashboard.tsx (1413 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-0306b54db557b986", "name": "Very large file: client/src/pages/PaymentChasing.tsx (1365 lines)", "shortDescription": {"text": "Very large file: client/src/pages/PaymentChasing.tsx (1365 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-3470d9ef74534b64", "name": "Very large file: client/src/pages/Pricing.tsx (1152 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Pricing.tsx (1152 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-ed0ffc6ea065b6e3", "name": "Very large file: client/src/pages/Landing.tsx (1341 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Landing.tsx (1341 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-d4c77eea2e58655f", "name": "Very large file: client/src/pages/BillPay.tsx (1584 lines)", "shortDescription": {"text": "Very large file: client/src/pages/BillPay.tsx (1584 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-f7f8315d5ad22082", "name": "Very large file: client/src/pages/Onboarding.tsx (1664 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Onboarding.tsx (1664 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-bbef36b9da612553", "name": "Very large file: client/src/pages/Payroll.tsx (1737 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Payroll.tsx (1737 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-944334a7527fc1c8", "name": "Very large file: client/src/pages/ExpenseClaims.tsx (1367 lines)", "shortDescription": {"text": "Very large file: client/src/pages/ExpenseClaims.tsx (1367 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-99fffa5a31e0fb10", "name": "Very large file: client/src/pages/firm/ClientPortfolio.tsx (4818 lines)", "shortDescription": {"text": "Very large file: client/src/pages/firm/ClientPortfolio.tsx (4818 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-8094a4c649254e92", "name": "Very large file: shared/schema.ts (4463 lines)", "shortDescription": {"text": "Very large file: shared/schema.ts (4463 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-4d5228734e359cdf", "name": "Very large file: server/storage.ts (4745 lines)", "shortDescription": {"text": "Very large file: server/storage.ts (4745 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-abd54d5216f7783d", "name": "Very large file: server/db.ts (1194 lines)", "shortDescription": {"text": "Very large file: server/db.ts (1194 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-9f041d668704622b", "name": "Very large file: server/routes/payroll.routes.ts (1525 lines)", "shortDescription": {"text": "Very large file: server/routes/payroll.routes.ts (1525 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-3ac03e27e9703761", "name": "Very large file: server/routes/firm.routes.ts (2440 lines)", "shortDescription": {"text": "Very large file: server/routes/firm.routes.ts (2440 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-085ac7fe57663149", "name": "Very large file: server/routes/invoices.routes.ts (1541 lines)", "shortDescription": {"text": "Very large file: server/routes/invoices.routes.ts (1541 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-c87af43405097a89", "name": "Very large file: server/routes/fixed-assets.routes.ts (1598 lines)", "shortDescription": {"text": "Very large file: server/routes/fixed-assets.routes.ts (1598 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-d688ad29ddac21b2", "name": "Very large file: server/routes/ai.routes.ts (2437 lines)", "shortDescription": {"text": "Very large file: server/routes/ai.routes.ts (2437 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-aacc11d66ab01cab", "name": "Very large file: server/services/firm-value-ops.service.ts (1843 lines)", "shortDescription": {"text": "Very large file: server/services/firm-value-ops.service.ts (1843 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "43 tests / 404 src (ratio 0.11)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 45 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 386 placeholder/mock markers across 94 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aea6e62dc162bdfc", "name": "Commented-code block (5 lines) in vitest.config.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in vitest.config.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3660ff1b69dd9c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/smart/SmartInput.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/smart/SmartInput.tsx:106"}, "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-05c6e4a1cf47d717", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/RegisterForm.tsx:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/RegisterForm.tsx:75"}, "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-51765dca5c293b71", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/OAuthButtons.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/OAuthButtons.tsx:39"}, "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-158c40915d053397", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/auth.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/auth.ts:56"}, "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-5dab2da75aabeea7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/csrf.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/csrf.ts:13"}, "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-e250d2f80d37550b", "name": "Commented-code block (10 lines) in client/src/lib/queryClient.ts:187", "shortDescription": {"text": "Commented-code block (10 lines) in client/src/lib/queryClient.ts:187"}, "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-5f7f1c5b461a3be8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:110"}, "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-9493a6421afd5aa3", "name": "Commented-code block (7 lines) in client/src/lib/animations.tsx:6", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/lib/animations.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3416114f8a8ac0f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/BackupRestore.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/BackupRestore.tsx:82"}, "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-8a8eeb88ec1d8031", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AIChat.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AIChat.tsx:119"}, "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-e652170cc239cce9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/History.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/History.tsx:54"}, "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-8d699591684176eb", "name": "Commented-code block (5 lines) in client/src/pages/Onboarding.tsx:1289", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/pages/Onboarding.tsx:1289"}, "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-ac028831bb2105f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/DocumentVersions.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/DocumentVersions.tsx:54"}, "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-1700a5c4b888a7a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AccountLedger.tsx:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AccountLedger.tsx:113"}, "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-7bf3d4561f9e9ca4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/portal/PortalInvoices.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/portal/PortalInvoices.tsx:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a7b074e4d850da29", "name": "Legacy-named symbol `visa_copy` in tests/unit/document-chasing.test.ts:62", "shortDescription": {"text": "Legacy-named symbol `visa_copy` in tests/unit/document-chasing.test.ts:62"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a8d637921e3cbe2", "name": "Commented-code block (6 lines) in tests/unit/onboarding-company-update.test.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in tests/unit/onboarding-company-update.test.ts:7"}, "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-f87b0806d71bed47", "name": "Legacy-named symbol `visa_copy` in shared/schema.ts:4213", "shortDescription": {"text": "Legacy-named symbol `visa_copy` in shared/schema.ts:4213"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea16c07876fff046", "name": "Commented-code block (7 lines) in shared/schema.ts:61", "shortDescription": {"text": "Commented-code block (7 lines) in shared/schema.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cbe57b3805b0b704", "name": "Commented-code block (7 lines) in server/storage.ts:811", "shortDescription": {"text": "Commented-code block (7 lines) in server/storage.ts:811"}, "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-ac84ed4ca1a38b20", "name": "Commented-code block (7 lines) in server/db.ts:593", "shortDescription": {"text": "Commented-code block (7 lines) in server/db.ts:593"}, "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-fbe78cd6d904cb72", "name": "Commented-code block (5 lines) in server/config/env.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in server/config/env.ts:96"}, "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-e270504fe1ab876d", "name": "Commented-code block (7 lines) in server/middleware/security.ts:142", "shortDescription": {"text": "Commented-code block (7 lines) in server/middleware/security.ts:142"}, "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-6369a8503ee0c3d0", "name": "Commented-code block (5 lines) in server/middleware/featureGate.ts:155", "shortDescription": {"text": "Commented-code block (5 lines) in server/middleware/featureGate.ts:155"}, "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-fa7eef08692f87f4", "name": "Commented-code block (5 lines) in server/utils/date.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in server/utils/date.ts: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-00c2af82ab6a4d0d", "name": "Commented-code block (6 lines) in server/routes/journal.routes.ts:500", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/journal.routes.ts:500"}, "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-426f99fce963f613", "name": "Commented-code block (5 lines) in server/routes/ocr.routes.ts:61", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/ocr.routes.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b3e03b13c0335c2f", "name": "Legacy-named symbol `daysOld` in server/routes/analytics.routes.ts:638", "shortDescription": {"text": "Legacy-named symbol `daysOld` in server/routes/analytics.routes.ts:638"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-167d89d30be7baa8", "name": "Commented-code block (6 lines) in server/routes/payroll.routes.ts:21", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/payroll.routes.ts:21"}, "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-bc6d6f8ece948138", "name": "Commented-code block (6 lines) in server/routes/firm.routes.ts:830", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/firm.routes.ts:830"}, "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-467e84f8d03bc7a3", "name": "Commented-code block (6 lines) in server/routes/auth.routes.ts:598", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/auth.routes.ts:598"}, "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-06be6d2a37c6a499", "name": "Commented-code block (5 lines) in server/routes/vat.routes.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/vat.routes.ts:182"}, "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-d75d32a2f4cbfe42", "name": "Commented-code block (8 lines) in server/routes/reports.routes.ts:73", "shortDescription": {"text": "Commented-code block (8 lines) in server/routes/reports.routes.ts:73"}, "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-4e847abee6b42f12", "name": "Commented-code block (7 lines) in server/routes/admin-health.routes.ts:29", "shortDescription": {"text": "Commented-code block (7 lines) in server/routes/admin-health.routes.ts:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b24eee4ee7f93675", "name": "Commented-code block (7 lines) in server/routes/invoices.routes.ts:1040", "shortDescription": {"text": "Commented-code block (7 lines) in server/routes/invoices.routes.ts:1040"}, "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-70894b140c3d6d10", "name": "Commented-code block (5 lines) in server/routes/fixed-assets.routes.ts:218", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/fixed-assets.routes.ts:218"}, "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-b8a09745fc113f17", "name": "Commented-code block (5 lines) in server/routes/bank-statements.routes.ts:607", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/bank-statements.routes.ts:607"}, "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-3438c83107240df3", "name": "Commented-code block (5 lines) in server/routes/exchange-rates.routes.ts:238", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/exchange-rates.routes.ts:238"}, "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-3e387a2637f0067e", "name": "Commented-code block (6 lines) in server/routes/receipts.routes.ts:481", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/receipts.routes.ts:481"}, "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-ab097adb752fb34e", "name": "Commented-code block (8 lines) in server/routes/dashboard.routes.ts:112", "shortDescription": {"text": "Commented-code block (8 lines) in server/routes/dashboard.routes.ts:112"}, "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-39212b3e9c0dc435", "name": "Commented-code block (6 lines) in server/routes/ai.routes.ts:90", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/ai.routes.ts:90"}, "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-3f1599e38d109746", "name": "Commented-code block (5 lines) in server/services/document-chasing.service.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/document-chasing.service.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0c3c31a32992799", "name": "Commented-code block (5 lines) in server/services/receipt-classifier.service.ts:287", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/receipt-classifier.service.ts:287"}, "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-a6ab8e785aa35779", "name": "Commented-code block (6 lines) in server/services/scheduler.service.ts:484", "shortDescription": {"text": "Commented-code block (6 lines) in server/services/scheduler.service.ts:484"}, "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-ec2e54be2c8f8aa2", "name": "Commented-code block (7 lines) in server/services/invoice-state-machine.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in server/services/invoice-state-machine.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-057eab325081e131", "name": "Commented-code block (5 lines) in server/services/training-data.service.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/training-data.service.ts:31"}, "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-383b2a53be4baa07", "name": "Commented-code block (5 lines) in server/services/einvoice-qr.service.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/einvoice-qr.service.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-556478b9cab8b959", "name": "Commented-code block (7 lines) in server/services/receipt-autopilot.service.ts:168", "shortDescription": {"text": "Commented-code block (7 lines) in server/services/receipt-autopilot.service.ts:168"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-044c8a8ec9259908", "name": "Commented-code block (6 lines) in server/services/cashflow-forecast.service.ts:77", "shortDescription": {"text": "Commented-code block (6 lines) in server/services/cashflow-forecast.service.ts:77"}, "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-2a25ec59f3d82729", "name": "Commented-code block (7 lines) in server/services/bill-posting.service.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in server/services/bill-posting.service.ts:7"}, "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-5faa2aa164d3515c", "name": "Commented-code block (5 lines) in server/services/vat-autopilot.service.ts:744", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/vat-autopilot.service.ts:744"}, "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-37ba68e56a4b4c6a", "name": "Commented-code block (8 lines) in server/services/anomaly-detection.service.ts:58", "shortDescription": {"text": "Commented-code block (8 lines) in server/services/anomaly-detection.service.ts:58"}, "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-277d7a6955a6e337", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/open-banking.service.ts:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/open-banking.service.ts:87"}, "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-3014f0f2daff1c2e", "name": "Commented-code block (7 lines) in server/services/auto-reconcile.service.ts:308", "shortDescription": {"text": "Commented-code block (7 lines) in server/services/auto-reconcile.service.ts:308"}, "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-4d223bfdf539b12d", "name": "42 env vars used in code but missing from .env.example", "shortDescription": {"text": "42 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANALYZE`, `APP_VERSION`, `AUDIT_STRICT`, `BILLING_ENFORCEMENT`, `COMMIT_SHA`, `CORS_ORIGIN`, `DATABASE_SSL`, `DATABASE_SSL_REJECT_UNAUTHORIZED` + 34 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-5766dc24db809018", "name": "Frontend route `/auth/callback` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/callback` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-270bca32d3c6d67a", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a85439fa286695ba", "name": "Frontend route `/services` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/services` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7e64a40aac081022", "name": "Frontend route `/view/invoice/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/view/invoice/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bdb01bd71b8a19ca", "name": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ca9b70b0240bc57", "name": "Frontend route `/settings/company` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/settings/company` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff78bdbf0a5e87bf", "name": "Frontend route `/accounts/:id/ledger` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/accounts/:id/ledger` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c158c8b221de2a5e", "name": "Frontend route `/recurring-invoices` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/recurring-invoices` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-60712ba764ad0e93", "name": "Frontend route `/payment-chasing` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/payment-chasing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b1b340a5866e8d8", "name": "Frontend route `/journal/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/journal/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c886c3074748dfaf", "name": "Frontend route `/receipt-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/receipt-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74b4472aa0bdb027", "name": "Frontend route `/quotes` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/quotes` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7070e2a61035d43", "name": "Frontend route `/credit-notes` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/credit-notes` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-546385c79c118939", "name": "Frontend route `/purchase-orders` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/purchase-orders` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43fd4f6e28047272", "name": "Frontend route `/cost-centers` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/cost-centers` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc8099064820c429", "name": "Frontend route `/financial-statements` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/financial-statements` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3623a1618a7b7c7", "name": "Frontend route `/reconciliation-rules` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/reconciliation-rules` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b81404102b38f90", "name": "Frontend route `/invoice-templates` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/invoice-templates` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fcde8df70de720b8", "name": "Frontend route `/document-versions` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/document-versions` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9adec6166ae5d5c", "name": "Frontend route `/developer-settings` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/developer-settings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1ada3f044362f1a", "name": "Frontend route `/notification-preferences` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/notification-preferences` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b008b258421ddd5", "name": "Frontend route `/subscription` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/subscription` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d85442bc92900df0", "name": "Frontend route `/exchange-rates` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/exchange-rates` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-984559b79b7e1af1", "name": "Frontend route `/fixed-assets` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/fixed-assets` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21b7008edaa295ac", "name": "Frontend route `/budgets` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/budgets` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ee48c6b0c03f497", "name": "Frontend route `/expense-claims` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/expense-claims` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-837749562f3287f2", "name": "Frontend route `/cashflow-forecast` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/cashflow-forecast` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11ffb596d057b47b", "name": "Frontend route `/anomaly-detection` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/anomaly-detection` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5815cd19d087761d", "name": "Frontend route `/auto-reconcile` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/auto-reconcile` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff69a641e6fb10b8", "name": "Frontend route `/ai-inbox` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/ai-inbox` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-573ce811e0b67e58", "name": "Frontend route `/month-end` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/month-end` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d7427c35c2c901f", "name": "Frontend route `/ai-features` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/ai-features` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81ffa061fe57eff7", "name": "Frontend route `/smart-assistant` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/smart-assistant` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-06864500daa2e11b", "name": "Frontend route `/advanced-analytics` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/advanced-analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-880cca4d358f6246", "name": "Frontend route `/integrations` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/integrations` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5a18da0a96d45a6", "name": "Frontend route `/whatsapp` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/whatsapp` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4cf3d8a1a57189d", "name": "Frontend route `/document-chasing` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/document-chasing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a373663a640915bb", "name": "Frontend route `/referrals` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/referrals` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f11a119ccbbb98da", "name": "Frontend route `/feedback` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/feedback` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d2d565659fb154a", "name": "Frontend route `/analytics` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6eed814f8ea0d019", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0946f1ac31e6d9c3", "name": "Frontend route `/vat-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/vat-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6989d5b2b3639b8d", "name": "Frontend route `/history` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/history` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3bc19f695e28eb26", "name": "Frontend route `/advanced-reports` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/advanced-reports` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85072a2881741fb3", "name": "Frontend route `/task-center` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/task-center` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c4c4e46ae6411dcc", "name": "Frontend route `/news-feed` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/news-feed` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-94e18f2dd40ff89f", "name": "Frontend route `/admin/dashboard` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/dashboard` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f33d002a81bd104", "name": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aecf0e9700cfa634", "name": "Frontend route `/admin/clients/:id/documents` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/clients/:id/documents` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c742f58a026705b2", "name": "Frontend route `/admin/clients/:id/tasks` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/clients/:id/tasks` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e747c61ad650661", "name": "Frontend route `/admin/documents` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/documents` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5648ff425ab4ba73", "name": "Frontend route `/firm/command-center` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/command-center` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b10d945aee1bf25b", "name": "Frontend route `/firm/health` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/health` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7831b587cea6513e", "name": "Frontend route `/firm/clients/:companyId` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/clients/:companyId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef3b2b5b48d44bb5", "name": "Frontend route `/firm/bulk` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/bulk` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27fb2888b964cfee", "name": "Frontend route `/firm/analytics` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2dc04cb7986481a7", "name": "Frontend route `/firm/pipeline` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/firm/pipeline` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25ff4e0bef1e2ffe", "name": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/whatsapp-routes.test.ts:39)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/whatsapp-routes.test.ts:39)"}, "fullDescription": {"text": "`tests/unit/whatsapp-routes.test.ts:39` calls `GET http://127.0.0.1:${addr.port}${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<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-8ca9f44e4f25e041", "name": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/anomaly-routes.test.ts:45)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/anomaly-routes.test.ts:45)"}, "fullDescription": {"text": "`tests/unit/anomaly-routes.test.ts:45` calls `GET http://127.0.0.1:${addr.port}${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<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-b510a5538e47172f", "name": "Dangling fetch: GET http://127.0.0.1:${addr.port}/api/firm/probe (tests/unit/nra-access.test.ts:45)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}/api/firm/probe (tests/unit/nra-access.test.ts:45)"}, "fullDescription": {"text": "`tests/unit/nra-access.test.ts:45` calls `GET http://127.0.0.1:${addr.port}/api/firm/probe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/firm/probe`\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-e033310c31f8e410", "name": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/billing-enforcement.test.ts:39)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/billing-enforcement.test.ts:39)"}, "fullDescription": {"text": "`tests/unit/billing-enforcement.test.ts:39` calls `GET http://127.0.0.1:${addr.port}${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<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-1c6e49994c143be3", "name": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/trust-blockers.test.ts:110)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/trust-blockers.test.ts:110)"}, "fullDescription": {"text": "`tests/unit/trust-blockers.test.ts:110` calls `GET http://127.0.0.1:${addr.port}${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<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-b7612c93d4ca5903", "name": "Unused endpoint: GET /api/csrf-token", "shortDescription": {"text": "Unused endpoint: GET /api/csrf-token"}, "fullDescription": {"text": "`server/index.ts` declares `GET /api/csrf-token` 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-6c2507f3182299a0", "name": "Unused endpoint: GET /api/version", "shortDescription": {"text": "Unused endpoint: GET /api/version"}, "fullDescription": {"text": "`server/index.ts` declares `GET /api/version` 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-b8073f7bf758f6d0", "name": "Unused endpoint: USE /api/*", "shortDescription": {"text": "Unused endpoint: USE /api/*"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b59435b3211a9df", "name": "Unused endpoint: USE /assets", "shortDescription": {"text": "Unused endpoint: USE /assets"}, "fullDescription": {"text": "`server/vite.ts` declares `USE /assets` 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-9ab925dd0a91800d", "name": "Unused endpoint: USE /api/csp-report", "shortDescription": {"text": "Unused endpoint: USE /api/csp-report"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `USE /api/csp-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-1992692ae67a02be", "name": "Unused endpoint: POST /api/csp-report", "shortDescription": {"text": "Unused endpoint: POST /api/csp-report"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `POST /api/csp-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-a450449479df85d4", "name": "Unused endpoint: USE /api/auth/oauth/", "shortDescription": {"text": "Unused endpoint: USE /api/auth/oauth/"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `USE /api/auth/oauth/` 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-a91f57add99eaa28", "name": "Unused endpoint: USE /api/auth/", "shortDescription": {"text": "Unused endpoint: USE /api/auth/"}, "fullDescription": {"text": "`server/middleware/security.ts` 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-8b1557090369fcc5", "name": "Unused endpoint: USE /api/ai/", "shortDescription": {"text": "Unused endpoint: USE /api/ai/"}, "fullDescription": {"text": "`server/middleware/security.ts` 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-6d25f7ab500a5e97", "name": "Unused endpoint: USE /api/ocr/", "shortDescription": {"text": "Unused endpoint: USE /api/ocr/"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `USE /api/ocr/` 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-a61f123d87202266", "name": "Unused endpoint: USE /api/firm/bulk/ocr", "shortDescription": {"text": "Unused endpoint: USE /api/firm/bulk/ocr"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `USE /api/firm/bulk/ocr` 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-76889df7c8e240c5", "name": "Unused endpoint: USE /api/", "shortDescription": {"text": "Unused endpoint: USE /api/"}, "fullDescription": {"text": "`server/middleware/security.ts` declares `USE /api/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a1e8967a87dfcaf", "name": "Unused endpoint: GET /route", "shortDescription": {"text": "Unused endpoint: GET /route"}, "fullDescription": {"text": "`server/middleware/errorHandler.ts` declares `GET /route` 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-1fd34b69f2580619", "name": "Unused endpoint: POST /x", "shortDescription": {"text": "Unused endpoint: POST /x"}, "fullDescription": {"text": "`server/middleware/validate.ts` declares `POST /x` 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-82f6c63ca6dd76a5", "name": "Unused endpoint: GET /api/companies/:companyId/journal", "shortDescription": {"text": "Unused endpoint: GET /api/companies/:companyId/journal"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `GET /api/companies/:companyId/journal` 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-178a81c78e076cd6", "name": "Unused endpoint: POST /api/companies/:companyId/journal", "shortDescription": {"text": "Unused endpoint: POST /api/companies/:companyId/journal"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `POST /api/companies/:companyId/journal` 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-bfe3e806d5d5da33", "name": "Unused endpoint: GET /api/journal/:id", "shortDescription": {"text": "Unused endpoint: GET /api/journal/:id"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `GET /api/journal/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b98b3c722cc172fe", "name": "Unused endpoint: PUT /api/journal/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/journal/:id"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `PUT /api/journal/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94eca48c242cedcd", "name": "Unused endpoint: POST /api/journal/:id/post", "shortDescription": {"text": "Unused endpoint: POST /api/journal/:id/post"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `POST /api/journal/:id/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-5a7efbd66f9c3e28", "name": "Unused endpoint: POST /api/journal/:id/reverse", "shortDescription": {"text": "Unused endpoint: POST /api/journal/:id/reverse"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `POST /api/journal/:id/reverse` 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-e75590d021b65825", "name": "Unused endpoint: DELETE /api/journal/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/journal/:id"}, "fullDescription": {"text": "`server/routes/journal.routes.ts` declares `DELETE /api/journal/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f5aeb81c137d9f1", "name": "Unused endpoint: GET /api/companies/:companyId/reconciliation-rules", "shortDescription": {"text": "Unused endpoint: GET /api/companies/:companyId/reconciliation-rules"}, "fullDescription": {"text": "`server/routes/reconciliation-rules.routes.ts` declares `GET /api/companies/:companyId/reconciliation-rules` 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-420505f2071e42a7", "name": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules", "shortDescription": {"text": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules"}, "fullDescription": {"text": "`server/routes/reconciliation-rules.routes.ts` declares `POST /api/companies/:companyId/reconciliation-rules` 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-804bd92691fb27eb", "name": "Unused endpoint: PUT /api/reconciliation-rules/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/reconciliation-rules/:id"}, "fullDescription": {"text": "`server/routes/reconciliation-rules.routes.ts` declares `PUT /api/reconciliation-rules/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92454a70f8c437dd", "name": "Unused endpoint: DELETE /api/reconciliation-rules/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/reconciliation-rules/:id"}, "fullDescription": {"text": "`server/routes/reconciliation-rules.routes.ts` declares `DELETE /api/reconciliation-rules/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cef54e8de55f2e5", "name": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules/auto-match", "shortDescription": {"text": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules/auto-match"}, "fullDescription": {"text": "`server/routes/reconciliation-rules.routes.ts` declares `POST /api/companies/:companyId/reconciliation-rules/auto-match` 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-0e7a28dcd18c78f4", "name": "Unused endpoint: POST /api/ocr/process", "shortDescription": {"text": "Unused endpoint: POST /api/ocr/process"}, "fullDescription": {"text": "`server/routes/ocr.routes.ts` declares `POST /api/ocr/process` 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-bf53f434a219cda7", "name": "Unused endpoint: POST /api/ocr/export-excel", "shortDescription": {"text": "Unused endpoint: POST /api/ocr/export-excel"}, "fullDescription": {"text": "`server/routes/ocr.routes.ts` declares `POST /api/ocr/export-excel` 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-f1b4ba4ded56ae70", "name": "Unused endpoint: POST /api/export/excel", "shortDescription": {"text": "Unused endpoint: POST /api/export/excel"}, "fullDescription": {"text": "`server/routes/ocr.routes.ts` declares `POST /api/export/excel` 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-6a67ead4a0e0ec8c", "name": "Unused endpoint: GET /api/companies/:companyId/invoice-templates", "shortDescription": {"text": "Unused endpoint: GET /api/companies/:companyId/invoice-templates"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `GET /api/companies/:companyId/invoice-templates` 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-6952c9140b3ae315", "name": "Unused endpoint: GET /api/invoice-templates/:id", "shortDescription": {"text": "Unused endpoint: GET /api/invoice-templates/:id"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `GET /api/invoice-templates/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36580cafec5676a1", "name": "Unused endpoint: POST /api/companies/:companyId/invoice-templates", "shortDescription": {"text": "Unused endpoint: POST /api/companies/:companyId/invoice-templates"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `POST /api/companies/:companyId/invoice-templates` 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-0785b96a0b8f150f", "name": "Unused endpoint: PUT /api/invoice-templates/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/invoice-templates/:id"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `PUT /api/invoice-templates/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35d8d1f17d321e94", "name": "Unused endpoint: DELETE /api/invoice-templates/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/invoice-templates/:id"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `DELETE /api/invoice-templates/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-392ffb9b1ea3e48c", "name": "Unused endpoint: POST /api/invoice-templates/:id/set-default", "shortDescription": {"text": "Unused endpoint: POST /api/invoice-templates/:id/set-default"}, "fullDescription": {"text": "`server/routes/invoice-templates.routes.ts` declares `POST /api/invoice-templates/:id/set-default` 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-2751e94c7f35fc9c", "name": "Unused endpoint: GET /api/analytics/forecasts", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/forecasts"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/forecasts` 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-bc17f2e222cd0248", "name": "Unused endpoint: POST /api/analytics/generate-forecast", "shortDescription": {"text": "Unused endpoint: POST /api/analytics/generate-forecast"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `POST /api/analytics/generate-forecast` 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-b64ad42fc702e446", "name": "Unused endpoint: GET /api/analytics/budget-vs-actual", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/budget-vs-actual"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/budget-vs-actual` 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-0903e746358bd943", "name": "Unused endpoint: GET /api/analytics/kpis", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/kpis"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/kpis` 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-431050b31c01dfed", "name": "Unused endpoint: GET /api/analytics/insights", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/insights"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/insights` 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-e17d6dff006303ff", "name": "Unused endpoint: GET /api/integrations/ecommerce", "shortDescription": {"text": "Unused endpoint: GET /api/integrations/ecommerce"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/integrations/ecommerce` 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-21b63375a196b1c7", "name": "Unused endpoint: GET /api/integrations/ecommerce/transactions", "shortDescription": {"text": "Unused endpoint: GET /api/integrations/ecommerce/transactions"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/integrations/ecommerce/transactions` 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-4f15c0c90004e413", "name": "Unused endpoint: POST /api/integrations/ecommerce/connect", "shortDescription": {"text": "Unused endpoint: POST /api/integrations/ecommerce/connect"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `POST /api/integrations/ecommerce/connect` 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-6efe257b0a423025", "name": "Unused endpoint: POST /api/integrations/ecommerce/:integrationId/sync", "shortDescription": {"text": "Unused endpoint: POST /api/integrations/ecommerce/:integrationId/sync"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `POST /api/integrations/ecommerce/:integrationId/sync` 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-96166e2b44b97fab", "name": "Unused endpoint: PATCH /api/integrations/ecommerce/:integrationId/toggle", "shortDescription": {"text": "Unused endpoint: PATCH /api/integrations/ecommerce/:integrationId/toggle"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `PATCH /api/integrations/ecommerce/:integrationId/toggle` 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-99a7751cc7341d02", "name": "Unused endpoint: POST /api/analytics/event", "shortDescription": {"text": "Unused endpoint: POST /api/analytics/event"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `POST /api/analytics/event` 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-cb221d92566ae25d", "name": "Unused endpoint: GET /api/analytics/dashboard", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/dashboard"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/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-ef7e7545f9da4901", "name": "Unused endpoint: GET /api/analytics/feature-usage", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/feature-usage"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/analytics/feature-usage` 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-7d37bd9a00025fb0", "name": "Unused endpoint: GET /api/companies/:companyId/analytics/cash-forecast", "shortDescription": {"text": "Unused endpoint: GET /api/companies/:companyId/analytics/cash-forecast"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/companies/:companyId/analytics/cash-forecast` 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-c8ffecd0c257f680", "name": "Unused endpoint: GET /api/companies/:companyId/analytics/profit-trend", "shortDescription": {"text": "Unused endpoint: GET /api/companies/:companyId/analytics/profit-trend"}, "fullDescription": {"text": "`server/routes/analytics.routes.ts` declares `GET /api/companies/:companyId/analytics/profit-trend` 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/19495"}, "properties": {"repository": "shire602-cyber/NR-Ai", "repoUrl": "https://github.com/shire602-cyber/NR-Ai", "branch": "main"}, "results": [{"ruleId": "scanner-68dca89962fa058b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/App.tsx:217"}, "properties": {"repobilityId": "e07ec3c3246769df", "scanner": "scanner-primary", "fingerprint": "68dca89962fa058b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92db1446c816ee93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CompanySwitcher.tsx:65"}, "properties": {"repobilityId": "64c06e6b3784adfb", "scanner": "scanner-primary", "fingerprint": "92db1446c816ee93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec0c5edb784b91c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/NotificationBell.tsx:104"}, "properties": {"repobilityId": "32d4ec82e585b949", "scanner": "scanner-primary", "fingerprint": "ec0c5edb784b91c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba11c27a670872e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Onboarding.tsx:378"}, "properties": {"repobilityId": "e9ff2f594a3557a2", "scanner": "scanner-primary", "fingerprint": "ba11c27a670872e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba3bb965eb64d1a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/smart/SmartInput.tsx:244"}, "properties": {"repobilityId": "683cb6485b5f14d4", "scanner": "scanner-primary", "fingerprint": "ba3bb965eb64d1a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7dc0a3993decbfe9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/layout/PortalLayout.tsx:54"}, "properties": {"repobilityId": "45a2534c6e38c85e", "scanner": "scanner-primary", "fingerprint": "7dc0a3993decbfe9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c43f8949a289e93", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:75"}, "properties": {"repobilityId": "1c3a04e593515dbe", "scanner": "scanner-primary", "fingerprint": "8c43f8949a289e93", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ce54ec474adf3702", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 client/src/lib/push.ts:14"}, "properties": {"repobilityId": "25c856540e5c4861", "scanner": "scanner-primary", "fingerprint": "ce54ec474adf3702", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad2ab238260809bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Admin.tsx:1502"}, "properties": {"repobilityId": "e2f60f60efb78dba", "scanner": "scanner-primary", "fingerprint": "ad2ab238260809bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-daa56b25afab43c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ChartOfAccounts.tsx:291"}, "properties": {"repobilityId": "f645e8168a9479f8", "scanner": "scanner-primary", "fingerprint": "daa56b25afab43c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb90a80cea15c6e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Receipts.tsx:1700"}, "properties": {"repobilityId": "d3068581a84c3a13", "scanner": "scanner-primary", "fingerprint": "cb90a80cea15c6e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8a202ebfdb5a08a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDocuments.tsx:436"}, "properties": {"repobilityId": "fe21c840ea3bc736", "scanner": "scanner-primary", "fingerprint": "c8a202ebfdb5a08a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ead6103aaa5562d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/WhatsAppDashboard.tsx:1127"}, "properties": {"repobilityId": "52b91e05dd899afa", "scanner": "scanner-primary", "fingerprint": "ead6103aaa5562d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00fde2fbda892661", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PaymentChasing.tsx:939"}, "properties": {"repobilityId": "09e7a6343800f13e", "scanner": "scanner-primary", "fingerprint": "00fde2fbda892661", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61379b4b97577b33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Inventory.tsx:533"}, "properties": {"repobilityId": "60a5834465869c33", "scanner": "scanner-primary", "fingerprint": "61379b4b97577b33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3af039387c450ec7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AIFeatures.tsx:542"}, "properties": {"repobilityId": "93c44eaf4db4c3e6", "scanner": "scanner-primary", "fingerprint": "3af039387c450ec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da9c9a7ff6fe4bf3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TaskCenter.tsx:416"}, "properties": {"repobilityId": "bbab9c2fbd98a911", "scanner": "scanner-primary", "fingerprint": "da9c9a7ff6fe4bf3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edfb828bd76c85e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientTasks.tsx:398"}, "properties": {"repobilityId": "016dbf660051ac6d", "scanner": "scanner-primary", "fingerprint": "edfb828bd76c85e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbfc8a6cdde6682d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Dashboard.tsx:307"}, "properties": {"repobilityId": "0a31edf758055619", "scanner": "scanner-primary", "fingerprint": "dbfc8a6cdde6682d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e362a5a014490631", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:352"}, "properties": {"repobilityId": "3d8cf5e6861d9280", "scanner": "scanner-primary", "fingerprint": "e362a5a014490631", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb32fbb6cda9a225", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientDashboard.tsx:306"}, "properties": {"repobilityId": "123e9525ab7085f4", "scanner": "scanner-primary", "fingerprint": "cb32fbb6cda9a225", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebc308d1aa3b9de9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CostCenters.tsx:355"}, "properties": {"repobilityId": "b683e7804cec9b85", "scanner": "scanner-primary", "fingerprint": "ebc308d1aa3b9de9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73c659297ec2871d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CustomerContacts.tsx:636"}, "properties": {"repobilityId": "7870edc35c98300a", "scanner": "scanner-primary", "fingerprint": "73c659297ec2871d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ded1c518ff5ebbae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/FirmCommandCenter.tsx:680"}, "properties": {"repobilityId": "72ef45eacc433bee", "scanner": "scanner-primary", "fingerprint": "ded1c518ff5ebbae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a640d8535ea1629c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DocumentVersions.tsx:224"}, "properties": {"repobilityId": "fd17e594f8f374cc", "scanner": "scanner-primary", "fingerprint": "a640d8535ea1629c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b9c3e30e46b3e91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DeveloperSettings.tsx:599"}, "properties": {"repobilityId": "9fbbf1fb38e284b8", "scanner": "scanner-primary", "fingerprint": "1b9c3e30e46b3e91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12c32442b9a311f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Companies.tsx:212"}, "properties": {"repobilityId": "0679174a376196a2", "scanner": "scanner-primary", "fingerprint": "12c32442b9a311f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9014ba3ed386e56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AICategorize.tsx:190"}, "properties": {"repobilityId": "d8406de5c3b240ea", "scanner": "scanner-primary", "fingerprint": "c9014ba3ed386e56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e8785d64e88da37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/BankReconciliation.tsx:744"}, "properties": {"repobilityId": "aafd48bef12fb3ae", "scanner": "scanner-primary", "fingerprint": "2e8785d64e88da37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13ee5e13cfb46f75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ComplianceCalendar.tsx:336"}, "properties": {"repobilityId": "beb2a37839ea8b61", "scanner": "scanner-primary", "fingerprint": "13ee5e13cfb46f75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b70f858cf9eec13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AutoReconcile.tsx:355"}, "properties": {"repobilityId": "5ab7268b5a23e38d", "scanner": "scanner-primary", "fingerprint": "9b70f858cf9eec13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b641cedf060b431b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ReconciliationRules.tsx:361"}, "properties": {"repobilityId": "1e6410fcee86ed76", "scanner": "scanner-primary", "fingerprint": "b641cedf060b431b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8c4dd55fc9ae95e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AccountLedger.tsx:529"}, "properties": {"repobilityId": "9d7edc7ed7e23076", "scanner": "scanner-primary", "fingerprint": "a8c4dd55fc9ae95e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-212fecbfee27657f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/BulkOperations.tsx:324"}, "properties": {"repobilityId": "5d67cdd20f42979b", "scanner": "scanner-primary", "fingerprint": "212fecbfee27657f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2964fe9e33ba1bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/FirmComms.tsx:289"}, "properties": {"repobilityId": "47b2fb5a4426b7b8", "scanner": "scanner-primary", "fingerprint": "b2964fe9e33ba1bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5789a529d9e8cfd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ValueOps.tsx:423"}, "properties": {"repobilityId": "5aa4688388c064a1", "scanner": "scanner-primary", "fingerprint": "5789a529d9e8cfd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-380bd52ffcd76f25", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/ClientPortfolio.tsx:695"}, "properties": {"repobilityId": "add23ae1d4ad14e4", "scanner": "scanner-primary", "fingerprint": "380bd52ffcd76f25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3842874eaf9fa9e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/StaffManagement.tsx:306"}, "properties": {"repobilityId": "6476a3645e38beb3", "scanner": "scanner-primary", "fingerprint": "3842874eaf9fa9e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dfb59b04fc9b6c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/firm/LeadPipeline.tsx:145"}, "properties": {"repobilityId": "f629bdf7619826bb", "scanner": "scanner-primary", "fingerprint": "4dfb59b04fc9b6c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20f92dafd1712f09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalMessages.tsx:102"}, "properties": {"repobilityId": "fa5bfac1199ecdd8", "scanner": "scanner-primary", "fingerprint": "20f92dafd1712f09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdd3a777be38e145", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/portal/PortalDocuments.tsx:131"}, "properties": {"repobilityId": "c802cf80aec41d96", "scanner": "scanner-primary", "fingerprint": "cdd3a777be38e145", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d1f71b8d6345dae", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/routes/billing.routes.ts:98"}, "properties": {"repobilityId": "d349b135a27e7f60", "scanner": "scanner-primary", "fingerprint": "8d1f71b8d6345dae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1b5eea06b4a6efce", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.19-bookworm-slim"}, "properties": {"repobilityId": "8f95a5ef79ad1ba4", "scanner": "scanner-primary", "fingerprint": "1b5eea06b4a6efce", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-1b5eea06b4a6efce", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.19-bookworm-slim"}, "properties": {"repobilityId": "9a816dec966e0d1b", "scanner": "scanner-primary", "fingerprint": "1b5eea06b4a6efce", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-1b5eea06b4a6efce", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.19-bookworm-slim"}, "properties": {"repobilityId": "668e93fea6732067", "scanner": "scanner-primary", "fingerprint": "1b5eea06b4a6efce", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-01f8fa2e5abf1811", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:75"}, "properties": {"repobilityId": "298aaf10501f50f1", "scanner": "scanner-primary", "fingerprint": "01f8fa2e5abf1811", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/components/ui/chart.tsx"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-a41b5a8e75823879", "level": "error", "message": {"text": "Possible secret in client/src/lib/i18n.ts"}, "properties": {"repobilityId": "b4f71840b650ddcf", "scanner": "scanner-primary", "fingerprint": "a41b5a8e75823879", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/lib/i18n.ts"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-a41b5a8e75823879", "level": "error", "message": {"text": "Possible secret in client/src/lib/i18n.ts"}, "properties": {"repobilityId": "b4f71840b650ddcf", "scanner": "scanner-primary", "fingerprint": "a41b5a8e75823879", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/lib/i18n.ts"}, "region": {"startLine": 549}}}]}, {"ruleId": "scanner-ebe83d7341fc66ef", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/audit-campaign.mjs:1"}, "properties": {"repobilityId": "5bd79ac5f13ed0ac", "scanner": "scanner-primary", "fingerprint": "ebe83d7341fc66ef", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/audit-campaign.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f14c55c41004c0e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extensions/whatsapp-bridge/src/popup.js:16"}, "properties": {"repobilityId": "31001b1c10d34ad4", "scanner": "scanner-primary", "fingerprint": "f14c55c41004c0e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extensions/whatsapp-bridge/src/popup.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-0cd0e87e8d3bd18a", "level": "note", "message": {"text": "Very large file: client/src/pages/Invoices.tsx (2381 lines)"}, "properties": {"repobilityId": "12931c42b8af8bfb", "scanner": "scanner-primary", "fingerprint": "0cd0e87e8d3bd18a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a6344b1f14b3739e", "level": "note", "message": {"text": "Very large file: client/src/pages/Admin.tsx (1701 lines)"}, "properties": {"repobilityId": "e50f426e904e8def", "scanner": "scanner-primary", "fingerprint": "a6344b1f14b3739e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-17c602de9c7957e6", "level": "note", "message": {"text": "Very large file: client/src/pages/Receipts.tsx (2500 lines)"}, "properties": {"repobilityId": "62e6d0c9c449c97c", "scanner": "scanner-primary", "fingerprint": "17c602de9c7957e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e2ab8dc573f31ef4", "level": "note", "message": {"text": "Very large file: client/src/pages/MuhasibLanding.tsx (1594 lines)"}, "properties": {"repobilityId": "f078901f6b84bf0d", "scanner": "scanner-primary", "fingerprint": "e2ab8dc573f31ef4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6dd2462062605c86", "level": "note", "message": {"text": "Very large file: client/src/pages/WhatsAppDashboard.tsx (1413 lines)"}, "properties": {"repobilityId": "8ab0c957066c2225", "scanner": "scanner-primary", "fingerprint": "6dd2462062605c86", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0306b54db557b986", "level": "note", "message": {"text": "Very large file: client/src/pages/PaymentChasing.tsx (1365 lines)"}, "properties": {"repobilityId": "8ff7dec40354086e", "scanner": "scanner-primary", "fingerprint": "0306b54db557b986", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3470d9ef74534b64", "level": "note", "message": {"text": "Very large file: client/src/pages/Pricing.tsx (1152 lines)"}, "properties": {"repobilityId": "b8be2ed9416e17db", "scanner": "scanner-primary", "fingerprint": "3470d9ef74534b64", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ed0ffc6ea065b6e3", "level": "note", "message": {"text": "Very large file: client/src/pages/Landing.tsx (1341 lines)"}, "properties": {"repobilityId": "ee27e0cdfafa50bc", "scanner": "scanner-primary", "fingerprint": "ed0ffc6ea065b6e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d4c77eea2e58655f", "level": "note", "message": {"text": "Very large file: client/src/pages/BillPay.tsx (1584 lines)"}, "properties": {"repobilityId": "847bd08ffc7b93ee", "scanner": "scanner-primary", "fingerprint": "d4c77eea2e58655f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f7f8315d5ad22082", "level": "note", "message": {"text": "Very large file: client/src/pages/Onboarding.tsx (1664 lines)"}, "properties": {"repobilityId": "a5676888b4cf4d4a", "scanner": "scanner-primary", "fingerprint": "f7f8315d5ad22082", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bbef36b9da612553", "level": "note", "message": {"text": "Very large file: client/src/pages/Payroll.tsx (1737 lines)"}, "properties": {"repobilityId": "90778175317bd693", "scanner": "scanner-primary", "fingerprint": "bbef36b9da612553", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-944334a7527fc1c8", "level": "note", "message": {"text": "Very large file: client/src/pages/ExpenseClaims.tsx (1367 lines)"}, "properties": {"repobilityId": "d7925b2df0ded98d", "scanner": "scanner-primary", "fingerprint": "944334a7527fc1c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-99fffa5a31e0fb10", "level": "note", "message": {"text": "Very large file: client/src/pages/firm/ClientPortfolio.tsx (4818 lines)"}, "properties": {"repobilityId": "a528af14ef7b7e71", "scanner": "scanner-primary", "fingerprint": "99fffa5a31e0fb10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8094a4c649254e92", "level": "note", "message": {"text": "Very large file: shared/schema.ts (4463 lines)"}, "properties": {"repobilityId": "43ade807c81236e6", "scanner": "scanner-primary", "fingerprint": "8094a4c649254e92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4d5228734e359cdf", "level": "note", "message": {"text": "Very large file: server/storage.ts (4745 lines)"}, "properties": {"repobilityId": "ed0b4d380eb95127", "scanner": "scanner-primary", "fingerprint": "4d5228734e359cdf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-abd54d5216f7783d", "level": "note", "message": {"text": "Very large file: server/db.ts (1194 lines)"}, "properties": {"repobilityId": "044454e4c1fd13d8", "scanner": "scanner-primary", "fingerprint": "abd54d5216f7783d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f041d668704622b", "level": "note", "message": {"text": "Very large file: server/routes/payroll.routes.ts (1525 lines)"}, "properties": {"repobilityId": "e588a2b521245d8f", "scanner": "scanner-primary", "fingerprint": "9f041d668704622b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ac03e27e9703761", "level": "note", "message": {"text": "Very large file: server/routes/firm.routes.ts (2440 lines)"}, "properties": {"repobilityId": "cfecb33417ae416b", "scanner": "scanner-primary", "fingerprint": "3ac03e27e9703761", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-085ac7fe57663149", "level": "note", "message": {"text": "Very large file: server/routes/invoices.routes.ts (1541 lines)"}, "properties": {"repobilityId": "5d3031470080e364", "scanner": "scanner-primary", "fingerprint": "085ac7fe57663149", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c87af43405097a89", "level": "note", "message": {"text": "Very large file: server/routes/fixed-assets.routes.ts (1598 lines)"}, "properties": {"repobilityId": "c7538a581b572fcc", "scanner": "scanner-primary", "fingerprint": "c87af43405097a89", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d688ad29ddac21b2", "level": "note", "message": {"text": "Very large file: server/routes/ai.routes.ts (2437 lines)"}, "properties": {"repobilityId": "d9702722c2f333a1", "scanner": "scanner-primary", "fingerprint": "d688ad29ddac21b2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aacc11d66ab01cab", "level": "note", "message": {"text": "Very large file: server/services/firm-value-ops.service.ts (1843 lines)"}, "properties": {"repobilityId": "a4b7a9226c0079c4", "scanner": "scanner-primary", "fingerprint": "aacc11d66ab01cab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0b3d910f6139e68e", "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": "8b08bc5d2a3e07e5", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "eb22ca5c178b7659", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "4e52b7cc5e4a0a8d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9114b92f87369add", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "116ed64344016f92", "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": "26f7a56914d171d7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-aea6e62dc162bdfc", "level": "none", "message": {"text": "Commented-code block (5 lines) in vitest.config.ts:8"}, "properties": {"repobilityId": "5fa11dc8b0ee5f9a", "scanner": "scanner-primary", "fingerprint": "aea6e62dc162bdfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3660ff1b69dd9c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/smart/SmartInput.tsx:106"}, "properties": {"repobilityId": "88af2d484f7c96ec", "scanner": "scanner-primary", "fingerprint": "e3660ff1b69dd9c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05c6e4a1cf47d717", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/RegisterForm.tsx:75"}, "properties": {"repobilityId": "5a0d483f292b9afc", "scanner": "scanner-primary", "fingerprint": "05c6e4a1cf47d717", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51765dca5c293b71", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/auth/OAuthButtons.tsx:39"}, "properties": {"repobilityId": "c69e7c98cc720762", "scanner": "scanner-primary", "fingerprint": "51765dca5c293b71", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-158c40915d053397", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/auth.ts:56"}, "properties": {"repobilityId": "822e599c855fb49a", "scanner": "scanner-primary", "fingerprint": "158c40915d053397", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5dab2da75aabeea7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/csrf.ts:13"}, "properties": {"repobilityId": "baa1d91533ae9e31", "scanner": "scanner-primary", "fingerprint": "5dab2da75aabeea7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e250d2f80d37550b", "level": "none", "message": {"text": "Commented-code block (10 lines) in client/src/lib/queryClient.ts:187"}, "properties": {"repobilityId": "ecc0bc530fcf014f", "scanner": "scanner-primary", "fingerprint": "e250d2f80d37550b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f7f1c5b461a3be8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:110"}, "properties": {"repobilityId": "32b838b52cd1ef27", "scanner": "scanner-primary", "fingerprint": "5f7f1c5b461a3be8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9493a6421afd5aa3", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/lib/animations.tsx:6"}, "properties": {"repobilityId": "5bb0aa7f8b0f95dc", "scanner": "scanner-primary", "fingerprint": "9493a6421afd5aa3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3416114f8a8ac0f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/BackupRestore.tsx:82"}, "properties": {"repobilityId": "4083326ff5776ee2", "scanner": "scanner-primary", "fingerprint": "3416114f8a8ac0f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a8eeb88ec1d8031", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AIChat.tsx:119"}, "properties": {"repobilityId": "661342fcd18cd2ea", "scanner": "scanner-primary", "fingerprint": "8a8eeb88ec1d8031", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e652170cc239cce9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/History.tsx:54"}, "properties": {"repobilityId": "511abe2a52465224", "scanner": "scanner-primary", "fingerprint": "e652170cc239cce9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d699591684176eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/pages/Onboarding.tsx:1289"}, "properties": {"repobilityId": "50728ed307613143", "scanner": "scanner-primary", "fingerprint": "8d699591684176eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac028831bb2105f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/DocumentVersions.tsx:54"}, "properties": {"repobilityId": "47398e716ea1cf29", "scanner": "scanner-primary", "fingerprint": "ac028831bb2105f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1700a5c4b888a7a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/AccountLedger.tsx:113"}, "properties": {"repobilityId": "c438dbe1d546dc18", "scanner": "scanner-primary", "fingerprint": "1700a5c4b888a7a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7bf3d4561f9e9ca4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/portal/PortalInvoices.tsx:28"}, "properties": {"repobilityId": "48a500a727e5fd9c", "scanner": "scanner-primary", "fingerprint": "7bf3d4561f9e9ca4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a7b074e4d850da29", "level": "note", "message": {"text": "Legacy-named symbol `visa_copy` in tests/unit/document-chasing.test.ts:62"}, "properties": {"repobilityId": "c83ccb1da9c97d56", "scanner": "scanner-primary", "fingerprint": "a7b074e4d850da29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6a8d637921e3cbe2", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/unit/onboarding-company-update.test.ts:7"}, "properties": {"repobilityId": "0c234eea34940c04", "scanner": "scanner-primary", "fingerprint": "6a8d637921e3cbe2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f87b0806d71bed47", "level": "note", "message": {"text": "Legacy-named symbol `visa_copy` in shared/schema.ts:4213"}, "properties": {"repobilityId": "e8c8e0b44e6ef7b3", "scanner": "scanner-primary", "fingerprint": "f87b0806d71bed47", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ea16c07876fff046", "level": "none", "message": {"text": "Commented-code block (7 lines) in shared/schema.ts:61"}, "properties": {"repobilityId": "7ce44ed42d236af5", "scanner": "scanner-primary", "fingerprint": "ea16c07876fff046", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbe57b3805b0b704", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/storage.ts:811"}, "properties": {"repobilityId": "6ccc58cf17373777", "scanner": "scanner-primary", "fingerprint": "cbe57b3805b0b704", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac84ed4ca1a38b20", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/db.ts:593"}, "properties": {"repobilityId": "2fd207ed45623b3a", "scanner": "scanner-primary", "fingerprint": "ac84ed4ca1a38b20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbe78cd6d904cb72", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/config/env.ts:96"}, "properties": {"repobilityId": "f9552027e4fa2ef3", "scanner": "scanner-primary", "fingerprint": "fbe78cd6d904cb72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e270504fe1ab876d", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/middleware/security.ts:142"}, "properties": {"repobilityId": "b334d5c46e8d9405", "scanner": "scanner-primary", "fingerprint": "e270504fe1ab876d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6369a8503ee0c3d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/middleware/featureGate.ts:155"}, "properties": {"repobilityId": "e0628aeae640da59", "scanner": "scanner-primary", "fingerprint": "6369a8503ee0c3d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa7eef08692f87f4", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/utils/date.ts:1"}, "properties": {"repobilityId": "704d5691ae032939", "scanner": "scanner-primary", "fingerprint": "fa7eef08692f87f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00c2af82ab6a4d0d", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/journal.routes.ts:500"}, "properties": {"repobilityId": "47e33aaa95ab27f8", "scanner": "scanner-primary", "fingerprint": "00c2af82ab6a4d0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-426f99fce963f613", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/ocr.routes.ts:61"}, "properties": {"repobilityId": "7562f55b9dafc363", "scanner": "scanner-primary", "fingerprint": "426f99fce963f613", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3e03b13c0335c2f", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in server/routes/analytics.routes.ts:638"}, "properties": {"repobilityId": "d9dc034931a1be32", "scanner": "scanner-primary", "fingerprint": "b3e03b13c0335c2f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-167d89d30be7baa8", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/payroll.routes.ts:21"}, "properties": {"repobilityId": "8f27715a1092f818", "scanner": "scanner-primary", "fingerprint": "167d89d30be7baa8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc6d6f8ece948138", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/firm.routes.ts:830"}, "properties": {"repobilityId": "2e766a40452e4bc9", "scanner": "scanner-primary", "fingerprint": "bc6d6f8ece948138", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-467e84f8d03bc7a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/auth.routes.ts:598"}, "properties": {"repobilityId": "e6d559d30da366ad", "scanner": "scanner-primary", "fingerprint": "467e84f8d03bc7a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06be6d2a37c6a499", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/vat.routes.ts:182"}, "properties": {"repobilityId": "50a1d4241b295733", "scanner": "scanner-primary", "fingerprint": "06be6d2a37c6a499", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d75d32a2f4cbfe42", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/routes/reports.routes.ts:73"}, "properties": {"repobilityId": "4087192dd83235e2", "scanner": "scanner-primary", "fingerprint": "d75d32a2f4cbfe42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e847abee6b42f12", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/routes/admin-health.routes.ts:29"}, "properties": {"repobilityId": "80d60d03a680864d", "scanner": "scanner-primary", "fingerprint": "4e847abee6b42f12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b24eee4ee7f93675", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/routes/invoices.routes.ts:1040"}, "properties": {"repobilityId": "3dc5742ca63e8871", "scanner": "scanner-primary", "fingerprint": "b24eee4ee7f93675", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70894b140c3d6d10", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/fixed-assets.routes.ts:218"}, "properties": {"repobilityId": "6282b9d118c28a41", "scanner": "scanner-primary", "fingerprint": "70894b140c3d6d10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8a09745fc113f17", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/bank-statements.routes.ts:607"}, "properties": {"repobilityId": "8926958352694190", "scanner": "scanner-primary", "fingerprint": "b8a09745fc113f17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3438c83107240df3", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/exchange-rates.routes.ts:238"}, "properties": {"repobilityId": "15363d09b163348a", "scanner": "scanner-primary", "fingerprint": "3438c83107240df3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e387a2637f0067e", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/receipts.routes.ts:481"}, "properties": {"repobilityId": "40321e84cd14aff7", "scanner": "scanner-primary", "fingerprint": "3e387a2637f0067e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab097adb752fb34e", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/routes/dashboard.routes.ts:112"}, "properties": {"repobilityId": "7a93dad8205808c7", "scanner": "scanner-primary", "fingerprint": "ab097adb752fb34e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39212b3e9c0dc435", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/ai.routes.ts:90"}, "properties": {"repobilityId": "a068676bb1bb8c80", "scanner": "scanner-primary", "fingerprint": "39212b3e9c0dc435", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f1599e38d109746", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/document-chasing.service.ts:3"}, "properties": {"repobilityId": "d58bdea8999d4fb6", "scanner": "scanner-primary", "fingerprint": "3f1599e38d109746", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0c3c31a32992799", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/receipt-classifier.service.ts:287"}, "properties": {"repobilityId": "e758696158cc7f4c", "scanner": "scanner-primary", "fingerprint": "b0c3c31a32992799", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6ab8e785aa35779", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/services/scheduler.service.ts:484"}, "properties": {"repobilityId": "75812a14aea0a668", "scanner": "scanner-primary", "fingerprint": "a6ab8e785aa35779", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec2e54be2c8f8aa2", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/services/invoice-state-machine.ts:3"}, "properties": {"repobilityId": "2ce24b73fe76043e", "scanner": "scanner-primary", "fingerprint": "ec2e54be2c8f8aa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-057eab325081e131", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/training-data.service.ts:31"}, "properties": {"repobilityId": "3969e4aa7530c9bb", "scanner": "scanner-primary", "fingerprint": "057eab325081e131", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-383b2a53be4baa07", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/einvoice-qr.service.ts:3"}, "properties": {"repobilityId": "939db1aa5f0c967b", "scanner": "scanner-primary", "fingerprint": "383b2a53be4baa07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-556478b9cab8b959", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/services/receipt-autopilot.service.ts:168"}, "properties": {"repobilityId": "4b46a910f6477c6f", "scanner": "scanner-primary", "fingerprint": "556478b9cab8b959", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-044c8a8ec9259908", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/services/cashflow-forecast.service.ts:77"}, "properties": {"repobilityId": "59b4c8e1134730b7", "scanner": "scanner-primary", "fingerprint": "044c8a8ec9259908", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a25ec59f3d82729", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/services/bill-posting.service.ts:7"}, "properties": {"repobilityId": "a89293c07cedfdf8", "scanner": "scanner-primary", "fingerprint": "2a25ec59f3d82729", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5faa2aa164d3515c", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/vat-autopilot.service.ts:744"}, "properties": {"repobilityId": "d151c087d44016bc", "scanner": "scanner-primary", "fingerprint": "5faa2aa164d3515c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37ba68e56a4b4c6a", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/services/anomaly-detection.service.ts:58"}, "properties": {"repobilityId": "77227d1c9dbeccf9", "scanner": "scanner-primary", "fingerprint": "37ba68e56a4b4c6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-277d7a6955a6e337", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/open-banking.service.ts:87"}, "properties": {"repobilityId": "655cbe4968afe00b", "scanner": "scanner-primary", "fingerprint": "277d7a6955a6e337", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3014f0f2daff1c2e", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/services/auto-reconcile.service.ts:308"}, "properties": {"repobilityId": "5a58bba4e51eb66a", "scanner": "scanner-primary", "fingerprint": "3014f0f2daff1c2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d223bfdf539b12d", "level": "note", "message": {"text": "42 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5bbbd2b50dcb630d", "scanner": "scanner-primary", "fingerprint": "4d223bfdf539b12d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-5766dc24db809018", "level": "warning", "message": {"text": "Frontend route `/auth/callback` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d4afad919f54f362", "scanner": "scanner-primary", "fingerprint": "5766dc24db809018", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-270bca32d3c6d67a", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "24fd4c93be04a967", "scanner": "scanner-primary", "fingerprint": "270bca32d3c6d67a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a85439fa286695ba", "level": "warning", "message": {"text": "Frontend route `/services` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "f5cf393c55952564", "scanner": "scanner-primary", "fingerprint": "a85439fa286695ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7e64a40aac081022", "level": "warning", "message": {"text": "Frontend route `/view/invoice/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "458fb547a9aae05c", "scanner": "scanner-primary", "fingerprint": "7e64a40aac081022", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bdb01bd71b8a19ca", "level": "warning", "message": {"text": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c7bf2c688d6ba77d", "scanner": "scanner-primary", "fingerprint": "bdb01bd71b8a19ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7ca9b70b0240bc57", "level": "warning", "message": {"text": "Frontend route `/settings/company` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "2dbcf0716b8209a4", "scanner": "scanner-primary", "fingerprint": "7ca9b70b0240bc57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ff78bdbf0a5e87bf", "level": "warning", "message": {"text": "Frontend route `/accounts/:id/ledger` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "709fe58a1b88a9dd", "scanner": "scanner-primary", "fingerprint": "ff78bdbf0a5e87bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c158c8b221de2a5e", "level": "warning", "message": {"text": "Frontend route `/recurring-invoices` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7febad5a783d3688", "scanner": "scanner-primary", "fingerprint": "c158c8b221de2a5e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-60712ba764ad0e93", "level": "warning", "message": {"text": "Frontend route `/payment-chasing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "bd07d25a49e0e8c5", "scanner": "scanner-primary", "fingerprint": "60712ba764ad0e93", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1b1b340a5866e8d8", "level": "warning", "message": {"text": "Frontend route `/journal/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "96eee3364647d7c9", "scanner": "scanner-primary", "fingerprint": "1b1b340a5866e8d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c886c3074748dfaf", "level": "warning", "message": {"text": "Frontend route `/receipt-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "6f4c75405de4f92f", "scanner": "scanner-primary", "fingerprint": "c886c3074748dfaf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-74b4472aa0bdb027", "level": "warning", "message": {"text": "Frontend route `/quotes` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "6673cafff5df1994", "scanner": "scanner-primary", "fingerprint": "74b4472aa0bdb027", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d7070e2a61035d43", "level": "warning", "message": {"text": "Frontend route `/credit-notes` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "a6ba43f940c01839", "scanner": "scanner-primary", "fingerprint": "d7070e2a61035d43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-546385c79c118939", "level": "warning", "message": {"text": "Frontend route `/purchase-orders` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "108358bb404a6df4", "scanner": "scanner-primary", "fingerprint": "546385c79c118939", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-43fd4f6e28047272", "level": "warning", "message": {"text": "Frontend route `/cost-centers` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ea193503bd2fb44a", "scanner": "scanner-primary", "fingerprint": "43fd4f6e28047272", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dc8099064820c429", "level": "warning", "message": {"text": "Frontend route `/financial-statements` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "4c9e741150d60c35", "scanner": "scanner-primary", "fingerprint": "dc8099064820c429", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b3623a1618a7b7c7", "level": "warning", "message": {"text": "Frontend route `/reconciliation-rules` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d8f50815d45e2e2c", "scanner": "scanner-primary", "fingerprint": "b3623a1618a7b7c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2b81404102b38f90", "level": "warning", "message": {"text": "Frontend route `/invoice-templates` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "4302b04ddca81daa", "scanner": "scanner-primary", "fingerprint": "2b81404102b38f90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fcde8df70de720b8", "level": "warning", "message": {"text": "Frontend route `/document-versions` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "296b609b2158a2ed", "scanner": "scanner-primary", "fingerprint": "fcde8df70de720b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d9adec6166ae5d5c", "level": "warning", "message": {"text": "Frontend route `/developer-settings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8c175ae6acd1369c", "scanner": "scanner-primary", "fingerprint": "d9adec6166ae5d5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c1ada3f044362f1a", "level": "warning", "message": {"text": "Frontend route `/notification-preferences` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "a8117cd2a21cbe44", "scanner": "scanner-primary", "fingerprint": "c1ada3f044362f1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6b008b258421ddd5", "level": "warning", "message": {"text": "Frontend route `/subscription` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "9ca4aa79ac1d4621", "scanner": "scanner-primary", "fingerprint": "6b008b258421ddd5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d85442bc92900df0", "level": "warning", "message": {"text": "Frontend route `/exchange-rates` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "3a6f6e72c515455f", "scanner": "scanner-primary", "fingerprint": "d85442bc92900df0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-984559b79b7e1af1", "level": "warning", "message": {"text": "Frontend route `/fixed-assets` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "2a14f9172915452a", "scanner": "scanner-primary", "fingerprint": "984559b79b7e1af1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-21b7008edaa295ac", "level": "warning", "message": {"text": "Frontend route `/budgets` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "b35c6674bca72669", "scanner": "scanner-primary", "fingerprint": "21b7008edaa295ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8ee48c6b0c03f497", "level": "warning", "message": {"text": "Frontend route `/expense-claims` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "4e59dd7fcb5d5bb4", "scanner": "scanner-primary", "fingerprint": "8ee48c6b0c03f497", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-837749562f3287f2", "level": "warning", "message": {"text": "Frontend route `/cashflow-forecast` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ef30b0edd2d848e7", "scanner": "scanner-primary", "fingerprint": "837749562f3287f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-11ffb596d057b47b", "level": "warning", "message": {"text": "Frontend route `/anomaly-detection` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ccbfee886474dda6", "scanner": "scanner-primary", "fingerprint": "11ffb596d057b47b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5815cd19d087761d", "level": "warning", "message": {"text": "Frontend route `/auto-reconcile` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "622406dac0a80ec3", "scanner": "scanner-primary", "fingerprint": "5815cd19d087761d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ff69a641e6fb10b8", "level": "warning", "message": {"text": "Frontend route `/ai-inbox` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8b5cd06cfd2d4611", "scanner": "scanner-primary", "fingerprint": "ff69a641e6fb10b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-573ce811e0b67e58", "level": "warning", "message": {"text": "Frontend route `/month-end` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8234c1fc61416027", "scanner": "scanner-primary", "fingerprint": "573ce811e0b67e58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9d7427c35c2c901f", "level": "warning", "message": {"text": "Frontend route `/ai-features` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "a1198fd5f51fba35", "scanner": "scanner-primary", "fingerprint": "9d7427c35c2c901f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-81ffa061fe57eff7", "level": "warning", "message": {"text": "Frontend route `/smart-assistant` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c23d2a06b0e08c3b", "scanner": "scanner-primary", "fingerprint": "81ffa061fe57eff7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-06864500daa2e11b", "level": "warning", "message": {"text": "Frontend route `/advanced-analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8ea6e629928523cd", "scanner": "scanner-primary", "fingerprint": "06864500daa2e11b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-880cca4d358f6246", "level": "warning", "message": {"text": "Frontend route `/integrations` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "65c22f561b3ac887", "scanner": "scanner-primary", "fingerprint": "880cca4d358f6246", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c5a18da0a96d45a6", "level": "warning", "message": {"text": "Frontend route `/whatsapp` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8bcc2a472f727b0b", "scanner": "scanner-primary", "fingerprint": "c5a18da0a96d45a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4cf3d8a1a57189d", "level": "warning", "message": {"text": "Frontend route `/document-chasing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "23fe35b6817baf11", "scanner": "scanner-primary", "fingerprint": "f4cf3d8a1a57189d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a373663a640915bb", "level": "warning", "message": {"text": "Frontend route `/referrals` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "70809760d7f50def", "scanner": "scanner-primary", "fingerprint": "a373663a640915bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f11a119ccbbb98da", "level": "warning", "message": {"text": "Frontend route `/feedback` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "13837c348a2929f0", "scanner": "scanner-primary", "fingerprint": "f11a119ccbbb98da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7d2d565659fb154a", "level": "warning", "message": {"text": "Frontend route `/analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "cc9f3ce0b0de89e8", "scanner": "scanner-primary", "fingerprint": "7d2d565659fb154a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6eed814f8ea0d019", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "45eb956619820d6f", "scanner": "scanner-primary", "fingerprint": "6eed814f8ea0d019", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0946f1ac31e6d9c3", "level": "warning", "message": {"text": "Frontend route `/vat-autopilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "83afe3512389a9e2", "scanner": "scanner-primary", "fingerprint": "0946f1ac31e6d9c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6989d5b2b3639b8d", "level": "warning", "message": {"text": "Frontend route `/history` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "1c1ec80c400b1ed0", "scanner": "scanner-primary", "fingerprint": "6989d5b2b3639b8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3bc19f695e28eb26", "level": "warning", "message": {"text": "Frontend route `/advanced-reports` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "5c9f1aea7b1a4654", "scanner": "scanner-primary", "fingerprint": "3bc19f695e28eb26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-85072a2881741fb3", "level": "warning", "message": {"text": "Frontend route `/task-center` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "e25376f58f4adfee", "scanner": "scanner-primary", "fingerprint": "85072a2881741fb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c4c4e46ae6411dcc", "level": "warning", "message": {"text": "Frontend route `/news-feed` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "5aa705f27d169856", "scanner": "scanner-primary", "fingerprint": "c4c4e46ae6411dcc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-94e18f2dd40ff89f", "level": "warning", "message": {"text": "Frontend route `/admin/dashboard` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7c7db514a6fe8163", "scanner": "scanner-primary", "fingerprint": "94e18f2dd40ff89f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1f33d002a81bd104", "level": "warning", "message": {"text": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "dc35cbcae96fb5d4", "scanner": "scanner-primary", "fingerprint": "1f33d002a81bd104", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aecf0e9700cfa634", "level": "warning", "message": {"text": "Frontend route `/admin/clients/:id/documents` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "4792f0d738f9824a", "scanner": "scanner-primary", "fingerprint": "aecf0e9700cfa634", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c742f58a026705b2", "level": "warning", "message": {"text": "Frontend route `/admin/clients/:id/tasks` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "8e44479e058d7718", "scanner": "scanner-primary", "fingerprint": "c742f58a026705b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4e747c61ad650661", "level": "warning", "message": {"text": "Frontend route `/admin/documents` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "a8965624ca17b903", "scanner": "scanner-primary", "fingerprint": "4e747c61ad650661", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5648ff425ab4ba73", "level": "warning", "message": {"text": "Frontend route `/firm/command-center` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c7ece773155c1dfc", "scanner": "scanner-primary", "fingerprint": "5648ff425ab4ba73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b10d945aee1bf25b", "level": "warning", "message": {"text": "Frontend route `/firm/health` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ddcd99a91dd15249", "scanner": "scanner-primary", "fingerprint": "b10d945aee1bf25b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7831b587cea6513e", "level": "warning", "message": {"text": "Frontend route `/firm/clients/:companyId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "2d17c6031b9c9afe", "scanner": "scanner-primary", "fingerprint": "7831b587cea6513e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef3b2b5b48d44bb5", "level": "warning", "message": {"text": "Frontend route `/firm/bulk` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c1810afe62473b95", "scanner": "scanner-primary", "fingerprint": "ef3b2b5b48d44bb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27fb2888b964cfee", "level": "warning", "message": {"text": "Frontend route `/firm/analytics` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "60da41f0283d69ea", "scanner": "scanner-primary", "fingerprint": "27fb2888b964cfee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2dc04cb7986481a7", "level": "warning", "message": {"text": "Frontend route `/firm/pipeline` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ef7a8ac9eaa45f91", "scanner": "scanner-primary", "fingerprint": "2dc04cb7986481a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-25ff4e0bef1e2ffe", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/whatsapp-routes.test.ts:39)"}, "properties": {"repobilityId": "54ce37091a6c2a7b", "scanner": "scanner-primary", "fingerprint": "25ff4e0bef1e2ffe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ca9f44e4f25e041", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/anomaly-routes.test.ts:45)"}, "properties": {"repobilityId": "f8185c3585519af6", "scanner": "scanner-primary", "fingerprint": "8ca9f44e4f25e041", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b510a5538e47172f", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}/api/firm/probe (tests/unit/nra-access.test.ts:45)"}, "properties": {"repobilityId": "842cb44bc6eadc17", "scanner": "scanner-primary", "fingerprint": "b510a5538e47172f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e033310c31f8e410", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/billing-enforcement.test.ts:39)"}, "properties": {"repobilityId": "2f7ef9b5607d8043", "scanner": "scanner-primary", "fingerprint": "e033310c31f8e410", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c6e49994c143be3", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${addr.port}${path} (tests/unit/trust-blockers.test.ts:110)"}, "properties": {"repobilityId": "3a86944f73af9e11", "scanner": "scanner-primary", "fingerprint": "1c6e49994c143be3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7612c93d4ca5903", "level": "note", "message": {"text": "Unused endpoint: GET /api/csrf-token"}, "properties": {"repobilityId": "a144385ef3996c55", "scanner": "scanner-primary", "fingerprint": "b7612c93d4ca5903", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c2507f3182299a0", "level": "note", "message": {"text": "Unused endpoint: GET /api/version"}, "properties": {"repobilityId": "dbc6a9506e886f0b", "scanner": "scanner-primary", "fingerprint": "6c2507f3182299a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8073f7bf758f6d0", "level": "note", "message": {"text": "Unused endpoint: USE /api/*"}, "properties": {"repobilityId": "95893b7ef2242fa7", "scanner": "scanner-primary", "fingerprint": "b8073f7bf758f6d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b59435b3211a9df", "level": "note", "message": {"text": "Unused endpoint: USE /assets"}, "properties": {"repobilityId": "4a34a6e091cd372b", "scanner": "scanner-primary", "fingerprint": "3b59435b3211a9df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ab925dd0a91800d", "level": "note", "message": {"text": "Unused endpoint: USE /api/csp-report"}, "properties": {"repobilityId": "edc9dcbfbd5558f5", "scanner": "scanner-primary", "fingerprint": "9ab925dd0a91800d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1992692ae67a02be", "level": "note", "message": {"text": "Unused endpoint: POST /api/csp-report"}, "properties": {"repobilityId": "a5dc0849939fe2ba", "scanner": "scanner-primary", "fingerprint": "1992692ae67a02be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a450449479df85d4", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/oauth/"}, "properties": {"repobilityId": "b660efbf06f8ff3c", "scanner": "scanner-primary", "fingerprint": "a450449479df85d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a91f57add99eaa28", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/"}, "properties": {"repobilityId": "e30a79c7021d28e7", "scanner": "scanner-primary", "fingerprint": "a91f57add99eaa28", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b1557090369fcc5", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai/"}, "properties": {"repobilityId": "18a322c1ab0c651b", "scanner": "scanner-primary", "fingerprint": "8b1557090369fcc5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d25f7ab500a5e97", "level": "note", "message": {"text": "Unused endpoint: USE /api/ocr/"}, "properties": {"repobilityId": "c242822b3909332c", "scanner": "scanner-primary", "fingerprint": "6d25f7ab500a5e97", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a61f123d87202266", "level": "note", "message": {"text": "Unused endpoint: USE /api/firm/bulk/ocr"}, "properties": {"repobilityId": "8131f34d4f0ef201", "scanner": "scanner-primary", "fingerprint": "a61f123d87202266", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76889df7c8e240c5", "level": "note", "message": {"text": "Unused endpoint: USE /api/"}, "properties": {"repobilityId": "2da5246301aab1d5", "scanner": "scanner-primary", "fingerprint": "76889df7c8e240c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a1e8967a87dfcaf", "level": "note", "message": {"text": "Unused endpoint: GET /route"}, "properties": {"repobilityId": "4e6d1fce82d39bc2", "scanner": "scanner-primary", "fingerprint": "6a1e8967a87dfcaf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fd34b69f2580619", "level": "note", "message": {"text": "Unused endpoint: POST /x"}, "properties": {"repobilityId": "9c7f0b6e1637554e", "scanner": "scanner-primary", "fingerprint": "1fd34b69f2580619", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82f6c63ca6dd76a5", "level": "note", "message": {"text": "Unused endpoint: GET /api/companies/:companyId/journal"}, "properties": {"repobilityId": "9e0cb39c2a6606cb", "scanner": "scanner-primary", "fingerprint": "82f6c63ca6dd76a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-178a81c78e076cd6", "level": "note", "message": {"text": "Unused endpoint: POST /api/companies/:companyId/journal"}, "properties": {"repobilityId": "57d67b253028a46c", "scanner": "scanner-primary", "fingerprint": "178a81c78e076cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bfe3e806d5d5da33", "level": "note", "message": {"text": "Unused endpoint: GET /api/journal/:id"}, "properties": {"repobilityId": "51f77fed7a094ad8", "scanner": "scanner-primary", "fingerprint": "bfe3e806d5d5da33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b98b3c722cc172fe", "level": "note", "message": {"text": "Unused endpoint: PUT /api/journal/:id"}, "properties": {"repobilityId": "578eb40228661990", "scanner": "scanner-primary", "fingerprint": "b98b3c722cc172fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94eca48c242cedcd", "level": "note", "message": {"text": "Unused endpoint: POST /api/journal/:id/post"}, "properties": {"repobilityId": "448d5a812b8afac3", "scanner": "scanner-primary", "fingerprint": "94eca48c242cedcd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a7efbd66f9c3e28", "level": "note", "message": {"text": "Unused endpoint: POST /api/journal/:id/reverse"}, "properties": {"repobilityId": "0c1d07fd4e6bbd6b", "scanner": "scanner-primary", "fingerprint": "5a7efbd66f9c3e28", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e75590d021b65825", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/journal/:id"}, "properties": {"repobilityId": "6430efaec3f51f1a", "scanner": "scanner-primary", "fingerprint": "e75590d021b65825", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f5aeb81c137d9f1", "level": "note", "message": {"text": "Unused endpoint: GET /api/companies/:companyId/reconciliation-rules"}, "properties": {"repobilityId": "9cc440a2a7e68be5", "scanner": "scanner-primary", "fingerprint": "4f5aeb81c137d9f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-420505f2071e42a7", "level": "note", "message": {"text": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules"}, "properties": {"repobilityId": "fbd497a392f1ccab", "scanner": "scanner-primary", "fingerprint": "420505f2071e42a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-804bd92691fb27eb", "level": "note", "message": {"text": "Unused endpoint: PUT /api/reconciliation-rules/:id"}, "properties": {"repobilityId": "253472e39646cec0", "scanner": "scanner-primary", "fingerprint": "804bd92691fb27eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92454a70f8c437dd", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/reconciliation-rules/:id"}, "properties": {"repobilityId": "d41d6ed0e56ba3f2", "scanner": "scanner-primary", "fingerprint": "92454a70f8c437dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cef54e8de55f2e5", "level": "note", "message": {"text": "Unused endpoint: POST /api/companies/:companyId/reconciliation-rules/auto-match"}, "properties": {"repobilityId": "b1ad264cce76fe44", "scanner": "scanner-primary", "fingerprint": "9cef54e8de55f2e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e7a28dcd18c78f4", "level": "note", "message": {"text": "Unused endpoint: POST /api/ocr/process"}, "properties": {"repobilityId": "a746d3eac267544b", "scanner": "scanner-primary", "fingerprint": "0e7a28dcd18c78f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf53f434a219cda7", "level": "note", "message": {"text": "Unused endpoint: POST /api/ocr/export-excel"}, "properties": {"repobilityId": "5775236fd77c6e65", "scanner": "scanner-primary", "fingerprint": "bf53f434a219cda7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1b4ba4ded56ae70", "level": "note", "message": {"text": "Unused endpoint: POST /api/export/excel"}, "properties": {"repobilityId": "9d3a6828d54ad3ba", "scanner": "scanner-primary", "fingerprint": "f1b4ba4ded56ae70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a67ead4a0e0ec8c", "level": "note", "message": {"text": "Unused endpoint: GET /api/companies/:companyId/invoice-templates"}, "properties": {"repobilityId": "dfa349ee3c79e52c", "scanner": "scanner-primary", "fingerprint": "6a67ead4a0e0ec8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6952c9140b3ae315", "level": "note", "message": {"text": "Unused endpoint: GET /api/invoice-templates/:id"}, "properties": {"repobilityId": "0b9cba2bff3330b6", "scanner": "scanner-primary", "fingerprint": "6952c9140b3ae315", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36580cafec5676a1", "level": "note", "message": {"text": "Unused endpoint: POST /api/companies/:companyId/invoice-templates"}, "properties": {"repobilityId": "335a316508ed44c1", "scanner": "scanner-primary", "fingerprint": "36580cafec5676a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0785b96a0b8f150f", "level": "note", "message": {"text": "Unused endpoint: PUT /api/invoice-templates/:id"}, "properties": {"repobilityId": "2c93e67765a5a41d", "scanner": "scanner-primary", "fingerprint": "0785b96a0b8f150f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35d8d1f17d321e94", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/invoice-templates/:id"}, "properties": {"repobilityId": "c326631101f3b014", "scanner": "scanner-primary", "fingerprint": "35d8d1f17d321e94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-392ffb9b1ea3e48c", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoice-templates/:id/set-default"}, "properties": {"repobilityId": "9562068082e28043", "scanner": "scanner-primary", "fingerprint": "392ffb9b1ea3e48c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2751e94c7f35fc9c", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/forecasts"}, "properties": {"repobilityId": "3340390a89eeba1e", "scanner": "scanner-primary", "fingerprint": "2751e94c7f35fc9c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc17f2e222cd0248", "level": "note", "message": {"text": "Unused endpoint: POST /api/analytics/generate-forecast"}, "properties": {"repobilityId": "cb9db2ef86f7d922", "scanner": "scanner-primary", "fingerprint": "bc17f2e222cd0248", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b64ad42fc702e446", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/budget-vs-actual"}, "properties": {"repobilityId": "9ae435010df5d228", "scanner": "scanner-primary", "fingerprint": "b64ad42fc702e446", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0903e746358bd943", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/kpis"}, "properties": {"repobilityId": "e082b33471c2d317", "scanner": "scanner-primary", "fingerprint": "0903e746358bd943", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-431050b31c01dfed", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/insights"}, "properties": {"repobilityId": "0a61f1a0ef9bf231", "scanner": "scanner-primary", "fingerprint": "431050b31c01dfed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e17d6dff006303ff", "level": "note", "message": {"text": "Unused endpoint: GET /api/integrations/ecommerce"}, "properties": {"repobilityId": "7cae0d4e7d111c12", "scanner": "scanner-primary", "fingerprint": "e17d6dff006303ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21b63375a196b1c7", "level": "note", "message": {"text": "Unused endpoint: GET /api/integrations/ecommerce/transactions"}, "properties": {"repobilityId": "1b8f0a0396b486be", "scanner": "scanner-primary", "fingerprint": "21b63375a196b1c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f15c0c90004e413", "level": "note", "message": {"text": "Unused endpoint: POST /api/integrations/ecommerce/connect"}, "properties": {"repobilityId": "ec4a2c4812f289ed", "scanner": "scanner-primary", "fingerprint": "4f15c0c90004e413", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6efe257b0a423025", "level": "note", "message": {"text": "Unused endpoint: POST /api/integrations/ecommerce/:integrationId/sync"}, "properties": {"repobilityId": "1b6de9478a26669e", "scanner": "scanner-primary", "fingerprint": "6efe257b0a423025", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96166e2b44b97fab", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/integrations/ecommerce/:integrationId/toggle"}, "properties": {"repobilityId": "06d180e1c997a062", "scanner": "scanner-primary", "fingerprint": "96166e2b44b97fab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99a7751cc7341d02", "level": "note", "message": {"text": "Unused endpoint: POST /api/analytics/event"}, "properties": {"repobilityId": "27159f9dc9b0e121", "scanner": "scanner-primary", "fingerprint": "99a7751cc7341d02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb221d92566ae25d", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/dashboard"}, "properties": {"repobilityId": "8b09924400a9486c", "scanner": "scanner-primary", "fingerprint": "cb221d92566ae25d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef7e7545f9da4901", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/feature-usage"}, "properties": {"repobilityId": "c6be5840a79264d2", "scanner": "scanner-primary", "fingerprint": "ef7e7545f9da4901", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d37bd9a00025fb0", "level": "note", "message": {"text": "Unused endpoint: GET /api/companies/:companyId/analytics/cash-forecast"}, "properties": {"repobilityId": "f08c00f2f98af38d", "scanner": "scanner-primary", "fingerprint": "7d37bd9a00025fb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8ffecd0c257f680", "level": "note", "message": {"text": "Unused endpoint: GET /api/companies/:companyId/analytics/profit-trend"}, "properties": {"repobilityId": "4b184e06b20d40f3", "scanner": "scanner-primary", "fingerprint": "c8ffecd0c257f680", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}