{"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-dad258bb95826901", "name": "Stray `console.log` in TS/JS \u2014 api/index.ts:6056", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/index.ts:6056"}, "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-1b990311dc1e2371", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/CommandPalette.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/CommandPalette.tsx:259"}, "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-4c13124516fbc3b8", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/AICompanion.tsx:495", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/AICompanion.tsx:495"}, "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-ea2a844a78af02c5", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/SitemapCaptureModal.tsx:515", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/SitemapCaptureModal.tsx:515"}, "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-6f2a046f63593f74", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/DashboardWidgets.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/DashboardWidgets.tsx:178"}, "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-e6b0452421f65b7b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/RecentConversations.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/RecentConversations.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-12c483fa01b738ce", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/LibrarySidebar.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/LibrarySidebar.tsx:55"}, "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-5346d97b581713ea", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoDetailPanel.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoDetailPanel.tsx:225"}, "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-a07523709d10957b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoGrid.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoGrid.tsx:44"}, "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-dcf82dd3dd91ab85", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/AnswerDetailPanel.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/AnswerDetailPanel.tsx:440"}, "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-1909d74b8cd76323", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/MarkdownRenderer.tsx:172", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/MarkdownRenderer.tsx:172"}, "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-57346d843d522f23", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/chat/ChatInput.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/chat/ChatInput.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5ed76fb4b4a24cc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/ChatMessage.tsx:79", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/ChatMessage.tsx:79"}, "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-9fee9b428c7a86d9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/deck/DeckChatSidebar.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/deck/DeckChatSidebar.tsx:171"}, "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-e6a48beb66eed430", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/StudioChatSidebar.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/StudioChatSidebar.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-cb2c9e3c14fcce95", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/StudioChatSidebar.tsx:153", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/StudioChatSidebar.tsx:153"}, "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-78a12f08e06ca410", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/DataBrowserPanel.tsx:397", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/DataBrowserPanel.tsx:397"}, "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-d6be5ac8fb541445", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ComplianceChecklist.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ComplianceChecklist.tsx:196"}, "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-faa2cdca054e828c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/VersionHistory.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/VersionHistory.tsx:132"}, "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-0c4f376f1b184d5c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/AssetPanel.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/AssetPanel.tsx:170"}, "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-ab572ce082f35b91", "name": "\"active\" state uses light bg in a dark theme \u2014 packages/client/src/components/studio/InspectorPanel.tsx:50", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 packages/client/src/components/studio/InspectorPanel.tsx:50"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54886da89b89cd57", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4352fa2f5f7cc368", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/DocumentEditor.tsx:380", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/DocumentEditor.tsx:380"}, "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-170d5abef798003c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ShareDialog.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ShareDialog.tsx:157"}, "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-088cb89397dfc2bd", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/EditorBubbleMenu.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/EditorBubbleMenu.tsx:230"}, "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-e282752b8ccd1b6f", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientAssetsTab.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientAssetsTab.tsx:152"}, "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-d70e038ae95fa42d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/client-portfolio/ChatMarkdown.tsx:7", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/client-portfolio/ChatMarkdown.tsx:76"}, "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-a82eac80d9133e00", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientRoster.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientRoster.tsx:302"}, "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-fadbff15330cbcde", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientDocumentsTab.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientDocumentsTab.tsx:206"}, "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-14efd2f1ee7e2abe", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/DoNotContactSection", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/DoNotContactSection.tsx:126"}, "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-f27f66c8853d5918", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/URLScanner.tsx:1981", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/URLScanner.tsx:1981"}, "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-eb313c3520e08885", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/ImageConverter.tsx:1444", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/ImageConverter.tsx:1444"}, "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-b6a5b44db7aba327", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/AskAI.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/AskAI.tsx:261"}, "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-56447726562a2970", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/RFPAnalyzer.tsx:627", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/RFPAnalyzer.tsx:627"}, "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-b45be8ab515916e2", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/TestimonialManager.tsx:1017", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/TestimonialManager.tsx:1017"}, "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-683f6253e0370b8c", "name": "Stray `console.log` in TS/JS \u2014 packages/client/src/pages/TestimonialManager.tsx:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/client/src/pages/TestimonialManager.tsx:213"}, "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-3c75dd596a390084", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/SearchLibrary.tsx:2154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/SearchLibrary.tsx:2154"}, "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-4ef86f1c301661fd", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/Webinars.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/Webinars.tsx:239"}, "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-feeca8c9c8645179", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/PhotoUpload.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/PhotoUpload.tsx:368"}, "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-75c6fe215d4949b8", "name": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/delete-shorter-dupes.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/delete-shorter-dupes.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e7b8b3290f21ccc", "name": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/cleanup-test-data.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/cleanup-test-data.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d943d4d9b083540", "name": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/scanner-verify.ts:396", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/scanner-verify.ts:396"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f2f9e6387e9520b", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/index.ts:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/index.ts:196"}, "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-f30847136cb01c46", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/middleware/csrf.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/middleware/csrf.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b1937892e067e556", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/applyMigration.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/applyMigration.ts:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17c2197ea3b0d0a2", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientBrandKit.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientBrandKit.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a84d0d111741d737", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedAwards.ts:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedAwards.ts:197"}, "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-d3b11210eb1b73ad", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedTestimonials.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedTestimonials.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b30a2b52d1f8884", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/listPhotos.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/listPhotos.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-889e1e3fd7487f27", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importExcel.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importExcel.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42343be1c65bbf7a", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientsTable.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientsTable.ts:22"}, "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-9ab07200b854b56a", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyWebinarConstraints.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyWebinarConstraints.ts:32"}, "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-14da8aa1a06b0018", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAwardFields.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAwardFields.ts:22"}, "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-06b4e0d860821f36", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/backfillTestimonialNotes.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/backfillTestimonialNotes.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-08dbbef6de164904", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePhotoUsageFields.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePhotoUsageFields.ts:22"}, "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-c9f6b60b7f680fe6", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/checkDb.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/checkDb.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b176302ac5adb72d", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAnswerForkField.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAnswerForkField.ts:22"}, "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-2162ca372f14145b", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedUsers.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedUsers.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76ebf190c4af5ab4", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyConstraints.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyConstraints.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15f8a31aa84f0b33", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientQaLinks.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientQaLinks.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a83771b4479e76c9", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientDocuments.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientDocuments.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a40406b2442b6fc", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateTestimonialFields.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateTestimonialFields.ts:22"}, "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-d1a6e576f86cc0ef", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/resetPassword.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/resetPassword.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-015a141179b562a1", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/deleteTestPhotos.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/deleteTestPhotos.ts:18"}, "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-c33e8f4b5bcf3f36", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedClientDomains.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedClientDomains.ts:47"}, "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-25ad53a9ad45c700", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePersonaSamples.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePersonaSamples.ts:22"}, "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-d5b58199e6b00ba6", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importLoopio.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importLoopio.ts:18"}, "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-2f07e400f8e7d1cc", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/meetings.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/meetings.ts:131"}, "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-896a4db40b79e61a", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/screenshot.ts:288", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/screenshot.ts:288"}, "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-6b32cd7172e37e32", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalSyncService.ts:327", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalSyncService.ts:327"}, "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-5d204b5d6353e3df", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/importService.ts:507", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/importService.ts:507"}, "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-3d1dd3b10814ac46", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalAIService.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalAIService.ts:186"}, "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-0d5e93a1ed665853", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/pipelineSyncService.ts:173", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/pipelineSyncService.ts:173"}, "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-7ca7b3b85442fb00", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/scannerService.ts:882", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/scannerService.ts:882"}, "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-16b6e3ce69c7cc9d", "name": "Stray `console.log` in TS/JS \u2014 packages/server/src/db/index.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/db/index.ts:60"}, "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-2281671f8c1942e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in coe-gap-analysis-report.html:2012", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in coe-gap-analysis-report.html:2012"}, "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-5e62d7db616e6aea", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-gap-analysis.html:2012", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-gap-analysis.html:2012"}, "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-75446accfdeee509", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-majors-redesign-mockup.html:1057", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-majors-redesign-mockup.html:1057"}, "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-77477bb11de38bbc", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/QAExportDialog.tsx:153", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/QAExportDialog.tsx:153"}, "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-bed88bb284e4604b", "name": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/MarkdownRenderer.tsx:172", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/MarkdownRenderer.tsx:172"}, "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-58ad351ef77bfa48", "name": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/ChatMessage.tsx:79", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/ChatMessage.tsx:79"}, "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-737b5b0705dd5037", "name": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/StudioChatSidebar.tsx:153", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/StudioChatSidebar.tsx:153"}, "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-1cb923f14db67e2e", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/StudioHumanizerPanel.tsx:173", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/StudioHumanizerPanel.tsx:173"}, "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-89f26a22b62b89aa", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/ExportDialog.tsx:106", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/ExportDialog.tsx:106"}, "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-e9ec88f664e724bb", "name": "Insecure pattern 'domparser_html_parse' in packages/client/src/components/studio/ExportDialog.tsx:167", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in packages/client/src/components/studio/ExportDialog.tsx:167"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f4ed7b7d96e9c44", "name": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/DocumentEditor.tsx:380", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/DocumentEditor.tsx:380"}, "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-923a466ef3eea3e3", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/DocumentEditor.tsx:149", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/DocumentEditor.tsx:149"}, "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-862d6315d7fa900f", "name": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/client-portfolio/ChatMarkdown.tsx:76", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/client-portfolio/ChatMarkdown.tsx:76"}, "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-890f9983e829059f", "name": "Insecure pattern 'document_write' in packages/client/src/pages/URLScanner.tsx:1632", "shortDescription": {"text": "Insecure pattern 'document_write' in packages/client/src/pages/URLScanner.tsx:1632"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b44482090a3130aa", "name": "Insecure pattern 'local_storage_auth_token' in packages/client/src/pages/URLScanner.tsx:2563", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in packages/client/src/pages/URLScanner.tsx:2563"}, "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-3def2d0dcd9a074c", "name": "Insecure pattern 'node_child_process' in packages/server/scripts/scanner-verify.ts:13", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packages/server/scripts/scanner-verify.ts:13"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5903c4d37c21c21f", "name": "Possible secret in packages/server/src/scripts/seedUsers.ts", "shortDescription": {"text": "Possible secret in packages/server/src/scripts/seedUsers.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9372e2f452d0ea25", "name": "Insecure pattern 'node_child_process' in packages/server/src/routes/meetings.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packages/server/src/routes/meetings.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e64e06ee8b7de9f", "name": "Very large file: api/index.ts (8980 lines)", "shortDescription": {"text": "Very large file: api/index.ts (8980 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-22ba9a03097b874e", "name": "Very large file: packages/client/src/components/SettingsPanel.tsx (1506 lines)", "shortDescription": {"text": "Very large file: packages/client/src/components/SettingsPanel.tsx (1506 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-d95e84bf7c02fe01", "name": "Very large file: packages/client/src/components/SitemapCaptureModal.tsx (2176 lines)", "shortDescription": {"text": "Very large file: packages/client/src/components/SitemapCaptureModal.tsx (2176 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-6d7d73de7075df8e", "name": "Very large file: packages/client/src/lib/api.ts (2487 lines)", "shortDescription": {"text": "Very large file: packages/client/src/lib/api.ts (2487 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-a4aa6d1922cf40a5", "name": "Very large file: packages/client/src/pages/URLScanner.tsx (3256 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/URLScanner.tsx (3256 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-d47b8ea3870b380a", "name": "Very large file: packages/client/src/pages/ImageConverter.tsx (2770 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/ImageConverter.tsx (2770 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-4ae37fcae2df6935", "name": "Very large file: packages/client/src/pages/RFPAnalyzer.tsx (1162 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/RFPAnalyzer.tsx (1162 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-9dc05f20fef3e203", "name": "Very large file: packages/client/src/pages/TestimonialManager.tsx (1711 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/TestimonialManager.tsx (1711 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-3d34cb5761a27770", "name": "Very large file: packages/client/src/pages/AIHumanizer.tsx (2286 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/AIHumanizer.tsx (2286 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-53b1fcfc9d60db4f", "name": "Very large file: packages/client/src/pages/SearchLibrary.tsx (3280 lines)", "shortDescription": {"text": "Very large file: packages/client/src/pages/SearchLibrary.tsx (3280 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-8484da619897f038", "name": "Very large file: packages/server/src/routes/clientSuccess.ts (1551 lines)", "shortDescription": {"text": "Very large file: packages/server/src/routes/clientSuccess.ts (1551 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-7438e4ade60c890f", "name": "Very large file: packages/server/src/services/proposalAIService.ts (1734 lines)", "shortDescription": {"text": "Very large file: packages/server/src/services/proposalAIService.ts (1734 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": "13 test file(s) for 268 source file(s) (ratio 0.05). 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-b739f2f2be1d714d", "name": "Node manifest has dependencies but no lockfile: packages/server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/server/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 240 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 301 placeholder/mock markers across 68 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, operator-readme, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fecc51b169640ed3", "name": "Commented-code block (5 lines) in api/index.ts:8775", "shortDescription": {"text": "Commented-code block (5 lines) in api/index.ts:8775"}, "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-cfbf3938e42a0015", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/index.ts:8944", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/index.ts:8944"}, "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-64fbeec27fac717c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:31"}, "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-a3baacc89b258515", "name": "Legacy-named symbol `migan_pipeline_v2` in packages/client/src/workers/inpaintWorker.ts:17", "shortDescription": {"text": "Legacy-named symbol `migan_pipeline_v2` in packages/client/src/workers/inpaintWorker.ts:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc18f6467f014426", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/workers/inpaintWorker.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/workers/inpaintWorker.ts:53"}, "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-2de611edf0a8c3dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/PitchDeckDesigner.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/PitchDeckDesigner.tsx:147"}, "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-33dda5f400b027f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/ImageConverter.tsx:1322", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/ImageConverter.tsx:1322"}, "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-6312d618fadad5ce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/AIHumanizer.tsx:1773", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/AIHumanizer.tsx:1773"}, "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-9640a6ce8a67b8ad", "name": "Commented-code block (10 lines) in packages/server/src/routes/screenshot.ts:31", "shortDescription": {"text": "Commented-code block (10 lines) in packages/server/src/routes/screenshot.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d878ed0b240a664", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/server/src/routes/screenshot.ts:266", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/server/src/routes/screenshot.ts:266"}, "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-af022f937dd5b7fd", "name": "9 env vars used in code but missing from .env.example", "shortDescription": {"text": "9 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `MICROLINK_API_KEY`, `PIPELINE_SYNC_INTERVAL`, `PROPOSAL_PIPELINE_PATH`, `PROPOSAL_SUMMARY_PATH`, `PROPOSAL_SYNC_INTERVAL`, `SCREENSHOTONE_ACCESS_KEY`, `SUPABASE_SERVICE_ROLE_KEY` + 1 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8dfca3c239fa005b", "name": "Frontend route `/insights` has no Link/navigate to it \u2014 packages/client/src/App.tsx", "shortDescription": {"text": "Frontend route `/insights` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a87aec4f48d60fc0", "name": "Frontend route `/case-studies` has no Link/navigate to it \u2014 packages/client/src/App.tsx", "shortDescription": {"text": "Frontend route `/case-studies` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0161ba653527276f", "name": "Frontend route `/unified-ai` has no Link/navigate to it \u2014 packages/client/src/App.tsx", "shortDescription": {"text": "Frontend route `/unified-ai` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a9335cc66d4cda9", "name": "Frontend route `/scanner/accessibility` has no Link/navigate to it \u2014 packages/client/src/App.tsx", "shortDescription": {"text": "Frontend route `/scanner/accessibility` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a631fae37bb118f8", "name": "Dangling fetch: GET https://www.youvisit.com/tour/${instId} (api/index.ts:8805)", "shortDescription": {"text": "Dangling fetch: GET https://www.youvisit.com/tour/${instId} (api/index.ts:8805)"}, "fullDescription": {"text": "`api/index.ts:8805` calls `GET https://www.youvisit.com/tour/${instId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.youvisit.com/tour/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-93cd7c16d20e4f74", "name": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:985)", "shortDescription": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:985)"}, "fullDescription": {"text": "`packages/client/src/components/SitemapCaptureModal.tsx:985` calls `POST /api/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/screenshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7004e590ffd36b69", "name": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1056)", "shortDescription": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1056)"}, "fullDescription": {"text": "`packages/client/src/components/SitemapCaptureModal.tsx:1056` calls `POST /api/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/screenshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7529fd3572189ce", "name": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1182)", "shortDescription": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1182)"}, "fullDescription": {"text": "`packages/client/src/components/SitemapCaptureModal.tsx:1182` calls `POST /api/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/screenshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08ce9fea1da59ec3", "name": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1281)", "shortDescription": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1281)"}, "fullDescription": {"text": "`packages/client/src/components/SitemapCaptureModal.tsx:1281` calls `POST /api/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/screenshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-719d964d0b9c4a4c", "name": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1392)", "shortDescription": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1392)"}, "fullDescription": {"text": "`packages/client/src/components/SitemapCaptureModal.tsx:1392` calls `POST /api/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/screenshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6751460dc63cd637", "name": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:56)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:56)"}, "fullDescription": {"text": "`packages/client/src/contexts/AuthContext.tsx:56` calls `GET /api/auth/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f636d33433ba6ea1", "name": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:83)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:83)"}, "fullDescription": {"text": "`packages/client/src/contexts/AuthContext.tsx:83` calls `GET /api/auth/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9231cbf285ad46b4", "name": "Dangling fetch: POST /api/auth/logout (packages/client/src/contexts/AuthContext.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (packages/client/src/contexts/AuthContext.tsx:95)"}, "fullDescription": {"text": "`packages/client/src/contexts/AuthContext.tsx:95` calls `POST /api/auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/logout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2d90b3059882e85a", "name": "Dangling fetch: POST /api/scanner/scan (packages/client/src/pages/URLScanner.tsx:679)", "shortDescription": {"text": "Dangling fetch: POST /api/scanner/scan (packages/client/src/pages/URLScanner.tsx:679)"}, "fullDescription": {"text": "`packages/client/src/pages/URLScanner.tsx:679` calls `POST /api/scanner/scan` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scanner/scan`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21ccf688bbe010f5", "name": "Dangling fetch: POST /api/scanner/ai/fix-issue (packages/client/src/pages/URLScanner.tsx:1657)", "shortDescription": {"text": "Dangling fetch: POST /api/scanner/ai/fix-issue (packages/client/src/pages/URLScanner.tsx:1657)"}, "fullDescription": {"text": "`packages/client/src/pages/URLScanner.tsx:1657` calls `POST /api/scanner/ai/fix-issue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scanner/ai/fix-issue`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-007da9449780075d", "name": "Dangling fetch: POST /api/scanner/ai/alt-text (packages/client/src/pages/URLScanner.tsx:1726)", "shortDescription": {"text": "Dangling fetch: POST /api/scanner/ai/alt-text (packages/client/src/pages/URLScanner.tsx:1726)"}, "fullDescription": {"text": "`packages/client/src/pages/URLScanner.tsx:1726` calls `POST /api/scanner/ai/alt-text` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scanner/ai/alt-text`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e393a49bb313aeb", "name": "Dangling fetch: POST /api/auth/change-password (packages/client/src/pages/ChangePassword.tsx:32)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/change-password (packages/client/src/pages/ChangePassword.tsx:32)"}, "fullDescription": {"text": "`packages/client/src/pages/ChangePassword.tsx:32` calls `POST /api/auth/change-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/change-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d40449e60d0a5189", "name": "Dangling fetch: POST /api/auth/login (packages/client/src/pages/Login.tsx:27)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (packages/client/src/pages/Login.tsx:27)"}, "fullDescription": {"text": "`packages/client/src/pages/Login.tsx:27` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-afc96d397ca2d728", "name": "Dangling fetch: POST /api/scanner/headings (packages/client/src/pages/ScannerPortal.tsx:117)", "shortDescription": {"text": "Dangling fetch: POST /api/scanner/headings (packages/client/src/pages/ScannerPortal.tsx:117)"}, "fullDescription": {"text": "`packages/client/src/pages/ScannerPortal.tsx:117` calls `POST /api/scanner/headings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scanner/headings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a5487bf8cad74e3c", "name": "Dangling fetch: POST /api/auth/register (packages/client/src/pages/Register.tsx:34)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/register (packages/client/src/pages/Register.tsx:34)"}, "fullDescription": {"text": "`packages/client/src/pages/Register.tsx:34` calls `POST /api/auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`packages/server/src/index.ts` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`packages/server/src/index.ts` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-415e0ba6e85c0f53", "name": "Unused endpoint: GET /api/photos/file/:storageKey", "shortDescription": {"text": "Unused endpoint: GET /api/photos/file/:storageKey"}, "fullDescription": {"text": "`packages/server/src/index.ts` declares `GET /api/photos/file/:storageKey` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b226dcbf346abf99", "name": "Unused endpoint: GET /api/auth/avatar/:userId", "shortDescription": {"text": "Unused endpoint: GET /api/auth/avatar/:userId"}, "fullDescription": {"text": "`packages/server/src/index.ts` declares `GET /api/auth/avatar/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-57555b979172a46a", "name": "Unused endpoint: USE /storage/photos", "shortDescription": {"text": "Unused endpoint: USE /storage/photos"}, "fullDescription": {"text": "`packages/server/src/index.ts` declares `USE /storage/photos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bb3714794b14146", "name": "Unused endpoint: POST /query", "shortDescription": {"text": "Unused endpoint: POST /query"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /query` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f4ee569e1562771", "name": "Unused endpoint: POST /stream", "shortDescription": {"text": "Unused endpoint: POST /stream"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55f3127c48b96001", "name": "Unused endpoint: POST /adapt", "shortDescription": {"text": "Unused endpoint: POST /adapt"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /adapt` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4024cc8814b7e0bc", "name": "Unused endpoint: POST /case-studies", "shortDescription": {"text": "Unused endpoint: POST /case-studies"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /case-studies` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9283e2af05510757", "name": "Unused endpoint: POST /case-studies/stream", "shortDescription": {"text": "Unused endpoint: POST /case-studies/stream"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /case-studies/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-544eab7ed96a0a05", "name": "Unused endpoint: POST /testimonial-finder", "shortDescription": {"text": "Unused endpoint: POST /testimonial-finder"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /testimonial-finder` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5cadce233d986fd", "name": "Unused endpoint: POST /client-chat/stream", "shortDescription": {"text": "Unused endpoint: POST /client-chat/stream"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /client-chat/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46b20e87954a8015", "name": "Unused endpoint: POST /client-gap-analysis", "shortDescription": {"text": "Unused endpoint: POST /client-gap-analysis"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /client-gap-analysis` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cc59e5eb250d4cb", "name": "Unused endpoint: POST /adapt-bulk", "shortDescription": {"text": "Unused endpoint: POST /adapt-bulk"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /adapt-bulk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70da460266d7bd16", "name": "Unused endpoint: POST /alt-text", "shortDescription": {"text": "Unused endpoint: POST /alt-text"}, "fullDescription": {"text": "`packages/server/src/routes/ai.ts` declares `POST /alt-text` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fe9bb486644f008", "name": "Unused endpoint: POST /change-password", "shortDescription": {"text": "Unused endpoint: POST /change-password"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e7a9e46ce575dc4", "name": "Unused endpoint: POST /complete-tour", "shortDescription": {"text": "Unused endpoint: POST /complete-tour"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /complete-tour` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9088e9b5172e06b8", "name": "Unused endpoint: POST /reset-tour", "shortDescription": {"text": "Unused endpoint: POST /reset-tour"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /reset-tour` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2060053b3bc0a182", "name": "Unused endpoint: POST /avatar", "shortDescription": {"text": "Unused endpoint: POST /avatar"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `POST /avatar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-def1c4677f533a77", "name": "Unused endpoint: DELETE /avatar", "shortDescription": {"text": "Unused endpoint: DELETE /avatar"}, "fullDescription": {"text": "`packages/server/src/routes/auth.ts` declares `DELETE /avatar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`packages/server/src/routes/health.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e9dc0625bf548f6", "name": "Unused endpoint: GET /sync/status", "shortDescription": {"text": "Unused endpoint: GET /sync/status"}, "fullDescription": {"text": "`packages/server/src/routes/proposals.ts` declares `GET /sync/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-626223c50a2fb86c", "name": "Unused endpoint: POST /sync/trigger", "shortDescription": {"text": "Unused endpoint: POST /sync/trigger"}, "fullDescription": {"text": "`packages/server/src/routes/proposals.ts` declares `POST /sync/trigger` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dfa339e16c7ac75f", "name": "Unused endpoint: USE /do-not-contact", "shortDescription": {"text": "Unused endpoint: USE /do-not-contact"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `USE /do-not-contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0729b84d4e27d0b9", "name": "Unused endpoint: GET /clients", "shortDescription": {"text": "Unused endpoint: GET /clients"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /clients` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a22e4396af9d5790", "name": "Unused endpoint: POST /clients", "shortDescription": {"text": "Unused endpoint: POST /clients"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /clients` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-24986b75128e6b03", "name": "Unused endpoint: PUT /clients/:id", "shortDescription": {"text": "Unused endpoint: PUT /clients/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PUT /clients/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a39c70474572f687", "name": "Unused endpoint: DELETE /clients/:id", "shortDescription": {"text": "Unused endpoint: DELETE /clients/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `DELETE /clients/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b378c4799e9d2287", "name": "Unused endpoint: GET /entries", "shortDescription": {"text": "Unused endpoint: GET /entries"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /entries` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2dc06f07caf027b7", "name": "Unused endpoint: POST /entries", "shortDescription": {"text": "Unused endpoint: POST /entries"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /entries` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bff1382b4cd28b64", "name": "Unused endpoint: DELETE /entries/:id", "shortDescription": {"text": "Unused endpoint: DELETE /entries/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `DELETE /entries/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf7b44dd51a83c5b", "name": "Unused endpoint: PATCH /entries/:id/usage", "shortDescription": {"text": "Unused endpoint: PATCH /entries/:id/usage"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PATCH /entries/:id/usage` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06d6991bc999465b", "name": "Unused endpoint: GET /results", "shortDescription": {"text": "Unused endpoint: GET /results"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /results` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1edf4d6b44de8a95", "name": "Unused endpoint: POST /results", "shortDescription": {"text": "Unused endpoint: POST /results"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /results` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c28ef2c3205fbf1b", "name": "Unused endpoint: DELETE /results/:id", "shortDescription": {"text": "Unused endpoint: DELETE /results/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `DELETE /results/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-585b14e9a7a76b0c", "name": "Unused endpoint: PATCH /results/:id/usage", "shortDescription": {"text": "Unused endpoint: PATCH /results/:id/usage"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PATCH /results/:id/usage` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-819c21404d1f01a9", "name": "Unused endpoint: GET /testimonials", "shortDescription": {"text": "Unused endpoint: GET /testimonials"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /testimonials` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8d8cd8d20b9743f", "name": "Unused endpoint: GET /testimonials/:id", "shortDescription": {"text": "Unused endpoint: GET /testimonials/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /testimonials/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39631f94a3d14319", "name": "Unused endpoint: POST /testimonials", "shortDescription": {"text": "Unused endpoint: POST /testimonials"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /testimonials` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0465c5a48482c7fd", "name": "Unused endpoint: PUT /testimonials/:id", "shortDescription": {"text": "Unused endpoint: PUT /testimonials/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PUT /testimonials/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37ecf17a2f7ea749", "name": "Unused endpoint: PATCH /testimonials/:id/status", "shortDescription": {"text": "Unused endpoint: PATCH /testimonials/:id/status"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PATCH /testimonials/:id/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37b6bf7d14c9a39e", "name": "Unused endpoint: PATCH /testimonials/:id/usage", "shortDescription": {"text": "Unused endpoint: PATCH /testimonials/:id/usage"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PATCH /testimonials/:id/usage` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-106d590a5f74623d", "name": "Unused endpoint: PATCH /testimonials/:id/featured", "shortDescription": {"text": "Unused endpoint: PATCH /testimonials/:id/featured"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `PATCH /testimonials/:id/featured` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed4212e37c6f7bd5", "name": "Unused endpoint: POST /testimonials/bulk-status", "shortDescription": {"text": "Unused endpoint: POST /testimonials/bulk-status"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /testimonials/bulk-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c85ca548d59b2b01", "name": "Unused endpoint: DELETE /testimonials/:id", "shortDescription": {"text": "Unused endpoint: DELETE /testimonials/:id"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `DELETE /testimonials/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d33b52bab8cdaad5", "name": "Unused endpoint: GET /awards", "shortDescription": {"text": "Unused endpoint: GET /awards"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `GET /awards` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a8cfd4785de7b6c", "name": "Unused endpoint: POST /awards", "shortDescription": {"text": "Unused endpoint: POST /awards"}, "fullDescription": {"text": "`packages/server/src/routes/clientSuccess.ts` declares `POST /awards` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20231"}, "properties": {"repository": "stamatsit/rfp", "repoUrl": "https://github.com/stamatsit/rfp", "branch": "main"}, "results": [{"ruleId": "scanner-dad258bb95826901", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/index.ts:6056"}, "properties": {"repobilityId": "7eddfc46753ed49c", "scanner": "scanner-primary", "fingerprint": "dad258bb95826901", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b990311dc1e2371", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/CommandPalette.tsx:259"}, "properties": {"repobilityId": "b51385f889c5d5ea", "scanner": "scanner-primary", "fingerprint": "1b990311dc1e2371", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c13124516fbc3b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/AICompanion.tsx:495"}, "properties": {"repobilityId": "949b656f190b50f5", "scanner": "scanner-primary", "fingerprint": "4c13124516fbc3b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea2a844a78af02c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/SitemapCaptureModal.tsx:515"}, "properties": {"repobilityId": "e3940441520bf23c", "scanner": "scanner-primary", "fingerprint": "ea2a844a78af02c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f2a046f63593f74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/DashboardWidgets.tsx:178"}, "properties": {"repobilityId": "170770de1b884c4f", "scanner": "scanner-primary", "fingerprint": "6f2a046f63593f74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6b0452421f65b7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/RecentConversations.tsx:89"}, "properties": {"repobilityId": "f044ac988aea316b", "scanner": "scanner-primary", "fingerprint": "e6b0452421f65b7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12c483fa01b738ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/LibrarySidebar.tsx:55"}, "properties": {"repobilityId": "d0f717278d4364b9", "scanner": "scanner-primary", "fingerprint": "12c483fa01b738ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5346d97b581713ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoDetailPanel.tsx:225"}, "properties": {"repobilityId": "330564d891791c18", "scanner": "scanner-primary", "fingerprint": "5346d97b581713ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a07523709d10957b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/PhotoGrid.tsx:44"}, "properties": {"repobilityId": "11720decd2c73ba6", "scanner": "scanner-primary", "fingerprint": "a07523709d10957b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcf82dd3dd91ab85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/library/AnswerDetailPanel.tsx:440"}, "properties": {"repobilityId": "ed4d92e38718a7c3", "scanner": "scanner-primary", "fingerprint": "dcf82dd3dd91ab85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1909d74b8cd76323", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/MarkdownRenderer.tsx:172"}, "properties": {"repobilityId": "6521d40558f0cae6", "scanner": "scanner-primary", "fingerprint": "1909d74b8cd76323", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-57346d843d522f23", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/chat/ChatInput.tsx:114"}, "properties": {"repobilityId": "4d733ecbfa259022", "scanner": "scanner-primary", "fingerprint": "57346d843d522f23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5ed76fb4b4a24cc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/chat/ChatMessage.tsx:79"}, "properties": {"repobilityId": "cb933460d8dfe38a", "scanner": "scanner-primary", "fingerprint": "e5ed76fb4b4a24cc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9fee9b428c7a86d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/deck/DeckChatSidebar.tsx:171"}, "properties": {"repobilityId": "8017f2e4c840ff0e", "scanner": "scanner-primary", "fingerprint": "9fee9b428c7a86d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6a48beb66eed430", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/StudioChatSidebar.tsx:73"}, "properties": {"repobilityId": "69ccbc29cf4393e8", "scanner": "scanner-primary", "fingerprint": "e6a48beb66eed430", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb2c9e3c14fcce95", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/StudioChatSidebar.tsx:153"}, "properties": {"repobilityId": "7ecd1179db4a28ee", "scanner": "scanner-primary", "fingerprint": "cb2c9e3c14fcce95", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-78a12f08e06ca410", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/DataBrowserPanel.tsx:397"}, "properties": {"repobilityId": "87babe57eb6452c1", "scanner": "scanner-primary", "fingerprint": "78a12f08e06ca410", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6be5ac8fb541445", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ComplianceChecklist.tsx:196"}, "properties": {"repobilityId": "a670e04681223e7d", "scanner": "scanner-primary", "fingerprint": "d6be5ac8fb541445", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-faa2cdca054e828c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/VersionHistory.tsx:132"}, "properties": {"repobilityId": "a8bec975400390d4", "scanner": "scanner-primary", "fingerprint": "faa2cdca054e828c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c4f376f1b184d5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/AssetPanel.tsx:170"}, "properties": {"repobilityId": "2f88c28cbd19cc54", "scanner": "scanner-primary", "fingerprint": "0c4f376f1b184d5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab572ce082f35b91", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 packages/client/src/components/studio/InspectorPanel.tsx:50"}, "properties": {"repobilityId": "299320729d64aab0", "scanner": "scanner-primary", "fingerprint": "ab572ce082f35b91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-54886da89b89cd57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:131"}, "properties": {"repobilityId": "d1e963d2efd8ea18", "scanner": "scanner-primary", "fingerprint": "54886da89b89cd57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4352fa2f5f7cc368", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/studio/DocumentEditor.tsx:380"}, "properties": {"repobilityId": "984b358d3f43639a", "scanner": "scanner-primary", "fingerprint": "4352fa2f5f7cc368", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-170d5abef798003c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/ShareDialog.tsx:157"}, "properties": {"repobilityId": "b27c49f50cd37eb4", "scanner": "scanner-primary", "fingerprint": "170d5abef798003c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-088cb89397dfc2bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/studio/EditorBubbleMenu.tsx:230"}, "properties": {"repobilityId": "53592bd4733b706a", "scanner": "scanner-primary", "fingerprint": "088cb89397dfc2bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e282752b8ccd1b6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientAssetsTab.tsx:152"}, "properties": {"repobilityId": "e5146209cf9b732e", "scanner": "scanner-primary", "fingerprint": "e282752b8ccd1b6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d70e038ae95fa42d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/client/src/components/client-portfolio/ChatMarkdown.tsx:76"}, "properties": {"repobilityId": "47bc105f98a38dda", "scanner": "scanner-primary", "fingerprint": "d70e038ae95fa42d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a82eac80d9133e00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientRoster.tsx:302"}, "properties": {"repobilityId": "07ae6f500dcfb2c2", "scanner": "scanner-primary", "fingerprint": "a82eac80d9133e00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fadbff15330cbcde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/ClientDocumentsTab.tsx:206"}, "properties": {"repobilityId": "e43f7a55d896ce8c", "scanner": "scanner-primary", "fingerprint": "fadbff15330cbcde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14efd2f1ee7e2abe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/components/client-portfolio/DoNotContactSection.tsx:126"}, "properties": {"repobilityId": "6db1914428e541c2", "scanner": "scanner-primary", "fingerprint": "14efd2f1ee7e2abe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f27f66c8853d5918", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/URLScanner.tsx:1981"}, "properties": {"repobilityId": "2e00f9bda2b97ea1", "scanner": "scanner-primary", "fingerprint": "f27f66c8853d5918", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb313c3520e08885", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/ImageConverter.tsx:1444"}, "properties": {"repobilityId": "78319d9deb54ff3a", "scanner": "scanner-primary", "fingerprint": "eb313c3520e08885", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6a5b44db7aba327", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/AskAI.tsx:261"}, "properties": {"repobilityId": "edc817bd5ad59e01", "scanner": "scanner-primary", "fingerprint": "b6a5b44db7aba327", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56447726562a2970", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/RFPAnalyzer.tsx:627"}, "properties": {"repobilityId": "f61f31b17e2b8866", "scanner": "scanner-primary", "fingerprint": "56447726562a2970", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b45be8ab515916e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/TestimonialManager.tsx:1017"}, "properties": {"repobilityId": "23db7a42b2bf47d2", "scanner": "scanner-primary", "fingerprint": "b45be8ab515916e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-683f6253e0370b8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/client/src/pages/TestimonialManager.tsx:213"}, "properties": {"repobilityId": "a76464f425d867b0", "scanner": "scanner-primary", "fingerprint": "683f6253e0370b8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c75dd596a390084", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/SearchLibrary.tsx:2154"}, "properties": {"repobilityId": "4c2c3f0e267e8b24", "scanner": "scanner-primary", "fingerprint": "3c75dd596a390084", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ef86f1c301661fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/Webinars.tsx:239"}, "properties": {"repobilityId": "cc7b25fe7a9e064b", "scanner": "scanner-primary", "fingerprint": "4ef86f1c301661fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-feeca8c9c8645179", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/client/src/pages/PhotoUpload.tsx:368"}, "properties": {"repobilityId": "31f7f8867afb3251", "scanner": "scanner-primary", "fingerprint": "feeca8c9c8645179", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75c6fe215d4949b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/delete-shorter-dupes.ts:9"}, "properties": {"repobilityId": "966fa8fd2a893e99", "scanner": "scanner-primary", "fingerprint": "75c6fe215d4949b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e7b8b3290f21ccc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/cleanup-test-data.ts:16"}, "properties": {"repobilityId": "696f6bd6d4e45840", "scanner": "scanner-primary", "fingerprint": "2e7b8b3290f21ccc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d943d4d9b083540", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/scripts/scanner-verify.ts:396"}, "properties": {"repobilityId": "c4caed30a794517a", "scanner": "scanner-primary", "fingerprint": "1d943d4d9b083540", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f2f9e6387e9520b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/index.ts:196"}, "properties": {"repobilityId": "ac04c2b36447664c", "scanner": "scanner-primary", "fingerprint": "1f2f9e6387e9520b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f30847136cb01c46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/middleware/csrf.ts:56"}, "properties": {"repobilityId": "0a3f20e1403a839c", "scanner": "scanner-primary", "fingerprint": "f30847136cb01c46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1937892e067e556", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/applyMigration.ts:27"}, "properties": {"repobilityId": "bee4a16380ac8b12", "scanner": "scanner-primary", "fingerprint": "b1937892e067e556", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17c2197ea3b0d0a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientBrandKit.ts:25"}, "properties": {"repobilityId": "73ae5556edb1cfe7", "scanner": "scanner-primary", "fingerprint": "17c2197ea3b0d0a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a84d0d111741d737", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedAwards.ts:197"}, "properties": {"repobilityId": "75451f949a3ce368", "scanner": "scanner-primary", "fingerprint": "a84d0d111741d737", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3b11210eb1b73ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedTestimonials.ts:48"}, "properties": {"repobilityId": "46a1b5471390673c", "scanner": "scanner-primary", "fingerprint": "d3b11210eb1b73ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b30a2b52d1f8884", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/listPhotos.ts:17"}, "properties": {"repobilityId": "830102aaeef29284", "scanner": "scanner-primary", "fingerprint": "7b30a2b52d1f8884", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-889e1e3fd7487f27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importExcel.ts:16"}, "properties": {"repobilityId": "a86e2ce4ed773a8e", "scanner": "scanner-primary", "fingerprint": "889e1e3fd7487f27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42343be1c65bbf7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientsTable.ts:22"}, "properties": {"repobilityId": "391af7c153b5b3c7", "scanner": "scanner-primary", "fingerprint": "42343be1c65bbf7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ab07200b854b56a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyWebinarConstraints.ts:32"}, "properties": {"repobilityId": "7db2efab780dd774", "scanner": "scanner-primary", "fingerprint": "9ab07200b854b56a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14da8aa1a06b0018", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAwardFields.ts:22"}, "properties": {"repobilityId": "bd45538299dd526d", "scanner": "scanner-primary", "fingerprint": "14da8aa1a06b0018", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06b4e0d860821f36", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/backfillTestimonialNotes.ts:28"}, "properties": {"repobilityId": "2c13ab0c8e28f49f", "scanner": "scanner-primary", "fingerprint": "06b4e0d860821f36", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08dbbef6de164904", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePhotoUsageFields.ts:22"}, "properties": {"repobilityId": "fc10770e4115de73", "scanner": "scanner-primary", "fingerprint": "08dbbef6de164904", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9f6b60b7f680fe6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/checkDb.ts:26"}, "properties": {"repobilityId": "2d128d4c23a507c7", "scanner": "scanner-primary", "fingerprint": "c9f6b60b7f680fe6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b176302ac5adb72d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateAnswerForkField.ts:22"}, "properties": {"repobilityId": "f9e4546f22509708", "scanner": "scanner-primary", "fingerprint": "b176302ac5adb72d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2162ca372f14145b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedUsers.ts:38"}, "properties": {"repobilityId": "be7031687295ff3a", "scanner": "scanner-primary", "fingerprint": "2162ca372f14145b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76ebf190c4af5ab4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/verifyConstraints.ts:26"}, "properties": {"repobilityId": "c3abd99d8efd1f98", "scanner": "scanner-primary", "fingerprint": "76ebf190c4af5ab4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15f8a31aa84f0b33", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientQaLinks.ts:25"}, "properties": {"repobilityId": "1490980d40951dcb", "scanner": "scanner-primary", "fingerprint": "15f8a31aa84f0b33", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a83771b4479e76c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateClientDocuments.ts:25"}, "properties": {"repobilityId": "9e024db2af0e19ae", "scanner": "scanner-primary", "fingerprint": "a83771b4479e76c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a40406b2442b6fc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migrateTestimonialFields.ts:22"}, "properties": {"repobilityId": "dc2c16c47a322c88", "scanner": "scanner-primary", "fingerprint": "2a40406b2442b6fc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1a6e576f86cc0ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/resetPassword.ts:39"}, "properties": {"repobilityId": "b8930e8c2209851e", "scanner": "scanner-primary", "fingerprint": "d1a6e576f86cc0ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-015a141179b562a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/deleteTestPhotos.ts:18"}, "properties": {"repobilityId": "8eff4d10dc94acfc", "scanner": "scanner-primary", "fingerprint": "015a141179b562a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c33e8f4b5bcf3f36", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/seedClientDomains.ts:47"}, "properties": {"repobilityId": "bf20dc9ee52c5ef4", "scanner": "scanner-primary", "fingerprint": "c33e8f4b5bcf3f36", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25ad53a9ad45c700", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/migratePersonaSamples.ts:22"}, "properties": {"repobilityId": "5c3384a9c7e67711", "scanner": "scanner-primary", "fingerprint": "25ad53a9ad45c700", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5b58199e6b00ba6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/scripts/importLoopio.ts:18"}, "properties": {"repobilityId": "94582ab689cc1e7a", "scanner": "scanner-primary", "fingerprint": "d5b58199e6b00ba6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f07e400f8e7d1cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/meetings.ts:131"}, "properties": {"repobilityId": "a18734f7c3bfa4a6", "scanner": "scanner-primary", "fingerprint": "2f07e400f8e7d1cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-896a4db40b79e61a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/routes/screenshot.ts:288"}, "properties": {"repobilityId": "185bd419e27adf05", "scanner": "scanner-primary", "fingerprint": "896a4db40b79e61a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b32cd7172e37e32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalSyncService.ts:327"}, "properties": {"repobilityId": "98c1ec13b3c11fa7", "scanner": "scanner-primary", "fingerprint": "6b32cd7172e37e32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d204b5d6353e3df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/importService.ts:507"}, "properties": {"repobilityId": "99931cbd0cb91250", "scanner": "scanner-primary", "fingerprint": "5d204b5d6353e3df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d1dd3b10814ac46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/proposalAIService.ts:186"}, "properties": {"repobilityId": "7e9ff91dd22b8e85", "scanner": "scanner-primary", "fingerprint": "3d1dd3b10814ac46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d5e93a1ed665853", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/pipelineSyncService.ts:173"}, "properties": {"repobilityId": "045f8ac0dc92e6a0", "scanner": "scanner-primary", "fingerprint": "0d5e93a1ed665853", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ca7b3b85442fb00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/services/scannerService.ts:882"}, "properties": {"repobilityId": "c6c774db656b029f", "scanner": "scanner-primary", "fingerprint": "7ca7b3b85442fb00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16b6e3ce69c7cc9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/server/src/db/index.ts:60"}, "properties": {"repobilityId": "ca5b1e39172f69d6", "scanner": "scanner-primary", "fingerprint": "16b6e3ce69c7cc9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2281671f8c1942e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in coe-gap-analysis-report.html:2012"}, "properties": {"repobilityId": "0d3a5d6e828c15fc", "scanner": "scanner-primary", "fingerprint": "2281671f8c1942e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "coe-gap-analysis-report.html"}, "region": {"startLine": 2012}}}]}, {"ruleId": "scanner-5e62d7db616e6aea", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-gap-analysis.html:2012"}, "properties": {"repobilityId": "020c860d0b3feb9d", "scanner": "scanner-primary", "fingerprint": "5e62d7db616e6aea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/public/reports/coe-gap-analysis.html"}, "region": {"startLine": 2012}}}]}, {"ruleId": "scanner-75446accfdeee509", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/public/reports/coe-majors-redesign-mockup.html:1057"}, "properties": {"repobilityId": "54eb468b5d94721f", "scanner": "scanner-primary", "fingerprint": "75446accfdeee509", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/public/reports/coe-majors-redesign-mockup.html"}, "region": {"startLine": 1057}}}]}, {"ruleId": "scanner-77477bb11de38bbc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/QAExportDialog.tsx:153"}, "properties": {"repobilityId": "5ea62560d6f64b38", "scanner": "scanner-primary", "fingerprint": "77477bb11de38bbc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/QAExportDialog.tsx"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-bed88bb284e4604b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/MarkdownRenderer.tsx:172"}, "properties": {"repobilityId": "7ae098f616b1900e", "scanner": "scanner-primary", "fingerprint": "bed88bb284e4604b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/chat/MarkdownRenderer.tsx"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-58ad351ef77bfa48", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/chat/ChatMessage.tsx:79"}, "properties": {"repobilityId": "82b2278dcf817ca0", "scanner": "scanner-primary", "fingerprint": "58ad351ef77bfa48", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/chat/ChatMessage.tsx"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-737b5b0705dd5037", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/StudioChatSidebar.tsx:153"}, "properties": {"repobilityId": "e6c95fff68d038e6", "scanner": "scanner-primary", "fingerprint": "737b5b0705dd5037", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/StudioChatSidebar.tsx"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-1cb923f14db67e2e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/StudioHumanizerPanel.tsx:173"}, "properties": {"repobilityId": "26221a5a79dc452b", "scanner": "scanner-primary", "fingerprint": "1cb923f14db67e2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/StudioHumanizerPanel.tsx"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-89f26a22b62b89aa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/ExportDialog.tsx:106"}, "properties": {"repobilityId": "ed2a43f674979d53", "scanner": "scanner-primary", "fingerprint": "89f26a22b62b89aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/ExportDialog.tsx"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-e9ec88f664e724bb", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in packages/client/src/components/studio/ExportDialog.tsx:167"}, "properties": {"repobilityId": "52c8893c201e648b", "scanner": "scanner-primary", "fingerprint": "e9ec88f664e724bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/ExportDialog.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-6f4ed7b7d96e9c44", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/studio/DocumentEditor.tsx:380"}, "properties": {"repobilityId": "a14f26a03d47ec43", "scanner": "scanner-primary", "fingerprint": "6f4ed7b7d96e9c44", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/DocumentEditor.tsx"}, "region": {"startLine": 380}}}]}, {"ruleId": "scanner-923a466ef3eea3e3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/client/src/components/studio/DocumentEditor.tsx:149"}, "properties": {"repobilityId": "1ed7cc0f8756b646", "scanner": "scanner-primary", "fingerprint": "923a466ef3eea3e3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/studio/DocumentEditor.tsx"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-862d6315d7fa900f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/client/src/components/client-portfolio/ChatMarkdown.tsx:76"}, "properties": {"repobilityId": "cf94ab1c82089133", "scanner": "scanner-primary", "fingerprint": "862d6315d7fa900f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/components/client-portfolio/ChatMarkdown.tsx"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-890f9983e829059f", "level": "note", "message": {"text": "Insecure pattern 'document_write' in packages/client/src/pages/URLScanner.tsx:1632"}, "properties": {"repobilityId": "8091c26bcce708fa", "scanner": "scanner-primary", "fingerprint": "890f9983e829059f", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/pages/URLScanner.tsx"}, "region": {"startLine": 1632}}}]}, {"ruleId": "scanner-b44482090a3130aa", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in packages/client/src/pages/URLScanner.tsx:2563"}, "properties": {"repobilityId": "22669e576930d8f1", "scanner": "scanner-primary", "fingerprint": "b44482090a3130aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/client/src/pages/URLScanner.tsx"}, "region": {"startLine": 2563}}}]}, {"ruleId": "scanner-3def2d0dcd9a074c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packages/server/scripts/scanner-verify.ts:13"}, "properties": {"repobilityId": "94192e0c9f112263", "scanner": "scanner-primary", "fingerprint": "3def2d0dcd9a074c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/server/scripts/scanner-verify.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-5903c4d37c21c21f", "level": "error", "message": {"text": "Possible secret in packages/server/src/scripts/seedUsers.ts"}, "properties": {"repobilityId": "742a2789ca812789", "scanner": "scanner-primary", "fingerprint": "5903c4d37c21c21f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/server/src/scripts/seedUsers.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-9372e2f452d0ea25", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packages/server/src/routes/meetings.ts:14"}, "properties": {"repobilityId": "e19a9943feeba347", "scanner": "scanner-primary", "fingerprint": "9372e2f452d0ea25", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/server/src/routes/meetings.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-1e64e06ee8b7de9f", "level": "note", "message": {"text": "Very large file: api/index.ts (8980 lines)"}, "properties": {"repobilityId": "28d1d92c09c81fb9", "scanner": "scanner-primary", "fingerprint": "1e64e06ee8b7de9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-22ba9a03097b874e", "level": "note", "message": {"text": "Very large file: packages/client/src/components/SettingsPanel.tsx (1506 lines)"}, "properties": {"repobilityId": "5b27d87e93232ae9", "scanner": "scanner-primary", "fingerprint": "22ba9a03097b874e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d95e84bf7c02fe01", "level": "note", "message": {"text": "Very large file: packages/client/src/components/SitemapCaptureModal.tsx (2176 lines)"}, "properties": {"repobilityId": "e6307b916ea834f2", "scanner": "scanner-primary", "fingerprint": "d95e84bf7c02fe01", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d7d73de7075df8e", "level": "note", "message": {"text": "Very large file: packages/client/src/lib/api.ts (2487 lines)"}, "properties": {"repobilityId": "69ae2a07cf25c2cc", "scanner": "scanner-primary", "fingerprint": "6d7d73de7075df8e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a4aa6d1922cf40a5", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/URLScanner.tsx (3256 lines)"}, "properties": {"repobilityId": "12957710600be005", "scanner": "scanner-primary", "fingerprint": "a4aa6d1922cf40a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d47b8ea3870b380a", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/ImageConverter.tsx (2770 lines)"}, "properties": {"repobilityId": "9bd91a0699a78060", "scanner": "scanner-primary", "fingerprint": "d47b8ea3870b380a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ae37fcae2df6935", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/RFPAnalyzer.tsx (1162 lines)"}, "properties": {"repobilityId": "8f2ad100e126ab9f", "scanner": "scanner-primary", "fingerprint": "4ae37fcae2df6935", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9dc05f20fef3e203", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/TestimonialManager.tsx (1711 lines)"}, "properties": {"repobilityId": "158019114365d142", "scanner": "scanner-primary", "fingerprint": "9dc05f20fef3e203", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3d34cb5761a27770", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/AIHumanizer.tsx (2286 lines)"}, "properties": {"repobilityId": "a49fe1d01fa3b40b", "scanner": "scanner-primary", "fingerprint": "3d34cb5761a27770", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-53b1fcfc9d60db4f", "level": "note", "message": {"text": "Very large file: packages/client/src/pages/SearchLibrary.tsx (3280 lines)"}, "properties": {"repobilityId": "759e3df6f98fc53c", "scanner": "scanner-primary", "fingerprint": "53b1fcfc9d60db4f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8484da619897f038", "level": "note", "message": {"text": "Very large file: packages/server/src/routes/clientSuccess.ts (1551 lines)"}, "properties": {"repobilityId": "34b8917b9cf2d1e1", "scanner": "scanner-primary", "fingerprint": "8484da619897f038", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7438e4ade60c890f", "level": "note", "message": {"text": "Very large file: packages/server/src/services/proposalAIService.ts (1734 lines)"}, "properties": {"repobilityId": "432b5df5ae5f11ff", "scanner": "scanner-primary", "fingerprint": "7438e4ade60c890f", "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": "6f6418906ea5a80b", "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": "0e909eadf439ebc0", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b739f2f2be1d714d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/server/package.json"}, "properties": {"repobilityId": "d7cb4fafc3b292b2", "scanner": "scanner-primary", "fingerprint": "b739f2f2be1d714d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9d9fef3dbd24c34f", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "945075a8ec40c8d5", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "7ef4e2c1924d63c0", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "c67c09bd737bbc58", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "906099c4c9a890c3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "20413c455449fa6f", "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": "e798ebf72c878164", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-fecc51b169640ed3", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/index.ts:8775"}, "properties": {"repobilityId": "112998811dfdd9d9", "scanner": "scanner-primary", "fingerprint": "fecc51b169640ed3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfbf3938e42a0015", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/index.ts:8944"}, "properties": {"repobilityId": "e0db3afa8857b3cc", "scanner": "scanner-primary", "fingerprint": "cfbf3938e42a0015", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-64fbeec27fac717c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/components/studio/PhotoPicker.tsx:31"}, "properties": {"repobilityId": "5e94ac28b91ab838", "scanner": "scanner-primary", "fingerprint": "64fbeec27fac717c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a3baacc89b258515", "level": "note", "message": {"text": "Legacy-named symbol `migan_pipeline_v2` in packages/client/src/workers/inpaintWorker.ts:17"}, "properties": {"repobilityId": "a83cb4af272eb13a", "scanner": "scanner-primary", "fingerprint": "a3baacc89b258515", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bc18f6467f014426", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/workers/inpaintWorker.ts:53"}, "properties": {"repobilityId": "ca6026e5ba2c1a90", "scanner": "scanner-primary", "fingerprint": "bc18f6467f014426", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2de611edf0a8c3dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/PitchDeckDesigner.tsx:147"}, "properties": {"repobilityId": "ddb2fd946097a96e", "scanner": "scanner-primary", "fingerprint": "2de611edf0a8c3dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33dda5f400b027f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/ImageConverter.tsx:1322"}, "properties": {"repobilityId": "b1d878aa04ffdb04", "scanner": "scanner-primary", "fingerprint": "33dda5f400b027f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6312d618fadad5ce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/client/src/pages/AIHumanizer.tsx:1773"}, "properties": {"repobilityId": "a3e11f413ba59ae4", "scanner": "scanner-primary", "fingerprint": "6312d618fadad5ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9640a6ce8a67b8ad", "level": "none", "message": {"text": "Commented-code block (10 lines) in packages/server/src/routes/screenshot.ts:31"}, "properties": {"repobilityId": "bcb8ab14f2daabad", "scanner": "scanner-primary", "fingerprint": "9640a6ce8a67b8ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d878ed0b240a664", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/server/src/routes/screenshot.ts:266"}, "properties": {"repobilityId": "ee55e6f2413f7341", "scanner": "scanner-primary", "fingerprint": "0d878ed0b240a664", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af022f937dd5b7fd", "level": "note", "message": {"text": "9 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5597384795dea7a4", "scanner": "scanner-primary", "fingerprint": "af022f937dd5b7fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-8dfca3c239fa005b", "level": "warning", "message": {"text": "Frontend route `/insights` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "properties": {"repobilityId": "680b9a96166af885", "scanner": "scanner-primary", "fingerprint": "8dfca3c239fa005b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a87aec4f48d60fc0", "level": "warning", "message": {"text": "Frontend route `/case-studies` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "properties": {"repobilityId": "ffa38501e4218d90", "scanner": "scanner-primary", "fingerprint": "a87aec4f48d60fc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0161ba653527276f", "level": "warning", "message": {"text": "Frontend route `/unified-ai` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "properties": {"repobilityId": "52d4a94f315e151a", "scanner": "scanner-primary", "fingerprint": "0161ba653527276f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2a9335cc66d4cda9", "level": "warning", "message": {"text": "Frontend route `/scanner/accessibility` has no Link/navigate to it \u2014 packages/client/src/App.tsx"}, "properties": {"repobilityId": "7593efc27cade41f", "scanner": "scanner-primary", "fingerprint": "2a9335cc66d4cda9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a631fae37bb118f8", "level": "error", "message": {"text": "Dangling fetch: GET https://www.youvisit.com/tour/${instId} (api/index.ts:8805)"}, "properties": {"repobilityId": "ed96d78dd7953d82", "scanner": "scanner-primary", "fingerprint": "a631fae37bb118f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93cd7c16d20e4f74", "level": "error", "message": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:985)"}, "properties": {"repobilityId": "ab1ed734dc149653", "scanner": "scanner-primary", "fingerprint": "93cd7c16d20e4f74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7004e590ffd36b69", "level": "error", "message": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1056)"}, "properties": {"repobilityId": "eefd60c3b43493db", "scanner": "scanner-primary", "fingerprint": "7004e590ffd36b69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7529fd3572189ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1182)"}, "properties": {"repobilityId": "74fa2e9de58dff3f", "scanner": "scanner-primary", "fingerprint": "f7529fd3572189ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08ce9fea1da59ec3", "level": "error", "message": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1281)"}, "properties": {"repobilityId": "855d9b2962b65251", "scanner": "scanner-primary", "fingerprint": "08ce9fea1da59ec3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-719d964d0b9c4a4c", "level": "error", "message": {"text": "Dangling fetch: POST /api/screenshot (packages/client/src/components/SitemapCaptureModal.tsx:1392)"}, "properties": {"repobilityId": "bc6fe6861ddbdf6c", "scanner": "scanner-primary", "fingerprint": "719d964d0b9c4a4c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6751460dc63cd637", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:56)"}, "properties": {"repobilityId": "94d2e1dfd8332a62", "scanner": "scanner-primary", "fingerprint": "6751460dc63cd637", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f636d33433ba6ea1", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/status (packages/client/src/contexts/AuthContext.tsx:83)"}, "properties": {"repobilityId": "ec98de802fedee45", "scanner": "scanner-primary", "fingerprint": "f636d33433ba6ea1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9231cbf285ad46b4", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (packages/client/src/contexts/AuthContext.tsx:95)"}, "properties": {"repobilityId": "e32d68daa6e18de1", "scanner": "scanner-primary", "fingerprint": "9231cbf285ad46b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d90b3059882e85a", "level": "error", "message": {"text": "Dangling fetch: POST /api/scanner/scan (packages/client/src/pages/URLScanner.tsx:679)"}, "properties": {"repobilityId": "7f4212fe609c04d6", "scanner": "scanner-primary", "fingerprint": "2d90b3059882e85a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21ccf688bbe010f5", "level": "error", "message": {"text": "Dangling fetch: POST /api/scanner/ai/fix-issue (packages/client/src/pages/URLScanner.tsx:1657)"}, "properties": {"repobilityId": "851635d49323ef38", "scanner": "scanner-primary", "fingerprint": "21ccf688bbe010f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-007da9449780075d", "level": "error", "message": {"text": "Dangling fetch: POST /api/scanner/ai/alt-text (packages/client/src/pages/URLScanner.tsx:1726)"}, "properties": {"repobilityId": "ba80480bd6d0328d", "scanner": "scanner-primary", "fingerprint": "007da9449780075d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e393a49bb313aeb", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/change-password (packages/client/src/pages/ChangePassword.tsx:32)"}, "properties": {"repobilityId": "a25aab84f7cebe29", "scanner": "scanner-primary", "fingerprint": "6e393a49bb313aeb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d40449e60d0a5189", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (packages/client/src/pages/Login.tsx:27)"}, "properties": {"repobilityId": "b67887362d31c10f", "scanner": "scanner-primary", "fingerprint": "d40449e60d0a5189", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-afc96d397ca2d728", "level": "error", "message": {"text": "Dangling fetch: POST /api/scanner/headings (packages/client/src/pages/ScannerPortal.tsx:117)"}, "properties": {"repobilityId": "1377d49254fb2767", "scanner": "scanner-primary", "fingerprint": "afc96d397ca2d728", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a5487bf8cad74e3c", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/register (packages/client/src/pages/Register.tsx:34)"}, "properties": {"repobilityId": "fc15ed0fa27ab974", "scanner": "scanner-primary", "fingerprint": "a5487bf8cad74e3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "44e30cd47520b535", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "89ade060348e2370", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-415e0ba6e85c0f53", "level": "note", "message": {"text": "Unused endpoint: GET /api/photos/file/:storageKey"}, "properties": {"repobilityId": "a3959b42bad45453", "scanner": "scanner-primary", "fingerprint": "415e0ba6e85c0f53", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b226dcbf346abf99", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/avatar/:userId"}, "properties": {"repobilityId": "740240e60881f7a0", "scanner": "scanner-primary", "fingerprint": "b226dcbf346abf99", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57555b979172a46a", "level": "note", "message": {"text": "Unused endpoint: USE /storage/photos"}, "properties": {"repobilityId": "31d21f0f8943259a", "scanner": "scanner-primary", "fingerprint": "57555b979172a46a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bb3714794b14146", "level": "note", "message": {"text": "Unused endpoint: POST /query"}, "properties": {"repobilityId": "be7bc9fa96d3c6f9", "scanner": "scanner-primary", "fingerprint": "1bb3714794b14146", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f4ee569e1562771", "level": "note", "message": {"text": "Unused endpoint: POST /stream"}, "properties": {"repobilityId": "57e653238fc0517a", "scanner": "scanner-primary", "fingerprint": "5f4ee569e1562771", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55f3127c48b96001", "level": "note", "message": {"text": "Unused endpoint: POST /adapt"}, "properties": {"repobilityId": "c018ca198f383562", "scanner": "scanner-primary", "fingerprint": "55f3127c48b96001", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4024cc8814b7e0bc", "level": "note", "message": {"text": "Unused endpoint: POST /case-studies"}, "properties": {"repobilityId": "4339fb5b4bcc5d7e", "scanner": "scanner-primary", "fingerprint": "4024cc8814b7e0bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9283e2af05510757", "level": "note", "message": {"text": "Unused endpoint: POST /case-studies/stream"}, "properties": {"repobilityId": "6d20b3f92ff74549", "scanner": "scanner-primary", "fingerprint": "9283e2af05510757", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-544eab7ed96a0a05", "level": "note", "message": {"text": "Unused endpoint: POST /testimonial-finder"}, "properties": {"repobilityId": "cf008c281f39d022", "scanner": "scanner-primary", "fingerprint": "544eab7ed96a0a05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5cadce233d986fd", "level": "note", "message": {"text": "Unused endpoint: POST /client-chat/stream"}, "properties": {"repobilityId": "7e44daa7b32e8468", "scanner": "scanner-primary", "fingerprint": "f5cadce233d986fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46b20e87954a8015", "level": "note", "message": {"text": "Unused endpoint: POST /client-gap-analysis"}, "properties": {"repobilityId": "529968cd7f1dfac0", "scanner": "scanner-primary", "fingerprint": "46b20e87954a8015", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6cc59e5eb250d4cb", "level": "note", "message": {"text": "Unused endpoint: POST /adapt-bulk"}, "properties": {"repobilityId": "04f65a31a28c3a88", "scanner": "scanner-primary", "fingerprint": "6cc59e5eb250d4cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70da460266d7bd16", "level": "note", "message": {"text": "Unused endpoint: POST /alt-text"}, "properties": {"repobilityId": "53c26e286080e4c0", "scanner": "scanner-primary", "fingerprint": "70da460266d7bd16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "9f13be94e946d69b", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "4a0e7952d50c7ea2", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe9bb486644f008", "level": "note", "message": {"text": "Unused endpoint: POST /change-password"}, "properties": {"repobilityId": "0667d72af7c233c4", "scanner": "scanner-primary", "fingerprint": "4fe9bb486644f008", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "0bbf66c32726f936", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e7a9e46ce575dc4", "level": "note", "message": {"text": "Unused endpoint: POST /complete-tour"}, "properties": {"repobilityId": "6bbb278c4afc2580", "scanner": "scanner-primary", "fingerprint": "4e7a9e46ce575dc4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9088e9b5172e06b8", "level": "note", "message": {"text": "Unused endpoint: POST /reset-tour"}, "properties": {"repobilityId": "f71c1ab479154c08", "scanner": "scanner-primary", "fingerprint": "9088e9b5172e06b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2060053b3bc0a182", "level": "note", "message": {"text": "Unused endpoint: POST /avatar"}, "properties": {"repobilityId": "1803080639782d0e", "scanner": "scanner-primary", "fingerprint": "2060053b3bc0a182", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-def1c4677f533a77", "level": "note", "message": {"text": "Unused endpoint: DELETE /avatar"}, "properties": {"repobilityId": "d3a8b3536aeaf9d1", "scanner": "scanner-primary", "fingerprint": "def1c4677f533a77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "3def1591957e899f", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e9dc0625bf548f6", "level": "note", "message": {"text": "Unused endpoint: GET /sync/status"}, "properties": {"repobilityId": "3ee6955d258d67dd", "scanner": "scanner-primary", "fingerprint": "5e9dc0625bf548f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-626223c50a2fb86c", "level": "note", "message": {"text": "Unused endpoint: POST /sync/trigger"}, "properties": {"repobilityId": "c94b4aed5baa86b1", "scanner": "scanner-primary", "fingerprint": "626223c50a2fb86c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dfa339e16c7ac75f", "level": "note", "message": {"text": "Unused endpoint: USE /do-not-contact"}, "properties": {"repobilityId": "d297177a823bb4b5", "scanner": "scanner-primary", "fingerprint": "dfa339e16c7ac75f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0729b84d4e27d0b9", "level": "note", "message": {"text": "Unused endpoint: GET /clients"}, "properties": {"repobilityId": "7eff80784fe629fb", "scanner": "scanner-primary", "fingerprint": "0729b84d4e27d0b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a22e4396af9d5790", "level": "note", "message": {"text": "Unused endpoint: POST /clients"}, "properties": {"repobilityId": "11730e0ccc6178cf", "scanner": "scanner-primary", "fingerprint": "a22e4396af9d5790", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24986b75128e6b03", "level": "note", "message": {"text": "Unused endpoint: PUT /clients/:id"}, "properties": {"repobilityId": "d10d9f25a9c499d2", "scanner": "scanner-primary", "fingerprint": "24986b75128e6b03", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a39c70474572f687", "level": "note", "message": {"text": "Unused endpoint: DELETE /clients/:id"}, "properties": {"repobilityId": "e7799e2a40adb076", "scanner": "scanner-primary", "fingerprint": "a39c70474572f687", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b378c4799e9d2287", "level": "note", "message": {"text": "Unused endpoint: GET /entries"}, "properties": {"repobilityId": "8aa4d8a2caa16325", "scanner": "scanner-primary", "fingerprint": "b378c4799e9d2287", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2dc06f07caf027b7", "level": "note", "message": {"text": "Unused endpoint: POST /entries"}, "properties": {"repobilityId": "6fb52327321091d5", "scanner": "scanner-primary", "fingerprint": "2dc06f07caf027b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bff1382b4cd28b64", "level": "note", "message": {"text": "Unused endpoint: DELETE /entries/:id"}, "properties": {"repobilityId": "683746da8c4e6dbd", "scanner": "scanner-primary", "fingerprint": "bff1382b4cd28b64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf7b44dd51a83c5b", "level": "note", "message": {"text": "Unused endpoint: PATCH /entries/:id/usage"}, "properties": {"repobilityId": "72088ed10ea72ecd", "scanner": "scanner-primary", "fingerprint": "cf7b44dd51a83c5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06d6991bc999465b", "level": "note", "message": {"text": "Unused endpoint: GET /results"}, "properties": {"repobilityId": "87dee50b84f2890f", "scanner": "scanner-primary", "fingerprint": "06d6991bc999465b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1edf4d6b44de8a95", "level": "note", "message": {"text": "Unused endpoint: POST /results"}, "properties": {"repobilityId": "786c1907dfa9dd3f", "scanner": "scanner-primary", "fingerprint": "1edf4d6b44de8a95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c28ef2c3205fbf1b", "level": "note", "message": {"text": "Unused endpoint: DELETE /results/:id"}, "properties": {"repobilityId": "662a28d144e38b34", "scanner": "scanner-primary", "fingerprint": "c28ef2c3205fbf1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-585b14e9a7a76b0c", "level": "note", "message": {"text": "Unused endpoint: PATCH /results/:id/usage"}, "properties": {"repobilityId": "2d59b48848a90c10", "scanner": "scanner-primary", "fingerprint": "585b14e9a7a76b0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-819c21404d1f01a9", "level": "note", "message": {"text": "Unused endpoint: GET /testimonials"}, "properties": {"repobilityId": "8d5022e7aaba4a5d", "scanner": "scanner-primary", "fingerprint": "819c21404d1f01a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8d8cd8d20b9743f", "level": "note", "message": {"text": "Unused endpoint: GET /testimonials/:id"}, "properties": {"repobilityId": "be88b65932c35c1c", "scanner": "scanner-primary", "fingerprint": "d8d8cd8d20b9743f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39631f94a3d14319", "level": "note", "message": {"text": "Unused endpoint: POST /testimonials"}, "properties": {"repobilityId": "91bd2ce6fd9f6fd0", "scanner": "scanner-primary", "fingerprint": "39631f94a3d14319", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0465c5a48482c7fd", "level": "note", "message": {"text": "Unused endpoint: PUT /testimonials/:id"}, "properties": {"repobilityId": "aa415c96875e95d0", "scanner": "scanner-primary", "fingerprint": "0465c5a48482c7fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37ecf17a2f7ea749", "level": "note", "message": {"text": "Unused endpoint: PATCH /testimonials/:id/status"}, "properties": {"repobilityId": "a81122e2c0ff5230", "scanner": "scanner-primary", "fingerprint": "37ecf17a2f7ea749", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37b6bf7d14c9a39e", "level": "note", "message": {"text": "Unused endpoint: PATCH /testimonials/:id/usage"}, "properties": {"repobilityId": "99f1407d73b95a8d", "scanner": "scanner-primary", "fingerprint": "37b6bf7d14c9a39e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-106d590a5f74623d", "level": "note", "message": {"text": "Unused endpoint: PATCH /testimonials/:id/featured"}, "properties": {"repobilityId": "52731b2100addaf3", "scanner": "scanner-primary", "fingerprint": "106d590a5f74623d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed4212e37c6f7bd5", "level": "note", "message": {"text": "Unused endpoint: POST /testimonials/bulk-status"}, "properties": {"repobilityId": "f15ecbb8a7811921", "scanner": "scanner-primary", "fingerprint": "ed4212e37c6f7bd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c85ca548d59b2b01", "level": "note", "message": {"text": "Unused endpoint: DELETE /testimonials/:id"}, "properties": {"repobilityId": "ca762b73f18af87d", "scanner": "scanner-primary", "fingerprint": "c85ca548d59b2b01", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d33b52bab8cdaad5", "level": "note", "message": {"text": "Unused endpoint: GET /awards"}, "properties": {"repobilityId": "33118e07a97d4f40", "scanner": "scanner-primary", "fingerprint": "d33b52bab8cdaad5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a8cfd4785de7b6c", "level": "note", "message": {"text": "Unused endpoint: POST /awards"}, "properties": {"repobilityId": "6b078a15dd02da7b", "scanner": "scanner-primary", "fingerprint": "6a8cfd4785de7b6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}