{"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-65933db3a17d8b50", "name": "Possibly dead Python function: dump_obj", "shortDescription": {"text": "Possibly dead Python function: dump_obj"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ac7a1c6047cd04b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationButton.tsx:409", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationButton.tsx:409"}, "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-a69128820f6e6f49", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppSidebar.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppSidebar.tsx:394"}, "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-67bfbc73c90af109", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppShell.tsx:448", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppShell.tsx:448"}, "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-70b9716758dbd63c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ThemeSwitcher.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ThemeSwitcher.tsx:92"}, "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-0641bd366f739a67", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LanguageToggle.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LanguageToggle.tsx:47"}, "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-de05ae590c23bc7a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProfileMenu.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProfileMenu.tsx:125"}, "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-59c77729d76fd663", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostKpiTiles.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostKpiTiles.tsx:240"}, "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-5af9cbee01929359", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostDetailPanel.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostDetailPanel.tsx:148"}, "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-0650fd79dc1893b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostTable.tsx:616", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostTable.tsx:616"}, "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-7c6989f0b9709ebb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectCard.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectCard.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-36d35686b70ee45b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectQuickAsk.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectQuickAsk.tsx:106"}, "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-0a48e75d45cd7fc6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95"}, "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-646dc1eff346d9c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/refresh-toast.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/refresh-toast.tsx:128"}, "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-a31e03c7e65ac8ca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/multi-select-combobox.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/multi-select-combobox.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00464e259b552e6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDetailDrawer.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDetailDrawer.tsx:207"}, "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-30df5057c6f9819c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/EventsPanel.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/EventsPanel.tsx:295"}, "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-f0f1fdcea3440241", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardPanel.tsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardPanel.tsx:428"}, "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-a5a39f767d4ef200", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardSegmentsPanel.tsx:364", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardSegmentsPanel.tsx:364"}, "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-03b8c9d826b153ed", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDrawerToolbar.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDrawerToolbar.tsx:151"}, "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-a0d1f6a410a48b16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/BentoTile.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/BentoTile.tsx:123"}, "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-b54359f914258f5d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedPLTile.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedPLTile.tsx:211"}, "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-a1baf90e32a65bdc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedQuantityTile.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedQuantityTile.tsx:207"}, "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-69d1a70a0905deb8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CounterpartyMixTile.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CounterpartyMixTile.tsx:73"}, "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-ea3eadc7ddae4de4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedExpenseTile.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedExpenseTile.tsx:234"}, "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-806a88b8a6f76980", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CorridorConcentrationTile.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CorridorConcentrationTile.tsx:113"}, "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-5ceaa737765189ac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/PeriodPerformanceTile.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/PeriodPerformanceTile.tsx:253"}, "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-e5f6c309685c620e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/ActivePipelineTile.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/ActivePipelineTile.tsx:189"}, "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-58a3d2cf5d6728d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatSuggestions.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatSuggestions.tsx:45"}, "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-f5118188b4e315f1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/evilcharts/ui/chart.tsx:205", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/evilcharts/ui/chart.tsx:205"}, "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-3d7df72249bb7a03", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommodityCard.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommodityCard.tsx:30"}, "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-b5462e0559bc2df6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ExpenseComparisonSheet.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ExpenseComparisonSheet.tsx:273"}, "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-541c874e65851034", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/RouteTimeline.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/RouteTimeline.tsx:43"}, "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-223151a3382f69d7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectInfoCard.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectInfoCard.tsx:143"}, "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-4a812d36724bd2c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectOverviewCard.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectOverviewCard.tsx:110"}, "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-e09dea2df9475b5d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommoditySalesCard.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommoditySalesCard.tsx:160"}, "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-0902f7d5bd3d2682", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/HeroImage.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/HeroImage.tsx:63"}, "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-6a80714c3af21bd8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/BudgetSalesCard.tsx:856", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/BudgetSalesCard.tsx:856"}, "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-10c9ad91adf24eba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/EstimatedExpenseCard.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/EstimatedExpenseCard.tsx:60"}, "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-6ff38997e5a2862b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-management/EntityInspector.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-management/EntityInspector.tsx:107"}, "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-f4a8dd96f8b507aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightKpiTiles.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightKpiTiles.tsx:211"}, "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-d46ce3194cb570bc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightDetailPanel.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightDetailPanel.tsx:89"}, "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-5add1c890feeab60", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightTable.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightTable.tsx:243"}, "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-b903c245f8fa685c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/VoyageStatusDonutCard.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/VoyageStatusDonutCard.tsx:222"}, "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-84b3d1df6486cdd1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewKpis.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewKpis.tsx:127"}, "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-712ef97b1209b753", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewInsights.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewInsights.tsx:48"}, "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-3603b007f1eae4a1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/LongestWaitingCard.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/LongestWaitingCard.tsx:125"}, "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-d74ea6febb809e33", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/DetailContextMenu.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/DetailContextMenu.tsx:73"}, "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-c1e4d6e759203860", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/PendingPaymentsCard.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/PendingPaymentsCard.tsx:100"}, "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-8d8b133298951d3e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/GroupSegmentColumns.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/GroupSegmentColumns.tsx:89"}, "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-a462af6d553d56ad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMapPlaceholder.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMapPlaceholder.tsx:101"}, "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-bb5d1c12d04174e9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMap.tsx:1341", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMap.tsx:1341"}, "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-70a6bc0bf0897a85", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/command/CommandPalette.tsx:431", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/command/CommandPalette.tsx:431"}, "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-a8a6311544c117db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewPage.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewPage.tsx:326"}, "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-ae2b26546c185980", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DataManagementPage.tsx:1463", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DataManagementPage.tsx:1463"}, "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-644f0e65ff13d471", "name": "Stray `console.log` in TS/JS \u2014 src/pages/DataManagementPage.tsx:309", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/DataManagementPage.tsx:309"}, "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-3065ad747273453b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:538", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:538"}, "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-b6fdceabbaa4cb75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:649", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:649"}, "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-5a2b7d89ba45e13e", "name": "Insecure pattern 'direct_innerhtml_assignment' in architecture.html:1918", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in architecture.html:1918"}, "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-be34ae5e80b36cfb", "name": "Insecure pattern 'cors_wildcard' in cloudflare-worker/worker.js:2", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in cloudflare-worker/worker.js:2"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f36756e4816e3f59", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95"}, "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-b03be0ecc24377ce", "name": "Insecure pattern 'local_storage_auth_token' in src/components/chat/ProjectWebChat.tsx:174", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/chat/ProjectWebChat.tsx:174"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50bb182ea4ff1098", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/evilcharts/ui/chart.tsx:205", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/evilcharts/ui/chart.tsx:205"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/configure-pages@v5 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-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-082d475997f5f29f", "name": "Very large file: src/components/map/RouteMap.tsx (1939 lines)", "shortDescription": {"text": "Very large file: src/components/map/RouteMap.tsx (1939 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-b8396cf65be57c17", "name": "Very large file: src/lib/i18n/translations.ts (2382 lines)", "shortDescription": {"text": "Very large file: src/lib/i18n/translations.ts (2382 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-4eb8b5979615b557", "name": "Very large file: src/pages/DataManagementPage.tsx (1651 lines)", "shortDescription": {"text": "Very large file: src/pages/DataManagementPage.tsx (1651 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 206 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 195 placeholder/mock markers across 51 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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, tests, operator-readme. 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-791cf697ed2a6d80", "name": "Commented-code block (6 lines) in vite.config.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in vite.config.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5c36af052e8d206", "name": "Commented-code block (5 lines) in cloudflare-worker/worker.js:28", "shortDescription": {"text": "Commented-code block (5 lines) in cloudflare-worker/worker.js:28"}, "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-38c57a1eecfaf4fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:15"}, "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-5985cf242ef13574", "name": "Commented-code block (5 lines) in src/main.tsx:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/main.tsx:48"}, "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-6874131603dc48a7", "name": "Commented-code block (5 lines) in src/components/layout/NotificationButton.tsx:181", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/NotificationButton.tsx:181"}, "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-20ed3d7d0a0cd680", "name": "Commented-code block (8 lines) in src/components/layout/AppSidebar.tsx:152", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/layout/AppSidebar.tsx:152"}, "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-6e132102b6de8eea", "name": "Commented-code block (5 lines) in src/components/layout/TyroWmsButton.tsx:39", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/TyroWmsButton.tsx:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e76b544728f65995", "name": "Commented-code block (5 lines) in src/components/layout/ProfileMenu.tsx:110", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/ProfileMenu.tsx:110"}, "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-98788ff7b714ee2e", "name": "Commented-code block (5 lines) in src/components/pl-cost/PLCostProgress.tsx:93", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/pl-cost/PLCostProgress.tsx:93"}, "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-849ff85655b16bd2", "name": "Commented-code block (5 lines) in src/components/projects/ProjectCard.tsx:93", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/ProjectCard.tsx:93"}, "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-776e8b990c1a6aae", "name": "Commented-code block (5 lines) in src/components/projects/ProjectList.tsx:178", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/ProjectList.tsx:178"}, "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-cc5697fd3cd8f1ba", "name": "Commented-code block (6 lines) in src/components/ui/multi-select-combobox.tsx:146", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ui/multi-select-combobox.tsx:146"}, "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-50d25bb93b8ce3f4", "name": "Commented-code block (5 lines) in src/components/dashboard/BentoGrid.tsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/BentoGrid.tsx:16"}, "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-3779a040e83e41f8", "name": "Commented-code block (5 lines) in src/components/dashboard/BentoTile.tsx:118", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/BentoTile.tsx:118"}, "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-10a080b1cb2496cd", "name": "Commented-code block (5 lines) in src/components/dashboard/tiles/EstimatedPLTile.tsx:351", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/tiles/EstimatedPLTile.tsx:351"}, "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-8c704a3e75b87921", "name": "Commented-code block (5 lines) in src/components/chat/ProjectWebChat.tsx:116", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/chat/ProjectWebChat.tsx:116"}, "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-25e24ebb2dabb7d6", "name": "Commented-code block (8 lines) in src/components/chat/TyroAiDrawer.tsx:142", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/chat/TyroAiDrawer.tsx: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-b460a9b48946aac6", "name": "Commented-code block (5 lines) in src/components/details/ProjectOverviewCard.tsx:58", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/details/ProjectOverviewCard.tsx: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-1f04c6eb19faf717", "name": "Commented-code block (6 lines) in src/components/details/CommoditySalesCard.tsx:44", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/details/CommoditySalesCard.tsx:44"}, "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-e44d095777bb8934", "name": "Commented-code block (7 lines) in src/components/details/ExpectedRealizedExpenseCard.tsx:75", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/details/ExpectedRealizedExpenseCard.tsx:75"}, "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-17cc76456ee0342a", "name": "Commented-code block (5 lines) in src/components/details/BudgetSalesCard.tsx:195", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/details/BudgetSalesCard.tsx:195"}, "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-7f17f62ee2e43b0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/details/BudgetSalesCard.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/details/BudgetSalesCard.tsx:83"}, "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-df29ebf43988a632", "name": "Commented-code block (5 lines) in src/components/data-management/EntityRowsTable.tsx:74", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/data-management/EntityRowsTable.tsx:74"}, "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-bca29b4c2ce1dc06", "name": "Commented-code block (5 lines) in src/components/map/RouteMap.tsx:222", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/map/RouteMap.tsx:222"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20e8e5a1413d381d", "name": "Commented-code block (7 lines) in src/components/filters/AdvancedFilter.tsx:222", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/filters/AdvancedFilter.tsx:222"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c99e32328f5ab785", "name": "Commented-code block (5 lines) in src/lib/routing/portCoordinates.ts:1194", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/routing/portCoordinates.ts:1194"}, "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-b5820399fba26310", "name": "Commented-code block (5 lines) in src/lib/routing/heroImages.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/routing/heroImages.ts:76"}, "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-1edd72fd212efce0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/entityConfig.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/entityConfig.ts:22"}, "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-8d3b46c555c64ef8", "name": "Commented-code block (5 lines) in src/lib/dataverse/columnOrder.ts:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/dataverse/columnOrder.ts:40"}, "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-5bd167f705cacd74", "name": "Commented-code block (5 lines) in src/lib/dataverse/realClient.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/dataverse/realClient.ts:34"}, "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-0bb096b1513ad4a1", "name": "Commented-code block (6 lines) in src/lib/dataverse/composeProjects.ts:112", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/dataverse/composeProjects.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-08c328877a6c7b83", "name": "Commented-code block (6 lines) in src/lib/dataverse/refreshAll.ts:15", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/dataverse/refreshAll.ts:15"}, "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-8c5d00f06099e7f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/refreshAll.ts:489", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/refreshAll.ts:489"}, "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-e5dee1d87fba0e79", "name": "Commented-code block (7 lines) in src/lib/dataverse/actualExpenseRollup.ts:244", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/dataverse/actualExpenseRollup.ts:244"}, "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-0d2d7c14c0e049e5", "name": "Commented-code block (6 lines) in src/lib/selectors/plInsights.ts:202", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/selectors/plInsights.ts:202"}, "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-39cd3074fa17d712", "name": "Commented-code block (5 lines) in src/lib/selectors/plCost.ts:162", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/selectors/plCost.ts:162"}, "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-60017ac9acee739b", "name": "Commented-code block (7 lines) in src/lib/filters/projectFilters.ts:120", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/filters/projectFilters.ts:120"}, "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-ee7a5a32bb2a90bd", "name": "Commented-code block (5 lines) in src/pages/LoginPage.tsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/LoginPage.tsx:59"}, "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-7671bd8d9afcf053", "name": "Commented-code block (5 lines) in src/pages/OverviewPage.tsx:316", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/OverviewPage.tsx:316"}, "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-cd62dd612dc2bc7e", "name": "Commented-code block (10 lines) in src/pages/PLCostPage.tsx:64", "shortDescription": {"text": "Commented-code block (10 lines) in src/pages/PLCostPage.tsx:64"}, "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-739d24119c36a6a1", "name": "Commented-code block (5 lines) in src/pages/DataManagementPage.tsx:70", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/DataManagementPage.tsx:70"}, "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-c5c93ac47c19295c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DataManagementPage.tsx:328", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DataManagementPage.tsx:328"}, "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-d7071378cedf7576", "name": "Commented-code block (6 lines) in src/pages/DashboardPage.tsx:147", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/DashboardPage.tsx:147"}, "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-c89284963330172b", "name": "Commented-code block (11 lines) in src/pages/ProjectsPage.tsx:75", "shortDescription": {"text": "Commented-code block (11 lines) in src/pages/ProjectsPage.tsx:75"}, "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-fd256d8a56155ace", "name": "Commented-code block (7 lines) in src/hooks/useEntityRows.ts:87", "shortDescription": {"text": "Commented-code block (7 lines) in src/hooks/useEntityRows.ts:87"}, "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-0af973674f12a896", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEntityRows.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEntityRows.ts:32"}, "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-e16539f248b73702", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFreightPrices.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFreightPrices.ts:45"}, "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-8e7942e22125cbf5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectActualExpense.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectActualExpense.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-c3f86032b2998c8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectEstimatedExpense.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectEstimatedExpense.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-b0f0ffbd5fbf0e50", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectExpenseLines.ts:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectExpenseLines.ts:214"}, "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-071242c49c4dac53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useVesselPositions.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useVesselPositions.ts:81"}, "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-59a63347376d3403", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectInvoices.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectInvoices.ts:17"}, "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-407c036a32dfba57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSegmentBudget.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSegmentBudget.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-9b54d2e36999a31f", "name": "Commented-code block (5 lines) in src/hooks/useActualExpenseRollup.ts:196", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useActualExpenseRollup.ts:196"}, "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-c7b520632b27a705", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectPurchases.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectPurchases.ts:18"}, "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-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_PATH`, `BASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b99153610bc695d", "name": "Frontend route `/login` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/login` has no Link/navigate to it \u2014 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-cef386312d50c26d", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 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-532ea0f8be2d677d", "name": "Frontend route `overview` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `overview` has no Link/navigate to it \u2014 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-7be36735c436327f", "name": "Frontend route `projects` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 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-a3559803173e62e6", "name": "Frontend route `projects/:projectId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `projects/:projectId` has no Link/navigate to it \u2014 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-3888ade3422079b4", "name": "Frontend route `pl-cost` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `pl-cost` has no Link/navigate to it \u2014 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-f054725e8f7a9d69", "name": "Frontend route `price-tracking` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `price-tracking` has no Link/navigate to it \u2014 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-61cca1f516784c4b", "name": "Frontend route `data` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `data` has no Link/navigate to it \u2014 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-2ae3107599198e54", "name": "Frontend route `vessel-map` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `vessel-map` has no Link/navigate to it \u2014 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-0626b4c2e4efcb82", "name": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 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-f4c35086f9f74750", "name": "Frontend route `help` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `help` has no Link/navigate to it \u2014 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}}]}}, "automationDetails": {"id": "repobility/21809"}, "properties": {"repository": "TYROAIHUB/tyrotrade", "repoUrl": "https://github.com/TYROAIHUB/tyrotrade", "branch": "main"}, "results": [{"ruleId": "scanner-65933db3a17d8b50", "level": "note", "message": {"text": "Possibly dead Python function: dump_obj"}, "properties": {"repobilityId": "71d67dc157737769", "scanner": "scanner-primary", "fingerprint": "65933db3a17d8b50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build-mocks.py:401"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ac7a1c6047cd04b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationButton.tsx:409"}, "properties": {"repobilityId": "3e001f26b84ed472", "scanner": "scanner-primary", "fingerprint": "5ac7a1c6047cd04b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a69128820f6e6f49", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppSidebar.tsx:394"}, "properties": {"repobilityId": "4e138d87902dc6ca", "scanner": "scanner-primary", "fingerprint": "a69128820f6e6f49", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67bfbc73c90af109", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppShell.tsx:448"}, "properties": {"repobilityId": "0251fcd0c8d55361", "scanner": "scanner-primary", "fingerprint": "67bfbc73c90af109", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70b9716758dbd63c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ThemeSwitcher.tsx:92"}, "properties": {"repobilityId": "fbc5b451c10533bb", "scanner": "scanner-primary", "fingerprint": "70b9716758dbd63c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0641bd366f739a67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LanguageToggle.tsx:47"}, "properties": {"repobilityId": "4c260feaeb60d3bd", "scanner": "scanner-primary", "fingerprint": "0641bd366f739a67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de05ae590c23bc7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProfileMenu.tsx:125"}, "properties": {"repobilityId": "b685837c78f24173", "scanner": "scanner-primary", "fingerprint": "de05ae590c23bc7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59c77729d76fd663", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostKpiTiles.tsx:240"}, "properties": {"repobilityId": "da9cd429a28cbaf0", "scanner": "scanner-primary", "fingerprint": "59c77729d76fd663", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5af9cbee01929359", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostDetailPanel.tsx:148"}, "properties": {"repobilityId": "54307af857f138fe", "scanner": "scanner-primary", "fingerprint": "5af9cbee01929359", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0650fd79dc1893b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pl-cost/PLCostTable.tsx:616"}, "properties": {"repobilityId": "568b534189127e6c", "scanner": "scanner-primary", "fingerprint": "0650fd79dc1893b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c6989f0b9709ebb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectCard.tsx:190"}, "properties": {"repobilityId": "951d29cfa3bd3995", "scanner": "scanner-primary", "fingerprint": "7c6989f0b9709ebb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36d35686b70ee45b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ProjectQuickAsk.tsx:106"}, "properties": {"repobilityId": "9eb5820183788d8b", "scanner": "scanner-primary", "fingerprint": "36d35686b70ee45b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a48e75d45cd7fc6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "0a48e75d45cd7fc6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-646dc1eff346d9c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/refresh-toast.tsx:128"}, "properties": {"repobilityId": "9d74c8f1abe2fa5f", "scanner": "scanner-primary", "fingerprint": "646dc1eff346d9c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a31e03c7e65ac8ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/multi-select-combobox.tsx:210"}, "properties": {"repobilityId": "510143a813360df7", "scanner": "scanner-primary", "fingerprint": "a31e03c7e65ac8ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00464e259b552e6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDetailDrawer.tsx:207"}, "properties": {"repobilityId": "c6a20dda32025ce8", "scanner": "scanner-primary", "fingerprint": "00464e259b552e6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30df5057c6f9819c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/EventsPanel.tsx:295"}, "properties": {"repobilityId": "e9bb61644789ddc8", "scanner": "scanner-primary", "fingerprint": "30df5057c6f9819c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0f1fdcea3440241", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardPanel.tsx:428"}, "properties": {"repobilityId": "eda7d658eba16922", "scanner": "scanner-primary", "fingerprint": "f0f1fdcea3440241", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5a39f767d4ef200", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/LeaderboardSegmentsPanel.tsx:364"}, "properties": {"repobilityId": "ac9dd0230e28a70c", "scanner": "scanner-primary", "fingerprint": "a5a39f767d4ef200", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03b8c9d826b153ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/KpiDrawerToolbar.tsx:151"}, "properties": {"repobilityId": "7afe58de9b847727", "scanner": "scanner-primary", "fingerprint": "03b8c9d826b153ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0d1f6a410a48b16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/BentoTile.tsx:123"}, "properties": {"repobilityId": "b221fd1bbc81c051", "scanner": "scanner-primary", "fingerprint": "a0d1f6a410a48b16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b54359f914258f5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedPLTile.tsx:211"}, "properties": {"repobilityId": "1df584dd900b7d34", "scanner": "scanner-primary", "fingerprint": "b54359f914258f5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1baf90e32a65bdc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedQuantityTile.tsx:207"}, "properties": {"repobilityId": "867f40a8337cf167", "scanner": "scanner-primary", "fingerprint": "a1baf90e32a65bdc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69d1a70a0905deb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CounterpartyMixTile.tsx:73"}, "properties": {"repobilityId": "34c623ad9107ae7d", "scanner": "scanner-primary", "fingerprint": "69d1a70a0905deb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea3eadc7ddae4de4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/EstimatedExpenseTile.tsx:234"}, "properties": {"repobilityId": "531b8db7d6ab6e07", "scanner": "scanner-primary", "fingerprint": "ea3eadc7ddae4de4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-806a88b8a6f76980", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/CorridorConcentrationTile.tsx:113"}, "properties": {"repobilityId": "dac3dd7be730957b", "scanner": "scanner-primary", "fingerprint": "806a88b8a6f76980", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ceaa737765189ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/PeriodPerformanceTile.tsx:253"}, "properties": {"repobilityId": "2cf59708a07f1de9", "scanner": "scanner-primary", "fingerprint": "5ceaa737765189ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5f6c309685c620e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/tiles/ActivePipelineTile.tsx:189"}, "properties": {"repobilityId": "962637285460b60d", "scanner": "scanner-primary", "fingerprint": "e5f6c309685c620e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58a3d2cf5d6728d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatSuggestions.tsx:45"}, "properties": {"repobilityId": "185802bc7cda480a", "scanner": "scanner-primary", "fingerprint": "58a3d2cf5d6728d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5118188b4e315f1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/evilcharts/ui/chart.tsx:205"}, "properties": {"repobilityId": "5d80382a5b65504b", "scanner": "scanner-primary", "fingerprint": "f5118188b4e315f1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3d7df72249bb7a03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommodityCard.tsx:30"}, "properties": {"repobilityId": "594a679cfdd6b43d", "scanner": "scanner-primary", "fingerprint": "3d7df72249bb7a03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5462e0559bc2df6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ExpenseComparisonSheet.tsx:273"}, "properties": {"repobilityId": "b2d97740d18cba81", "scanner": "scanner-primary", "fingerprint": "b5462e0559bc2df6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-541c874e65851034", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/RouteTimeline.tsx:43"}, "properties": {"repobilityId": "a91d56e11ccc1cd5", "scanner": "scanner-primary", "fingerprint": "541c874e65851034", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-223151a3382f69d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectInfoCard.tsx:143"}, "properties": {"repobilityId": "8f6309e0b52f945d", "scanner": "scanner-primary", "fingerprint": "223151a3382f69d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a812d36724bd2c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/ProjectOverviewCard.tsx:110"}, "properties": {"repobilityId": "05c202a8068fca6b", "scanner": "scanner-primary", "fingerprint": "4a812d36724bd2c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e09dea2df9475b5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/CommoditySalesCard.tsx:160"}, "properties": {"repobilityId": "54f2000d46b1321c", "scanner": "scanner-primary", "fingerprint": "e09dea2df9475b5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0902f7d5bd3d2682", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/HeroImage.tsx:63"}, "properties": {"repobilityId": "ba116ab76a520507", "scanner": "scanner-primary", "fingerprint": "0902f7d5bd3d2682", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a80714c3af21bd8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/BudgetSalesCard.tsx:856"}, "properties": {"repobilityId": "f43df9757fb95594", "scanner": "scanner-primary", "fingerprint": "6a80714c3af21bd8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10c9ad91adf24eba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/details/EstimatedExpenseCard.tsx:60"}, "properties": {"repobilityId": "1a557510e2b0a23d", "scanner": "scanner-primary", "fingerprint": "10c9ad91adf24eba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ff38997e5a2862b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-management/EntityInspector.tsx:107"}, "properties": {"repobilityId": "45a24bc1d74a2ab8", "scanner": "scanner-primary", "fingerprint": "6ff38997e5a2862b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4a8dd96f8b507aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightKpiTiles.tsx:211"}, "properties": {"repobilityId": "75b033e30abd81fc", "scanner": "scanner-primary", "fingerprint": "f4a8dd96f8b507aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d46ce3194cb570bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightDetailPanel.tsx:89"}, "properties": {"repobilityId": "5c9fbb66a335c8c2", "scanner": "scanner-primary", "fingerprint": "d46ce3194cb570bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5add1c890feeab60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/freight/FreightTable.tsx:243"}, "properties": {"repobilityId": "7a3486c56f1316a5", "scanner": "scanner-primary", "fingerprint": "5add1c890feeab60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b903c245f8fa685c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/VoyageStatusDonutCard.tsx:222"}, "properties": {"repobilityId": "20fdbd339d242cd9", "scanner": "scanner-primary", "fingerprint": "b903c245f8fa685c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84b3d1df6486cdd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewKpis.tsx:127"}, "properties": {"repobilityId": "12cd91c001bd929d", "scanner": "scanner-primary", "fingerprint": "84b3d1df6486cdd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-712ef97b1209b753", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/OverviewInsights.tsx:48"}, "properties": {"repobilityId": "5a5cf0ced7576aa6", "scanner": "scanner-primary", "fingerprint": "712ef97b1209b753", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3603b007f1eae4a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/LongestWaitingCard.tsx:125"}, "properties": {"repobilityId": "3917faf3da9c50a5", "scanner": "scanner-primary", "fingerprint": "3603b007f1eae4a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d74ea6febb809e33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/DetailContextMenu.tsx:73"}, "properties": {"repobilityId": "bddb5da8f8281335", "scanner": "scanner-primary", "fingerprint": "d74ea6febb809e33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1e4d6e759203860", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/PendingPaymentsCard.tsx:100"}, "properties": {"repobilityId": "b15ae02f6041b9df", "scanner": "scanner-primary", "fingerprint": "c1e4d6e759203860", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d8b133298951d3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/overview/GroupSegmentColumns.tsx:89"}, "properties": {"repobilityId": "8e97a5816f4e8270", "scanner": "scanner-primary", "fingerprint": "8d8b133298951d3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a462af6d553d56ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMapPlaceholder.tsx:101"}, "properties": {"repobilityId": "20f7c77c0e0e7721", "scanner": "scanner-primary", "fingerprint": "a462af6d553d56ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb5d1c12d04174e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RouteMap.tsx:1341"}, "properties": {"repobilityId": "10f0a0a95aab2a56", "scanner": "scanner-primary", "fingerprint": "bb5d1c12d04174e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70a6bc0bf0897a85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/command/CommandPalette.tsx:431"}, "properties": {"repobilityId": "e71c7b2c5f99a1e0", "scanner": "scanner-primary", "fingerprint": "70a6bc0bf0897a85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8a6311544c117db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewPage.tsx:326"}, "properties": {"repobilityId": "d7819d1015f5b0af", "scanner": "scanner-primary", "fingerprint": "a8a6311544c117db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae2b26546c185980", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DataManagementPage.tsx:1463"}, "properties": {"repobilityId": "9fa0442023f8b8d1", "scanner": "scanner-primary", "fingerprint": "ae2b26546c185980", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-644f0e65ff13d471", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/DataManagementPage.tsx:309"}, "properties": {"repobilityId": "d79838ff4328a9f8", "scanner": "scanner-primary", "fingerprint": "644f0e65ff13d471", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3065ad747273453b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:538"}, "properties": {"repobilityId": "add0522bc3d8f17c", "scanner": "scanner-primary", "fingerprint": "3065ad747273453b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6fdceabbaa4cb75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:649"}, "properties": {"repobilityId": "5248edf1e73ab3b6", "scanner": "scanner-primary", "fingerprint": "b6fdceabbaa4cb75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a2b7d89ba45e13e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in architecture.html:1918"}, "properties": {"repobilityId": "4e6c87d444e47c62", "scanner": "scanner-primary", "fingerprint": "5a2b7d89ba45e13e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "architecture.html"}, "region": {"startLine": 1918}}}]}, {"ruleId": "scanner-be34ae5e80b36cfb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in cloudflare-worker/worker.js:2"}, "properties": {"repobilityId": "15db39d85f7bb091", "scanner": "scanner-primary", "fingerprint": "be34ae5e80b36cfb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "cloudflare-worker/worker.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-f36756e4816e3f59", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "f36756e4816e3f59", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-b03be0ecc24377ce", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/chat/ProjectWebChat.tsx:174"}, "properties": {"repobilityId": "dc4c04e4d0e43760", "scanner": "scanner-primary", "fingerprint": "b03be0ecc24377ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/chat/ProjectWebChat.tsx"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-50bb182ea4ff1098", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/evilcharts/ui/chart.tsx:205"}, "properties": {"repobilityId": "6349f601f8f3042a", "scanner": "scanner-primary", "fingerprint": "50bb182ea4ff1098", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/evilcharts/ui/chart.tsx"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8ef93418bde27bdb", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-082d475997f5f29f", "level": "note", "message": {"text": "Very large file: src/components/map/RouteMap.tsx (1939 lines)"}, "properties": {"repobilityId": "1b0782333a353b39", "scanner": "scanner-primary", "fingerprint": "082d475997f5f29f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b8396cf65be57c17", "level": "note", "message": {"text": "Very large file: src/lib/i18n/translations.ts (2382 lines)"}, "properties": {"repobilityId": "dcaf12547f583ec0", "scanner": "scanner-primary", "fingerprint": "b8396cf65be57c17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4eb8b5979615b557", "level": "note", "message": {"text": "Very large file: src/pages/DataManagementPage.tsx (1651 lines)"}, "properties": {"repobilityId": "7304a4ccde797fa7", "scanner": "scanner-primary", "fingerprint": "4eb8b5979615b557", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "155b2353babf5e81", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "1a684eeb51ad70dc", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "90c4ba1637efe3c7", "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": "7506014b3acdb538", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "f4bebdc43da9856e", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "35d6e79bc8a4b424", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "2c44e7f4df52154e", "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": "63125ea9a5710306", "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": "3c42296893f29bc7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-791cf697ed2a6d80", "level": "none", "message": {"text": "Commented-code block (6 lines) in vite.config.ts:6"}, "properties": {"repobilityId": "1375b6e92cbfc94c", "scanner": "scanner-primary", "fingerprint": "791cf697ed2a6d80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5c36af052e8d206", "level": "none", "message": {"text": "Commented-code block (5 lines) in cloudflare-worker/worker.js:28"}, "properties": {"repobilityId": "956ad60e36c05854", "scanner": "scanner-primary", "fingerprint": "b5c36af052e8d206", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38c57a1eecfaf4fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:15"}, "properties": {"repobilityId": "738266b8dd610daa", "scanner": "scanner-primary", "fingerprint": "38c57a1eecfaf4fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5985cf242ef13574", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/main.tsx:48"}, "properties": {"repobilityId": "f7fcea4d23bb7071", "scanner": "scanner-primary", "fingerprint": "5985cf242ef13574", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6874131603dc48a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/NotificationButton.tsx:181"}, "properties": {"repobilityId": "4a26b21be1733a98", "scanner": "scanner-primary", "fingerprint": "6874131603dc48a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20ed3d7d0a0cd680", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/layout/AppSidebar.tsx:152"}, "properties": {"repobilityId": "0964971acf3dc765", "scanner": "scanner-primary", "fingerprint": "20ed3d7d0a0cd680", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e132102b6de8eea", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/TyroWmsButton.tsx:39"}, "properties": {"repobilityId": "f62d3830417708d3", "scanner": "scanner-primary", "fingerprint": "6e132102b6de8eea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e76b544728f65995", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/ProfileMenu.tsx:110"}, "properties": {"repobilityId": "4461c5607a68e842", "scanner": "scanner-primary", "fingerprint": "e76b544728f65995", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98788ff7b714ee2e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/pl-cost/PLCostProgress.tsx:93"}, "properties": {"repobilityId": "3cac5772e008fcdf", "scanner": "scanner-primary", "fingerprint": "98788ff7b714ee2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-849ff85655b16bd2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/ProjectCard.tsx:93"}, "properties": {"repobilityId": "2db4e1f268715996", "scanner": "scanner-primary", "fingerprint": "849ff85655b16bd2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-776e8b990c1a6aae", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/ProjectList.tsx:178"}, "properties": {"repobilityId": "39ba8f0109a845a8", "scanner": "scanner-primary", "fingerprint": "776e8b990c1a6aae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc5697fd3cd8f1ba", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ui/multi-select-combobox.tsx:146"}, "properties": {"repobilityId": "a73340410c12881b", "scanner": "scanner-primary", "fingerprint": "cc5697fd3cd8f1ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50d25bb93b8ce3f4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/BentoGrid.tsx:16"}, "properties": {"repobilityId": "6dafde5db7687b87", "scanner": "scanner-primary", "fingerprint": "50d25bb93b8ce3f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3779a040e83e41f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/BentoTile.tsx:118"}, "properties": {"repobilityId": "9e58725aa2b3095e", "scanner": "scanner-primary", "fingerprint": "3779a040e83e41f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10a080b1cb2496cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/tiles/EstimatedPLTile.tsx:351"}, "properties": {"repobilityId": "a60991639c236e15", "scanner": "scanner-primary", "fingerprint": "10a080b1cb2496cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c704a3e75b87921", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/chat/ProjectWebChat.tsx:116"}, "properties": {"repobilityId": "b5a37b9dc988b790", "scanner": "scanner-primary", "fingerprint": "8c704a3e75b87921", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25e24ebb2dabb7d6", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/chat/TyroAiDrawer.tsx:142"}, "properties": {"repobilityId": "893e3e9d6a77ce8a", "scanner": "scanner-primary", "fingerprint": "25e24ebb2dabb7d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b460a9b48946aac6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/details/ProjectOverviewCard.tsx:58"}, "properties": {"repobilityId": "10fa4af907ff5892", "scanner": "scanner-primary", "fingerprint": "b460a9b48946aac6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f04c6eb19faf717", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/details/CommoditySalesCard.tsx:44"}, "properties": {"repobilityId": "23a0f134f20bbce9", "scanner": "scanner-primary", "fingerprint": "1f04c6eb19faf717", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e44d095777bb8934", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/details/ExpectedRealizedExpenseCard.tsx:75"}, "properties": {"repobilityId": "82dd761589568e8c", "scanner": "scanner-primary", "fingerprint": "e44d095777bb8934", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17cc76456ee0342a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/details/BudgetSalesCard.tsx:195"}, "properties": {"repobilityId": "98020a9b538e1991", "scanner": "scanner-primary", "fingerprint": "17cc76456ee0342a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f17f62ee2e43b0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/details/BudgetSalesCard.tsx:83"}, "properties": {"repobilityId": "f5a46f58095f4462", "scanner": "scanner-primary", "fingerprint": "7f17f62ee2e43b0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df29ebf43988a632", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/data-management/EntityRowsTable.tsx:74"}, "properties": {"repobilityId": "f604aa049d973920", "scanner": "scanner-primary", "fingerprint": "df29ebf43988a632", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bca29b4c2ce1dc06", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/map/RouteMap.tsx:222"}, "properties": {"repobilityId": "188418f07d5b1cd8", "scanner": "scanner-primary", "fingerprint": "bca29b4c2ce1dc06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20e8e5a1413d381d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/filters/AdvancedFilter.tsx:222"}, "properties": {"repobilityId": "3de73341b9939049", "scanner": "scanner-primary", "fingerprint": "20e8e5a1413d381d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c99e32328f5ab785", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/routing/portCoordinates.ts:1194"}, "properties": {"repobilityId": "b3a60f42785aa022", "scanner": "scanner-primary", "fingerprint": "c99e32328f5ab785", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5820399fba26310", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/routing/heroImages.ts:76"}, "properties": {"repobilityId": "e27a47dfba4e5746", "scanner": "scanner-primary", "fingerprint": "b5820399fba26310", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1edd72fd212efce0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/entityConfig.ts:22"}, "properties": {"repobilityId": "bbb45a8537471e55", "scanner": "scanner-primary", "fingerprint": "1edd72fd212efce0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d3b46c555c64ef8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/dataverse/columnOrder.ts:40"}, "properties": {"repobilityId": "41ef78010286391e", "scanner": "scanner-primary", "fingerprint": "8d3b46c555c64ef8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bd167f705cacd74", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/dataverse/realClient.ts:34"}, "properties": {"repobilityId": "b42937ec02230bc5", "scanner": "scanner-primary", "fingerprint": "5bd167f705cacd74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bb096b1513ad4a1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/dataverse/composeProjects.ts:112"}, "properties": {"repobilityId": "021cdb586fc7d73a", "scanner": "scanner-primary", "fingerprint": "0bb096b1513ad4a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08c328877a6c7b83", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/dataverse/refreshAll.ts:15"}, "properties": {"repobilityId": "40f9ceb1b2506c20", "scanner": "scanner-primary", "fingerprint": "08c328877a6c7b83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c5d00f06099e7f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/dataverse/refreshAll.ts:489"}, "properties": {"repobilityId": "4aeac033906c9146", "scanner": "scanner-primary", "fingerprint": "8c5d00f06099e7f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e5dee1d87fba0e79", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/dataverse/actualExpenseRollup.ts:244"}, "properties": {"repobilityId": "6514b55a56125a0c", "scanner": "scanner-primary", "fingerprint": "e5dee1d87fba0e79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d2d7c14c0e049e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/selectors/plInsights.ts:202"}, "properties": {"repobilityId": "4de89336e967755a", "scanner": "scanner-primary", "fingerprint": "0d2d7c14c0e049e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39cd3074fa17d712", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/selectors/plCost.ts:162"}, "properties": {"repobilityId": "5ace187350e1f5d6", "scanner": "scanner-primary", "fingerprint": "39cd3074fa17d712", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60017ac9acee739b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/filters/projectFilters.ts:120"}, "properties": {"repobilityId": "8c1a2e995c5ce69e", "scanner": "scanner-primary", "fingerprint": "60017ac9acee739b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee7a5a32bb2a90bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/LoginPage.tsx:59"}, "properties": {"repobilityId": "72d5fa25dab5ab9f", "scanner": "scanner-primary", "fingerprint": "ee7a5a32bb2a90bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7671bd8d9afcf053", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/OverviewPage.tsx:316"}, "properties": {"repobilityId": "b37e45990c437881", "scanner": "scanner-primary", "fingerprint": "7671bd8d9afcf053", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd62dd612dc2bc7e", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/pages/PLCostPage.tsx:64"}, "properties": {"repobilityId": "ba80e8ae9a82e836", "scanner": "scanner-primary", "fingerprint": "cd62dd612dc2bc7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-739d24119c36a6a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/DataManagementPage.tsx:70"}, "properties": {"repobilityId": "8f056a7c57df3f63", "scanner": "scanner-primary", "fingerprint": "739d24119c36a6a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5c93ac47c19295c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DataManagementPage.tsx:328"}, "properties": {"repobilityId": "10b72eaa0cce135b", "scanner": "scanner-primary", "fingerprint": "c5c93ac47c19295c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7071378cedf7576", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/DashboardPage.tsx:147"}, "properties": {"repobilityId": "bfa5642f412f1b6e", "scanner": "scanner-primary", "fingerprint": "d7071378cedf7576", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c89284963330172b", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/pages/ProjectsPage.tsx:75"}, "properties": {"repobilityId": "e879080895a0b759", "scanner": "scanner-primary", "fingerprint": "c89284963330172b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd256d8a56155ace", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/hooks/useEntityRows.ts:87"}, "properties": {"repobilityId": "91a4b957c0af430b", "scanner": "scanner-primary", "fingerprint": "fd256d8a56155ace", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0af973674f12a896", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEntityRows.ts:32"}, "properties": {"repobilityId": "0280ae7e1d226b3b", "scanner": "scanner-primary", "fingerprint": "0af973674f12a896", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e16539f248b73702", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFreightPrices.ts:45"}, "properties": {"repobilityId": "9fd8a08eb9834f12", "scanner": "scanner-primary", "fingerprint": "e16539f248b73702", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e7942e22125cbf5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectActualExpense.ts:13"}, "properties": {"repobilityId": "d5d2a97f282e1e1f", "scanner": "scanner-primary", "fingerprint": "8e7942e22125cbf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3f86032b2998c8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectEstimatedExpense.ts:13"}, "properties": {"repobilityId": "7316fba44b1049a0", "scanner": "scanner-primary", "fingerprint": "c3f86032b2998c8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b0f0ffbd5fbf0e50", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectExpenseLines.ts:214"}, "properties": {"repobilityId": "b1692a597f2efe87", "scanner": "scanner-primary", "fingerprint": "b0f0ffbd5fbf0e50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-071242c49c4dac53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useVesselPositions.ts:81"}, "properties": {"repobilityId": "5c7c11d4b4433473", "scanner": "scanner-primary", "fingerprint": "071242c49c4dac53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59a63347376d3403", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectInvoices.ts:17"}, "properties": {"repobilityId": "02b989fe9e8c8409", "scanner": "scanner-primary", "fingerprint": "59a63347376d3403", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-407c036a32dfba57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSegmentBudget.ts:13"}, "properties": {"repobilityId": "6a85daabafb8ba5b", "scanner": "scanner-primary", "fingerprint": "407c036a32dfba57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b54d2e36999a31f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useActualExpenseRollup.ts:196"}, "properties": {"repobilityId": "1f42a8ed55aa7ff9", "scanner": "scanner-primary", "fingerprint": "9b54d2e36999a31f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7b520632b27a705", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useProjectPurchases.ts:18"}, "properties": {"repobilityId": "6a9870bb83e73532", "scanner": "scanner-primary", "fingerprint": "c7b520632b27a705", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2b99153610bc695d", "level": "warning", "message": {"text": "Frontend route `/login` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "52e20181ba19cb6c", "scanner": "scanner-primary", "fingerprint": "2b99153610bc695d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cef386312d50c26d", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7176b9e63e301c9b", "scanner": "scanner-primary", "fingerprint": "cef386312d50c26d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-532ea0f8be2d677d", "level": "warning", "message": {"text": "Frontend route `overview` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4704e5ed8601f83b", "scanner": "scanner-primary", "fingerprint": "532ea0f8be2d677d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7be36735c436327f", "level": "warning", "message": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "72edb6d1e2f77246", "scanner": "scanner-primary", "fingerprint": "7be36735c436327f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a3559803173e62e6", "level": "warning", "message": {"text": "Frontend route `projects/:projectId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5891f44a17185861", "scanner": "scanner-primary", "fingerprint": "a3559803173e62e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3888ade3422079b4", "level": "warning", "message": {"text": "Frontend route `pl-cost` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6dfef447b469d208", "scanner": "scanner-primary", "fingerprint": "3888ade3422079b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f054725e8f7a9d69", "level": "warning", "message": {"text": "Frontend route `price-tracking` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f24cd9ddc768529a", "scanner": "scanner-primary", "fingerprint": "f054725e8f7a9d69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-61cca1f516784c4b", "level": "warning", "message": {"text": "Frontend route `data` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "71333aca38172dc5", "scanner": "scanner-primary", "fingerprint": "61cca1f516784c4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2ae3107599198e54", "level": "warning", "message": {"text": "Frontend route `vessel-map` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "eb6dfbcde0aac3fd", "scanner": "scanner-primary", "fingerprint": "2ae3107599198e54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0626b4c2e4efcb82", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9badda3b3a471962", "scanner": "scanner-primary", "fingerprint": "0626b4c2e4efcb82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4c35086f9f74750", "level": "warning", "message": {"text": "Frontend route `help` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "bc4d22eed5bd88d1", "scanner": "scanner-primary", "fingerprint": "f4c35086f9f74750", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}