{"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-bb4a962c0f2a59e2", "name": "Possibly dead Python function: sse_text_stream", "shortDescription": {"text": "Possibly dead Python function: sse_text_stream"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c7185a58c69b4ac", "name": "Possibly dead Python function: add_audit_entry", "shortDescription": {"text": "Possibly dead Python function: add_audit_entry"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6feac56e262c215f", "name": "Possibly dead Python function: require_permission", "shortDescription": {"text": "Possibly dead Python function: require_permission"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9bbe3acd9c2911a", "name": "Possibly dead Python function: require_role", "shortDescription": {"text": "Possibly dead Python function: require_role"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af85f299b064a7be", "name": "Possibly dead Python function: is_role_at_least", "shortDescription": {"text": "Possibly dead Python function: is_role_at_least"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8187f4a167ab19f", "name": "Stray `console.log` in TS/JS \u2014 frontend/public/pwa-sw.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/pwa-sw.js:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b5ff3f8ee7dc427", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/stores/ectd-adapter.ts:329", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/stores/ectd-adapter.ts:329"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51c7cd23b937d04f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/WorkflowTemplateSelector.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/WorkflowTemplateSelector.tsx:402"}, "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-59702643c569851f", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ServiceWorkerKiller.tsx:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ServiceWorkerKiller.tsx: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-0fa8205f567b2309", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ComplianceReportPanel.tsx:514", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ComplianceReportPanel.tsx:514"}, "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-c3ab902b78015524", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/PWARegistration.tsx:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/PWARegistration.tsx: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-ad9417859173be14", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/api-docs/APIDocsViewer.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/api-docs/APIDocsViewer.tsx:167"}, "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-87ff5963027224ff", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/QuickModuleSwitcher.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/QuickModuleSwitcher.tsx:380"}, "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-50a1b71e69795170", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ThemeModeToggle.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ThemeModeToggle.tsx:153"}, "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-a94b4df8d37157ad", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Sidebar.tsx:529", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Sidebar.tsx:529"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ba05419c972eb3f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ScopeSelector.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ScopeSelector.tsx:85"}, "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-d1fd24bd36096644", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/TierSwitcher.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/TierSwitcher.tsx:95"}, "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-cd20ae0b3e18fc73", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/FilterBar.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/FilterBar.tsx:82"}, "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-3c3223b91cafe261", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/PersonaSwitcher.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/PersonaSwitcher.tsx:53"}, "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-67d2cf84f1106a45", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Header.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Header.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-fab798229de9a30c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/TimelineSlider.tsx:349", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/TimelineSlider.tsx:349"}, "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-dbe4388001b87f4b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/VisitListView.tsx:319", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/VisitListView.tsx:319"}, "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-beaeff82c6ddc733", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SiteListView.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SiteListView.tsx:315"}, "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-0dfadd35cb9c09f1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/QueryListView.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/QueryListView.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-469117bb1d1bf297", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SubjectListView.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SubjectListView.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef319fc5b23c491d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/QMSCascadeStrip.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/QMSCascadeStrip.tsx:57"}, "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-b4fca7744efcee79", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/SOPLibraryPanel.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/SOPLibraryPanel.tsx:288"}, "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-77e5769103cf7f34", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoAnalyticsDashboard.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoAnalyticsDashboard.tsx:129"}, "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-0d7b506487d96bba", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoDashboard.tsx:362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoDashboard.tsx:362"}, "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-9d2fe2f802b9265d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/GuidedDemoOverlay.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/GuidedDemoOverlay.tsx:264"}, "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-fa2324c89bc6230d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleEventFeed.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleEventFeed.tsx:129"}, "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-012e010b591ccde6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/PresenterDashboard.tsx:572", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/PresenterDashboard.tsx:572"}, "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-33d591ae9719b8bf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleActivityDashboard.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleActivityDashboard.tsx:221"}, "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-cf9c5cc44f848cb3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickPresetSwitcher.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickPresetSwitcher.tsx:139"}, "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-5eabbba6e648f7b3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickHighlightsOverlay.tsx:341", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickHighlightsOverlay.tsx:341"}, "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-8ca1e685288037c0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoHealthMonitor.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoHealthMonitor.tsx:284"}, "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-626e000a87929a06", "name": "Icon-only button without accessible name \u2014 frontend/src/components/demo/CrossModuleLineageStatus.tsx:205", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/demo/CrossModuleLineageStatus.tsx:205"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48091e4ccd68d46e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SignalAnalysisPanel.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SignalAnalysisPanel.tsx:69"}, "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-29c03cf0900240b6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:320"}, "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-ed4fc372196efd6c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:6", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:618"}, "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-a217c25824ebb51c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/AggregateReportGenerationPanel.tsx:4", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/AggregateReportGenerationPanel.tsx:448"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad7b8fb7643ae682", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/XMLPreviewPanel.tsx:305", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/XMLPreviewPanel.tsx:305"}, "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-947f2d490d6be131", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410"}, "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-702b110d39ae53bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ProfessionalDocumentPreview.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ProfessionalDocumentPreview.tsx:297"}, "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-88d5e4a74425302b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/CitationPanel.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/CitationPanel.tsx:232"}, "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-2e31639415a93d2f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReviewDecisionDialog.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReviewDecisionDialog.tsx:193"}, "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-7de6155010ac731f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/EnhancedReviewWorkflowPanel.tsx:5", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/EnhancedReviewWorkflowPanel.tsx:577"}, "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-68812696c8c7079f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ComponentsPanel.tsx:219", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ComponentsPanel.tsx:219"}, "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-f872fb939eae5e5f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SectionGenerationWorkflow.tsx:860", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SectionGenerationWorkflow.tsx:860"}, "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-f4d7467f10be23fa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourcesPanel.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourcesPanel.tsx:322"}, "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-cf13694a718520dd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/InContextCommentSystem.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/InContextCommentSystem.tsx:181"}, "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-ee5b38de6094734d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:99"}, "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-698320e20994d298", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:481", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:481"}, "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-6980134c07931996", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:395", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:395"}, "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-ca7fd0737f45d7ca", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/DocumentEditor.tsx:663", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/DocumentEditor.tsx:663"}, "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-053c096a7f137d34", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ChunkPreviewPanel.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ChunkPreviewPanel.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3300dfeb47ca31da", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReconciliationReportPanel.tsx:405", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReconciliationReportPanel.tsx:405"}, "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-7ca4cdab64a0f724", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentLifecyclePanel.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentLifecyclePanel.tsx:119"}, "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-940038482e7aa4f6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/AISectionEditor.tsx:787", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/AISectionEditor.tsx:787"}, "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-78d9700018f383d2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AISectionEditor.tsx:501", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AISectionEditor.tsx:501"}, "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-16d0a15c9bbb9f14", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourceIngestionPanel.tsx:656", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourceIngestionPanel.tsx:656"}, "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-a5062d96e11707b9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/ObservabilityDashboard.tsx:452", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/ObservabilityDashboard.tsx:452"}, "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-c966277a897ff3f8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/offline/OfflineCacheManager.tsx:301", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/offline/OfflineCacheManager.tsx:301"}, "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-9c28d37f0ff28ad9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQContextPanel.tsx:508", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQContextPanel.tsx:508"}, "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-a9e9058dc2c0caf0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQCascadeStrip.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQCascadeStrip.tsx:69"}, "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-9db1b5e8dda81ea1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:268"}, "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-3d62beb04bfc82c2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:533", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:533"}, "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-27c0ec7513014380", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQEvidenceGatherer.tsx:542", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQEvidenceGatherer.tsx:542"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-792c0689cdaef447", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926"}, "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-8fea7fc28297c3ba", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIGenerationPanel.tsx:327", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIGenerationPanel.tsx:327"}, "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-f73f2bf948a3144c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/HAQAnalyticsDashboard.tsx:1033", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/HAQAnalyticsDashboard.tsx:1033"}, "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-94fcebf4cbf79f92", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/ResilienceAnalyticsDashboard.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/ResilienceAnalyticsDashboard.tsx:356"}, "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-8617603bc1c8cda4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/glp/GLPEDCIntegrationTab.tsx:413", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/glp/GLPEDCIntegrationTab.tsx:413"}, "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-1d024ec7b0e77bd6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/intelligence/ResponseIntelligencePanel.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/intelligence/ResponseIntelligencePanel.tsx:209"}, "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-85cb8c20e779dc7e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CommandPalette.tsx:609", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CommandPalette.tsx:609"}, "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-3ce4229510a2b449", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ProductContextSelector.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ProductContextSelector.tsx:140"}, "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-c181277869b50cd0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/Select.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/Select.tsx:257"}, "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-b046ad32a6feac08", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/WorkspaceLayout.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/WorkspaceLayout.tsx:286"}, "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-877fdeb595766f01", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ui/ResizablePanel.tsx:53", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ui/ResizablePanel.tsx:53"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56018582c076cabb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/FileUpload.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/FileUpload.tsx:503"}, "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-b2e73670aa49e681", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/EmptyStates.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/EmptyStates.tsx:144"}, "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-9fe5ab9a34671d73", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompactStatBar.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompactStatBar.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-8ac0d9166b3c75cc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ResponsivePrimitives.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ResponsivePrimitives.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bcbbe10bd8558d36", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UserSwitcher.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UserSwitcher.tsx:149"}, "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-5dd7f3aeafcf58e4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenLayout.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenLayout.tsx:309"}, "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-03a9b9c4d0ef5120", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CascadeBanner.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CascadeBanner.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fd5af08e048047d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/QuickActionDrawer.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/QuickActionDrawer.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-47050470e2ddbfd7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenHeader.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenHeader.tsx:111"}, "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-b674a5aa47f0f341", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompoundLifecycleStrip.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompoundLifecycleStrip.tsx:201"}, "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-c6bb3e9d37aeef30", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ModuleQuickAccessCard.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ModuleQuickAccessCard.tsx:229"}, "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-da4466572cfe2b2a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AuditTimeline.tsx:689", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AuditTimeline.tsx:689"}, "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-debfe83156a1a01a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AlertCard.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AlertCard.tsx:39"}, "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-8dfc7c73353f65fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/HAQResponseEditorV2.tsx:308", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/HAQResponseEditorV2.tsx:308"}, "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-bf0e5a0297076e5a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/DrillableStatCard.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/DrillableStatCard.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36bec42321e64b47", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UnifiedDocumentBrowser.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UnifiedDocumentBrowser.tsx:228"}, "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-7a2834106a5d9bc8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CTMSScreen.tsx:627", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CTMSScreen.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-9c21845e5b3abc42", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RdTimelineScreen.tsx:855", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RdTimelineScreen.tsx:855"}, "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-01740c66ce7bca7e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDWorkspaceScreen.tsx:806", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDWorkspaceScreen.tsx:806"}, "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-d6f90e4b8370c466", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ProgramDetailScreen.tsx:420", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ProgramDetailScreen.tsx:420"}, "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-a757a9d1ec3078d1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/QMSScreen.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/QMSScreen.tsx:408"}, "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-551c8e013bdfd112", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PlatformAnalyticsDashboard.tsx:811", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PlatformAnalyticsDashboard.tsx:811"}, "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-8186278cde98b468", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ResearchScreen.tsx:1606", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ResearchScreen.tsx:1606"}, "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-344275a7e8f62aab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActionCenterScreen.tsx:697", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActionCenterScreen.tsx:697"}, "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-7bd58021ab8e525d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SupplyChainScreen.tsx:1183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SupplyChainScreen.tsx:1183"}, "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-3746f0a514013f5a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ManufacturingScreen.tsx:371", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ManufacturingScreen.tsx:371"}, "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-64bcda754f2e08fa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/LabelingScreen.tsx:866", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/LabelingScreen.tsx:866"}, "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-a0fcfd12e4d1f671", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx:770"}, "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-ed87ab2d7f0a5864", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsScreen.tsx:1558", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsScreen.tsx:1558"}, "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-3d8362e5e6b6bf95", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CommitmentsManager.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CommitmentsManager.tsx:503"}, "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-a62f40f2888e5f21", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ELNScreen.tsx:568", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ELNScreen.tsx:568"}, "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-72b3dbad742ca68e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegistrationsTracker.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegistrationsTracker.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81a5446140951049", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsHubScreen.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsHubScreen.tsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8e630360f19f0a2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioStrategyView.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioStrategyView.tsx:147"}, "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-219650154a53747e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionReadinessDashboard.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionReadinessDashboard.tsx:580"}, "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-bfd7a48812db6797", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:838", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:838"}, "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-1955bfc8e06a69ca", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GLPScreen.tsx:1979", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GLPScreen.tsx:1979"}, "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-4596c1d873c2dffa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioScreen.tsx:671", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioScreen.tsx:671"}, "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-bec18c57a39ad305", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MultiRegionSubmissionTracker.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MultiRegionSubmissionTracker.tsx:754"}, "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-16f7ad7d9d157644", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDArchivesScreen.tsx:556", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDArchivesScreen.tsx:556"}, "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-816d30ba482d5347", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActivityScreen.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActivityScreen.tsx:218"}, "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-86856a2074263c0f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BiostatsScreen.tsx:850", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BiostatsScreen.tsx:850"}, "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-b4d645621c3d79c6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MedicalAffairsScreen.tsx:616", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MedicalAffairsScreen.tsx:616"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82a410ba85e7c705", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:564", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:564"}, "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-3c98c7d5f0733815", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870"}, "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-453f6e5fdfe4d932", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/TMFScreen.tsx:390", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/TMFScreen.tsx:390"}, "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-33570c000a5bcc95", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/DocumentControlScreen.tsx:1246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/DocumentControlScreen.tsx:1246"}, "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-4274a19cb5bcf724", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AdminScreen.tsx:1064", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AdminScreen.tsx:1064"}, "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-5b384711248259ff", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BDScreen.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BDScreen.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-074d021ad150662b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/NonclinicalScreen.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/NonclinicalScreen.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-2f0c7d61b7d3d5cd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/HomeScreen.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/HomeScreen.tsx:180"}, "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-c5da75a8edf8695f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SafetyScreen.tsx:820", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SafetyScreen.tsx:820"}, "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-dfe1397b279f6e00", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx:212"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e58f165edbc4b767", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SPLScreen.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SPLScreen.tsx:96"}, "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-8bb923156ccc5ea3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ApprovalWorkflowVisualization.tsx:6", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ApprovalWorkflowVisualization.tsx:689"}, "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-097bcba17c79df99", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GCPScreen.tsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GCPScreen.tsx:410"}, "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-681fbfd575d8213b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuthoringScreen.tsx:900", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuthoringScreen.tsx:900"}, "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-22fda2595cf63214", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/screens/AuthoringScreen.tsx:2256", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/screens/AuthoringScreen.tsx:2256"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a7d67cc5bfad6e0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ClinicalDevelopmentScreen.tsx:397", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ClinicalDevelopmentScreen.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-179aef26f5702eab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:7", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:770"}, "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-910319645185383b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CreateModals.tsx:610", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CreateModals.tsx:610"}, "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-9fa01621a558a4dd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PSMFScreen.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PSMFScreen.tsx:402"}, "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-94f6618e1bea3bf9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDIntelligenceScreen.tsx:624", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDIntelligenceScreen.tsx:624"}, "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-6d9e09ca042adb0d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4d41ab2a1cb48d0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:1029", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:1029"}, "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-18a55cbf8e21205a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuditTrailDashboard.tsx:889", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuditTrailDashboard.tsx:889"}, "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-e20d0cf9d8626650", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/ResizableDocumentViewer.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/ResizableDocumentViewer.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-59d421f0ceec9403", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-885c44c5e053d79f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/CrossReferenceGraph.tsx:607", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/CrossReferenceGraph.tsx:607"}, "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-95ef51226a34cde5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:451", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:451"}, "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-6267ea8067ce0e13", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:426", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:426"}, "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-1d1e1a6eea556068", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentViewer.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentViewer.tsx:138"}, "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-657b0f6f2331a830", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentViewer.tsx:542", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentViewer.tsx:542"}, "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-6923b31dd06f9ea0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentCompareViewer.tsx:409", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentCompareViewer.tsx:409"}, "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-cd99fd9242ee513c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentImpactAnalysis.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentImpactAnalysis.tsx:198"}, "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-967fe4af37b98677", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/ResponseTemplateLibrary.tsx:969", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/ResponseTemplateLibrary.tsx:969"}, "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-a5936747183bff73", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/TemplateBrowser.tsx:756", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/TemplateBrowser.tsx:756"}, "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-49cf29b6b5795ecb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/EnhancedGlobalSearch.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/EnhancedGlobalSearch.tsx:179"}, "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-6659bb32f357d360", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/GlobalSearch.tsx:511", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/GlobalSearch.tsx:511"}, "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-97e969588fa531b8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.tsx:140"}, "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-d16994393200edd6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/ValidationProtocolPanel.tsx:622", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/ValidationProtocolPanel.tsx:622"}, "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-962ccee8b7b0ef10", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/Part11Panel.tsx:474", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/Part11Panel.tsx:474"}, "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-ddd584cfc868c2be", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/RTMPanel.tsx:505", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/RTMPanel.tsx:505"}, "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-c4c8922115949e46", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CapabilityProfilePanel.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CapabilityProfilePanel.tsx:119"}, "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-6cb1d39cec0e17db", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ThemeSettingsPanel.tsx:679", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ThemeSettingsPanel.tsx:679"}, "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-5b01d099264082ad", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CitationMonitorPanel.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CitationMonitorPanel.tsx:251"}, "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-d98f731edccd78ba", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/SampleListView.tsx:416", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/SampleListView.tsx:416"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d3f8beb46ce6fb8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/CompoundDetailPanel.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/CompoundDetailPanel.tsx:288"}, "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-9cb988f6e90ff603", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/LabDashboard.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/LabDashboard.tsx:285"}, "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-e0479fa41f7c97ab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PDFValidatorPanel.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PDFValidatorPanel.tsx:315"}, "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-e1508a781f2373ca", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/AIAssemblyAssistant.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/AIAssemblyAssistant.tsx:292"}, "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-6b7811e3d9ffb9ea", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/EnhancedValidationPanel.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/EnhancedValidationPanel.tsx:358"}, "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-f8b376fba12e5711", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/HyperlinkManagerPanel.tsx:396", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/HyperlinkManagerPanel.tsx:396"}, "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-e3762afa4ecce132", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDValidationWorkflow.tsx:625", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDValidationWorkflow.tsx:625"}, "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-b5e9b3a936a5f493", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingJobMonitor.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingJobMonitor.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-6c6771b66d04a841", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDViewerPanel.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDViewerPanel.tsx:202"}, "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-1433df7b0d781930", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ContentReuseEngine.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ContentReuseEngine.tsx:280"}, "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-43bafd67ca40964d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SequenceBuilderPanel.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SequenceBuilderPanel.tsx:81"}, "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-363acb6755a93337", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PriorDossierImportPanel.tsx:385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PriorDossierImportPanel.tsx:385"}, "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-f9ef0405bbc1963f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:250"}, "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-db4d83417f266198", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:158"}, "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-490ac6e80986fb7a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingWorkspace.tsx:526", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingWorkspace.tsx:526"}, "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-15278313beec3dab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/CrossReferenceValidationPanel.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/CrossReferenceValidationPanel.tsx:414"}, "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-55653aa5971ebf1c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ArchiveWorkflowPanel.tsx:473", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ArchiveWorkflowPanel.tsx:473"}, "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-f3ced7333425187e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/conflicts/ConflictResolutionUI.tsx:645", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/conflicts/ConflictResolutionUI.tsx:645"}, "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-ab7a2e3837ba33b0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CPIDetailPanel.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CPIDetailPanel.tsx:167"}, "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-76f401b8df9c9903", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SequenceComparisonPanel.tsx:395", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SequenceComparisonPanel.tsx:395"}, "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-6323d954b9a81f51", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:858"}, "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-b11882fffbd9bd74", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffReceiver.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffReceiver.tsx:194"}, "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-63a46299badb1f60", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/RDConnectedContextPanel.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/RDConnectedContextPanel.tsx:426"}, "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-1bf3cee1e1a734ed", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionBuilder.tsx:735", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionBuilder.tsx:735"}, "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-6ff475e44633db6f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PipelineView.tsx:729", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PipelineView.tsx:729"}, "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-4d852a7394e9d644", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PDFValidationPanel.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PDFValidationPanel.tsx:334"}, "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-770ac2a665319f95", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PublishingQueue.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PublishingQueue.tsx:208"}, "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-cf950a2c4108bffb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CorrespondenceIntegrationPanel.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CorrespondenceIntegrationPanel.tsx:267"}, "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-cf55a3690374bb0f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/TaskAssignmentPanel.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/TaskAssignmentPanel.tsx:215"}, "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-101ee6d24d0daf2f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/ContentCollectionPanel.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/ContentCollectionPanel.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cda1fefe4972bbd0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PlanningView.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PlanningView.tsx:241"}, "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-0c76047ebaa99d7f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffPanel.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffPanel.tsx:165"}, "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-8c47d2ec4a7542f4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFVersionComparison.tsx:602", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFVersionComparison.tsx:602"}, "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-b9a9d889e5ea88b7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:419"}, "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-32d226bbdd1bf267", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/AutoLinkDashboard.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/AutoLinkDashboard.tsx:304"}, "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-f5f1fcad3b38812f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/DIAGapTrendAnalytics.tsx:896", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/DIAGapTrendAnalytics.tsx:896"}, "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-66d4d3fadf87abde", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFGapAnalysis.tsx:751", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFGapAnalysis.tsx:751"}, "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-4b67819353ca435c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/AssetDueDiligencePanel.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/AssetDueDiligencePanel.tsx:258"}, "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-a65fb91709e0b904", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/HAAgentPanel.tsx:401", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/HAAgentPanel.tsx:401"}, "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-66f34494bbb3bd2c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/PublishingWizard.tsx:1076", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/PublishingWizard.tsx:1076"}, "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-3ebc20f63b515ec4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/CTDTree.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/CTDTree.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-dd4b0e05d6c824bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/SequenceTimeline.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/SequenceTimeline.tsx:344"}, "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-350d5923d9eea157", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/campaigns/CampaignDashboard.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/campaigns/CampaignDashboard.tsx:252"}, "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-c48e04d18a34cc6b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/PipelineOrchestratorPanel.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/PipelineOrchestratorPanel.tsx:396"}, "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-514f4cab9d04449e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/EntityLinkNavigator.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/EntityLinkNavigator.tsx:138"}, "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-6358f08085c24d7b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixPanel.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixPanel.tsx:203"}, "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-e1d9bcb37c5278f8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixStatus.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixStatus.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1112a4d36afa0155", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DualRepDocumentBlock.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DualRepDocumentBlock.tsx:86"}, "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-5623a514923cb979", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalQueueDashboard.tsx:492", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalQueueDashboard.tsx:492"}, "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-837adad52f399854", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalStatusDashboard.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalStatusDashboard.tsx:360"}, "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-9406f3734c102fb5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalRequestPanel.tsx:888", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalRequestPanel.tsx:888"}, "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-d5bc0318264ad2bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/VersionCreationWizard.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/VersionCreationWizard.tsx:426"}, "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-bb68fc4cef0e77ce", "name": "Icon-only button without accessible name \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:498", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:498"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c2368e385278003", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:275"}, "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-3a858fe4583f76d9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ReviewCommentsThread.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ReviewCommentsThread.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-89c1ee8cee092813", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/ReviewCommentsThread.tsx:421", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/ReviewCommentsThread.tsx:421"}, "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-fa1881e538f13658", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/CreateLinkModal.tsx:619", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/CreateLinkModal.tsx:619"}, "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-2cff608e159ce9cb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkedDocumentsPanel.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkedDocumentsPanel.tsx:215"}, "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-d4e9a2866d445a6f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentControlLineageIntegration", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentControlLineageIntegration.tsx:235"}, "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-98b37f2628e4b688", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentLineagePanel.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentLineagePanel.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-339d325a2a4ce22e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/PDFDocumentPreview.tsx:232", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/PDFDocumentPreview.tsx:232"}, "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-9e4e4b7b21ed8195", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewer.tsx:359", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewer.tsx:359"}, "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-17289717a8e17bfe", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentUploadPanel.tsx:665", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentUploadPanel.tsx:665"}, "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-d9368d528925f3cc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewModes.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewModes.tsx:280"}, "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-f4d4d3e1ef0d08a7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkValidator.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkValidator.tsx:172"}, "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-0480447669e204e9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentArtifactViewer.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentArtifactViewer.tsx:392"}, "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-d0061056259eedb5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/SignatureCapture.tsx:350", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/SignatureCapture.tsx:350"}, "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-432ecb213b254d57", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentHierarchy.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentHierarchy.tsx:158"}, "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-9f0ee820b0029160", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/EnhancedDocumentUploadPanel.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/EnhancedDocumentUploadPanel.tsx:1004"}, "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-0d56fb4af5852770", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApproverCard.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApproverCard.tsx:70"}, "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-8f734226af599b5a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/favorites/FavoritesPanel.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/favorites/FavoritesPanel.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24eb36821fe26f09", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductFilterHeader.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductFilterHeader.tsx:198"}, "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-1c105de4f6a77e43", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductSwitcher.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductSwitcher.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c646b86c4e369c8", "name": "Icon-only button without accessible name \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:288", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:288"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ebe37847a90c867", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:180"}, "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-b0b68328f8c0b0f7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationToolbar.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationToolbar.tsx:249"}, "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-bbf7527b9573bcb1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationPresence.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationPresence.tsx:237"}, "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-abc18c563c225f37", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresencePanel.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresencePanel.tsx:243"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-abb1cb7a4eae3c7e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresenceAvatars.tsx:461", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresenceAvatars.tsx:461"}, "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-4983765053f1eb57", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/lib/error-reporting.ts:16", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/lib/error-reporting.ts:16"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48d8352ad0a230f2", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/logger.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/logger.ts:45"}, "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-e2b358448c1a1a74", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SpikeHaqRagPage.tsx:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SpikeHaqRagPage.tsx:88"}, "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-d8582a0ab81bfe9f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TemplateBrowserPage.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TemplateBrowserPage.tsx:220"}, "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-4af568dd3734f1b5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/hooks/usePDFIngestion.tsx:347", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/hooks/usePDFIngestion.tsx:347"}, "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-da81029594d24d2e", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/hooks/useAuth.ts:89", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/hooks/useAuth.ts:89"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d894feff24a9b50d", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/services/usage-event-service.ts", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/services/usage-event-service.ts:428"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ccff0d16796da68", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/store/useDocumentLinkStore.ts:654", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/store/useDocumentLinkStore.ts:654"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5319cd936297ac8b", "name": "Possible secret in frontend/src/config/auth-config.ts", "shortDescription": {"text": "Possible secret in frontend/src/config/auth-config.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-0b807feec6d95b10", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:618", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:618"}, "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-d1326ae61cc948e2", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/XMLPreviewPanel.tsx:305", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/XMLPreviewPanel.tsx:305"}, "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-bf4ac2c633ef193c", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410"}, "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-56ee47cc743a2d02", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/BatchGenerationPanel.tsx:481", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/BatchGenerationPanel.tsx:481"}, "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-59792fffd1c8298a", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/DocumentEditor.tsx:663", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/DocumentEditor.tsx:663"}, "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-64f5d731abdd7b0f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AISectionEditor.tsx:501", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AISectionEditor.tsx:501"}, "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-dee2100b62ac2e15", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/haq/HAQStreamingPanel.tsx:533", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/haq/HAQStreamingPanel.tsx:533"}, "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-5eba29ff9bb8eb42", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926"}, "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-616bc5c02e7d9275", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIGenerationPanel.tsx:327", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIGenerationPanel.tsx:327"}, "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-1a78ab91bb77329e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/HAQResponseEditorV2.tsx:308", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/HAQResponseEditorV2.tsx:308"}, "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-887c538fa38ea6ba", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870"}, "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-1116d992759924e6", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/PagedDocumentRenderer.tsx:426", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/PagedDocumentRenderer.tsx:426"}, "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-5cb0679901662412", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentViewer.tsx:542", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentViewer.tsx:542"}, "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-5d7a4743a39d8655", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentCompareViewer.tsx:409", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentCompareViewer.tsx:409"}, "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-9db0802009991212", "name": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/ECTDValidationWorkflow.tsx:375", "shortDescription": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/ECTDValidationWorkflow.tsx:375"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46d5b741d8211c1f", "name": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/SubmissionPackageBuilder.tsx:614", "shortDescription": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/SubmissionPackageBuilder.tsx:614"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd3bdfa6b9ebb2b3", "name": "Insecure pattern 'weak_hash' in frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:793", "shortDescription": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:793"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a09a7c90436e6551", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/ReviewCommentsThread.tsx:421", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/ReviewCommentsThread.tsx:421"}, "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-b92bd707dab5aefa", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/PDFDocumentPreview.tsx:232", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/PDFDocumentPreview.tsx:232"}, "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-e14ecf36314859a1", "name": "Insecure pattern 'document_write' in frontend/src/services/validation-report-service.ts:489", "shortDescription": {"text": "Insecure pattern 'document_write' in frontend/src/services/validation-report-service.ts:489"}, "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-bc57080172a988d0", "name": "Insecure pattern 'weak_hash' in frontend/src/services/haq-response-finalization-service.ts:264", "shortDescription": {"text": "Insecure pattern 'weak_hash' in frontend/src/services/haq-response-finalization-service.ts:264"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). 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-7bd327cab115bdce", "name": "Very large file: frontend/src/components/authoring/DocumentEditor.tsx (979 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/authoring/DocumentEditor.tsx (979 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-fd2b5e654c65379a", "name": "Very large file: frontend/src/components/authoring/NewDocumentWizard.tsx (1202 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/authoring/NewDocumentWizard.tsx (1202 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-6cb62c5b548ab63b", "name": "Very large file: frontend/src/components/screens/CTMSScreen.tsx (2395 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/CTMSScreen.tsx (2395 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-0dd6a8400a886e35", "name": "Very large file: frontend/src/components/screens/ECTDWorkspaceScreen.tsx (2227 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ECTDWorkspaceScreen.tsx (2227 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-f6884bbe42c5a968", "name": "Very large file: frontend/src/components/screens/QMSScreen.tsx (2396 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/QMSScreen.tsx (2396 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-9ff8b41550c87ab6", "name": "Very large file: frontend/src/components/screens/PlatformAnalyticsDashboard.tsx (969 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/PlatformAnalyticsDashboard.tsx (969 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-ee9fbaed90aa0625", "name": "Very large file: frontend/src/components/screens/ResearchScreen.tsx (4246 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ResearchScreen.tsx (4246 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-90108aaa242c750c", "name": "Very large file: frontend/src/components/screens/ActionCenterScreen.tsx (1284 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ActionCenterScreen.tsx (1284 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-2a7d9ffe561e5015", "name": "Very large file: frontend/src/components/screens/SupplyChainScreen.tsx (2618 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/SupplyChainScreen.tsx (2618 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-fd4626541c5c941e", "name": "Very large file: frontend/src/components/screens/LabelingScreen.tsx (1830 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/LabelingScreen.tsx (1830 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-166427e34934dda6", "name": "Very large file: frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx (1107 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx (1107 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-76ba909080225cb8", "name": "Very large file: frontend/src/components/screens/SubmissionsScreen.tsx (2026 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/SubmissionsScreen.tsx (2026 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-54f2ac80d6fe79e1", "name": "Very large file: frontend/src/components/screens/CommercialScreen.tsx (1200 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/CommercialScreen.tsx (1200 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-4440d11099097682", "name": "Very large file: frontend/src/components/screens/RiskCAPAIntegrationDashboard.tsx (1173 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RiskCAPAIntegrationDashboard.tsx (1173 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-b368f9d16b38f0f3", "name": "Very large file: frontend/src/components/screens/ELNScreen.tsx (2037 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ELNScreen.tsx (2037 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-9b223cd16ae35782", "name": "Very large file: frontend/src/components/screens/RegulatoryCalendarScreen.tsx (1336 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RegulatoryCalendarScreen.tsx (1336 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-b06085283988617c", "name": "Very large file: frontend/src/components/screens/SubmissionsHubScreen.tsx (939 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/SubmissionsHubScreen.tsx (939 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-41db714fedc46fca", "name": "Very large file: frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx (1370 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx (1370 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-c9da376c907d360a", "name": "Very large file: frontend/src/components/screens/GLPScreen.tsx (4100 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/GLPScreen.tsx (4100 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-c54818e16a13f8ea", "name": "Very large file: frontend/src/components/screens/PortfolioScreen.tsx (1432 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/PortfolioScreen.tsx (1432 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-77237042b8abcd48", "name": "Very large file: frontend/src/components/screens/StudyIntelScreen.tsx (981 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/StudyIntelScreen.tsx (981 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-be43cff979092f8b", "name": "Very large file: frontend/src/components/screens/DevelopmentScreen.tsx (2177 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/DevelopmentScreen.tsx (2177 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-a15570544b906af8", "name": "Very large file: frontend/src/components/screens/MultiRegionSubmissionTracker.tsx (1442 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/MultiRegionSubmissionTracker.tsx (1442 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-3b9e859b403503bc", "name": "Very large file: frontend/src/components/screens/AdPromoScreen.tsx (891 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AdPromoScreen.tsx (891 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-cb069e496b93ba4a", "name": "Very large file: frontend/src/components/screens/RDArchivesScreen.tsx (2616 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RDArchivesScreen.tsx (2616 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-2778a6ca651df242", "name": "Very large file: frontend/src/components/screens/QMSCreateModals.tsx (1535 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/QMSCreateModals.tsx (1535 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-f055928125c9b931", "name": "Very large file: frontend/src/components/screens/BiostatsScreen.tsx (2692 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/BiostatsScreen.tsx (2692 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-0c3d1ecb192b6f68", "name": "Very large file: frontend/src/components/screens/MedicalAffairsScreen.tsx (3746 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/MedicalAffairsScreen.tsx (3746 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-34bb367a7b68f23d", "name": "Very large file: frontend/src/components/screens/CMCScreen.tsx (2293 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/CMCScreen.tsx (2293 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-5f322f12b1432904", "name": "Very large file: frontend/src/components/screens/AIDocumentGenerationScreen.tsx (1309 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AIDocumentGenerationScreen.tsx (1309 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-52b83e6ceccb758b", "name": "Very large file: frontend/src/components/screens/TMFScreen.tsx (1654 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/TMFScreen.tsx (1654 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-5fc5a0000be95b1a", "name": "Very large file: frontend/src/components/screens/DocumentControlScreen.tsx (1293 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/DocumentControlScreen.tsx (1293 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-2633f6aa16ced5e8", "name": "Very large file: frontend/src/components/screens/AdminScreen.tsx (1721 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AdminScreen.tsx (1721 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-cdbca00c975d4dff", "name": "Very large file: frontend/src/components/screens/CTMSDeviationMonitoring.tsx (975 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/CTMSDeviationMonitoring.tsx (975 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-ecaddeaed8390f15", "name": "Very large file: frontend/src/components/screens/SafetyScreen.tsx (3577 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/SafetyScreen.tsx (3577 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-108d9e1584c0ca90", "name": "Very large file: frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx (1372 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx (1372 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-e09773b9087e4828", "name": "Very large file: frontend/src/components/screens/SignalDetectionScreen.tsx (1155 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/SignalDetectionScreen.tsx (1155 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-596e6545712d9e7e", "name": "Very large file: frontend/src/components/screens/ApprovalWorkflowVisualization.tsx (1287 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ApprovalWorkflowVisualization.tsx (1287 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-396f14ff20d45102", "name": "Very large file: frontend/src/components/screens/WorkflowOrchestrationDashboard.tsx (1639 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/WorkflowOrchestrationDashboard.tsx (1639 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-174ad477313629e2", "name": "Very large file: frontend/src/components/screens/GCPScreen.tsx (1143 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/GCPScreen.tsx (1143 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-42f7c15daf2a36f1", "name": "Very large file: frontend/src/components/screens/AuthoringScreen.tsx (2895 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AuthoringScreen.tsx (2895 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-e56e6eade1843915", "name": "Very large file: frontend/src/components/screens/ClinicalDevelopmentScreen.tsx (1732 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ClinicalDevelopmentScreen.tsx (1732 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-93f5c9b835ae9f7c", "name": "Very large file: frontend/src/components/screens/CreateModals.tsx (1753 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/CreateModals.tsx (1753 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-dd3f5b637ec62e3a", "name": "Very large file: frontend/src/components/screens/PSMFScreen.tsx (1225 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/PSMFScreen.tsx (1225 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-a1f017ab94e8e490", "name": "Very large file: frontend/src/components/screens/ECTDIntelligenceScreen.tsx (1396 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/ECTDIntelligenceScreen.tsx (1396 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-33d2003c88011c83", "name": "Very large file: frontend/src/components/screens/AgentHubScreen.tsx (2602 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AgentHubScreen.tsx (2602 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-da059307c8b0ff9d", "name": "Very large file: frontend/src/components/screens/HAQScreen.tsx (3123 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/HAQScreen.tsx (3123 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-0eaeb7d703bb9164", "name": "Very large file: frontend/src/components/screens/RiskAssessmentDashboard.tsx (1026 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RiskAssessmentDashboard.tsx (1026 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-7c707e9fbac58a7f", "name": "Very large file: frontend/src/components/screens/RDConnectedScreen.tsx (1145 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/RDConnectedScreen.tsx (1145 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-1c4ff0219e81ba15", "name": "Very large file: frontend/src/components/screens/AuditTrailDashboard.tsx (2109 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/AuditTrailDashboard.tsx (2109 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-eb6ab9b780337b18", "name": "Very large file: frontend/src/components/screens/StudyDesignScreen.tsx (3116 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/screens/StudyDesignScreen.tsx (3116 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-5b82b342b6bfc9a5", "name": "Very large file: frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx (1155 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx (1155 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-5b80a34d2986e5c2", "name": "Very large file: frontend/src/components/ectd/PublishingWizard.tsx (1686 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/ectd/PublishingWizard.tsx (1686 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-e02b7dfdc0f8bf32", "name": "Very large file: frontend/src/components/documents/ApprovalQueueDashboard.tsx (1579 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/documents/ApprovalQueueDashboard.tsx (1579 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-a7b14f8c6fa10873", "name": "Very large file: frontend/src/components/documents/DocumentViewer.tsx (1126 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/documents/DocumentViewer.tsx (1126 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-85a28917c89ee378", "name": "Very large file: frontend/src/lib/openapi.ts (2435 lines)", "shortDescription": {"text": "Very large file: frontend/src/lib/openapi.ts (2435 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-10dc28645a427541", "name": "Very large file: frontend/src/lib/openapi-extensions.ts (822 lines)", "shortDescription": {"text": "Very large file: frontend/src/lib/openapi-extensions.ts (822 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-982e2fb0d7de16df", "name": "Very large file: frontend/src/services/clinical/data-entry-service.ts (1724 lines)", "shortDescription": {"text": "Very large file: frontend/src/services/clinical/data-entry-service.ts (1724 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-cbd86a39f9605409", "name": "Very large file: frontend/src/services/clinical/form-builder-service.ts (1754 lines)", "shortDescription": {"text": "Very large file: frontend/src/services/clinical/form-builder-service.ts (1754 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-34646b9e6dcbff3d", "name": "Very large file: frontend/src/services/clinical/edit-check-compiler.ts (1777 lines)", "shortDescription": {"text": "Very large file: frontend/src/services/clinical/edit-check-compiler.ts (1777 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-db502d2bdb3b82b7", "name": "Very large file: frontend/src/store/useGuidedScenarioStore.ts (1454 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useGuidedScenarioStore.ts (1454 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-1c49d2cca5956bca", "name": "Very large file: frontend/src/store/useDocumentControlStore.ts (868 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useDocumentControlStore.ts (868 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-54bf04636a6eaf66", "name": "Very large file: frontend/src/store/useCampaignEnhancements.ts (1179 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useCampaignEnhancements.ts (1179 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-0afa83fe076a7048", "name": "Very large file: frontend/src/store/useReviewerSimulation.ts (2009 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useReviewerSimulation.ts (2009 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-3a4015847edbc657", "name": "Very large file: frontend/src/store/useArchivesStore.ts (1609 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useArchivesStore.ts (1609 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-d0ef78168050d8f4", "name": "Very large file: frontend/src/store/useELNStore.ts (1241 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useELNStore.ts (1241 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-d5208c0251cfd46d", "name": "Very large file: frontend/src/store/useClinicalRegBridge.ts (1364 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useClinicalRegBridge.ts (1364 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-9409833a54c66205", "name": "Very large file: frontend/src/store/useCTMSStore.ts (3273 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useCTMSStore.ts (3273 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-76570a4f9bbaa4b3", "name": "Very large file: frontend/src/store/useHAQResponseStore.ts (988 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useHAQResponseStore.ts (988 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-735bf603ad8e7521", "name": "Very large file: frontend/src/store/useResponseTemplates.ts (1740 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useResponseTemplates.ts (1740 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-c2c4b6eba6a78337", "name": "Very large file: frontend/src/store/useIDMPStore.ts (1729 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useIDMPStore.ts (1729 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-a5ec7d4b880cabb1", "name": "Very large file: frontend/src/store/useStudyIntelStore.ts (1049 lines)", "shortDescription": {"text": "Very large file: frontend/src/store/useStudyIntelStore.ts (1049 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-f890790d50f3c10c", "name": "Very large file: frontend/src/domains/qms/contracts.ts (2079 lines)", "shortDescription": {"text": "Very large file: frontend/src/domains/qms/contracts.ts (2079 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-f78910d347a76320", "name": "Very large file: frontend/src/domains/usdm/contracts.ts (1843 lines)", "shortDescription": {"text": "Very large file: frontend/src/domains/usdm/contracts.ts (1843 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "9 test file(s) for 1052 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 16 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 1048 placeholder/mock markers across 310 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. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-575662366358932f", "name": "Commented-code block (5 lines) in frontend/public/pwa-sw.js:10", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/public/pwa-sw.js:10"}, "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-e36bee5e7e85353b", "name": "Commented-code block (5 lines) in frontend/src/types/pdf-extraction.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/types/pdf-extraction.ts:2"}, "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-865eeab12455a405", "name": "Commented-code block (5 lines) in frontend/src/types/structured-content.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/types/structured-content.ts:2"}, "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-bf051289ad90fab8", "name": "Commented-code block (6 lines) in frontend/src/types/lix.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/types/lix.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a13e0ffbc696222", "name": "Commented-code block (6 lines) in frontend/src/types/sop.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/types/sop.ts:2"}, "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-52ae4ae2f43a5a4f", "name": "Commented-code block (7 lines) in frontend/src/types/collaboration-persistence.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/types/collaboration-persistence.ts:2"}, "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-14aed666af61cd0c", "name": "Commented-code block (5 lines) in frontend/src/types/rag.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/types/rag.ts:2"}, "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-2d329487d25acfc4", "name": "Commented-code block (7 lines) in frontend/src/types/operation-compaction.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/types/operation-compaction.ts:2"}, "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-996b1298b149af1c", "name": "Commented-code block (6 lines) in frontend/src/types/track-changes.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/types/track-changes.ts:2"}, "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-685e0662b110d1a5", "name": "Commented-code block (7 lines) in frontend/src/types/validation-protocol.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/types/validation-protocol.ts:2"}, "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-8f0561c6fdaa739f", "name": "Commented-code block (5 lines) in frontend/src/types/approval.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/types/approval.ts:2"}, "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-e9b8c77d91322492", "name": "Commented-code block (6 lines) in frontend/src/types/submission-lifecycle.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/types/submission-lifecycle.ts:2"}, "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-cb3d8f4de7e8a76e", "name": "Commented-code block (7 lines) in frontend/src/types/agents.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/types/agents.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6826157bc29a4397", "name": "Commented-code block (7 lines) in frontend/src/types/session-recovery.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/types/session-recovery.ts:2"}, "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-4717ed83b6d9525a", "name": "Commented-code block (8 lines) in frontend/src/types/session-analytics.ts:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/types/session-analytics.ts:2"}, "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-096f5533c79eae92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/submissions-store.ts:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/submissions-store.ts:234"}, "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-6fedf1aa1835b2af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/products-store.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/products-store.ts:89"}, "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-ab499193f300f55c", "name": "Commented-code block (7 lines) in frontend/src/config/version.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/config/version.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-291bdccc9eaee630", "name": "Commented-code block (5 lines) in frontend/src/config/api-keys.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/config/api-keys.ts:2"}, "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-336b747684b94c51", "name": "Commented-code block (5 lines) in frontend/src/config/module-registry.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/config/module-registry.ts:2"}, "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-f5d7cb2571fe086d", "name": "Commented-code block (5 lines) in frontend/src/components/layout/TierSwitcher.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/layout/TierSwitcher.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91ed830324212510", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/layout/Header.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/layout/Header.tsx:116"}, "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-6adea415a1b9253a", "name": "Commented-code block (5 lines) in frontend/src/components/clinical/TimelineSlider.tsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/clinical/TimelineSlider.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3332de6277e0f0ea", "name": "Commented-code block (7 lines) in frontend/src/components/strategy/StrategyImpactPanel.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/strategy/StrategyImpactPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13273fdb81c96a6c", "name": "Commented-code block (5 lines) in frontend/src/components/demo/DemoErrorRecovery.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoErrorRecovery.tsx:2"}, "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-c99be684d22a1265", "name": "Commented-code block (5 lines) in frontend/src/components/demo/PresenterDashboard.tsx:33", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/PresenterDashboard.tsx:33"}, "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-882f48019d7d9f30", "name": "Commented-code block (6 lines) in frontend/src/components/demo/PathSpecificTooltips.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/demo/PathSpecificTooltips.tsx:2"}, "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-0b940d9026adc8d1", "name": "Commented-code block (5 lines) in frontend/src/components/demo/DemoLauncherPage.tsx:26", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoLauncherPage.tsx:26"}, "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-21a14db27572213e", "name": "Commented-code block (8 lines) in frontend/src/components/demo/DemoStreamingOverlay.tsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/demo/DemoStreamingOverlay.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20b3f6f040c672f8", "name": "Commented-code block (5 lines) in frontend/src/components/demo/DemoFallbackData.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoFallbackData.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7aba1a9a74a6c675", "name": "Commented-code block (5 lines) in frontend/src/components/demo/GuidedScenarioOverlay.tsx:28", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/GuidedScenarioOverlay.tsx:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5287965665e18432", "name": "Commented-code block (6 lines) in frontend/src/components/demo/AhaMomentOverlay.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/demo/AhaMomentOverlay.tsx:2"}, "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-99c35073811eba50", "name": "Commented-code block (8 lines) in frontend/src/components/authoring/DocumentEditor.tsx:165", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/authoring/DocumentEditor.tsx:165"}, "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-2454d1d364ecccc2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:823", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:823"}, "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-3d4c749dbfa9f154", "name": "Legacy-named symbol `NotificationBellLegacy` in frontend/src/components/notifications/NotificationSystem.tsx:463", "shortDescription": {"text": "Legacy-named symbol `NotificationBellLegacy` in frontend/src/components/notifications/NotificationSystem.tsx:463"}, "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-7ba82683c6a351c8", "name": "Commented-code block (7 lines) in frontend/src/components/haq/HAQContextPanel.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/haq/HAQContextPanel.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57661b3b068a1e45", "name": "Commented-code block (7 lines) in frontend/src/components/haq/HAQEvidenceGatherer.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/haq/HAQEvidenceGatherer.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-789eae65a87f5944", "name": "Commented-code block (5 lines) in frontend/src/components/ui/Tabs.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/Tabs.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-29f713011dfbb156", "name": "Commented-code block (10 lines) in frontend/src/components/ui/ReturnBreadcrumb.tsx:3", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/ui/ReturnBreadcrumb.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-310b0d8b084ef712", "name": "Commented-code block (9 lines) in frontend/src/components/ui/WorkspaceLayout.tsx:1", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/WorkspaceLayout.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44d9e6b711900848", "name": "Commented-code block (5 lines) in frontend/src/components/ui/ScrollableTabs.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ScrollableTabs.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b0e82ab7973f11b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ui/FileUpload.tsx:315", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ui/FileUpload.tsx:315"}, "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-775604f2c8a9ba22", "name": "Commented-code block (9 lines) in frontend/src/components/ui/ModuleContainer.tsx:5", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/ModuleContainer.tsx:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8146dfa158aeb2b", "name": "Commented-code block (6 lines) in frontend/src/components/ui/CollapsibleSidebar.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/ui/CollapsibleSidebar.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10d96b40bcc57625", "name": "Commented-code block (5 lines) in frontend/src/components/ui/ResponsivePrimitives.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ResponsivePrimitives.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fd22de35b38646e", "name": "Commented-code block (9 lines) in frontend/src/components/ui/ScreenHeader.tsx:10", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/ScreenHeader.tsx:10"}, "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-a01fe64dbef0c315", "name": "Commented-code block (6 lines) in frontend/src/components/ui/Toast.tsx:648", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/ui/Toast.tsx:648"}, "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-8f65be58f173affc", "name": "Commented-code block (5 lines) in frontend/src/components/screens/QMSScreen.tsx:961", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/QMSScreen.tsx:961"}, "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-4db83ceef0224cb1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/QMSScreen.tsx:2246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/QMSScreen.tsx:2246"}, "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-115f452cff273386", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/ResearchScreen.tsx:646", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/ResearchScreen.tsx:646"}, "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-41f5320492214c92", "name": "Commented-code block (11 lines) in frontend/src/components/screens/SubmissionCommandCenter.tsx:1", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/components/screens/SubmissionCommandCenter.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f7532391640f3ed", "name": "Commented-code block (5 lines) in frontend/src/components/screens/SubmissionsHubScreen.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/SubmissionsHubScreen.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2a62a5e283d03f4", "name": "Commented-code block (7 lines) in frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3674c18537907477", "name": "Commented-code block (6 lines) in frontend/src/components/screens/UnifiedPublishingScreen.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/UnifiedPublishingScreen.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac9c674ad48d9fb5", "name": "Commented-code block (6 lines) in frontend/src/components/screens/GLPScreen.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/GLPScreen.tsx:2"}, "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-8e756e416c7c76c1", "name": "Commented-code block (5 lines) in frontend/src/components/screens/AIConsistencyEngineDashboard.tsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/AIConsistencyEngineDashboard.tsx:41"}, "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-c8e06de5cfb90317", "name": "Commented-code block (12 lines) in frontend/src/components/screens/BiostatsScreen.tsx:1", "shortDescription": {"text": "Commented-code block (12 lines) in frontend/src/components/screens/BiostatsScreen.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c525abb9b3423eef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/SafetyScreen.tsx:3246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/SafetyScreen.tsx:3246"}, "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-4d6817ab0559b824", "name": "Commented-code block (8 lines) in frontend/src/components/screens/UnifiedCMCManufacturingScreen.tsx:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/screens/UnifiedCMCManufacturingScreen.tsx:2"}, "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-a4101b7b7d02319b", "name": "Commented-code block (12 lines) in frontend/src/components/screens/SPLScreen.tsx:1", "shortDescription": {"text": "Commented-code block (12 lines) in frontend/src/components/screens/SPLScreen.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd95859c5b44279c", "name": "Commented-code block (5 lines) in frontend/src/components/screens/ModuleLockedScreen.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/ModuleLockedScreen.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47a5dd2059bd2ac1", "name": "Commented-code block (5 lines) in frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-825c633cd75615eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/CreateModals.tsx:531", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/CreateModals.tsx:531"}, "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-a4cfc78c7923789d", "name": "Commented-code block (6 lines) in frontend/src/components/screens/PSMFScreen.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/PSMFScreen.tsx:2"}, "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-98aef9184903ee3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:486", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:486"}, "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-cd63e4d81d31eab8", "name": "Commented-code block (5 lines) in frontend/src/components/screens/TemplateRegistryScreen.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/TemplateRegistryScreen.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75eec54412179d87", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:590", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:590"}, "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-6eaef535df29a44f", "name": "Commented-code block (6 lines) in frontend/src/components/screens/StudyDesignScreen.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/StudyDesignScreen.tsx:2"}, "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-870ec49506dbfd09", "name": "Commented-code block (6 lines) in frontend/src/components/viewer/ResizableDocumentViewer.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/viewer/ResizableDocumentViewer.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1c92760e7d05ab3", "name": "Commented-code block (5 lines) in frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:14"}, "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-d79a4d392bcda021", "name": "Commented-code block (6 lines) in frontend/src/components/templates/TemplateBrowser.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/templates/TemplateBrowser.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c7a94d4e5e46cfc", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/TransmissionHistoryPanel.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/TransmissionHistoryPanel.tsx:2"}, "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-760a950b326f9609", "name": "Commented-code block (7 lines) in frontend/src/components/publishing/AIAssemblyAssistant.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/publishing/AIAssemblyAssistant.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be56ed6e9c09fe35", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/EnhancedValidationPanel.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/EnhancedValidationPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aaa142e40a3537d8", "name": "Commented-code block (5 lines) in frontend/src/components/publishing/ValidationResultsPanel.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/ValidationResultsPanel.tsx:2"}, "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-f7ec75f1dd73d435", "name": "Commented-code block (5 lines) in frontend/src/components/publishing/PublishingJobMonitor.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/PublishingJobMonitor.tsx:2"}, "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-f4a9ffb998cc0306", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDViewerPanel.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDViewerPanel.tsx:2"}, "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-e9ead1db4cf3b088", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/ContentReuseEngine.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ContentReuseEngine.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd87f79bf5e2222a", "name": "Commented-code block (5 lines) in frontend/src/components/publishing/SequenceBuilderPanel.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/SequenceBuilderPanel.tsx:2"}, "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-c7150e46b557486a", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/MultiRegionBuilder.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/MultiRegionBuilder.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b193aa7d0b0478cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132"}, "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-dc98544be92b1b3b", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/TemplateLibraryPanel.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/TemplateLibraryPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54e118f1a33459c4", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDPublishingDashboard.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDPublishingDashboard.tsx:2"}, "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-07a16608f4bc5aad", "name": "Commented-code block (7 lines) in frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:2"}, "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-414b5d00b993776f", "name": "Commented-code block (10 lines) in frontend/src/components/publishing/PublishingWorkspace.tsx:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/publishing/PublishingWorkspace.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd8d12dbbce96a54", "name": "Commented-code block (6 lines) in frontend/src/components/publishing/CrossReferenceValidationPanel.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/CrossReferenceValidationPanel.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81b3ef55088b434d", "name": "Commented-code block (5 lines) in frontend/src/components/submissions/CPIDetailPanel.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/CPIDetailPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ccd9c9f8efb50cec", "name": "Commented-code block (10 lines) in frontend/src/components/submissions/PlanExportPanel.tsx:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/submissions/PlanExportPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97b33336fbb9669f", "name": "Commented-code block (15 lines) in frontend/src/components/submissions/GanttPanel.tsx:5", "shortDescription": {"text": "Commented-code block (15 lines) in frontend/src/components/submissions/GanttPanel.tsx:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-651faa0e45b65b78", "name": "Commented-code block (11 lines) in frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:1", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b9b09ca2762547f", "name": "Commented-code block (6 lines) in frontend/src/components/submissions/AddSubmissionModal.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/submissions/AddSubmissionModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a008ac7554d19db", "name": "Commented-code block (5 lines) in frontend/src/components/submissions/TemplatePickerStep.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/TemplatePickerStep.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f0c0a863ed10454", "name": "Commented-code block (11 lines) in frontend/src/components/submissions/TaskAssignmentPanel.tsx:1", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/components/submissions/TaskAssignmentPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96e02de00a3ad9ac", "name": "Commented-code block (10 lines) in frontend/src/components/submissions/ContentCollectionPanel.tsx:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/submissions/ContentCollectionPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51b24cb11c4eec84", "name": "Commented-code block (5 lines) in frontend/src/components/submissions/CriticalPathPanel.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/CriticalPathPanel.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04d4bd05fa0b2bf5", "name": "Commented-code block (5 lines) in frontend/src/components/submissions/ProvisioningErrorBanner.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/ProvisioningErrorBanner.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7ccecf83456d913", "name": "Commented-code block (7 lines) in frontend/src/components/tmf/TMFVersionComparison.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/tmf/TMFVersionComparison.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f022f8313710788", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:180"}, "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-fcb01a4e8fd19001", "name": "Commented-code block (5 lines) in frontend/src/components/tmf/TMFComplianceDashboard.tsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/tmf/TMFComplianceDashboard.tsx:41"}, "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-c86f2f3ecc8d940a", "name": "Commented-code block (5 lines) in frontend/src/components/ectd/SequenceTimeline.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ectd/SequenceTimeline.tsx:36"}, "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-026b5dd1bcb61d9b", "name": "Commented-code block (5 lines) in frontend/src/components/ectd/DocumentComparison.tsx:27", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ectd/DocumentComparison.tsx:27"}, "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-311edebc449a97e7", "name": "Commented-code block (6 lines) in frontend/src/components/cross-module/CrossModuleBridgeVisualization.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/cross-module/CrossModuleBridgeVisualization.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d04e7e9a834489aa", "name": "Commented-code block (6 lines) in frontend/src/components/lix/LixPanel.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/lix/LixPanel.tsx:2"}, "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-ba34d467e8c211a4", "name": "Commented-code block (6 lines) in frontend/src/components/lix/LixAuditRow.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/lix/LixAuditRow.tsx:2"}, "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-a7db4fd231c77ee7", "name": "Commented-code block (7 lines) in frontend/src/components/lix/LixMessage.tsx:7", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/lix/LixMessage.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-455fd4ce1990c4b1", "name": "Commented-code block (8 lines) in frontend/src/components/documents/ApprovalQueueDashboard.tsx:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/documents/ApprovalQueueDashboard.tsx:2"}, "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-559c1e3ab8693bb2", "name": "Commented-code block (7 lines) in frontend/src/components/documents/CreateLinkModal.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/CreateLinkModal.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e8236ac35cd08feb", "name": "Commented-code block (7 lines) in frontend/src/components/documents/LinkedDocumentsPanel.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/LinkedDocumentsPanel.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e33adbcdd6c18ca", "name": "Commented-code block (6 lines) in frontend/src/components/documents/DocumentLinkActions.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/documents/DocumentLinkActions.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4cb21542db6bcce0", "name": "Commented-code block (7 lines) in frontend/src/components/documents/LinkValidator.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/LinkValidator.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-279ff89fd47b3790", "name": "Commented-code block (6 lines) in frontend/src/components/collaboration/SessionIndicator.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/SessionIndicator.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-819e52776d3bf512", "name": "Commented-code block (6 lines) in frontend/src/components/collaboration/RemoteCursors.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/RemoteCursors.tsx:2"}, "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-30fa2193c449cc00", "name": "Commented-code block (6 lines) in frontend/src/components/collaboration/PresenceAvatars.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/PresenceAvatars.tsx:2"}, "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-8ff3af9a455d6ae6", "name": "Commented-code block (6 lines) in frontend/src/components/collaboration/CollaborativeEditor.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/CollaborativeEditor.tsx:2"}, "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-59321e634fab66f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/documents-api.ts:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/documents-api.ts:116"}, "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-3e8ebb9fd8cf862c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/products-api.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/products-api.ts:132"}, "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-6c6a8f0c1170f119", "name": "Commented-code block (6 lines) in frontend/src/lib/stability-submissions-bridge.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/stability-submissions-bridge.ts:2"}, "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-24d178cb271e4b09", "name": "Commented-code block (6 lines) in frontend/src/lib/biostats-submissions-bridge.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/biostats-submissions-bridge.ts:2"}, "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-84e23b6547519398", "name": "Commented-code block (5 lines) in frontend/src/lib/cascade-resume.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/cascade-resume.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1e28dc34808658d", "name": "Commented-code block (6 lines) in frontend/src/lib/agent-engine.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/agent-engine.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77a4de23f1ecdc64", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/agent-engine.ts:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/agent-engine.ts:102"}, "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-30f49d52d6fa33b8", "name": "Commented-code block (6 lines) in frontend/src/lib/learning-prompt-injector.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/learning-prompt-injector.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-051e555ad578ffbc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/safety-api.ts:195", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/safety-api.ts:195"}, "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-9f932d95fa403704", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/submissions-api.ts:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/submissions-api.ts:211"}, "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-6ac88c2cf421a7d0", "name": "Commented-code block (7 lines) in frontend/src/lib/agent-api-fetch.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-api-fetch.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35f977c662160f45", "name": "Commented-code block (6 lines) in frontend/src/lib/agent-store.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/agent-store.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aef3ebefb826f55d", "name": "Commented-code block (7 lines) in frontend/src/lib/agent-registry.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-registry.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf67a405a20b5dda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/haq-api.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/haq-api.ts:100"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e19dcf0daafb3b2b", "name": "Commented-code block (6 lines) in frontend/src/lib/spl-labeling-bridge.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/spl-labeling-bridge.ts:2"}, "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-a413aba6409711ce", "name": "Commented-code block (5 lines) in frontend/src/lib/date-calculation-engine.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/date-calculation-engine.ts:2"}, "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-be1a9c5a3ea92abe", "name": "Commented-code block (5 lines) in frontend/src/lib/learning-store.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/learning-store.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33002bed4765920d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/applications-api.ts:212", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/applications-api.ts:212"}, "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-1933bfe9d23f029c", "name": "Commented-code block (7 lines) in frontend/src/lib/proactive-monitor-store.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/proactive-monitor-store.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e07ac380fe05473", "name": "Commented-code block (7 lines) in frontend/src/lib/agent-write-back.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-write-back.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-127f68da4dca277a", "name": "Commented-code block (7 lines) in frontend/src/lib/user-store.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/user-store.ts:2"}, "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-f17282c51fbb114c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/error-reporting.ts:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/error-reporting.ts:157"}, "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-06b7612b2b6bbffb", "name": "Commented-code block (5 lines) in frontend/src/lib/cascade-state-store.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/cascade-state-store.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba2a6d91ab9946e1", "name": "Commented-code block (7 lines) in frontend/src/lib/audit-store.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/audit-store.ts:2"}, "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-be8e0b4b37724cdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/studies-api.ts:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/studies-api.ts:121"}, "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-39badbf89b0f2e85", "name": "Commented-code block (6 lines) in frontend/src/lib/cascade-types.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/cascade-types.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-754e5622e266cfd5", "name": "Commented-code block (5 lines) in frontend/src/lib/integrations/docuvera/webhooks.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/integrations/docuvera/webhooks.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b215d8477a2bf9fc", "name": "Commented-code block (6 lines) in frontend/src/lib/integrations/docuvera/client.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/integrations/docuvera/client.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0777fa1e43995f29", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/integrations/docuvera/client.ts:476", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/integrations/docuvera/client.ts:476"}, "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-d0fb6bd188239291", "name": "Commented-code block (7 lines) in frontend/src/lib/integrations/docuvera/service.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/integrations/docuvera/service.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-883d99861e002484", "name": "Commented-code block (8 lines) in frontend/src/lib/integrations/docuvera/types.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/lib/integrations/docuvera/types.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cc4117a30f69bb2", "name": "Commented-code block (5 lines) in frontend/src/lib/security/audit.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/security/audit.ts:2"}, "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-242a9c2705856bab", "name": "Commented-code block (5 lines) in frontend/src/pages/TemplateBrowserPage.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/TemplateBrowserPage.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9c50d1b55fbbe1a", "name": "Commented-code block (6 lines) in frontend/src/hooks/usePreserveModuleState.ts:17", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/hooks/usePreserveModuleState.ts:17"}, "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-46cc24c7856e571b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePDFIngestion.tsx:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePDFIngestion.tsx:160"}, "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-2cead9cc8540ef7d", "name": "Commented-code block (6 lines) in frontend/src/hooks/useSafetyNarrativeRAG.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/hooks/useSafetyNarrativeRAG.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5246c81a813e16b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTMFPersistence.ts:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTMFPersistence.ts:91"}, "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-01f0e28894fbc509", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDocumentControlPersistence.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDocumentControlPersistence.ts:77"}, "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-fd935cd77ac05fee", "name": "Commented-code block (9 lines) in frontend/src/hooks/useResearchPersistence.ts:332", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/hooks/useResearchPersistence.ts:332"}, "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-25a2c3ea3d6aac90", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168"}, "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-55a2a1ee5b5e5964", "name": "Commented-code block (5 lines) in frontend/src/hooks/useLixAgent.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useLixAgent.ts:2"}, "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-3aa8139621c4e459", "name": "Commented-code block (6 lines) in frontend/src/hooks/useCollaboration.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/hooks/useCollaboration.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd2894eb410529a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthoringPersistence.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthoringPersistence.ts:159"}, "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-1ec454666100b5d2", "name": "Commented-code block (5 lines) in frontend/src/services/cross-module-lineage-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/cross-module-lineage-service.ts:2"}, "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-accfc67e07aa639a", "name": "Commented-code block (5 lines) in frontend/src/services/bidirectional-sync-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/bidirectional-sync-service.ts:2"}, "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-f8d0ee6b5778cc0c", "name": "Commented-code block (6 lines) in frontend/src/services/submission-archive-service.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/submission-archive-service.ts:2"}, "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-7782b8cb9a92a263", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/anthropic-service.ts:285", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/anthropic-service.ts:285"}, "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-c387956011817759", "name": "Commented-code block (5 lines) in frontend/src/services/validation-protocol-generator.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/validation-protocol-generator.ts:2"}, "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-6177dab77e4dd471", "name": "Commented-code block (6 lines) in frontend/src/services/validation-report-service.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/validation-report-service.ts:2"}, "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-5fec3250d69a7044", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/retry-strategies-service.ts:318", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/retry-strategies-service.ts:318"}, "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-12990f44844f8bb5", "name": "Commented-code block (5 lines) in frontend/src/services/template-usage-tracking-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/template-usage-tracking-service.ts:2"}, "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-b19c2cceb0acabee", "name": "Commented-code block (5 lines) in frontend/src/services/usage-event-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/usage-event-service.ts:2"}, "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-712b6ae85569e815", "name": "Commented-code block (5 lines) in frontend/src/services/usdm-authoring-template-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/usdm-authoring-template-service.ts:2"}, "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-bb8b5e52fe37f8ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/resilient-executor-service.ts:901", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/resilient-executor-service.ts:901"}, "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-25e21dc1b4a0441b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/ctms-persistence.ts:170", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/ctms-persistence.ts:170"}, "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-02d962c389711a31", "name": "Commented-code block (6 lines) in frontend/src/services/sop-library-service.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/sop-library-service.ts:2"}, "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-eecf610cf27304e3", "name": "Commented-code block (5 lines) in frontend/src/services/usdm-ctms-sync-service.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/usdm-ctms-sync-service.ts:2"}, "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-979bab9187b33f5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/notification-channels-service.ts:263", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/notification-channels-service.ts:263"}, "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-87773e7c8e351450", "name": "Commented-code block (5 lines) in frontend/src/services/track-changes/config.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/track-changes/config.ts:2"}, "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-88bfd6264130239a", "name": "Commented-code block (7 lines) in frontend/src/services/track-changes/comparison-engine.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/track-changes/comparison-engine.ts:2"}, "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-499d1af8036ad0cf", "name": "Commented-code block (6 lines) in frontend/src/services/track-changes/track-changes-service.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/track-changes-service.ts:2"}, "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-f2a49b76c8ff4379", "name": "Commented-code block (6 lines) in frontend/src/services/track-changes/revision-processor.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/revision-processor.ts:2"}, "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-bf5f8bd59144c971", "name": "Commented-code block (6 lines) in frontend/src/services/track-changes/ooxml-types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/ooxml-types.ts:2"}, "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-5dc1c8ea5391ec1a", "name": "Commented-code block (6 lines) in frontend/src/services/track-changes/docx-builder.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/docx-builder.ts:2"}, "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-0bf5df1269e05352", "name": "Commented-code block (5 lines) in frontend/src/services/mock/MockStructuredContentService.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockStructuredContentService.ts:2"}, "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-e189ad373d8e5563", "name": "Commented-code block (5 lines) in frontend/src/services/mock/MockPDFExtractionService.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockPDFExtractionService.ts:2"}, "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-cb33a728fa0fef2f", "name": "Commented-code block (5 lines) in frontend/src/services/mock/MockTrackChangesExportService.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockTrackChangesExportService.ts:2"}, "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-fbdcdcde3f4da432", "name": "Commented-code block (6 lines) in frontend/src/services/rag/memory-vector-store.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/memory-vector-store.ts:2"}, "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-b315f582b31e49c0", "name": "Commented-code block (6 lines) in frontend/src/services/rag/anthropic-embeddings.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/anthropic-embeddings.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5f5c5ee74a6d6e2", "name": "Commented-code block (6 lines) in frontend/src/services/rag/pgvector-store.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/pgvector-store.ts:2"}, "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-ded8a4f0a28c98d8", "name": "Commented-code block (5 lines) in frontend/src/services/rag/vector-store-factory.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/rag/vector-store-factory.ts:2"}, "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-441697c812556fd4", "name": "Commented-code block (6 lines) in frontend/src/services/rag/rag-config.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/rag-config.ts:2"}, "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-c2a86930f1c2e785", "name": "Commented-code block (6 lines) in frontend/src/services/rag/types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/types.ts:2"}, "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-8a856f225019398b", "name": "Commented-code block (6 lines) in frontend/src/services/rag/vector-store.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/vector-store.ts:2"}, "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-bac3c79a389dd4e8", "name": "Commented-code block (5 lines) in frontend/src/services/structured-content/migrations.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/structured-content/migrations.ts:2"}, "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-31ad27b7bc24ae23", "name": "Legacy-named symbol `daysOld` in frontend/src/services/agents/submission-assembly-agent.ts:112", "shortDescription": {"text": "Legacy-named symbol `daysOld` in frontend/src/services/agents/submission-assembly-agent.ts:112"}, "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-b736dc57a173659f", "name": "Commented-code block (6 lines) in frontend/src/services/agents/submission-assembly-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/submission-assembly-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad1727a563e5ad9f", "name": "Commented-code block (6 lines) in frontend/src/services/agents/study-operations-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/study-operations-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-157e4897ed649543", "name": "Commented-code block (10 lines) in frontend/src/services/agents/icsr-processing-agent.ts:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/services/agents/icsr-processing-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5365251db5be4e4", "name": "Commented-code block (6 lines) in frontend/src/services/agents/medical-affairs-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/medical-affairs-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b08b4f91124a3ecc", "name": "Commented-code block (6 lines) in frontend/src/services/agents/biostatistician-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/biostatistician-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-949aea58d6de5278", "name": "Commented-code block (6 lines) in frontend/src/services/agents/ind-nda-chain.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/ind-nda-chain.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7380e3d8d1e1ccb", "name": "Commented-code block (9 lines) in frontend/src/services/agents/haq-response-agent.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/services/agents/haq-response-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6aafe8b56aa2f72d", "name": "Commented-code block (6 lines) in frontend/src/services/agents/labeling-management-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/labeling-management-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d123917ff72cb65", "name": "Commented-code block (7 lines) in frontend/src/services/agents/medical-monitor-agent.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/agents/medical-monitor-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3529d574e4b7e4b6", "name": "Commented-code block (6 lines) in frontend/src/services/agents/reg-strategy-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/reg-strategy-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ef65444f41922dd", "name": "Commented-code block (6 lines) in frontend/src/services/agents/site-monitoring-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/site-monitoring-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-185d931f9cd62c82", "name": "Commented-code block (6 lines) in frontend/src/services/agents/research-intelligence-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/research-intelligence-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4562e35fc7bb4655", "name": "Commented-code block (5 lines) in frontend/src/services/agents/cascade-orchestrator.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/services/agents/cascade-orchestrator.ts:10"}, "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-f25315e563c517e7", "name": "Commented-code block (6 lines) in frontend/src/services/agents/cmc-lifecycle-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/cmc-lifecycle-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d981ac2c21e0d393", "name": "Commented-code block (6 lines) in frontend/src/services/agents/signal-intelligence-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/signal-intelligence-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-938d26e29ad1ec54", "name": "Commented-code block (6 lines) in frontend/src/services/agents/lead-optimisation-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/lead-optimisation-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-592fc79754004dda", "name": "Commented-code block (7 lines) in frontend/src/services/agents/document-resolution-agent.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/agents/document-resolution-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d79381f4e44b9a4", "name": "Commented-code block (10 lines) in frontend/src/services/agents/portfolio-intelligence-agent.ts:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/services/agents/portfolio-intelligence-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-714a44f4da01f573", "name": "Commented-code block (6 lines) in frontend/src/services/agents/nonclinical-package-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/nonclinical-package-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f036367137d334f3", "name": "Commented-code block (6 lines) in frontend/src/services/agents/quality-intelligence-agent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/quality-intelligence-agent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a386b8c1a9056cb2", "name": "Commented-code block (6 lines) in frontend/src/services/gateway/useGatewayStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/gateway/useGatewayStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea722a689f8b223f", "name": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-service.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-service.ts:2"}, "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-f0917ebe0f7d31a8", "name": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-audit-service.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-audit-service.ts:2"}, "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-e2c3fd217a93a4d1", "name": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-types.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-types.ts:2"}, "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-e91b4fdc6fbb6aaa", "name": "Commented-code block (6 lines) in frontend/src/services/pdf/layout-analyzer.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/layout-analyzer.ts:2"}, "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-68609fea7b454ec3", "name": "Commented-code block (6 lines) in frontend/src/services/pdf/claude-vision-client.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/claude-vision-client.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8351171c08f4b2e0", "name": "Commented-code block (7 lines) in frontend/src/services/pdf/table-extractor.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/table-extractor.ts:2"}, "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-68d8950b7fe5348a", "name": "Commented-code block (7 lines) in frontend/src/services/pdf/pdf-processor.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/pdf-processor.ts:2"}, "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-a9206000f2b7c1f7", "name": "Commented-code block (6 lines) in frontend/src/services/pdf/pdf-config.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/pdf-config.ts:2"}, "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-d9f32f67ef642cbf", "name": "Commented-code block (7 lines) in frontend/src/services/pdf/figure-extractor.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/figure-extractor.ts:2"}, "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-8a773f3cf2ecc298", "name": "Commented-code block (6 lines) in frontend/src/services/pdf/types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/types.ts:2"}, "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-26d5436530ad6864", "name": "Commented-code block (6 lines) in frontend/src/services/collaboration/conflict-resolver.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/conflict-resolver.ts:2"}, "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-46efbe1a3820c7b5", "name": "Commented-code block (6 lines) in frontend/src/services/collaboration/websocket-server.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/websocket-server.ts:2"}, "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-d3b94bd333a5a620", "name": "Commented-code block (6 lines) in frontend/src/services/collaboration/cursor-sync.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/cursor-sync.ts:2"}, "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-a91457b20da22201", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/collaboration/offline-queue-service.ts:345", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/collaboration/offline-queue-service.ts:345"}, "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-023e5cc4935af735", "name": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-analytics-service.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-analytics-service.ts:2"}, "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-d424e9de45dc8179", "name": "Commented-code block (7 lines) in frontend/src/services/collaboration/replay-engine.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/replay-engine.ts:2"}, "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-b211de1ec6445452", "name": "Commented-code block (6 lines) in frontend/src/services/collaboration/presence-service.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/presence-service.ts:2"}, "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-5d5051f1b3fc3496", "name": "Commented-code block (6 lines) in frontend/src/services/collaboration/session-manager.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/session-manager.ts:2"}, "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-1c729fcf2ac03ee5", "name": "Commented-code block (7 lines) in frontend/src/services/collaboration/operation-history.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/operation-history.ts:2"}, "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-10dbb02000d5debb", "name": "Commented-code block (8 lines) in frontend/src/services/collaboration/operation-compactor.ts:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/services/collaboration/operation-compactor.ts:2"}, "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-03ec1acd3ddd7c60", "name": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-recovery.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-recovery.ts:2"}, "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-edc9ff387b528195", "name": "Commented-code block (7 lines) in frontend/src/services/collaboration/collaboration-repository.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/collaboration-repository.ts:2"}, "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-a9fb4fa7f2540c8d", "name": "Commented-code block (11 lines) in frontend/src/store/useSubmissionTaskStore.ts:2", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/store/useSubmissionTaskStore.ts:2"}, "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-6c5671ea58783dbd", "name": "Commented-code block (6 lines) in frontend/src/store/useGuidedScenarioStore.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useGuidedScenarioStore.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0c44daacccc0f2c", "name": "Commented-code block (7 lines) in frontend/src/store/useDocumentLinkStore.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/useDocumentLinkStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cabaa1ace6ee243e", "name": "Commented-code block (6 lines) in frontend/src/store/useSubmissionCalendarStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useSubmissionCalendarStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa92fd520e4979bd", "name": "Commented-code block (5 lines) in frontend/src/store/aggregateReportTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/aggregateReportTypes.ts:2"}, "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-8a3c3b94a6be409b", "name": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleStore.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleStore.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26b5c375f09db9d7", "name": "Legacy-named symbol `d120_responses_v1` in frontend/src/store/useCampaignEnhancements.ts:97", "shortDescription": {"text": "Legacy-named symbol `d120_responses_v1` in frontend/src/store/useCampaignEnhancements.ts:97"}, "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-d3970f2c176dcf55", "name": "Commented-code block (5 lines) in frontend/src/store/useEDCStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useEDCStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ad1e0e77fd9ab05", "name": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleEventStore.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleEventStore.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de01143d735fe05a", "name": "Commented-code block (6 lines) in frontend/src/store/useSequenceTemplateStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useSequenceTemplateStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e0b16e0b8e8d1b6", "name": "Commented-code block (5 lines) in frontend/src/store/useDemoAnalyticsStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useDemoAnalyticsStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daa2163c13237f77", "name": "Commented-code block (5 lines) in frontend/src/store/documentControlTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/documentControlTypes.ts:2"}, "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-e2be995a04f9c638", "name": "Legacy-named symbol `3_DMP_v1` in frontend/src/store/useTMFStore.ts:413", "shortDescription": {"text": "Legacy-named symbol `3_DMP_v1` in frontend/src/store/useTMFStore.ts:413"}, "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-c16a87c81560ab18", "name": "Commented-code block (5 lines) in frontend/src/store/useTMFStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useTMFStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57424d2726d424af", "name": "Commented-code block (5 lines) in frontend/src/store/cross-reference-validation-types.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/cross-reference-validation-types.ts:2"}, "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-24359b7fb729e736", "name": "Commented-code block (5 lines) in frontend/src/store/useRegIntelStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useRegIntelStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-29b58d13aa9136c3", "name": "Commented-code block (5 lines) in frontend/src/store/usePSMFStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/usePSMFStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec6b2917b043f42b", "name": "Commented-code block (5 lines) in frontend/src/store/edcTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/edcTypes.ts:2"}, "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-61aa4c328c75fcf6", "name": "Commented-code block (6 lines) in frontend/src/store/ectdBuildingTypes.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/ectdBuildingTypes.ts:2"}, "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-caf2affad016c989", "name": "Commented-code block (5 lines) in frontend/src/store/regIntelTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/regIntelTypes.ts:2"}, "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-13a709b6f60e7161", "name": "Commented-code block (6 lines) in frontend/src/store/useCrossReferenceValidationStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useCrossReferenceValidationStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e00060c711e5e928", "name": "Commented-code block (5 lines) in frontend/src/store/ctmsTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/ctmsTypes.ts:2"}, "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-8cc6a1ca3ba676f7", "name": "Commented-code block (11 lines) in frontend/src/store/useContentCollectionStore.ts:2", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/store/useContentCollectionStore.ts:2"}, "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-73ac1abf84575573", "name": "Commented-code block (6 lines) in frontend/src/store/aiConsistencyEngineTypes.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/aiConsistencyEngineTypes.ts:2"}, "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-60fd56f5ef889856", "name": "Commented-code block (5 lines) in frontend/src/store/useCrossDocumentStore.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossDocumentStore.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-92797dfe1f958664", "name": "Commented-code block (6 lines) in frontend/src/store/useCTMSStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useCTMSStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb2a3e392558f59f", "name": "Commented-code block (7 lines) in frontend/src/store/useStabilityStore.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/useStabilityStore.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af4881725c99ef74", "name": "Commented-code block (7 lines) in frontend/src/store/useLabelingStore.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/useLabelingStore.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7869ee95e3ad5366", "name": "Commented-code block (5 lines) in frontend/src/store/aiIntegrationTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/aiIntegrationTypes.ts:2"}, "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-d4acb49828746df1", "name": "Commented-code block (5 lines) in frontend/src/store/submissionAdapterTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/submissionAdapterTypes.ts:2"}, "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-ff8c88b5a5dcb4ac", "name": "Commented-code block (6 lines) in frontend/src/store/cross-reference-types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/cross-reference-types.ts:2"}, "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-6ca005424b23ff50", "name": "Commented-code block (5 lines) in frontend/src/store/splTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/splTypes.ts:2"}, "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-2a7ae15be66bd2f8", "name": "Commented-code block (10 lines) in frontend/src/store/useNavigationStackStore.ts:7", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/store/useNavigationStackStore.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-621068db6a1b03ca", "name": "Commented-code block (6 lines) in frontend/src/store/useNotificationStore.ts:534", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useNotificationStore.ts:534"}, "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-c8e22aebfebddf72", "name": "Commented-code block (6 lines) in frontend/src/store/useSPLStore.ts:24", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useSPLStore.ts:24"}, "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-931bde20b1940afe", "name": "Commented-code block (5 lines) in frontend/src/store/regulatoryCalendarTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/regulatoryCalendarTypes.ts:2"}, "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-ef4194e5ffe2987b", "name": "Commented-code block (6 lines) in frontend/src/store/submission-calendar-types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/submission-calendar-types.ts:2"}, "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-53a5fed8542e46bf", "name": "Commented-code block (9 lines) in frontend/src/store/useSampleManagementStore.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/store/useSampleManagementStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcab8ceb6b9ea3da", "name": "Commented-code block (8 lines) in frontend/src/store/clinicalRegBridgeTypes.ts:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/store/clinicalRegBridgeTypes.ts:2"}, "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-e4ada5181dad2c7a", "name": "Commented-code block (6 lines) in frontend/src/store/ectd-sequence-template-types.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/ectd-sequence-template-types.ts:2"}, "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-d2e18b9525fc6b71", "name": "Commented-code block (11 lines) in frontend/src/store/useSubmissionLifecycleStore.ts:2", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/store/useSubmissionLifecycleStore.ts:2"}, "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-1315a4b1c29cda15", "name": "Legacy-named symbol `daysOld` in frontend/src/store/useActivityStore.ts:244", "shortDescription": {"text": "Legacy-named symbol `daysOld` in frontend/src/store/useActivityStore.ts:244"}, "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-5b59dbd237723625", "name": "Commented-code block (5 lines) in frontend/src/store/useFeatureFlags.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useFeatureFlags.ts:2"}, "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-de376b6b602e4700", "name": "Commented-code block (6 lines) in frontend/src/store/useECTDLinkValidationStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useECTDLinkValidationStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8be095a5867a68c7", "name": "Commented-code block (5 lines) in frontend/src/store/aiDocumentGenerationTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/aiDocumentGenerationTypes.ts:2"}, "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-b0e074cb8be2d6ea", "name": "Commented-code block (5 lines) in frontend/src/store/qmsTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/qmsTypes.ts:2"}, "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-80f2f6263de941f7", "name": "Commented-code block (5 lines) in frontend/src/store/usdmTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/usdmTypes.ts:2"}, "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-ba95828d48d58f38", "name": "Commented-code block (5 lines) in frontend/src/store/tmfTypes.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/tmfTypes.ts:2"}, "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-72c2b6414b08be90", "name": "Commented-code block (7 lines) in frontend/src/store/ectd-publishing-types.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/ectd-publishing-types.ts:2"}, "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-af42d96992075144", "name": "Commented-code block (7 lines) in frontend/src/store/ectd-regional-types.ts:2", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/ectd-regional-types.ts:2"}, "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-fc9188b0394214cd", "name": "Commented-code block (5 lines) in frontend/src/store/useStudyIntelStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/store/useStudyIntelStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de625175c1240050", "name": "Commented-code block (7 lines) in frontend/src/store/useBiostatsStore.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/store/useBiostatsStore.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0c5e14e66928769", "name": "Commented-code block (6 lines) in frontend/src/store/useECTDPublishingStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useECTDPublishingStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c372fa3f965d2351", "name": "Commented-code block (8 lines) in frontend/src/store/safetyTypes.ts:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/store/safetyTypes.ts:2"}, "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-375617448eaf5346", "name": "Commented-code block (6 lines) in frontend/src/store/useGLPStore.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/useGLPStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2df6f1657e563835", "name": "Commented-code block (6 lines) in frontend/src/store/haqResponseTypes.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/haqResponseTypes.ts:2"}, "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-dc0aa31232c06c46", "name": "Commented-code block (7 lines) in frontend/src/domains/usdm/contracts.ts:1057", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/domains/usdm/contracts.ts:1057"}, "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-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APP_VERSION`, `NODE_ENV`, `VERCEL_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/routers/studies.py:list_studies, backend/app/routers/submissions.py:list_submissions, backend/app/routers/products.py:list_products, backend/app/routers/haqs.py:list_haqs\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/routers/submissions.py:update_submission, backend/app/routers/haqs.py:update_haq, backend/app/routers/documents.py:update_document, backend/app/routers/safety.py:update_safety_report\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/routers/ai.py:generate, backend/app/routers/ai.py:haq_rag_synthesize\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8fca458ba692ec29", "name": "Frontend route `/review` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/review` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cc54eabaec6fa3c", "name": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e63d5cd06c24ebe", "name": "Frontend route `/demo/template-browser` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/demo/template-browser` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cbbcd9569d13045", "name": "Frontend route `/spike/streaming` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/spike/streaming` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b155cf1272aa29e8", "name": "Frontend route `/spike/haq-rag` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/spike/haq-rag` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcfb4a7e4afd2f8e", "name": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:134", "shortDescription": {"text": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:134"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ad1acc716518c2d", "name": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:135", "shortDescription": {"text": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:135"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6bb10528125ce747", "name": "FastAPI PATCH `update_study` without auth dependency \u2014 backend/app/routers/studies.py:189", "shortDescription": {"text": "FastAPI PATCH `update_study` without auth dependency \u2014 backend/app/routers/studies.py:189"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7f59abc71fae742c", "name": "FastAPI PUT `update_study` without auth dependency \u2014 backend/app/routers/studies.py:190", "shortDescription": {"text": "FastAPI PUT `update_study` without auth dependency \u2014 backend/app/routers/studies.py:190"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-551a8cb4aabb1e4d", "name": "FastAPI DELETE `delete_study` without auth dependency \u2014 backend/app/routers/studies.py:239", "shortDescription": {"text": "FastAPI DELETE `delete_study` without auth dependency \u2014 backend/app/routers/studies.py:239"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e195b0b79c708528", "name": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:185", "shortDescription": {"text": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:185"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-536094329b3eadaa", "name": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:186", "shortDescription": {"text": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:186"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-753a43b3779c6224", "name": "FastAPI PATCH `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:285", "shortDescription": {"text": "FastAPI PATCH `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:285"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3544d41e00acf6ba", "name": "FastAPI PUT `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:286", "shortDescription": {"text": "FastAPI PUT `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:286"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71ab69f7e7351717", "name": "FastAPI DELETE `delete_submission` without auth dependency \u2014 backend/app/routers/submissions.py:344", "shortDescription": {"text": "FastAPI DELETE `delete_submission` without auth dependency \u2014 backend/app/routers/submissions.py:344"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-91e114b556b2f149", "name": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:185", "shortDescription": {"text": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:185"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c52e23dc2291c955", "name": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:186", "shortDescription": {"text": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:186"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ada147428ed927b1", "name": "FastAPI PUT `update_product` without auth dependency \u2014 backend/app/routers/products.py:279", "shortDescription": {"text": "FastAPI PUT `update_product` without auth dependency \u2014 backend/app/routers/products.py:279"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00f1e6a0331c2dbf", "name": "FastAPI DELETE `delete_product` without auth dependency \u2014 backend/app/routers/products.py:318", "shortDescription": {"text": "FastAPI DELETE `delete_product` without auth dependency \u2014 backend/app/routers/products.py:318"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d1f2d84ac575df8d", "name": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:163", "shortDescription": {"text": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:163"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d874312c01d6164a", "name": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:164", "shortDescription": {"text": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:164"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32d75f7ad1b053c3", "name": "FastAPI PATCH `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:254", "shortDescription": {"text": "FastAPI PATCH `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:254"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e543a3e1f34e2b6b", "name": "FastAPI PUT `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:255", "shortDescription": {"text": "FastAPI PUT `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:255"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f7faf4d5ed809f2", "name": "FastAPI DELETE `delete_haq` without auth dependency \u2014 backend/app/routers/haqs.py:319", "shortDescription": {"text": "FastAPI DELETE `delete_haq` without auth dependency \u2014 backend/app/routers/haqs.py:319"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db9b21f0d2a5329f", "name": "FastAPI POST `generate` without auth dependency \u2014 backend/app/routers/ai.py:38", "shortDescription": {"text": "FastAPI POST `generate` without auth dependency \u2014 backend/app/routers/ai.py:38"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-105f47620fcbf6be", "name": "FastAPI POST `haq_rag_synthesize` without auth dependency \u2014 backend/app/routers/ai.py:122", "shortDescription": {"text": "FastAPI POST `haq_rag_synthesize` without auth dependency \u2014 backend/app/routers/ai.py:122"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-22244e2628755995", "name": "FastAPI POST `section_generate` without auth dependency \u2014 backend/app/routers/ai.py:248", "shortDescription": {"text": "FastAPI POST `section_generate` without auth dependency \u2014 backend/app/routers/ai.py:248"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ec4cecd10187473", "name": "FastAPI POST `inference` without auth dependency \u2014 backend/app/routers/ai.py:422", "shortDescription": {"text": "FastAPI POST `inference` without auth dependency \u2014 backend/app/routers/ai.py:422"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8027d61a38b5aee9", "name": "FastAPI POST `rag_retrieve` without auth dependency \u2014 backend/app/routers/ai.py:482", "shortDescription": {"text": "FastAPI POST `rag_retrieve` without auth dependency \u2014 backend/app/routers/ai.py:482"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92c4ccc1ec4954e9", "name": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:151", "shortDescription": {"text": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:151"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ffbef5a8877728c", "name": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:152", "shortDescription": {"text": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:152"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7336b76147ed1c4", "name": "FastAPI PATCH `update_document` without auth dependency \u2014 backend/app/routers/documents.py:246", "shortDescription": {"text": "FastAPI PATCH `update_document` without auth dependency \u2014 backend/app/routers/documents.py:246"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-50294560365dd425", "name": "FastAPI PUT `update_document` without auth dependency \u2014 backend/app/routers/documents.py:247", "shortDescription": {"text": "FastAPI PUT `update_document` without auth dependency \u2014 backend/app/routers/documents.py:247"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4791885ae78c5783", "name": "FastAPI DELETE `delete_document` without auth dependency \u2014 backend/app/routers/documents.py:316", "shortDescription": {"text": "FastAPI DELETE `delete_document` without auth dependency \u2014 backend/app/routers/documents.py:316"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a9ea032b89e811d4", "name": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:158", "shortDescription": {"text": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:158"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d687dc582b514149", "name": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:159", "shortDescription": {"text": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:159"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97c53bde373b4245", "name": "FastAPI PATCH `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:240", "shortDescription": {"text": "FastAPI PATCH `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:240"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c64647b1f15e1360", "name": "FastAPI PUT `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:241", "shortDescription": {"text": "FastAPI PUT `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:241"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-020917f78600521c", "name": "FastAPI DELETE `delete_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:314", "shortDescription": {"text": "FastAPI DELETE `delete_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:314"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-344d5b82042e9a33", "name": "Dangling fetch: GET /api/submissions?${params.toString()} (frontend/src/stores/submissions-store.ts:234)", "shortDescription": {"text": "Dangling fetch: GET /api/submissions?${params.toString()} (frontend/src/stores/submissions-store.ts:234)"}, "fullDescription": {"text": "`frontend/src/stores/submissions-store.ts:234` calls `GET /api/submissions?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions`\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-bac0b492f78b5ac8", "name": "Dangling fetch: POST /api/submissions (frontend/src/stores/submissions-store.ts:279)", "shortDescription": {"text": "Dangling fetch: POST /api/submissions (frontend/src/stores/submissions-store.ts:279)"}, "fullDescription": {"text": "`frontend/src/stores/submissions-store.ts:279` calls `POST /api/submissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions`\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-6d3ed1efed9a9716", "name": "Dangling fetch: PUT /api/submissions/${id} (frontend/src/stores/submissions-store.ts:316)", "shortDescription": {"text": "Dangling fetch: PUT /api/submissions/${id} (frontend/src/stores/submissions-store.ts:316)"}, "fullDescription": {"text": "`frontend/src/stores/submissions-store.ts:316` calls `PUT /api/submissions/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/<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-e9423ca860c21135", "name": "Dangling fetch: DELETE /api/submissions/${id} (frontend/src/stores/submissions-store.ts:340)", "shortDescription": {"text": "Dangling fetch: DELETE /api/submissions/${id} (frontend/src/stores/submissions-store.ts:340)"}, "fullDescription": {"text": "`frontend/src/stores/submissions-store.ts:340` calls `DELETE /api/submissions/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/<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-144f800fab6d0b9f", "name": "Dangling fetch: GET /api/products?${params.toString()} (frontend/src/stores/products-store.ts:89)", "shortDescription": {"text": "Dangling fetch: GET /api/products?${params.toString()} (frontend/src/stores/products-store.ts:89)"}, "fullDescription": {"text": "`frontend/src/stores/products-store.ts:89` calls `GET /api/products?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/products`\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-143633cab9c217dc", "name": "Dangling fetch: POST /api/products (frontend/src/stores/products-store.ts:131)", "shortDescription": {"text": "Dangling fetch: POST /api/products (frontend/src/stores/products-store.ts:131)"}, "fullDescription": {"text": "`frontend/src/stores/products-store.ts:131` calls `POST /api/products` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/products`\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-cba91c819afd9eaa", "name": "Dangling fetch: PUT /api/products/${id} (frontend/src/stores/products-store.ts:176)", "shortDescription": {"text": "Dangling fetch: PUT /api/products/${id} (frontend/src/stores/products-store.ts:176)"}, "fullDescription": {"text": "`frontend/src/stores/products-store.ts:176` calls `PUT /api/products/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/products/<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-2872b14cb284709c", "name": "Dangling fetch: DELETE /api/products/${id} (frontend/src/stores/products-store.ts:199)", "shortDescription": {"text": "Dangling fetch: DELETE /api/products/${id} (frontend/src/stores/products-store.ts:199)"}, "fullDescription": {"text": "`frontend/src/stores/products-store.ts:199` calls `DELETE /api/products/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/products/<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-76d6729d9ce18b1b", "name": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/stores/document-store.ts:204)", "shortDescription": {"text": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/stores/document-store.ts:204)"}, "fullDescription": {"text": "`frontend/src/stores/document-store.ts:204` calls `GET /api/documents?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents`\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-02b68ae08dfcfa41", "name": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:253)", "shortDescription": {"text": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:253)"}, "fullDescription": {"text": "`frontend/src/stores/document-store.ts:253` calls `PUT /api/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/<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-bd4930dcc39f19cf", "name": "Dangling fetch: POST /api/documents (frontend/src/stores/document-store.ts:276)", "shortDescription": {"text": "Dangling fetch: POST /api/documents (frontend/src/stores/document-store.ts:276)"}, "fullDescription": {"text": "`frontend/src/stores/document-store.ts:276` calls `POST /api/documents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents`\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-da83f945dcc5ad9b", "name": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:316)", "shortDescription": {"text": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:316)"}, "fullDescription": {"text": "`frontend/src/stores/document-store.ts:316` calls `PUT /api/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/<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-129c4224ff1d7c3c", "name": "Dangling fetch: DELETE /api/documents/${id} (frontend/src/stores/document-store.ts:335)", "shortDescription": {"text": "Dangling fetch: DELETE /api/documents/${id} (frontend/src/stores/document-store.ts:335)"}, "fullDescription": {"text": "`frontend/src/stores/document-store.ts:335` calls `DELETE /api/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/<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-1bcebd0a4dbbca11", "name": "Dangling fetch: GET /api/auth/session (frontend/src/components/layout/Header.tsx:116)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/session (frontend/src/components/layout/Header.tsx:116)"}, "fullDescription": {"text": "`frontend/src/components/layout/Header.tsx:116` calls `GET /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/session`\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-eef9355962f82572", "name": "Dangling fetch: POST /api/auth/logout (frontend/src/components/layout/Header.tsx:141)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (frontend/src/components/layout/Header.tsx:141)"}, "fullDescription": {"text": "`frontend/src/components/layout/Header.tsx:141` 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-926b54d7e6a6a735", "name": "Dangling fetch: POST /api/safety/aggregate-reports (frontend/src/components/safety/AggregateReportGenerationPanel.tsx:25", "shortDescription": {"text": "Dangling fetch: POST /api/safety/aggregate-reports (frontend/src/components/safety/AggregateReportGenerationPanel.tsx:256)"}, "fullDescription": {"text": "`frontend/src/components/safety/AggregateReportGenerationPanel.tsx:256` calls `POST /api/safety/aggregate-reports` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/safety/aggregate-reports`\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-2270c9da18c335de", "name": "Dangling fetch: POST /api/safety/e2b-xml (frontend/src/components/safety/XMLPreviewPanel.tsx:107)", "shortDescription": {"text": "Dangling fetch: POST /api/safety/e2b-xml (frontend/src/components/safety/XMLPreviewPanel.tsx:107)"}, "fullDescription": {"text": "`frontend/src/components/safety/XMLPreviewPanel.tsx:107` calls `POST /api/safety/e2b-xml` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/safety/e2b-xml`\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-4a786b46dea369b6", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:823)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:823)"}, "fullDescription": {"text": "`frontend/src/components/authoring/DocumentEditor.tsx:823` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-c19ab816d1a05fed", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:906)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:906)"}, "fullDescription": {"text": "`frontend/src/components/authoring/DocumentEditor.tsx:906` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-af4bc44ffaa96f12", "name": "Dangling fetch: GET /api/metrics (frontend/src/components/monitoring/ObservabilityDashboard.tsx:201)", "shortDescription": {"text": "Dangling fetch: GET /api/metrics (frontend/src/components/monitoring/ObservabilityDashboard.tsx:201)"}, "fullDescription": {"text": "`frontend/src/components/monitoring/ObservabilityDashboard.tsx:201` calls `GET /api/metrics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/metrics`\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-4d2d02d8d650b28e", "name": "Dangling fetch: GET /api/errors?limit=10 (frontend/src/components/monitoring/ObservabilityDashboard.tsx:202)", "shortDescription": {"text": "Dangling fetch: GET /api/errors?limit=10 (frontend/src/components/monitoring/ObservabilityDashboard.tsx:202)"}, "fullDescription": {"text": "`frontend/src/components/monitoring/ObservabilityDashboard.tsx:202` calls `GET /api/errors?limit=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/errors`\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-caf5e4eab036bb8c", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:700)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:700)"}, "fullDescription": {"text": "`frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:700` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-96f87464fb1c6d03", "name": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:573)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:573)"}, "fullDescription": {"text": "`frontend/src/components/glp/GLPEDCIntegrationTab.tsx:573` calls `POST /api/ai/glp-data-integrity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/glp-data-integrity`\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-060b8a76f5519a13", "name": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:622)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:622)"}, "fullDescription": {"text": "`frontend/src/components/glp/GLPEDCIntegrationTab.tsx:622` calls `POST /api/ai/glp-data-integrity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/glp-data-integrity`\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-49e6225190408cf8", "name": "Dangling fetch: POST /api/upload (frontend/src/components/ui/FileUpload.tsx:315)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (frontend/src/components/ui/FileUpload.tsx:315)"}, "fullDescription": {"text": "`frontend/src/components/ui/FileUpload.tsx:315` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload`\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-c8568f719792fdb5", "name": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/QMSScreen.tsx:2246)", "shortDescription": {"text": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/QMSScreen.tsx:2246)"}, "fullDescription": {"text": "`frontend/src/components/screens/QMSScreen.tsx:2246` calls `POST /api/signatures` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/signatures`\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-1240a9cc127adf0f", "name": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:646)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:646)"}, "fullDescription": {"text": "`frontend/src/components/screens/ResearchScreen.tsx:646` calls `POST /api/ai/ind-gap-analysis` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/ind-gap-analysis`\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-8dcc9cea24a5f543", "name": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:666)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:666)"}, "fullDescription": {"text": "`frontend/src/components/screens/ResearchScreen.tsx:666` calls `POST /api/ai/ind-gap-analysis` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/ind-gap-analysis`\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-3e183d2ee88c5bce", "name": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:688)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:688)"}, "fullDescription": {"text": "`frontend/src/components/screens/ResearchScreen.tsx:688` calls `POST /api/ai/research-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/research-intelligence`\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-50ed7c1509b23134", "name": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:715)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:715)"}, "fullDescription": {"text": "`frontend/src/components/screens/ResearchScreen.tsx:715` calls `POST /api/ai/research-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/research-intelligence`\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-60448e0e3ab16ec5", "name": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:820)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:820)"}, "fullDescription": {"text": "`frontend/src/components/screens/ResearchScreen.tsx:820` calls `POST /api/ai/research-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/research-intelligence`\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-0062add8dacd7ff2", "name": "Dangling fetch: GET /api/idmp/products (frontend/src/components/screens/IDMPDashboard.tsx:44)", "shortDescription": {"text": "Dangling fetch: GET /api/idmp/products (frontend/src/components/screens/IDMPDashboard.tsx:44)"}, "fullDescription": {"text": "`frontend/src/components/screens/IDMPDashboard.tsx:44` calls `GET /api/idmp/products` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/idmp/products`\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-2017fad977434fe2", "name": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2326)", "shortDescription": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2326)"}, "fullDescription": {"text": "`frontend/src/components/screens/RDArchivesScreen.tsx:2326` calls `GET /api/audit/export?format=csv` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/export`\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-c01819a24d2a07e4", "name": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2575)", "shortDescription": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2575)"}, "fullDescription": {"text": "`frontend/src/components/screens/RDArchivesScreen.tsx:2575` calls `GET /api/audit/export?format=csv` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/export`\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-9818f76a58da3607", "name": "Dangling fetch: POST /api/cross-module (frontend/src/components/screens/RDArchivesScreen.tsx:2579)", "shortDescription": {"text": "Dangling fetch: POST /api/cross-module (frontend/src/components/screens/RDArchivesScreen.tsx:2579)"}, "fullDescription": {"text": "`frontend/src/components/screens/RDArchivesScreen.tsx:2579` calls `POST /api/cross-module` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cross-module`\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-cf5246b5f0d2735d", "name": "Dangling fetch: GET /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1486)", "shortDescription": {"text": "Dangling fetch: GET /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1486)"}, "fullDescription": {"text": "`frontend/src/components/screens/BiostatsScreen.tsx:1486` calls `GET /api/biostats/sdtm-validation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/biostats/sdtm-validation`\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-3c081eba93fca88c", "name": "Dangling fetch: POST /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1931)", "shortDescription": {"text": "Dangling fetch: POST /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1931)"}, "fullDescription": {"text": "`frontend/src/components/screens/BiostatsScreen.tsx:1931` calls `POST /api/biostats/sdtm-validation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/biostats/sdtm-validation`\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-191d3308634e7993", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/components/screens/BiostatsScreen.tsx:2485)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/screens/BiostatsScreen.tsx:2485)"}, "fullDescription": {"text": "`frontend/src/components/screens/BiostatsScreen.tsx:2485` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-67d1287c9f723555", "name": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:316)", "shortDescription": {"text": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:316)"}, "fullDescription": {"text": "`frontend/src/components/screens/AdminScreen.tsx:316` calls `GET /api/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users`\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-0decc804643a1512", "name": "Dangling fetch: POST /api/users/invite (frontend/src/components/screens/AdminScreen.tsx:1194)", "shortDescription": {"text": "Dangling fetch: POST /api/users/invite (frontend/src/components/screens/AdminScreen.tsx:1194)"}, "fullDescription": {"text": "`frontend/src/components/screens/AdminScreen.tsx:1194` calls `POST /api/users/invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/invite`\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-5a0b8e4c1d6b95d2", "name": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:1207)", "shortDescription": {"text": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:1207)"}, "fullDescription": {"text": "`frontend/src/components/screens/AdminScreen.tsx:1207` calls `GET /api/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users`\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-da84faee7ddd8aaa", "name": "Dangling fetch: POST /api/safety/narrative (frontend/src/components/screens/SafetyScreen.tsx:1295)", "shortDescription": {"text": "Dangling fetch: POST /api/safety/narrative (frontend/src/components/screens/SafetyScreen.tsx:1295)"}, "fullDescription": {"text": "`frontend/src/components/screens/SafetyScreen.tsx:1295` calls `POST /api/safety/narrative` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/safety/narrative`\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-5d85df077d6d6a01", "name": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/SafetyScreen.tsx:3246)", "shortDescription": {"text": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/SafetyScreen.tsx:3246)"}, "fullDescription": {"text": "`frontend/src/components/screens/SafetyScreen.tsx:3246` calls `POST /api/signatures` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/signatures`\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-46852a353ef0c42a", "name": "Dangling fetch: POST /api/safety/report (frontend/src/components/screens/SignalDetectionScreen.tsx:392)", "shortDescription": {"text": "Dangling fetch: POST /api/safety/report (frontend/src/components/screens/SignalDetectionScreen.tsx:392)"}, "fullDescription": {"text": "`frontend/src/components/screens/SignalDetectionScreen.tsx:392` calls `POST /api/safety/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/safety/report`\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-8fb305bea88292c0", "name": "Dangling fetch: GET /api/audit (frontend/src/components/screens/CreateModals.tsx:531)", "shortDescription": {"text": "Dangling fetch: GET /api/audit (frontend/src/components/screens/CreateModals.tsx:531)"}, "fullDescription": {"text": "`frontend/src/components/screens/CreateModals.tsx:531` calls `GET /api/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit`\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-ee7c46c2bc29c550", "name": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/CreateModals.tsx:561)", "shortDescription": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/CreateModals.tsx:561)"}, "fullDescription": {"text": "`frontend/src/components/screens/CreateModals.tsx:561` calls `GET /api/audit/export?format=csv` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/export`\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-b06230e9ebe0000f", "name": "Dangling fetch: GET /api/agents/runs/${req.agentRunId} (frontend/src/components/screens/AgentHubScreen.tsx:470)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/runs/${req.agentRunId} (frontend/src/components/screens/AgentHubScreen.tsx:470)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:470` calls `GET /api/agents/runs/${req.agentRunId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/runs/<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-1f21ce4253377f9a", "name": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:480)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:480)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:480` calls `POST /api/agents/review/${req.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/review/<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-d8e24c2fb463146c", "name": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:486)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:486)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:486` calls `POST /api/agents/learning` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/learning`\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-e0d8e634650de0a8", "name": "Dangling fetch: GET /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:744)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:744)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:744` calls `GET /api/agents/cascade` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/cascade`\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-3bec159235fa2824", "name": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:772)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:772)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:772` calls `POST /api/agents/cascade` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/cascade`\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-4ebb5a0e3651eb46", "name": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1084)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1084)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1084` calls `POST /api/agents/trigger` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/trigger`\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-7ab31a51874d8825", "name": "Dangling fetch: GET /api/agents/proactive?include_scans=true (frontend/src/components/screens/AgentHubScreen.tsx:1258)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/proactive?include_scans=true (frontend/src/components/screens/AgentHubScreen.tsx:1258)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1258` calls `GET /api/agents/proactive?include_scans=true` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/proactive`\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-abf2e0cbdc15034d", "name": "Dangling fetch: POST /api/agents/proactive/scan (frontend/src/components/screens/AgentHubScreen.tsx:1272)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/proactive/scan (frontend/src/components/screens/AgentHubScreen.tsx:1272)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1272` calls `POST /api/agents/proactive/scan` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/proactive/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-cb49e99543427992", "name": "Dangling fetch: PATCH /api/agents/proactive/${id} (frontend/src/components/screens/AgentHubScreen.tsx:1283)", "shortDescription": {"text": "Dangling fetch: PATCH /api/agents/proactive/${id} (frontend/src/components/screens/AgentHubScreen.tsx:1283)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1283` calls `PATCH /api/agents/proactive/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/proactive/<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-df961eeec9424185", "name": "Dangling fetch: GET /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1493)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1493)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1493` calls `GET /api/agents/learning` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/learning`\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-1b37c3024ff65374", "name": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:1823)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:1823)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1823` calls `POST /api/agents/review/${req.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/review/<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-09fef56fa1b04d5c", "name": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1828)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1828)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1828` calls `POST /api/agents/learning` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/learning`\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-0702adca20b5ffcd", "name": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1994)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1994)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:1994` calls `POST /api/agents/trigger` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/trigger`\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-c8aaf41aa89c7ba1", "name": "Dangling fetch: GET /api/agents/review/${run.reviewRequestId} (frontend/src/components/screens/AgentHubScreen.tsx:2140)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/review/${run.reviewRequestId} (frontend/src/components/screens/AgentHubScreen.tsx:2140)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:2140` calls `GET /api/agents/review/${run.reviewRequestId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/review/<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-6dd207827db7ae8e", "name": "Dangling fetch: POST /api/agents/review/${reviewReq.id} (frontend/src/components/screens/AgentHubScreen.tsx:2151)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/review/${reviewReq.id} (frontend/src/components/screens/AgentHubScreen.tsx:2151)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:2151` calls `POST /api/agents/review/${reviewReq.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/review/<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-e6b894fa188c6e9d", "name": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:2156)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:2156)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:2156` calls `POST /api/agents/learning` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/learning`\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-897f583882438477", "name": "Dangling fetch: GET /api/agents/runs (frontend/src/components/screens/AgentHubScreen.tsx:2444)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/runs (frontend/src/components/screens/AgentHubScreen.tsx:2444)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:2444` calls `GET /api/agents/runs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/runs`\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-bc7acdc4b69080a7", "name": "Dangling fetch: GET /api/agents/review?status=pending (frontend/src/components/screens/AgentHubScreen.tsx:2445)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/review?status=pending (frontend/src/components/screens/AgentHubScreen.tsx:2445)"}, "fullDescription": {"text": "`frontend/src/components/screens/AgentHubScreen.tsx:2445` calls `GET /api/agents/review?status=pending` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/review`\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-0893955fc0328a64", "name": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/components/screens/HAQScreen.tsx:870)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/components/screens/HAQScreen.tsx:870)"}, "fullDescription": {"text": "`frontend/src/components/screens/HAQScreen.tsx:870` calls `POST /api/ai/haq-rag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/haq-rag`\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-abe41a13a09114ce", "name": "Dangling fetch: POST /api/haq/report (frontend/src/components/screens/HAQScreen.tsx:995)", "shortDescription": {"text": "Dangling fetch: POST /api/haq/report (frontend/src/components/screens/HAQScreen.tsx:995)"}, "fullDescription": {"text": "`frontend/src/components/screens/HAQScreen.tsx:995` calls `POST /api/haq/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haq/report`\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-ff84891b806bea63", "name": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/RDConnectedScreen.tsx:574)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/RDConnectedScreen.tsx:574)"}, "fullDescription": {"text": "`frontend/src/components/screens/RDConnectedScreen.tsx:574` calls `POST /api/agents/cascade` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/cascade`\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-712c050c749b053a", "name": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/RDConnectedScreen.tsx:590)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/RDConnectedScreen.tsx:590)"}, "fullDescription": {"text": "`frontend/src/components/screens/RDConnectedScreen.tsx:590` calls `POST /api/agents/trigger` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/trigger`\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-bf3220d8d21a84eb", "name": "Dangling fetch: GET /api/audit?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1542)", "shortDescription": {"text": "Dangling fetch: GET /api/audit?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1542)"}, "fullDescription": {"text": "`frontend/src/components/screens/AuditTrailDashboard.tsx:1542` calls `GET /api/audit?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit`\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-4326eeb2202504f3", "name": "Dangling fetch: GET /api/audit/verify-chain (frontend/src/components/screens/AuditTrailDashboard.tsx:1558)", "shortDescription": {"text": "Dangling fetch: GET /api/audit/verify-chain (frontend/src/components/screens/AuditTrailDashboard.tsx:1558)"}, "fullDescription": {"text": "`frontend/src/components/screens/AuditTrailDashboard.tsx:1558` calls `GET /api/audit/verify-chain` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/verify-chain`\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-60f9c687c88dc306", "name": "Dangling fetch: GET /api/audit/export?format=${fmt} (frontend/src/components/screens/AuditTrailDashboard.tsx:1573)", "shortDescription": {"text": "Dangling fetch: GET /api/audit/export?format=${fmt} (frontend/src/components/screens/AuditTrailDashboard.tsx:1573)"}, "fullDescription": {"text": "`frontend/src/components/screens/AuditTrailDashboard.tsx:1573` calls `GET /api/audit/export?format=${fmt}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/export`\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-e5eb3b27ed4ac343", "name": "Dangling fetch: GET /api/signatures?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1596)", "shortDescription": {"text": "Dangling fetch: GET /api/signatures?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1596)"}, "fullDescription": {"text": "`frontend/src/components/screens/AuditTrailDashboard.tsx:1596` calls `GET /api/signatures?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/signatures`\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-ab30797b7a965de0", "name": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1742)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1742)"}, "fullDescription": {"text": "`frontend/src/components/screens/StudyDesignScreen.tsx:1742` calls `POST /api/ai/usdm-protocol-assist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/usdm-protocol-assist`\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-fe1a4bb4b7ec89cf", "name": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1766)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1766)"}, "fullDescription": {"text": "`frontend/src/components/screens/StudyDesignScreen.tsx:1766` calls `POST /api/ai/usdm-protocol-assist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/usdm-protocol-assist`\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-a8815429fcec37de", "name": "Dangling fetch: POST /api/submissions/compile (frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132)", "shortDescription": {"text": "Dangling fetch: POST /api/submissions/compile (frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132)"}, "fullDescription": {"text": "`frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132` calls `POST /api/submissions/compile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/compile`\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-e0e33ab4060a3bf6", "name": "Dangling fetch: POST /api/submissions/global-plan (frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:96", "shortDescription": {"text": "Dangling fetch: POST /api/submissions/global-plan (frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:961)"}, "fullDescription": {"text": "`frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:961` calls `POST /api/submissions/global-plan` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/global-plan`\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-38ad6cdb6f18393f", "name": "Dangling fetch: GET /api/tmf/qc?${params.toString()} (frontend/src/components/tmf/TMFQCDashboard.tsx:180)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/qc?${params.toString()} (frontend/src/components/tmf/TMFQCDashboard.tsx:180)"}, "fullDescription": {"text": "`frontend/src/components/tmf/TMFQCDashboard.tsx:180` calls `GET /api/tmf/qc?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/qc`\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-28dbdac88881d8d5", "name": "Dangling fetch: PUT /api/tmf/qc/${itemId} (frontend/src/components/tmf/TMFQCDashboard.tsx:222)", "shortDescription": {"text": "Dangling fetch: PUT /api/tmf/qc/${itemId} (frontend/src/components/tmf/TMFQCDashboard.tsx:222)"}, "fullDescription": {"text": "`frontend/src/components/tmf/TMFQCDashboard.tsx:222` calls `PUT /api/tmf/qc/${itemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/qc/<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-6e48142374329412", "name": "Dangling fetch: GET /api/tmf/auto-link?type=rules (frontend/src/components/tmf/AutoLinkDashboard.tsx:125)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/auto-link?type=rules (frontend/src/components/tmf/AutoLinkDashboard.tsx:125)"}, "fullDescription": {"text": "`frontend/src/components/tmf/AutoLinkDashboard.tsx:125` calls `GET /api/tmf/auto-link?type=rules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/auto-link`\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-3f333ee60371cab0", "name": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/components/tmf/TMFCompletenessDashboard.tsx:107)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/components/tmf/TMFCompletenessDashboard.tsx:107)"}, "fullDescription": {"text": "`frontend/src/components/tmf/TMFCompletenessDashboard.tsx:107` calls `GET /api/tmf/zones${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/zones/<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-7d429f63e0b36f04", "name": "Dangling fetch: POST /api/smart-submissions (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:110)", "shortDescription": {"text": "Dangling fetch: POST /api/smart-submissions (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:110)"}, "fullDescription": {"text": "`frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:110` calls `POST /api/smart-submissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/smart-submissions`\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-bc413abde7b33fa1", "name": "Dangling fetch: POST /api/smart-submissions/pdfa3 (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:", "shortDescription": {"text": "Dangling fetch: POST /api/smart-submissions/pdfa3 (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:210)"}, "fullDescription": {"text": "`frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:210` calls `POST /api/smart-submissions/pdfa3` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/smart-submissions/pdfa3`\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-5f8b50e6e6ca216e", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/lib/ai-assistant.tsx:103)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/lib/ai-assistant.tsx:103)"}, "fullDescription": {"text": "`frontend/src/lib/ai-assistant.tsx:103` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-c8b76d240d32699d", "name": "Dangling fetch: GET /api/ai/section-generate (frontend/src/lib/demo-generation-fallback.ts:493)", "shortDescription": {"text": "Dangling fetch: GET /api/ai/section-generate (frontend/src/lib/demo-generation-fallback.ts:493)"}, "fullDescription": {"text": "`frontend/src/lib/demo-generation-fallback.ts:493` calls `GET /api/ai/section-generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/section-generate`\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-ac71addda0402bda", "name": "Dangling fetch: POST /api/users/invite/accept (frontend/src/pages/InvitePage.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST /api/users/invite/accept (frontend/src/pages/InvitePage.tsx:49)"}, "fullDescription": {"text": "`frontend/src/pages/InvitePage.tsx:49` calls `POST /api/users/invite/accept` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/invite/accept`\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-98cf4ae24ad825c4", "name": "Dangling fetch: POST /api/ai/stream-spike (frontend/src/pages/SpikeStreamingPage.tsx:86)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/stream-spike (frontend/src/pages/SpikeStreamingPage.tsx:86)"}, "fullDescription": {"text": "`frontend/src/pages/SpikeStreamingPage.tsx:86` calls `POST /api/ai/stream-spike` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/stream-spike`\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-e418e750d7626c0a", "name": "Dangling fetch: POST /api/glp/edc-link (frontend/src/hooks/useGLPEDCPersistence.ts:164)", "shortDescription": {"text": "Dangling fetch: POST /api/glp/edc-link (frontend/src/hooks/useGLPEDCPersistence.ts:164)"}, "fullDescription": {"text": "`frontend/src/hooks/useGLPEDCPersistence.ts:164` calls `POST /api/glp/edc-link` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/glp/edc-link`\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-beaf32a1409ad68b", "name": "Dangling fetch: DELETE /api/glp/edc-link?id=${encodeURIComponent(id)} (frontend/src/hooks/useGLPEDCPersistence.ts:191)", "shortDescription": {"text": "Dangling fetch: DELETE /api/glp/edc-link?id=${encodeURIComponent(id)} (frontend/src/hooks/useGLPEDCPersistence.ts:191)"}, "fullDescription": {"text": "`frontend/src/hooks/useGLPEDCPersistence.ts:191` calls `DELETE /api/glp/edc-link?id=${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/glp/edc-link`\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-51e507135e6b5945", "name": "Dangling fetch: POST /api/glp/edc-sync (frontend/src/hooks/useGLPEDCPersistence.ts:203)", "shortDescription": {"text": "Dangling fetch: POST /api/glp/edc-sync (frontend/src/hooks/useGLPEDCPersistence.ts:203)"}, "fullDescription": {"text": "`frontend/src/hooks/useGLPEDCPersistence.ts:203` calls `POST /api/glp/edc-sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/glp/edc-sync`\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-e5f41793acaec839", "name": "Dangling fetch: POST /api/documents/ingest (frontend/src/hooks/usePDFIngestion.tsx:160)", "shortDescription": {"text": "Dangling fetch: POST /api/documents/ingest (frontend/src/hooks/usePDFIngestion.tsx:160)"}, "fullDescription": {"text": "`frontend/src/hooks/usePDFIngestion.tsx:160` calls `POST /api/documents/ingest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/ingest`\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-45e9145ddeb6557e", "name": "Dangling fetch: GET /api/haqs/${haqId}/audit?limit=${limit} (frontend/src/hooks/useHAQAuditTrail.ts:76)", "shortDescription": {"text": "Dangling fetch: GET /api/haqs/${haqId}/audit?limit=${limit} (frontend/src/hooks/useHAQAuditTrail.ts:76)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQAuditTrail.ts:76` calls `GET /api/haqs/${haqId}/audit?limit=${limit}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/audit`\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-21b73aca11834fb7", "name": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:330)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:330)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyNarrativeRAG.ts:330` calls `POST /api/ai/safety-narrative` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-narrative`\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-35c4d5394ca987c5", "name": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:434)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:434)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyNarrativeRAG.ts:434` calls `POST /api/ai/safety-narrative` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-narrative`\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-99d19f2dbda65f7b", "name": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useSectionGeneration.ts:194)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useSectionGeneration.ts:194)"}, "fullDescription": {"text": "`frontend/src/hooks/useSectionGeneration.ts:194` calls `POST /api/ai/section-generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/section-generate`\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-52a11997e03c1094", "name": "Dangling fetch: GET /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:108)", "shortDescription": {"text": "Dangling fetch: GET /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:108)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQReviews.ts:108` calls `GET /api/haqs/${haqId}/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/reviews`\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-22d0078b11cac859", "name": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:216)", "shortDescription": {"text": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:216)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQReviews.ts:216` calls `POST /api/haqs/${haqId}/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/audit`\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-f3eadd74f272e524", "name": "Dangling fetch: POST /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:230)", "shortDescription": {"text": "Dangling fetch: POST /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:230)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQReviews.ts:230` calls `POST /api/haqs/${haqId}/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/reviews`\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-f22b4365d885a237", "name": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:287)", "shortDescription": {"text": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:287)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQReviews.ts:287` calls `POST /api/haqs/${haqId}/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/audit`\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-6a0fa195cc479436", "name": "Dangling fetch: PATCH /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:301)", "shortDescription": {"text": "Dangling fetch: PATCH /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:301)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQReviews.ts:301` calls `PATCH /api/haqs/${haqId}/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/haqs/<p>/reviews`\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-ae43fc78dab4df29", "name": "Dangling fetch: GET /api/tmf/artifacts?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:91)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/artifacts?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:91)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:91` calls `GET /api/tmf/artifacts?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/artifacts`\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-2289c8ee1b5539ea", "name": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:120)", "shortDescription": {"text": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:120)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:120` calls `POST /api/tmf/artifacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/artifacts`\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-d0d2dd8cf323fd45", "name": "Dangling fetch: PUT /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:151)", "shortDescription": {"text": "Dangling fetch: PUT /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:151)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:151` calls `PUT /api/tmf/artifacts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/artifacts/<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-d6d9b96370df2790", "name": "Dangling fetch: DELETE /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:208)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:208)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:208` calls `DELETE /api/tmf/artifacts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/artifacts/<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-d3f04009139dfd29", "name": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/hooks/useTMFPersistence.ts:243)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/hooks/useTMFPersistence.ts:243)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:243` calls `GET /api/tmf/zones${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/zones/<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-293178ff16d8d67d", "name": "Dangling fetch: GET /api/tmf/gaps?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:280)", "shortDescription": {"text": "Dangling fetch: GET /api/tmf/gaps?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:280)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:280` calls `GET /api/tmf/gaps?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/gaps`\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-457d50cc58472eee", "name": "Dangling fetch: POST /api/tmf/gaps (frontend/src/hooks/useTMFPersistence.ts:322)", "shortDescription": {"text": "Dangling fetch: POST /api/tmf/gaps (frontend/src/hooks/useTMFPersistence.ts:322)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:322` calls `POST /api/tmf/gaps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/gaps`\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-65861b802d1f783a", "name": "Dangling fetch: PUT /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:363)", "shortDescription": {"text": "Dangling fetch: PUT /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:363)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:363` calls `PUT /api/tmf/gaps/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/gaps/<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-2e899d231d89a086", "name": "Dangling fetch: DELETE /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:399)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:399)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:399` calls `DELETE /api/tmf/gaps/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/gaps/<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-5480c0d33bf59b6a", "name": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:430)", "shortDescription": {"text": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:430)"}, "fullDescription": {"text": "`frontend/src/hooks/useTMFPersistence.ts:430` calls `POST /api/tmf/artifacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tmf/artifacts`\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-0cac0093004158c5", "name": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:143)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:143)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQRAG.ts:143` calls `POST /api/ai/haq-rag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/haq-rag`\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-5b8492df5ed1d3c2", "name": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:223)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:223)"}, "fullDescription": {"text": "`frontend/src/hooks/useHAQRAG.ts:223` calls `POST /api/ai/haq-rag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/haq-rag`\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-24b9f81bd49c1858", "name": "Dangling fetch: POST /api/ai/document-qc (frontend/src/hooks/useDocumentQC.ts:166)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/document-qc (frontend/src/hooks/useDocumentQC.ts:166)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentQC.ts:166` calls `POST /api/ai/document-qc` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/document-qc`\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-f2edeaea7e8dbee4", "name": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:47)", "shortDescription": {"text": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:47)"}, "fullDescription": {"text": "`frontend/src/hooks/useAIService.ts:47` calls `GET /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-2b2689124487e3b8", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:135)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:135)"}, "fullDescription": {"text": "`frontend/src/hooks/useAIService.ts:135` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-957280375ca6d903", "name": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:209)", "shortDescription": {"text": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:209)"}, "fullDescription": {"text": "`frontend/src/hooks/useAIService.ts:209` calls `GET /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-ec6c5de21ab7ff4d", "name": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:230)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:230)"}, "fullDescription": {"text": "`frontend/src/hooks/useAIService.ts:230` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-5e7721d1a68b6d6f", "name": "Dangling fetch: GET /api/document-control/review-cycles?${params.toString()} (frontend/src/hooks/useDocumentControlPersi", "shortDescription": {"text": "Dangling fetch: GET /api/document-control/review-cycles?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:77)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:77` calls `GET /api/document-control/review-cycles?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/review-cycles`\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-08a4151e1c3864af", "name": "Dangling fetch: POST /api/document-control/review-cycles (frontend/src/hooks/useDocumentControlPersistence.ts:120)", "shortDescription": {"text": "Dangling fetch: POST /api/document-control/review-cycles (frontend/src/hooks/useDocumentControlPersistence.ts:120)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:120` calls `POST /api/document-control/review-cycles` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/review-cycles`\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-40a8d18ca6a36c2d", "name": "Dangling fetch: GET /api/document-control/workflows?${params.toString()} (frontend/src/hooks/useDocumentControlPersisten", "shortDescription": {"text": "Dangling fetch: GET /api/document-control/workflows?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:157)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:157` calls `GET /api/document-control/workflows?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/workflows`\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-94e682e7a04c2252", "name": "Dangling fetch: POST /api/document-control/workflows (frontend/src/hooks/useDocumentControlPersistence.ts:205)", "shortDescription": {"text": "Dangling fetch: POST /api/document-control/workflows (frontend/src/hooks/useDocumentControlPersistence.ts:205)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:205` calls `POST /api/document-control/workflows` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/workflows`\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-7a8a3607f66e6751", "name": "Dangling fetch: GET /api/document-control/templates?${params.toString()} (frontend/src/hooks/useDocumentControlPersisten", "shortDescription": {"text": "Dangling fetch: GET /api/document-control/templates?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:243)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:243` calls `GET /api/document-control/templates?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/templates`\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-ad52921ae4dc4576", "name": "Dangling fetch: POST /api/document-control/templates (frontend/src/hooks/useDocumentControlPersistence.ts:295)", "shortDescription": {"text": "Dangling fetch: POST /api/document-control/templates (frontend/src/hooks/useDocumentControlPersistence.ts:295)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:295` calls `POST /api/document-control/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/templates`\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-dd3c7a7694c2482f", "name": "Dangling fetch: GET /api/document-control/archives?${params.toString()} (frontend/src/hooks/useDocumentControlPersistenc", "shortDescription": {"text": "Dangling fetch: GET /api/document-control/archives?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:333)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:333` calls `GET /api/document-control/archives?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/archives`\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-e99889e2066f1ada", "name": "Dangling fetch: POST /api/document-control/archives (frontend/src/hooks/useDocumentControlPersistence.ts:377)", "shortDescription": {"text": "Dangling fetch: POST /api/document-control/archives (frontend/src/hooks/useDocumentControlPersistence.ts:377)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:377` calls `POST /api/document-control/archives` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/document-control/archives`\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-31b0c0eeb585fb8d", "name": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:423)", "shortDescription": {"text": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:423)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:423` calls `GET /api/documents?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents`\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-bb7ff313f0dc50e4", "name": "Dangling fetch: POST /api/documents (frontend/src/hooks/useDocumentControlPersistence.ts:460)", "shortDescription": {"text": "Dangling fetch: POST /api/documents (frontend/src/hooks/useDocumentControlPersistence.ts:460)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:460` calls `POST /api/documents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents`\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-a9d075f1b890daf0", "name": "Dangling fetch: PATCH /api/documents/${id} (frontend/src/hooks/useDocumentControlPersistence.ts:501)", "shortDescription": {"text": "Dangling fetch: PATCH /api/documents/${id} (frontend/src/hooks/useDocumentControlPersistence.ts:501)"}, "fullDescription": {"text": "`frontend/src/hooks/useDocumentControlPersistence.ts:501` calls `PATCH /api/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/<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-30e34d6b9e18df00", "name": "Dangling fetch: POST /api/ai/safety-signal (frontend/src/hooks/useSignalAnalysis.ts:161)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-signal (frontend/src/hooks/useSignalAnalysis.ts:161)"}, "fullDescription": {"text": "`frontend/src/hooks/useSignalAnalysis.ts:161` calls `POST /api/ai/safety-signal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-signal`\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-9f81c372ef324ebb", "name": "Dangling fetch: GET /api/submissions?limit=50 (frontend/src/hooks/useSubmissionsHubData.ts:99)", "shortDescription": {"text": "Dangling fetch: GET /api/submissions?limit=50 (frontend/src/hooks/useSubmissionsHubData.ts:99)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionsHubData.ts:99` calls `GET /api/submissions?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions`\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-d13431c715ed8079", "name": "Dangling fetch: GET /api/auth/session (frontend/src/hooks/useAuth.ts:76)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/session (frontend/src/hooks/useAuth.ts:76)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuth.ts:76` calls `GET /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/session`\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-df5c0f44d273ae1d", "name": "Dangling fetch: POST /api/auth/login (frontend/src/hooks/useAuth.ts:129)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (frontend/src/hooks/useAuth.ts:129)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuth.ts:129` 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-1ebb4633219a392b", "name": "Dangling fetch: POST /api/auth/logout (frontend/src/hooks/useAuth.ts:203)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (frontend/src/hooks/useAuth.ts:203)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuth.ts:203` 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-3b9dfc12725dec6a", "name": "Dangling fetch: GET /api/submissions/lifecycle?${params.toString()} (frontend/src/hooks/useSubmissionLifecyclePersistenc", "shortDescription": {"text": "Dangling fetch: GET /api/submissions/lifecycle?${params.toString()} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168` calls `GET /api/submissions/lifecycle?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/lifecycle`\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-2cc4756b29d7546f", "name": "Dangling fetch: GET /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:205)", "shortDescription": {"text": "Dangling fetch: GET /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:205)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionLifecyclePersistence.ts:205` calls `GET /api/submissions/lifecycle/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/lifecycle/<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-9763589be07ba18e", "name": "Dangling fetch: POST /api/submissions/lifecycle (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:240)", "shortDescription": {"text": "Dangling fetch: POST /api/submissions/lifecycle (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:240)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionLifecyclePersistence.ts:240` calls `POST /api/submissions/lifecycle` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/lifecycle`\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-0ced67af3dd9a384", "name": "Dangling fetch: PUT /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:278)", "shortDescription": {"text": "Dangling fetch: PUT /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:278)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionLifecyclePersistence.ts:278` calls `PUT /api/submissions/lifecycle/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/lifecycle/<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-f566d1817684f68c", "name": "Dangling fetch: DELETE /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:313)", "shortDescription": {"text": "Dangling fetch: DELETE /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:313)"}, "fullDescription": {"text": "`frontend/src/hooks/useSubmissionLifecyclePersistence.ts:313` calls `DELETE /api/submissions/lifecycle/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/submissions/lifecycle/<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-90ea85baae249406", "name": "Dangling fetch: POST /api/eln/experiments/${id}/sign (frontend/src/hooks/useELNPersistence.ts:192)", "shortDescription": {"text": "Dangling fetch: POST /api/eln/experiments/${id}/sign (frontend/src/hooks/useELNPersistence.ts:192)"}, "fullDescription": {"text": "`frontend/src/hooks/useELNPersistence.ts:192` calls `POST /api/eln/experiments/${id}/sign` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/eln/experiments/<p>/sign`\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-04b1bb316b27cdd7", "name": "Dangling fetch: POST /api/ai/batch-section (frontend/src/hooks/useBatchGeneration.ts:204)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/batch-section (frontend/src/hooks/useBatchGeneration.ts:204)"}, "fullDescription": {"text": "`frontend/src/hooks/useBatchGeneration.ts:204` calls `POST /api/ai/batch-section` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/batch-section`\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-19cdf0af5ef61ef7", "name": "Dangling fetch: GET /api/agents/runs (frontend/src/hooks/useLixAgent.ts:119)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/runs (frontend/src/hooks/useLixAgent.ts:119)"}, "fullDescription": {"text": "`frontend/src/hooks/useLixAgent.ts:119` calls `GET /api/agents/runs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/runs`\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-70e8b48f7856e374", "name": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:170)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:170)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyIntelligence.ts:170` calls `POST /api/ai/safety-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-intelligence`\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-11a8df8f060b1974", "name": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:210)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:210)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyIntelligence.ts:210` calls `POST /api/ai/safety-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-intelligence`\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-df6788d424be98a1", "name": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:245)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:245)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyIntelligence.ts:245` calls `POST /api/ai/safety-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-intelligence`\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-1cfe9a9258c1afbe", "name": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:286)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:286)"}, "fullDescription": {"text": "`frontend/src/hooks/useSafetyIntelligence.ts:286` calls `POST /api/ai/safety-intelligence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/safety-intelligence`\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-f085baca91859e25", "name": "Dangling fetch: GET /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:54)", "shortDescription": {"text": "Dangling fetch: GET /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:54)"}, "fullDescription": {"text": "`frontend/src/hooks/useCitationMonitor.ts:54` calls `GET /api/citations/check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/citations/check`\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-978653f226336bdd", "name": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:70)", "shortDescription": {"text": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:70)"}, "fullDescription": {"text": "`frontend/src/hooks/useCitationMonitor.ts:70` calls `POST /api/citations/check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/citations/check`\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-2369c2806fcbdb94", "name": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:94)", "shortDescription": {"text": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:94)"}, "fullDescription": {"text": "`frontend/src/hooks/useCitationMonitor.ts:94` calls `POST /api/citations/check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/citations/check`\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-5f89d7ed1768c439", "name": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useBatchSectionGeneration.ts:418)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useBatchSectionGeneration.ts:418)"}, "fullDescription": {"text": "`frontend/src/hooks/useBatchSectionGeneration.ts:418` calls `POST /api/ai/section-generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/section-generate`\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-ed00c76981024809", "name": "Dangling fetch: GET /api/authoring/documents?${params.toString()} (frontend/src/hooks/useAuthoringPersistence.ts:159)", "shortDescription": {"text": "Dangling fetch: GET /api/authoring/documents?${params.toString()} (frontend/src/hooks/useAuthoringPersistence.ts:159)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuthoringPersistence.ts:159` calls `GET /api/authoring/documents?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/authoring/documents`\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-52c64404a300480a", "name": "Dangling fetch: GET /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:193)", "shortDescription": {"text": "Dangling fetch: GET /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:193)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuthoringPersistence.ts:193` calls `GET /api/authoring/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/authoring/documents/<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-5ed4811be0086967", "name": "Dangling fetch: POST /api/authoring/documents (frontend/src/hooks/useAuthoringPersistence.ts:225)", "shortDescription": {"text": "Dangling fetch: POST /api/authoring/documents (frontend/src/hooks/useAuthoringPersistence.ts:225)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuthoringPersistence.ts:225` calls `POST /api/authoring/documents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/authoring/documents`\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-156ffa2eb0607e20", "name": "Dangling fetch: PUT /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:263)", "shortDescription": {"text": "Dangling fetch: PUT /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:263)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuthoringPersistence.ts:263` calls `PUT /api/authoring/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/authoring/documents/<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-8b2c8b73aad98489", "name": "Dangling fetch: DELETE /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:298)", "shortDescription": {"text": "Dangling fetch: DELETE /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:298)"}, "fullDescription": {"text": "`frontend/src/hooks/useAuthoringPersistence.ts:298` calls `DELETE /api/authoring/documents/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/authoring/documents/<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-841375c5ca194491", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:418)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:418)"}, "fullDescription": {"text": "`frontend/src/services/ai-authoring-service.ts:418` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-89eabb30773a42a5", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:739)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:739)"}, "fullDescription": {"text": "`frontend/src/services/ai-authoring-service.ts:739` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-ffda0f2cc3189e3b", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:285)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:285)"}, "fullDescription": {"text": "`frontend/src/services/anthropic-service.ts:285` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-591bb259200ebcbd", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:363)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:363)"}, "fullDescription": {"text": "`frontend/src/services/anthropic-service.ts:363` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-5fb901c8b9ec5c33", "name": "Dangling fetch: POST /api/collaboration/operations (frontend/src/services/collaboration/offline-queue-service.ts:345)", "shortDescription": {"text": "Dangling fetch: POST /api/collaboration/operations (frontend/src/services/collaboration/offline-queue-service.ts:345)"}, "fullDescription": {"text": "`frontend/src/services/collaboration/offline-queue-service.ts:345` calls `POST /api/collaboration/operations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/collaboration/operations`\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-d62bc2180b804d0c", "name": "Dangling fetch: POST /api/collaboration/presence (frontend/src/services/collaboration/presence-awareness-service.ts:417)", "shortDescription": {"text": "Dangling fetch: POST /api/collaboration/presence (frontend/src/services/collaboration/presence-awareness-service.ts:417)"}, "fullDescription": {"text": "`frontend/src/services/collaboration/presence-awareness-service.ts:417` calls `POST /api/collaboration/presence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/collaboration/presence`\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-b2e2d51075bb4899", "name": "Dangling fetch: GET /api/cross-module?${params.toString()} (frontend/src/store/useCrossModuleEventStore.ts:755)", "shortDescription": {"text": "Dangling fetch: GET /api/cross-module?${params.toString()} (frontend/src/store/useCrossModuleEventStore.ts:755)"}, "fullDescription": {"text": "`frontend/src/store/useCrossModuleEventStore.ts:755` calls `GET /api/cross-module?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cross-module`\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-c02bdcae895783db", "name": "Dangling fetch: POST /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:781)", "shortDescription": {"text": "Dangling fetch: POST /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:781)"}, "fullDescription": {"text": "`frontend/src/store/useCrossModuleEventStore.ts:781` calls `POST /api/cross-module` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cross-module`\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-9e9539133cc5be50", "name": "Dangling fetch: PATCH /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:827)", "shortDescription": {"text": "Dangling fetch: PATCH /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:827)"}, "fullDescription": {"text": "`frontend/src/store/useCrossModuleEventStore.ts:827` calls `PATCH /api/cross-module` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cross-module`\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-ebd06ae45cc5c3a4", "name": "Dangling fetch: POST /api/favorites (frontend/src/store/useFavoritesStore.ts:79)", "shortDescription": {"text": "Dangling fetch: POST /api/favorites (frontend/src/store/useFavoritesStore.ts:79)"}, "fullDescription": {"text": "`frontend/src/store/useFavoritesStore.ts:79` calls `POST /api/favorites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/favorites`\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-de6f11df8e277e27", "name": "Dangling fetch: DELETE /api/favorites?entityType=${encodeURIComponent(entityType)}&entityId=${encodeURIComponent(entityI", "shortDescription": {"text": "Dangling fetch: DELETE /api/favorites?entityType=${encodeURIComponent(entityType)}&entityId=${encodeURIComponent(entityId)} (frontend/src/store/useFavoritesStore.ts:96)"}, "fullDescription": {"text": "`frontend/src/store/useFavoritesStore.ts:96` calls `DELETE /api/favorites?entityType=${encodeURIComponent(entityType)}&entityId=${encodeURIComponent(entityId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/favorites`\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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/routers/studies.py` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/app/routers/studies.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42d270f9d1429fdb", "name": "Unused endpoint: GET /{study_id}", "shortDescription": {"text": "Unused endpoint: GET /{study_id}"}, "fullDescription": {"text": "`backend/app/routers/studies.py` declares `GET /{study_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-e35642f6290dba99", "name": "Unused endpoint: PATCH /{study_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{study_id}"}, "fullDescription": {"text": "`backend/app/routers/studies.py` declares `PATCH /{study_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-c812e09a037b58b8", "name": "Unused endpoint: PUT /{study_id}", "shortDescription": {"text": "Unused endpoint: PUT /{study_id}"}, "fullDescription": {"text": "`backend/app/routers/studies.py` declares `PUT /{study_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-54956a3774048a9a", "name": "Unused endpoint: DELETE /{study_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{study_id}"}, "fullDescription": {"text": "`backend/app/routers/studies.py` declares `DELETE /{study_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-49f84db9d3d1f0d7", "name": "Unused endpoint: GET /{submission_id}", "shortDescription": {"text": "Unused endpoint: GET /{submission_id}"}, "fullDescription": {"text": "`backend/app/routers/submissions.py` declares `GET /{submission_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-11e0ddbfc8321fc8", "name": "Unused endpoint: PATCH /{submission_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{submission_id}"}, "fullDescription": {"text": "`backend/app/routers/submissions.py` declares `PATCH /{submission_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-486c1d9d0d71fff8", "name": "Unused endpoint: PUT /{submission_id}", "shortDescription": {"text": "Unused endpoint: PUT /{submission_id}"}, "fullDescription": {"text": "`backend/app/routers/submissions.py` declares `PUT /{submission_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-b88a12140df0c08b", "name": "Unused endpoint: DELETE /{submission_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{submission_id}"}, "fullDescription": {"text": "`backend/app/routers/submissions.py` declares `DELETE /{submission_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-d611732ce2d9cdfe", "name": "Unused endpoint: GET /{product_id}", "shortDescription": {"text": "Unused endpoint: GET /{product_id}"}, "fullDescription": {"text": "`backend/app/routers/products.py` declares `GET /{product_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-a15b85e6076d921a", "name": "Unused endpoint: PUT /{product_id}", "shortDescription": {"text": "Unused endpoint: PUT /{product_id}"}, "fullDescription": {"text": "`backend/app/routers/products.py` declares `PUT /{product_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-b02e6e38a06a1cbd", "name": "Unused endpoint: DELETE /{product_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{product_id}"}, "fullDescription": {"text": "`backend/app/routers/products.py` declares `DELETE /{product_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-d6d412ba6647f6cc", "name": "Unused endpoint: GET /live", "shortDescription": {"text": "Unused endpoint: GET /live"}, "fullDescription": {"text": "`backend/app/routers/health.py` declares `GET /live` 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-8c236625afb6a8cb", "name": "Unused endpoint: GET /ready", "shortDescription": {"text": "Unused endpoint: GET /ready"}, "fullDescription": {"text": "`backend/app/routers/health.py` declares `GET /ready` 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-4cb73614b4fb642e", "name": "Unused endpoint: GET /db", "shortDescription": {"text": "Unused endpoint: GET /db"}, "fullDescription": {"text": "`backend/app/routers/health.py` declares `GET /db` 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-ca9b06e2e10afc75", "name": "Unused endpoint: GET /{haq_id}", "shortDescription": {"text": "Unused endpoint: GET /{haq_id}"}, "fullDescription": {"text": "`backend/app/routers/haqs.py` declares `GET /{haq_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-aab4b35ef52ad6d9", "name": "Unused endpoint: PATCH /{haq_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{haq_id}"}, "fullDescription": {"text": "`backend/app/routers/haqs.py` declares `PATCH /{haq_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-ec67130a5c29826c", "name": "Unused endpoint: PUT /{haq_id}", "shortDescription": {"text": "Unused endpoint: PUT /{haq_id}"}, "fullDescription": {"text": "`backend/app/routers/haqs.py` declares `PUT /{haq_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-d42001435c73c253", "name": "Unused endpoint: DELETE /{haq_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{haq_id}"}, "fullDescription": {"text": "`backend/app/routers/haqs.py` declares `DELETE /{haq_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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/app/routers/auth.py` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/app/routers/auth.py` 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-1daa53f3c56e6b16", "name": "Unused endpoint: GET /session", "shortDescription": {"text": "Unused endpoint: GET /session"}, "fullDescription": {"text": "`backend/app/routers/auth.py` declares `GET /session` 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-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `POST /generate` 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-e8614df2893d241a", "name": "Unused endpoint: GET /generate", "shortDescription": {"text": "Unused endpoint: GET /generate"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /generate` 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-1abce47f5a681834", "name": "Unused endpoint: POST /haq-rag", "shortDescription": {"text": "Unused endpoint: POST /haq-rag"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `POST /haq-rag` 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-a869f59b43093b74", "name": "Unused endpoint: GET /haq-rag", "shortDescription": {"text": "Unused endpoint: GET /haq-rag"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /haq-rag` 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-a2e981c87f3388d9", "name": "Unused endpoint: POST /section-generate", "shortDescription": {"text": "Unused endpoint: POST /section-generate"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `POST /section-generate` 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-8a288a797267875a", "name": "Unused endpoint: GET /section-generate", "shortDescription": {"text": "Unused endpoint: GET /section-generate"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /section-generate` 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-d467299d5c174fc0", "name": "Unused endpoint: GET /usage", "shortDescription": {"text": "Unused endpoint: GET /usage"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /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-2ab9bf5db6820af4", "name": "Unused endpoint: GET /models", "shortDescription": {"text": "Unused endpoint: GET /models"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /models` 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-01a333a34760fca3", "name": "Unused endpoint: GET /prompts", "shortDescription": {"text": "Unused endpoint: GET /prompts"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /prompts` 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-b9d001c1f452896a", "name": "Unused endpoint: POST /inference", "shortDescription": {"text": "Unused endpoint: POST /inference"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `POST /inference` 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-d2184f654f2fa089", "name": "Unused endpoint: GET /compliance-filter", "shortDescription": {"text": "Unused endpoint: GET /compliance-filter"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /compliance-filter` 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-0fcb0833c6f573a2", "name": "Unused endpoint: GET /validation-docs", "shortDescription": {"text": "Unused endpoint: GET /validation-docs"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `GET /validation-docs` 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-f3b62fe2a13b51ea", "name": "Unused endpoint: POST /rag/retrieve", "shortDescription": {"text": "Unused endpoint: POST /rag/retrieve"}, "fullDescription": {"text": "`backend/app/routers/ai.py` declares `POST /rag/retrieve` 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-a9ada54c6099bd33", "name": "Unused endpoint: GET /{document_id}", "shortDescription": {"text": "Unused endpoint: GET /{document_id}"}, "fullDescription": {"text": "`backend/app/routers/documents.py` declares `GET /{document_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-13d9ffd0b4428c5d", "name": "Unused endpoint: PATCH /{document_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{document_id}"}, "fullDescription": {"text": "`backend/app/routers/documents.py` declares `PATCH /{document_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-82ed17403da0b50e", "name": "Unused endpoint: PUT /{document_id}", "shortDescription": {"text": "Unused endpoint: PUT /{document_id}"}, "fullDescription": {"text": "`backend/app/routers/documents.py` declares `PUT /{document_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-b2d9ebcfd4b9e397", "name": "Unused endpoint: DELETE /{document_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{document_id}"}, "fullDescription": {"text": "`backend/app/routers/documents.py` declares `DELETE /{document_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-822f5812dc9de7a7", "name": "Unused endpoint: GET /verify", "shortDescription": {"text": "Unused endpoint: GET /verify"}, "fullDescription": {"text": "`backend/app/routers/audit.py` declares `GET /verify` 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-6f606e1e29a7ef82", "name": "Unused endpoint: GET /{report_id}", "shortDescription": {"text": "Unused endpoint: GET /{report_id}"}, "fullDescription": {"text": "`backend/app/routers/safety.py` declares `GET /{report_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-bc72b2c1e1abc7b8", "name": "Unused endpoint: PATCH /{report_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{report_id}"}, "fullDescription": {"text": "`backend/app/routers/safety.py` declares `PATCH /{report_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-4937935e722d470b", "name": "Unused endpoint: PUT /{report_id}", "shortDescription": {"text": "Unused endpoint: PUT /{report_id}"}, "fullDescription": {"text": "`backend/app/routers/safety.py` declares `PUT /{report_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-772e19875f5f1469", "name": "Unused endpoint: DELETE /{report_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{report_id}"}, "fullDescription": {"text": "`backend/app/routers/safety.py` declares `DELETE /{report_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}}]}}, "automationDetails": {"id": "repobility/22444"}, "properties": {"repository": "vrushabh-rajaghatta/ligature", "repoUrl": "https://github.com/vrushabh-rajaghatta/ligature", "branch": "main"}, "results": [{"ruleId": "scanner-bb4a962c0f2a59e2", "level": "note", "message": {"text": "Possibly dead Python function: sse_text_stream"}, "properties": {"repobilityId": "be6c770e36092b70", "scanner": "scanner-primary", "fingerprint": "bb4a962c0f2a59e2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/ai_service.py:129"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c7185a58c69b4ac", "level": "note", "message": {"text": "Possibly dead Python function: add_audit_entry"}, "properties": {"repobilityId": "65d0182edac92ddd", "scanner": "scanner-primary", "fingerprint": "2c7185a58c69b4ac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/audit_store.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6feac56e262c215f", "level": "note", "message": {"text": "Possibly dead Python function: require_permission"}, "properties": {"repobilityId": "1a35c972d7c3784a", "scanner": "scanner-primary", "fingerprint": "6feac56e262c215f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/security.py:122"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f9bbe3acd9c2911a", "level": "note", "message": {"text": "Possibly dead Python function: require_role"}, "properties": {"repobilityId": "ebb52713535182e2", "scanner": "scanner-primary", "fingerprint": "f9bbe3acd9c2911a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/security.py:135"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-af85f299b064a7be", "level": "note", "message": {"text": "Possibly dead Python function: is_role_at_least"}, "properties": {"repobilityId": "be7e923edeb4a523", "scanner": "scanner-primary", "fingerprint": "af85f299b064a7be", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/rbac.py:221"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8187f4a167ab19f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/pwa-sw.js:49"}, "properties": {"repobilityId": "0659bc7a336564b8", "scanner": "scanner-primary", "fingerprint": "d8187f4a167ab19f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b5ff3f8ee7dc427", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/stores/ectd-adapter.ts:329"}, "properties": {"repobilityId": "18c70d234c3a35d2", "scanner": "scanner-primary", "fingerprint": "0b5ff3f8ee7dc427", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-51c7cd23b937d04f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/WorkflowTemplateSelector.tsx:402"}, "properties": {"repobilityId": "63714f44681df2d1", "scanner": "scanner-primary", "fingerprint": "51c7cd23b937d04f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59702643c569851f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ServiceWorkerKiller.tsx:26"}, "properties": {"repobilityId": "94aeabdfe815dbfd", "scanner": "scanner-primary", "fingerprint": "59702643c569851f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fa8205f567b2309", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ComplianceReportPanel.tsx:514"}, "properties": {"repobilityId": "cd031c7f2748425b", "scanner": "scanner-primary", "fingerprint": "0fa8205f567b2309", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c3ab902b78015524", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/PWARegistration.tsx:47"}, "properties": {"repobilityId": "43cca1d74919fd22", "scanner": "scanner-primary", "fingerprint": "c3ab902b78015524", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad9417859173be14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/api-docs/APIDocsViewer.tsx:167"}, "properties": {"repobilityId": "a2220f32e31675f8", "scanner": "scanner-primary", "fingerprint": "ad9417859173be14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87ff5963027224ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/QuickModuleSwitcher.tsx:380"}, "properties": {"repobilityId": "514fad858446eb85", "scanner": "scanner-primary", "fingerprint": "87ff5963027224ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50a1b71e69795170", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ThemeModeToggle.tsx:153"}, "properties": {"repobilityId": "e2ff9ac2325dd327", "scanner": "scanner-primary", "fingerprint": "50a1b71e69795170", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a94b4df8d37157ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Sidebar.tsx:529"}, "properties": {"repobilityId": "4fbed5d8e51dbbe4", "scanner": "scanner-primary", "fingerprint": "a94b4df8d37157ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ba05419c972eb3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/ScopeSelector.tsx:85"}, "properties": {"repobilityId": "91b5116dc84df3fc", "scanner": "scanner-primary", "fingerprint": "6ba05419c972eb3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1fd24bd36096644", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/TierSwitcher.tsx:95"}, "properties": {"repobilityId": "8d411a140a381f08", "scanner": "scanner-primary", "fingerprint": "d1fd24bd36096644", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd20ae0b3e18fc73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/FilterBar.tsx:82"}, "properties": {"repobilityId": "63810962b708cd03", "scanner": "scanner-primary", "fingerprint": "cd20ae0b3e18fc73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c3223b91cafe261", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/PersonaSwitcher.tsx:53"}, "properties": {"repobilityId": "05ff97a51d6443e2", "scanner": "scanner-primary", "fingerprint": "3c3223b91cafe261", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67d2cf84f1106a45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/layout/Header.tsx:157"}, "properties": {"repobilityId": "f31794ffb87a08e8", "scanner": "scanner-primary", "fingerprint": "67d2cf84f1106a45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fab798229de9a30c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/TimelineSlider.tsx:349"}, "properties": {"repobilityId": "33e75fe88a344bcb", "scanner": "scanner-primary", "fingerprint": "fab798229de9a30c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbe4388001b87f4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/VisitListView.tsx:319"}, "properties": {"repobilityId": "2cc92b72a1a1b347", "scanner": "scanner-primary", "fingerprint": "dbe4388001b87f4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-beaeff82c6ddc733", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SiteListView.tsx:315"}, "properties": {"repobilityId": "8ab17feb41074c33", "scanner": "scanner-primary", "fingerprint": "beaeff82c6ddc733", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0dfadd35cb9c09f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/QueryListView.tsx:361"}, "properties": {"repobilityId": "ef0cd8e15baf31e2", "scanner": "scanner-primary", "fingerprint": "0dfadd35cb9c09f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-469117bb1d1bf297", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/clinical/SubjectListView.tsx:307"}, "properties": {"repobilityId": "d0ab4d61d08a633e", "scanner": "scanner-primary", "fingerprint": "469117bb1d1bf297", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef319fc5b23c491d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/QMSCascadeStrip.tsx:57"}, "properties": {"repobilityId": "94278ca7a5b60629", "scanner": "scanner-primary", "fingerprint": "ef319fc5b23c491d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4fca7744efcee79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qms/SOPLibraryPanel.tsx:288"}, "properties": {"repobilityId": "ec985683afc726e5", "scanner": "scanner-primary", "fingerprint": "b4fca7744efcee79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77e5769103cf7f34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoAnalyticsDashboard.tsx:129"}, "properties": {"repobilityId": "66996411cdde2c54", "scanner": "scanner-primary", "fingerprint": "77e5769103cf7f34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d7b506487d96bba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoDashboard.tsx:362"}, "properties": {"repobilityId": "5d2a982fa0a0d001", "scanner": "scanner-primary", "fingerprint": "0d7b506487d96bba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d2fe2f802b9265d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/GuidedDemoOverlay.tsx:264"}, "properties": {"repobilityId": "d7a0b617fb9d4e45", "scanner": "scanner-primary", "fingerprint": "9d2fe2f802b9265d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa2324c89bc6230d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleEventFeed.tsx:129"}, "properties": {"repobilityId": "a35d2131c9f35c3c", "scanner": "scanner-primary", "fingerprint": "fa2324c89bc6230d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-012e010b591ccde6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/PresenterDashboard.tsx:572"}, "properties": {"repobilityId": "c1c1bbec41607658", "scanner": "scanner-primary", "fingerprint": "012e010b591ccde6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33d591ae9719b8bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/CrossModuleActivityDashboard.tsx:221"}, "properties": {"repobilityId": "96701b28e1c18123", "scanner": "scanner-primary", "fingerprint": "33d591ae9719b8bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf9c5cc44f848cb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickPresetSwitcher.tsx:139"}, "properties": {"repobilityId": "3bfbc820ea9ec0c6", "scanner": "scanner-primary", "fingerprint": "cf9c5cc44f848cb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5eabbba6e648f7b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuickHighlightsOverlay.tsx:341"}, "properties": {"repobilityId": "525e1d778dee034e", "scanner": "scanner-primary", "fingerprint": "5eabbba6e648f7b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ca1e685288037c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoHealthMonitor.tsx:284"}, "properties": {"repobilityId": "b61b2cc53a81e642", "scanner": "scanner-primary", "fingerprint": "8ca1e685288037c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-626e000a87929a06", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/demo/CrossModuleLineageStatus.tsx:205"}, "properties": {"repobilityId": "ea35e7f06408311a", "scanner": "scanner-primary", "fingerprint": "626e000a87929a06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-48091e4ccd68d46e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SignalAnalysisPanel.tsx:69"}, "properties": {"repobilityId": "c09426045fa21337", "scanner": "scanner-primary", "fingerprint": "48091e4ccd68d46e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29c03cf0900240b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:320"}, "properties": {"repobilityId": "bdf5598a52ed30b6", "scanner": "scanner-primary", "fingerprint": "29c03cf0900240b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed4fc372196efd6c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:618"}, "properties": {"repobilityId": "a9e51b57857a17b9", "scanner": "scanner-primary", "fingerprint": "ed4fc372196efd6c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a217c25824ebb51c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/safety/AggregateReportGenerationPanel.tsx:448"}, "properties": {"repobilityId": "a52639fb678bd18d", "scanner": "scanner-primary", "fingerprint": "a217c25824ebb51c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad7b8fb7643ae682", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/safety/XMLPreviewPanel.tsx:305"}, "properties": {"repobilityId": "a8bb5b983dfbbd2f", "scanner": "scanner-primary", "fingerprint": "ad7b8fb7643ae682", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-947f2d490d6be131", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410"}, "properties": {"repobilityId": "079ec7423ff32625", "scanner": "scanner-primary", "fingerprint": "947f2d490d6be131", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-702b110d39ae53bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ProfessionalDocumentPreview.tsx:297"}, "properties": {"repobilityId": "7563184f878cd0fa", "scanner": "scanner-primary", "fingerprint": "702b110d39ae53bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88d5e4a74425302b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/CitationPanel.tsx:232"}, "properties": {"repobilityId": "06c337c7222d8045", "scanner": "scanner-primary", "fingerprint": "88d5e4a74425302b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e31639415a93d2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReviewDecisionDialog.tsx:193"}, "properties": {"repobilityId": "50f671bbb4ac42e6", "scanner": "scanner-primary", "fingerprint": "2e31639415a93d2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7de6155010ac731f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/EnhancedReviewWorkflowPanel.tsx:577"}, "properties": {"repobilityId": "edf08e64ebe3cadb", "scanner": "scanner-primary", "fingerprint": "7de6155010ac731f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68812696c8c7079f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ComponentsPanel.tsx:219"}, "properties": {"repobilityId": "23acc9e776b1001b", "scanner": "scanner-primary", "fingerprint": "68812696c8c7079f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f872fb939eae5e5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SectionGenerationWorkflow.tsx:860"}, "properties": {"repobilityId": "45244265ddd64e24", "scanner": "scanner-primary", "fingerprint": "f872fb939eae5e5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d7467f10be23fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourcesPanel.tsx:322"}, "properties": {"repobilityId": "d5d93f02fe008e2a", "scanner": "scanner-primary", "fingerprint": "f4d7467f10be23fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf13694a718520dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/InContextCommentSystem.tsx:181"}, "properties": {"repobilityId": "6a34c587bd2273e9", "scanner": "scanner-primary", "fingerprint": "cf13694a718520dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee5b38de6094734d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:99"}, "properties": {"repobilityId": "c92924377fa3b40d", "scanner": "scanner-primary", "fingerprint": "ee5b38de6094734d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-698320e20994d298", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/BatchGenerationPanel.tsx:481"}, "properties": {"repobilityId": "e426ef4035d59bdd", "scanner": "scanner-primary", "fingerprint": "698320e20994d298", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6980134c07931996", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:395"}, "properties": {"repobilityId": "9d6d232678e56238", "scanner": "scanner-primary", "fingerprint": "6980134c07931996", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca7fd0737f45d7ca", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/DocumentEditor.tsx:663"}, "properties": {"repobilityId": "f10637862b61efb0", "scanner": "scanner-primary", "fingerprint": "ca7fd0737f45d7ca", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-053c096a7f137d34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ChunkPreviewPanel.tsx:190"}, "properties": {"repobilityId": "f81da314b4f87211", "scanner": "scanner-primary", "fingerprint": "053c096a7f137d34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3300dfeb47ca31da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/ReconciliationReportPanel.tsx:405"}, "properties": {"repobilityId": "c6f89176daec04e8", "scanner": "scanner-primary", "fingerprint": "3300dfeb47ca31da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ca4cdab64a0f724", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/DocumentLifecyclePanel.tsx:119"}, "properties": {"repobilityId": "0b1b3042069d1060", "scanner": "scanner-primary", "fingerprint": "7ca4cdab64a0f724", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-940038482e7aa4f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/AISectionEditor.tsx:787"}, "properties": {"repobilityId": "f573e03c36d27fdd", "scanner": "scanner-primary", "fingerprint": "940038482e7aa4f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78d9700018f383d2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/authoring/AISectionEditor.tsx:501"}, "properties": {"repobilityId": "f2bf23daa7ecf97b", "scanner": "scanner-primary", "fingerprint": "78d9700018f383d2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-16d0a15c9bbb9f14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/authoring/SourceIngestionPanel.tsx:656"}, "properties": {"repobilityId": "22e75dfe96801a4b", "scanner": "scanner-primary", "fingerprint": "16d0a15c9bbb9f14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5062d96e11707b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/ObservabilityDashboard.tsx:452"}, "properties": {"repobilityId": "0a1b63c50426df95", "scanner": "scanner-primary", "fingerprint": "a5062d96e11707b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c966277a897ff3f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/offline/OfflineCacheManager.tsx:301"}, "properties": {"repobilityId": "50d8c28641d28af1", "scanner": "scanner-primary", "fingerprint": "c966277a897ff3f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c28d37f0ff28ad9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQContextPanel.tsx:508"}, "properties": {"repobilityId": "3b6ab7f93dcfae47", "scanner": "scanner-primary", "fingerprint": "9c28d37f0ff28ad9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9e9058dc2c0caf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQCascadeStrip.tsx:69"}, "properties": {"repobilityId": "14d7b497c216c413", "scanner": "scanner-primary", "fingerprint": "a9e9058dc2c0caf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9db1b5e8dda81ea1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:268"}, "properties": {"repobilityId": "c7a034be96d7d9df", "scanner": "scanner-primary", "fingerprint": "9db1b5e8dda81ea1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d62beb04bfc82c2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/haq/HAQStreamingPanel.tsx:533"}, "properties": {"repobilityId": "6597500fe927b975", "scanner": "scanner-primary", "fingerprint": "3d62beb04bfc82c2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-27c0ec7513014380", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/haq/HAQEvidenceGatherer.tsx:542"}, "properties": {"repobilityId": "7eac3bd726d6ae4d", "scanner": "scanner-primary", "fingerprint": "27c0ec7513014380", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-792c0689cdaef447", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926"}, "properties": {"repobilityId": "ec70a8dbc55a0c60", "scanner": "scanner-primary", "fingerprint": "792c0689cdaef447", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8fea7fc28297c3ba", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ai/AIGenerationPanel.tsx:327"}, "properties": {"repobilityId": "19b077ec002639e2", "scanner": "scanner-primary", "fingerprint": "8fea7fc28297c3ba", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f73f2bf948a3144c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/HAQAnalyticsDashboard.tsx:1033"}, "properties": {"repobilityId": "5848685b2c8c00fa", "scanner": "scanner-primary", "fingerprint": "f73f2bf948a3144c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94fcebf4cbf79f92", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/analytics/ResilienceAnalyticsDashboard.tsx:356"}, "properties": {"repobilityId": "dc5e85afc24f6275", "scanner": "scanner-primary", "fingerprint": "94fcebf4cbf79f92", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8617603bc1c8cda4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/glp/GLPEDCIntegrationTab.tsx:413"}, "properties": {"repobilityId": "9fbec5dbcc648f54", "scanner": "scanner-primary", "fingerprint": "8617603bc1c8cda4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d024ec7b0e77bd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/intelligence/ResponseIntelligencePanel.tsx:209"}, "properties": {"repobilityId": "baeee223a4f01e4f", "scanner": "scanner-primary", "fingerprint": "1d024ec7b0e77bd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85cb8c20e779dc7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CommandPalette.tsx:609"}, "properties": {"repobilityId": "0916f6c745f65e1f", "scanner": "scanner-primary", "fingerprint": "85cb8c20e779dc7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ce4229510a2b449", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ProductContextSelector.tsx:140"}, "properties": {"repobilityId": "25a8b929ab964e87", "scanner": "scanner-primary", "fingerprint": "3ce4229510a2b449", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c181277869b50cd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/Select.tsx:257"}, "properties": {"repobilityId": "9053ceb9a02aa151", "scanner": "scanner-primary", "fingerprint": "c181277869b50cd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b046ad32a6feac08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/WorkspaceLayout.tsx:286"}, "properties": {"repobilityId": "3290bd969425d49a", "scanner": "scanner-primary", "fingerprint": "b046ad32a6feac08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-877fdeb595766f01", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ui/ResizablePanel.tsx:53"}, "properties": {"repobilityId": "26e493570b920395", "scanner": "scanner-primary", "fingerprint": "877fdeb595766f01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-56018582c076cabb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/FileUpload.tsx:503"}, "properties": {"repobilityId": "9e2f67f29c2dcb78", "scanner": "scanner-primary", "fingerprint": "56018582c076cabb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2e73670aa49e681", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/EmptyStates.tsx:144"}, "properties": {"repobilityId": "44d95dd26ed72f63", "scanner": "scanner-primary", "fingerprint": "b2e73670aa49e681", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fe5ab9a34671d73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompactStatBar.tsx:114"}, "properties": {"repobilityId": "21c2e77f1724be5e", "scanner": "scanner-primary", "fingerprint": "9fe5ab9a34671d73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ac0d9166b3c75cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ResponsivePrimitives.tsx:100"}, "properties": {"repobilityId": "a62cda023339daaa", "scanner": "scanner-primary", "fingerprint": "8ac0d9166b3c75cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bcbbe10bd8558d36", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UserSwitcher.tsx:149"}, "properties": {"repobilityId": "bbf9d50662648826", "scanner": "scanner-primary", "fingerprint": "bcbbe10bd8558d36", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5dd7f3aeafcf58e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenLayout.tsx:309"}, "properties": {"repobilityId": "67de9375294f784f", "scanner": "scanner-primary", "fingerprint": "5dd7f3aeafcf58e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03a9b9c4d0ef5120", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CascadeBanner.tsx:100"}, "properties": {"repobilityId": "a5f403c37c737e60", "scanner": "scanner-primary", "fingerprint": "03a9b9c4d0ef5120", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0fd5af08e048047d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/QuickActionDrawer.tsx:132"}, "properties": {"repobilityId": "c8b0659fbfb6949b", "scanner": "scanner-primary", "fingerprint": "0fd5af08e048047d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47050470e2ddbfd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ScreenHeader.tsx:111"}, "properties": {"repobilityId": "728ac92109634e91", "scanner": "scanner-primary", "fingerprint": "47050470e2ddbfd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b674a5aa47f0f341", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/CompoundLifecycleStrip.tsx:201"}, "properties": {"repobilityId": "79dfdb2b7f81a65f", "scanner": "scanner-primary", "fingerprint": "b674a5aa47f0f341", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6bb3e9d37aeef30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ModuleQuickAccessCard.tsx:229"}, "properties": {"repobilityId": "04cb7ae7cb476b00", "scanner": "scanner-primary", "fingerprint": "c6bb3e9d37aeef30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da4466572cfe2b2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AuditTimeline.tsx:689"}, "properties": {"repobilityId": "b3d055cdf34d122f", "scanner": "scanner-primary", "fingerprint": "da4466572cfe2b2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-debfe83156a1a01a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/AlertCard.tsx:39"}, "properties": {"repobilityId": "3b52ff2883b9ffa3", "scanner": "scanner-primary", "fingerprint": "debfe83156a1a01a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8dfc7c73353f65fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/HAQResponseEditorV2.tsx:308"}, "properties": {"repobilityId": "1534a3c9dc99ee93", "scanner": "scanner-primary", "fingerprint": "8dfc7c73353f65fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bf0e5a0297076e5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/DrillableStatCard.tsx:190"}, "properties": {"repobilityId": "39875ea4491503b9", "scanner": "scanner-primary", "fingerprint": "bf0e5a0297076e5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36bec42321e64b47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/UnifiedDocumentBrowser.tsx:228"}, "properties": {"repobilityId": "123a3cdbe297559f", "scanner": "scanner-primary", "fingerprint": "36bec42321e64b47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a2834106a5d9bc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CTMSScreen.tsx:627"}, "properties": {"repobilityId": "9fd113078185b314", "scanner": "scanner-primary", "fingerprint": "7a2834106a5d9bc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c21845e5b3abc42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RdTimelineScreen.tsx:855"}, "properties": {"repobilityId": "7790a39f9e703e1d", "scanner": "scanner-primary", "fingerprint": "9c21845e5b3abc42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01740c66ce7bca7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDWorkspaceScreen.tsx:806"}, "properties": {"repobilityId": "0a3bf2eeeb5dd018", "scanner": "scanner-primary", "fingerprint": "01740c66ce7bca7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6f90e4b8370c466", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ProgramDetailScreen.tsx:420"}, "properties": {"repobilityId": "3980bf50f115457f", "scanner": "scanner-primary", "fingerprint": "d6f90e4b8370c466", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a757a9d1ec3078d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/QMSScreen.tsx:408"}, "properties": {"repobilityId": "2ca78f5284717a06", "scanner": "scanner-primary", "fingerprint": "a757a9d1ec3078d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-551c8e013bdfd112", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PlatformAnalyticsDashboard.tsx:811"}, "properties": {"repobilityId": "82bf27be6c7aa6bf", "scanner": "scanner-primary", "fingerprint": "551c8e013bdfd112", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8186278cde98b468", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ResearchScreen.tsx:1606"}, "properties": {"repobilityId": "92104dde9d311dab", "scanner": "scanner-primary", "fingerprint": "8186278cde98b468", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-344275a7e8f62aab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActionCenterScreen.tsx:697"}, "properties": {"repobilityId": "3797bd396f79dd73", "scanner": "scanner-primary", "fingerprint": "344275a7e8f62aab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bd58021ab8e525d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SupplyChainScreen.tsx:1183"}, "properties": {"repobilityId": "bea1385512548f31", "scanner": "scanner-primary", "fingerprint": "7bd58021ab8e525d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3746f0a514013f5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ManufacturingScreen.tsx:371"}, "properties": {"repobilityId": "3a6dc191aa8ca1b3", "scanner": "scanner-primary", "fingerprint": "3746f0a514013f5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64bcda754f2e08fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/LabelingScreen.tsx:866"}, "properties": {"repobilityId": "37780aa5ccf56de4", "scanner": "scanner-primary", "fingerprint": "64bcda754f2e08fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0fcfd12e4d1f671", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx:770"}, "properties": {"repobilityId": "4ec3014f8ce02f70", "scanner": "scanner-primary", "fingerprint": "a0fcfd12e4d1f671", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed87ab2d7f0a5864", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsScreen.tsx:1558"}, "properties": {"repobilityId": "1fbe7799521fd4f6", "scanner": "scanner-primary", "fingerprint": "ed87ab2d7f0a5864", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d8362e5e6b6bf95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CommitmentsManager.tsx:503"}, "properties": {"repobilityId": "4c25a184e3178a6d", "scanner": "scanner-primary", "fingerprint": "3d8362e5e6b6bf95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a62f40f2888e5f21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ELNScreen.tsx:568"}, "properties": {"repobilityId": "db127ffb6948af59", "scanner": "scanner-primary", "fingerprint": "a62f40f2888e5f21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72b3dbad742ca68e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RegistrationsTracker.tsx:123"}, "properties": {"repobilityId": "72fccbf5ebbdbd00", "scanner": "scanner-primary", "fingerprint": "72b3dbad742ca68e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81a5446140951049", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionsHubScreen.tsx:160"}, "properties": {"repobilityId": "5ddf9d40b2567fa6", "scanner": "scanner-primary", "fingerprint": "81a5446140951049", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8e630360f19f0a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioStrategyView.tsx:147"}, "properties": {"repobilityId": "a09c656c25754386", "scanner": "scanner-primary", "fingerprint": "d8e630360f19f0a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-219650154a53747e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SubmissionReadinessDashboard.tsx:580"}, "properties": {"repobilityId": "ac2181f460964c9a", "scanner": "scanner-primary", "fingerprint": "219650154a53747e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bfd7a48812db6797", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:838"}, "properties": {"repobilityId": "90c0409a0981714d", "scanner": "scanner-primary", "fingerprint": "bfd7a48812db6797", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1955bfc8e06a69ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GLPScreen.tsx:1979"}, "properties": {"repobilityId": "cc44901f73ba0684", "scanner": "scanner-primary", "fingerprint": "1955bfc8e06a69ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4596c1d873c2dffa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PortfolioScreen.tsx:671"}, "properties": {"repobilityId": "01c7d5bda0958ea3", "scanner": "scanner-primary", "fingerprint": "4596c1d873c2dffa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bec18c57a39ad305", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MultiRegionSubmissionTracker.tsx:754"}, "properties": {"repobilityId": "5dca6d3eb1e3c7d9", "scanner": "scanner-primary", "fingerprint": "bec18c57a39ad305", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16f7ad7d9d157644", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDArchivesScreen.tsx:556"}, "properties": {"repobilityId": "a0f586bbcbbea048", "scanner": "scanner-primary", "fingerprint": "16f7ad7d9d157644", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-816d30ba482d5347", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ActivityScreen.tsx:218"}, "properties": {"repobilityId": "49c2f20d1fb32837", "scanner": "scanner-primary", "fingerprint": "816d30ba482d5347", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86856a2074263c0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BiostatsScreen.tsx:850"}, "properties": {"repobilityId": "d0b14c223ae4bda8", "scanner": "scanner-primary", "fingerprint": "86856a2074263c0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4d645621c3d79c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/MedicalAffairsScreen.tsx:616"}, "properties": {"repobilityId": "a8dd92343cf9a5cd", "scanner": "scanner-primary", "fingerprint": "b4d645621c3d79c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82a410ba85e7c705", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:564"}, "properties": {"repobilityId": "0c5121c3563fb1fd", "scanner": "scanner-primary", "fingerprint": "82a410ba85e7c705", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c98c7d5f0733815", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870"}, "properties": {"repobilityId": "60f714d18dfbf07a", "scanner": "scanner-primary", "fingerprint": "3c98c7d5f0733815", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-453f6e5fdfe4d932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/TMFScreen.tsx:390"}, "properties": {"repobilityId": "6d7bb930ce07f2f3", "scanner": "scanner-primary", "fingerprint": "453f6e5fdfe4d932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33570c000a5bcc95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/DocumentControlScreen.tsx:1246"}, "properties": {"repobilityId": "e7bef29483de2a0a", "scanner": "scanner-primary", "fingerprint": "33570c000a5bcc95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4274a19cb5bcf724", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AdminScreen.tsx:1064"}, "properties": {"repobilityId": "47cb9049b3a7ef5f", "scanner": "scanner-primary", "fingerprint": "4274a19cb5bcf724", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b384711248259ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/BDScreen.tsx:190"}, "properties": {"repobilityId": "5a5c3d7c82a52ec1", "scanner": "scanner-primary", "fingerprint": "5b384711248259ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-074d021ad150662b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/NonclinicalScreen.tsx:440"}, "properties": {"repobilityId": "4b36c3a5ff54323c", "scanner": "scanner-primary", "fingerprint": "074d021ad150662b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f0c7d61b7d3d5cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/HomeScreen.tsx:180"}, "properties": {"repobilityId": "c677b3e142ff465c", "scanner": "scanner-primary", "fingerprint": "2f0c7d61b7d3d5cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5da75a8edf8695f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SafetyScreen.tsx:820"}, "properties": {"repobilityId": "937b2fa0f4a524af", "scanner": "scanner-primary", "fingerprint": "c5da75a8edf8695f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfe1397b279f6e00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx:212"}, "properties": {"repobilityId": "2d18a29e973421b1", "scanner": "scanner-primary", "fingerprint": "dfe1397b279f6e00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e58f165edbc4b767", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/SPLScreen.tsx:96"}, "properties": {"repobilityId": "49f38f6137c9b1f9", "scanner": "scanner-primary", "fingerprint": "e58f165edbc4b767", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8bb923156ccc5ea3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ApprovalWorkflowVisualization.tsx:689"}, "properties": {"repobilityId": "9debdfca1cfbc67d", "scanner": "scanner-primary", "fingerprint": "8bb923156ccc5ea3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-097bcba17c79df99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/GCPScreen.tsx:410"}, "properties": {"repobilityId": "2c61b61b79fa7057", "scanner": "scanner-primary", "fingerprint": "097bcba17c79df99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-681fbfd575d8213b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuthoringScreen.tsx:900"}, "properties": {"repobilityId": "e9c5ece01c7c39f9", "scanner": "scanner-primary", "fingerprint": "681fbfd575d8213b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22fda2595cf63214", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/screens/AuthoringScreen.tsx:2256"}, "properties": {"repobilityId": "5628b0088ed414bd", "scanner": "scanner-primary", "fingerprint": "22fda2595cf63214", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4a7d67cc5bfad6e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ClinicalDevelopmentScreen.tsx:397"}, "properties": {"repobilityId": "2eb8850716236305", "scanner": "scanner-primary", "fingerprint": "4a7d67cc5bfad6e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-179aef26f5702eab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:770"}, "properties": {"repobilityId": "a5089ce7a2c82880", "scanner": "scanner-primary", "fingerprint": "179aef26f5702eab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-910319645185383b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/CreateModals.tsx:610"}, "properties": {"repobilityId": "23652f934cb83e5c", "scanner": "scanner-primary", "fingerprint": "910319645185383b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fa01621a558a4dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/PSMFScreen.tsx:402"}, "properties": {"repobilityId": "5dba18d9cdc159a9", "scanner": "scanner-primary", "fingerprint": "9fa01621a558a4dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94f6618e1bea3bf9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/ECTDIntelligenceScreen.tsx:624"}, "properties": {"repobilityId": "5f8afcf5203817ff", "scanner": "scanner-primary", "fingerprint": "94f6618e1bea3bf9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d9e09ca042adb0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:128"}, "properties": {"repobilityId": "858e0eb10b108df3", "scanner": "scanner-primary", "fingerprint": "6d9e09ca042adb0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d41ab2a1cb48d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:1029"}, "properties": {"repobilityId": "579eaf38aff0de0a", "scanner": "scanner-primary", "fingerprint": "f4d41ab2a1cb48d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18a55cbf8e21205a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/screens/AuditTrailDashboard.tsx:889"}, "properties": {"repobilityId": "328eab2136886f03", "scanner": "scanner-primary", "fingerprint": "18a55cbf8e21205a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e20d0cf9d8626650", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/ResizableDocumentViewer.tsx:368"}, "properties": {"repobilityId": "0cb63022247784bf", "scanner": "scanner-primary", "fingerprint": "e20d0cf9d8626650", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59d421f0ceec9403", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:94"}, "properties": {"repobilityId": "604b950b1c77f521", "scanner": "scanner-primary", "fingerprint": "59d421f0ceec9403", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-885c44c5e053d79f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/CrossReferenceGraph.tsx:607"}, "properties": {"repobilityId": "45f58d690c3cc06a", "scanner": "scanner-primary", "fingerprint": "885c44c5e053d79f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95ef51226a34cde5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:451"}, "properties": {"repobilityId": "bfb9099f38b612d4", "scanner": "scanner-primary", "fingerprint": "95ef51226a34cde5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6267ea8067ce0e13", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/PagedDocumentRenderer.tsx:426"}, "properties": {"repobilityId": "b21b17bbd5d83f5f", "scanner": "scanner-primary", "fingerprint": "6267ea8067ce0e13", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1d1e1a6eea556068", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentViewer.tsx:138"}, "properties": {"repobilityId": "04297574e10cb4ca", "scanner": "scanner-primary", "fingerprint": "1d1e1a6eea556068", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-657b0f6f2331a830", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentViewer.tsx:542"}, "properties": {"repobilityId": "88e9ddf19c9c83c5", "scanner": "scanner-primary", "fingerprint": "657b0f6f2331a830", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6923b31dd06f9ea0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/viewer/DocumentCompareViewer.tsx:409"}, "properties": {"repobilityId": "e86f5ee54f539f27", "scanner": "scanner-primary", "fingerprint": "6923b31dd06f9ea0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cd99fd9242ee513c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/viewer/DocumentImpactAnalysis.tsx:198"}, "properties": {"repobilityId": "d7b7f73400a63aa3", "scanner": "scanner-primary", "fingerprint": "cd99fd9242ee513c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-967fe4af37b98677", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/ResponseTemplateLibrary.tsx:969"}, "properties": {"repobilityId": "5b8ee2d8947d29a7", "scanner": "scanner-primary", "fingerprint": "967fe4af37b98677", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5936747183bff73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/templates/TemplateBrowser.tsx:756"}, "properties": {"repobilityId": "1a1e7b0062f80c4d", "scanner": "scanner-primary", "fingerprint": "a5936747183bff73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49cf29b6b5795ecb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/EnhancedGlobalSearch.tsx:179"}, "properties": {"repobilityId": "157232b25db6b107", "scanner": "scanner-primary", "fingerprint": "49cf29b6b5795ecb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6659bb32f357d360", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/search/GlobalSearch.tsx:511"}, "properties": {"repobilityId": "a61929ca5211c291", "scanner": "scanner-primary", "fingerprint": "6659bb32f357d360", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97e969588fa531b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.tsx:140"}, "properties": {"repobilityId": "f608d23d9f4b20ea", "scanner": "scanner-primary", "fingerprint": "97e969588fa531b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d16994393200edd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/ValidationProtocolPanel.tsx:622"}, "properties": {"repobilityId": "d03c40e8f0b74e4e", "scanner": "scanner-primary", "fingerprint": "d16994393200edd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-962ccee8b7b0ef10", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/Part11Panel.tsx:474"}, "properties": {"repobilityId": "33144962fa30e2dd", "scanner": "scanner-primary", "fingerprint": "962ccee8b7b0ef10", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ddd584cfc868c2be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/compliance/RTMPanel.tsx:505"}, "properties": {"repobilityId": "70a100dfc27b41d8", "scanner": "scanner-primary", "fingerprint": "ddd584cfc868c2be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4c8922115949e46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CapabilityProfilePanel.tsx:119"}, "properties": {"repobilityId": "37268646ceab1cd4", "scanner": "scanner-primary", "fingerprint": "c4c8922115949e46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cb1d39cec0e17db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ThemeSettingsPanel.tsx:679"}, "properties": {"repobilityId": "1e32ffaf24418775", "scanner": "scanner-primary", "fingerprint": "6cb1d39cec0e17db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b01d099264082ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/CitationMonitorPanel.tsx:251"}, "properties": {"repobilityId": "6287d0ec81c521eb", "scanner": "scanner-primary", "fingerprint": "5b01d099264082ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d98f731edccd78ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/SampleListView.tsx:416"}, "properties": {"repobilityId": "9bccd25d0f93daff", "scanner": "scanner-primary", "fingerprint": "d98f731edccd78ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d3f8beb46ce6fb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/CompoundDetailPanel.tsx:288"}, "properties": {"repobilityId": "095c59af918191c1", "scanner": "scanner-primary", "fingerprint": "1d3f8beb46ce6fb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9cb988f6e90ff603", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lab/LabDashboard.tsx:285"}, "properties": {"repobilityId": "d1bd6c8b0a1892ed", "scanner": "scanner-primary", "fingerprint": "9cb988f6e90ff603", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0479fa41f7c97ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PDFValidatorPanel.tsx:315"}, "properties": {"repobilityId": "b11107584888c4e5", "scanner": "scanner-primary", "fingerprint": "e0479fa41f7c97ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1508a781f2373ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/AIAssemblyAssistant.tsx:292"}, "properties": {"repobilityId": "2f75fd10165fb9c9", "scanner": "scanner-primary", "fingerprint": "e1508a781f2373ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b7811e3d9ffb9ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/EnhancedValidationPanel.tsx:358"}, "properties": {"repobilityId": "b9558a1c30e76dc4", "scanner": "scanner-primary", "fingerprint": "6b7811e3d9ffb9ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8b376fba12e5711", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/HyperlinkManagerPanel.tsx:396"}, "properties": {"repobilityId": "858b3d31969ffdb9", "scanner": "scanner-primary", "fingerprint": "f8b376fba12e5711", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3762afa4ecce132", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDValidationWorkflow.tsx:625"}, "properties": {"repobilityId": "f885622deb220d3e", "scanner": "scanner-primary", "fingerprint": "e3762afa4ecce132", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5e9b3a936a5f493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingJobMonitor.tsx:132"}, "properties": {"repobilityId": "b802e2efb760a6cf", "scanner": "scanner-primary", "fingerprint": "b5e9b3a936a5f493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c6771b66d04a841", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ECTDViewerPanel.tsx:202"}, "properties": {"repobilityId": "ef09f0c1b93cea72", "scanner": "scanner-primary", "fingerprint": "6c6771b66d04a841", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1433df7b0d781930", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ContentReuseEngine.tsx:280"}, "properties": {"repobilityId": "eec46e22fbaeeb9c", "scanner": "scanner-primary", "fingerprint": "1433df7b0d781930", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43bafd67ca40964d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SequenceBuilderPanel.tsx:81"}, "properties": {"repobilityId": "7b5ac1cceb116712", "scanner": "scanner-primary", "fingerprint": "43bafd67ca40964d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-363acb6755a93337", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PriorDossierImportPanel.tsx:385"}, "properties": {"repobilityId": "0b3db11942b7dbd6", "scanner": "scanner-primary", "fingerprint": "363acb6755a93337", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9ef0405bbc1963f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:250"}, "properties": {"repobilityId": "e15b442452b85354", "scanner": "scanner-primary", "fingerprint": "f9ef0405bbc1963f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db4d83417f266198", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:158"}, "properties": {"repobilityId": "a3cb3747acebc9f3", "scanner": "scanner-primary", "fingerprint": "db4d83417f266198", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-490ac6e80986fb7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/PublishingWorkspace.tsx:526"}, "properties": {"repobilityId": "8008469f2a02d8f3", "scanner": "scanner-primary", "fingerprint": "490ac6e80986fb7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15278313beec3dab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/CrossReferenceValidationPanel.tsx:414"}, "properties": {"repobilityId": "941eb00c1563df06", "scanner": "scanner-primary", "fingerprint": "15278313beec3dab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55653aa5971ebf1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/publishing/ArchiveWorkflowPanel.tsx:473"}, "properties": {"repobilityId": "8ed8892c130f1290", "scanner": "scanner-primary", "fingerprint": "55653aa5971ebf1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3ced7333425187e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/conflicts/ConflictResolutionUI.tsx:645"}, "properties": {"repobilityId": "817c07aefa7705d0", "scanner": "scanner-primary", "fingerprint": "f3ced7333425187e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab7a2e3837ba33b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CPIDetailPanel.tsx:167"}, "properties": {"repobilityId": "1b79a02a297de910", "scanner": "scanner-primary", "fingerprint": "ab7a2e3837ba33b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76f401b8df9c9903", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SequenceComparisonPanel.tsx:395"}, "properties": {"repobilityId": "f2f7b49301da0a35", "scanner": "scanner-primary", "fingerprint": "76f401b8df9c9903", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6323d954b9a81f51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:858"}, "properties": {"repobilityId": "09fc9facfd9a5f26", "scanner": "scanner-primary", "fingerprint": "6323d954b9a81f51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b11882fffbd9bd74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffReceiver.tsx:194"}, "properties": {"repobilityId": "2cffdf040b823767", "scanner": "scanner-primary", "fingerprint": "b11882fffbd9bd74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63a46299badb1f60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/RDConnectedContextPanel.tsx:426"}, "properties": {"repobilityId": "1406c5160a5b902b", "scanner": "scanner-primary", "fingerprint": "63a46299badb1f60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bf3cee1e1a734ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/SubmissionBuilder.tsx:735"}, "properties": {"repobilityId": "7f6d52cc89ad2cfb", "scanner": "scanner-primary", "fingerprint": "1bf3cee1e1a734ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ff475e44633db6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PipelineView.tsx:729"}, "properties": {"repobilityId": "42df9ec289edb86e", "scanner": "scanner-primary", "fingerprint": "6ff475e44633db6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d852a7394e9d644", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PDFValidationPanel.tsx:334"}, "properties": {"repobilityId": "e14d41bbd1c49cd6", "scanner": "scanner-primary", "fingerprint": "4d852a7394e9d644", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-770ac2a665319f95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PublishingQueue.tsx:208"}, "properties": {"repobilityId": "2c9bc91dc7fb2003", "scanner": "scanner-primary", "fingerprint": "770ac2a665319f95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf950a2c4108bffb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/CorrespondenceIntegrationPanel.tsx:267"}, "properties": {"repobilityId": "b3213f003c899500", "scanner": "scanner-primary", "fingerprint": "cf950a2c4108bffb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf55a3690374bb0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/TaskAssignmentPanel.tsx:215"}, "properties": {"repobilityId": "f4870ff9dcae1df6", "scanner": "scanner-primary", "fingerprint": "cf55a3690374bb0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-101ee6d24d0daf2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/ContentCollectionPanel.tsx:130"}, "properties": {"repobilityId": "f7802aabe7371482", "scanner": "scanner-primary", "fingerprint": "101ee6d24d0daf2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cda1fefe4972bbd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/PlanningView.tsx:241"}, "properties": {"repobilityId": "f7fbbbd9cf29a286", "scanner": "scanner-primary", "fingerprint": "cda1fefe4972bbd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c76047ebaa99d7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/submissions/HAQHandoffPanel.tsx:165"}, "properties": {"repobilityId": "5a2da23ab6998250", "scanner": "scanner-primary", "fingerprint": "0c76047ebaa99d7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c47d2ec4a7542f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFVersionComparison.tsx:602"}, "properties": {"repobilityId": "c89a705a0d1ab574", "scanner": "scanner-primary", "fingerprint": "8c47d2ec4a7542f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9a9d889e5ea88b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:419"}, "properties": {"repobilityId": "0ad32646dc46ffd9", "scanner": "scanner-primary", "fingerprint": "b9a9d889e5ea88b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32d226bbdd1bf267", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/AutoLinkDashboard.tsx:304"}, "properties": {"repobilityId": "9a83e18961426d9e", "scanner": "scanner-primary", "fingerprint": "32d226bbdd1bf267", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5f1fcad3b38812f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/DIAGapTrendAnalytics.tsx:896"}, "properties": {"repobilityId": "8cf236c7fdf625b4", "scanner": "scanner-primary", "fingerprint": "f5f1fcad3b38812f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66d4d3fadf87abde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tmf/TMFGapAnalysis.tsx:751"}, "properties": {"repobilityId": "b965ac65444c794a", "scanner": "scanner-primary", "fingerprint": "66d4d3fadf87abde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b67819353ca435c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/AssetDueDiligencePanel.tsx:258"}, "properties": {"repobilityId": "9ad6a50e0c0f6516", "scanner": "scanner-primary", "fingerprint": "4b67819353ca435c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a65fb91709e0b904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/agents/HAAgentPanel.tsx:401"}, "properties": {"repobilityId": "107a6d3b388e8604", "scanner": "scanner-primary", "fingerprint": "a65fb91709e0b904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66f34494bbb3bd2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/PublishingWizard.tsx:1076"}, "properties": {"repobilityId": "9414c338fcd67f84", "scanner": "scanner-primary", "fingerprint": "66f34494bbb3bd2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ebc20f63b515ec4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/CTDTree.tsx:131"}, "properties": {"repobilityId": "64588fbf40a80a54", "scanner": "scanner-primary", "fingerprint": "3ebc20f63b515ec4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd4b0e05d6c824bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ectd/SequenceTimeline.tsx:344"}, "properties": {"repobilityId": "1838f39d1a49a63e", "scanner": "scanner-primary", "fingerprint": "dd4b0e05d6c824bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-350d5923d9eea157", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/campaigns/CampaignDashboard.tsx:252"}, "properties": {"repobilityId": "a04073fbc71ffa99", "scanner": "scanner-primary", "fingerprint": "350d5923d9eea157", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c48e04d18a34cc6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/PipelineOrchestratorPanel.tsx:396"}, "properties": {"repobilityId": "3c69d16d9171aa60", "scanner": "scanner-primary", "fingerprint": "c48e04d18a34cc6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-514f4cab9d04449e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/cross-module/EntityLinkNavigator.tsx:138"}, "properties": {"repobilityId": "ff5e806a30ac2bd8", "scanner": "scanner-primary", "fingerprint": "514f4cab9d04449e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6358f08085c24d7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixPanel.tsx:203"}, "properties": {"repobilityId": "20072abc2ca9cecc", "scanner": "scanner-primary", "fingerprint": "6358f08085c24d7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1d9bcb37c5278f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lix/LixStatus.tsx:145"}, "properties": {"repobilityId": "8d76c16761e15f09", "scanner": "scanner-primary", "fingerprint": "e1d9bcb37c5278f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1112a4d36afa0155", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DualRepDocumentBlock.tsx:86"}, "properties": {"repobilityId": "b7f3840bee47737b", "scanner": "scanner-primary", "fingerprint": "1112a4d36afa0155", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5623a514923cb979", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalQueueDashboard.tsx:492"}, "properties": {"repobilityId": "b5e208a817ebe3bc", "scanner": "scanner-primary", "fingerprint": "5623a514923cb979", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-837adad52f399854", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalStatusDashboard.tsx:360"}, "properties": {"repobilityId": "156d8d35a54dd3e1", "scanner": "scanner-primary", "fingerprint": "837adad52f399854", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9406f3734c102fb5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApprovalRequestPanel.tsx:888"}, "properties": {"repobilityId": "2db9febc2db78b50", "scanner": "scanner-primary", "fingerprint": "9406f3734c102fb5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5bc0318264ad2bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/VersionCreationWizard.tsx:426"}, "properties": {"repobilityId": "f23c09da759f7d74", "scanner": "scanner-primary", "fingerprint": "d5bc0318264ad2bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb68fc4cef0e77ce", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:498"}, "properties": {"repobilityId": "2f86307025a7df39", "scanner": "scanner-primary", "fingerprint": "bb68fc4cef0e77ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0c2368e385278003", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentProvenanceBadge.tsx:275"}, "properties": {"repobilityId": "aa3ff4a38bea84c3", "scanner": "scanner-primary", "fingerprint": "0c2368e385278003", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a858fe4583f76d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ReviewCommentsThread.tsx:170"}, "properties": {"repobilityId": "10e3276de36e1ff3", "scanner": "scanner-primary", "fingerprint": "3a858fe4583f76d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89c1ee8cee092813", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/ReviewCommentsThread.tsx:421"}, "properties": {"repobilityId": "584bdc21b5454525", "scanner": "scanner-primary", "fingerprint": "89c1ee8cee092813", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fa1881e538f13658", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/CreateLinkModal.tsx:619"}, "properties": {"repobilityId": "6c5d3f46c74be5e2", "scanner": "scanner-primary", "fingerprint": "fa1881e538f13658", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2cff608e159ce9cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkedDocumentsPanel.tsx:215"}, "properties": {"repobilityId": "09d4e55c5004c85a", "scanner": "scanner-primary", "fingerprint": "2cff608e159ce9cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4e9a2866d445a6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentControlLineageIntegration.tsx:235"}, "properties": {"repobilityId": "72e0ac095945db5b", "scanner": "scanner-primary", "fingerprint": "d4e9a2866d445a6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98b37f2628e4b688", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentLineagePanel.tsx:190"}, "properties": {"repobilityId": "b14ce0fba20509b6", "scanner": "scanner-primary", "fingerprint": "98b37f2628e4b688", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-339d325a2a4ce22e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/documents/PDFDocumentPreview.tsx:232"}, "properties": {"repobilityId": "6dddc98f8d4c38d1", "scanner": "scanner-primary", "fingerprint": "339d325a2a4ce22e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9e4e4b7b21ed8195", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewer.tsx:359"}, "properties": {"repobilityId": "52072bf2997a9dd1", "scanner": "scanner-primary", "fingerprint": "9e4e4b7b21ed8195", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17289717a8e17bfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentUploadPanel.tsx:665"}, "properties": {"repobilityId": "bdc732de8b5a11b0", "scanner": "scanner-primary", "fingerprint": "17289717a8e17bfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9368d528925f3cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentViewModes.tsx:280"}, "properties": {"repobilityId": "365975c16e8a297b", "scanner": "scanner-primary", "fingerprint": "d9368d528925f3cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d4d3e1ef0d08a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/LinkValidator.tsx:172"}, "properties": {"repobilityId": "4ba11d8e2dc29589", "scanner": "scanner-primary", "fingerprint": "f4d4d3e1ef0d08a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0480447669e204e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentArtifactViewer.tsx:392"}, "properties": {"repobilityId": "a1a4cad24cc8e20e", "scanner": "scanner-primary", "fingerprint": "0480447669e204e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0061056259eedb5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/SignatureCapture.tsx:350"}, "properties": {"repobilityId": "28961f2f384cfea2", "scanner": "scanner-primary", "fingerprint": "d0061056259eedb5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-432ecb213b254d57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/DocumentHierarchy.tsx:158"}, "properties": {"repobilityId": "a7c6fc0bb67d4ea8", "scanner": "scanner-primary", "fingerprint": "432ecb213b254d57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f0ee820b0029160", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/EnhancedDocumentUploadPanel.tsx:1004"}, "properties": {"repobilityId": "254fd8ceb7d24f26", "scanner": "scanner-primary", "fingerprint": "9f0ee820b0029160", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d56fb4af5852770", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/documents/ApproverCard.tsx:70"}, "properties": {"repobilityId": "cff1f0cd236fc608", "scanner": "scanner-primary", "fingerprint": "0d56fb4af5852770", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f734226af599b5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/favorites/FavoritesPanel.tsx:65"}, "properties": {"repobilityId": "a30a5774a41b0fe1", "scanner": "scanner-primary", "fingerprint": "8f734226af599b5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24eb36821fe26f09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductFilterHeader.tsx:198"}, "properties": {"repobilityId": "6cfac0c269b62647", "scanner": "scanner-primary", "fingerprint": "24eb36821fe26f09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c105de4f6a77e43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/products/ProductSwitcher.tsx:92"}, "properties": {"repobilityId": "d9fc768d9e574c4a", "scanner": "scanner-primary", "fingerprint": "1c105de4f6a77e43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c646b86c4e369c8", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:288"}, "properties": {"repobilityId": "ce307c7d3192232c", "scanner": "scanner-primary", "fingerprint": "7c646b86c4e369c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3ebe37847a90c867", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/OfflineIndicator.tsx:180"}, "properties": {"repobilityId": "8d6133ab88f206b0", "scanner": "scanner-primary", "fingerprint": "3ebe37847a90c867", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0b68328f8c0b0f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationToolbar.tsx:249"}, "properties": {"repobilityId": "30c65b4c002dd610", "scanner": "scanner-primary", "fingerprint": "b0b68328f8c0b0f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbf7527b9573bcb1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/CollaborationPresence.tsx:237"}, "properties": {"repobilityId": "f1a38fbf73162668", "scanner": "scanner-primary", "fingerprint": "bbf7527b9573bcb1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abc18c563c225f37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresencePanel.tsx:243"}, "properties": {"repobilityId": "03f35200ebe21d95", "scanner": "scanner-primary", "fingerprint": "abc18c563c225f37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abb1cb7a4eae3c7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/collaboration/PresenceAvatars.tsx:461"}, "properties": {"repobilityId": "aeaba2d285db03db", "scanner": "scanner-primary", "fingerprint": "abb1cb7a4eae3c7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4983765053f1eb57", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/lib/error-reporting.ts:16"}, "properties": {"repobilityId": "20bab6ed20cca743", "scanner": "scanner-primary", "fingerprint": "4983765053f1eb57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-48d8352ad0a230f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/logger.ts:45"}, "properties": {"repobilityId": "4f1fec35ce3711f1", "scanner": "scanner-primary", "fingerprint": "48d8352ad0a230f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2b358448c1a1a74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SpikeHaqRagPage.tsx:88"}, "properties": {"repobilityId": "6e057308bcd0de1e", "scanner": "scanner-primary", "fingerprint": "e2b358448c1a1a74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8582a0ab81bfe9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TemplateBrowserPage.tsx:220"}, "properties": {"repobilityId": "40f5881f5873fa1f", "scanner": "scanner-primary", "fingerprint": "d8582a0ab81bfe9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4af568dd3734f1b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/hooks/usePDFIngestion.tsx:347"}, "properties": {"repobilityId": "bfcfc0699d25800c", "scanner": "scanner-primary", "fingerprint": "4af568dd3734f1b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da81029594d24d2e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/hooks/useAuth.ts:89"}, "properties": {"repobilityId": "d4db4c31444c32b9", "scanner": "scanner-primary", "fingerprint": "da81029594d24d2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d894feff24a9b50d", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/services/usage-event-service.ts:428"}, "properties": {"repobilityId": "b65f54f477e3c29a", "scanner": "scanner-primary", "fingerprint": "d894feff24a9b50d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-3ccff0d16796da68", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/store/useDocumentLinkStore.ts:654"}, "properties": {"repobilityId": "773d61f956dd744c", "scanner": "scanner-primary", "fingerprint": "3ccff0d16796da68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5319cd936297ac8b", "level": "error", "message": {"text": "Possible secret in frontend/src/config/auth-config.ts"}, "properties": {"repobilityId": "f3baee6f5dc82a2c", "scanner": "scanner-primary", "fingerprint": "5319cd936297ac8b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/config/auth-config.ts"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-5319cd936297ac8b", "level": "error", "message": {"text": "Possible secret in frontend/src/config/auth-config.ts"}, "properties": {"repobilityId": "f3baee6f5dc82a2c", "scanner": "scanner-primary", "fingerprint": "5319cd936297ac8b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/config/auth-config.ts"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-5319cd936297ac8b", "level": "error", "message": {"text": "Possible secret in frontend/src/config/auth-config.ts"}, "properties": {"repobilityId": "f3baee6f5dc82a2c", "scanner": "scanner-primary", "fingerprint": "5319cd936297ac8b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/config/auth-config.ts"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-5319cd936297ac8b", "level": "error", "message": {"text": "Possible secret in frontend/src/config/auth-config.ts"}, "properties": {"repobilityId": "f3baee6f5dc82a2c", "scanner": "scanner-primary", "fingerprint": "5319cd936297ac8b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/config/auth-config.ts"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-5319cd936297ac8b", "level": "error", "message": {"text": "Possible secret in frontend/src/config/auth-config.ts"}, "properties": {"repobilityId": "f3baee6f5dc82a2c", "scanner": "scanner-primary", "fingerprint": "5319cd936297ac8b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/config/auth-config.ts"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-0b807feec6d95b10", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx:618"}, "properties": {"repobilityId": "9d5ca93fc73b6934", "scanner": "scanner-primary", "fingerprint": "0b807feec6d95b10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/safety/SafetyNarrativeStreamingPanel.tsx"}, "region": {"startLine": 618}}}]}, {"ruleId": "scanner-d1326ae61cc948e2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/safety/XMLPreviewPanel.tsx:305"}, "properties": {"repobilityId": "7d20ba8da7ee3414", "scanner": "scanner-primary", "fingerprint": "d1326ae61cc948e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/safety/XMLPreviewPanel.tsx"}, "region": {"startLine": 305}}}]}, {"ruleId": "scanner-bf4ac2c633ef193c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AuthoringStreamingPanel.tsx:410"}, "properties": {"repobilityId": "2573d96bd01729b8", "scanner": "scanner-primary", "fingerprint": "bf4ac2c633ef193c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/authoring/AuthoringStreamingPanel.tsx"}, "region": {"startLine": 410}}}]}, {"ruleId": "scanner-56ee47cc743a2d02", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/BatchGenerationPanel.tsx:481"}, "properties": {"repobilityId": "c6b893c06d613ab6", "scanner": "scanner-primary", "fingerprint": "56ee47cc743a2d02", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/authoring/BatchGenerationPanel.tsx"}, "region": {"startLine": 481}}}]}, {"ruleId": "scanner-59792fffd1c8298a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/DocumentEditor.tsx:663"}, "properties": {"repobilityId": "a891a7113dafedf0", "scanner": "scanner-primary", "fingerprint": "59792fffd1c8298a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/authoring/DocumentEditor.tsx"}, "region": {"startLine": 663}}}]}, {"ruleId": "scanner-64f5d731abdd7b0f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/authoring/AISectionEditor.tsx:501"}, "properties": {"repobilityId": "bd4c60e608c9057e", "scanner": "scanner-primary", "fingerprint": "64f5d731abdd7b0f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/authoring/AISectionEditor.tsx"}, "region": {"startLine": 501}}}]}, {"ruleId": "scanner-dee2100b62ac2e15", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/haq/HAQStreamingPanel.tsx:533"}, "properties": {"repobilityId": "9bf2bd816d38eeaa", "scanner": "scanner-primary", "fingerprint": "dee2100b62ac2e15", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/haq/HAQStreamingPanel.tsx"}, "region": {"startLine": 533}}}]}, {"ruleId": "scanner-5eba29ff9bb8eb42", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:926"}, "properties": {"repobilityId": "0df2248f956c8a77", "scanner": "scanner-primary", "fingerprint": "5eba29ff9bb8eb42", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ai/AIDocumentGeneratorPanel.tsx"}, "region": {"startLine": 926}}}]}, {"ruleId": "scanner-616bc5c02e7d9275", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ai/AIGenerationPanel.tsx:327"}, "properties": {"repobilityId": "126c650dec723cf6", "scanner": "scanner-primary", "fingerprint": "616bc5c02e7d9275", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ai/AIGenerationPanel.tsx"}, "region": {"startLine": 327}}}]}, {"ruleId": "scanner-1a78ab91bb77329e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/HAQResponseEditorV2.tsx:308"}, "properties": {"repobilityId": "2a3fef68acc08dc4", "scanner": "scanner-primary", "fingerprint": "1a78ab91bb77329e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ui/HAQResponseEditorV2.tsx"}, "region": {"startLine": 308}}}]}, {"ruleId": "scanner-887c538fa38ea6ba", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/screens/AIDocumentGenerationScreen.tsx:870"}, "properties": {"repobilityId": "e957130c76ee9215", "scanner": "scanner-primary", "fingerprint": "887c538fa38ea6ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/screens/AIDocumentGenerationScreen.tsx"}, "region": {"startLine": 870}}}]}, {"ruleId": "scanner-1116d992759924e6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/PagedDocumentRenderer.tsx:426"}, "properties": {"repobilityId": "322d6121d0a9375e", "scanner": "scanner-primary", "fingerprint": "1116d992759924e6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/viewer/PagedDocumentRenderer.tsx"}, "region": {"startLine": 426}}}]}, {"ruleId": "scanner-5cb0679901662412", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentViewer.tsx:542"}, "properties": {"repobilityId": "4ab75e259c589b73", "scanner": "scanner-primary", "fingerprint": "5cb0679901662412", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/viewer/DocumentViewer.tsx"}, "region": {"startLine": 542}}}]}, {"ruleId": "scanner-5d7a4743a39d8655", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/viewer/DocumentCompareViewer.tsx:409"}, "properties": {"repobilityId": "e178b3d0b2a8e8ae", "scanner": "scanner-primary", "fingerprint": "5d7a4743a39d8655", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/viewer/DocumentCompareViewer.tsx"}, "region": {"startLine": 409}}}]}, {"ruleId": "scanner-9db0802009991212", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/ECTDValidationWorkflow.tsx:375"}, "properties": {"repobilityId": "00ef45197b56aacb", "scanner": "scanner-primary", "fingerprint": "9db0802009991212", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/publishing/ECTDValidationWorkflow.tsx"}, "region": {"startLine": 375}}}]}, {"ruleId": "scanner-46d5b741d8211c1f", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/publishing/SubmissionPackageBuilder.tsx:614"}, "properties": {"repobilityId": "ea89123d2337d0e1", "scanner": "scanner-primary", "fingerprint": "46d5b741d8211c1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/publishing/SubmissionPackageBuilder.tsx"}, "region": {"startLine": 614}}}]}, {"ruleId": "scanner-bd3bdfa6b9ebb2b3", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in frontend/src/components/submissions/SubmissionHistoryDashboard.tsx:793"}, "properties": {"repobilityId": "cc1604e3b65bf562", "scanner": "scanner-primary", "fingerprint": "bd3bdfa6b9ebb2b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/submissions/SubmissionHistoryDashboard.tsx"}, "region": {"startLine": 793}}}]}, {"ruleId": "scanner-a09a7c90436e6551", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/ReviewCommentsThread.tsx:421"}, "properties": {"repobilityId": "3defc837577d728d", "scanner": "scanner-primary", "fingerprint": "a09a7c90436e6551", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/documents/ReviewCommentsThread.tsx"}, "region": {"startLine": 421}}}]}, {"ruleId": "scanner-b92bd707dab5aefa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/documents/PDFDocumentPreview.tsx:232"}, "properties": {"repobilityId": "46a7145806119fe9", "scanner": "scanner-primary", "fingerprint": "b92bd707dab5aefa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/documents/PDFDocumentPreview.tsx"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-e14ecf36314859a1", "level": "note", "message": {"text": "Insecure pattern 'document_write' in frontend/src/services/validation-report-service.ts:489"}, "properties": {"repobilityId": "5de570539ff6524a", "scanner": "scanner-primary", "fingerprint": "e14ecf36314859a1", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/services/validation-report-service.ts"}, "region": {"startLine": 489}}}]}, {"ruleId": "scanner-bc57080172a988d0", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in frontend/src/services/haq-response-finalization-service.ts:264"}, "properties": {"repobilityId": "3fc5167731dae381", "scanner": "scanner-primary", "fingerprint": "bc57080172a988d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/services/haq-response-finalization-service.ts"}, "region": {"startLine": 264}}}]}, {"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-7bd327cab115bdce", "level": "note", "message": {"text": "Very large file: frontend/src/components/authoring/DocumentEditor.tsx (979 lines)"}, "properties": {"repobilityId": "1aa3d4adc76bba4f", "scanner": "scanner-primary", "fingerprint": "7bd327cab115bdce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fd2b5e654c65379a", "level": "note", "message": {"text": "Very large file: frontend/src/components/authoring/NewDocumentWizard.tsx (1202 lines)"}, "properties": {"repobilityId": "219ad9f68eb76bd6", "scanner": "scanner-primary", "fingerprint": "fd2b5e654c65379a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6cb62c5b548ab63b", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/CTMSScreen.tsx (2395 lines)"}, "properties": {"repobilityId": "074b87f99251f883", "scanner": "scanner-primary", "fingerprint": "6cb62c5b548ab63b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0dd6a8400a886e35", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ECTDWorkspaceScreen.tsx (2227 lines)"}, "properties": {"repobilityId": "05a39b0817d52c55", "scanner": "scanner-primary", "fingerprint": "0dd6a8400a886e35", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f6884bbe42c5a968", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/QMSScreen.tsx (2396 lines)"}, "properties": {"repobilityId": "8782c258a530e1d8", "scanner": "scanner-primary", "fingerprint": "f6884bbe42c5a968", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9ff8b41550c87ab6", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/PlatformAnalyticsDashboard.tsx (969 lines)"}, "properties": {"repobilityId": "4b342cbf09beb508", "scanner": "scanner-primary", "fingerprint": "9ff8b41550c87ab6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ee9fbaed90aa0625", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ResearchScreen.tsx (4246 lines)"}, "properties": {"repobilityId": "45fd11bdf7a5f11f", "scanner": "scanner-primary", "fingerprint": "ee9fbaed90aa0625", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-90108aaa242c750c", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ActionCenterScreen.tsx (1284 lines)"}, "properties": {"repobilityId": "b0a950579a30458f", "scanner": "scanner-primary", "fingerprint": "90108aaa242c750c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2a7d9ffe561e5015", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/SupplyChainScreen.tsx (2618 lines)"}, "properties": {"repobilityId": "e952ebebaf2651b7", "scanner": "scanner-primary", "fingerprint": "2a7d9ffe561e5015", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fd4626541c5c941e", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/LabelingScreen.tsx (1830 lines)"}, "properties": {"repobilityId": "f8feffd8ceb37b0d", "scanner": "scanner-primary", "fingerprint": "fd4626541c5c941e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-166427e34934dda6", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RegulatoryIntelligenceScreen.tsx (1107 lines)"}, "properties": {"repobilityId": "095355acc5915f9f", "scanner": "scanner-primary", "fingerprint": "166427e34934dda6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-76ba909080225cb8", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/SubmissionsScreen.tsx (2026 lines)"}, "properties": {"repobilityId": "c4fa79ff40fc4718", "scanner": "scanner-primary", "fingerprint": "76ba909080225cb8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54f2ac80d6fe79e1", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/CommercialScreen.tsx (1200 lines)"}, "properties": {"repobilityId": "0bf1637ba3c9e6b5", "scanner": "scanner-primary", "fingerprint": "54f2ac80d6fe79e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4440d11099097682", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RiskCAPAIntegrationDashboard.tsx (1173 lines)"}, "properties": {"repobilityId": "5e343a39453d5fab", "scanner": "scanner-primary", "fingerprint": "4440d11099097682", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b368f9d16b38f0f3", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ELNScreen.tsx (2037 lines)"}, "properties": {"repobilityId": "16da15dc3c664425", "scanner": "scanner-primary", "fingerprint": "b368f9d16b38f0f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9b223cd16ae35782", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RegulatoryCalendarScreen.tsx (1336 lines)"}, "properties": {"repobilityId": "2ac1c9ae40fda81b", "scanner": "scanner-primary", "fingerprint": "9b223cd16ae35782", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b06085283988617c", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/SubmissionsHubScreen.tsx (939 lines)"}, "properties": {"repobilityId": "b5cac01a0628a8c8", "scanner": "scanner-primary", "fingerprint": "b06085283988617c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-41db714fedc46fca", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx (1370 lines)"}, "properties": {"repobilityId": "e424576966bf8cad", "scanner": "scanner-primary", "fingerprint": "41db714fedc46fca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c9da376c907d360a", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/GLPScreen.tsx (4100 lines)"}, "properties": {"repobilityId": "e617f89c29ac6af6", "scanner": "scanner-primary", "fingerprint": "c9da376c907d360a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c54818e16a13f8ea", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/PortfolioScreen.tsx (1432 lines)"}, "properties": {"repobilityId": "eef71888d7ac5608", "scanner": "scanner-primary", "fingerprint": "c54818e16a13f8ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-77237042b8abcd48", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/StudyIntelScreen.tsx (981 lines)"}, "properties": {"repobilityId": "9231a9df508070a6", "scanner": "scanner-primary", "fingerprint": "77237042b8abcd48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-be43cff979092f8b", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/DevelopmentScreen.tsx (2177 lines)"}, "properties": {"repobilityId": "25b296fa862a45c2", "scanner": "scanner-primary", "fingerprint": "be43cff979092f8b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a15570544b906af8", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/MultiRegionSubmissionTracker.tsx (1442 lines)"}, "properties": {"repobilityId": "ac65c469e935daf0", "scanner": "scanner-primary", "fingerprint": "a15570544b906af8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3b9e859b403503bc", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AdPromoScreen.tsx (891 lines)"}, "properties": {"repobilityId": "77ff4b312e8cda83", "scanner": "scanner-primary", "fingerprint": "3b9e859b403503bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cb069e496b93ba4a", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RDArchivesScreen.tsx (2616 lines)"}, "properties": {"repobilityId": "5a8b2aac93ac2069", "scanner": "scanner-primary", "fingerprint": "cb069e496b93ba4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2778a6ca651df242", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/QMSCreateModals.tsx (1535 lines)"}, "properties": {"repobilityId": "509e8917d8fe3f0b", "scanner": "scanner-primary", "fingerprint": "2778a6ca651df242", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f055928125c9b931", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/BiostatsScreen.tsx (2692 lines)"}, "properties": {"repobilityId": "278bbc96a8ea43cd", "scanner": "scanner-primary", "fingerprint": "f055928125c9b931", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0c3d1ecb192b6f68", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/MedicalAffairsScreen.tsx (3746 lines)"}, "properties": {"repobilityId": "04fc4b9c3f40f74b", "scanner": "scanner-primary", "fingerprint": "0c3d1ecb192b6f68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34bb367a7b68f23d", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/CMCScreen.tsx (2293 lines)"}, "properties": {"repobilityId": "347beb083a1c44d8", "scanner": "scanner-primary", "fingerprint": "34bb367a7b68f23d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5f322f12b1432904", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AIDocumentGenerationScreen.tsx (1309 lines)"}, "properties": {"repobilityId": "178e195fbf50f804", "scanner": "scanner-primary", "fingerprint": "5f322f12b1432904", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-52b83e6ceccb758b", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/TMFScreen.tsx (1654 lines)"}, "properties": {"repobilityId": "4f82b13b4163ee63", "scanner": "scanner-primary", "fingerprint": "52b83e6ceccb758b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5fc5a0000be95b1a", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/DocumentControlScreen.tsx (1293 lines)"}, "properties": {"repobilityId": "3bbdce6e244c029a", "scanner": "scanner-primary", "fingerprint": "5fc5a0000be95b1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2633f6aa16ced5e8", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AdminScreen.tsx (1721 lines)"}, "properties": {"repobilityId": "f93fa3ad5a7cb4cf", "scanner": "scanner-primary", "fingerprint": "2633f6aa16ced5e8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cdbca00c975d4dff", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/CTMSDeviationMonitoring.tsx (975 lines)"}, "properties": {"repobilityId": "f98febacd2e76e87", "scanner": "scanner-primary", "fingerprint": "cdbca00c975d4dff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ecaddeaed8390f15", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/SafetyScreen.tsx (3577 lines)"}, "properties": {"repobilityId": "410c8c51a4042440", "scanner": "scanner-primary", "fingerprint": "ecaddeaed8390f15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-108d9e1584c0ca90", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/StudyStartupOrchestratorScreen.tsx (1372 lines)"}, "properties": {"repobilityId": "dadaad9d6e9596b4", "scanner": "scanner-primary", "fingerprint": "108d9e1584c0ca90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e09773b9087e4828", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/SignalDetectionScreen.tsx (1155 lines)"}, "properties": {"repobilityId": "262bdb07298273c1", "scanner": "scanner-primary", "fingerprint": "e09773b9087e4828", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-596e6545712d9e7e", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ApprovalWorkflowVisualization.tsx (1287 lines)"}, "properties": {"repobilityId": "4966a35c6e4cea31", "scanner": "scanner-primary", "fingerprint": "596e6545712d9e7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-396f14ff20d45102", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/WorkflowOrchestrationDashboard.tsx (1639 lines)"}, "properties": {"repobilityId": "192c283f06b53523", "scanner": "scanner-primary", "fingerprint": "396f14ff20d45102", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-174ad477313629e2", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/GCPScreen.tsx (1143 lines)"}, "properties": {"repobilityId": "3ec938514983019a", "scanner": "scanner-primary", "fingerprint": "174ad477313629e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-42f7c15daf2a36f1", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AuthoringScreen.tsx (2895 lines)"}, "properties": {"repobilityId": "ffefa4bae4179e68", "scanner": "scanner-primary", "fingerprint": "42f7c15daf2a36f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e56e6eade1843915", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ClinicalDevelopmentScreen.tsx (1732 lines)"}, "properties": {"repobilityId": "ce0a5d160275c2c5", "scanner": "scanner-primary", "fingerprint": "e56e6eade1843915", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-93f5c9b835ae9f7c", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/CreateModals.tsx (1753 lines)"}, "properties": {"repobilityId": "591e90d54ed3020c", "scanner": "scanner-primary", "fingerprint": "93f5c9b835ae9f7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dd3f5b637ec62e3a", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/PSMFScreen.tsx (1225 lines)"}, "properties": {"repobilityId": "7c5695add0bf7b86", "scanner": "scanner-primary", "fingerprint": "dd3f5b637ec62e3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a1f017ab94e8e490", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/ECTDIntelligenceScreen.tsx (1396 lines)"}, "properties": {"repobilityId": "968943487064e358", "scanner": "scanner-primary", "fingerprint": "a1f017ab94e8e490", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-33d2003c88011c83", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AgentHubScreen.tsx (2602 lines)"}, "properties": {"repobilityId": "17df9dc9143e2066", "scanner": "scanner-primary", "fingerprint": "33d2003c88011c83", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da059307c8b0ff9d", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/HAQScreen.tsx (3123 lines)"}, "properties": {"repobilityId": "5f4ee86b3a99d011", "scanner": "scanner-primary", "fingerprint": "da059307c8b0ff9d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0eaeb7d703bb9164", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RiskAssessmentDashboard.tsx (1026 lines)"}, "properties": {"repobilityId": "4600b3b2c45e41ab", "scanner": "scanner-primary", "fingerprint": "0eaeb7d703bb9164", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c707e9fbac58a7f", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/RDConnectedScreen.tsx (1145 lines)"}, "properties": {"repobilityId": "778d041b56d44310", "scanner": "scanner-primary", "fingerprint": "7c707e9fbac58a7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c4ff0219e81ba15", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/AuditTrailDashboard.tsx (2109 lines)"}, "properties": {"repobilityId": "b864c05308491c17", "scanner": "scanner-primary", "fingerprint": "1c4ff0219e81ba15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb6ab9b780337b18", "level": "note", "message": {"text": "Very large file: frontend/src/components/screens/StudyDesignScreen.tsx (3116 lines)"}, "properties": {"repobilityId": "344be982fc052de3", "scanner": "scanner-primary", "fingerprint": "eb6ab9b780337b18", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b82b342b6bfc9a5", "level": "note", "message": {"text": "Very large file: frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx (1155 lines)"}, "properties": {"repobilityId": "e2f9d8449791225a", "scanner": "scanner-primary", "fingerprint": "5b82b342b6bfc9a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b80a34d2986e5c2", "level": "note", "message": {"text": "Very large file: frontend/src/components/ectd/PublishingWizard.tsx (1686 lines)"}, "properties": {"repobilityId": "93350d8f1e82484d", "scanner": "scanner-primary", "fingerprint": "5b80a34d2986e5c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e02b7dfdc0f8bf32", "level": "note", "message": {"text": "Very large file: frontend/src/components/documents/ApprovalQueueDashboard.tsx (1579 lines)"}, "properties": {"repobilityId": "11b569acd0a13b44", "scanner": "scanner-primary", "fingerprint": "e02b7dfdc0f8bf32", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a7b14f8c6fa10873", "level": "note", "message": {"text": "Very large file: frontend/src/components/documents/DocumentViewer.tsx (1126 lines)"}, "properties": {"repobilityId": "efe9e8dc489fa3d1", "scanner": "scanner-primary", "fingerprint": "a7b14f8c6fa10873", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85a28917c89ee378", "level": "note", "message": {"text": "Very large file: frontend/src/lib/openapi.ts (2435 lines)"}, "properties": {"repobilityId": "5b9d907e11d67f63", "scanner": "scanner-primary", "fingerprint": "85a28917c89ee378", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-10dc28645a427541", "level": "note", "message": {"text": "Very large file: frontend/src/lib/openapi-extensions.ts (822 lines)"}, "properties": {"repobilityId": "034de86273a2a2f5", "scanner": "scanner-primary", "fingerprint": "10dc28645a427541", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-982e2fb0d7de16df", "level": "note", "message": {"text": "Very large file: frontend/src/services/clinical/data-entry-service.ts (1724 lines)"}, "properties": {"repobilityId": "c0ccb7749a595cf3", "scanner": "scanner-primary", "fingerprint": "982e2fb0d7de16df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cbd86a39f9605409", "level": "note", "message": {"text": "Very large file: frontend/src/services/clinical/form-builder-service.ts (1754 lines)"}, "properties": {"repobilityId": "f20d522d5440307e", "scanner": "scanner-primary", "fingerprint": "cbd86a39f9605409", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34646b9e6dcbff3d", "level": "note", "message": {"text": "Very large file: frontend/src/services/clinical/edit-check-compiler.ts (1777 lines)"}, "properties": {"repobilityId": "828ddf2a3e9092c6", "scanner": "scanner-primary", "fingerprint": "34646b9e6dcbff3d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-db502d2bdb3b82b7", "level": "note", "message": {"text": "Very large file: frontend/src/store/useGuidedScenarioStore.ts (1454 lines)"}, "properties": {"repobilityId": "3159f1df8d0d054b", "scanner": "scanner-primary", "fingerprint": "db502d2bdb3b82b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c49d2cca5956bca", "level": "note", "message": {"text": "Very large file: frontend/src/store/useDocumentControlStore.ts (868 lines)"}, "properties": {"repobilityId": "6083d5e5da0e038e", "scanner": "scanner-primary", "fingerprint": "1c49d2cca5956bca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54bf04636a6eaf66", "level": "note", "message": {"text": "Very large file: frontend/src/store/useCampaignEnhancements.ts (1179 lines)"}, "properties": {"repobilityId": "b7ff10035e11ad3f", "scanner": "scanner-primary", "fingerprint": "54bf04636a6eaf66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0afa83fe076a7048", "level": "note", "message": {"text": "Very large file: frontend/src/store/useReviewerSimulation.ts (2009 lines)"}, "properties": {"repobilityId": "8008d40e84303964", "scanner": "scanner-primary", "fingerprint": "0afa83fe076a7048", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3a4015847edbc657", "level": "note", "message": {"text": "Very large file: frontend/src/store/useArchivesStore.ts (1609 lines)"}, "properties": {"repobilityId": "a09f457104550ed0", "scanner": "scanner-primary", "fingerprint": "3a4015847edbc657", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d0ef78168050d8f4", "level": "note", "message": {"text": "Very large file: frontend/src/store/useELNStore.ts (1241 lines)"}, "properties": {"repobilityId": "afdbf4f4fe40ea22", "scanner": "scanner-primary", "fingerprint": "d0ef78168050d8f4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d5208c0251cfd46d", "level": "note", "message": {"text": "Very large file: frontend/src/store/useClinicalRegBridge.ts (1364 lines)"}, "properties": {"repobilityId": "f4e9317d3e265580", "scanner": "scanner-primary", "fingerprint": "d5208c0251cfd46d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9409833a54c66205", "level": "note", "message": {"text": "Very large file: frontend/src/store/useCTMSStore.ts (3273 lines)"}, "properties": {"repobilityId": "45275695fe2c7352", "scanner": "scanner-primary", "fingerprint": "9409833a54c66205", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-76570a4f9bbaa4b3", "level": "note", "message": {"text": "Very large file: frontend/src/store/useHAQResponseStore.ts (988 lines)"}, "properties": {"repobilityId": "901a6ccfce396ee7", "scanner": "scanner-primary", "fingerprint": "76570a4f9bbaa4b3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-735bf603ad8e7521", "level": "note", "message": {"text": "Very large file: frontend/src/store/useResponseTemplates.ts (1740 lines)"}, "properties": {"repobilityId": "7022ec2cc4f024c2", "scanner": "scanner-primary", "fingerprint": "735bf603ad8e7521", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c2c4b6eba6a78337", "level": "note", "message": {"text": "Very large file: frontend/src/store/useIDMPStore.ts (1729 lines)"}, "properties": {"repobilityId": "4ccdb5d620f19d24", "scanner": "scanner-primary", "fingerprint": "c2c4b6eba6a78337", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a5ec7d4b880cabb1", "level": "note", "message": {"text": "Very large file: frontend/src/store/useStudyIntelStore.ts (1049 lines)"}, "properties": {"repobilityId": "be819ba06c254b64", "scanner": "scanner-primary", "fingerprint": "a5ec7d4b880cabb1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f890790d50f3c10c", "level": "note", "message": {"text": "Very large file: frontend/src/domains/qms/contracts.ts (2079 lines)"}, "properties": {"repobilityId": "e047c94d2129c396", "scanner": "scanner-primary", "fingerprint": "f890790d50f3c10c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f78910d347a76320", "level": "note", "message": {"text": "Very large file: frontend/src/domains/usdm/contracts.ts (1843 lines)"}, "properties": {"repobilityId": "5b06f0ec895d1c16", "scanner": "scanner-primary", "fingerprint": "f78910d347a76320", "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": "b212e17edb32485a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e1ac70e7b2a42811", "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": "4a110156a4b8bf36", "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": "b2a643d32b797a39", "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": "f60faa36c4440983", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "56390bc587caaae7", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "3e3513c8d537741b", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "d4abb20bc7674c16", "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": "cf88d3000f101fef", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-575662366358932f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/public/pwa-sw.js:10"}, "properties": {"repobilityId": "2abec122dd473b33", "scanner": "scanner-primary", "fingerprint": "575662366358932f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e36bee5e7e85353b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/types/pdf-extraction.ts:2"}, "properties": {"repobilityId": "6f7ffae344cbe223", "scanner": "scanner-primary", "fingerprint": "e36bee5e7e85353b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-865eeab12455a405", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/types/structured-content.ts:2"}, "properties": {"repobilityId": "be2b917c5d3c4bef", "scanner": "scanner-primary", "fingerprint": "865eeab12455a405", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf051289ad90fab8", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/types/lix.ts:1"}, "properties": {"repobilityId": "0391fc1a41444c58", "scanner": "scanner-primary", "fingerprint": "bf051289ad90fab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a13e0ffbc696222", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/types/sop.ts:2"}, "properties": {"repobilityId": "c7ae277696827b74", "scanner": "scanner-primary", "fingerprint": "1a13e0ffbc696222", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52ae4ae2f43a5a4f", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/types/collaboration-persistence.ts:2"}, "properties": {"repobilityId": "59ae68e1ed176ed7", "scanner": "scanner-primary", "fingerprint": "52ae4ae2f43a5a4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14aed666af61cd0c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/types/rag.ts:2"}, "properties": {"repobilityId": "8ea2c930095283cc", "scanner": "scanner-primary", "fingerprint": "14aed666af61cd0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d329487d25acfc4", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/types/operation-compaction.ts:2"}, "properties": {"repobilityId": "904c1a5f99ee030b", "scanner": "scanner-primary", "fingerprint": "2d329487d25acfc4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-996b1298b149af1c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/types/track-changes.ts:2"}, "properties": {"repobilityId": "697df246f8daa1b1", "scanner": "scanner-primary", "fingerprint": "996b1298b149af1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-685e0662b110d1a5", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/types/validation-protocol.ts:2"}, "properties": {"repobilityId": "f381c9ae91f1d06f", "scanner": "scanner-primary", "fingerprint": "685e0662b110d1a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f0561c6fdaa739f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/types/approval.ts:2"}, "properties": {"repobilityId": "4959247352229478", "scanner": "scanner-primary", "fingerprint": "8f0561c6fdaa739f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9b8c77d91322492", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/types/submission-lifecycle.ts:2"}, "properties": {"repobilityId": "f99d7478dfb039a2", "scanner": "scanner-primary", "fingerprint": "e9b8c77d91322492", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb3d8f4de7e8a76e", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/types/agents.ts:1"}, "properties": {"repobilityId": "68f4d33b2d6d201f", "scanner": "scanner-primary", "fingerprint": "cb3d8f4de7e8a76e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6826157bc29a4397", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/types/session-recovery.ts:2"}, "properties": {"repobilityId": "4ab89acfe6c33324", "scanner": "scanner-primary", "fingerprint": "6826157bc29a4397", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4717ed83b6d9525a", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/types/session-analytics.ts:2"}, "properties": {"repobilityId": "13f24a256140a0ca", "scanner": "scanner-primary", "fingerprint": "4717ed83b6d9525a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-096f5533c79eae92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/submissions-store.ts:234"}, "properties": {"repobilityId": "c156ce3ab3f400dc", "scanner": "scanner-primary", "fingerprint": "096f5533c79eae92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6fedf1aa1835b2af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/stores/products-store.ts:89"}, "properties": {"repobilityId": "65aa5f067b09e3e0", "scanner": "scanner-primary", "fingerprint": "6fedf1aa1835b2af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab499193f300f55c", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/config/version.ts:1"}, "properties": {"repobilityId": "2971439ec20e1ee4", "scanner": "scanner-primary", "fingerprint": "ab499193f300f55c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-291bdccc9eaee630", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/config/api-keys.ts:2"}, "properties": {"repobilityId": "c2616be4dc128708", "scanner": "scanner-primary", "fingerprint": "291bdccc9eaee630", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-336b747684b94c51", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/config/module-registry.ts:2"}, "properties": {"repobilityId": "2f3fdbdd65bfe0ba", "scanner": "scanner-primary", "fingerprint": "336b747684b94c51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5d7cb2571fe086d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/layout/TierSwitcher.tsx:1"}, "properties": {"repobilityId": "4e2fe446a401f83b", "scanner": "scanner-primary", "fingerprint": "f5d7cb2571fe086d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91ed830324212510", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/layout/Header.tsx:116"}, "properties": {"repobilityId": "5fee1a8ff0aa2d27", "scanner": "scanner-primary", "fingerprint": "91ed830324212510", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6adea415a1b9253a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/clinical/TimelineSlider.tsx:7"}, "properties": {"repobilityId": "a92c5d1aa78eb6cd", "scanner": "scanner-primary", "fingerprint": "6adea415a1b9253a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3332de6277e0f0ea", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/strategy/StrategyImpactPanel.tsx:1"}, "properties": {"repobilityId": "6931978d831be3cb", "scanner": "scanner-primary", "fingerprint": "3332de6277e0f0ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13273fdb81c96a6c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoErrorRecovery.tsx:2"}, "properties": {"repobilityId": "2b710abb847fbbf8", "scanner": "scanner-primary", "fingerprint": "13273fdb81c96a6c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c99be684d22a1265", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/PresenterDashboard.tsx:33"}, "properties": {"repobilityId": "b09ef1643442e5c0", "scanner": "scanner-primary", "fingerprint": "c99be684d22a1265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-882f48019d7d9f30", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/demo/PathSpecificTooltips.tsx:2"}, "properties": {"repobilityId": "6674c2709810b9e2", "scanner": "scanner-primary", "fingerprint": "882f48019d7d9f30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b940d9026adc8d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoLauncherPage.tsx:26"}, "properties": {"repobilityId": "6768e3155be1583a", "scanner": "scanner-primary", "fingerprint": "0b940d9026adc8d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21a14db27572213e", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/demo/DemoStreamingOverlay.tsx:1"}, "properties": {"repobilityId": "d31452cf96ab087e", "scanner": "scanner-primary", "fingerprint": "21a14db27572213e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20b3f6f040c672f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/DemoFallbackData.ts:1"}, "properties": {"repobilityId": "7cd36286e0026a02", "scanner": "scanner-primary", "fingerprint": "20b3f6f040c672f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aba1a9a74a6c675", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/demo/GuidedScenarioOverlay.tsx:28"}, "properties": {"repobilityId": "2c87562ae105cd33", "scanner": "scanner-primary", "fingerprint": "7aba1a9a74a6c675", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5287965665e18432", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/demo/AhaMomentOverlay.tsx:2"}, "properties": {"repobilityId": "4975279e35c313fd", "scanner": "scanner-primary", "fingerprint": "5287965665e18432", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99c35073811eba50", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/authoring/DocumentEditor.tsx:165"}, "properties": {"repobilityId": "c84d75b0f4dc3593", "scanner": "scanner-primary", "fingerprint": "99c35073811eba50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2454d1d364ecccc2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/authoring/DocumentEditor.tsx:823"}, "properties": {"repobilityId": "c6d5ba01eaa063ae", "scanner": "scanner-primary", "fingerprint": "2454d1d364ecccc2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d4c749dbfa9f154", "level": "note", "message": {"text": "Legacy-named symbol `NotificationBellLegacy` in frontend/src/components/notifications/NotificationSystem.tsx:463"}, "properties": {"repobilityId": "8acf12cc7bf4d629", "scanner": "scanner-primary", "fingerprint": "3d4c749dbfa9f154", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7ba82683c6a351c8", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/haq/HAQContextPanel.tsx:3"}, "properties": {"repobilityId": "d851d3e02e1fe4fa", "scanner": "scanner-primary", "fingerprint": "7ba82683c6a351c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57661b3b068a1e45", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/haq/HAQEvidenceGatherer.tsx:3"}, "properties": {"repobilityId": "837d569a09c12689", "scanner": "scanner-primary", "fingerprint": "57661b3b068a1e45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-789eae65a87f5944", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/Tabs.tsx:1"}, "properties": {"repobilityId": "f00b33a152f23343", "scanner": "scanner-primary", "fingerprint": "789eae65a87f5944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29f713011dfbb156", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/ui/ReturnBreadcrumb.tsx:3"}, "properties": {"repobilityId": "58a4772bff8990e5", "scanner": "scanner-primary", "fingerprint": "29f713011dfbb156", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-310b0d8b084ef712", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/WorkspaceLayout.tsx:1"}, "properties": {"repobilityId": "8bbc3b423aabab03", "scanner": "scanner-primary", "fingerprint": "310b0d8b084ef712", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44d9e6b711900848", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ScrollableTabs.tsx:1"}, "properties": {"repobilityId": "41bc92f5f0844212", "scanner": "scanner-primary", "fingerprint": "44d9e6b711900848", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b0e82ab7973f11b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ui/FileUpload.tsx:315"}, "properties": {"repobilityId": "cbfb07b7c5a7e4b1", "scanner": "scanner-primary", "fingerprint": "0b0e82ab7973f11b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-775604f2c8a9ba22", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/ModuleContainer.tsx:5"}, "properties": {"repobilityId": "fcdb7a45ada0f8b8", "scanner": "scanner-primary", "fingerprint": "775604f2c8a9ba22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8146dfa158aeb2b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/ui/CollapsibleSidebar.tsx:1"}, "properties": {"repobilityId": "9bec4ad199eb73ce", "scanner": "scanner-primary", "fingerprint": "a8146dfa158aeb2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10d96b40bcc57625", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ResponsivePrimitives.tsx:1"}, "properties": {"repobilityId": "f8789c8c058d5a5a", "scanner": "scanner-primary", "fingerprint": "10d96b40bcc57625", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fd22de35b38646e", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/components/ui/ScreenHeader.tsx:10"}, "properties": {"repobilityId": "8e15442fd7d270a2", "scanner": "scanner-primary", "fingerprint": "0fd22de35b38646e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a01fe64dbef0c315", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/ui/Toast.tsx:648"}, "properties": {"repobilityId": "2de13d94c8ded89a", "scanner": "scanner-primary", "fingerprint": "a01fe64dbef0c315", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f65be58f173affc", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/QMSScreen.tsx:961"}, "properties": {"repobilityId": "88595001b60aedee", "scanner": "scanner-primary", "fingerprint": "8f65be58f173affc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4db83ceef0224cb1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/QMSScreen.tsx:2246"}, "properties": {"repobilityId": "8473f4760dcce931", "scanner": "scanner-primary", "fingerprint": "4db83ceef0224cb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-115f452cff273386", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/ResearchScreen.tsx:646"}, "properties": {"repobilityId": "ac18fe8f373515b6", "scanner": "scanner-primary", "fingerprint": "115f452cff273386", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41f5320492214c92", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/components/screens/SubmissionCommandCenter.tsx:1"}, "properties": {"repobilityId": "c6823243a5e0cd53", "scanner": "scanner-primary", "fingerprint": "41f5320492214c92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f7532391640f3ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/SubmissionsHubScreen.tsx:4"}, "properties": {"repobilityId": "c26381b665e4c8c9", "scanner": "scanner-primary", "fingerprint": "6f7532391640f3ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2a62a5e283d03f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/screens/GlobalSubmissionPlanScreen.tsx:1"}, "properties": {"repobilityId": "8265c74bb9518dc0", "scanner": "scanner-primary", "fingerprint": "f2a62a5e283d03f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3674c18537907477", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/UnifiedPublishingScreen.tsx:3"}, "properties": {"repobilityId": "9a6efda87402269c", "scanner": "scanner-primary", "fingerprint": "3674c18537907477", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac9c674ad48d9fb5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/GLPScreen.tsx:2"}, "properties": {"repobilityId": "0bfe607c9ebd4c3b", "scanner": "scanner-primary", "fingerprint": "ac9c674ad48d9fb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e756e416c7c76c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/AIConsistencyEngineDashboard.tsx:41"}, "properties": {"repobilityId": "275b16df70eb5ad0", "scanner": "scanner-primary", "fingerprint": "8e756e416c7c76c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8e06de5cfb90317", "level": "none", "message": {"text": "Commented-code block (12 lines) in frontend/src/components/screens/BiostatsScreen.tsx:1"}, "properties": {"repobilityId": "b3ca81b113e41bfb", "scanner": "scanner-primary", "fingerprint": "c8e06de5cfb90317", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c525abb9b3423eef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/SafetyScreen.tsx:3246"}, "properties": {"repobilityId": "6ba5301d2dd73cdd", "scanner": "scanner-primary", "fingerprint": "c525abb9b3423eef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d6817ab0559b824", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/screens/UnifiedCMCManufacturingScreen.tsx:2"}, "properties": {"repobilityId": "4087028646f62ea3", "scanner": "scanner-primary", "fingerprint": "4d6817ab0559b824", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4101b7b7d02319b", "level": "none", "message": {"text": "Commented-code block (12 lines) in frontend/src/components/screens/SPLScreen.tsx:1"}, "properties": {"repobilityId": "9bc484f32e3f43f5", "scanner": "scanner-primary", "fingerprint": "a4101b7b7d02319b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd95859c5b44279c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/ModuleLockedScreen.tsx:1"}, "properties": {"repobilityId": "c3351655ec31589e", "scanner": "scanner-primary", "fingerprint": "cd95859c5b44279c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47a5dd2059bd2ac1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/ContinuousSubmissionDashboard.tsx:1"}, "properties": {"repobilityId": "ea3fc8317ba50238", "scanner": "scanner-primary", "fingerprint": "47a5dd2059bd2ac1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-825c633cd75615eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/CreateModals.tsx:531"}, "properties": {"repobilityId": "7c95e49faf384768", "scanner": "scanner-primary", "fingerprint": "825c633cd75615eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4cfc78c7923789d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/PSMFScreen.tsx:2"}, "properties": {"repobilityId": "2e2f0ee602226471", "scanner": "scanner-primary", "fingerprint": "a4cfc78c7923789d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98aef9184903ee3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/AgentHubScreen.tsx:486"}, "properties": {"repobilityId": "1196c52e6015356e", "scanner": "scanner-primary", "fingerprint": "98aef9184903ee3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd63e4d81d31eab8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/screens/TemplateRegistryScreen.tsx:1"}, "properties": {"repobilityId": "d32796d278f4c882", "scanner": "scanner-primary", "fingerprint": "cd63e4d81d31eab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75eec54412179d87", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/screens/RDConnectedScreen.tsx:590"}, "properties": {"repobilityId": "ed6904bc7a7871d0", "scanner": "scanner-primary", "fingerprint": "75eec54412179d87", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6eaef535df29a44f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/screens/StudyDesignScreen.tsx:2"}, "properties": {"repobilityId": "fc544dbe25e92b60", "scanner": "scanner-primary", "fingerprint": "6eaef535df29a44f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-870ec49506dbfd09", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/viewer/ResizableDocumentViewer.tsx:1"}, "properties": {"repobilityId": "921c464c16db9b67", "scanner": "scanner-primary", "fingerprint": "870ec49506dbfd09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1c92760e7d05ab3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/viewer/PlatformDocumentViewerOverlay.tsx:14"}, "properties": {"repobilityId": "b393c57ada14a619", "scanner": "scanner-primary", "fingerprint": "b1c92760e7d05ab3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d79a4d392bcda021", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/templates/TemplateBrowser.tsx:1"}, "properties": {"repobilityId": "843e23d536734591", "scanner": "scanner-primary", "fingerprint": "d79a4d392bcda021", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c7a94d4e5e46cfc", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/TransmissionHistoryPanel.tsx:2"}, "properties": {"repobilityId": "ede5fdbb988cddb8", "scanner": "scanner-primary", "fingerprint": "4c7a94d4e5e46cfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-760a950b326f9609", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/publishing/AIAssemblyAssistant.tsx:1"}, "properties": {"repobilityId": "62e7b782ea8e2a96", "scanner": "scanner-primary", "fingerprint": "760a950b326f9609", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be56ed6e9c09fe35", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/EnhancedValidationPanel.tsx:1"}, "properties": {"repobilityId": "110597a55e0331a8", "scanner": "scanner-primary", "fingerprint": "be56ed6e9c09fe35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aaa142e40a3537d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/ValidationResultsPanel.tsx:2"}, "properties": {"repobilityId": "b869e0bd8bc2487c", "scanner": "scanner-primary", "fingerprint": "aaa142e40a3537d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7ec75f1dd73d435", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/PublishingJobMonitor.tsx:2"}, "properties": {"repobilityId": "389f640e638277e3", "scanner": "scanner-primary", "fingerprint": "f7ec75f1dd73d435", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4a9ffb998cc0306", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDViewerPanel.tsx:2"}, "properties": {"repobilityId": "cce71d8789ec13cf", "scanner": "scanner-primary", "fingerprint": "f4a9ffb998cc0306", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9ead1db4cf3b088", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ContentReuseEngine.tsx:1"}, "properties": {"repobilityId": "e728ee45131a03b7", "scanner": "scanner-primary", "fingerprint": "e9ead1db4cf3b088", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd87f79bf5e2222a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/publishing/SequenceBuilderPanel.tsx:2"}, "properties": {"repobilityId": "0b45f6d007cca6a4", "scanner": "scanner-primary", "fingerprint": "cd87f79bf5e2222a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7150e46b557486a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/MultiRegionBuilder.tsx:1"}, "properties": {"repobilityId": "75bc397f5b760647", "scanner": "scanner-primary", "fingerprint": "c7150e46b557486a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b193aa7d0b0478cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132"}, "properties": {"repobilityId": "952c36bffa5d5b55", "scanner": "scanner-primary", "fingerprint": "b193aa7d0b0478cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc98544be92b1b3b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/TemplateLibraryPanel.tsx:1"}, "properties": {"repobilityId": "2129615582910e27", "scanner": "scanner-primary", "fingerprint": "dc98544be92b1b3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54e118f1a33459c4", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/ECTDPublishingDashboard.tsx:2"}, "properties": {"repobilityId": "90dab602cf2a4b7a", "scanner": "scanner-primary", "fingerprint": "54e118f1a33459c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07a16608f4bc5aad", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/publishing/GatewayAuditTrailPanel.tsx:2"}, "properties": {"repobilityId": "be1fa16ab4f864a8", "scanner": "scanner-primary", "fingerprint": "07a16608f4bc5aad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-414b5d00b993776f", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/publishing/PublishingWorkspace.tsx:1"}, "properties": {"repobilityId": "d0923c0df6eaa5ec", "scanner": "scanner-primary", "fingerprint": "414b5d00b993776f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd8d12dbbce96a54", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/publishing/CrossReferenceValidationPanel.tsx:3"}, "properties": {"repobilityId": "1643887af7ba3844", "scanner": "scanner-primary", "fingerprint": "dd8d12dbbce96a54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81b3ef55088b434d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/CPIDetailPanel.tsx:1"}, "properties": {"repobilityId": "1f959e4184750ee7", "scanner": "scanner-primary", "fingerprint": "81b3ef55088b434d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccd9c9f8efb50cec", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/submissions/PlanExportPanel.tsx:1"}, "properties": {"repobilityId": "6b77799a3fed208b", "scanner": "scanner-primary", "fingerprint": "ccd9c9f8efb50cec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97b33336fbb9669f", "level": "none", "message": {"text": "Commented-code block (15 lines) in frontend/src/components/submissions/GanttPanel.tsx:5"}, "properties": {"repobilityId": "348b8f22a4c8222c", "scanner": "scanner-primary", "fingerprint": "97b33336fbb9669f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-651faa0e45b65b78", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:1"}, "properties": {"repobilityId": "b81ad4761d56240e", "scanner": "scanner-primary", "fingerprint": "651faa0e45b65b78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b9b09ca2762547f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/submissions/AddSubmissionModal.tsx:1"}, "properties": {"repobilityId": "a55ae2c12d2a4df8", "scanner": "scanner-primary", "fingerprint": "4b9b09ca2762547f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a008ac7554d19db", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/TemplatePickerStep.tsx:1"}, "properties": {"repobilityId": "08aa3957b6b01392", "scanner": "scanner-primary", "fingerprint": "6a008ac7554d19db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f0c0a863ed10454", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/components/submissions/TaskAssignmentPanel.tsx:1"}, "properties": {"repobilityId": "52f3472e683bd6b9", "scanner": "scanner-primary", "fingerprint": "6f0c0a863ed10454", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96e02de00a3ad9ac", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/submissions/ContentCollectionPanel.tsx:1"}, "properties": {"repobilityId": "9f0e65f662de7cef", "scanner": "scanner-primary", "fingerprint": "96e02de00a3ad9ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51b24cb11c4eec84", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/CriticalPathPanel.tsx:1"}, "properties": {"repobilityId": "91e4b38ba5dd8746", "scanner": "scanner-primary", "fingerprint": "51b24cb11c4eec84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04d4bd05fa0b2bf5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/submissions/ProvisioningErrorBanner.tsx:1"}, "properties": {"repobilityId": "865279e4736a837b", "scanner": "scanner-primary", "fingerprint": "04d4bd05fa0b2bf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7ccecf83456d913", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/tmf/TMFVersionComparison.tsx:3"}, "properties": {"repobilityId": "c0b773e64e9e05c7", "scanner": "scanner-primary", "fingerprint": "c7ccecf83456d913", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f022f8313710788", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tmf/TMFQCDashboard.tsx:180"}, "properties": {"repobilityId": "f1e9a80a4ce2513c", "scanner": "scanner-primary", "fingerprint": "8f022f8313710788", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fcb01a4e8fd19001", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/tmf/TMFComplianceDashboard.tsx:41"}, "properties": {"repobilityId": "b4f590de7bd014de", "scanner": "scanner-primary", "fingerprint": "fcb01a4e8fd19001", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c86f2f3ecc8d940a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ectd/SequenceTimeline.tsx:36"}, "properties": {"repobilityId": "70ddde615ff7a26a", "scanner": "scanner-primary", "fingerprint": "c86f2f3ecc8d940a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-026b5dd1bcb61d9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ectd/DocumentComparison.tsx:27"}, "properties": {"repobilityId": "c2b95457df235619", "scanner": "scanner-primary", "fingerprint": "026b5dd1bcb61d9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-311edebc449a97e7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/cross-module/CrossModuleBridgeVisualization.tsx:1"}, "properties": {"repobilityId": "a795a37f5bbc7bc3", "scanner": "scanner-primary", "fingerprint": "311edebc449a97e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d04e7e9a834489aa", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/lix/LixPanel.tsx:2"}, "properties": {"repobilityId": "a9f2d0174d838a1e", "scanner": "scanner-primary", "fingerprint": "d04e7e9a834489aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba34d467e8c211a4", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/lix/LixAuditRow.tsx:2"}, "properties": {"repobilityId": "66a98f5a24a2ed5f", "scanner": "scanner-primary", "fingerprint": "ba34d467e8c211a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7db4fd231c77ee7", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/lix/LixMessage.tsx:7"}, "properties": {"repobilityId": "90fe99b95f252d01", "scanner": "scanner-primary", "fingerprint": "a7db4fd231c77ee7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-455fd4ce1990c4b1", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/documents/ApprovalQueueDashboard.tsx:2"}, "properties": {"repobilityId": "081c8a9f51fda17d", "scanner": "scanner-primary", "fingerprint": "455fd4ce1990c4b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-559c1e3ab8693bb2", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/CreateLinkModal.tsx:3"}, "properties": {"repobilityId": "e9495938fcc23b7d", "scanner": "scanner-primary", "fingerprint": "559c1e3ab8693bb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8236ac35cd08feb", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/LinkedDocumentsPanel.tsx:3"}, "properties": {"repobilityId": "20e2a5b32ae47274", "scanner": "scanner-primary", "fingerprint": "e8236ac35cd08feb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e33adbcdd6c18ca", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/documents/DocumentLinkActions.tsx:3"}, "properties": {"repobilityId": "a5596c427985b8cb", "scanner": "scanner-primary", "fingerprint": "8e33adbcdd6c18ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cb21542db6bcce0", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/documents/LinkValidator.tsx:3"}, "properties": {"repobilityId": "20e9932a5017949c", "scanner": "scanner-primary", "fingerprint": "4cb21542db6bcce0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-279ff89fd47b3790", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/SessionIndicator.tsx:1"}, "properties": {"repobilityId": "89ab80daadae6e46", "scanner": "scanner-primary", "fingerprint": "279ff89fd47b3790", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-819e52776d3bf512", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/RemoteCursors.tsx:2"}, "properties": {"repobilityId": "8c5b0a1afa0d41c6", "scanner": "scanner-primary", "fingerprint": "819e52776d3bf512", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30fa2193c449cc00", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/PresenceAvatars.tsx:2"}, "properties": {"repobilityId": "fe0fdcf5ae019faf", "scanner": "scanner-primary", "fingerprint": "30fa2193c449cc00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ff3af9a455d6ae6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/collaboration/CollaborativeEditor.tsx:2"}, "properties": {"repobilityId": "6dbf764f9ff74209", "scanner": "scanner-primary", "fingerprint": "8ff3af9a455d6ae6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59321e634fab66f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/documents-api.ts:116"}, "properties": {"repobilityId": "f2d002fe1946ebcc", "scanner": "scanner-primary", "fingerprint": "59321e634fab66f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3e8ebb9fd8cf862c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/products-api.ts:132"}, "properties": {"repobilityId": "eabdd78195278a7c", "scanner": "scanner-primary", "fingerprint": "3e8ebb9fd8cf862c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c6a8f0c1170f119", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/stability-submissions-bridge.ts:2"}, "properties": {"repobilityId": "a29d7db4ad8907fb", "scanner": "scanner-primary", "fingerprint": "6c6a8f0c1170f119", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24d178cb271e4b09", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/biostats-submissions-bridge.ts:2"}, "properties": {"repobilityId": "b18da4f1c6f4577e", "scanner": "scanner-primary", "fingerprint": "24d178cb271e4b09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84e23b6547519398", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/cascade-resume.ts:1"}, "properties": {"repobilityId": "150fd8ae7edc84ff", "scanner": "scanner-primary", "fingerprint": "84e23b6547519398", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1e28dc34808658d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/agent-engine.ts:1"}, "properties": {"repobilityId": "e04e51de59b12546", "scanner": "scanner-primary", "fingerprint": "f1e28dc34808658d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77a4de23f1ecdc64", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/agent-engine.ts:102"}, "properties": {"repobilityId": "05478c3edb3a3383", "scanner": "scanner-primary", "fingerprint": "77a4de23f1ecdc64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30f49d52d6fa33b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/learning-prompt-injector.ts:1"}, "properties": {"repobilityId": "9fd060bae41dcdf3", "scanner": "scanner-primary", "fingerprint": "30f49d52d6fa33b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-051e555ad578ffbc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/safety-api.ts:195"}, "properties": {"repobilityId": "5bc43de6a7f775fd", "scanner": "scanner-primary", "fingerprint": "051e555ad578ffbc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f932d95fa403704", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/submissions-api.ts:211"}, "properties": {"repobilityId": "bad9dc5279ba2d04", "scanner": "scanner-primary", "fingerprint": "9f932d95fa403704", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ac88c2cf421a7d0", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-api-fetch.ts:6"}, "properties": {"repobilityId": "b8766a08dd5d1775", "scanner": "scanner-primary", "fingerprint": "6ac88c2cf421a7d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35f977c662160f45", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/agent-store.ts:1"}, "properties": {"repobilityId": "51bb65a4da6482ac", "scanner": "scanner-primary", "fingerprint": "35f977c662160f45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aef3ebefb826f55d", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-registry.ts:1"}, "properties": {"repobilityId": "ef798863c74eb020", "scanner": "scanner-primary", "fingerprint": "aef3ebefb826f55d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf67a405a20b5dda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/haq-api.ts:100"}, "properties": {"repobilityId": "490fbd0b87472194", "scanner": "scanner-primary", "fingerprint": "bf67a405a20b5dda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e19dcf0daafb3b2b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/spl-labeling-bridge.ts:2"}, "properties": {"repobilityId": "fcfd06c8d682b482", "scanner": "scanner-primary", "fingerprint": "e19dcf0daafb3b2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a413aba6409711ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/date-calculation-engine.ts:2"}, "properties": {"repobilityId": "b4225b0d4296c65b", "scanner": "scanner-primary", "fingerprint": "a413aba6409711ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be1a9c5a3ea92abe", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/learning-store.ts:1"}, "properties": {"repobilityId": "a101d1a05030b9d6", "scanner": "scanner-primary", "fingerprint": "be1a9c5a3ea92abe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33002bed4765920d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/applications-api.ts:212"}, "properties": {"repobilityId": "d689f0d0a4cba3db", "scanner": "scanner-primary", "fingerprint": "33002bed4765920d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1933bfe9d23f029c", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/proactive-monitor-store.ts:1"}, "properties": {"repobilityId": "544527e281b2b23f", "scanner": "scanner-primary", "fingerprint": "1933bfe9d23f029c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e07ac380fe05473", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/agent-write-back.ts:1"}, "properties": {"repobilityId": "dc679bb775542a49", "scanner": "scanner-primary", "fingerprint": "6e07ac380fe05473", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-127f68da4dca277a", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/user-store.ts:2"}, "properties": {"repobilityId": "fac9e9159c38bc36", "scanner": "scanner-primary", "fingerprint": "127f68da4dca277a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f17282c51fbb114c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/error-reporting.ts:157"}, "properties": {"repobilityId": "b97a1f4fd8288198", "scanner": "scanner-primary", "fingerprint": "f17282c51fbb114c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06b7612b2b6bbffb", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/cascade-state-store.ts:1"}, "properties": {"repobilityId": "4a758c2e31fda72e", "scanner": "scanner-primary", "fingerprint": "06b7612b2b6bbffb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba2a6d91ab9946e1", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/audit-store.ts:2"}, "properties": {"repobilityId": "4b4b27e538ce16ec", "scanner": "scanner-primary", "fingerprint": "ba2a6d91ab9946e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be8e0b4b37724cdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/studies-api.ts:121"}, "properties": {"repobilityId": "4d2e962c73ab3cb3", "scanner": "scanner-primary", "fingerprint": "be8e0b4b37724cdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39badbf89b0f2e85", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/cascade-types.ts:1"}, "properties": {"repobilityId": "80a84cb4c1e6b0d1", "scanner": "scanner-primary", "fingerprint": "39badbf89b0f2e85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-754e5622e266cfd5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/integrations/docuvera/webhooks.ts:1"}, "properties": {"repobilityId": "36c1ef2fc4415d9b", "scanner": "scanner-primary", "fingerprint": "754e5622e266cfd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b215d8477a2bf9fc", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/integrations/docuvera/client.ts:1"}, "properties": {"repobilityId": "f957befd4d47f386", "scanner": "scanner-primary", "fingerprint": "b215d8477a2bf9fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0777fa1e43995f29", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/integrations/docuvera/client.ts:476"}, "properties": {"repobilityId": "3615a7e693a0e993", "scanner": "scanner-primary", "fingerprint": "0777fa1e43995f29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0fb6bd188239291", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/integrations/docuvera/service.ts:1"}, "properties": {"repobilityId": "9a977a05be3e678e", "scanner": "scanner-primary", "fingerprint": "d0fb6bd188239291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-883d99861e002484", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/lib/integrations/docuvera/types.ts:1"}, "properties": {"repobilityId": "8d5eb668094e7f5f", "scanner": "scanner-primary", "fingerprint": "883d99861e002484", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cc4117a30f69bb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/security/audit.ts:2"}, "properties": {"repobilityId": "3525f3354a468542", "scanner": "scanner-primary", "fingerprint": "7cc4117a30f69bb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-242a9c2705856bab", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/TemplateBrowserPage.tsx:1"}, "properties": {"repobilityId": "87c5e404ef0ef08c", "scanner": "scanner-primary", "fingerprint": "242a9c2705856bab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9c50d1b55fbbe1a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/hooks/usePreserveModuleState.ts:17"}, "properties": {"repobilityId": "fb52f0f72e978f0e", "scanner": "scanner-primary", "fingerprint": "b9c50d1b55fbbe1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46cc24c7856e571b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePDFIngestion.tsx:160"}, "properties": {"repobilityId": "671d1ed6d63a7d03", "scanner": "scanner-primary", "fingerprint": "46cc24c7856e571b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2cead9cc8540ef7d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/hooks/useSafetyNarrativeRAG.ts:3"}, "properties": {"repobilityId": "efe7173536d42426", "scanner": "scanner-primary", "fingerprint": "2cead9cc8540ef7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5246c81a813e16b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTMFPersistence.ts:91"}, "properties": {"repobilityId": "943a19097e70c0a1", "scanner": "scanner-primary", "fingerprint": "d5246c81a813e16b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01f0e28894fbc509", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useDocumentControlPersistence.ts:77"}, "properties": {"repobilityId": "e38e23b8e9c194f7", "scanner": "scanner-primary", "fingerprint": "01f0e28894fbc509", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd935cd77ac05fee", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/hooks/useResearchPersistence.ts:332"}, "properties": {"repobilityId": "02f94d8e4a17741f", "scanner": "scanner-primary", "fingerprint": "fd935cd77ac05fee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25a2c3ea3d6aac90", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168"}, "properties": {"repobilityId": "25c189cd7ee6da71", "scanner": "scanner-primary", "fingerprint": "25a2c3ea3d6aac90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55a2a1ee5b5e5964", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useLixAgent.ts:2"}, "properties": {"repobilityId": "15a1fc6cac8f64b9", "scanner": "scanner-primary", "fingerprint": "55a2a1ee5b5e5964", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3aa8139621c4e459", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/hooks/useCollaboration.ts:3"}, "properties": {"repobilityId": "6489b8a1835e83aa", "scanner": "scanner-primary", "fingerprint": "3aa8139621c4e459", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd2894eb410529a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useAuthoringPersistence.ts:159"}, "properties": {"repobilityId": "901b31a73f00a697", "scanner": "scanner-primary", "fingerprint": "bd2894eb410529a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ec454666100b5d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/cross-module-lineage-service.ts:2"}, "properties": {"repobilityId": "0ccc02e6d7f16625", "scanner": "scanner-primary", "fingerprint": "1ec454666100b5d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-accfc67e07aa639a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/bidirectional-sync-service.ts:2"}, "properties": {"repobilityId": "397725996defafec", "scanner": "scanner-primary", "fingerprint": "accfc67e07aa639a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8d0ee6b5778cc0c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/submission-archive-service.ts:2"}, "properties": {"repobilityId": "f87cce8ce472c0bc", "scanner": "scanner-primary", "fingerprint": "f8d0ee6b5778cc0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7782b8cb9a92a263", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/anthropic-service.ts:285"}, "properties": {"repobilityId": "d6593f5222875983", "scanner": "scanner-primary", "fingerprint": "7782b8cb9a92a263", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c387956011817759", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/validation-protocol-generator.ts:2"}, "properties": {"repobilityId": "e3b5ea7094d657ec", "scanner": "scanner-primary", "fingerprint": "c387956011817759", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6177dab77e4dd471", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/validation-report-service.ts:2"}, "properties": {"repobilityId": "0d27463743d6e629", "scanner": "scanner-primary", "fingerprint": "6177dab77e4dd471", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fec3250d69a7044", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/retry-strategies-service.ts:318"}, "properties": {"repobilityId": "527be9a5c32a53ac", "scanner": "scanner-primary", "fingerprint": "5fec3250d69a7044", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12990f44844f8bb5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/template-usage-tracking-service.ts:2"}, "properties": {"repobilityId": "07f76255bac0786f", "scanner": "scanner-primary", "fingerprint": "12990f44844f8bb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b19c2cceb0acabee", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/usage-event-service.ts:2"}, "properties": {"repobilityId": "96848dc5a803be09", "scanner": "scanner-primary", "fingerprint": "b19c2cceb0acabee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-712b6ae85569e815", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/usdm-authoring-template-service.ts:2"}, "properties": {"repobilityId": "d59175760b6dbd87", "scanner": "scanner-primary", "fingerprint": "712b6ae85569e815", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb8b5e52fe37f8ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/resilient-executor-service.ts:901"}, "properties": {"repobilityId": "fd62ba659eb5917e", "scanner": "scanner-primary", "fingerprint": "bb8b5e52fe37f8ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-25e21dc1b4a0441b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/ctms-persistence.ts:170"}, "properties": {"repobilityId": "8cdd5e1f7a1e8662", "scanner": "scanner-primary", "fingerprint": "25e21dc1b4a0441b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02d962c389711a31", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/sop-library-service.ts:2"}, "properties": {"repobilityId": "3d746096448b2cbb", "scanner": "scanner-primary", "fingerprint": "02d962c389711a31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eecf610cf27304e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/usdm-ctms-sync-service.ts:2"}, "properties": {"repobilityId": "0aedcf2e2620eb40", "scanner": "scanner-primary", "fingerprint": "eecf610cf27304e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-979bab9187b33f5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/notification-channels-service.ts:263"}, "properties": {"repobilityId": "c4cb8f1e0fd505fd", "scanner": "scanner-primary", "fingerprint": "979bab9187b33f5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-87773e7c8e351450", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/track-changes/config.ts:2"}, "properties": {"repobilityId": "a60b277cc0724506", "scanner": "scanner-primary", "fingerprint": "87773e7c8e351450", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88bfd6264130239a", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/track-changes/comparison-engine.ts:2"}, "properties": {"repobilityId": "ba5b98f9c8c1190f", "scanner": "scanner-primary", "fingerprint": "88bfd6264130239a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-499d1af8036ad0cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/track-changes-service.ts:2"}, "properties": {"repobilityId": "84c5bc892c42cb30", "scanner": "scanner-primary", "fingerprint": "499d1af8036ad0cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2a49b76c8ff4379", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/revision-processor.ts:2"}, "properties": {"repobilityId": "036dd7b02c090c03", "scanner": "scanner-primary", "fingerprint": "f2a49b76c8ff4379", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf5f8bd59144c971", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/ooxml-types.ts:2"}, "properties": {"repobilityId": "3a947980b940efda", "scanner": "scanner-primary", "fingerprint": "bf5f8bd59144c971", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5dc1c8ea5391ec1a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/track-changes/docx-builder.ts:2"}, "properties": {"repobilityId": "061dd7596e13b2a0", "scanner": "scanner-primary", "fingerprint": "5dc1c8ea5391ec1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bf5df1269e05352", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockStructuredContentService.ts:2"}, "properties": {"repobilityId": "b4b7bec8f9763ab6", "scanner": "scanner-primary", "fingerprint": "0bf5df1269e05352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e189ad373d8e5563", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockPDFExtractionService.ts:2"}, "properties": {"repobilityId": "1baf79ef0705201a", "scanner": "scanner-primary", "fingerprint": "e189ad373d8e5563", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb33a728fa0fef2f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/mock/MockTrackChangesExportService.ts:2"}, "properties": {"repobilityId": "e89af5bd8b8810b1", "scanner": "scanner-primary", "fingerprint": "cb33a728fa0fef2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbdcdcde3f4da432", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/memory-vector-store.ts:2"}, "properties": {"repobilityId": "816a4ea0aa35c831", "scanner": "scanner-primary", "fingerprint": "fbdcdcde3f4da432", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b315f582b31e49c0", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/anthropic-embeddings.ts:3"}, "properties": {"repobilityId": "05d393c1129c65d0", "scanner": "scanner-primary", "fingerprint": "b315f582b31e49c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5f5c5ee74a6d6e2", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/pgvector-store.ts:2"}, "properties": {"repobilityId": "10581e69e2728dd5", "scanner": "scanner-primary", "fingerprint": "e5f5c5ee74a6d6e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ded8a4f0a28c98d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/rag/vector-store-factory.ts:2"}, "properties": {"repobilityId": "8eb07b39390c2f83", "scanner": "scanner-primary", "fingerprint": "ded8a4f0a28c98d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-441697c812556fd4", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/rag-config.ts:2"}, "properties": {"repobilityId": "e26d6e8aba19904b", "scanner": "scanner-primary", "fingerprint": "441697c812556fd4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2a86930f1c2e785", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/types.ts:2"}, "properties": {"repobilityId": "5404884cce8d7d42", "scanner": "scanner-primary", "fingerprint": "c2a86930f1c2e785", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a856f225019398b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/rag/vector-store.ts:2"}, "properties": {"repobilityId": "81fc62b400d0e891", "scanner": "scanner-primary", "fingerprint": "8a856f225019398b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bac3c79a389dd4e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/structured-content/migrations.ts:2"}, "properties": {"repobilityId": "aac379aa7ab91604", "scanner": "scanner-primary", "fingerprint": "bac3c79a389dd4e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31ad27b7bc24ae23", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in frontend/src/services/agents/submission-assembly-agent.ts:112"}, "properties": {"repobilityId": "20148855519a20a5", "scanner": "scanner-primary", "fingerprint": "31ad27b7bc24ae23", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b736dc57a173659f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/submission-assembly-agent.ts:1"}, "properties": {"repobilityId": "82128bf2875cbd58", "scanner": "scanner-primary", "fingerprint": "b736dc57a173659f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad1727a563e5ad9f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/study-operations-agent.ts:1"}, "properties": {"repobilityId": "ee663248b4c86cae", "scanner": "scanner-primary", "fingerprint": "ad1727a563e5ad9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-157e4897ed649543", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/services/agents/icsr-processing-agent.ts:1"}, "properties": {"repobilityId": "102f0040575f0149", "scanner": "scanner-primary", "fingerprint": "157e4897ed649543", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5365251db5be4e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/medical-affairs-agent.ts:1"}, "properties": {"repobilityId": "eb96a52909ece70d", "scanner": "scanner-primary", "fingerprint": "c5365251db5be4e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b08b4f91124a3ecc", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/biostatistician-agent.ts:1"}, "properties": {"repobilityId": "0544787d80d59fa7", "scanner": "scanner-primary", "fingerprint": "b08b4f91124a3ecc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-949aea58d6de5278", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/ind-nda-chain.ts:1"}, "properties": {"repobilityId": "cc1c7214760b8d97", "scanner": "scanner-primary", "fingerprint": "949aea58d6de5278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7380e3d8d1e1ccb", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/services/agents/haq-response-agent.ts:1"}, "properties": {"repobilityId": "0bac6d7a6e78f230", "scanner": "scanner-primary", "fingerprint": "a7380e3d8d1e1ccb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aafe8b56aa2f72d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/labeling-management-agent.ts:1"}, "properties": {"repobilityId": "4aef51de6c6b7027", "scanner": "scanner-primary", "fingerprint": "6aafe8b56aa2f72d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d123917ff72cb65", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/agents/medical-monitor-agent.ts:1"}, "properties": {"repobilityId": "c572a0792413120d", "scanner": "scanner-primary", "fingerprint": "6d123917ff72cb65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3529d574e4b7e4b6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/reg-strategy-agent.ts:1"}, "properties": {"repobilityId": "bfd95fa3cf8ceb13", "scanner": "scanner-primary", "fingerprint": "3529d574e4b7e4b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ef65444f41922dd", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/site-monitoring-agent.ts:1"}, "properties": {"repobilityId": "88556c3b8d3018c9", "scanner": "scanner-primary", "fingerprint": "1ef65444f41922dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-185d931f9cd62c82", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/research-intelligence-agent.ts:1"}, "properties": {"repobilityId": "bfe194a846b9d2c6", "scanner": "scanner-primary", "fingerprint": "185d931f9cd62c82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4562e35fc7bb4655", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/services/agents/cascade-orchestrator.ts:10"}, "properties": {"repobilityId": "6fe682c4b0ddb5c9", "scanner": "scanner-primary", "fingerprint": "4562e35fc7bb4655", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f25315e563c517e7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/cmc-lifecycle-agent.ts:1"}, "properties": {"repobilityId": "cda4501f14aedffa", "scanner": "scanner-primary", "fingerprint": "f25315e563c517e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d981ac2c21e0d393", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/signal-intelligence-agent.ts:1"}, "properties": {"repobilityId": "5010aa3daab0059a", "scanner": "scanner-primary", "fingerprint": "d981ac2c21e0d393", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-938d26e29ad1ec54", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/lead-optimisation-agent.ts:1"}, "properties": {"repobilityId": "1c6375b2785206bc", "scanner": "scanner-primary", "fingerprint": "938d26e29ad1ec54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-592fc79754004dda", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/agents/document-resolution-agent.ts:1"}, "properties": {"repobilityId": "ff0cc0601fb70c18", "scanner": "scanner-primary", "fingerprint": "592fc79754004dda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d79381f4e44b9a4", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/services/agents/portfolio-intelligence-agent.ts:1"}, "properties": {"repobilityId": "f5cdad1a396eb096", "scanner": "scanner-primary", "fingerprint": "4d79381f4e44b9a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-714a44f4da01f573", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/nonclinical-package-agent.ts:1"}, "properties": {"repobilityId": "4caaf1b923823927", "scanner": "scanner-primary", "fingerprint": "714a44f4da01f573", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f036367137d334f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/agents/quality-intelligence-agent.ts:1"}, "properties": {"repobilityId": "373550a4e75b1385", "scanner": "scanner-primary", "fingerprint": "f036367137d334f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a386b8c1a9056cb2", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/gateway/useGatewayStore.ts:3"}, "properties": {"repobilityId": "e5a731e303c425b6", "scanner": "scanner-primary", "fingerprint": "a386b8c1a9056cb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea722a689f8b223f", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-service.ts:2"}, "properties": {"repobilityId": "4ad91f775d30805e", "scanner": "scanner-primary", "fingerprint": "ea722a689f8b223f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0917ebe0f7d31a8", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-audit-service.ts:2"}, "properties": {"repobilityId": "4d7c231a2f3015ba", "scanner": "scanner-primary", "fingerprint": "f0917ebe0f7d31a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2c3fd217a93a4d1", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/gateway/gateway-connector-types.ts:2"}, "properties": {"repobilityId": "b70c0d0bbaead187", "scanner": "scanner-primary", "fingerprint": "e2c3fd217a93a4d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e91b4fdc6fbb6aaa", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/layout-analyzer.ts:2"}, "properties": {"repobilityId": "c357c5992f515856", "scanner": "scanner-primary", "fingerprint": "e91b4fdc6fbb6aaa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68609fea7b454ec3", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/claude-vision-client.ts:3"}, "properties": {"repobilityId": "b9f62556f7465629", "scanner": "scanner-primary", "fingerprint": "68609fea7b454ec3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8351171c08f4b2e0", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/table-extractor.ts:2"}, "properties": {"repobilityId": "25c60d5bbb1b8a86", "scanner": "scanner-primary", "fingerprint": "8351171c08f4b2e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68d8950b7fe5348a", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/pdf-processor.ts:2"}, "properties": {"repobilityId": "91cc0308a3a41dc9", "scanner": "scanner-primary", "fingerprint": "68d8950b7fe5348a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9206000f2b7c1f7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/pdf-config.ts:2"}, "properties": {"repobilityId": "2470a3f6254fee2f", "scanner": "scanner-primary", "fingerprint": "a9206000f2b7c1f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9f32f67ef642cbf", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/pdf/figure-extractor.ts:2"}, "properties": {"repobilityId": "1d59a8621bf524a7", "scanner": "scanner-primary", "fingerprint": "d9f32f67ef642cbf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a773f3cf2ecc298", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/pdf/types.ts:2"}, "properties": {"repobilityId": "3ea84003e507fbca", "scanner": "scanner-primary", "fingerprint": "8a773f3cf2ecc298", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26d5436530ad6864", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/conflict-resolver.ts:2"}, "properties": {"repobilityId": "61bccdafb648ca86", "scanner": "scanner-primary", "fingerprint": "26d5436530ad6864", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46efbe1a3820c7b5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/websocket-server.ts:2"}, "properties": {"repobilityId": "013c8816a9a81f8e", "scanner": "scanner-primary", "fingerprint": "46efbe1a3820c7b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3b94bd333a5a620", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/cursor-sync.ts:2"}, "properties": {"repobilityId": "08e46f7bc30dd806", "scanner": "scanner-primary", "fingerprint": "d3b94bd333a5a620", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a91457b20da22201", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/collaboration/offline-queue-service.ts:345"}, "properties": {"repobilityId": "02e5f1187a6688c0", "scanner": "scanner-primary", "fingerprint": "a91457b20da22201", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-023e5cc4935af735", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-analytics-service.ts:2"}, "properties": {"repobilityId": "c93726de596d3971", "scanner": "scanner-primary", "fingerprint": "023e5cc4935af735", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d424e9de45dc8179", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/replay-engine.ts:2"}, "properties": {"repobilityId": "c29ddea9cd40c52c", "scanner": "scanner-primary", "fingerprint": "d424e9de45dc8179", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b211de1ec6445452", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/presence-service.ts:2"}, "properties": {"repobilityId": "3d564ba9585ba2ed", "scanner": "scanner-primary", "fingerprint": "b211de1ec6445452", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d5051f1b3fc3496", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/collaboration/session-manager.ts:2"}, "properties": {"repobilityId": "d2c2e12e181d7b8a", "scanner": "scanner-primary", "fingerprint": "5d5051f1b3fc3496", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c729fcf2ac03ee5", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/operation-history.ts:2"}, "properties": {"repobilityId": "e27daf985b1b86fb", "scanner": "scanner-primary", "fingerprint": "1c729fcf2ac03ee5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10dbb02000d5debb", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/services/collaboration/operation-compactor.ts:2"}, "properties": {"repobilityId": "1e7a1da7bd4945bd", "scanner": "scanner-primary", "fingerprint": "10dbb02000d5debb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03ec1acd3ddd7c60", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/session-recovery.ts:2"}, "properties": {"repobilityId": "f99cbafeaa8cb880", "scanner": "scanner-primary", "fingerprint": "03ec1acd3ddd7c60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edc9ff387b528195", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/services/collaboration/collaboration-repository.ts:2"}, "properties": {"repobilityId": "782452ddfad91e8a", "scanner": "scanner-primary", "fingerprint": "edc9ff387b528195", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9fb4fa7f2540c8d", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/store/useSubmissionTaskStore.ts:2"}, "properties": {"repobilityId": "504c3a409c5bac6c", "scanner": "scanner-primary", "fingerprint": "a9fb4fa7f2540c8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c5671ea58783dbd", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useGuidedScenarioStore.ts:9"}, "properties": {"repobilityId": "f7aace27cd72af60", "scanner": "scanner-primary", "fingerprint": "6c5671ea58783dbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0c44daacccc0f2c", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/useDocumentLinkStore.ts:3"}, "properties": {"repobilityId": "1463a84fa98df9c3", "scanner": "scanner-primary", "fingerprint": "f0c44daacccc0f2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cabaa1ace6ee243e", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useSubmissionCalendarStore.ts:3"}, "properties": {"repobilityId": "00b142cb3670857d", "scanner": "scanner-primary", "fingerprint": "cabaa1ace6ee243e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa92fd520e4979bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/aggregateReportTypes.ts:2"}, "properties": {"repobilityId": "08c1a4e4407920fa", "scanner": "scanner-primary", "fingerprint": "aa92fd520e4979bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a3c3b94a6be409b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleStore.ts:7"}, "properties": {"repobilityId": "d203d45f770b985f", "scanner": "scanner-primary", "fingerprint": "8a3c3b94a6be409b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26b5c375f09db9d7", "level": "note", "message": {"text": "Legacy-named symbol `d120_responses_v1` in frontend/src/store/useCampaignEnhancements.ts:97"}, "properties": {"repobilityId": "cf4533648d3de497", "scanner": "scanner-primary", "fingerprint": "26b5c375f09db9d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d3970f2c176dcf55", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useEDCStore.ts:3"}, "properties": {"repobilityId": "2dd418702be9645b", "scanner": "scanner-primary", "fingerprint": "d3970f2c176dcf55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ad1e0e77fd9ab05", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossModuleEventStore.ts:6"}, "properties": {"repobilityId": "9d24c72e45a40b0b", "scanner": "scanner-primary", "fingerprint": "0ad1e0e77fd9ab05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de01143d735fe05a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useSequenceTemplateStore.ts:3"}, "properties": {"repobilityId": "240046997df7cc5c", "scanner": "scanner-primary", "fingerprint": "de01143d735fe05a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e0b16e0b8e8d1b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useDemoAnalyticsStore.ts:3"}, "properties": {"repobilityId": "eb78b56bb9d435f2", "scanner": "scanner-primary", "fingerprint": "6e0b16e0b8e8d1b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-daa2163c13237f77", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/documentControlTypes.ts:2"}, "properties": {"repobilityId": "5f2c645e58133c3d", "scanner": "scanner-primary", "fingerprint": "daa2163c13237f77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2be995a04f9c638", "level": "note", "message": {"text": "Legacy-named symbol `3_DMP_v1` in frontend/src/store/useTMFStore.ts:413"}, "properties": {"repobilityId": "88779eeea93a1d43", "scanner": "scanner-primary", "fingerprint": "e2be995a04f9c638", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c16a87c81560ab18", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useTMFStore.ts:3"}, "properties": {"repobilityId": "550f90d96b68e39c", "scanner": "scanner-primary", "fingerprint": "c16a87c81560ab18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57424d2726d424af", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/cross-reference-validation-types.ts:2"}, "properties": {"repobilityId": "1f8d57de26223b8f", "scanner": "scanner-primary", "fingerprint": "57424d2726d424af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24359b7fb729e736", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useRegIntelStore.ts:3"}, "properties": {"repobilityId": "0afc023b3b1c2272", "scanner": "scanner-primary", "fingerprint": "24359b7fb729e736", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29b58d13aa9136c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/usePSMFStore.ts:3"}, "properties": {"repobilityId": "368544cbf0fd1422", "scanner": "scanner-primary", "fingerprint": "29b58d13aa9136c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec6b2917b043f42b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/edcTypes.ts:2"}, "properties": {"repobilityId": "f0318079f5f540dd", "scanner": "scanner-primary", "fingerprint": "ec6b2917b043f42b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61aa4c328c75fcf6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/ectdBuildingTypes.ts:2"}, "properties": {"repobilityId": "ccc0970124d4dc64", "scanner": "scanner-primary", "fingerprint": "61aa4c328c75fcf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-caf2affad016c989", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/regIntelTypes.ts:2"}, "properties": {"repobilityId": "06edc9540ce01a15", "scanner": "scanner-primary", "fingerprint": "caf2affad016c989", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13a709b6f60e7161", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useCrossReferenceValidationStore.ts:3"}, "properties": {"repobilityId": "da9c17cf1f2c510d", "scanner": "scanner-primary", "fingerprint": "13a709b6f60e7161", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e00060c711e5e928", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/ctmsTypes.ts:2"}, "properties": {"repobilityId": "e3c0ce0875ae7394", "scanner": "scanner-primary", "fingerprint": "e00060c711e5e928", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cc6a1ca3ba676f7", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/store/useContentCollectionStore.ts:2"}, "properties": {"repobilityId": "05957fb516ba3cbc", "scanner": "scanner-primary", "fingerprint": "8cc6a1ca3ba676f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73ac1abf84575573", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/aiConsistencyEngineTypes.ts:2"}, "properties": {"repobilityId": "b42475f7c10edbc3", "scanner": "scanner-primary", "fingerprint": "73ac1abf84575573", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60fd56f5ef889856", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useCrossDocumentStore.ts:6"}, "properties": {"repobilityId": "cec0a07fbfdfe2f3", "scanner": "scanner-primary", "fingerprint": "60fd56f5ef889856", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92797dfe1f958664", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useCTMSStore.ts:3"}, "properties": {"repobilityId": "f7d2774d3d8fcd65", "scanner": "scanner-primary", "fingerprint": "92797dfe1f958664", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb2a3e392558f59f", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/useStabilityStore.ts:5"}, "properties": {"repobilityId": "143f138e5dd73dd2", "scanner": "scanner-primary", "fingerprint": "fb2a3e392558f59f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af4881725c99ef74", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/useLabelingStore.ts:5"}, "properties": {"repobilityId": "77792cc4d9d5f9e9", "scanner": "scanner-primary", "fingerprint": "af4881725c99ef74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7869ee95e3ad5366", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/aiIntegrationTypes.ts:2"}, "properties": {"repobilityId": "9912447ab5954994", "scanner": "scanner-primary", "fingerprint": "7869ee95e3ad5366", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4acb49828746df1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/submissionAdapterTypes.ts:2"}, "properties": {"repobilityId": "af5f33ec75b765bb", "scanner": "scanner-primary", "fingerprint": "d4acb49828746df1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff8c88b5a5dcb4ac", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/cross-reference-types.ts:2"}, "properties": {"repobilityId": "8a2666fea7677c91", "scanner": "scanner-primary", "fingerprint": "ff8c88b5a5dcb4ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ca005424b23ff50", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/splTypes.ts:2"}, "properties": {"repobilityId": "a03a0a0561ef4650", "scanner": "scanner-primary", "fingerprint": "6ca005424b23ff50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a7ae15be66bd2f8", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/store/useNavigationStackStore.ts:7"}, "properties": {"repobilityId": "c603ff06c30236bf", "scanner": "scanner-primary", "fingerprint": "2a7ae15be66bd2f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-621068db6a1b03ca", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useNotificationStore.ts:534"}, "properties": {"repobilityId": "01254fa851e16fa8", "scanner": "scanner-primary", "fingerprint": "621068db6a1b03ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8e22aebfebddf72", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useSPLStore.ts:24"}, "properties": {"repobilityId": "dc8d671bd1fa26a4", "scanner": "scanner-primary", "fingerprint": "c8e22aebfebddf72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-931bde20b1940afe", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/regulatoryCalendarTypes.ts:2"}, "properties": {"repobilityId": "582b5fe36c4a240c", "scanner": "scanner-primary", "fingerprint": "931bde20b1940afe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef4194e5ffe2987b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/submission-calendar-types.ts:2"}, "properties": {"repobilityId": "f07c3745ed073735", "scanner": "scanner-primary", "fingerprint": "ef4194e5ffe2987b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53a5fed8542e46bf", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/store/useSampleManagementStore.ts:3"}, "properties": {"repobilityId": "374fdf74de0dfebd", "scanner": "scanner-primary", "fingerprint": "53a5fed8542e46bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcab8ceb6b9ea3da", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/store/clinicalRegBridgeTypes.ts:2"}, "properties": {"repobilityId": "36e4aaa73f2c34d0", "scanner": "scanner-primary", "fingerprint": "dcab8ceb6b9ea3da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4ada5181dad2c7a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/ectd-sequence-template-types.ts:2"}, "properties": {"repobilityId": "e889dddac26bbe30", "scanner": "scanner-primary", "fingerprint": "e4ada5181dad2c7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2e18b9525fc6b71", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/store/useSubmissionLifecycleStore.ts:2"}, "properties": {"repobilityId": "40ab14fe6a517dbb", "scanner": "scanner-primary", "fingerprint": "d2e18b9525fc6b71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1315a4b1c29cda15", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in frontend/src/store/useActivityStore.ts:244"}, "properties": {"repobilityId": "855b95dc2173a840", "scanner": "scanner-primary", "fingerprint": "1315a4b1c29cda15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5b59dbd237723625", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useFeatureFlags.ts:2"}, "properties": {"repobilityId": "1ed15929df0bc559", "scanner": "scanner-primary", "fingerprint": "5b59dbd237723625", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de376b6b602e4700", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useECTDLinkValidationStore.ts:3"}, "properties": {"repobilityId": "c60297063efca4da", "scanner": "scanner-primary", "fingerprint": "de376b6b602e4700", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8be095a5867a68c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/aiDocumentGenerationTypes.ts:2"}, "properties": {"repobilityId": "f4e0c4a1d0dd3f51", "scanner": "scanner-primary", "fingerprint": "8be095a5867a68c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0e074cb8be2d6ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/qmsTypes.ts:2"}, "properties": {"repobilityId": "6e1e7d2451f53bcc", "scanner": "scanner-primary", "fingerprint": "b0e074cb8be2d6ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80f2f6263de941f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/usdmTypes.ts:2"}, "properties": {"repobilityId": "d0e7256c59b53c4d", "scanner": "scanner-primary", "fingerprint": "80f2f6263de941f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba95828d48d58f38", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/tmfTypes.ts:2"}, "properties": {"repobilityId": "5c9ea2bdd8f6f6cf", "scanner": "scanner-primary", "fingerprint": "ba95828d48d58f38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72c2b6414b08be90", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/ectd-publishing-types.ts:2"}, "properties": {"repobilityId": "9a71bf495de7db74", "scanner": "scanner-primary", "fingerprint": "72c2b6414b08be90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af42d96992075144", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/ectd-regional-types.ts:2"}, "properties": {"repobilityId": "3a9cd5fb66c3a0e7", "scanner": "scanner-primary", "fingerprint": "af42d96992075144", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc9188b0394214cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/store/useStudyIntelStore.ts:3"}, "properties": {"repobilityId": "1409e39d105421c1", "scanner": "scanner-primary", "fingerprint": "fc9188b0394214cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de625175c1240050", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/store/useBiostatsStore.ts:5"}, "properties": {"repobilityId": "0568a8fe1f89fc22", "scanner": "scanner-primary", "fingerprint": "de625175c1240050", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0c5e14e66928769", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useECTDPublishingStore.ts:3"}, "properties": {"repobilityId": "29943ea84429033a", "scanner": "scanner-primary", "fingerprint": "d0c5e14e66928769", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c372fa3f965d2351", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/store/safetyTypes.ts:2"}, "properties": {"repobilityId": "d0bd09a03709f1a9", "scanner": "scanner-primary", "fingerprint": "c372fa3f965d2351", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-375617448eaf5346", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/useGLPStore.ts:3"}, "properties": {"repobilityId": "72ea05a0e1b57f97", "scanner": "scanner-primary", "fingerprint": "375617448eaf5346", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2df6f1657e563835", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/haqResponseTypes.ts:2"}, "properties": {"repobilityId": "50507a8b9b46d11a", "scanner": "scanner-primary", "fingerprint": "2df6f1657e563835", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc0aa31232c06c46", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/domains/usdm/contracts.ts:1057"}, "properties": {"repobilityId": "0e19fe17a34857d0", "scanner": "scanner-primary", "fingerprint": "dc0aa31232c06c46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "d8734ec6b045b049", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "3f6f0cfbe52a8067", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "aa75ca7f4e8961cc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-8fca458ba692ec29", "level": "warning", "message": {"text": "Frontend route `/review` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "cfebf8c29ec44214", "scanner": "scanner-primary", "fingerprint": "8fca458ba692ec29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5cc54eabaec6fa3c", "level": "warning", "message": {"text": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "757e832dffa0a03b", "scanner": "scanner-primary", "fingerprint": "5cc54eabaec6fa3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0e63d5cd06c24ebe", "level": "warning", "message": {"text": "Frontend route `/demo/template-browser` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "9df45b04f7f8a58c", "scanner": "scanner-primary", "fingerprint": "0e63d5cd06c24ebe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5cbbcd9569d13045", "level": "warning", "message": {"text": "Frontend route `/spike/streaming` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "911514fbf7036116", "scanner": "scanner-primary", "fingerprint": "5cbbcd9569d13045", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b155cf1272aa29e8", "level": "warning", "message": {"text": "Frontend route `/spike/haq-rag` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "cdee3ead9a5c4f7e", "scanner": "scanner-primary", "fingerprint": "b155cf1272aa29e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dcfb4a7e4afd2f8e", "level": "error", "message": {"text": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:134"}, "properties": {"repobilityId": "9aa11a654067ef50", "scanner": "scanner-primary", "fingerprint": "dcfb4a7e4afd2f8e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/studies.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-8ad1acc716518c2d", "level": "error", "message": {"text": "FastAPI POST `create_study` without auth dependency \u2014 backend/app/routers/studies.py:135"}, "properties": {"repobilityId": "dfa9b25a076a0d69", "scanner": "scanner-primary", "fingerprint": "8ad1acc716518c2d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/studies.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-6bb10528125ce747", "level": "error", "message": {"text": "FastAPI PATCH `update_study` without auth dependency \u2014 backend/app/routers/studies.py:189"}, "properties": {"repobilityId": "a78c46e9592bc679", "scanner": "scanner-primary", "fingerprint": "6bb10528125ce747", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/studies.py"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-7f59abc71fae742c", "level": "error", "message": {"text": "FastAPI PUT `update_study` without auth dependency \u2014 backend/app/routers/studies.py:190"}, "properties": {"repobilityId": "8eba188ad34cbb5a", "scanner": "scanner-primary", "fingerprint": "7f59abc71fae742c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/studies.py"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-551a8cb4aabb1e4d", "level": "error", "message": {"text": "FastAPI DELETE `delete_study` without auth dependency \u2014 backend/app/routers/studies.py:239"}, "properties": {"repobilityId": "e040d82fd7992b67", "scanner": "scanner-primary", "fingerprint": "551a8cb4aabb1e4d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/studies.py"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-e195b0b79c708528", "level": "error", "message": {"text": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:185"}, "properties": {"repobilityId": "940af66d23eb5c12", "scanner": "scanner-primary", "fingerprint": "e195b0b79c708528", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/submissions.py"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-536094329b3eadaa", "level": "error", "message": {"text": "FastAPI POST `create_submission` without auth dependency \u2014 backend/app/routers/submissions.py:186"}, "properties": {"repobilityId": "83dae078fe3065e0", "scanner": "scanner-primary", "fingerprint": "536094329b3eadaa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/submissions.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-753a43b3779c6224", "level": "error", "message": {"text": "FastAPI PATCH `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:285"}, "properties": {"repobilityId": "f8a810637f0e0197", "scanner": "scanner-primary", "fingerprint": "753a43b3779c6224", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/submissions.py"}, "region": {"startLine": 285}}}]}, {"ruleId": "scanner-3544d41e00acf6ba", "level": "error", "message": {"text": "FastAPI PUT `update_submission` without auth dependency \u2014 backend/app/routers/submissions.py:286"}, "properties": {"repobilityId": "65fccb2cb2ea09e2", "scanner": "scanner-primary", "fingerprint": "3544d41e00acf6ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/submissions.py"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-71ab69f7e7351717", "level": "error", "message": {"text": "FastAPI DELETE `delete_submission` without auth dependency \u2014 backend/app/routers/submissions.py:344"}, "properties": {"repobilityId": "e6afcd176f7c8218", "scanner": "scanner-primary", "fingerprint": "71ab69f7e7351717", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/submissions.py"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-91e114b556b2f149", "level": "error", "message": {"text": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:185"}, "properties": {"repobilityId": "d8906cd0ea204ae8", "scanner": "scanner-primary", "fingerprint": "91e114b556b2f149", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/products.py"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-c52e23dc2291c955", "level": "error", "message": {"text": "FastAPI POST `create_product` without auth dependency \u2014 backend/app/routers/products.py:186"}, "properties": {"repobilityId": "6f335f83101346fa", "scanner": "scanner-primary", "fingerprint": "c52e23dc2291c955", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/products.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-ada147428ed927b1", "level": "error", "message": {"text": "FastAPI PUT `update_product` without auth dependency \u2014 backend/app/routers/products.py:279"}, "properties": {"repobilityId": "054e6caaf34abe6a", "scanner": "scanner-primary", "fingerprint": "ada147428ed927b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/products.py"}, "region": {"startLine": 279}}}]}, {"ruleId": "scanner-00f1e6a0331c2dbf", "level": "error", "message": {"text": "FastAPI DELETE `delete_product` without auth dependency \u2014 backend/app/routers/products.py:318"}, "properties": {"repobilityId": "14aadb172e2316e2", "scanner": "scanner-primary", "fingerprint": "00f1e6a0331c2dbf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/products.py"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-d1f2d84ac575df8d", "level": "error", "message": {"text": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:163"}, "properties": {"repobilityId": "2f21167d5c49d5ed", "scanner": "scanner-primary", "fingerprint": "d1f2d84ac575df8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/haqs.py"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-d874312c01d6164a", "level": "error", "message": {"text": "FastAPI POST `create_haq` without auth dependency \u2014 backend/app/routers/haqs.py:164"}, "properties": {"repobilityId": "4739d03e9caec1d1", "scanner": "scanner-primary", "fingerprint": "d874312c01d6164a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/haqs.py"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-32d75f7ad1b053c3", "level": "error", "message": {"text": "FastAPI PATCH `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:254"}, "properties": {"repobilityId": "3d83d81acaf7d7b2", "scanner": "scanner-primary", "fingerprint": "32d75f7ad1b053c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/haqs.py"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-e543a3e1f34e2b6b", "level": "error", "message": {"text": "FastAPI PUT `update_haq` without auth dependency \u2014 backend/app/routers/haqs.py:255"}, "properties": {"repobilityId": "2abb8df73032bd4a", "scanner": "scanner-primary", "fingerprint": "e543a3e1f34e2b6b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/haqs.py"}, "region": {"startLine": 255}}}]}, {"ruleId": "scanner-3f7faf4d5ed809f2", "level": "error", "message": {"text": "FastAPI DELETE `delete_haq` without auth dependency \u2014 backend/app/routers/haqs.py:319"}, "properties": {"repobilityId": "ccb5439ab33ac2bb", "scanner": "scanner-primary", "fingerprint": "3f7faf4d5ed809f2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/haqs.py"}, "region": {"startLine": 319}}}]}, {"ruleId": "scanner-db9b21f0d2a5329f", "level": "error", "message": {"text": "FastAPI POST `generate` without auth dependency \u2014 backend/app/routers/ai.py:38"}, "properties": {"repobilityId": "43bd54b4bfaa85b1", "scanner": "scanner-primary", "fingerprint": "db9b21f0d2a5329f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/ai.py"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-105f47620fcbf6be", "level": "error", "message": {"text": "FastAPI POST `haq_rag_synthesize` without auth dependency \u2014 backend/app/routers/ai.py:122"}, "properties": {"repobilityId": "6081738c5491a794", "scanner": "scanner-primary", "fingerprint": "105f47620fcbf6be", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/ai.py"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-22244e2628755995", "level": "error", "message": {"text": "FastAPI POST `section_generate` without auth dependency \u2014 backend/app/routers/ai.py:248"}, "properties": {"repobilityId": "1646ae0ef63604bb", "scanner": "scanner-primary", "fingerprint": "22244e2628755995", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/ai.py"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-7ec4cecd10187473", "level": "error", "message": {"text": "FastAPI POST `inference` without auth dependency \u2014 backend/app/routers/ai.py:422"}, "properties": {"repobilityId": "80471873bf22ca38", "scanner": "scanner-primary", "fingerprint": "7ec4cecd10187473", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/ai.py"}, "region": {"startLine": 422}}}]}, {"ruleId": "scanner-8027d61a38b5aee9", "level": "error", "message": {"text": "FastAPI POST `rag_retrieve` without auth dependency \u2014 backend/app/routers/ai.py:482"}, "properties": {"repobilityId": "fd5c424d07b05a36", "scanner": "scanner-primary", "fingerprint": "8027d61a38b5aee9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/ai.py"}, "region": {"startLine": 482}}}]}, {"ruleId": "scanner-92c4ccc1ec4954e9", "level": "error", "message": {"text": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:151"}, "properties": {"repobilityId": "361ecb5b206f399e", "scanner": "scanner-primary", "fingerprint": "92c4ccc1ec4954e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/documents.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-4ffbef5a8877728c", "level": "error", "message": {"text": "FastAPI POST `create_document` without auth dependency \u2014 backend/app/routers/documents.py:152"}, "properties": {"repobilityId": "c15bae5b5c9b0467", "scanner": "scanner-primary", "fingerprint": "4ffbef5a8877728c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/documents.py"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-e7336b76147ed1c4", "level": "error", "message": {"text": "FastAPI PATCH `update_document` without auth dependency \u2014 backend/app/routers/documents.py:246"}, "properties": {"repobilityId": "4d40bb83f1919505", "scanner": "scanner-primary", "fingerprint": "e7336b76147ed1c4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/documents.py"}, "region": {"startLine": 246}}}]}, {"ruleId": "scanner-50294560365dd425", "level": "error", "message": {"text": "FastAPI PUT `update_document` without auth dependency \u2014 backend/app/routers/documents.py:247"}, "properties": {"repobilityId": "7463b5fd46b32e69", "scanner": "scanner-primary", "fingerprint": "50294560365dd425", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/documents.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-4791885ae78c5783", "level": "error", "message": {"text": "FastAPI DELETE `delete_document` without auth dependency \u2014 backend/app/routers/documents.py:316"}, "properties": {"repobilityId": "a9ac29b75ca59bfb", "scanner": "scanner-primary", "fingerprint": "4791885ae78c5783", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/documents.py"}, "region": {"startLine": 316}}}]}, {"ruleId": "scanner-a9ea032b89e811d4", "level": "error", "message": {"text": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:158"}, "properties": {"repobilityId": "a9ee9ae6065bd867", "scanner": "scanner-primary", "fingerprint": "a9ea032b89e811d4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/safety.py"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-d687dc582b514149", "level": "error", "message": {"text": "FastAPI POST `create_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:159"}, "properties": {"repobilityId": "d6771efade849f7a", "scanner": "scanner-primary", "fingerprint": "d687dc582b514149", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/safety.py"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-97c53bde373b4245", "level": "error", "message": {"text": "FastAPI PATCH `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:240"}, "properties": {"repobilityId": "85dbe5e816f6f730", "scanner": "scanner-primary", "fingerprint": "97c53bde373b4245", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/safety.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-c64647b1f15e1360", "level": "error", "message": {"text": "FastAPI PUT `update_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:241"}, "properties": {"repobilityId": "fcb519152cf6db89", "scanner": "scanner-primary", "fingerprint": "c64647b1f15e1360", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/safety.py"}, "region": {"startLine": 241}}}]}, {"ruleId": "scanner-020917f78600521c", "level": "error", "message": {"text": "FastAPI DELETE `delete_safety_report` without auth dependency \u2014 backend/app/routers/safety.py:314"}, "properties": {"repobilityId": "fa08b93c7b9038ae", "scanner": "scanner-primary", "fingerprint": "020917f78600521c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/routers/safety.py"}, "region": {"startLine": 314}}}]}, {"ruleId": "scanner-344d5b82042e9a33", "level": "error", "message": {"text": "Dangling fetch: GET /api/submissions?${params.toString()} (frontend/src/stores/submissions-store.ts:234)"}, "properties": {"repobilityId": "464e41b48caa5824", "scanner": "scanner-primary", "fingerprint": "344d5b82042e9a33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bac0b492f78b5ac8", "level": "error", "message": {"text": "Dangling fetch: POST /api/submissions (frontend/src/stores/submissions-store.ts:279)"}, "properties": {"repobilityId": "29d055585f30b1a0", "scanner": "scanner-primary", "fingerprint": "bac0b492f78b5ac8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d3ed1efed9a9716", "level": "error", "message": {"text": "Dangling fetch: PUT /api/submissions/${id} (frontend/src/stores/submissions-store.ts:316)"}, "properties": {"repobilityId": "3633391a9143b443", "scanner": "scanner-primary", "fingerprint": "6d3ed1efed9a9716", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e9423ca860c21135", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/submissions/${id} (frontend/src/stores/submissions-store.ts:340)"}, "properties": {"repobilityId": "eeab20945e5857f1", "scanner": "scanner-primary", "fingerprint": "e9423ca860c21135", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-144f800fab6d0b9f", "level": "error", "message": {"text": "Dangling fetch: GET /api/products?${params.toString()} (frontend/src/stores/products-store.ts:89)"}, "properties": {"repobilityId": "2721527f6d41e27b", "scanner": "scanner-primary", "fingerprint": "144f800fab6d0b9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-143633cab9c217dc", "level": "error", "message": {"text": "Dangling fetch: POST /api/products (frontend/src/stores/products-store.ts:131)"}, "properties": {"repobilityId": "de956fcfa6a7e4a7", "scanner": "scanner-primary", "fingerprint": "143633cab9c217dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cba91c819afd9eaa", "level": "error", "message": {"text": "Dangling fetch: PUT /api/products/${id} (frontend/src/stores/products-store.ts:176)"}, "properties": {"repobilityId": "6783f1796e5be82a", "scanner": "scanner-primary", "fingerprint": "cba91c819afd9eaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2872b14cb284709c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/products/${id} (frontend/src/stores/products-store.ts:199)"}, "properties": {"repobilityId": "c74b3c541c657d70", "scanner": "scanner-primary", "fingerprint": "2872b14cb284709c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-76d6729d9ce18b1b", "level": "error", "message": {"text": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/stores/document-store.ts:204)"}, "properties": {"repobilityId": "dae43bfc47919494", "scanner": "scanner-primary", "fingerprint": "76d6729d9ce18b1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02b68ae08dfcfa41", "level": "error", "message": {"text": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:253)"}, "properties": {"repobilityId": "379f1eb2e4bbf041", "scanner": "scanner-primary", "fingerprint": "02b68ae08dfcfa41", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd4930dcc39f19cf", "level": "error", "message": {"text": "Dangling fetch: POST /api/documents (frontend/src/stores/document-store.ts:276)"}, "properties": {"repobilityId": "2b8cffcef58f8c0c", "scanner": "scanner-primary", "fingerprint": "bd4930dcc39f19cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da83f945dcc5ad9b", "level": "error", "message": {"text": "Dangling fetch: PUT /api/documents/${id} (frontend/src/stores/document-store.ts:316)"}, "properties": {"repobilityId": "3eeee2e77b0c3a3c", "scanner": "scanner-primary", "fingerprint": "da83f945dcc5ad9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-129c4224ff1d7c3c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/documents/${id} (frontend/src/stores/document-store.ts:335)"}, "properties": {"repobilityId": "a840b1ffb044c9fa", "scanner": "scanner-primary", "fingerprint": "129c4224ff1d7c3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bcebd0a4dbbca11", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/session (frontend/src/components/layout/Header.tsx:116)"}, "properties": {"repobilityId": "37e706e28ddade6f", "scanner": "scanner-primary", "fingerprint": "1bcebd0a4dbbca11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eef9355962f82572", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (frontend/src/components/layout/Header.tsx:141)"}, "properties": {"repobilityId": "839360f82955c17d", "scanner": "scanner-primary", "fingerprint": "eef9355962f82572", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-926b54d7e6a6a735", "level": "error", "message": {"text": "Dangling fetch: POST /api/safety/aggregate-reports (frontend/src/components/safety/AggregateReportGenerationPanel.tsx:256)"}, "properties": {"repobilityId": "9e9da96c3e6ffc90", "scanner": "scanner-primary", "fingerprint": "926b54d7e6a6a735", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2270c9da18c335de", "level": "error", "message": {"text": "Dangling fetch: POST /api/safety/e2b-xml (frontend/src/components/safety/XMLPreviewPanel.tsx:107)"}, "properties": {"repobilityId": "caae6eb7e98a8731", "scanner": "scanner-primary", "fingerprint": "2270c9da18c335de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a786b46dea369b6", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:823)"}, "properties": {"repobilityId": "43499954fa8ebeec", "scanner": "scanner-primary", "fingerprint": "4a786b46dea369b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c19ab816d1a05fed", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/authoring/DocumentEditor.tsx:906)"}, "properties": {"repobilityId": "8b9883d6b1fe8369", "scanner": "scanner-primary", "fingerprint": "c19ab816d1a05fed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af4bc44ffaa96f12", "level": "error", "message": {"text": "Dangling fetch: GET /api/metrics (frontend/src/components/monitoring/ObservabilityDashboard.tsx:201)"}, "properties": {"repobilityId": "e09585c44b78f5dd", "scanner": "scanner-primary", "fingerprint": "af4bc44ffaa96f12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d2d02d8d650b28e", "level": "error", "message": {"text": "Dangling fetch: GET /api/errors?limit=10 (frontend/src/components/monitoring/ObservabilityDashboard.tsx:202)"}, "properties": {"repobilityId": "48d83a9cdc9fe202", "scanner": "scanner-primary", "fingerprint": "4d2d02d8d650b28e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-caf5e4eab036bb8c", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/ai/AIDocumentGeneratorPanel.tsx:700)"}, "properties": {"repobilityId": "2a7d6974077b4531", "scanner": "scanner-primary", "fingerprint": "caf5e4eab036bb8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-96f87464fb1c6d03", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:573)"}, "properties": {"repobilityId": "4cc2da1573d6c09a", "scanner": "scanner-primary", "fingerprint": "96f87464fb1c6d03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-060b8a76f5519a13", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/glp-data-integrity (frontend/src/components/glp/GLPEDCIntegrationTab.tsx:622)"}, "properties": {"repobilityId": "264f44f91cacc923", "scanner": "scanner-primary", "fingerprint": "060b8a76f5519a13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-49e6225190408cf8", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (frontend/src/components/ui/FileUpload.tsx:315)"}, "properties": {"repobilityId": "16e1d95cb4285c7e", "scanner": "scanner-primary", "fingerprint": "49e6225190408cf8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8568f719792fdb5", "level": "error", "message": {"text": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/QMSScreen.tsx:2246)"}, "properties": {"repobilityId": "7914168ac521eb03", "scanner": "scanner-primary", "fingerprint": "c8568f719792fdb5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1240a9cc127adf0f", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:646)"}, "properties": {"repobilityId": "bc42212bcab8f029", "scanner": "scanner-primary", "fingerprint": "1240a9cc127adf0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8dcc9cea24a5f543", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/ind-gap-analysis (frontend/src/components/screens/ResearchScreen.tsx:666)"}, "properties": {"repobilityId": "bea85634eddb2adb", "scanner": "scanner-primary", "fingerprint": "8dcc9cea24a5f543", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e183d2ee88c5bce", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:688)"}, "properties": {"repobilityId": "6da97d72ccdca042", "scanner": "scanner-primary", "fingerprint": "3e183d2ee88c5bce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-50ed7c1509b23134", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:715)"}, "properties": {"repobilityId": "a06a6953f36e28e5", "scanner": "scanner-primary", "fingerprint": "50ed7c1509b23134", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60448e0e3ab16ec5", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/research-intelligence (frontend/src/components/screens/ResearchScreen.tsx:820)"}, "properties": {"repobilityId": "2bd26f0c446b2c6f", "scanner": "scanner-primary", "fingerprint": "60448e0e3ab16ec5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0062add8dacd7ff2", "level": "error", "message": {"text": "Dangling fetch: GET /api/idmp/products (frontend/src/components/screens/IDMPDashboard.tsx:44)"}, "properties": {"repobilityId": "1425b9fe006a06ce", "scanner": "scanner-primary", "fingerprint": "0062add8dacd7ff2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2017fad977434fe2", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2326)"}, "properties": {"repobilityId": "a23f6ed8d3f5e1f7", "scanner": "scanner-primary", "fingerprint": "2017fad977434fe2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c01819a24d2a07e4", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/RDArchivesScreen.tsx:2575)"}, "properties": {"repobilityId": "678a56bb54ada7c6", "scanner": "scanner-primary", "fingerprint": "c01819a24d2a07e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9818f76a58da3607", "level": "error", "message": {"text": "Dangling fetch: POST /api/cross-module (frontend/src/components/screens/RDArchivesScreen.tsx:2579)"}, "properties": {"repobilityId": "8ad6ad0b1e426d67", "scanner": "scanner-primary", "fingerprint": "9818f76a58da3607", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf5246b5f0d2735d", "level": "error", "message": {"text": "Dangling fetch: GET /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1486)"}, "properties": {"repobilityId": "23f2dc9ca6d5d36b", "scanner": "scanner-primary", "fingerprint": "cf5246b5f0d2735d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c081eba93fca88c", "level": "error", "message": {"text": "Dangling fetch: POST /api/biostats/sdtm-validation (frontend/src/components/screens/BiostatsScreen.tsx:1931)"}, "properties": {"repobilityId": "704e337cf64957e8", "scanner": "scanner-primary", "fingerprint": "3c081eba93fca88c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-191d3308634e7993", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/components/screens/BiostatsScreen.tsx:2485)"}, "properties": {"repobilityId": "a7256615fdc50f7a", "scanner": "scanner-primary", "fingerprint": "191d3308634e7993", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67d1287c9f723555", "level": "error", "message": {"text": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:316)"}, "properties": {"repobilityId": "315ebc157024f3a6", "scanner": "scanner-primary", "fingerprint": "67d1287c9f723555", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0decc804643a1512", "level": "error", "message": {"text": "Dangling fetch: POST /api/users/invite (frontend/src/components/screens/AdminScreen.tsx:1194)"}, "properties": {"repobilityId": "421eba22f090795d", "scanner": "scanner-primary", "fingerprint": "0decc804643a1512", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a0b8e4c1d6b95d2", "level": "error", "message": {"text": "Dangling fetch: GET /api/users (frontend/src/components/screens/AdminScreen.tsx:1207)"}, "properties": {"repobilityId": "3ac064b78a19e0a6", "scanner": "scanner-primary", "fingerprint": "5a0b8e4c1d6b95d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da84faee7ddd8aaa", "level": "error", "message": {"text": "Dangling fetch: POST /api/safety/narrative (frontend/src/components/screens/SafetyScreen.tsx:1295)"}, "properties": {"repobilityId": "dab0940242dcfdd7", "scanner": "scanner-primary", "fingerprint": "da84faee7ddd8aaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5d85df077d6d6a01", "level": "error", "message": {"text": "Dangling fetch: POST /api/signatures (frontend/src/components/screens/SafetyScreen.tsx:3246)"}, "properties": {"repobilityId": "9fabf4b0e0c9b3d1", "scanner": "scanner-primary", "fingerprint": "5d85df077d6d6a01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46852a353ef0c42a", "level": "error", "message": {"text": "Dangling fetch: POST /api/safety/report (frontend/src/components/screens/SignalDetectionScreen.tsx:392)"}, "properties": {"repobilityId": "556fda6497cc76f9", "scanner": "scanner-primary", "fingerprint": "46852a353ef0c42a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8fb305bea88292c0", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit (frontend/src/components/screens/CreateModals.tsx:531)"}, "properties": {"repobilityId": "a66398b7b9d04d59", "scanner": "scanner-primary", "fingerprint": "8fb305bea88292c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ee7c46c2bc29c550", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit/export?format=csv (frontend/src/components/screens/CreateModals.tsx:561)"}, "properties": {"repobilityId": "44d0600cd08eb494", "scanner": "scanner-primary", "fingerprint": "ee7c46c2bc29c550", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b06230e9ebe0000f", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/runs/${req.agentRunId} (frontend/src/components/screens/AgentHubScreen.tsx:470)"}, "properties": {"repobilityId": "69b3a7371aa7cfd9", "scanner": "scanner-primary", "fingerprint": "b06230e9ebe0000f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f21ce4253377f9a", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:480)"}, "properties": {"repobilityId": "650c6d5bff7aaf15", "scanner": "scanner-primary", "fingerprint": "1f21ce4253377f9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d8e24c2fb463146c", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:486)"}, "properties": {"repobilityId": "4120829f66f89e5a", "scanner": "scanner-primary", "fingerprint": "d8e24c2fb463146c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0d8e634650de0a8", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:744)"}, "properties": {"repobilityId": "9ae85058e36d7802", "scanner": "scanner-primary", "fingerprint": "e0d8e634650de0a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3bec159235fa2824", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/AgentHubScreen.tsx:772)"}, "properties": {"repobilityId": "c30f5722c936450b", "scanner": "scanner-primary", "fingerprint": "3bec159235fa2824", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ebb5a0e3651eb46", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1084)"}, "properties": {"repobilityId": "245ad903a660941e", "scanner": "scanner-primary", "fingerprint": "4ebb5a0e3651eb46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ab31a51874d8825", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/proactive?include_scans=true (frontend/src/components/screens/AgentHubScreen.tsx:1258)"}, "properties": {"repobilityId": "a0929c8bc31aeb11", "scanner": "scanner-primary", "fingerprint": "7ab31a51874d8825", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abf2e0cbdc15034d", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/proactive/scan (frontend/src/components/screens/AgentHubScreen.tsx:1272)"}, "properties": {"repobilityId": "ccd1afbfa5705827", "scanner": "scanner-primary", "fingerprint": "abf2e0cbdc15034d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb49e99543427992", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/agents/proactive/${id} (frontend/src/components/screens/AgentHubScreen.tsx:1283)"}, "properties": {"repobilityId": "169e3d1770a3ba53", "scanner": "scanner-primary", "fingerprint": "cb49e99543427992", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df961eeec9424185", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1493)"}, "properties": {"repobilityId": "1836407884545fc6", "scanner": "scanner-primary", "fingerprint": "df961eeec9424185", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b37c3024ff65374", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/review/${req.id} (frontend/src/components/screens/AgentHubScreen.tsx:1823)"}, "properties": {"repobilityId": "2420dd7d77277eb3", "scanner": "scanner-primary", "fingerprint": "1b37c3024ff65374", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-09fef56fa1b04d5c", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:1828)"}, "properties": {"repobilityId": "19b38c5f15bb7070", "scanner": "scanner-primary", "fingerprint": "09fef56fa1b04d5c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0702adca20b5ffcd", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/AgentHubScreen.tsx:1994)"}, "properties": {"repobilityId": "5a55b1263295484a", "scanner": "scanner-primary", "fingerprint": "0702adca20b5ffcd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8aaf41aa89c7ba1", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/review/${run.reviewRequestId} (frontend/src/components/screens/AgentHubScreen.tsx:2140)"}, "properties": {"repobilityId": "06d75b39cff37c43", "scanner": "scanner-primary", "fingerprint": "c8aaf41aa89c7ba1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6dd207827db7ae8e", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/review/${reviewReq.id} (frontend/src/components/screens/AgentHubScreen.tsx:2151)"}, "properties": {"repobilityId": "bfadcd73e1803334", "scanner": "scanner-primary", "fingerprint": "6dd207827db7ae8e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6b894fa188c6e9d", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/learning (frontend/src/components/screens/AgentHubScreen.tsx:2156)"}, "properties": {"repobilityId": "7e81531763fcb701", "scanner": "scanner-primary", "fingerprint": "e6b894fa188c6e9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-897f583882438477", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/runs (frontend/src/components/screens/AgentHubScreen.tsx:2444)"}, "properties": {"repobilityId": "0d7df99b025392f5", "scanner": "scanner-primary", "fingerprint": "897f583882438477", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc7acdc4b69080a7", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/review?status=pending (frontend/src/components/screens/AgentHubScreen.tsx:2445)"}, "properties": {"repobilityId": "f426da6722076127", "scanner": "scanner-primary", "fingerprint": "bc7acdc4b69080a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0893955fc0328a64", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/components/screens/HAQScreen.tsx:870)"}, "properties": {"repobilityId": "c2b9c17d7aadcea9", "scanner": "scanner-primary", "fingerprint": "0893955fc0328a64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abe41a13a09114ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/haq/report (frontend/src/components/screens/HAQScreen.tsx:995)"}, "properties": {"repobilityId": "c5b603431063f3b6", "scanner": "scanner-primary", "fingerprint": "abe41a13a09114ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff84891b806bea63", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/cascade (frontend/src/components/screens/RDConnectedScreen.tsx:574)"}, "properties": {"repobilityId": "8f03e450f2c7170c", "scanner": "scanner-primary", "fingerprint": "ff84891b806bea63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-712c050c749b053a", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/trigger (frontend/src/components/screens/RDConnectedScreen.tsx:590)"}, "properties": {"repobilityId": "d853bfcd3e6867c0", "scanner": "scanner-primary", "fingerprint": "712c050c749b053a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf3220d8d21a84eb", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1542)"}, "properties": {"repobilityId": "019109eb51e2746b", "scanner": "scanner-primary", "fingerprint": "bf3220d8d21a84eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4326eeb2202504f3", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit/verify-chain (frontend/src/components/screens/AuditTrailDashboard.tsx:1558)"}, "properties": {"repobilityId": "8bbc500f47bb7122", "scanner": "scanner-primary", "fingerprint": "4326eeb2202504f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60f9c687c88dc306", "level": "error", "message": {"text": "Dangling fetch: GET /api/audit/export?format=${fmt} (frontend/src/components/screens/AuditTrailDashboard.tsx:1573)"}, "properties": {"repobilityId": "aa62bae2e7f1d644", "scanner": "scanner-primary", "fingerprint": "60f9c687c88dc306", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5eb3b27ed4ac343", "level": "error", "message": {"text": "Dangling fetch: GET /api/signatures?limit=100 (frontend/src/components/screens/AuditTrailDashboard.tsx:1596)"}, "properties": {"repobilityId": "cbf0df0dabb82c8a", "scanner": "scanner-primary", "fingerprint": "e5eb3b27ed4ac343", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab30797b7a965de0", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1742)"}, "properties": {"repobilityId": "13c5fc47deedf35d", "scanner": "scanner-primary", "fingerprint": "ab30797b7a965de0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe1a4bb4b7ec89cf", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/usdm-protocol-assist (frontend/src/components/screens/StudyDesignScreen.tsx:1766)"}, "properties": {"repobilityId": "0168810f79e6dd29", "scanner": "scanner-primary", "fingerprint": "fe1a4bb4b7ec89cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a8815429fcec37de", "level": "error", "message": {"text": "Dangling fetch: POST /api/submissions/compile (frontend/src/components/publishing/SubmissionPackageBuilder.tsx:132)"}, "properties": {"repobilityId": "da2339786c0e7718", "scanner": "scanner-primary", "fingerprint": "a8815429fcec37de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0e33ab4060a3bf6", "level": "error", "message": {"text": "Dangling fetch: POST /api/submissions/global-plan (frontend/src/components/submissions/GlobalSubmissionPlanWizard.tsx:961)"}, "properties": {"repobilityId": "d1564e1a8b580313", "scanner": "scanner-primary", "fingerprint": "e0e33ab4060a3bf6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38ad6cdb6f18393f", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/qc?${params.toString()} (frontend/src/components/tmf/TMFQCDashboard.tsx:180)"}, "properties": {"repobilityId": "acf4d115aa94fa33", "scanner": "scanner-primary", "fingerprint": "38ad6cdb6f18393f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-28dbdac88881d8d5", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tmf/qc/${itemId} (frontend/src/components/tmf/TMFQCDashboard.tsx:222)"}, "properties": {"repobilityId": "9eb1bb756a7b5250", "scanner": "scanner-primary", "fingerprint": "28dbdac88881d8d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e48142374329412", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/auto-link?type=rules (frontend/src/components/tmf/AutoLinkDashboard.tsx:125)"}, "properties": {"repobilityId": "079c27f9a2ffc889", "scanner": "scanner-primary", "fingerprint": "6e48142374329412", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f333ee60371cab0", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/components/tmf/TMFCompletenessDashboard.tsx:107)"}, "properties": {"repobilityId": "61d7bd658f5fab10", "scanner": "scanner-primary", "fingerprint": "3f333ee60371cab0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d429f63e0b36f04", "level": "error", "message": {"text": "Dangling fetch: POST /api/smart-submissions (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:110)"}, "properties": {"repobilityId": "5b6fb1e7860f627b", "scanner": "scanner-primary", "fingerprint": "7d429f63e0b36f04", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc413abde7b33fa1", "level": "error", "message": {"text": "Dangling fetch: POST /api/smart-submissions/pdfa3 (frontend/src/components/smart-submissions/SmartDocumentGenerator.tsx:210)"}, "properties": {"repobilityId": "438e7812b1088dc3", "scanner": "scanner-primary", "fingerprint": "bc413abde7b33fa1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f8b50e6e6ca216e", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/lib/ai-assistant.tsx:103)"}, "properties": {"repobilityId": "5435ec385a62c1d8", "scanner": "scanner-primary", "fingerprint": "5f8b50e6e6ca216e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8b76d240d32699d", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai/section-generate (frontend/src/lib/demo-generation-fallback.ts:493)"}, "properties": {"repobilityId": "d8e173b94acf7eab", "scanner": "scanner-primary", "fingerprint": "c8b76d240d32699d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ac71addda0402bda", "level": "error", "message": {"text": "Dangling fetch: POST /api/users/invite/accept (frontend/src/pages/InvitePage.tsx:49)"}, "properties": {"repobilityId": "6cc2533210d01cd0", "scanner": "scanner-primary", "fingerprint": "ac71addda0402bda", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98cf4ae24ad825c4", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/stream-spike (frontend/src/pages/SpikeStreamingPage.tsx:86)"}, "properties": {"repobilityId": "9f10bd9cb57f2f5c", "scanner": "scanner-primary", "fingerprint": "98cf4ae24ad825c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e418e750d7626c0a", "level": "error", "message": {"text": "Dangling fetch: POST /api/glp/edc-link (frontend/src/hooks/useGLPEDCPersistence.ts:164)"}, "properties": {"repobilityId": "039812012f8c6578", "scanner": "scanner-primary", "fingerprint": "e418e750d7626c0a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-beaf32a1409ad68b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/glp/edc-link?id=${encodeURIComponent(id)} (frontend/src/hooks/useGLPEDCPersistence.ts:191)"}, "properties": {"repobilityId": "fb6b0b4467b9470a", "scanner": "scanner-primary", "fingerprint": "beaf32a1409ad68b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51e507135e6b5945", "level": "error", "message": {"text": "Dangling fetch: POST /api/glp/edc-sync (frontend/src/hooks/useGLPEDCPersistence.ts:203)"}, "properties": {"repobilityId": "3bac2a8066652426", "scanner": "scanner-primary", "fingerprint": "51e507135e6b5945", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5f41793acaec839", "level": "error", "message": {"text": "Dangling fetch: POST /api/documents/ingest (frontend/src/hooks/usePDFIngestion.tsx:160)"}, "properties": {"repobilityId": "0b86ed00a98ee7f7", "scanner": "scanner-primary", "fingerprint": "e5f41793acaec839", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-45e9145ddeb6557e", "level": "error", "message": {"text": "Dangling fetch: GET /api/haqs/${haqId}/audit?limit=${limit} (frontend/src/hooks/useHAQAuditTrail.ts:76)"}, "properties": {"repobilityId": "66beed6854f28655", "scanner": "scanner-primary", "fingerprint": "45e9145ddeb6557e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21b73aca11834fb7", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:330)"}, "properties": {"repobilityId": "6442845b3fb03b65", "scanner": "scanner-primary", "fingerprint": "21b73aca11834fb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35c4d5394ca987c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-narrative (frontend/src/hooks/useSafetyNarrativeRAG.ts:434)"}, "properties": {"repobilityId": "6816d43dfdb59b97", "scanner": "scanner-primary", "fingerprint": "35c4d5394ca987c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99d19f2dbda65f7b", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useSectionGeneration.ts:194)"}, "properties": {"repobilityId": "2bed8bbdb860667c", "scanner": "scanner-primary", "fingerprint": "99d19f2dbda65f7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52a11997e03c1094", "level": "error", "message": {"text": "Dangling fetch: GET /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:108)"}, "properties": {"repobilityId": "69862d8ad290b949", "scanner": "scanner-primary", "fingerprint": "52a11997e03c1094", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-22d0078b11cac859", "level": "error", "message": {"text": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:216)"}, "properties": {"repobilityId": "8db5e41dbc858bae", "scanner": "scanner-primary", "fingerprint": "22d0078b11cac859", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3eadd74f272e524", "level": "error", "message": {"text": "Dangling fetch: POST /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:230)"}, "properties": {"repobilityId": "3947467e56efe3b5", "scanner": "scanner-primary", "fingerprint": "f3eadd74f272e524", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f22b4365d885a237", "level": "error", "message": {"text": "Dangling fetch: POST /api/haqs/${haqId}/audit (frontend/src/hooks/useHAQReviews.ts:287)"}, "properties": {"repobilityId": "f502e72cad1c52af", "scanner": "scanner-primary", "fingerprint": "f22b4365d885a237", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a0fa195cc479436", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/haqs/${haqId}/reviews (frontend/src/hooks/useHAQReviews.ts:301)"}, "properties": {"repobilityId": "937f5d167f2ff4fd", "scanner": "scanner-primary", "fingerprint": "6a0fa195cc479436", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ae43fc78dab4df29", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/artifacts?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:91)"}, "properties": {"repobilityId": "02272aeb46502b17", "scanner": "scanner-primary", "fingerprint": "ae43fc78dab4df29", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2289c8ee1b5539ea", "level": "error", "message": {"text": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:120)"}, "properties": {"repobilityId": "f13a9ccb7dddf657", "scanner": "scanner-primary", "fingerprint": "2289c8ee1b5539ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0d2dd8cf323fd45", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:151)"}, "properties": {"repobilityId": "172ed4e6de0f4d3a", "scanner": "scanner-primary", "fingerprint": "d0d2dd8cf323fd45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6d9b96370df2790", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tmf/artifacts/${id} (frontend/src/hooks/useTMFPersistence.ts:208)"}, "properties": {"repobilityId": "8716a80c5908f494", "scanner": "scanner-primary", "fingerprint": "d6d9b96370df2790", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3f04009139dfd29", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/zones${params} (frontend/src/hooks/useTMFPersistence.ts:243)"}, "properties": {"repobilityId": "8e9d184b15368a4f", "scanner": "scanner-primary", "fingerprint": "d3f04009139dfd29", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-293178ff16d8d67d", "level": "error", "message": {"text": "Dangling fetch: GET /api/tmf/gaps?${params.toString()} (frontend/src/hooks/useTMFPersistence.ts:280)"}, "properties": {"repobilityId": "e348377bcd5a84a3", "scanner": "scanner-primary", "fingerprint": "293178ff16d8d67d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-457d50cc58472eee", "level": "error", "message": {"text": "Dangling fetch: POST /api/tmf/gaps (frontend/src/hooks/useTMFPersistence.ts:322)"}, "properties": {"repobilityId": "67d5beafe35f10e5", "scanner": "scanner-primary", "fingerprint": "457d50cc58472eee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65861b802d1f783a", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:363)"}, "properties": {"repobilityId": "cbd5ad62ac8410d1", "scanner": "scanner-primary", "fingerprint": "65861b802d1f783a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e899d231d89a086", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tmf/gaps/${id} (frontend/src/hooks/useTMFPersistence.ts:399)"}, "properties": {"repobilityId": "6d54e5b759549f8f", "scanner": "scanner-primary", "fingerprint": "2e899d231d89a086", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5480c0d33bf59b6a", "level": "error", "message": {"text": "Dangling fetch: POST /api/tmf/artifacts (frontend/src/hooks/useTMFPersistence.ts:430)"}, "properties": {"repobilityId": "855669f261351549", "scanner": "scanner-primary", "fingerprint": "5480c0d33bf59b6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0cac0093004158c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:143)"}, "properties": {"repobilityId": "9f5262767015e0a7", "scanner": "scanner-primary", "fingerprint": "0cac0093004158c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b8492df5ed1d3c2", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/haq-rag (frontend/src/hooks/useHAQRAG.ts:223)"}, "properties": {"repobilityId": "e5b51cdf70205e44", "scanner": "scanner-primary", "fingerprint": "5b8492df5ed1d3c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24b9f81bd49c1858", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/document-qc (frontend/src/hooks/useDocumentQC.ts:166)"}, "properties": {"repobilityId": "7a293ded59a9e59b", "scanner": "scanner-primary", "fingerprint": "24b9f81bd49c1858", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2edeaea7e8dbee4", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:47)"}, "properties": {"repobilityId": "d068bf488bf7a89d", "scanner": "scanner-primary", "fingerprint": "f2edeaea7e8dbee4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b2689124487e3b8", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:135)"}, "properties": {"repobilityId": "4cb8543d2326926a", "scanner": "scanner-primary", "fingerprint": "2b2689124487e3b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-957280375ca6d903", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai/generate (frontend/src/hooks/useAIService.ts:209)"}, "properties": {"repobilityId": "b4bb9836f77d0c1e", "scanner": "scanner-primary", "fingerprint": "957280375ca6d903", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec6c5de21ab7ff4d", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (frontend/src/hooks/useAIService.ts:230)"}, "properties": {"repobilityId": "d366e539c7fd8117", "scanner": "scanner-primary", "fingerprint": "ec6c5de21ab7ff4d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5e7721d1a68b6d6f", "level": "error", "message": {"text": "Dangling fetch: GET /api/document-control/review-cycles?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:77)"}, "properties": {"repobilityId": "e9ea6955e0ba97d2", "scanner": "scanner-primary", "fingerprint": "5e7721d1a68b6d6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08a4151e1c3864af", "level": "error", "message": {"text": "Dangling fetch: POST /api/document-control/review-cycles (frontend/src/hooks/useDocumentControlPersistence.ts:120)"}, "properties": {"repobilityId": "c2392a4c0d3cf359", "scanner": "scanner-primary", "fingerprint": "08a4151e1c3864af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-40a8d18ca6a36c2d", "level": "error", "message": {"text": "Dangling fetch: GET /api/document-control/workflows?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:157)"}, "properties": {"repobilityId": "b09f063ce8b5cce3", "scanner": "scanner-primary", "fingerprint": "40a8d18ca6a36c2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94e682e7a04c2252", "level": "error", "message": {"text": "Dangling fetch: POST /api/document-control/workflows (frontend/src/hooks/useDocumentControlPersistence.ts:205)"}, "properties": {"repobilityId": "30b718bba2076afd", "scanner": "scanner-primary", "fingerprint": "94e682e7a04c2252", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a8a3607f66e6751", "level": "error", "message": {"text": "Dangling fetch: GET /api/document-control/templates?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:243)"}, "properties": {"repobilityId": "df0fcad3ee752805", "scanner": "scanner-primary", "fingerprint": "7a8a3607f66e6751", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad52921ae4dc4576", "level": "error", "message": {"text": "Dangling fetch: POST /api/document-control/templates (frontend/src/hooks/useDocumentControlPersistence.ts:295)"}, "properties": {"repobilityId": "2644cd53cf302967", "scanner": "scanner-primary", "fingerprint": "ad52921ae4dc4576", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd3c7a7694c2482f", "level": "error", "message": {"text": "Dangling fetch: GET /api/document-control/archives?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:333)"}, "properties": {"repobilityId": "51b086e52a7ce662", "scanner": "scanner-primary", "fingerprint": "dd3c7a7694c2482f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e99889e2066f1ada", "level": "error", "message": {"text": "Dangling fetch: POST /api/document-control/archives (frontend/src/hooks/useDocumentControlPersistence.ts:377)"}, "properties": {"repobilityId": "d18af0b485e872c6", "scanner": "scanner-primary", "fingerprint": "e99889e2066f1ada", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31b0c0eeb585fb8d", "level": "error", "message": {"text": "Dangling fetch: GET /api/documents?${params.toString()} (frontend/src/hooks/useDocumentControlPersistence.ts:423)"}, "properties": {"repobilityId": "ecfcdd3c097efce0", "scanner": "scanner-primary", "fingerprint": "31b0c0eeb585fb8d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bb7ff313f0dc50e4", "level": "error", "message": {"text": "Dangling fetch: POST /api/documents (frontend/src/hooks/useDocumentControlPersistence.ts:460)"}, "properties": {"repobilityId": "42097189cbeef70f", "scanner": "scanner-primary", "fingerprint": "bb7ff313f0dc50e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9d075f1b890daf0", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/documents/${id} (frontend/src/hooks/useDocumentControlPersistence.ts:501)"}, "properties": {"repobilityId": "5ca89567c07ee18b", "scanner": "scanner-primary", "fingerprint": "a9d075f1b890daf0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30e34d6b9e18df00", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-signal (frontend/src/hooks/useSignalAnalysis.ts:161)"}, "properties": {"repobilityId": "4b86a76c981d2882", "scanner": "scanner-primary", "fingerprint": "30e34d6b9e18df00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9f81c372ef324ebb", "level": "error", "message": {"text": "Dangling fetch: GET /api/submissions?limit=50 (frontend/src/hooks/useSubmissionsHubData.ts:99)"}, "properties": {"repobilityId": "7b9c5d5613ccbc10", "scanner": "scanner-primary", "fingerprint": "9f81c372ef324ebb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d13431c715ed8079", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/session (frontend/src/hooks/useAuth.ts:76)"}, "properties": {"repobilityId": "c43c897604f145c7", "scanner": "scanner-primary", "fingerprint": "d13431c715ed8079", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df5c0f44d273ae1d", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (frontend/src/hooks/useAuth.ts:129)"}, "properties": {"repobilityId": "ed1765afccaeea83", "scanner": "scanner-primary", "fingerprint": "df5c0f44d273ae1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ebb4633219a392b", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (frontend/src/hooks/useAuth.ts:203)"}, "properties": {"repobilityId": "18800ae3ca5e54b1", "scanner": "scanner-primary", "fingerprint": "1ebb4633219a392b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b9dfc12725dec6a", "level": "error", "message": {"text": "Dangling fetch: GET /api/submissions/lifecycle?${params.toString()} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:168)"}, "properties": {"repobilityId": "bd0ec6ec19e39632", "scanner": "scanner-primary", "fingerprint": "3b9dfc12725dec6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2cc4756b29d7546f", "level": "error", "message": {"text": "Dangling fetch: GET /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:205)"}, "properties": {"repobilityId": "b3994b2fc756707f", "scanner": "scanner-primary", "fingerprint": "2cc4756b29d7546f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9763589be07ba18e", "level": "error", "message": {"text": "Dangling fetch: POST /api/submissions/lifecycle (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:240)"}, "properties": {"repobilityId": "3f6a6025b02a5d50", "scanner": "scanner-primary", "fingerprint": "9763589be07ba18e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ced67af3dd9a384", "level": "error", "message": {"text": "Dangling fetch: PUT /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:278)"}, "properties": {"repobilityId": "7a4c30c5a1c7dbda", "scanner": "scanner-primary", "fingerprint": "0ced67af3dd9a384", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f566d1817684f68c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/submissions/lifecycle/${id} (frontend/src/hooks/useSubmissionLifecyclePersistence.ts:313)"}, "properties": {"repobilityId": "8ed5616c57806e62", "scanner": "scanner-primary", "fingerprint": "f566d1817684f68c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90ea85baae249406", "level": "error", "message": {"text": "Dangling fetch: POST /api/eln/experiments/${id}/sign (frontend/src/hooks/useELNPersistence.ts:192)"}, "properties": {"repobilityId": "a96fbf78e3539ec1", "scanner": "scanner-primary", "fingerprint": "90ea85baae249406", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04b1bb316b27cdd7", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/batch-section (frontend/src/hooks/useBatchGeneration.ts:204)"}, "properties": {"repobilityId": "893d633d85ca3cc3", "scanner": "scanner-primary", "fingerprint": "04b1bb316b27cdd7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19cdf0af5ef61ef7", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/runs (frontend/src/hooks/useLixAgent.ts:119)"}, "properties": {"repobilityId": "91c4bc0b2c937e75", "scanner": "scanner-primary", "fingerprint": "19cdf0af5ef61ef7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-70e8b48f7856e374", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:170)"}, "properties": {"repobilityId": "27b7ecc95770417b", "scanner": "scanner-primary", "fingerprint": "70e8b48f7856e374", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11a8df8f060b1974", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:210)"}, "properties": {"repobilityId": "a52d1165527b4cf0", "scanner": "scanner-primary", "fingerprint": "11a8df8f060b1974", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df6788d424be98a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:245)"}, "properties": {"repobilityId": "f1bb52277d004a6c", "scanner": "scanner-primary", "fingerprint": "df6788d424be98a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1cfe9a9258c1afbe", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/safety-intelligence (frontend/src/hooks/useSafetyIntelligence.ts:286)"}, "properties": {"repobilityId": "4eb819b922b690a9", "scanner": "scanner-primary", "fingerprint": "1cfe9a9258c1afbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f085baca91859e25", "level": "error", "message": {"text": "Dangling fetch: GET /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:54)"}, "properties": {"repobilityId": "4416dc0ca65a8000", "scanner": "scanner-primary", "fingerprint": "f085baca91859e25", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-978653f226336bdd", "level": "error", "message": {"text": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:70)"}, "properties": {"repobilityId": "da678d911b3018b2", "scanner": "scanner-primary", "fingerprint": "978653f226336bdd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2369c2806fcbdb94", "level": "error", "message": {"text": "Dangling fetch: POST /api/citations/check (frontend/src/hooks/useCitationMonitor.ts:94)"}, "properties": {"repobilityId": "23c890d303cde5ff", "scanner": "scanner-primary", "fingerprint": "2369c2806fcbdb94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f89d7ed1768c439", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/section-generate (frontend/src/hooks/useBatchSectionGeneration.ts:418)"}, "properties": {"repobilityId": "b48fa4a5acaeb38e", "scanner": "scanner-primary", "fingerprint": "5f89d7ed1768c439", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed00c76981024809", "level": "error", "message": {"text": "Dangling fetch: GET /api/authoring/documents?${params.toString()} (frontend/src/hooks/useAuthoringPersistence.ts:159)"}, "properties": {"repobilityId": "a78379d1a31b5e7e", "scanner": "scanner-primary", "fingerprint": "ed00c76981024809", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52c64404a300480a", "level": "error", "message": {"text": "Dangling fetch: GET /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:193)"}, "properties": {"repobilityId": "915df8d5d15d2794", "scanner": "scanner-primary", "fingerprint": "52c64404a300480a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ed4811be0086967", "level": "error", "message": {"text": "Dangling fetch: POST /api/authoring/documents (frontend/src/hooks/useAuthoringPersistence.ts:225)"}, "properties": {"repobilityId": "dd5dcb76b80b81f7", "scanner": "scanner-primary", "fingerprint": "5ed4811be0086967", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-156ffa2eb0607e20", "level": "error", "message": {"text": "Dangling fetch: PUT /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:263)"}, "properties": {"repobilityId": "2a2278f6022fc8bf", "scanner": "scanner-primary", "fingerprint": "156ffa2eb0607e20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b2c8b73aad98489", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/authoring/documents/${id} (frontend/src/hooks/useAuthoringPersistence.ts:298)"}, "properties": {"repobilityId": "eefbd8147d6d88b6", "scanner": "scanner-primary", "fingerprint": "8b2c8b73aad98489", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-841375c5ca194491", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:418)"}, "properties": {"repobilityId": "939d563a48944949", "scanner": "scanner-primary", "fingerprint": "841375c5ca194491", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89eabb30773a42a5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/ai-authoring-service.ts:739)"}, "properties": {"repobilityId": "49493f3a2563113b", "scanner": "scanner-primary", "fingerprint": "89eabb30773a42a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ffda0f2cc3189e3b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:285)"}, "properties": {"repobilityId": "9d9e65b2fd12d461", "scanner": "scanner-primary", "fingerprint": "ffda0f2cc3189e3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-591bb259200ebcbd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (frontend/src/services/anthropic-service.ts:363)"}, "properties": {"repobilityId": "ff7426d5e1f9d38a", "scanner": "scanner-primary", "fingerprint": "591bb259200ebcbd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5fb901c8b9ec5c33", "level": "error", "message": {"text": "Dangling fetch: POST /api/collaboration/operations (frontend/src/services/collaboration/offline-queue-service.ts:345)"}, "properties": {"repobilityId": "4e9307502af639b1", "scanner": "scanner-primary", "fingerprint": "5fb901c8b9ec5c33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d62bc2180b804d0c", "level": "error", "message": {"text": "Dangling fetch: POST /api/collaboration/presence (frontend/src/services/collaboration/presence-awareness-service.ts:417)"}, "properties": {"repobilityId": "02cd4e56db601972", "scanner": "scanner-primary", "fingerprint": "d62bc2180b804d0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2e2d51075bb4899", "level": "error", "message": {"text": "Dangling fetch: GET /api/cross-module?${params.toString()} (frontend/src/store/useCrossModuleEventStore.ts:755)"}, "properties": {"repobilityId": "a3cca5189836b0a1", "scanner": "scanner-primary", "fingerprint": "b2e2d51075bb4899", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c02bdcae895783db", "level": "error", "message": {"text": "Dangling fetch: POST /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:781)"}, "properties": {"repobilityId": "26d229983be0fe56", "scanner": "scanner-primary", "fingerprint": "c02bdcae895783db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e9539133cc5be50", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/cross-module (frontend/src/store/useCrossModuleEventStore.ts:827)"}, "properties": {"repobilityId": "61df1827de8f27a7", "scanner": "scanner-primary", "fingerprint": "9e9539133cc5be50", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ebd06ae45cc5c3a4", "level": "error", "message": {"text": "Dangling fetch: POST /api/favorites (frontend/src/store/useFavoritesStore.ts:79)"}, "properties": {"repobilityId": "013d2520f998c4c1", "scanner": "scanner-primary", "fingerprint": "ebd06ae45cc5c3a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-de6f11df8e277e27", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/favorites?entityType=${encodeURIComponent(entityType)}&entityId=${encodeURIComponent(entityId)} (frontend/src/store/useFavoritesStore.ts:96)"}, "properties": {"repobilityId": "83a7f08ad944fbec", "scanner": "scanner-primary", "fingerprint": "de6f11df8e277e27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "2c4f5411f05d78f2", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "e8d72d5118b5c3f5", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42d270f9d1429fdb", "level": "note", "message": {"text": "Unused endpoint: GET /{study_id}"}, "properties": {"repobilityId": "39b19c9bc1ef7222", "scanner": "scanner-primary", "fingerprint": "42d270f9d1429fdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e35642f6290dba99", "level": "note", "message": {"text": "Unused endpoint: PATCH /{study_id}"}, "properties": {"repobilityId": "175fa21e1eb412f2", "scanner": "scanner-primary", "fingerprint": "e35642f6290dba99", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c812e09a037b58b8", "level": "note", "message": {"text": "Unused endpoint: PUT /{study_id}"}, "properties": {"repobilityId": "4f1139c0c8f9c06c", "scanner": "scanner-primary", "fingerprint": "c812e09a037b58b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54956a3774048a9a", "level": "note", "message": {"text": "Unused endpoint: DELETE /{study_id}"}, "properties": {"repobilityId": "d74d5d6575555b0d", "scanner": "scanner-primary", "fingerprint": "54956a3774048a9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49f84db9d3d1f0d7", "level": "note", "message": {"text": "Unused endpoint: GET /{submission_id}"}, "properties": {"repobilityId": "e6e6f1341c6240df", "scanner": "scanner-primary", "fingerprint": "49f84db9d3d1f0d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11e0ddbfc8321fc8", "level": "note", "message": {"text": "Unused endpoint: PATCH /{submission_id}"}, "properties": {"repobilityId": "9975f76b26eb6246", "scanner": "scanner-primary", "fingerprint": "11e0ddbfc8321fc8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-486c1d9d0d71fff8", "level": "note", "message": {"text": "Unused endpoint: PUT /{submission_id}"}, "properties": {"repobilityId": "3d2bcf07c5e758ca", "scanner": "scanner-primary", "fingerprint": "486c1d9d0d71fff8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b88a12140df0c08b", "level": "note", "message": {"text": "Unused endpoint: DELETE /{submission_id}"}, "properties": {"repobilityId": "5335910a7530ce41", "scanner": "scanner-primary", "fingerprint": "b88a12140df0c08b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d611732ce2d9cdfe", "level": "note", "message": {"text": "Unused endpoint: GET /{product_id}"}, "properties": {"repobilityId": "66f5a1f5238e8909", "scanner": "scanner-primary", "fingerprint": "d611732ce2d9cdfe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a15b85e6076d921a", "level": "note", "message": {"text": "Unused endpoint: PUT /{product_id}"}, "properties": {"repobilityId": "56e522d8778b55e6", "scanner": "scanner-primary", "fingerprint": "a15b85e6076d921a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b02e6e38a06a1cbd", "level": "note", "message": {"text": "Unused endpoint: DELETE /{product_id}"}, "properties": {"repobilityId": "2303ef5b5646a591", "scanner": "scanner-primary", "fingerprint": "b02e6e38a06a1cbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6d412ba6647f6cc", "level": "note", "message": {"text": "Unused endpoint: GET /live"}, "properties": {"repobilityId": "3ae20102c4297a7f", "scanner": "scanner-primary", "fingerprint": "d6d412ba6647f6cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c236625afb6a8cb", "level": "note", "message": {"text": "Unused endpoint: GET /ready"}, "properties": {"repobilityId": "f318539036a93d3a", "scanner": "scanner-primary", "fingerprint": "8c236625afb6a8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cb73614b4fb642e", "level": "note", "message": {"text": "Unused endpoint: GET /db"}, "properties": {"repobilityId": "3f30ee5b4fa60206", "scanner": "scanner-primary", "fingerprint": "4cb73614b4fb642e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca9b06e2e10afc75", "level": "note", "message": {"text": "Unused endpoint: GET /{haq_id}"}, "properties": {"repobilityId": "f532f32848ec7150", "scanner": "scanner-primary", "fingerprint": "ca9b06e2e10afc75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aab4b35ef52ad6d9", "level": "note", "message": {"text": "Unused endpoint: PATCH /{haq_id}"}, "properties": {"repobilityId": "9c702fce08d9d705", "scanner": "scanner-primary", "fingerprint": "aab4b35ef52ad6d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec67130a5c29826c", "level": "note", "message": {"text": "Unused endpoint: PUT /{haq_id}"}, "properties": {"repobilityId": "148b3c3c6ee3d7f3", "scanner": "scanner-primary", "fingerprint": "ec67130a5c29826c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d42001435c73c253", "level": "note", "message": {"text": "Unused endpoint: DELETE /{haq_id}"}, "properties": {"repobilityId": "07aa4bae07868129", "scanner": "scanner-primary", "fingerprint": "d42001435c73c253", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "4f445a0b56cc60f5", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "e4f5be51032ff31a", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1daa53f3c56e6b16", "level": "note", "message": {"text": "Unused endpoint: GET /session"}, "properties": {"repobilityId": "9b347182672faf7b", "scanner": "scanner-primary", "fingerprint": "1daa53f3c56e6b16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "fe37c3e8099bdefa", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8614df2893d241a", "level": "note", "message": {"text": "Unused endpoint: GET /generate"}, "properties": {"repobilityId": "2a31dcf9057f89a2", "scanner": "scanner-primary", "fingerprint": "e8614df2893d241a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1abce47f5a681834", "level": "note", "message": {"text": "Unused endpoint: POST /haq-rag"}, "properties": {"repobilityId": "0dc8d2a355799b80", "scanner": "scanner-primary", "fingerprint": "1abce47f5a681834", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a869f59b43093b74", "level": "note", "message": {"text": "Unused endpoint: GET /haq-rag"}, "properties": {"repobilityId": "b9d46327ed0fd467", "scanner": "scanner-primary", "fingerprint": "a869f59b43093b74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2e981c87f3388d9", "level": "note", "message": {"text": "Unused endpoint: POST /section-generate"}, "properties": {"repobilityId": "6c9546b06f51cc11", "scanner": "scanner-primary", "fingerprint": "a2e981c87f3388d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a288a797267875a", "level": "note", "message": {"text": "Unused endpoint: GET /section-generate"}, "properties": {"repobilityId": "c0465879962d09e0", "scanner": "scanner-primary", "fingerprint": "8a288a797267875a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d467299d5c174fc0", "level": "note", "message": {"text": "Unused endpoint: GET /usage"}, "properties": {"repobilityId": "fac465074e5b5857", "scanner": "scanner-primary", "fingerprint": "d467299d5c174fc0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ab9bf5db6820af4", "level": "note", "message": {"text": "Unused endpoint: GET /models"}, "properties": {"repobilityId": "ae1a9b93e8062eb9", "scanner": "scanner-primary", "fingerprint": "2ab9bf5db6820af4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01a333a34760fca3", "level": "note", "message": {"text": "Unused endpoint: GET /prompts"}, "properties": {"repobilityId": "aee8a9f703072115", "scanner": "scanner-primary", "fingerprint": "01a333a34760fca3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9d001c1f452896a", "level": "note", "message": {"text": "Unused endpoint: POST /inference"}, "properties": {"repobilityId": "789cf5d89248c0f5", "scanner": "scanner-primary", "fingerprint": "b9d001c1f452896a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d2184f654f2fa089", "level": "note", "message": {"text": "Unused endpoint: GET /compliance-filter"}, "properties": {"repobilityId": "43d0c4f55344cc21", "scanner": "scanner-primary", "fingerprint": "d2184f654f2fa089", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fcb0833c6f573a2", "level": "note", "message": {"text": "Unused endpoint: GET /validation-docs"}, "properties": {"repobilityId": "3037e616d45cafe4", "scanner": "scanner-primary", "fingerprint": "0fcb0833c6f573a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3b62fe2a13b51ea", "level": "note", "message": {"text": "Unused endpoint: POST /rag/retrieve"}, "properties": {"repobilityId": "8aee321fcb004564", "scanner": "scanner-primary", "fingerprint": "f3b62fe2a13b51ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9ada54c6099bd33", "level": "note", "message": {"text": "Unused endpoint: GET /{document_id}"}, "properties": {"repobilityId": "37797a43780b9023", "scanner": "scanner-primary", "fingerprint": "a9ada54c6099bd33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13d9ffd0b4428c5d", "level": "note", "message": {"text": "Unused endpoint: PATCH /{document_id}"}, "properties": {"repobilityId": "52b6e3c2ffd4759d", "scanner": "scanner-primary", "fingerprint": "13d9ffd0b4428c5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82ed17403da0b50e", "level": "note", "message": {"text": "Unused endpoint: PUT /{document_id}"}, "properties": {"repobilityId": "b363d2d750f84c01", "scanner": "scanner-primary", "fingerprint": "82ed17403da0b50e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2d9ebcfd4b9e397", "level": "note", "message": {"text": "Unused endpoint: DELETE /{document_id}"}, "properties": {"repobilityId": "665f677963d44623", "scanner": "scanner-primary", "fingerprint": "b2d9ebcfd4b9e397", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-822f5812dc9de7a7", "level": "note", "message": {"text": "Unused endpoint: GET /verify"}, "properties": {"repobilityId": "d841a117016c821e", "scanner": "scanner-primary", "fingerprint": "822f5812dc9de7a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f606e1e29a7ef82", "level": "note", "message": {"text": "Unused endpoint: GET /{report_id}"}, "properties": {"repobilityId": "1f3f3fb50738156e", "scanner": "scanner-primary", "fingerprint": "6f606e1e29a7ef82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc72b2c1e1abc7b8", "level": "note", "message": {"text": "Unused endpoint: PATCH /{report_id}"}, "properties": {"repobilityId": "95fd6bdef7dd9103", "scanner": "scanner-primary", "fingerprint": "bc72b2c1e1abc7b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4937935e722d470b", "level": "note", "message": {"text": "Unused endpoint: PUT /{report_id}"}, "properties": {"repobilityId": "24b5e87c95da2a09", "scanner": "scanner-primary", "fingerprint": "4937935e722d470b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-772e19875f5f1469", "level": "note", "message": {"text": "Unused endpoint: DELETE /{report_id}"}, "properties": {"repobilityId": "b8cc4604eba18772", "scanner": "scanner-primary", "fingerprint": "772e19875f5f1469", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}