{"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-e1ca768ecf53c52b", "name": "Stray `console.log` in TS/JS \u2014 daemon/tests/adapters/nodeSandboxAdapter.test.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 daemon/tests/adapters/nodeSandboxAdapter.test.ts:7"}, "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-dc3f5456ea595493", "name": "Stray `console.log` in TS/JS \u2014 daemon/src/server.ts:554", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/server.ts:554"}, "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-08692a2bdaac17ae", "name": "Stray `console.log` in TS/JS \u2014 daemon/src/media/imageUpload.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/media/imageUpload.ts:105"}, "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-d726e8966a95774f", "name": "Stray `console.log` in TS/JS \u2014 daemon/src/media/providers/higgsfield.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/media/providers/higgsfield.ts:43"}, "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-1ec9428d59323671", "name": "Stray `console.log` in TS/JS \u2014 daemon/src/flow-trade/index.ts:257", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/flow-trade/index.ts:257"}, "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-3eeff3402d5781df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/notifications/NotificationTray.jsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/notifications/NotificationTray.jsx: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-887b73353068465b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy-sharing/components/ShareCourseModal.jsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy-sharing/components/ShareCourseModal.jsx: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-4cb2888fbbe0ebad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ExecutionRecordList.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ExecutionRecordList.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-0d6c20611c08756a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/DockerMCPPanel.jsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/DockerMCPPanel.jsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-407f01d6036f3d7e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ConnectionModal.jsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ConnectionModal.jsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19c7b862701b49b0", "name": "Stray `console.log` in TS/JS \u2014 src/mcp/providers/mockTelegramProvider.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/mcp/providers/mockTelegramProvider.ts:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff1cb7620549fecd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/pages/MCPUseCasesPage.tsx:532", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/pages/MCPUseCasesPage.tsx:532"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f735a73fdb3eca82", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/briefs/BriefsDropdown.jsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/briefs/BriefsDropdown.jsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f9b69b7fad56dcc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/money/MoneyFlowSettingsPanel.jsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/money/MoneyFlowSettingsPanel.jsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e31f1ec3ff4e1d2a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LeftRail.jsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LeftRail.jsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b641338b10962e1e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.jsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.jsx: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-6fa75235781638c7", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/TopBar.jsx:405", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/TopBar.jsx:405"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce179cf06f7f551d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/DaemonOfflineBanner.jsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/DaemonOfflineBanner.jsx:48"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5cdef09d5cd63f16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/DraggableModal.jsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/DraggableModal.jsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35c5cd48b4f23758", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Breadcrumb.jsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Breadcrumb.jsx:41"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-243d01c335bcd019", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityFramePanel.jsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityFramePanel.jsx: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-831053eb92dbbfab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/ScoreBar.jsx:17", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/ScoreBar.jsx:17"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01cc995d88098cab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityRankChart.jsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityRankChart.jsx:24"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e90525158f168583", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/BriefTab.jsx:397", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/BriefTab.jsx: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-b4d059cc565d6ac1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/ScoresTab.jsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/ScoresTab.jsx: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-f8f7a8ae9c556a35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/CompareTab.jsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/CompareTab.jsx: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-ec6fb5757867405a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/EvidenceTab.jsx:11", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/EvidenceTab.jsx:11"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0bf55e101af92c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/OverviewTab.jsx:574", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/OverviewTab.jsx:574"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ce28d5e69be0ba6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/create/FlowCreatePanel.jsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create/FlowCreatePanel.jsx:512"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e17cf094506a036", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/memory/KnowledgeOverview.jsx:758", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/memory/KnowledgeOverview.jsx:758"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49c15013bc74542c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/topic/SummaryModal.jsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/topic/SummaryModal.jsx:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48ed21ce078ec011", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostics/AutoFixToast.jsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostics/AutoFixToast.jsx: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-5bfee6c14e24362d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoCard.jsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoCard.jsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6fa3b2d16aef9a97", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoPlayerModal.jsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoPlayerModal.jsx: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-6623f782ec83689f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/ArticleCard.jsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/ArticleCard.jsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-207ab5aa699be885", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/opportunity/PatternTable.jsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/opportunity/PatternTable.jsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47412611045bc277", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/SharedInboxTab.jsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/SharedInboxTab.jsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2abf5e8ce79d7179", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/ShareDialog.jsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/ShareDialog.jsx:51"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b3dd9113d1c53a7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/DerivedSignals.jsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/DerivedSignals.jsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a359d253a2f5e5a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/GlassSidebar.jsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/GlassSidebar.jsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac8cd9433632adc3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/QuickChatLauncher.jsx:1358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/QuickChatLauncher.jsx:1358"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d16e66c61ca8279", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/ConnectedSources.jsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/ConnectedSources.jsx:32"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1029249a1004b8b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskEditor.jsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskEditor.jsx:214"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4573adb82271480d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskDetail.jsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskDetail.jsx: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-bab1bd6a267ec1a4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskInbox.jsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskInbox.jsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78ae40c25920ca43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskToday.jsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskToday.jsx: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-795e73720f5c2345", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskCalendar.jsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskCalendar.jsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e699375906555a54", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/WalletRail.jsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/WalletRail.jsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f1383fae512c0bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/ActivityFeed.jsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/ActivityFeed.jsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3993583ce8118635", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/PresetChips.jsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/PresetChips.jsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b32301a4a49a864b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/ImportModal.jsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/ImportModal.jsx: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-5710e9c47a87b718", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/AccountDetailModal.jsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/AccountDetailModal.jsx:58"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4e8ba003f21b3fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/Dropdown.jsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/Dropdown.jsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e69396026ba92fdd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/EntitySwitcher.jsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/EntitySwitcher.jsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb69f5ca632aa936", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/RoundGraph.jsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/RoundGraph.jsx: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-47d46b632a8e9c0d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/GlobeOverlay.jsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/GlobeOverlay.jsx:281"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d97e9393b8ab629", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/LocationSearch.jsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/LocationSearch.jsx: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-c263d0168c7c7d9e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/FlightSearch.jsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/FlightSearch.jsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fa0edef96b5adbd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/liveSky/LiveSkyCard.jsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/liveSky/LiveSkyCard.jsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab7b1234418ee05a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/chat/retrieve.js:735", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chat/retrieve.js:735"}, "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-e7cc92c860610ee8", "name": "Stray `console.log` in TS/JS \u2014 src/lib/voice/useMicTranscription.js:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/voice/useMicTranscription.js:133"}, "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-b945138a247fbf9d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/AcademyHome.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/AcademyHome.jsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8fb46307e75eae1d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/LessonView.jsx:523", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/LessonView.jsx:523"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f95cb643a249056", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/WatchlistPanel.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/WatchlistPanel.jsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d14f40d7e1d36baf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/FlowTradeChat.jsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/FlowTradeChat.jsx: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-1a2aada75fc93657", "name": "Icon-only button without accessible name \u2014 src/flow-trade/v2/Dashboard.jsx:327", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/flow-trade/v2/Dashboard.jsx:327"}, "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-e68f563d9b7570ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyHome.jsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyHome.jsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b7e88052955cf54", "name": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyPage.jsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyPage.jsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4606914d1c20ca2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Documents.jsx:511", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Documents.jsx: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-78e1742d73b6d352", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlowDetail.jsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlowDetail.jsx:105"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f30c3973cc19401f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/SystemPanel.jsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/SystemPanel.jsx: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-f80b511098784ca3", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/views/SystemPanel.jsx:385", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/views/SystemPanel.jsx:385"}, "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-171f92e7fe69279a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Alerts.jsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Alerts.jsx:318"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6fb4a77dcdbee5e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Search.jsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Search.jsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c80f67a13f6e9756", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Signals.jsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Signals.jsx:246"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf25a1b0f48e59e1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topics.jsx:478", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topics.jsx:478"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd62b7437b70a7a1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Memory.jsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Memory.jsx:199"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa691fc2414de3e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/ContentDrafts.jsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/ContentDrafts.jsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d7eed51573d9168", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topic.jsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topic.jsx: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-05dd33db3777a827", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/GlobeView.jsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/GlobeView.jsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c138010e38eeea65", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Sitemap.jsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Sitemap.jsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94b2da2ddbfb34a0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/FlowCreate.jsx:885", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/FlowCreate.jsx:885"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2f001f8c4671750", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Chat.jsx:600", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Chat.jsx:600"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8af0b9ffe58f3d0", "name": "TODO/FIXME marker in shipping code \u2014 src/views/Chat.jsx:1526", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/views/Chat.jsx:1526"}, "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-9663dc8689c68c8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/Briefs.jsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Briefs.jsx: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-9a34f08fc6974b7c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlow.jsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlow.jsx:259"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-50131283800d767f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/tax/FlowTax.jsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/tax/FlowTax.jsx: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-d15f082a5b9de38e", "name": "Icon-only button without accessible name \u2014 src/views/money/cash/CashSubscriptions.jsx:111", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/views/money/cash/CashSubscriptions.jsx:111"}, "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-53d7987f422a6947", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashAccounts.jsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashAccounts.jsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-079302c795e2dacd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashGoals.jsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashGoals.jsx:312"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b1a3fbacccf5d18", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/FlowCash.jsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/FlowCash.jsx: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-fb6b7f78ca4c01da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashTransactions.jsx:457", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashTransactions.jsx:457"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3fa56f3e729611d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/FlowInvest.jsx:374", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/FlowInvest.jsx:374"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8b7de2fc716aacd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestAccounts.jsx:364", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestAccounts.jsx:364"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-812c59f57aceb238", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestEarnings.jsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestEarnings.jsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98222b2460397ede", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/components/FeasibilityTable.jsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/components/FeasibilityTable.jsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3279c3e16ddc8720", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowsTab.jsx:523", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowsTab.jsx:523"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16d5bdf2551f2c44", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowExecutionsTab.jsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowExecutionsTab.jsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-953c4640694b64b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/sitemap/HealthPanel.jsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/sitemap/HealthPanel.jsx: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-1c97ff2bc9a66d5a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyDashboardV2.jsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyDashboardV2.jsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b585177cd3879437", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyInvestments.jsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyInvestments.jsx: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-af0f195303c11d30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyProperty.jsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyProperty.jsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-058367b2e2635fe6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTransactions.jsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTransactions.jsx: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-bd3dd13e4df7eba6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyPayroll.jsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyPayroll.jsx: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-d34148b8c1c282cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTax.jsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTax.jsx: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-b85d1efabf41fc66", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyExpenses.jsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyExpenses.jsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1bf63e561cd6417", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx:432"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0cae2b6dac6174b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyOnboarding.jsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyOnboarding.jsx:340"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df694b047d60a26e", "name": "Privileged port 993 in use", "shortDescription": {"text": "Privileged port 993 in use"}, "fullDescription": {"text": "Port 993 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-785313162ff3dffa", "name": "Privileged port 587 in use", "shortDescription": {"text": "Privileged port 587 in use"}, "fullDescription": {"text": "Port 587 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2749948962250a89", "name": "Insecure pattern 'node_child_process' in launcher/LauncherService.js:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in launcher/LauncherService.js:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d54b94481459194d", "name": "Insecure pattern 'node_child_process' in daemon/src/config.ts:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in daemon/src/config.ts:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b566c8d8f87cbc2c", "name": "Insecure pattern 'node_child_process' in daemon/src/server.ts:481", "shortDescription": {"text": "Insecure pattern 'node_child_process' in daemon/src/server.ts:481"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e7d4ae6f4d21068", "name": "Insecure pattern 'node_child_process' in daemon/src/adapters/nodeSandboxAdapter.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in daemon/src/adapters/nodeSandboxAdapter.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf89a3f5314a567f", "name": "Insecure pattern 'node_child_process' in daemon/src/adapters/shellAdapter.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in daemon/src/adapters/shellAdapter.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f42551dad0546dc5", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-academy-sharing/renderFlowAcademyExportHTML.js:226", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-academy-sharing/renderFlowAcademyExportHTML.js:226"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b32ae811afd7ae1", "name": "Insecure pattern 'cors_wildcard' in src/lib/search/wikipedia.js:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/lib/search/wikipedia.js:14"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a56dda56194dee4d", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-trade/v2/StockDetail.jsx:223", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-trade/v2/StockDetail.jsx:223"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bfc1b39a269ea2f", "name": "Insecure pattern 'domparser_html_parse' in src/code-academy/validatorEngine.js:69", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in src/code-academy/validatorEngine.js:69"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-f97f0d5589928cfe", "name": "Very large file: daemon/src/flow-trade/index.ts (1184 lines)", "shortDescription": {"text": "Very large file: daemon/src/flow-trade/index.ts (1184 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-239ea3ce1340ebce", "name": "Very large file: src/python-curriculum/curriculum/python.ts (2788 lines)", "shortDescription": {"text": "Very large file: src/python-curriculum/curriculum/python.ts (2788 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-616f3db1c55ab87f", "name": "Very large file: src/components/memory/KnowledgeOverview.jsx (1798 lines)", "shortDescription": {"text": "Very large file: src/components/memory/KnowledgeOverview.jsx (1798 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-b8e9a65ccf26453f", "name": "Very large file: src/components/flow/QuickChatLauncher.jsx (1906 lines)", "shortDescription": {"text": "Very large file: src/components/flow/QuickChatLauncher.jsx (1906 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-dd050e3c26f54e36", "name": "Very large file: src/lib/chat/retrieve.js (954 lines)", "shortDescription": {"text": "Very large file: src/lib/chat/retrieve.js (954 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-46e758cba6e2e935", "name": "Very large file: src/store/useStore.js (2057 lines)", "shortDescription": {"text": "Very large file: src/store/useStore.js (2057 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-3aaf66bbba2fc29e", "name": "Very large file: src/opportunity-radar/services/conceptGenerator.ts (1115 lines)", "shortDescription": {"text": "Very large file: src/opportunity-radar/services/conceptGenerator.ts (1115 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-224ad0ea2776f7f6", "name": "Very large file: src/views/VentureFlowDetail.jsx (1425 lines)", "shortDescription": {"text": "Very large file: src/views/VentureFlowDetail.jsx (1425 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-00f03d72c220b570", "name": "Very large file: src/views/Signals.jsx (1581 lines)", "shortDescription": {"text": "Very large file: src/views/Signals.jsx (1581 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-e1406b1bcd930292", "name": "Very large file: src/views/Sitemap.jsx (1781 lines)", "shortDescription": {"text": "Very large file: src/views/Sitemap.jsx (1781 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-c2f17961e2a92c80", "name": "Very large file: src/views/FlowCreate.jsx (1262 lines)", "shortDescription": {"text": "Very large file: src/views/FlowCreate.jsx (1262 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-554bf91c66f55e78", "name": "Very large file: src/views/Chat.jsx (2142 lines)", "shortDescription": {"text": "Very large file: src/views/Chat.jsx (2142 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-bafb99d2427b6bc9", "name": "Very large file: src/views/moneyFlow/MoneyFlowOnboardingV2.jsx (1365 lines)", "shortDescription": {"text": "Very large file: src/views/moneyFlow/MoneyFlowOnboardingV2.jsx (1365 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "120 tests / 823 src (ratio 0.15)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 96 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 371 placeholder/mock markers across 104 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-693cc2ff1aa40f38", "name": "Commented-code block (9 lines) in vite.config.js:66", "shortDescription": {"text": "Commented-code block (9 lines) in vite.config.js:66"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfafd79e780b98d1", "name": "Commented-code block (5 lines) in vite-plugin-flowagent-sync.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in vite-plugin-flowagent-sync.js: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-08527391c71c9433", "name": "Commented-code block (5 lines) in vite-plugin-daemon-info.js:362", "shortDescription": {"text": "Commented-code block (5 lines) in vite-plugin-daemon-info.js:362"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f383542429d9f6b", "name": "Commented-code block (12 lines) in vite-plugin-elevenlabs.js:9", "shortDescription": {"text": "Commented-code block (12 lines) in vite-plugin-elevenlabs.js: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-ac351c1590afc000", "name": "`fetch()` without try/.catch or AbortSignal \u2014 vite-plugin-elevenlabs.js:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vite-plugin-elevenlabs.js:66"}, "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-a40faefe4de4e753", "name": "Commented-code block (7 lines) in cloudflare/plaid/worker.js:11", "shortDescription": {"text": "Commented-code block (7 lines) in cloudflare/plaid/worker.js:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efe1749a621649a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/plaid/worker.js:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/plaid/worker.js:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ddeb3d91dfd47ad8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/shared-kb/worker.js:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/shared-kb/worker.js:100"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d46d6155ee811244", "name": "`fetch()` without try/.catch or AbortSignal \u2014 daemon/src/media/imageUpload.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 daemon/src/media/imageUpload.ts:50"}, "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-e15b35ef8cb6d0cc", "name": "Commented-code block (6 lines) in daemon/src/live-sky/service.ts:86", "shortDescription": {"text": "Commented-code block (6 lines) in daemon/src/live-sky/service.ts:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9e4a840e42c4023", "name": "Commented-code block (5 lines) in daemon/src/flow-trade/index.ts:210", "shortDescription": {"text": "Commented-code block (5 lines) in daemon/src/flow-trade/index.ts:210"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5874c8dbbdb6e2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/notificationsApi.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/notificationsApi.js:7"}, "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-4ab8c3d6b19a4771", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/__tests__/notificationsApi.test.js:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/__tests__/notificationsApi.test.js:60"}, "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-224b7730fa7c064f", "name": "Commented-code block (6 lines) in src/python-curriculum/curriculum/python.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/python-curriculum/curriculum/python.ts: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-ab487d14d06edc80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/signals/services/youtubeSignalsService.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/signals/services/youtubeSignalsService.ts:33"}, "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-e4fd8a7059a06079", "name": "Commented-code block (5 lines) in src/mcp/connectionContent.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/mcp/connectionContent.js: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-34c6890fd0d834f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/localProvider.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/localProvider.ts:26"}, "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-c3f4c60723c162e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/dockerMCPProvider.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/dockerMCPProvider.ts:27"}, "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-1e4fb21a46531477", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/telegramPollingService.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/telegramPollingService.ts:51"}, "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-1812a9f4ec8f3619", "name": "Commented-code block (6 lines) in src/mcp/services/apiKeyTools.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/mcp/services/apiKeyTools.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-dbee2bdcc85aec8b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/daemonApi.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/daemonApi.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fae2a42c79e44cd7", "name": "Commented-code block (6 lines) in src/mcp/storage/localMCPStorage.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in src/mcp/storage/localMCPStorage.ts:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cc2dfa007185924", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/briefs/BriefModal.jsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/briefs/BriefModal.jsx:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ed3f27b87553ef0", "name": "Commented-code block (5 lines) in src/components/settings/ApiServiceCards.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/settings/ApiServiceCards.jsx: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-95585180c47e91ab", "name": "Commented-code block (5 lines) in src/components/settings/useApiServices.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/settings/useApiServices.jsx: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-791de47e1f0e01bd", "name": "Commented-code block (7 lines) in src/components/ui/TabBar.jsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/ui/TabBar.jsx: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-4946dcd6047bcbaf", "name": "Commented-code block (8 lines) in src/components/ui/VirtualList.jsx:4", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/ui/VirtualList.jsx: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-d835cfa09652cf7f", "name": "Commented-code block (5 lines) in src/components/ui/PillTabs.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/PillTabs.jsx: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-102485267d4054a3", "name": "Commented-code block (5 lines) in src/components/ingest/UrlIngestModal.jsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ingest/UrlIngestModal.jsx:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67cba1a370d2f214", "name": "Commented-code block (5 lines) in src/components/topic/SummaryModal.jsx:25", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/topic/SummaryModal.jsx:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1bc8f2689f55bd9", "name": "Commented-code block (6 lines) in src/components/flow/QuickChatLauncher.jsx:411", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/flow/QuickChatLauncher.jsx:411"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-466ad94145ebb9ba", "name": "Commented-code block (5 lines) in src/components/moneyFlow/v2/PresetChips.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/PresetChips.jsx: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-b7c0e581a1a68c76", "name": "Commented-code block (6 lines) in src/components/moneyFlow/v2/ConnectionCard.jsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/moneyFlow/v2/ConnectionCard.jsx: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-7a35c9fd63728502", "name": "Commented-code block (5 lines) in src/components/moneyFlow/v2/RailMessage.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/RailMessage.jsx: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-090ba8c69e0099be", "name": "Commented-code block (6 lines) in src/components/moneyFlow/v2/FlowRing.jsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/moneyFlow/v2/FlowRing.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d879e658684fb3d8", "name": "Commented-code block (5 lines) in src/components/moneyFlow/v2/CoachNote.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/CoachNote.jsx: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-659efae5e1abad5a", "name": "Commented-code block (5 lines) in src/components/moneyFlow/v2/InfoTip.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/InfoTip.jsx: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-2126bb379b89391f", "name": "Commented-code block (5 lines) in src/components/moneyFlow/v2/MoneyCard.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/MoneyCard.jsx: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-31d1e3aff4a3f8b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/MapSearch.jsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/MapSearch.jsx:12"}, "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-3a854cc8a3df8a8c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/GlobeOverlay.jsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/GlobeOverlay.jsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-daccd7d68a3f2aac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/flightUtils.js:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/flightUtils.js:129"}, "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-23b6abf0f8d50454", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/weatherService.js:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/weatherService.js:55"}, "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-c81a27648e191c45", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/LocationSearch.jsx:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/LocationSearch.jsx:10"}, "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-ffe106b547c02181", "name": "Commented-code block (6 lines) in src/flow-globe/priceWatches.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/flow-globe/priceWatches.js: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-d20929c0766d8116", "name": "Commented-code block (6 lines) in src/flow-globe/FlowGlobe.jsx:406", "shortDescription": {"text": "Commented-code block (6 lines) in src/flow-globe/FlowGlobe.jsx:406"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58f975c2e617aaf5", "name": "Commented-code block (7 lines) in src/flow-globe/savedRoutes.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/flow-globe/savedRoutes.js: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-6d4b2beb6fc61ac6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/liveSky/liveSkyApi.js:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/liveSky/liveSkyApi.js:25"}, "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-e63d2987c3c2a171", "name": "Commented-code block (12 lines) in src/venture-scope/types.ts:150", "shortDescription": {"text": "Commented-code block (12 lines) in src/venture-scope/types.ts:150"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e82554f8ae59510d", "name": "Commented-code block (5 lines) in src/venture-scope/utils/__tests__/conceptAmbiguity.test.ts:168", "shortDescription": {"text": "Commented-code block (5 lines) in src/venture-scope/utils/__tests__/conceptAmbiguity.test.ts:168"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ee26b98aab70e82", "name": "Legacy-named symbol `seed_ai_governance_studio_v1` in src/venture-scope/seed/corpusSeedData.ts:29", "shortDescription": {"text": "Legacy-named symbol `seed_ai_governance_studio_v1` in src/venture-scope/seed/corpusSeedData.ts:29"}, "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-34bba8299e689de6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/mediaApi.js:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/mediaApi.js:8"}, "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-45fd29cff50c849c", "name": "Commented-code block (7 lines) in src/lib/chatPanelState.js:24", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/chatPanelState.js: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-6527334a04729a10", "name": "Commented-code block (5 lines) in src/lib/higgsfieldConfig.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/higgsfieldConfig.js: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-8d068cdcefbbc65e", "name": "Commented-code block (5 lines) in src/lib/snapshot.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/snapshot.js: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-a4892407ba70d83e", "name": "Commented-code block (5 lines) in src/lib/vtScan.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/vtScan.js: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-1587b391510c9566", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/briefs/fetchAiNews.js:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/briefs/fetchAiNews.js:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-914992c65ff85427", "name": "Commented-code block (5 lines) in src/lib/money/entities.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/money/entities.js: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-816be83e4726a945", "name": "Commented-code block (7 lines) in src/lib/money/palette.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/money/palette.js: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-46a69ff8fdc3e437", "name": "Commented-code block (6 lines) in src/lib/money/responseRouter.js:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/money/responseRouter.js: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-25c41f4588055b0f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/money/responseRouter.js:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/money/responseRouter.js:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba904f6e8a56f946", "name": "Commented-code block (5 lines) in src/lib/money/irsLimits.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/money/irsLimits.js: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-3082887be754b39d", "name": "Commented-code block (8 lines) in src/lib/sync/sharedSync.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/sync/sharedSync.js: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-626e7cbd767a8bb0", "name": "Commented-code block (8 lines) in src/lib/document/extract.js:5", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/document/extract.js: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-9184af9d4db5a443", "name": "Commented-code block (6 lines) in src/lib/flowAI/jokeSession.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/flowAI/jokeSession.js: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-295f84467e6413d5", "name": "Commented-code block (6 lines) in src/lib/flowAI/chatHistoryStore.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/flowAI/chatHistoryStore.js: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-58fe81319129521c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/flowAgentKnowledgeBase.js:387", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/flowAgentKnowledgeBase.js:387"}, "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-836c4a4be03a2e8b", "name": "Commented-code block (6 lines) in src/lib/flowAI/modelSelector.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/flowAI/modelSelector.js: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-157b870ea954d3e7", "name": "Commented-code block (5 lines) in src/lib/flowAI/agentProfiles.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/flowAI/agentProfiles.js: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-4c825f1c185daed6", "name": "Commented-code block (5 lines) in src/lib/flowAI/insights/triggers.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/flowAI/insights/triggers.js: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-86a4248610d0b725", "name": "Commented-code block (5 lines) in src/lib/flowAI/insights/dispatch.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/flowAI/insights/dispatch.js: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-09b55ce6f61cb0fa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/actions/index.js:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/actions/index.js:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b782f3d38ba709a3", "name": "Commented-code block (6 lines) in src/lib/topics/topicCover.js:42", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/topics/topicCover.js:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d9acb5069c7e663", "name": "Commented-code block (5 lines) in src/lib/chat/flowAIPersona.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/chat/flowAIPersona.js: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-8961c670a21c22ac", "name": "Commented-code block (7 lines) in src/lib/chat/retrieve.js:138", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/chat/retrieve.js:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e845da71a44ec8f", "name": "Commented-code block (5 lines) in src/lib/chat/flowAITools.js:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/chat/flowAITools.js:40"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1442ed99f90b572f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/chat/daemonTools.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/chat/daemonTools.js:35"}, "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-2fec2102724ba922", "name": "Commented-code block (6 lines) in src/lib/providers/huggingface.js:111", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/providers/huggingface.js:111"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e524a6aa9c073183", "name": "Commented-code block (5 lines) in src/lib/voice/player.js:49", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/voice/player.js:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5af13e4790260e92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/voice/player.js:229", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/voice/player.js:229"}, "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-a82b4a9f9f440735", "name": "Commented-code block (5 lines) in src/lib/voice/stt.js:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/voice/stt.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-76f894bffa5a4689", "name": "Commented-code block (7 lines) in src/lib/voice/conversationalVoice.js:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/voice/conversationalVoice.js: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-43119e3be2e7cf1f", "name": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/voice/voiceConfig.js:75", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/voice/voiceConfig.js:75"}, "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-6be4165bcdf043a4", "name": "Commented-code block (10 lines) in src/lib/voice/useWakeWord.js:4", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/voice/useWakeWord.js: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-5043f42e4a91d660", "name": "Commented-code block (5 lines) in src/lib/voice/useMicTranscription.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/voice/useMicTranscription.js:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-799db60f2ff8b031", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/reddit.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/reddit.js:21"}, "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-7a6cd84d0aec38ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/github.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/github.js:11"}, "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-5faa142a37c9ce39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/stackOverflow.js:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/stackOverflow.js:13"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1fc0c85235ab4362", "name": "Commented-code block (8 lines) in src/lib/search/rankingConfig.js:4", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/search/rankingConfig.js: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-701cc6183a14f284", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/hackerNews.js:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/hackerNews.js:6"}, "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-fec3cce82eaf742c", "name": "Commented-code block (5 lines) in src/lib/search/searchConfig.js:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/search/searchConfig.js:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2cadee810c8372ad", "name": "Commented-code block (6 lines) in src/lib/search/aggregate.js:35", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/search/aggregate.js:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-623e6ce052a9511d", "name": "Commented-code block (7 lines) in src/lib/search/articleReader.js:86", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/search/articleReader.js:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6ba85fd456b6c99", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/articleReader.js:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/articleReader.js:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bce358f78b6d71c2", "name": "Legacy-named symbol `rest_v1` in src/lib/search/ogImage.js:39", "shortDescription": {"text": "Legacy-named symbol `rest_v1` in src/lib/search/ogImage.js:39"}, "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-a38925eef3b85323", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/launcherApi.js:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/launcherApi.js:5"}, "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-9378bc9d4a6919f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/systemApi.js:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/systemApi.js:5"}, "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-4aadeeadbba291be", "name": "Commented-code block (5 lines) in src/lib/pdf/generatePdf.js:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pdf/generatePdf.js:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5084b350f47ab64a", "name": "Commented-code block (5 lines) in src/lib/credentials/validateOnSave.js:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/credentials/validateOnSave.js: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-64c8c606be8f62ec", "name": "Commented-code block (5 lines) in src/lib/graph/nodeTaxonomy.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/graph/nodeTaxonomy.js: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-89279601d9812ed3", "name": "Commented-code block (5 lines) in src/lib/graph/nodePositions.js:46", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/graph/nodePositions.js:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d741d64b8b6b3e12", "name": "Commented-code block (7 lines) in src/lib/llm/ollamaConfig.js:62", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/llm/ollamaConfig.js:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2988de4f06214fb3", "name": "Commented-code block (6 lines) in src/lib/llm/ollama.js:273", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/llm/ollama.js:273"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43a262d12f767ee3", "name": "Commented-code block (5 lines) in src/lib/moneyFlow/syncOnboardingToModules.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/moneyFlow/syncOnboardingToModules.js: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-f92a0d9393715c45", "name": "Commented-code block (5 lines) in src/lib/moneyFlow/planGenerator.js:245", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/moneyFlow/planGenerator.js:245"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4e969aa113eb6f5", "name": "Commented-code block (5 lines) in src/flow-academy/courseGenerator.js:178", "shortDescription": {"text": "Commented-code block (5 lines) in src/flow-academy/courseGenerator.js:178"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0feb858dc5def90", "name": "Commented-code block (5 lines) in src/flow-academy/components/LessonView.jsx:253", "shortDescription": {"text": "Commented-code block (5 lines) in src/flow-academy/components/LessonView.jsx:253"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e25ca5862b26fc83", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/venture-flow/ventureFlowApi.js:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/venture-flow/ventureFlowApi.js:10"}, "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-734d64fcaaf787b3", "name": "Commented-code block (5 lines) in src/venture-flow/ventureFlowStorage.js:86", "shortDescription": {"text": "Commented-code block (5 lines) in src/venture-flow/ventureFlowStorage.js:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81af6034ed9243c5", "name": "Legacy-named symbol `fm_fixlog_v1` in src/diagnostics/errorFixer.js:158", "shortDescription": {"text": "Legacy-named symbol `fm_fixlog_v1` in src/diagnostics/errorFixer.js:158"}, "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-df24ebef013ea3f8", "name": "Commented-code block (6 lines) in src/diagnostics/errorFixer.js:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/diagnostics/errorFixer.js:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51ef5ee6f5975f27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/diagnostics/errorFixer.js:256", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/diagnostics/errorFixer.js:256"}, "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-5e45229e177e0edc", "name": "Legacy-named symbol `fm_diagnostics_v1` in src/diagnostics/errorStore.js:17", "shortDescription": {"text": "Legacy-named symbol `fm_diagnostics_v1` in src/diagnostics/errorStore.js:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ae7a379103b5ae9", "name": "Commented-code block (5 lines) in src/diagnostics/errorStore.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/diagnostics/errorStore.js: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-732818e12c3f4fc8", "name": "Commented-code block (7 lines) in src/diagnostics/connectionHealthCheck.js:69", "shortDescription": {"text": "Commented-code block (7 lines) in src/diagnostics/connectionHealthCheck.js:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0afa21ec4c4210d", "name": "Commented-code block (7 lines) in src/flow-trade/massiveDataLayer.js:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/flow-trade/massiveDataLayer.js: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-48a9b9084832f517", "name": "Commented-code block (5 lines) in src/flow-trade/SignalFeed.jsx:415", "shortDescription": {"text": "Commented-code block (5 lines) in src/flow-trade/SignalFeed.jsx:415"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-266041335f2a14f5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-trade/FlowTradeChat.jsx:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-trade/FlowTradeChat.jsx:9"}, "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-8173d6b5369bf4ec", "name": "Commented-code block (5 lines) in src/flow-trade/v2/FlowTradeV2Context.jsx:51", "shortDescription": {"text": "Commented-code block (5 lines) in src/flow-trade/v2/FlowTradeV2Context.jsx:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7428722b0cd1fa03", "name": "Commented-code block (5 lines) in src/flow-trade/ai/taStore.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/flow-trade/ai/taStore.js: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-423b262caaa2fc71", "name": "Legacy-named symbol `__flowmap_backup` in src/store/useStore.js:1916", "shortDescription": {"text": "Legacy-named symbol `__flowmap_backup` in src/store/useStore.js:1916"}, "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-7c9beb512476e75a", "name": "Commented-code block (6 lines) in src/store/useStore.js:49", "shortDescription": {"text": "Commented-code block (6 lines) in src/store/useStore.js:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab1c301490e46c5a", "name": "Commented-code block (6 lines) in src/store/directContentDraftsStorage.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/store/directContentDraftsStorage.js: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-ea1c58d87f17d0fc", "name": "Legacy-named symbol `b_old` in src/store/__tests__/useBriefs.test.js:75", "shortDescription": {"text": "Legacy-named symbol `b_old` in src/store/__tests__/useBriefs.test.js:75"}, "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-2957ef3f2c1964c9", "name": "Commented-code block (5 lines) in src/store/__tests__/globePersistence.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/store/__tests__/globePersistence.test.js: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-767f4353787c2c0d", "name": "Legacy-named symbol `totalOld` in src/opportunity-radar/services/entityNormalizer.ts:145", "shortDescription": {"text": "Legacy-named symbol `totalOld` in src/opportunity-radar/services/entityNormalizer.ts:145"}, "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-4b4fae73c1a15f38", "name": "Commented-code block (6 lines) in src/opportunity-radar/services/conceptGenerator.ts:445", "shortDescription": {"text": "Commented-code block (6 lines) in src/opportunity-radar/services/conceptGenerator.ts:445"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3ccee41cdbbc6df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/flowtask/flowtaskApi.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flowtask/flowtaskApi.js:7"}, "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-d0caac78dda134bc", "name": "Commented-code block (5 lines) in src/views/Topics.jsx:62", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/Topics.jsx:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b426a7b5c38e05c", "name": "Commented-code block (5 lines) in src/views/Chat.jsx:51", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/Chat.jsx:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18d78218aff309e8", "name": "Commented-code block (5 lines) in src/views/VentureFlow.jsx:327", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/VentureFlow.jsx:327"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e83256fcfd4df0d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowApi.js:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowApi.js:10"}, "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-b04eaa165dd63721", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowExecutor.js:432", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowExecutor.js:432"}, "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-d87a049204afb915", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/__tests__/workflowApi.test.js:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/__tests__/workflowApi.test.js:26"}, "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-0969da30e2533d01", "name": "Commented-code block (5 lines) in src/views/moneyFlow/MasterPlanView.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/MasterPlanView.jsx: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-6a43ff010e95a823", "name": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyDashboardV2.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyDashboardV2.jsx: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-03f46bf92282b8b9", "name": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyShell.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyShell.jsx: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-f348988649bfe6ef", "name": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyExpenses.jsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyExpenses.jsx: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-56690a5ada5401bc", "name": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx: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-5e837363d760d8d8", "name": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyOnboarding.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyOnboarding.jsx: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-7fbf551a084bca21", "name": "Commented-code block (6 lines) in src/flow-ai/services/agentLoopService.ts:127", "shortDescription": {"text": "Commented-code block (6 lines) in src/flow-ai/services/agentLoopService.ts:127"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-badee220b76b77a6", "name": "Frontend route `/venture-flow/:id/print/sprint` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/venture-flow/:id/print/sprint` has no Link/navigate to it \u2014 src/App.jsx"}, "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-9a58a6b97cd02a00", "name": "Frontend route `/venture-flow/:id/print/user-test` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/venture-flow/:id/print/user-test` has no Link/navigate to it \u2014 src/App.jsx"}, "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-2136b8ba126b264c", "name": "Frontend route `/venture-flow/:id/print/prd` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/venture-flow/:id/print/prd` has no Link/navigate to it \u2014 src/App.jsx"}, "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-0397b9bfef44ecc0", "name": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.jsx"}, "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-b61b1dfaf10b7317", "name": "Frontend route `/flow-trade-legacy` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/flow-trade-legacy` has no Link/navigate to it \u2014 src/App.jsx"}, "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-047975854d89cc87", "name": "Frontend route `/money` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money` has no Link/navigate to it \u2014 src/App.jsx"}, "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-60e52ae660b198bb", "name": "Frontend route `/money-flow-v1` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money-flow-v1` has no Link/navigate to it \u2014 src/App.jsx"}, "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-02e868906957827b", "name": "Frontend route `/money-v2` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money-v2` has no Link/navigate to it \u2014 src/App.jsx"}, "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-35857fecfe6a7700", "name": "Frontend route `/money-v2/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money-v2/*` has no Link/navigate to it \u2014 src/App.jsx"}, "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-a4a0024c7804cfe2", "name": "Frontend route `/money/plan` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/plan` has no Link/navigate to it \u2014 src/App.jsx"}, "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-0b00a8ec2df88300", "name": "Frontend route `/money/plan/goals` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/plan/goals` has no Link/navigate to it \u2014 src/App.jsx"}, "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-bac8b348debe5f9f", "name": "Frontend route `/money/plan/scenarios` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/plan/scenarios` has no Link/navigate to it \u2014 src/App.jsx"}, "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-25f5a8e431ff7cad", "name": "Frontend route `/money/plan/timeline` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/plan/timeline` has no Link/navigate to it \u2014 src/App.jsx"}, "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-414e80824ea068ce", "name": "Frontend route `/money/plan/frameworks` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/plan/frameworks` has no Link/navigate to it \u2014 src/App.jsx"}, "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-07b097b8273a2ade", "name": "Frontend route `/money/property` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/money/property` has no Link/navigate to it \u2014 src/App.jsx"}, "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-6beacc431fa8681d", "name": "Frontend route `accounts` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `accounts` has no Link/navigate to it \u2014 src/App.jsx"}, "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-769f9b9e24328692", "name": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.jsx"}, "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-1b23fc1b26108fde", "name": "Frontend route `expenses` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 src/App.jsx"}, "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-816b60dde6eb2980", "name": "Frontend route `payroll` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 src/App.jsx"}, "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-b506f235fce95297", "name": "Frontend route `goals` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `goals` has no Link/navigate to it \u2014 src/App.jsx"}, "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-214bf1b6ce2f38d7", "name": "Frontend route `goals/:id` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `goals/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "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-2e585e82c320b59e", "name": "Frontend route `finance-plan` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `finance-plan` has no Link/navigate to it \u2014 src/App.jsx"}, "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-c2155df42cee865c", "name": "Frontend route `investments` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `investments` has no Link/navigate to it \u2014 src/App.jsx"}, "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-597694ba8ac569f7", "name": "Frontend route `401k` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `401k` has no Link/navigate to it \u2014 src/App.jsx"}, "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-d02b5b93fedcde2d", "name": "Frontend route `property` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `property` has no Link/navigate to it \u2014 src/App.jsx"}, "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-55036a229970a88b", "name": "Frontend route `tax` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `tax` has no Link/navigate to it \u2014 src/App.jsx"}, "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-98d6611c415a1808", "name": "Frontend route `gallery` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `gallery` has no Link/navigate to it \u2014 src/App.jsx"}, "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-d6c8ea607f5defb7", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}/with-timestamps (vite-plugin-e", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}/with-timestamps (vite-plugin-elevenlabs.js:66)"}, "fullDescription": {"text": "`vite-plugin-elevenlabs.js:66` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}/with-timestamps` 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.elevenlabs.io/v1/text-to-speech/<p>/with-timestamps`\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-558d500b1fca9ba0", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}?output_format=mp3_44100_128 (v", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}?output_format=mp3_44100_128 (vite-plugin-elevenlabs.js:91)"}, "fullDescription": {"text": "`vite-plugin-elevenlabs.js:91` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}?output_format=mp3_44100_128` 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.elevenlabs.io/v1/text-to-speech/<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-288239d317f33f07", "name": "Dangling fetch: GET https://api.elevenlabs.io/v1/user (vite-plugin-elevenlabs.js:147)", "shortDescription": {"text": "Dangling fetch: GET https://api.elevenlabs.io/v1/user (vite-plugin-elevenlabs.js:147)"}, "fullDescription": {"text": "`vite-plugin-elevenlabs.js:147` calls `GET https://api.elevenlabs.io/v1/user` 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.elevenlabs.io/v1/user`\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-ff4be91dd1adcb62", "name": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/components/DockerMCPPanel.jsx:18)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/components/DockerMCPPanel.jsx:18)"}, "fullDescription": {"text": "`src/mcp/components/DockerMCPPanel.jsx:18` calls `GET /api/daemon-proxy${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/<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-3e36b47a2271632d", "name": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/components/briefs/BriefModal.jsx:28)", "shortDescription": {"text": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/components/briefs/BriefModal.jsx:28)"}, "fullDescription": {"text": "`src/components/briefs/BriefModal.jsx:28` calls `GET https://api.microlink.io?url=${encodeURIComponent(url)}` 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.microlink.io`\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-5711117b994a53f7", "name": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:99)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:99)"}, "fullDescription": {"text": "`src/components/settings/ApiKeyCards.jsx:99` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-9226b0408533bb8c", "name": "Dangling fetch: POST /api/save-alpaca-creds (src/components/settings/ApiKeyCards.jsx:406)", "shortDescription": {"text": "Dangling fetch: POST /api/save-alpaca-creds (src/components/settings/ApiKeyCards.jsx:406)"}, "fullDescription": {"text": "`src/components/settings/ApiKeyCards.jsx:406` calls `POST /api/save-alpaca-creds` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save-alpaca-creds`\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-320f43f660479e5a", "name": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:496)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:496)"}, "fullDescription": {"text": "`src/components/settings/ApiKeyCards.jsx:496` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-a38c1365f1948e49", "name": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/test (src/components/settings/ApiKeyCards.jsx:513)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/test (src/components/settings/ApiKeyCards.jsx:513)"}, "fullDescription": {"text": "`src/components/settings/ApiKeyCards.jsx:513` calls `POST /api/daemon-proxy/gmail-imap/test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/gmail-imap/test`\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-f3829ea20de8e0ee", "name": "Dangling fetch: GET /api/connections (src/components/settings/useApiServices.jsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/components/settings/useApiServices.jsx:22)"}, "fullDescription": {"text": "`src/components/settings/useApiServices.jsx:22` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-3ea6e13e547348d3", "name": "Dangling fetch: GET /api/launcher/status (src/components/layout/LeftRail.jsx:152)", "shortDescription": {"text": "Dangling fetch: GET /api/launcher/status (src/components/layout/LeftRail.jsx:152)"}, "fullDescription": {"text": "`src/components/layout/LeftRail.jsx:152` calls `GET /api/launcher/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/launcher/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a20e21a1c6e315e", "name": "Dangling fetch: GET /api/ollama/api/tags (src/components/layout/SettingsMenu.jsx:85)", "shortDescription": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/layout/SettingsMenu.jsx:85)"}, "fullDescription": {"text": "`src/components/layout/SettingsMenu.jsx:85` calls `GET /api/ollama/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/tags`\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-f52c9e022fa3a028", "name": "Dangling fetch: GET /api/backups (src/components/memory/BackupPanel.jsx:18)", "shortDescription": {"text": "Dangling fetch: GET /api/backups (src/components/memory/BackupPanel.jsx:18)"}, "fullDescription": {"text": "`src/components/memory/BackupPanel.jsx:18` calls `GET /api/backups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backups`\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-10ce07b4b01ff778", "name": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:25)", "shortDescription": {"text": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:25)"}, "fullDescription": {"text": "`src/components/memory/BackupPanel.jsx:25` calls `POST /api/backups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backups`\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-411f0b9cb2349534", "name": "Dangling fetch: GET /api/backups/${encodeURIComponent(b.name)} (src/components/memory/BackupPanel.jsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/backups/${encodeURIComponent(b.name)} (src/components/memory/BackupPanel.jsx:35)"}, "fullDescription": {"text": "`src/components/memory/BackupPanel.jsx:35` calls `GET /api/backups/${encodeURIComponent(b.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backups/<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-66140f01e79371fb", "name": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:46)", "shortDescription": {"text": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:46)"}, "fullDescription": {"text": "`src/components/memory/BackupPanel.jsx:46` calls `POST /api/backups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backups`\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-b01df7a7ef59b59d", "name": "Dangling fetch: GET /api/ollama/api/tags (src/components/memory/KnowledgeOverview.jsx:1235)", "shortDescription": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/memory/KnowledgeOverview.jsx:1235)"}, "fullDescription": {"text": "`src/components/memory/KnowledgeOverview.jsx:1235` calls `GET /api/ollama/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/tags`\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-41a3b8afb824d0d0", "name": "Dangling fetch: GET /api/ollama/api/tags (src/components/flow/QuickChatLauncher.jsx:280)", "shortDescription": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/flow/QuickChatLauncher.jsx:280)"}, "fullDescription": {"text": "`src/components/flow/QuickChatLauncher.jsx:280` calls `GET /api/ollama/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/tags`\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-c68b5992a93a0753", "name": "Dangling fetch: POST /api/ollama/api/generate (src/flow-globe/GlobeOverlay.jsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/ollama/api/generate (src/flow-globe/GlobeOverlay.jsx:54)"}, "fullDescription": {"text": "`src/flow-globe/GlobeOverlay.jsx:54` calls `POST /api/ollama/api/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/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-94f360d922092ee6", "name": "Dangling fetch: POST /api/daemon-proxy/jobs (src/flow-globe/flightUtils.js:129)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/jobs (src/flow-globe/flightUtils.js:129)"}, "fullDescription": {"text": "`src/flow-globe/flightUtils.js:129` calls `POST /api/daemon-proxy/jobs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/jobs`\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-281c5ce083b22ad9", "name": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/flow-globe/flightUtils.js:138)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/flow-globe/flightUtils.js:138)"}, "fullDescription": {"text": "`src/flow-globe/flightUtils.js:138` calls `GET /api/daemon-proxy/jobs/${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/jobs/<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-869d1d330e6f059c", "name": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?${p} (src/flow-globe/weatherService.js:55)", "shortDescription": {"text": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?${p} (src/flow-globe/weatherService.js:55)"}, "fullDescription": {"text": "`src/flow-globe/weatherService.js:55` calls `GET https://api.open-meteo.com/v1/forecast?${p}` 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.open-meteo.com/v1/forecast`\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-abedb8512eca7411", "name": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/flow-globe/FlightSearch.jsx:144)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/flow-globe/FlightSearch.jsx:144)"}, "fullDescription": {"text": "`src/flow-globe/FlightSearch.jsx:144` calls `POST https://api.telegram.org/bot${token}/sendMessage` 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.telegram.org/bot/<p>/sendmessage`\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-0b8a3643e968584b", "name": "Dangling fetch: GET /api/connections (src/lib/connectionsSync.js:50)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/lib/connectionsSync.js:50)"}, "fullDescription": {"text": "`src/lib/connectionsSync.js:50` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-667deccae43b7c89", "name": "Dangling fetch: POST /api/connections (src/lib/connectionsSync.js:76)", "shortDescription": {"text": "Dangling fetch: POST /api/connections (src/lib/connectionsSync.js:76)"}, "fullDescription": {"text": "`src/lib/connectionsSync.js:76` calls `POST /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-9d345c2ae8b12bbc", "name": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/lib/telegram.js:28)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/lib/telegram.js:28)"}, "fullDescription": {"text": "`src/lib/telegram.js:28` calls `POST https://api.telegram.org/bot${token}/sendMessage` 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.telegram.org/bot/<p>/sendmessage`\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-24c4efc2c2a17868", "name": "Dangling fetch: GET https://www.virustotal.com/api/v3/urls/${urlId(url)} (src/lib/virustotal.js:40)", "shortDescription": {"text": "Dangling fetch: GET https://www.virustotal.com/api/v3/urls/${urlId(url)} (src/lib/virustotal.js:40)"}, "fullDescription": {"text": "`src/lib/virustotal.js:40` calls `GET https://www.virustotal.com/api/v3/urls/${urlId(url)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.virustotal.com/api/v3/urls/<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-1f939993fd4986f7", "name": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(watchUrl)} (src/lib/youtubeAvailability.js:27)", "shortDescription": {"text": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(watchUrl)} (src/lib/youtubeAvailability.js:27)"}, "fullDescription": {"text": "`src/lib/youtubeAvailability.js:27` calls `GET https://noembed.com/embed?url=${encodeURIComponent(watchUrl)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/noembed.com/embed`\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-5168839e68d914c5", "name": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(url)} (src/lib/manualIngest.js:64)", "shortDescription": {"text": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(url)} (src/lib/manualIngest.js:64)"}, "fullDescription": {"text": "`src/lib/manualIngest.js:64` calls `GET https://noembed.com/embed?url=${encodeURIComponent(url)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/noembed.com/embed`\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-66c2b9b4f62f45ea", "name": "Dangling fetch: GET /api/ollama/api/tags (src/lib/flowAI/modelSelector.js:32)", "shortDescription": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/lib/flowAI/modelSelector.js:32)"}, "fullDescription": {"text": "`src/lib/flowAI/modelSelector.js:32` calls `GET /api/ollama/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/tags`\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-073f44896aa5d6bb", "name": "Dangling fetch: GET /api/daemon-proxy${path} (src/lib/chat/daemonTools.js:35)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/lib/chat/daemonTools.js:35)"}, "fullDescription": {"text": "`src/lib/chat/daemonTools.js:35` calls `GET /api/daemon-proxy${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/<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-32c8cb11aa6ea8a6", "name": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/lib/chat/daemonTools.js:137)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/lib/chat/daemonTools.js:137)"}, "fullDescription": {"text": "`src/lib/chat/daemonTools.js:137` calls `GET /api/daemon-proxy/jobs/${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/jobs/<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-e6344e83ac5dff69", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(voiceId)}?output_format=mp3_44100_", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(voiceId)}?output_format=mp3_44100_128 (src/lib/voice/player.js:229)"}, "fullDescription": {"text": "`src/lib/voice/player.js:229` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(voiceId)}?output_format=mp3_44100_128` 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.elevenlabs.io/v1/text-to-speech/<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-9acdfe0dae06fa57", "name": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:241)", "shortDescription": {"text": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:241)"}, "fullDescription": {"text": "`src/lib/voice/player.js:241` calls `POST /api/tts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tts`\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-911f2113e483d99f", "name": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:358)", "shortDescription": {"text": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:358)"}, "fullDescription": {"text": "`src/lib/voice/player.js:358` calls `POST /api/tts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tts`\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-53021e2ce1afe181", "name": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/lib/search/ogImage.js:84)", "shortDescription": {"text": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/lib/search/ogImage.js:84)"}, "fullDescription": {"text": "`src/lib/search/ogImage.js:84` calls `GET https://api.microlink.io?url=${encodeURIComponent(url)}` 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.microlink.io`\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-531a26c9c7460bac", "name": "Dangling fetch: POST /api/validate-elevenlabs (src/lib/credentials/validateOnSave.js:15)", "shortDescription": {"text": "Dangling fetch: POST /api/validate-elevenlabs (src/lib/credentials/validateOnSave.js:15)"}, "fullDescription": {"text": "`src/lib/credentials/validateOnSave.js:15` calls `POST /api/validate-elevenlabs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/validate-elevenlabs`\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-965e283e8e3460cc", "name": "Dangling fetch: GET https://api.higgsfield.ai/v1/auth/check (src/lib/credentials/validateOnSave.js:42)", "shortDescription": {"text": "Dangling fetch: GET https://api.higgsfield.ai/v1/auth/check (src/lib/credentials/validateOnSave.js:42)"}, "fullDescription": {"text": "`src/lib/credentials/validateOnSave.js:42` calls `GET https://api.higgsfield.ai/v1/auth/check` 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.higgsfield.ai/v1/auth/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-ae271000e380e9ec", "name": "Dangling fetch: GET /api/daemon-proxy/docker-mcp/servers (src/diagnostics/errorFixer.js:256)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/docker-mcp/servers (src/diagnostics/errorFixer.js:256)"}, "fullDescription": {"text": "`src/diagnostics/errorFixer.js:256` calls `GET /api/daemon-proxy/docker-mcp/servers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/docker-mcp/servers`\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-4ca9bde958282da0", "name": "Dangling fetch: POST /api/daemon-proxy/jobs (src/diagnostics/errorFixer.js:265)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/jobs (src/diagnostics/errorFixer.js:265)"}, "fullDescription": {"text": "`src/diagnostics/errorFixer.js:265` calls `POST /api/daemon-proxy/jobs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/jobs`\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-a15d9527c40cb9b3", "name": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/diagnostics/errorFixer.js:274)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/diagnostics/errorFixer.js:274)"}, "fullDescription": {"text": "`src/diagnostics/errorFixer.js:274` calls `GET /api/daemon-proxy/jobs/${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/jobs/<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-673c212fc2ff1086", "name": "Dangling fetch: GET /api/daemon-proxy/flow-trade/status (src/diagnostics/connectionHealthCheck.js:83)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/flow-trade/status (src/diagnostics/connectionHealthCheck.js:83)"}, "fullDescription": {"text": "`src/diagnostics/connectionHealthCheck.js:83` calls `GET /api/daemon-proxy/flow-trade/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/flow-trade/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84c6b471c97c5707", "name": "Dangling fetch: GET /api/connections (src/diagnostics/connectionHealthCheck.js:111)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/diagnostics/connectionHealthCheck.js:111)"}, "fullDescription": {"text": "`src/diagnostics/connectionHealthCheck.js:111` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-2e8b67f560181480", "name": "Dangling fetch: GET /api/yahoo-finance/v7/finance/quote?symbols=${syms}&fields=regularMarketPrice,regularMarketChange,re", "shortDescription": {"text": "Dangling fetch: GET /api/yahoo-finance/v7/finance/quote?symbols=${syms}&fields=regularMarketPrice,regularMarketChange,regularMarketChangePercent,symbol (src/flow-trade/StockTicker.jsx:11)"}, "fullDescription": {"text": "`src/flow-trade/StockTicker.jsx:11` calls `GET /api/yahoo-finance/v7/finance/quote?symbols=${syms}&fields=regularMarketPrice,regularMarketChange,regularMarketChangePercent,symbol` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/yahoo-finance/v7/finance/quote`\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-db592191b479e51f", "name": "Dangling fetch: GET /api/daemon-proxy/flow-trade/events (src/flow-trade/useFlowTradeSSE.js:38)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy/flow-trade/events (src/flow-trade/useFlowTradeSSE.js:38)"}, "fullDescription": {"text": "`src/flow-trade/useFlowTradeSSE.js:38` calls `GET /api/daemon-proxy/flow-trade/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/flow-trade/events`\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-2dee6eaafd269551", "name": "Dangling fetch: GET https://r.jina.ai/${url} (src/flow-trade/FlowTradeChat.jsx:9)", "shortDescription": {"text": "Dangling fetch: GET https://r.jina.ai/${url} (src/flow-trade/FlowTradeChat.jsx:9)"}, "fullDescription": {"text": "`src/flow-trade/FlowTradeChat.jsx:9` calls `GET https://r.jina.ai/${url}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/r.jina.ai/<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-cedb663594017353", "name": "Dangling fetch: GET /api/daemon-proxy${path} (src/flow-trade/api.js:29)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/flow-trade/api.js:29)"}, "fullDescription": {"text": "`src/flow-trade/api.js:29` calls `GET /api/daemon-proxy${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/<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-3c756cd10e2d66b9", "name": "Dangling fetch: GET /api/connections (src/views/SystemPanel.jsx:366)", "shortDescription": {"text": "Dangling fetch: GET /api/connections (src/views/SystemPanel.jsx:366)"}, "fullDescription": {"text": "`src/views/SystemPanel.jsx:366` calls `GET /api/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connections`\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-0d73cab45153d52a", "name": "Dangling fetch: GET /api/env-keys (src/views/SystemPanel.jsx:373)", "shortDescription": {"text": "Dangling fetch: GET /api/env-keys (src/views/SystemPanel.jsx:373)"}, "fullDescription": {"text": "`src/views/SystemPanel.jsx:373` calls `GET /api/env-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/env-keys`\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-67ccdfe8161d4723", "name": "Dangling fetch: GET https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(val.trim())}&format=json&limit=4&a", "shortDescription": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(val.trim())}&format=json&limit=4&addressdetails=1 (src/views/GlobeView.jsx:203)"}, "fullDescription": {"text": "`src/views/GlobeView.jsx:203` calls `GET https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(val.trim())}&format=json&limit=4&addressdetails=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/nominatim.openstreetmap.org/search`\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-e5140e9bd02557f8", "name": "Dangling fetch: GET /api/ollama/api/tags (src/views/Chat.jsx:752)", "shortDescription": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/views/Chat.jsx:752)"}, "fullDescription": {"text": "`src/views/Chat.jsx:752` calls `GET /api/ollama/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ollama/api/tags`\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-132347d048455e7c", "name": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/list-unread (src/views/workflows/workflowExecutor.js:227)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/list-unread (src/views/workflows/workflowExecutor.js:227)"}, "fullDescription": {"text": "`src/views/workflows/workflowExecutor.js:227` calls `POST /api/daemon-proxy/gmail-imap/list-unread` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/gmail-imap/list-unread`\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-1ceecef5492b3a15", "name": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/create-draft (src/views/workflows/workflowExecutor.js:432)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/create-draft (src/views/workflows/workflowExecutor.js:432)"}, "fullDescription": {"text": "`src/views/workflows/workflowExecutor.js:432` calls `POST /api/daemon-proxy/gmail-imap/create-draft` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/gmail-imap/create-draft`\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-366a2a37ad5bc7db", "name": "Dangling fetch: GET /data/employers-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:485)", "shortDescription": {"text": "Dangling fetch: GET /data/employers-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:485)"}, "fullDescription": {"text": "`src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:485` calls `GET /data/employers-us.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/employers-us.json`\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-90e41e7eedf9cb45", "name": "Dangling fetch: GET /data/merchants-common.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:593)", "shortDescription": {"text": "Dangling fetch: GET /data/merchants-common.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:593)"}, "fullDescription": {"text": "`src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:593` calls `GET /data/merchants-common.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/merchants-common.json`\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-973f602734f29665", "name": "Dangling fetch: GET /data/lenders-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:721)", "shortDescription": {"text": "Dangling fetch: GET /data/lenders-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:721)"}, "fullDescription": {"text": "`src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:721` calls `GET /data/lenders-us.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/lenders-us.json`\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-633431a3ff6e664d", "name": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (daemon/src/media/imageUpload.ts:50)", "shortDescription": {"text": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (daemon/src/media/imageUpload.ts:50)"}, "fullDescription": {"text": "`daemon/src/media/imageUpload.ts:50` calls `POST https://tmpfiles.org/api/v1/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/tmpfiles.org/api/v1/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-a560a94eed7d03fc", "name": "Dangling fetch: POST https://0x0.st (daemon/src/media/imageUpload.ts:75)", "shortDescription": {"text": "Dangling fetch: POST https://0x0.st (daemon/src/media/imageUpload.ts:75)"}, "fullDescription": {"text": "`daemon/src/media/imageUpload.ts:75` calls `POST https://0x0.st` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/0x0.st`\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-47675a5393828d2c", "name": "Dangling fetch: GET https://api.adsbdb.com/v0/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.ts:2", "shortDescription": {"text": "Dangling fetch: GET https://api.adsbdb.com/v0/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.ts:281)"}, "fullDescription": {"text": "`daemon/src/live-sky/service.ts:281` calls `GET https://api.adsbdb.com/v0/callsign/${encodeURIComponent(callsign)}` 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.adsbdb.com/v0/callsign/<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-b3d59cd1f964e47f", "name": "Dangling fetch: GET https://api.airplanes.live/v2/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.", "shortDescription": {"text": "Dangling fetch: GET https://api.airplanes.live/v2/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.ts:407)"}, "fullDescription": {"text": "`daemon/src/live-sky/service.ts:407` calls `GET https://api.airplanes.live/v2/callsign/${encodeURIComponent(callsign)}` 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.airplanes.live/v2/callsign/<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-f0fc5e520ecb085f", "name": "Dangling fetch: GET http://127.0.0.1:${info.port}/health (src/mcp/providers/localProvider.ts:114)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${info.port}/health (src/mcp/providers/localProvider.ts:114)"}, "fullDescription": {"text": "`src/mcp/providers/localProvider.ts:114` calls `GET http://127.0.0.1:${info.port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\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-1247c595ce1a0851", "name": "Dangling fetch: POST /api/daemon-proxy/tools/generate-pptx (src/mcp/services/telegramAgent.ts:381)", "shortDescription": {"text": "Dangling fetch: POST /api/daemon-proxy/tools/generate-pptx (src/mcp/services/telegramAgent.ts:381)"}, "fullDescription": {"text": "`src/mcp/services/telegramAgent.ts:381` calls `POST /api/daemon-proxy/tools/generate-pptx` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/tools/generate-pptx`\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-f478b9979b23a7dc", "name": "Dangling fetch: GET /api/searxng/search?q=${encodeURIComponent(slots.search_query)}&format=json (src/mcp/services/telegr", "shortDescription": {"text": "Dangling fetch: GET /api/searxng/search?q=${encodeURIComponent(slots.search_query)}&format=json (src/mcp/services/telegramAgent.ts:411)"}, "fullDescription": {"text": "`src/mcp/services/telegramAgent.ts:411` calls `GET /api/searxng/search?q=${encodeURIComponent(slots.search_query)}&format=json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/searxng/search`\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-96ac0677bcb47e8c", "name": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/services/daemonApi.ts:15)", "shortDescription": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/services/daemonApi.ts:15)"}, "fullDescription": {"text": "`src/mcp/services/daemonApi.ts:15` calls `GET /api/daemon-proxy${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daemon-proxy/<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-a5eeb749f3434cae", "name": "Dangling fetch: POST /api/memory-index (src/memory-index/generator.ts:44)", "shortDescription": {"text": "Dangling fetch: POST /api/memory-index (src/memory-index/generator.ts:44)"}, "fullDescription": {"text": "`src/memory-index/generator.ts:44` calls `POST /api/memory-index` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/memory-index`\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-0d9829ea69071eb3", "name": "Unused endpoint: USE /api/memory-index", "shortDescription": {"text": "Unused endpoint: USE /api/memory-index"}, "fullDescription": {"text": "`vite-plugin-flowagent-sync.js` declares `USE /api/memory-index` 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-ec1e6719c2b66ed2", "name": "Unused endpoint: USE /api/state", "shortDescription": {"text": "Unused endpoint: USE /api/state"}, "fullDescription": {"text": "`vite-plugin-flowagent-sync.js` declares `USE /api/state` 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-8b8ab10e6495b536", "name": "Unused endpoint: USE /api/daemon/info", "shortDescription": {"text": "Unused endpoint: USE /api/daemon/info"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/daemon/info` 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-b625bd59c0654e2f", "name": "Unused endpoint: USE /api/connections", "shortDescription": {"text": "Unused endpoint: USE /api/connections"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/connections` 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-258999fa5041b742", "name": "Unused endpoint: USE /api/env-keys", "shortDescription": {"text": "Unused endpoint: USE /api/env-keys"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/env-keys` 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-12b2ce7de900a228", "name": "Unused endpoint: USE /api/save-alpaca-creds", "shortDescription": {"text": "Unused endpoint: USE /api/save-alpaca-creds"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/save-alpaca-creds` 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-ddf3e22257ceb5f7", "name": "Unused endpoint: USE /api/launcher/status", "shortDescription": {"text": "Unused endpoint: USE /api/launcher/status"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/launcher/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5edff3d861538ac4", "name": "Unused endpoint: USE /api/launcher/start-daemon", "shortDescription": {"text": "Unused endpoint: USE /api/launcher/start-daemon"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/launcher/start-daemon` 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-ff24e75b63921154", "name": "Unused endpoint: USE /api/launcher/stop-daemon", "shortDescription": {"text": "Unused endpoint: USE /api/launcher/stop-daemon"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/launcher/stop-daemon` 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-afdd279821e8c2f1", "name": "Unused endpoint: USE /api/launcher/restart-daemon", "shortDescription": {"text": "Unused endpoint: USE /api/launcher/restart-daemon"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/launcher/restart-daemon` 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-570b16dbc452cda8", "name": "Unused endpoint: USE /api/launcher/logs", "shortDescription": {"text": "Unused endpoint: USE /api/launcher/logs"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/launcher/logs` 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-8834e698aff856bc", "name": "Unused endpoint: USE /api/daemon-proxy", "shortDescription": {"text": "Unused endpoint: USE /api/daemon-proxy"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/daemon-proxy` 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-5f72e3fcd3a87a0f", "name": "Unused endpoint: USE /api/higgsfield", "shortDescription": {"text": "Unused endpoint: USE /api/higgsfield"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/higgsfield` 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-b7899619efdc8e41", "name": "Unused endpoint: USE /api/buffer", "shortDescription": {"text": "Unused endpoint: USE /api/buffer"}, "fullDescription": {"text": "`vite-plugin-daemon-info.js` declares `USE /api/buffer` 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-cf95de5072533b74", "name": "Unused endpoint: USE /api/validate-elevenlabs", "shortDescription": {"text": "Unused endpoint: USE /api/validate-elevenlabs"}, "fullDescription": {"text": "`vite-plugin-elevenlabs.js` declares `USE /api/validate-elevenlabs` 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-54922513d7dd0abe", "name": "Unused endpoint: USE /api/tts", "shortDescription": {"text": "Unused endpoint: USE /api/tts"}, "fullDescription": {"text": "`vite-plugin-elevenlabs.js` declares `USE /api/tts` 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-582b00fca2796501", "name": "Unused endpoint: GET /tools", "shortDescription": {"text": "Unused endpoint: GET /tools"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /tools` 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-50abf5ff9f938842", "name": "Unused endpoint: GET /docker-mcp/servers", "shortDescription": {"text": "Unused endpoint: GET /docker-mcp/servers"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /docker-mcp/servers` 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-00f754f553ebaecd", "name": "Unused endpoint: POST /docker-mcp/sync", "shortDescription": {"text": "Unused endpoint: POST /docker-mcp/sync"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /docker-mcp/sync` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed7d2fd8cf18d42c", "name": "Unused endpoint: POST /docker-mcp/servers", "shortDescription": {"text": "Unused endpoint: POST /docker-mcp/servers"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /docker-mcp/servers` 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-0ca13dc57ed9fda2", "name": "Unused endpoint: POST /docker-mcp/import-from-desktop", "shortDescription": {"text": "Unused endpoint: POST /docker-mcp/import-from-desktop"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /docker-mcp/import-from-desktop` 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-440f171c59130c92", "name": "Unused endpoint: PATCH /docker-mcp/servers/:id", "shortDescription": {"text": "Unused endpoint: PATCH /docker-mcp/servers/:id"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `PATCH /docker-mcp/servers/: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-a62833c41ba97a08", "name": "Unused endpoint: DELETE /docker-mcp/servers/:id", "shortDescription": {"text": "Unused endpoint: DELETE /docker-mcp/servers/:id"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `DELETE /docker-mcp/servers/: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-281a92bfb6aee524", "name": "Unused endpoint: GET /workspace-roots", "shortDescription": {"text": "Unused endpoint: GET /workspace-roots"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /workspace-roots` 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-e964c1e025a1aebd", "name": "Unused endpoint: POST /workspace-roots", "shortDescription": {"text": "Unused endpoint: POST /workspace-roots"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /workspace-roots` 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-4f0297ba070ccda1", "name": "Unused endpoint: DELETE /workspace-roots", "shortDescription": {"text": "Unused endpoint: DELETE /workspace-roots"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `DELETE /workspace-roots` 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-2b73face5b06aa67", "name": "Unused endpoint: POST /jobs", "shortDescription": {"text": "Unused endpoint: POST /jobs"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /jobs` 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-44195ef888a1a79a", "name": "Unused endpoint: POST /jobs/:id/cancel", "shortDescription": {"text": "Unused endpoint: POST /jobs/:id/cancel"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /jobs/:id/cancel` 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-09ee72aea5a0a2b7", "name": "Unused endpoint: GET /jobs/:id", "shortDescription": {"text": "Unused endpoint: GET /jobs/:id"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /jobs/: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-2527279df995164f", "name": "Unused endpoint: GET /system/health", "shortDescription": {"text": "Unused endpoint: GET /system/health"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /system/health` 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-e674e69292f924d3", "name": "Unused endpoint: GET /system/status", "shortDescription": {"text": "Unused endpoint: GET /system/status"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /system/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdadcffa0f3b2cbc", "name": "Unused endpoint: POST /system/pause-scheduler", "shortDescription": {"text": "Unused endpoint: POST /system/pause-scheduler"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /system/pause-scheduler` 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-dfccbdbf26f8f2fd", "name": "Unused endpoint: POST /system/resume-scheduler", "shortDescription": {"text": "Unused endpoint: POST /system/resume-scheduler"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /system/resume-scheduler` 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-a9b78ef619e66df4", "name": "Unused endpoint: GET /system/logs", "shortDescription": {"text": "Unused endpoint: GET /system/logs"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `GET /system/logs` 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-64609db1e1df4dc4", "name": "Unused endpoint: POST /system/shutdown", "shortDescription": {"text": "Unused endpoint: POST /system/shutdown"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /system/shutdown` 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-863863c3d422485b", "name": "Unused endpoint: POST /system/ollama/start", "shortDescription": {"text": "Unused endpoint: POST /system/ollama/start"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /system/ollama/start` 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-d01e281138d1d4e4", "name": "Unused endpoint: POST /system/ollama/enable-autorestart", "shortDescription": {"text": "Unused endpoint: POST /system/ollama/enable-autorestart"}, "fullDescription": {"text": "`daemon/src/server.ts` declares `POST /system/ollama/enable-autorestart` 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-7365f0ce804b43ca", "name": "Unused endpoint: POST /gmail-imap/test", "shortDescription": {"text": "Unused endpoint: POST /gmail-imap/test"}, "fullDescription": {"text": "`daemon/src/integrations/gmailImapRoutes.ts` declares `POST /gmail-imap/test` 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-7c98e344dc4dfeca", "name": "Unused endpoint: POST /gmail-imap/list-unread", "shortDescription": {"text": "Unused endpoint: POST /gmail-imap/list-unread"}, "fullDescription": {"text": "`daemon/src/integrations/gmailImapRoutes.ts` declares `POST /gmail-imap/list-unread` 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-7d6e9dbfeaa806a5", "name": "Unused endpoint: POST /gmail-imap/create-draft", "shortDescription": {"text": "Unused endpoint: POST /gmail-imap/create-draft"}, "fullDescription": {"text": "`daemon/src/integrations/gmailImapRoutes.ts` declares `POST /gmail-imap/create-draft` 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-caab864b539ecefa", "name": "Unused endpoint: POST /gmail-imap/send", "shortDescription": {"text": "Unused endpoint: POST /gmail-imap/send"}, "fullDescription": {"text": "`daemon/src/integrations/gmailImapRoutes.ts` declares `POST /gmail-imap/send` 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-b6bbee709773148e", "name": "Unused endpoint: POST /oauth/google/credentials", "shortDescription": {"text": "Unused endpoint: POST /oauth/google/credentials"}, "fullDescription": {"text": "`daemon/src/adapters/googleOAuthRoutes.ts` declares `POST /oauth/google/credentials` 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-f2f74337aa6fdd3d", "name": "Unused endpoint: GET /oauth/google/start-url", "shortDescription": {"text": "Unused endpoint: GET /oauth/google/start-url"}, "fullDescription": {"text": "`daemon/src/adapters/googleOAuthRoutes.ts` declares `GET /oauth/google/start-url` 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-eb03a5115c2d8a71", "name": "Unused endpoint: GET /oauth/google/callback", "shortDescription": {"text": "Unused endpoint: GET /oauth/google/callback"}, "fullDescription": {"text": "`daemon/src/adapters/googleOAuthRoutes.ts` declares `GET /oauth/google/callback` 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-28ce92359220924f", "name": "Unused endpoint: GET /oauth/google/status", "shortDescription": {"text": "Unused endpoint: GET /oauth/google/status"}, "fullDescription": {"text": "`daemon/src/adapters/googleOAuthRoutes.ts` declares `GET /oauth/google/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd7a44494ef5cc7e", "name": "Unused endpoint: DELETE /oauth/google/disconnect", "shortDescription": {"text": "Unused endpoint: DELETE /oauth/google/disconnect"}, "fullDescription": {"text": "`daemon/src/adapters/googleOAuthRoutes.ts` declares `DELETE /oauth/google/disconnect` 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-033ef9aba26faabf", "name": "Unused endpoint: POST /notifications/emit", "shortDescription": {"text": "Unused endpoint: POST /notifications/emit"}, "fullDescription": {"text": "`daemon/src/notifications/routes.ts` declares `POST /notifications/emit` 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-de79dccb21c4b0a2", "name": "Unused endpoint: GET /notifications/alerts", "shortDescription": {"text": "Unused endpoint: GET /notifications/alerts"}, "fullDescription": {"text": "`daemon/src/notifications/routes.ts` declares `GET /notifications/alerts` 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-d5787887cf924010", "name": "Unused endpoint: GET /notifications/alerts/unread-count", "shortDescription": {"text": "Unused endpoint: GET /notifications/alerts/unread-count"}, "fullDescription": {"text": "`daemon/src/notifications/routes.ts` declares `GET /notifications/alerts/unread-count` 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-068a2793ee933563", "name": "Unused endpoint: GET /notifications/alerts/:id", "shortDescription": {"text": "Unused endpoint: GET /notifications/alerts/:id"}, "fullDescription": {"text": "`daemon/src/notifications/routes.ts` declares `GET /notifications/alerts/: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/21174"}, "properties": {"repository": "thetwinnovators/FM-AI", "repoUrl": "https://github.com/thetwinnovators/FM-AI", "branch": "main"}, "results": [{"ruleId": "scanner-e1ca768ecf53c52b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 daemon/tests/adapters/nodeSandboxAdapter.test.ts:7"}, "properties": {"repobilityId": "7fe329f573991bf8", "scanner": "scanner-primary", "fingerprint": "e1ca768ecf53c52b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc3f5456ea595493", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/server.ts:554"}, "properties": {"repobilityId": "514ac2b8e89b2311", "scanner": "scanner-primary", "fingerprint": "dc3f5456ea595493", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08692a2bdaac17ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/media/imageUpload.ts:105"}, "properties": {"repobilityId": "36f76e5ae71518d7", "scanner": "scanner-primary", "fingerprint": "08692a2bdaac17ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d726e8966a95774f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/media/providers/higgsfield.ts:43"}, "properties": {"repobilityId": "c78b691c3fe8aac9", "scanner": "scanner-primary", "fingerprint": "d726e8966a95774f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ec9428d59323671", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 daemon/src/flow-trade/index.ts:257"}, "properties": {"repobilityId": "6b897c12342993db", "scanner": "scanner-primary", "fingerprint": "1ec9428d59323671", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3eeff3402d5781df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/notifications/NotificationTray.jsx:111"}, "properties": {"repobilityId": "c0a0c8b50f05c719", "scanner": "scanner-primary", "fingerprint": "3eeff3402d5781df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-887b73353068465b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy-sharing/components/ShareCourseModal.jsx:190"}, "properties": {"repobilityId": "5bfac373408ec4f8", "scanner": "scanner-primary", "fingerprint": "887b73353068465b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4cb2888fbbe0ebad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ExecutionRecordList.tsx:95"}, "properties": {"repobilityId": "cdeaa11d40b88377", "scanner": "scanner-primary", "fingerprint": "4cb2888fbbe0ebad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d6c20611c08756a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/DockerMCPPanel.jsx:64"}, "properties": {"repobilityId": "a099c74149dcc776", "scanner": "scanner-primary", "fingerprint": "0d6c20611c08756a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-407f01d6036f3d7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/components/ConnectionModal.jsx:163"}, "properties": {"repobilityId": "66378e533d9f0b77", "scanner": "scanner-primary", "fingerprint": "407f01d6036f3d7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19c7b862701b49b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/mcp/providers/mockTelegramProvider.ts:6"}, "properties": {"repobilityId": "4dfd7368eaeff3b4", "scanner": "scanner-primary", "fingerprint": "19c7b862701b49b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff1cb7620549fecd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/mcp/pages/MCPUseCasesPage.tsx:532"}, "properties": {"repobilityId": "5e9b9151455e2479", "scanner": "scanner-primary", "fingerprint": "ff1cb7620549fecd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f735a73fdb3eca82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/briefs/BriefsDropdown.jsx:87"}, "properties": {"repobilityId": "c85baf4fc311eadb", "scanner": "scanner-primary", "fingerprint": "f735a73fdb3eca82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f9b69b7fad56dcc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/money/MoneyFlowSettingsPanel.jsx:200"}, "properties": {"repobilityId": "6e5b9f86f24998b5", "scanner": "scanner-primary", "fingerprint": "6f9b69b7fad56dcc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e31f1ec3ff4e1d2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/LeftRail.jsx:121"}, "properties": {"repobilityId": "27d6a7f143ced2e8", "scanner": "scanner-primary", "fingerprint": "e31f1ec3ff4e1d2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b641338b10962e1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.jsx:410"}, "properties": {"repobilityId": "94cd1453061dbe5d", "scanner": "scanner-primary", "fingerprint": "b641338b10962e1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fa75235781638c7", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/TopBar.jsx:405"}, "properties": {"repobilityId": "b078c419b19e7a40", "scanner": "scanner-primary", "fingerprint": "6fa75235781638c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-ce179cf06f7f551d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/DaemonOfflineBanner.jsx:48"}, "properties": {"repobilityId": "b0aafa2ff55a1163", "scanner": "scanner-primary", "fingerprint": "ce179cf06f7f551d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cdef09d5cd63f16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/DraggableModal.jsx:78"}, "properties": {"repobilityId": "59eca7df31a66876", "scanner": "scanner-primary", "fingerprint": "5cdef09d5cd63f16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35c5cd48b4f23758", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Breadcrumb.jsx:41"}, "properties": {"repobilityId": "d6fd54ef9e16a461", "scanner": "scanner-primary", "fingerprint": "35c5cd48b4f23758", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-243d01c335bcd019", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityFramePanel.jsx:123"}, "properties": {"repobilityId": "6c045e3a08ba1832", "scanner": "scanner-primary", "fingerprint": "243d01c335bcd019", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-831053eb92dbbfab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/ScoreBar.jsx:17"}, "properties": {"repobilityId": "16651c1b05ed573c", "scanner": "scanner-primary", "fingerprint": "831053eb92dbbfab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01cc995d88098cab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/OpportunityRankChart.jsx:24"}, "properties": {"repobilityId": "dc7f0b9089a449be", "scanner": "scanner-primary", "fingerprint": "01cc995d88098cab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e90525158f168583", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/BriefTab.jsx:397"}, "properties": {"repobilityId": "645296fb4db1045d", "scanner": "scanner-primary", "fingerprint": "e90525158f168583", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4d059cc565d6ac1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/ScoresTab.jsx:111"}, "properties": {"repobilityId": "e77897127833221f", "scanner": "scanner-primary", "fingerprint": "b4d059cc565d6ac1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8f7a8ae9c556a35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/CompareTab.jsx:82"}, "properties": {"repobilityId": "e082e5a21e7fb50e", "scanner": "scanner-primary", "fingerprint": "f8f7a8ae9c556a35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec6fb5757867405a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/EvidenceTab.jsx:11"}, "properties": {"repobilityId": "2dc30fba3cefc33b", "scanner": "scanner-primary", "fingerprint": "ec6fb5757867405a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0bf55e101af92c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venture-scope/tabs/OverviewTab.jsx:574"}, "properties": {"repobilityId": "1706e7e71fb75c03", "scanner": "scanner-primary", "fingerprint": "e0bf55e101af92c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ce28d5e69be0ba6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create/FlowCreatePanel.jsx:512"}, "properties": {"repobilityId": "6b46fcb3bf678d92", "scanner": "scanner-primary", "fingerprint": "3ce28d5e69be0ba6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e17cf094506a036", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/memory/KnowledgeOverview.jsx:758"}, "properties": {"repobilityId": "45664a0e48d7f3f6", "scanner": "scanner-primary", "fingerprint": "0e17cf094506a036", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49c15013bc74542c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/topic/SummaryModal.jsx:161"}, "properties": {"repobilityId": "1a18c8ec741a3724", "scanner": "scanner-primary", "fingerprint": "49c15013bc74542c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48ed21ce078ec011", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostics/AutoFixToast.jsx:94"}, "properties": {"repobilityId": "1cdd942e0c8c2a8e", "scanner": "scanner-primary", "fingerprint": "48ed21ce078ec011", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5bfee6c14e24362d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoCard.jsx:64"}, "properties": {"repobilityId": "640d04b386ea8447", "scanner": "scanner-primary", "fingerprint": "5bfee6c14e24362d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fa3b2d16aef9a97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/VideoPlayerModal.jsx:82"}, "properties": {"repobilityId": "ca7653c124397d4d", "scanner": "scanner-primary", "fingerprint": "6fa3b2d16aef9a97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6623f782ec83689f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/content/ArticleCard.jsx:49"}, "properties": {"repobilityId": "b75c6d8a3fbb983f", "scanner": "scanner-primary", "fingerprint": "6623f782ec83689f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-207ab5aa699be885", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/opportunity/PatternTable.jsx:247"}, "properties": {"repobilityId": "51b87faf09e55a87", "scanner": "scanner-primary", "fingerprint": "207ab5aa699be885", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47412611045bc277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/SharedInboxTab.jsx:44"}, "properties": {"repobilityId": "f66d9c8a12c706f0", "scanner": "scanner-primary", "fingerprint": "47412611045bc277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2abf5e8ce79d7179", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/share/ShareDialog.jsx:51"}, "properties": {"repobilityId": "2c5de7710b47f51d", "scanner": "scanner-primary", "fingerprint": "2abf5e8ce79d7179", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b3dd9113d1c53a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/DerivedSignals.jsx:36"}, "properties": {"repobilityId": "7f67f0304c0c5096", "scanner": "scanner-primary", "fingerprint": "3b3dd9113d1c53a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a359d253a2f5e5a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/GlassSidebar.jsx:173"}, "properties": {"repobilityId": "1116dc1880b1d39f", "scanner": "scanner-primary", "fingerprint": "a359d253a2f5e5a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac8cd9433632adc3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/QuickChatLauncher.jsx:1358"}, "properties": {"repobilityId": "8c1847ebfcae8558", "scanner": "scanner-primary", "fingerprint": "ac8cd9433632adc3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d16e66c61ca8279", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow/ConnectedSources.jsx:32"}, "properties": {"repobilityId": "ef27710d0bca339f", "scanner": "scanner-primary", "fingerprint": "9d16e66c61ca8279", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1029249a1004b8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskEditor.jsx:214"}, "properties": {"repobilityId": "9be2ef1494621b33", "scanner": "scanner-primary", "fingerprint": "f1029249a1004b8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4573adb82271480d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskDetail.jsx:145"}, "properties": {"repobilityId": "a67fc6b7631864dc", "scanner": "scanner-primary", "fingerprint": "4573adb82271480d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bab1bd6a267ec1a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskInbox.jsx:52"}, "properties": {"repobilityId": "020ec10c2c880fe6", "scanner": "scanner-primary", "fingerprint": "bab1bd6a267ec1a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78ae40c25920ca43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskToday.jsx:69"}, "properties": {"repobilityId": "6041ff6a89d51e73", "scanner": "scanner-primary", "fingerprint": "78ae40c25920ca43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-795e73720f5c2345", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flowtask/TaskCalendar.jsx:78"}, "properties": {"repobilityId": "60b8e26d54c5fb1a", "scanner": "scanner-primary", "fingerprint": "795e73720f5c2345", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e699375906555a54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/WalletRail.jsx:38"}, "properties": {"repobilityId": "1f2e382601212097", "scanner": "scanner-primary", "fingerprint": "e699375906555a54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f1383fae512c0bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/ActivityFeed.jsx:52"}, "properties": {"repobilityId": "2a6e7eeb5175559e", "scanner": "scanner-primary", "fingerprint": "0f1383fae512c0bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3993583ce8118635", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/PresetChips.jsx:35"}, "properties": {"repobilityId": "0dd3c4e87871980f", "scanner": "scanner-primary", "fingerprint": "3993583ce8118635", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b32301a4a49a864b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/ImportModal.jsx:81"}, "properties": {"repobilityId": "365c3836018a674b", "scanner": "scanner-primary", "fingerprint": "b32301a4a49a864b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5710e9c47a87b718", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/AccountDetailModal.jsx:58"}, "properties": {"repobilityId": "6ce1b168a200f052", "scanner": "scanner-primary", "fingerprint": "5710e9c47a87b718", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4e8ba003f21b3fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/Dropdown.jsx:93"}, "properties": {"repobilityId": "a789f60956f55e68", "scanner": "scanner-primary", "fingerprint": "d4e8ba003f21b3fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e69396026ba92fdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/EntitySwitcher.jsx:75"}, "properties": {"repobilityId": "e589c6cf184578e9", "scanner": "scanner-primary", "fingerprint": "e69396026ba92fdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb69f5ca632aa936", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/moneyFlow/v2/RoundGraph.jsx:114"}, "properties": {"repobilityId": "696f5d59c7870511", "scanner": "scanner-primary", "fingerprint": "fb69f5ca632aa936", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47d46b632a8e9c0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/GlobeOverlay.jsx:281"}, "properties": {"repobilityId": "20018e3bb05b7270", "scanner": "scanner-primary", "fingerprint": "47d46b632a8e9c0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d97e9393b8ab629", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/LocationSearch.jsx:123"}, "properties": {"repobilityId": "ce58279ce8f5b4cb", "scanner": "scanner-primary", "fingerprint": "5d97e9393b8ab629", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c263d0168c7c7d9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/FlightSearch.jsx:101"}, "properties": {"repobilityId": "559357c48418d8cf", "scanner": "scanner-primary", "fingerprint": "c263d0168c7c7d9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fa0edef96b5adbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-globe/liveSky/LiveSkyCard.jsx:89"}, "properties": {"repobilityId": "b57ac671dc7eff4a", "scanner": "scanner-primary", "fingerprint": "1fa0edef96b5adbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab7b1234418ee05a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chat/retrieve.js:735"}, "properties": {"repobilityId": "8a79ff86a408bb32", "scanner": "scanner-primary", "fingerprint": "ab7b1234418ee05a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7cc92c860610ee8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/voice/useMicTranscription.js:133"}, "properties": {"repobilityId": "50c590d72b54f55a", "scanner": "scanner-primary", "fingerprint": "e7cc92c860610ee8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b945138a247fbf9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/AcademyHome.jsx:118"}, "properties": {"repobilityId": "bccd38f5b8084a52", "scanner": "scanner-primary", "fingerprint": "b945138a247fbf9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8fb46307e75eae1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-academy/components/LessonView.jsx:523"}, "properties": {"repobilityId": "a65d360897821fd9", "scanner": "scanner-primary", "fingerprint": "8fb46307e75eae1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f95cb643a249056", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/WatchlistPanel.jsx:118"}, "properties": {"repobilityId": "424664a975f8a8ed", "scanner": "scanner-primary", "fingerprint": "6f95cb643a249056", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d14f40d7e1d36baf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/flow-trade/FlowTradeChat.jsx:209"}, "properties": {"repobilityId": "b1a06810dd6c9ac1", "scanner": "scanner-primary", "fingerprint": "d14f40d7e1d36baf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a2aada75fc93657", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/flow-trade/v2/Dashboard.jsx:327"}, "properties": {"repobilityId": "6e869658ad93fdec", "scanner": "scanner-primary", "fingerprint": "1a2aada75fc93657", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e68f563d9b7570ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyHome.jsx:61"}, "properties": {"repobilityId": "a8e23c4716f41b05", "scanner": "scanner-primary", "fingerprint": "e68f563d9b7570ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b7e88052955cf54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/code-academy/components/CodeAcademyPage.jsx:247"}, "properties": {"repobilityId": "a04923827d45fb06", "scanner": "scanner-primary", "fingerprint": "9b7e88052955cf54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4606914d1c20ca2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Documents.jsx:511"}, "properties": {"repobilityId": "335c117027ee8074", "scanner": "scanner-primary", "fingerprint": "d4606914d1c20ca2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78e1742d73b6d352", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlowDetail.jsx:105"}, "properties": {"repobilityId": "c6cd922992772b36", "scanner": "scanner-primary", "fingerprint": "78e1742d73b6d352", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f30c3973cc19401f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/SystemPanel.jsx:140"}, "properties": {"repobilityId": "5fd3ec2cc344521e", "scanner": "scanner-primary", "fingerprint": "f30c3973cc19401f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f80b511098784ca3", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/views/SystemPanel.jsx:385"}, "properties": {"repobilityId": "d9aeae62a15abc19", "scanner": "scanner-primary", "fingerprint": "f80b511098784ca3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-171f92e7fe69279a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Alerts.jsx:318"}, "properties": {"repobilityId": "7d0291dadc839f64", "scanner": "scanner-primary", "fingerprint": "171f92e7fe69279a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fb4a77dcdbee5e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Search.jsx:91"}, "properties": {"repobilityId": "6f49b7956c196f7f", "scanner": "scanner-primary", "fingerprint": "6fb4a77dcdbee5e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c80f67a13f6e9756", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Signals.jsx:246"}, "properties": {"repobilityId": "c981e5f8173ca2c2", "scanner": "scanner-primary", "fingerprint": "c80f67a13f6e9756", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf25a1b0f48e59e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topics.jsx:478"}, "properties": {"repobilityId": "d233ecad8965bbfe", "scanner": "scanner-primary", "fingerprint": "bf25a1b0f48e59e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd62b7437b70a7a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Memory.jsx:199"}, "properties": {"repobilityId": "1ed6eb9aeb889115", "scanner": "scanner-primary", "fingerprint": "bd62b7437b70a7a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa691fc2414de3e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/ContentDrafts.jsx:196"}, "properties": {"repobilityId": "4f9a9d3a81a1f4ac", "scanner": "scanner-primary", "fingerprint": "aa691fc2414de3e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d7eed51573d9168", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Topic.jsx:86"}, "properties": {"repobilityId": "38c9f138e2cb1b16", "scanner": "scanner-primary", "fingerprint": "6d7eed51573d9168", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05dd33db3777a827", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/GlobeView.jsx:93"}, "properties": {"repobilityId": "a1deb7c72599eba6", "scanner": "scanner-primary", "fingerprint": "05dd33db3777a827", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c138010e38eeea65", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Sitemap.jsx:226"}, "properties": {"repobilityId": "03bd6be62490f184", "scanner": "scanner-primary", "fingerprint": "c138010e38eeea65", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94b2da2ddbfb34a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/FlowCreate.jsx:885"}, "properties": {"repobilityId": "6517e5fa95b6b466", "scanner": "scanner-primary", "fingerprint": "94b2da2ddbfb34a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2f001f8c4671750", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Chat.jsx:600"}, "properties": {"repobilityId": "d26beb1a26753472", "scanner": "scanner-primary", "fingerprint": "b2f001f8c4671750", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8af0b9ffe58f3d0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/views/Chat.jsx:1526"}, "properties": {"repobilityId": "8d938e74c183a0b6", "scanner": "scanner-primary", "fingerprint": "b8af0b9ffe58f3d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9663dc8689c68c8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/Briefs.jsx:65"}, "properties": {"repobilityId": "ff6b2384724490e3", "scanner": "scanner-primary", "fingerprint": "9663dc8689c68c8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a34f08fc6974b7c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/VentureFlow.jsx:259"}, "properties": {"repobilityId": "9292c684bf615416", "scanner": "scanner-primary", "fingerprint": "9a34f08fc6974b7c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50131283800d767f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/tax/FlowTax.jsx:368"}, "properties": {"repobilityId": "1c7b4894631c6226", "scanner": "scanner-primary", "fingerprint": "50131283800d767f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d15f082a5b9de38e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/views/money/cash/CashSubscriptions.jsx:111"}, "properties": {"repobilityId": "f34e31ed126017fd", "scanner": "scanner-primary", "fingerprint": "d15f082a5b9de38e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-53d7987f422a6947", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashAccounts.jsx:205"}, "properties": {"repobilityId": "aa5d4f0595430e68", "scanner": "scanner-primary", "fingerprint": "53d7987f422a6947", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-079302c795e2dacd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashGoals.jsx:312"}, "properties": {"repobilityId": "49bfdeb3fb2eb2de", "scanner": "scanner-primary", "fingerprint": "079302c795e2dacd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b1a3fbacccf5d18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/FlowCash.jsx:334"}, "properties": {"repobilityId": "2f23a4b1b276a496", "scanner": "scanner-primary", "fingerprint": "5b1a3fbacccf5d18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb6b7f78ca4c01da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/cash/CashTransactions.jsx:457"}, "properties": {"repobilityId": "67c6d88c65587826", "scanner": "scanner-primary", "fingerprint": "fb6b7f78ca4c01da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3fa56f3e729611d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/FlowInvest.jsx:374"}, "properties": {"repobilityId": "201af0edce017aaf", "scanner": "scanner-primary", "fingerprint": "e3fa56f3e729611d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8b7de2fc716aacd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestAccounts.jsx:364"}, "properties": {"repobilityId": "d8a32fc5483e3052", "scanner": "scanner-primary", "fingerprint": "b8b7de2fc716aacd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-812c59f57aceb238", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/money/invest/InvestEarnings.jsx:107"}, "properties": {"repobilityId": "ead1bd3a0ca2f4f3", "scanner": "scanner-primary", "fingerprint": "812c59f57aceb238", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98222b2460397ede", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/components/FeasibilityTable.jsx:196"}, "properties": {"repobilityId": "f2f06ecfbab16e14", "scanner": "scanner-primary", "fingerprint": "98222b2460397ede", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3279c3e16ddc8720", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowsTab.jsx:523"}, "properties": {"repobilityId": "7b585591cd7537b3", "scanner": "scanner-primary", "fingerprint": "3279c3e16ddc8720", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16d5bdf2551f2c44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/workflows/WorkflowExecutionsTab.jsx:151"}, "properties": {"repobilityId": "b3eba02d9471b41d", "scanner": "scanner-primary", "fingerprint": "16d5bdf2551f2c44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-953c4640694b64b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/sitemap/HealthPanel.jsx:147"}, "properties": {"repobilityId": "77436223c03739a7", "scanner": "scanner-primary", "fingerprint": "953c4640694b64b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c97ff2bc9a66d5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyDashboardV2.jsx:238"}, "properties": {"repobilityId": "4852af532c6752ef", "scanner": "scanner-primary", "fingerprint": "1c97ff2bc9a66d5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b585177cd3879437", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyInvestments.jsx:179"}, "properties": {"repobilityId": "e151152644ff7ceb", "scanner": "scanner-primary", "fingerprint": "b585177cd3879437", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af0f195303c11d30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyProperty.jsx:115"}, "properties": {"repobilityId": "8890531e22bcc323", "scanner": "scanner-primary", "fingerprint": "af0f195303c11d30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-058367b2e2635fe6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTransactions.jsx:95"}, "properties": {"repobilityId": "2921a62a858c9f74", "scanner": "scanner-primary", "fingerprint": "058367b2e2635fe6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd3dd13e4df7eba6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyPayroll.jsx:145"}, "properties": {"repobilityId": "a345d631d57bc848", "scanner": "scanner-primary", "fingerprint": "bd3dd13e4df7eba6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d34148b8c1c282cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyTax.jsx:320"}, "properties": {"repobilityId": "9fcaee93f090be05", "scanner": "scanner-primary", "fingerprint": "d34148b8c1c282cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b85d1efabf41fc66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyExpenses.jsx:107"}, "properties": {"repobilityId": "4614c7a0400702e2", "scanner": "scanner-primary", "fingerprint": "b85d1efabf41fc66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1bf63e561cd6417", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx:432"}, "properties": {"repobilityId": "62a906ce08ebb80b", "scanner": "scanner-primary", "fingerprint": "a1bf63e561cd6417", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cae2b6dac6174b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/views/moneyFlow/v2/MoneyOnboarding.jsx:340"}, "properties": {"repobilityId": "42e926f4c7794004", "scanner": "scanner-primary", "fingerprint": "0cae2b6dac6174b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df694b047d60a26e", "level": "warning", "message": {"text": "Privileged port 993 in use"}, "properties": {"repobilityId": "a36e56a26353e9ee", "scanner": "scanner-primary", "fingerprint": "df694b047d60a26e", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/integrations/gmailImapService.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-785313162ff3dffa", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "785313162ff3dffa", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/integrations/gmailImapService.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2749948962250a89", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in launcher/LauncherService.js:5"}, "properties": {"repobilityId": "38381b0950e00e04", "scanner": "scanner-primary", "fingerprint": "2749948962250a89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "launcher/LauncherService.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-d54b94481459194d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in daemon/src/config.ts:3"}, "properties": {"repobilityId": "8ab4379ce452aac0", "scanner": "scanner-primary", "fingerprint": "d54b94481459194d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/config.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-b566c8d8f87cbc2c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in daemon/src/server.ts:481"}, "properties": {"repobilityId": "585a80cdc72135bc", "scanner": "scanner-primary", "fingerprint": "b566c8d8f87cbc2c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/server.ts"}, "region": {"startLine": 481}}}]}, {"ruleId": "scanner-6e7d4ae6f4d21068", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in daemon/src/adapters/nodeSandboxAdapter.ts:1"}, "properties": {"repobilityId": "786fc65b559d3ec5", "scanner": "scanner-primary", "fingerprint": "6e7d4ae6f4d21068", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/adapters/nodeSandboxAdapter.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf89a3f5314a567f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in daemon/src/adapters/shellAdapter.ts:1"}, "properties": {"repobilityId": "1468423c317bf22b", "scanner": "scanner-primary", "fingerprint": "bf89a3f5314a567f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daemon/src/adapters/shellAdapter.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f42551dad0546dc5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-academy-sharing/renderFlowAcademyExportHTML.js:226"}, "properties": {"repobilityId": "d15f74f971f2c462", "scanner": "scanner-primary", "fingerprint": "f42551dad0546dc5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/flow-academy-sharing/renderFlowAcademyExportHTML.js"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-2b32ae811afd7ae1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/lib/search/wikipedia.js:14"}, "properties": {"repobilityId": "6615f5bed1cb8578", "scanner": "scanner-primary", "fingerprint": "2b32ae811afd7ae1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/search/wikipedia.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-a56dda56194dee4d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/flow-trade/v2/StockDetail.jsx:223"}, "properties": {"repobilityId": "70002c79eb0dabdc", "scanner": "scanner-primary", "fingerprint": "a56dda56194dee4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/flow-trade/v2/StockDetail.jsx"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-4bfc1b39a269ea2f", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in src/code-academy/validatorEngine.js:69"}, "properties": {"repobilityId": "866da538e9d98993", "scanner": "scanner-primary", "fingerprint": "4bfc1b39a269ea2f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/code-academy/validatorEngine.js"}, "region": {"startLine": 69}}}]}, {"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-f97f0d5589928cfe", "level": "note", "message": {"text": "Very large file: daemon/src/flow-trade/index.ts (1184 lines)"}, "properties": {"repobilityId": "4798d6192007d48f", "scanner": "scanner-primary", "fingerprint": "f97f0d5589928cfe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-239ea3ce1340ebce", "level": "note", "message": {"text": "Very large file: src/python-curriculum/curriculum/python.ts (2788 lines)"}, "properties": {"repobilityId": "7cfdf1033b6a53cc", "scanner": "scanner-primary", "fingerprint": "239ea3ce1340ebce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-616f3db1c55ab87f", "level": "note", "message": {"text": "Very large file: src/components/memory/KnowledgeOverview.jsx (1798 lines)"}, "properties": {"repobilityId": "41d6497e7d03d9f7", "scanner": "scanner-primary", "fingerprint": "616f3db1c55ab87f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b8e9a65ccf26453f", "level": "note", "message": {"text": "Very large file: src/components/flow/QuickChatLauncher.jsx (1906 lines)"}, "properties": {"repobilityId": "854fbd3e4a7bf0e4", "scanner": "scanner-primary", "fingerprint": "b8e9a65ccf26453f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dd050e3c26f54e36", "level": "note", "message": {"text": "Very large file: src/lib/chat/retrieve.js (954 lines)"}, "properties": {"repobilityId": "dd6523123eef7fb5", "scanner": "scanner-primary", "fingerprint": "dd050e3c26f54e36", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-46e758cba6e2e935", "level": "note", "message": {"text": "Very large file: src/store/useStore.js (2057 lines)"}, "properties": {"repobilityId": "4906b943437eff82", "scanner": "scanner-primary", "fingerprint": "46e758cba6e2e935", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3aaf66bbba2fc29e", "level": "note", "message": {"text": "Very large file: src/opportunity-radar/services/conceptGenerator.ts (1115 lines)"}, "properties": {"repobilityId": "1a0edc98c4a9fd03", "scanner": "scanner-primary", "fingerprint": "3aaf66bbba2fc29e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-224ad0ea2776f7f6", "level": "note", "message": {"text": "Very large file: src/views/VentureFlowDetail.jsx (1425 lines)"}, "properties": {"repobilityId": "97f147082817bd76", "scanner": "scanner-primary", "fingerprint": "224ad0ea2776f7f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-00f03d72c220b570", "level": "note", "message": {"text": "Very large file: src/views/Signals.jsx (1581 lines)"}, "properties": {"repobilityId": "ca4532ba616cea72", "scanner": "scanner-primary", "fingerprint": "00f03d72c220b570", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e1406b1bcd930292", "level": "note", "message": {"text": "Very large file: src/views/Sitemap.jsx (1781 lines)"}, "properties": {"repobilityId": "ddbf944ea2e4a190", "scanner": "scanner-primary", "fingerprint": "e1406b1bcd930292", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c2f17961e2a92c80", "level": "note", "message": {"text": "Very large file: src/views/FlowCreate.jsx (1262 lines)"}, "properties": {"repobilityId": "9d3b9f15c2f5e937", "scanner": "scanner-primary", "fingerprint": "c2f17961e2a92c80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-554bf91c66f55e78", "level": "note", "message": {"text": "Very large file: src/views/Chat.jsx (2142 lines)"}, "properties": {"repobilityId": "b6f56000b6226ea4", "scanner": "scanner-primary", "fingerprint": "554bf91c66f55e78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bafb99d2427b6bc9", "level": "note", "message": {"text": "Very large file: src/views/moneyFlow/MoneyFlowOnboardingV2.jsx (1365 lines)"}, "properties": {"repobilityId": "bcf3c1dcfc486f60", "scanner": "scanner-primary", "fingerprint": "bafb99d2427b6bc9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "badaa4154808232a", "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": "5e23468c77a81ce8", "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": "5cf0b70a1ad81d21", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "67d00f8c2baa195d", "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": "62aff6bd028e46e6", "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": "341c7358f5f4f6a9", "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": "720848df25d0c432", "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": "dc0d0555ffdeea40", "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-693cc2ff1aa40f38", "level": "none", "message": {"text": "Commented-code block (9 lines) in vite.config.js:66"}, "properties": {"repobilityId": "15d86bce56ed9406", "scanner": "scanner-primary", "fingerprint": "693cc2ff1aa40f38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfafd79e780b98d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite-plugin-flowagent-sync.js:1"}, "properties": {"repobilityId": "9fbaf1d9e0b8700d", "scanner": "scanner-primary", "fingerprint": "bfafd79e780b98d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08527391c71c9433", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite-plugin-daemon-info.js:362"}, "properties": {"repobilityId": "11d59fb3b40a4862", "scanner": "scanner-primary", "fingerprint": "08527391c71c9433", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f383542429d9f6b", "level": "none", "message": {"text": "Commented-code block (12 lines) in vite-plugin-elevenlabs.js:9"}, "properties": {"repobilityId": "9741c579d8dcba3e", "scanner": "scanner-primary", "fingerprint": "2f383542429d9f6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac351c1590afc000", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vite-plugin-elevenlabs.js:66"}, "properties": {"repobilityId": "8182f2d3b579d5de", "scanner": "scanner-primary", "fingerprint": "ac351c1590afc000", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a40faefe4de4e753", "level": "none", "message": {"text": "Commented-code block (7 lines) in cloudflare/plaid/worker.js:11"}, "properties": {"repobilityId": "5daa194b76f5bbaf", "scanner": "scanner-primary", "fingerprint": "a40faefe4de4e753", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efe1749a621649a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/plaid/worker.js:75"}, "properties": {"repobilityId": "77d6009767db380d", "scanner": "scanner-primary", "fingerprint": "efe1749a621649a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddeb3d91dfd47ad8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/shared-kb/worker.js:100"}, "properties": {"repobilityId": "1ea693b10ae6b7a2", "scanner": "scanner-primary", "fingerprint": "ddeb3d91dfd47ad8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d46d6155ee811244", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 daemon/src/media/imageUpload.ts:50"}, "properties": {"repobilityId": "ff33ffb024568931", "scanner": "scanner-primary", "fingerprint": "d46d6155ee811244", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e15b35ef8cb6d0cc", "level": "none", "message": {"text": "Commented-code block (6 lines) in daemon/src/live-sky/service.ts:86"}, "properties": {"repobilityId": "922f1cb9078d720c", "scanner": "scanner-primary", "fingerprint": "e15b35ef8cb6d0cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9e4a840e42c4023", "level": "none", "message": {"text": "Commented-code block (5 lines) in daemon/src/flow-trade/index.ts:210"}, "properties": {"repobilityId": "2d48334bb5f27de1", "scanner": "scanner-primary", "fingerprint": "b9e4a840e42c4023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5874c8dbbdb6e2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/notificationsApi.js:7"}, "properties": {"repobilityId": "21d4fa3a577bef6e", "scanner": "scanner-primary", "fingerprint": "b5874c8dbbdb6e2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ab8c3d6b19a4771", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/notifications/__tests__/notificationsApi.test.js:60"}, "properties": {"repobilityId": "97858cfe422a494f", "scanner": "scanner-primary", "fingerprint": "4ab8c3d6b19a4771", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-224b7730fa7c064f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/python-curriculum/curriculum/python.ts:4"}, "properties": {"repobilityId": "b82f920dbaccdea8", "scanner": "scanner-primary", "fingerprint": "224b7730fa7c064f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab487d14d06edc80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/signals/services/youtubeSignalsService.ts:33"}, "properties": {"repobilityId": "fc9d3ae1aac6e9b6", "scanner": "scanner-primary", "fingerprint": "ab487d14d06edc80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4fd8a7059a06079", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/mcp/connectionContent.js:3"}, "properties": {"repobilityId": "af2d7afe59e83c6e", "scanner": "scanner-primary", "fingerprint": "e4fd8a7059a06079", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34c6890fd0d834f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/localProvider.ts:26"}, "properties": {"repobilityId": "4a17610e2e332c0d", "scanner": "scanner-primary", "fingerprint": "34c6890fd0d834f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3f4c60723c162e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/providers/dockerMCPProvider.ts:27"}, "properties": {"repobilityId": "bb6b6a2e48515364", "scanner": "scanner-primary", "fingerprint": "c3f4c60723c162e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e4fb21a46531477", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/telegramPollingService.ts:51"}, "properties": {"repobilityId": "4d502c4114cb4c2d", "scanner": "scanner-primary", "fingerprint": "1e4fb21a46531477", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1812a9f4ec8f3619", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/mcp/services/apiKeyTools.ts:3"}, "properties": {"repobilityId": "616947575cb44999", "scanner": "scanner-primary", "fingerprint": "1812a9f4ec8f3619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbee2bdcc85aec8b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/mcp/services/daemonApi.ts:15"}, "properties": {"repobilityId": "6c4bba49f0c93e2a", "scanner": "scanner-primary", "fingerprint": "dbee2bdcc85aec8b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fae2a42c79e44cd7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/mcp/storage/localMCPStorage.ts:19"}, "properties": {"repobilityId": "582eb3e0604cdd32", "scanner": "scanner-primary", "fingerprint": "fae2a42c79e44cd7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cc2dfa007185924", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/briefs/BriefModal.jsx:28"}, "properties": {"repobilityId": "ae53250fb4a0cda2", "scanner": "scanner-primary", "fingerprint": "8cc2dfa007185924", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ed3f27b87553ef0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/settings/ApiServiceCards.jsx:3"}, "properties": {"repobilityId": "b5002c6b7929e611", "scanner": "scanner-primary", "fingerprint": "0ed3f27b87553ef0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95585180c47e91ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/settings/useApiServices.jsx:3"}, "properties": {"repobilityId": "da5ab0c6962f0a1d", "scanner": "scanner-primary", "fingerprint": "95585180c47e91ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-791de47e1f0e01bd", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/ui/TabBar.jsx:4"}, "properties": {"repobilityId": "429e772507e976fa", "scanner": "scanner-primary", "fingerprint": "791de47e1f0e01bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4946dcd6047bcbaf", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/ui/VirtualList.jsx:4"}, "properties": {"repobilityId": "9266d003e4aa02be", "scanner": "scanner-primary", "fingerprint": "4946dcd6047bcbaf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d835cfa09652cf7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/PillTabs.jsx:1"}, "properties": {"repobilityId": "144c9be56fa0a597", "scanner": "scanner-primary", "fingerprint": "d835cfa09652cf7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-102485267d4054a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ingest/UrlIngestModal.jsx:59"}, "properties": {"repobilityId": "fd6889de18e3318c", "scanner": "scanner-primary", "fingerprint": "102485267d4054a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67cba1a370d2f214", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/topic/SummaryModal.jsx:25"}, "properties": {"repobilityId": "586bee77f7c8ba80", "scanner": "scanner-primary", "fingerprint": "67cba1a370d2f214", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1bc8f2689f55bd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/flow/QuickChatLauncher.jsx:411"}, "properties": {"repobilityId": "f50d11fdadf319b2", "scanner": "scanner-primary", "fingerprint": "d1bc8f2689f55bd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-466ad94145ebb9ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/PresetChips.jsx:3"}, "properties": {"repobilityId": "ef606191f0f82948", "scanner": "scanner-primary", "fingerprint": "466ad94145ebb9ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7c0e581a1a68c76", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/moneyFlow/v2/ConnectionCard.jsx:3"}, "properties": {"repobilityId": "0a918fd829daecbd", "scanner": "scanner-primary", "fingerprint": "b7c0e581a1a68c76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a35c9fd63728502", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/RailMessage.jsx:3"}, "properties": {"repobilityId": "8422fc35a235cd19", "scanner": "scanner-primary", "fingerprint": "7a35c9fd63728502", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-090ba8c69e0099be", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/moneyFlow/v2/FlowRing.jsx:8"}, "properties": {"repobilityId": "aee25618bd3265e7", "scanner": "scanner-primary", "fingerprint": "090ba8c69e0099be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d879e658684fb3d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/CoachNote.jsx:3"}, "properties": {"repobilityId": "e755042bb31bf037", "scanner": "scanner-primary", "fingerprint": "d879e658684fb3d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-659efae5e1abad5a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/InfoTip.jsx:3"}, "properties": {"repobilityId": "7a30e7e51753ac59", "scanner": "scanner-primary", "fingerprint": "659efae5e1abad5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2126bb379b89391f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moneyFlow/v2/MoneyCard.jsx:3"}, "properties": {"repobilityId": "4d02e28fe5463e14", "scanner": "scanner-primary", "fingerprint": "2126bb379b89391f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31d1e3aff4a3f8b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/MapSearch.jsx:12"}, "properties": {"repobilityId": "fb34dfbbb1c1e525", "scanner": "scanner-primary", "fingerprint": "31d1e3aff4a3f8b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a854cc8a3df8a8c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/GlobeOverlay.jsx:54"}, "properties": {"repobilityId": "69c87a39444af5a1", "scanner": "scanner-primary", "fingerprint": "3a854cc8a3df8a8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-daccd7d68a3f2aac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/flightUtils.js:129"}, "properties": {"repobilityId": "f026765c3b6d2694", "scanner": "scanner-primary", "fingerprint": "daccd7d68a3f2aac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23b6abf0f8d50454", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/weatherService.js:55"}, "properties": {"repobilityId": "5a2ff0a03d4bd829", "scanner": "scanner-primary", "fingerprint": "23b6abf0f8d50454", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c81a27648e191c45", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/LocationSearch.jsx:10"}, "properties": {"repobilityId": "fcb9fb25595c2a2a", "scanner": "scanner-primary", "fingerprint": "c81a27648e191c45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ffe106b547c02181", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/flow-globe/priceWatches.js:1"}, "properties": {"repobilityId": "94f0d3284dd9cd20", "scanner": "scanner-primary", "fingerprint": "ffe106b547c02181", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d20929c0766d8116", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/flow-globe/FlowGlobe.jsx:406"}, "properties": {"repobilityId": "93e93126d33c9204", "scanner": "scanner-primary", "fingerprint": "d20929c0766d8116", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58f975c2e617aaf5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/flow-globe/savedRoutes.js:1"}, "properties": {"repobilityId": "63a56a53fccb94f2", "scanner": "scanner-primary", "fingerprint": "58f975c2e617aaf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d4b2beb6fc61ac6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-globe/liveSky/liveSkyApi.js:25"}, "properties": {"repobilityId": "bdaadf6472a6cd1d", "scanner": "scanner-primary", "fingerprint": "6d4b2beb6fc61ac6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e63d2987c3c2a171", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/venture-scope/types.ts:150"}, "properties": {"repobilityId": "bf7300c7a9251f25", "scanner": "scanner-primary", "fingerprint": "e63d2987c3c2a171", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e82554f8ae59510d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/venture-scope/utils/__tests__/conceptAmbiguity.test.ts:168"}, "properties": {"repobilityId": "c299cc016c1327ef", "scanner": "scanner-primary", "fingerprint": "e82554f8ae59510d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ee26b98aab70e82", "level": "note", "message": {"text": "Legacy-named symbol `seed_ai_governance_studio_v1` in src/venture-scope/seed/corpusSeedData.ts:29"}, "properties": {"repobilityId": "0f71f397858acb0f", "scanner": "scanner-primary", "fingerprint": "8ee26b98aab70e82", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-34bba8299e689de6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/mediaApi.js:8"}, "properties": {"repobilityId": "e459fafc1c3e830f", "scanner": "scanner-primary", "fingerprint": "34bba8299e689de6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45fd29cff50c849c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/chatPanelState.js:24"}, "properties": {"repobilityId": "05988b6dfb542e63", "scanner": "scanner-primary", "fingerprint": "45fd29cff50c849c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6527334a04729a10", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/higgsfieldConfig.js:1"}, "properties": {"repobilityId": "d2be38f47ae14c7b", "scanner": "scanner-primary", "fingerprint": "6527334a04729a10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d068cdcefbbc65e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/snapshot.js:1"}, "properties": {"repobilityId": "a60a3495c69779bb", "scanner": "scanner-primary", "fingerprint": "8d068cdcefbbc65e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4892407ba70d83e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/vtScan.js:1"}, "properties": {"repobilityId": "d2036f870ffc2acf", "scanner": "scanner-primary", "fingerprint": "a4892407ba70d83e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1587b391510c9566", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/briefs/fetchAiNews.js:32"}, "properties": {"repobilityId": "b999fc94f2151e9f", "scanner": "scanner-primary", "fingerprint": "1587b391510c9566", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-914992c65ff85427", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/money/entities.js:3"}, "properties": {"repobilityId": "a42a72697a7ed5e1", "scanner": "scanner-primary", "fingerprint": "914992c65ff85427", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-816be83e4726a945", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/money/palette.js:3"}, "properties": {"repobilityId": "7efe56975bd06770", "scanner": "scanner-primary", "fingerprint": "816be83e4726a945", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46a69ff8fdc3e437", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/money/responseRouter.js:7"}, "properties": {"repobilityId": "58825438de55ec84", "scanner": "scanner-primary", "fingerprint": "46a69ff8fdc3e437", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25c41f4588055b0f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/money/responseRouter.js:53"}, "properties": {"repobilityId": "dd9ff0338b312991", "scanner": "scanner-primary", "fingerprint": "25c41f4588055b0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba904f6e8a56f946", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/money/irsLimits.js:1"}, "properties": {"repobilityId": "3fef1837a8066b57", "scanner": "scanner-primary", "fingerprint": "ba904f6e8a56f946", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3082887be754b39d", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/sync/sharedSync.js:1"}, "properties": {"repobilityId": "facd2d0cd5dcc55a", "scanner": "scanner-primary", "fingerprint": "3082887be754b39d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-626e7cbd767a8bb0", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/document/extract.js:5"}, "properties": {"repobilityId": "c1aafe718f9ad09a", "scanner": "scanner-primary", "fingerprint": "626e7cbd767a8bb0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9184af9d4db5a443", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/flowAI/jokeSession.js:3"}, "properties": {"repobilityId": "4ed5b6b4f8175820", "scanner": "scanner-primary", "fingerprint": "9184af9d4db5a443", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-295f84467e6413d5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/flowAI/chatHistoryStore.js:3"}, "properties": {"repobilityId": "49448bfa8f53cdf0", "scanner": "scanner-primary", "fingerprint": "295f84467e6413d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58fe81319129521c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/flowAgentKnowledgeBase.js:387"}, "properties": {"repobilityId": "05bdcfc04bc3b8ef", "scanner": "scanner-primary", "fingerprint": "58fe81319129521c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-836c4a4be03a2e8b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/flowAI/modelSelector.js:3"}, "properties": {"repobilityId": "f6f7ffc2bde3ae46", "scanner": "scanner-primary", "fingerprint": "836c4a4be03a2e8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-157b870ea954d3e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/flowAI/agentProfiles.js:3"}, "properties": {"repobilityId": "fcbad8932464496a", "scanner": "scanner-primary", "fingerprint": "157b870ea954d3e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c825f1c185daed6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/flowAI/insights/triggers.js:3"}, "properties": {"repobilityId": "88f7bd6d11330c65", "scanner": "scanner-primary", "fingerprint": "4c825f1c185daed6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86a4248610d0b725", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/flowAI/insights/dispatch.js:3"}, "properties": {"repobilityId": "25af2cf2bf908c7a", "scanner": "scanner-primary", "fingerprint": "86a4248610d0b725", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09b55ce6f61cb0fa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/flowAI/actions/index.js:22"}, "properties": {"repobilityId": "bc5fa9d1ddc3bbe1", "scanner": "scanner-primary", "fingerprint": "09b55ce6f61cb0fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b782f3d38ba709a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/topics/topicCover.js:42"}, "properties": {"repobilityId": "b32b850114f8c610", "scanner": "scanner-primary", "fingerprint": "b782f3d38ba709a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d9acb5069c7e663", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/chat/flowAIPersona.js:3"}, "properties": {"repobilityId": "9022617d2520281e", "scanner": "scanner-primary", "fingerprint": "5d9acb5069c7e663", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8961c670a21c22ac", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/chat/retrieve.js:138"}, "properties": {"repobilityId": "1a4a097e3d5c03f0", "scanner": "scanner-primary", "fingerprint": "8961c670a21c22ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e845da71a44ec8f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/chat/flowAITools.js:40"}, "properties": {"repobilityId": "89bba83c5d77d8df", "scanner": "scanner-primary", "fingerprint": "2e845da71a44ec8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1442ed99f90b572f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/chat/daemonTools.js:35"}, "properties": {"repobilityId": "dd4442aaaed825bc", "scanner": "scanner-primary", "fingerprint": "1442ed99f90b572f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2fec2102724ba922", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/providers/huggingface.js:111"}, "properties": {"repobilityId": "1dec84d3af232185", "scanner": "scanner-primary", "fingerprint": "2fec2102724ba922", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e524a6aa9c073183", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/voice/player.js:49"}, "properties": {"repobilityId": "f2808e338a89d4f0", "scanner": "scanner-primary", "fingerprint": "e524a6aa9c073183", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5af13e4790260e92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/voice/player.js:229"}, "properties": {"repobilityId": "bc5f73d24e80a28e", "scanner": "scanner-primary", "fingerprint": "5af13e4790260e92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a82b4a9f9f440735", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/voice/stt.js:10"}, "properties": {"repobilityId": "4a537f831160d861", "scanner": "scanner-primary", "fingerprint": "a82b4a9f9f440735", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76f894bffa5a4689", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/voice/conversationalVoice.js:7"}, "properties": {"repobilityId": "e8852955750d3ee9", "scanner": "scanner-primary", "fingerprint": "76f894bffa5a4689", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43119e3be2e7cf1f", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/voice/voiceConfig.js:75"}, "properties": {"repobilityId": "7d9f158362b95133", "scanner": "scanner-primary", "fingerprint": "43119e3be2e7cf1f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6be4165bcdf043a4", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/voice/useWakeWord.js:4"}, "properties": {"repobilityId": "061e68d6b1432a6b", "scanner": "scanner-primary", "fingerprint": "6be4165bcdf043a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5043f42e4a91d660", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/voice/useMicTranscription.js:19"}, "properties": {"repobilityId": "b71464d28484f3b4", "scanner": "scanner-primary", "fingerprint": "5043f42e4a91d660", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-799db60f2ff8b031", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/reddit.js:21"}, "properties": {"repobilityId": "1d4abfbfdbf04ec3", "scanner": "scanner-primary", "fingerprint": "799db60f2ff8b031", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a6cd84d0aec38ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/github.js:11"}, "properties": {"repobilityId": "dd909985a48c9cff", "scanner": "scanner-primary", "fingerprint": "7a6cd84d0aec38ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5faa142a37c9ce39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/stackOverflow.js:13"}, "properties": {"repobilityId": "bfd020b99f23822a", "scanner": "scanner-primary", "fingerprint": "5faa142a37c9ce39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1fc0c85235ab4362", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/search/rankingConfig.js:4"}, "properties": {"repobilityId": "ae85693ef4c1f6df", "scanner": "scanner-primary", "fingerprint": "1fc0c85235ab4362", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-701cc6183a14f284", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/hackerNews.js:6"}, "properties": {"repobilityId": "0e61630ffbce52a7", "scanner": "scanner-primary", "fingerprint": "701cc6183a14f284", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fec3cce82eaf742c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/search/searchConfig.js:12"}, "properties": {"repobilityId": "5fd07f33e445d42c", "scanner": "scanner-primary", "fingerprint": "fec3cce82eaf742c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cadee810c8372ad", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/search/aggregate.js:35"}, "properties": {"repobilityId": "0f871fcf31b13e61", "scanner": "scanner-primary", "fingerprint": "2cadee810c8372ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-623e6ce052a9511d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/search/articleReader.js:86"}, "properties": {"repobilityId": "22997b1154aa5879", "scanner": "scanner-primary", "fingerprint": "623e6ce052a9511d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6ba85fd456b6c99", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/search/articleReader.js:54"}, "properties": {"repobilityId": "7e6f034270cd4158", "scanner": "scanner-primary", "fingerprint": "e6ba85fd456b6c99", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bce358f78b6d71c2", "level": "note", "message": {"text": "Legacy-named symbol `rest_v1` in src/lib/search/ogImage.js:39"}, "properties": {"repobilityId": "ff2a9936d318f34f", "scanner": "scanner-primary", "fingerprint": "bce358f78b6d71c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a38925eef3b85323", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/launcherApi.js:5"}, "properties": {"repobilityId": "686eecfe09bfaf7e", "scanner": "scanner-primary", "fingerprint": "a38925eef3b85323", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9378bc9d4a6919f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/daemon/systemApi.js:5"}, "properties": {"repobilityId": "2348bcd05233b963", "scanner": "scanner-primary", "fingerprint": "9378bc9d4a6919f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4aadeeadbba291be", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pdf/generatePdf.js:13"}, "properties": {"repobilityId": "e005e7a80b0e28c8", "scanner": "scanner-primary", "fingerprint": "4aadeeadbba291be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5084b350f47ab64a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/credentials/validateOnSave.js:9"}, "properties": {"repobilityId": "db76305ea7167459", "scanner": "scanner-primary", "fingerprint": "5084b350f47ab64a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64c8c606be8f62ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/graph/nodeTaxonomy.js:1"}, "properties": {"repobilityId": "0d904ef04eb05cbf", "scanner": "scanner-primary", "fingerprint": "64c8c606be8f62ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89279601d9812ed3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/graph/nodePositions.js:46"}, "properties": {"repobilityId": "aa99a27637a690b2", "scanner": "scanner-primary", "fingerprint": "89279601d9812ed3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d741d64b8b6b3e12", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/llm/ollamaConfig.js:62"}, "properties": {"repobilityId": "9a984d4f0f5227b7", "scanner": "scanner-primary", "fingerprint": "d741d64b8b6b3e12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2988de4f06214fb3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/llm/ollama.js:273"}, "properties": {"repobilityId": "4db7b3db973b4e5d", "scanner": "scanner-primary", "fingerprint": "2988de4f06214fb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43a262d12f767ee3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/moneyFlow/syncOnboardingToModules.js:3"}, "properties": {"repobilityId": "ef62d8144139e92c", "scanner": "scanner-primary", "fingerprint": "43a262d12f767ee3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f92a0d9393715c45", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/moneyFlow/planGenerator.js:245"}, "properties": {"repobilityId": "919013e9b91180d9", "scanner": "scanner-primary", "fingerprint": "f92a0d9393715c45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4e969aa113eb6f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/flow-academy/courseGenerator.js:178"}, "properties": {"repobilityId": "60c58b07b4ed937a", "scanner": "scanner-primary", "fingerprint": "c4e969aa113eb6f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0feb858dc5def90", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/flow-academy/components/LessonView.jsx:253"}, "properties": {"repobilityId": "8e0abe267a54b386", "scanner": "scanner-primary", "fingerprint": "e0feb858dc5def90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e25ca5862b26fc83", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/venture-flow/ventureFlowApi.js:10"}, "properties": {"repobilityId": "27b48ff292549000", "scanner": "scanner-primary", "fingerprint": "e25ca5862b26fc83", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-734d64fcaaf787b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/venture-flow/ventureFlowStorage.js:86"}, "properties": {"repobilityId": "107d1795a4f1b7d1", "scanner": "scanner-primary", "fingerprint": "734d64fcaaf787b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81af6034ed9243c5", "level": "note", "message": {"text": "Legacy-named symbol `fm_fixlog_v1` in src/diagnostics/errorFixer.js:158"}, "properties": {"repobilityId": "2edc552072ec7cb1", "scanner": "scanner-primary", "fingerprint": "81af6034ed9243c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-df24ebef013ea3f8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/diagnostics/errorFixer.js:11"}, "properties": {"repobilityId": "dd85505672e05fdf", "scanner": "scanner-primary", "fingerprint": "df24ebef013ea3f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51ef5ee6f5975f27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/diagnostics/errorFixer.js:256"}, "properties": {"repobilityId": "8b8961fd24f5b361", "scanner": "scanner-primary", "fingerprint": "51ef5ee6f5975f27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e45229e177e0edc", "level": "note", "message": {"text": "Legacy-named symbol `fm_diagnostics_v1` in src/diagnostics/errorStore.js:17"}, "properties": {"repobilityId": "48caa7832f012b1a", "scanner": "scanner-primary", "fingerprint": "5e45229e177e0edc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ae7a379103b5ae9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/diagnostics/errorStore.js:4"}, "properties": {"repobilityId": "1409f646c9e8216c", "scanner": "scanner-primary", "fingerprint": "8ae7a379103b5ae9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-732818e12c3f4fc8", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/diagnostics/connectionHealthCheck.js:69"}, "properties": {"repobilityId": "f589210f29d457be", "scanner": "scanner-primary", "fingerprint": "732818e12c3f4fc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0afa21ec4c4210d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/flow-trade/massiveDataLayer.js:5"}, "properties": {"repobilityId": "6ed654e27405c95f", "scanner": "scanner-primary", "fingerprint": "e0afa21ec4c4210d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48a9b9084832f517", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/flow-trade/SignalFeed.jsx:415"}, "properties": {"repobilityId": "69840acef81f66de", "scanner": "scanner-primary", "fingerprint": "48a9b9084832f517", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-266041335f2a14f5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flow-trade/FlowTradeChat.jsx:9"}, "properties": {"repobilityId": "758c5c9e620e668a", "scanner": "scanner-primary", "fingerprint": "266041335f2a14f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8173d6b5369bf4ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/flow-trade/v2/FlowTradeV2Context.jsx:51"}, "properties": {"repobilityId": "b76b1d42f6a5b7dd", "scanner": "scanner-primary", "fingerprint": "8173d6b5369bf4ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7428722b0cd1fa03", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/flow-trade/ai/taStore.js:1"}, "properties": {"repobilityId": "76417b75e1f6de94", "scanner": "scanner-primary", "fingerprint": "7428722b0cd1fa03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-423b262caaa2fc71", "level": "note", "message": {"text": "Legacy-named symbol `__flowmap_backup` in src/store/useStore.js:1916"}, "properties": {"repobilityId": "d36f3dba6f0ac19c", "scanner": "scanner-primary", "fingerprint": "423b262caaa2fc71", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7c9beb512476e75a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/store/useStore.js:49"}, "properties": {"repobilityId": "22b342c005dd2c2b", "scanner": "scanner-primary", "fingerprint": "7c9beb512476e75a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab1c301490e46c5a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/store/directContentDraftsStorage.js:1"}, "properties": {"repobilityId": "a37729c4cbfa0738", "scanner": "scanner-primary", "fingerprint": "ab1c301490e46c5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea1c58d87f17d0fc", "level": "note", "message": {"text": "Legacy-named symbol `b_old` in src/store/__tests__/useBriefs.test.js:75"}, "properties": {"repobilityId": "3292d08ce387f592", "scanner": "scanner-primary", "fingerprint": "ea1c58d87f17d0fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2957ef3f2c1964c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/store/__tests__/globePersistence.test.js:3"}, "properties": {"repobilityId": "c0d576c8c01a9d88", "scanner": "scanner-primary", "fingerprint": "2957ef3f2c1964c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-767f4353787c2c0d", "level": "note", "message": {"text": "Legacy-named symbol `totalOld` in src/opportunity-radar/services/entityNormalizer.ts:145"}, "properties": {"repobilityId": "44dcdf00fac57b5e", "scanner": "scanner-primary", "fingerprint": "767f4353787c2c0d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b4fae73c1a15f38", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/opportunity-radar/services/conceptGenerator.ts:445"}, "properties": {"repobilityId": "55e582a72ad5a145", "scanner": "scanner-primary", "fingerprint": "4b4fae73c1a15f38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3ccee41cdbbc6df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/flowtask/flowtaskApi.js:7"}, "properties": {"repobilityId": "49506f7e70746ffb", "scanner": "scanner-primary", "fingerprint": "d3ccee41cdbbc6df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0caac78dda134bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/Topics.jsx:62"}, "properties": {"repobilityId": "059a5a8db0293b25", "scanner": "scanner-primary", "fingerprint": "d0caac78dda134bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b426a7b5c38e05c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/Chat.jsx:51"}, "properties": {"repobilityId": "cededad23c7a7449", "scanner": "scanner-primary", "fingerprint": "9b426a7b5c38e05c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18d78218aff309e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/VentureFlow.jsx:327"}, "properties": {"repobilityId": "88e74091376f84a3", "scanner": "scanner-primary", "fingerprint": "18d78218aff309e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e83256fcfd4df0d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowApi.js:10"}, "properties": {"repobilityId": "dc99b8f18255b972", "scanner": "scanner-primary", "fingerprint": "e83256fcfd4df0d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b04eaa165dd63721", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/workflowExecutor.js:432"}, "properties": {"repobilityId": "757ca2f43aedf795", "scanner": "scanner-primary", "fingerprint": "b04eaa165dd63721", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d87a049204afb915", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/views/workflows/__tests__/workflowApi.test.js:26"}, "properties": {"repobilityId": "63f6a4abd207cf9e", "scanner": "scanner-primary", "fingerprint": "d87a049204afb915", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0969da30e2533d01", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/MasterPlanView.jsx:1"}, "properties": {"repobilityId": "dc1bda35c2f34492", "scanner": "scanner-primary", "fingerprint": "0969da30e2533d01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a43ff010e95a823", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyDashboardV2.jsx:3"}, "properties": {"repobilityId": "07d67cb7325b0ad6", "scanner": "scanner-primary", "fingerprint": "6a43ff010e95a823", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03f46bf92282b8b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyShell.jsx:3"}, "properties": {"repobilityId": "0f86dc9506442075", "scanner": "scanner-primary", "fingerprint": "03f46bf92282b8b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f348988649bfe6ef", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyExpenses.jsx:6"}, "properties": {"repobilityId": "ba4e2e1953759e06", "scanner": "scanner-primary", "fingerprint": "f348988649bfe6ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56690a5ada5401bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyBusinessOnboarding.jsx:3"}, "properties": {"repobilityId": "c0cac0001f5c4132", "scanner": "scanner-primary", "fingerprint": "56690a5ada5401bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e837363d760d8d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/views/moneyFlow/v2/MoneyOnboarding.jsx:3"}, "properties": {"repobilityId": "197d5be6ea9d92d0", "scanner": "scanner-primary", "fingerprint": "5e837363d760d8d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fbf551a084bca21", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/flow-ai/services/agentLoopService.ts:127"}, "properties": {"repobilityId": "099b724d07d1d27e", "scanner": "scanner-primary", "fingerprint": "7fbf551a084bca21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-badee220b76b77a6", "level": "warning", "message": {"text": "Frontend route `/venture-flow/:id/print/sprint` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "048fc80a225ca5c9", "scanner": "scanner-primary", "fingerprint": "badee220b76b77a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a58a6b97cd02a00", "level": "warning", "message": {"text": "Frontend route `/venture-flow/:id/print/user-test` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "779143bdc7a5474f", "scanner": "scanner-primary", "fingerprint": "9a58a6b97cd02a00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2136b8ba126b264c", "level": "warning", "message": {"text": "Frontend route `/venture-flow/:id/print/prd` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c3e52dfd6bf2d1de", "scanner": "scanner-primary", "fingerprint": "2136b8ba126b264c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0397b9bfef44ecc0", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "6e65d164ae2ddbbb", "scanner": "scanner-primary", "fingerprint": "0397b9bfef44ecc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b61b1dfaf10b7317", "level": "warning", "message": {"text": "Frontend route `/flow-trade-legacy` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "2b0520258e7cea2e", "scanner": "scanner-primary", "fingerprint": "b61b1dfaf10b7317", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-047975854d89cc87", "level": "warning", "message": {"text": "Frontend route `/money` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "2a7682c74f0be314", "scanner": "scanner-primary", "fingerprint": "047975854d89cc87", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-60e52ae660b198bb", "level": "warning", "message": {"text": "Frontend route `/money-flow-v1` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "96c98a710dadf96f", "scanner": "scanner-primary", "fingerprint": "60e52ae660b198bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-02e868906957827b", "level": "warning", "message": {"text": "Frontend route `/money-v2` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "d38eaf88f3d09088", "scanner": "scanner-primary", "fingerprint": "02e868906957827b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-35857fecfe6a7700", "level": "warning", "message": {"text": "Frontend route `/money-v2/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "86c5fecabb0cdbfc", "scanner": "scanner-primary", "fingerprint": "35857fecfe6a7700", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4a0024c7804cfe2", "level": "warning", "message": {"text": "Frontend route `/money/plan` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c58792a97e37fe45", "scanner": "scanner-primary", "fingerprint": "a4a0024c7804cfe2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0b00a8ec2df88300", "level": "warning", "message": {"text": "Frontend route `/money/plan/goals` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "09e19d46461ffd60", "scanner": "scanner-primary", "fingerprint": "0b00a8ec2df88300", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bac8b348debe5f9f", "level": "warning", "message": {"text": "Frontend route `/money/plan/scenarios` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "e7add9c980ab5315", "scanner": "scanner-primary", "fingerprint": "bac8b348debe5f9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-25f5a8e431ff7cad", "level": "warning", "message": {"text": "Frontend route `/money/plan/timeline` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "3a5fccf7fbeb0bf1", "scanner": "scanner-primary", "fingerprint": "25f5a8e431ff7cad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-414e80824ea068ce", "level": "warning", "message": {"text": "Frontend route `/money/plan/frameworks` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "ede737860acf5b19", "scanner": "scanner-primary", "fingerprint": "414e80824ea068ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-07b097b8273a2ade", "level": "warning", "message": {"text": "Frontend route `/money/property` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "1d0f28760e68406b", "scanner": "scanner-primary", "fingerprint": "07b097b8273a2ade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6beacc431fa8681d", "level": "warning", "message": {"text": "Frontend route `accounts` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "80fe83b599251c44", "scanner": "scanner-primary", "fingerprint": "6beacc431fa8681d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-769f9b9e24328692", "level": "warning", "message": {"text": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "42b5c5accb544dae", "scanner": "scanner-primary", "fingerprint": "769f9b9e24328692", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1b23fc1b26108fde", "level": "warning", "message": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "a77315e84e5ae547", "scanner": "scanner-primary", "fingerprint": "1b23fc1b26108fde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-816b60dde6eb2980", "level": "warning", "message": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "30f706cba1fe5989", "scanner": "scanner-primary", "fingerprint": "816b60dde6eb2980", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b506f235fce95297", "level": "warning", "message": {"text": "Frontend route `goals` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "e6e4cf2e0ad1a980", "scanner": "scanner-primary", "fingerprint": "b506f235fce95297", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-214bf1b6ce2f38d7", "level": "warning", "message": {"text": "Frontend route `goals/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "2619f9447ba08858", "scanner": "scanner-primary", "fingerprint": "214bf1b6ce2f38d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2e585e82c320b59e", "level": "warning", "message": {"text": "Frontend route `finance-plan` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "77792306258688d1", "scanner": "scanner-primary", "fingerprint": "2e585e82c320b59e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c2155df42cee865c", "level": "warning", "message": {"text": "Frontend route `investments` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "ebd4cf2c0df30044", "scanner": "scanner-primary", "fingerprint": "c2155df42cee865c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-597694ba8ac569f7", "level": "warning", "message": {"text": "Frontend route `401k` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "db2a15fa150c2ea5", "scanner": "scanner-primary", "fingerprint": "597694ba8ac569f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d02b5b93fedcde2d", "level": "warning", "message": {"text": "Frontend route `property` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "43c7a5c95e71c31c", "scanner": "scanner-primary", "fingerprint": "d02b5b93fedcde2d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-55036a229970a88b", "level": "warning", "message": {"text": "Frontend route `tax` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c9cc2ab88d1b867d", "scanner": "scanner-primary", "fingerprint": "55036a229970a88b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-98d6611c415a1808", "level": "warning", "message": {"text": "Frontend route `gallery` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "53f3b8b1927117e6", "scanner": "scanner-primary", "fingerprint": "98d6611c415a1808", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d6c8ea607f5defb7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}/with-timestamps (vite-plugin-elevenlabs.js:66)"}, "properties": {"repobilityId": "b54ac73c9818e4e9", "scanner": "scanner-primary", "fingerprint": "d6c8ea607f5defb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-558d500b1fca9ba0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(v)}?output_format=mp3_44100_128 (vite-plugin-elevenlabs.js:91)"}, "properties": {"repobilityId": "f47a9b135fc8fc95", "scanner": "scanner-primary", "fingerprint": "558d500b1fca9ba0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-288239d317f33f07", "level": "error", "message": {"text": "Dangling fetch: GET https://api.elevenlabs.io/v1/user (vite-plugin-elevenlabs.js:147)"}, "properties": {"repobilityId": "a32d1da894174585", "scanner": "scanner-primary", "fingerprint": "288239d317f33f07", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff4be91dd1adcb62", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/components/DockerMCPPanel.jsx:18)"}, "properties": {"repobilityId": "65dcb2b6ac321ace", "scanner": "scanner-primary", "fingerprint": "ff4be91dd1adcb62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e36b47a2271632d", "level": "error", "message": {"text": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/components/briefs/BriefModal.jsx:28)"}, "properties": {"repobilityId": "b37218244292d6db", "scanner": "scanner-primary", "fingerprint": "3e36b47a2271632d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5711117b994a53f7", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:99)"}, "properties": {"repobilityId": "9b3dcd4ae3f57933", "scanner": "scanner-primary", "fingerprint": "5711117b994a53f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9226b0408533bb8c", "level": "error", "message": {"text": "Dangling fetch: POST /api/save-alpaca-creds (src/components/settings/ApiKeyCards.jsx:406)"}, "properties": {"repobilityId": "5e1d091e8f8de1c6", "scanner": "scanner-primary", "fingerprint": "9226b0408533bb8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-320f43f660479e5a", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/components/settings/ApiKeyCards.jsx:496)"}, "properties": {"repobilityId": "65afdcd907a66a5e", "scanner": "scanner-primary", "fingerprint": "320f43f660479e5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a38c1365f1948e49", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/test (src/components/settings/ApiKeyCards.jsx:513)"}, "properties": {"repobilityId": "78d5a0174228a234", "scanner": "scanner-primary", "fingerprint": "a38c1365f1948e49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3829ea20de8e0ee", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/components/settings/useApiServices.jsx:22)"}, "properties": {"repobilityId": "f861090a96246221", "scanner": "scanner-primary", "fingerprint": "f3829ea20de8e0ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ea6e13e547348d3", "level": "error", "message": {"text": "Dangling fetch: GET /api/launcher/status (src/components/layout/LeftRail.jsx:152)"}, "properties": {"repobilityId": "934c7349d3ade47c", "scanner": "scanner-primary", "fingerprint": "3ea6e13e547348d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a20e21a1c6e315e", "level": "error", "message": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/layout/SettingsMenu.jsx:85)"}, "properties": {"repobilityId": "450884f0be0413ef", "scanner": "scanner-primary", "fingerprint": "4a20e21a1c6e315e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f52c9e022fa3a028", "level": "error", "message": {"text": "Dangling fetch: GET /api/backups (src/components/memory/BackupPanel.jsx:18)"}, "properties": {"repobilityId": "024688c4dfb4484e", "scanner": "scanner-primary", "fingerprint": "f52c9e022fa3a028", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10ce07b4b01ff778", "level": "error", "message": {"text": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:25)"}, "properties": {"repobilityId": "a2d4fd26d49e1a4b", "scanner": "scanner-primary", "fingerprint": "10ce07b4b01ff778", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-411f0b9cb2349534", "level": "error", "message": {"text": "Dangling fetch: GET /api/backups/${encodeURIComponent(b.name)} (src/components/memory/BackupPanel.jsx:35)"}, "properties": {"repobilityId": "763a8db51f79a22f", "scanner": "scanner-primary", "fingerprint": "411f0b9cb2349534", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66140f01e79371fb", "level": "error", "message": {"text": "Dangling fetch: POST /api/backups (src/components/memory/BackupPanel.jsx:46)"}, "properties": {"repobilityId": "dc281eceacaba12f", "scanner": "scanner-primary", "fingerprint": "66140f01e79371fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b01df7a7ef59b59d", "level": "error", "message": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/memory/KnowledgeOverview.jsx:1235)"}, "properties": {"repobilityId": "5adbdc5918e9d383", "scanner": "scanner-primary", "fingerprint": "b01df7a7ef59b59d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41a3b8afb824d0d0", "level": "error", "message": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/components/flow/QuickChatLauncher.jsx:280)"}, "properties": {"repobilityId": "f0719ffed2c4608a", "scanner": "scanner-primary", "fingerprint": "41a3b8afb824d0d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c68b5992a93a0753", "level": "error", "message": {"text": "Dangling fetch: POST /api/ollama/api/generate (src/flow-globe/GlobeOverlay.jsx:54)"}, "properties": {"repobilityId": "b4074a7fc40beabf", "scanner": "scanner-primary", "fingerprint": "c68b5992a93a0753", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94f360d922092ee6", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/jobs (src/flow-globe/flightUtils.js:129)"}, "properties": {"repobilityId": "db2d0f03622e56ba", "scanner": "scanner-primary", "fingerprint": "94f360d922092ee6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-281c5ce083b22ad9", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/flow-globe/flightUtils.js:138)"}, "properties": {"repobilityId": "5790f534c9c1f25a", "scanner": "scanner-primary", "fingerprint": "281c5ce083b22ad9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-869d1d330e6f059c", "level": "error", "message": {"text": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?${p} (src/flow-globe/weatherService.js:55)"}, "properties": {"repobilityId": "0d0b2c01400db176", "scanner": "scanner-primary", "fingerprint": "869d1d330e6f059c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abedb8512eca7411", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/flow-globe/FlightSearch.jsx:144)"}, "properties": {"repobilityId": "30ef5434aba06749", "scanner": "scanner-primary", "fingerprint": "abedb8512eca7411", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b8a3643e968584b", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/lib/connectionsSync.js:50)"}, "properties": {"repobilityId": "b009b86b638d6fe6", "scanner": "scanner-primary", "fingerprint": "0b8a3643e968584b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-667deccae43b7c89", "level": "error", "message": {"text": "Dangling fetch: POST /api/connections (src/lib/connectionsSync.js:76)"}, "properties": {"repobilityId": "c1edc87b52fc9816", "scanner": "scanner-primary", "fingerprint": "667deccae43b7c89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d345c2ae8b12bbc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (src/lib/telegram.js:28)"}, "properties": {"repobilityId": "a4b86d25a330769f", "scanner": "scanner-primary", "fingerprint": "9d345c2ae8b12bbc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24c4efc2c2a17868", "level": "error", "message": {"text": "Dangling fetch: GET https://www.virustotal.com/api/v3/urls/${urlId(url)} (src/lib/virustotal.js:40)"}, "properties": {"repobilityId": "7f59b7ead03bc1a8", "scanner": "scanner-primary", "fingerprint": "24c4efc2c2a17868", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f939993fd4986f7", "level": "error", "message": {"text": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(watchUrl)} (src/lib/youtubeAvailability.js:27)"}, "properties": {"repobilityId": "3bf89e337d10851a", "scanner": "scanner-primary", "fingerprint": "1f939993fd4986f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5168839e68d914c5", "level": "error", "message": {"text": "Dangling fetch: GET https://noembed.com/embed?url=${encodeURIComponent(url)} (src/lib/manualIngest.js:64)"}, "properties": {"repobilityId": "eca408343888dc84", "scanner": "scanner-primary", "fingerprint": "5168839e68d914c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66c2b9b4f62f45ea", "level": "error", "message": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/lib/flowAI/modelSelector.js:32)"}, "properties": {"repobilityId": "2b04ad90d627ee2e", "scanner": "scanner-primary", "fingerprint": "66c2b9b4f62f45ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-073f44896aa5d6bb", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/lib/chat/daemonTools.js:35)"}, "properties": {"repobilityId": "3fc3afb20be5f6b1", "scanner": "scanner-primary", "fingerprint": "073f44896aa5d6bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-32c8cb11aa6ea8a6", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/lib/chat/daemonTools.js:137)"}, "properties": {"repobilityId": "3b665db29c40f1e4", "scanner": "scanner-primary", "fingerprint": "32c8cb11aa6ea8a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6344e83ac5dff69", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(voiceId)}?output_format=mp3_44100_128 (src/lib/voice/player.js:229)"}, "properties": {"repobilityId": "c5311c59aad7f95c", "scanner": "scanner-primary", "fingerprint": "e6344e83ac5dff69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9acdfe0dae06fa57", "level": "error", "message": {"text": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:241)"}, "properties": {"repobilityId": "47a647a532675b2a", "scanner": "scanner-primary", "fingerprint": "9acdfe0dae06fa57", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-911f2113e483d99f", "level": "error", "message": {"text": "Dangling fetch: POST /api/tts (src/lib/voice/player.js:358)"}, "properties": {"repobilityId": "33991718636dec5d", "scanner": "scanner-primary", "fingerprint": "911f2113e483d99f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53021e2ce1afe181", "level": "error", "message": {"text": "Dangling fetch: GET https://api.microlink.io?url=${encodeURIComponent(url)} (src/lib/search/ogImage.js:84)"}, "properties": {"repobilityId": "5c0e763b486fe008", "scanner": "scanner-primary", "fingerprint": "53021e2ce1afe181", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-531a26c9c7460bac", "level": "error", "message": {"text": "Dangling fetch: POST /api/validate-elevenlabs (src/lib/credentials/validateOnSave.js:15)"}, "properties": {"repobilityId": "d46f2b9549ebfc46", "scanner": "scanner-primary", "fingerprint": "531a26c9c7460bac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-965e283e8e3460cc", "level": "error", "message": {"text": "Dangling fetch: GET https://api.higgsfield.ai/v1/auth/check (src/lib/credentials/validateOnSave.js:42)"}, "properties": {"repobilityId": "b3da8f33c1d8d2eb", "scanner": "scanner-primary", "fingerprint": "965e283e8e3460cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ae271000e380e9ec", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/docker-mcp/servers (src/diagnostics/errorFixer.js:256)"}, "properties": {"repobilityId": "96de098365c2212f", "scanner": "scanner-primary", "fingerprint": "ae271000e380e9ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ca9bde958282da0", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/jobs (src/diagnostics/errorFixer.js:265)"}, "properties": {"repobilityId": "5a1c239950d08d1d", "scanner": "scanner-primary", "fingerprint": "4ca9bde958282da0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a15d9527c40cb9b3", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/jobs/${jobId} (src/diagnostics/errorFixer.js:274)"}, "properties": {"repobilityId": "8ec79afbd6d49977", "scanner": "scanner-primary", "fingerprint": "a15d9527c40cb9b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-673c212fc2ff1086", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/flow-trade/status (src/diagnostics/connectionHealthCheck.js:83)"}, "properties": {"repobilityId": "7c433de5adc55be1", "scanner": "scanner-primary", "fingerprint": "673c212fc2ff1086", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84c6b471c97c5707", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/diagnostics/connectionHealthCheck.js:111)"}, "properties": {"repobilityId": "87386d2cc7ceeca9", "scanner": "scanner-primary", "fingerprint": "84c6b471c97c5707", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e8b67f560181480", "level": "error", "message": {"text": "Dangling fetch: GET /api/yahoo-finance/v7/finance/quote?symbols=${syms}&fields=regularMarketPrice,regularMarketChange,regularMarketChangePercent,symbol (src/flow-trade/StockTicker.jsx:11)"}, "properties": {"repobilityId": "8c32e8d07e88349c", "scanner": "scanner-primary", "fingerprint": "2e8b67f560181480", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-db592191b479e51f", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy/flow-trade/events (src/flow-trade/useFlowTradeSSE.js:38)"}, "properties": {"repobilityId": "5d40fcb7b1e0a111", "scanner": "scanner-primary", "fingerprint": "db592191b479e51f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2dee6eaafd269551", "level": "error", "message": {"text": "Dangling fetch: GET https://r.jina.ai/${url} (src/flow-trade/FlowTradeChat.jsx:9)"}, "properties": {"repobilityId": "55978dc6278a3bad", "scanner": "scanner-primary", "fingerprint": "2dee6eaafd269551", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cedb663594017353", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/flow-trade/api.js:29)"}, "properties": {"repobilityId": "e11f67b3121d3d71", "scanner": "scanner-primary", "fingerprint": "cedb663594017353", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c756cd10e2d66b9", "level": "error", "message": {"text": "Dangling fetch: GET /api/connections (src/views/SystemPanel.jsx:366)"}, "properties": {"repobilityId": "5b4d3d4d11eb3537", "scanner": "scanner-primary", "fingerprint": "3c756cd10e2d66b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0d73cab45153d52a", "level": "error", "message": {"text": "Dangling fetch: GET /api/env-keys (src/views/SystemPanel.jsx:373)"}, "properties": {"repobilityId": "0a57d532c0638b18", "scanner": "scanner-primary", "fingerprint": "0d73cab45153d52a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67ccdfe8161d4723", "level": "error", "message": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(val.trim())}&format=json&limit=4&addressdetails=1 (src/views/GlobeView.jsx:203)"}, "properties": {"repobilityId": "427e4d1a821fed76", "scanner": "scanner-primary", "fingerprint": "67ccdfe8161d4723", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5140e9bd02557f8", "level": "error", "message": {"text": "Dangling fetch: GET /api/ollama/api/tags (src/views/Chat.jsx:752)"}, "properties": {"repobilityId": "8292a395b57510cf", "scanner": "scanner-primary", "fingerprint": "e5140e9bd02557f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-132347d048455e7c", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/list-unread (src/views/workflows/workflowExecutor.js:227)"}, "properties": {"repobilityId": "3815716fe4307fd0", "scanner": "scanner-primary", "fingerprint": "132347d048455e7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ceecef5492b3a15", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/gmail-imap/create-draft (src/views/workflows/workflowExecutor.js:432)"}, "properties": {"repobilityId": "de64e3531a4e6e40", "scanner": "scanner-primary", "fingerprint": "1ceecef5492b3a15", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-366a2a37ad5bc7db", "level": "error", "message": {"text": "Dangling fetch: GET /data/employers-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:485)"}, "properties": {"repobilityId": "8db55ed5133f4b0b", "scanner": "scanner-primary", "fingerprint": "366a2a37ad5bc7db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90e41e7eedf9cb45", "level": "error", "message": {"text": "Dangling fetch: GET /data/merchants-common.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:593)"}, "properties": {"repobilityId": "218e41728daa7422", "scanner": "scanner-primary", "fingerprint": "90e41e7eedf9cb45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-973f602734f29665", "level": "error", "message": {"text": "Dangling fetch: GET /data/lenders-us.json (src/views/moneyFlow/MoneyFlowOnboardingV2.jsx:721)"}, "properties": {"repobilityId": "c62fb5366f151854", "scanner": "scanner-primary", "fingerprint": "973f602734f29665", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-633431a3ff6e664d", "level": "error", "message": {"text": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (daemon/src/media/imageUpload.ts:50)"}, "properties": {"repobilityId": "babab1ab19638a53", "scanner": "scanner-primary", "fingerprint": "633431a3ff6e664d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a560a94eed7d03fc", "level": "error", "message": {"text": "Dangling fetch: POST https://0x0.st (daemon/src/media/imageUpload.ts:75)"}, "properties": {"repobilityId": "b78db1b78dfd7682", "scanner": "scanner-primary", "fingerprint": "a560a94eed7d03fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-47675a5393828d2c", "level": "error", "message": {"text": "Dangling fetch: GET https://api.adsbdb.com/v0/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.ts:281)"}, "properties": {"repobilityId": "8ff619bc8ebe5409", "scanner": "scanner-primary", "fingerprint": "47675a5393828d2c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3d59cd1f964e47f", "level": "error", "message": {"text": "Dangling fetch: GET https://api.airplanes.live/v2/callsign/${encodeURIComponent(callsign)} (daemon/src/live-sky/service.ts:407)"}, "properties": {"repobilityId": "c539415c2bfc0e70", "scanner": "scanner-primary", "fingerprint": "b3d59cd1f964e47f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0fc5e520ecb085f", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${info.port}/health (src/mcp/providers/localProvider.ts:114)"}, "properties": {"repobilityId": "0d01a77aa473d176", "scanner": "scanner-primary", "fingerprint": "f0fc5e520ecb085f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1247c595ce1a0851", "level": "error", "message": {"text": "Dangling fetch: POST /api/daemon-proxy/tools/generate-pptx (src/mcp/services/telegramAgent.ts:381)"}, "properties": {"repobilityId": "802788c24c8627d9", "scanner": "scanner-primary", "fingerprint": "1247c595ce1a0851", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f478b9979b23a7dc", "level": "error", "message": {"text": "Dangling fetch: GET /api/searxng/search?q=${encodeURIComponent(slots.search_query)}&format=json (src/mcp/services/telegramAgent.ts:411)"}, "properties": {"repobilityId": "5e17848c3094d759", "scanner": "scanner-primary", "fingerprint": "f478b9979b23a7dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-96ac0677bcb47e8c", "level": "error", "message": {"text": "Dangling fetch: GET /api/daemon-proxy${path} (src/mcp/services/daemonApi.ts:15)"}, "properties": {"repobilityId": "dcb2d667b5b511bd", "scanner": "scanner-primary", "fingerprint": "96ac0677bcb47e8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a5eeb749f3434cae", "level": "error", "message": {"text": "Dangling fetch: POST /api/memory-index (src/memory-index/generator.ts:44)"}, "properties": {"repobilityId": "fea39dd777af6127", "scanner": "scanner-primary", "fingerprint": "a5eeb749f3434cae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0d9829ea69071eb3", "level": "note", "message": {"text": "Unused endpoint: USE /api/memory-index"}, "properties": {"repobilityId": "a3ee2a64c587379c", "scanner": "scanner-primary", "fingerprint": "0d9829ea69071eb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec1e6719c2b66ed2", "level": "note", "message": {"text": "Unused endpoint: USE /api/state"}, "properties": {"repobilityId": "3c4dbadcad4d940b", "scanner": "scanner-primary", "fingerprint": "ec1e6719c2b66ed2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b8ab10e6495b536", "level": "note", "message": {"text": "Unused endpoint: USE /api/daemon/info"}, "properties": {"repobilityId": "d8abc48515a02bdf", "scanner": "scanner-primary", "fingerprint": "8b8ab10e6495b536", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b625bd59c0654e2f", "level": "note", "message": {"text": "Unused endpoint: USE /api/connections"}, "properties": {"repobilityId": "55deadc10905f5e4", "scanner": "scanner-primary", "fingerprint": "b625bd59c0654e2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-258999fa5041b742", "level": "note", "message": {"text": "Unused endpoint: USE /api/env-keys"}, "properties": {"repobilityId": "1d81d94a364bb3a5", "scanner": "scanner-primary", "fingerprint": "258999fa5041b742", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12b2ce7de900a228", "level": "note", "message": {"text": "Unused endpoint: USE /api/save-alpaca-creds"}, "properties": {"repobilityId": "874c4e6f040cd4e9", "scanner": "scanner-primary", "fingerprint": "12b2ce7de900a228", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ddf3e22257ceb5f7", "level": "note", "message": {"text": "Unused endpoint: USE /api/launcher/status"}, "properties": {"repobilityId": "dfbb6c08ca878130", "scanner": "scanner-primary", "fingerprint": "ddf3e22257ceb5f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5edff3d861538ac4", "level": "note", "message": {"text": "Unused endpoint: USE /api/launcher/start-daemon"}, "properties": {"repobilityId": "0a22c0052cf1d6ab", "scanner": "scanner-primary", "fingerprint": "5edff3d861538ac4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff24e75b63921154", "level": "note", "message": {"text": "Unused endpoint: USE /api/launcher/stop-daemon"}, "properties": {"repobilityId": "d07daa3497a9d3c9", "scanner": "scanner-primary", "fingerprint": "ff24e75b63921154", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afdd279821e8c2f1", "level": "note", "message": {"text": "Unused endpoint: USE /api/launcher/restart-daemon"}, "properties": {"repobilityId": "74a5b837ece39c52", "scanner": "scanner-primary", "fingerprint": "afdd279821e8c2f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-570b16dbc452cda8", "level": "note", "message": {"text": "Unused endpoint: USE /api/launcher/logs"}, "properties": {"repobilityId": "1e345fed57238613", "scanner": "scanner-primary", "fingerprint": "570b16dbc452cda8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8834e698aff856bc", "level": "note", "message": {"text": "Unused endpoint: USE /api/daemon-proxy"}, "properties": {"repobilityId": "12f4e1c17fee23dc", "scanner": "scanner-primary", "fingerprint": "8834e698aff856bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f72e3fcd3a87a0f", "level": "note", "message": {"text": "Unused endpoint: USE /api/higgsfield"}, "properties": {"repobilityId": "be024bf035c07005", "scanner": "scanner-primary", "fingerprint": "5f72e3fcd3a87a0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7899619efdc8e41", "level": "note", "message": {"text": "Unused endpoint: USE /api/buffer"}, "properties": {"repobilityId": "f2e51570c1c2da98", "scanner": "scanner-primary", "fingerprint": "b7899619efdc8e41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf95de5072533b74", "level": "note", "message": {"text": "Unused endpoint: USE /api/validate-elevenlabs"}, "properties": {"repobilityId": "0e699e458bd3c2d6", "scanner": "scanner-primary", "fingerprint": "cf95de5072533b74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54922513d7dd0abe", "level": "note", "message": {"text": "Unused endpoint: USE /api/tts"}, "properties": {"repobilityId": "093e114645a67bee", "scanner": "scanner-primary", "fingerprint": "54922513d7dd0abe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-582b00fca2796501", "level": "note", "message": {"text": "Unused endpoint: GET /tools"}, "properties": {"repobilityId": "782649566baeced5", "scanner": "scanner-primary", "fingerprint": "582b00fca2796501", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50abf5ff9f938842", "level": "note", "message": {"text": "Unused endpoint: GET /docker-mcp/servers"}, "properties": {"repobilityId": "c4ef883213b8f627", "scanner": "scanner-primary", "fingerprint": "50abf5ff9f938842", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00f754f553ebaecd", "level": "note", "message": {"text": "Unused endpoint: POST /docker-mcp/sync"}, "properties": {"repobilityId": "fdadc7052e843220", "scanner": "scanner-primary", "fingerprint": "00f754f553ebaecd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed7d2fd8cf18d42c", "level": "note", "message": {"text": "Unused endpoint: POST /docker-mcp/servers"}, "properties": {"repobilityId": "1e7e9cc3b042e48f", "scanner": "scanner-primary", "fingerprint": "ed7d2fd8cf18d42c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ca13dc57ed9fda2", "level": "note", "message": {"text": "Unused endpoint: POST /docker-mcp/import-from-desktop"}, "properties": {"repobilityId": "e3b19955bf01e9cc", "scanner": "scanner-primary", "fingerprint": "0ca13dc57ed9fda2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-440f171c59130c92", "level": "note", "message": {"text": "Unused endpoint: PATCH /docker-mcp/servers/:id"}, "properties": {"repobilityId": "91b8bff670287452", "scanner": "scanner-primary", "fingerprint": "440f171c59130c92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a62833c41ba97a08", "level": "note", "message": {"text": "Unused endpoint: DELETE /docker-mcp/servers/:id"}, "properties": {"repobilityId": "f2f964c36186567d", "scanner": "scanner-primary", "fingerprint": "a62833c41ba97a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-281a92bfb6aee524", "level": "note", "message": {"text": "Unused endpoint: GET /workspace-roots"}, "properties": {"repobilityId": "108028cd7243467a", "scanner": "scanner-primary", "fingerprint": "281a92bfb6aee524", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e964c1e025a1aebd", "level": "note", "message": {"text": "Unused endpoint: POST /workspace-roots"}, "properties": {"repobilityId": "392f1a01a08aafc6", "scanner": "scanner-primary", "fingerprint": "e964c1e025a1aebd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f0297ba070ccda1", "level": "note", "message": {"text": "Unused endpoint: DELETE /workspace-roots"}, "properties": {"repobilityId": "201ff93af1d2013a", "scanner": "scanner-primary", "fingerprint": "4f0297ba070ccda1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b73face5b06aa67", "level": "note", "message": {"text": "Unused endpoint: POST /jobs"}, "properties": {"repobilityId": "ead65087958f0e43", "scanner": "scanner-primary", "fingerprint": "2b73face5b06aa67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44195ef888a1a79a", "level": "note", "message": {"text": "Unused endpoint: POST /jobs/:id/cancel"}, "properties": {"repobilityId": "939765fc17a754cc", "scanner": "scanner-primary", "fingerprint": "44195ef888a1a79a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-09ee72aea5a0a2b7", "level": "note", "message": {"text": "Unused endpoint: GET /jobs/:id"}, "properties": {"repobilityId": "c664853e4acd0846", "scanner": "scanner-primary", "fingerprint": "09ee72aea5a0a2b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2527279df995164f", "level": "note", "message": {"text": "Unused endpoint: GET /system/health"}, "properties": {"repobilityId": "77cfeef530b85caa", "scanner": "scanner-primary", "fingerprint": "2527279df995164f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e674e69292f924d3", "level": "note", "message": {"text": "Unused endpoint: GET /system/status"}, "properties": {"repobilityId": "06156d61a520e9e0", "scanner": "scanner-primary", "fingerprint": "e674e69292f924d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdadcffa0f3b2cbc", "level": "note", "message": {"text": "Unused endpoint: POST /system/pause-scheduler"}, "properties": {"repobilityId": "ec46c6a118951376", "scanner": "scanner-primary", "fingerprint": "bdadcffa0f3b2cbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dfccbdbf26f8f2fd", "level": "note", "message": {"text": "Unused endpoint: POST /system/resume-scheduler"}, "properties": {"repobilityId": "d7e31c53cdb052e0", "scanner": "scanner-primary", "fingerprint": "dfccbdbf26f8f2fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9b78ef619e66df4", "level": "note", "message": {"text": "Unused endpoint: GET /system/logs"}, "properties": {"repobilityId": "3b1470401ba3d05b", "scanner": "scanner-primary", "fingerprint": "a9b78ef619e66df4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-64609db1e1df4dc4", "level": "note", "message": {"text": "Unused endpoint: POST /system/shutdown"}, "properties": {"repobilityId": "e9314e07bd00d2cc", "scanner": "scanner-primary", "fingerprint": "64609db1e1df4dc4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-863863c3d422485b", "level": "note", "message": {"text": "Unused endpoint: POST /system/ollama/start"}, "properties": {"repobilityId": "1401787d773b506a", "scanner": "scanner-primary", "fingerprint": "863863c3d422485b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d01e281138d1d4e4", "level": "note", "message": {"text": "Unused endpoint: POST /system/ollama/enable-autorestart"}, "properties": {"repobilityId": "251bf0dfd43bb1a6", "scanner": "scanner-primary", "fingerprint": "d01e281138d1d4e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7365f0ce804b43ca", "level": "note", "message": {"text": "Unused endpoint: POST /gmail-imap/test"}, "properties": {"repobilityId": "688f227262c1499b", "scanner": "scanner-primary", "fingerprint": "7365f0ce804b43ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c98e344dc4dfeca", "level": "note", "message": {"text": "Unused endpoint: POST /gmail-imap/list-unread"}, "properties": {"repobilityId": "6427acdeefd82de0", "scanner": "scanner-primary", "fingerprint": "7c98e344dc4dfeca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d6e9dbfeaa806a5", "level": "note", "message": {"text": "Unused endpoint: POST /gmail-imap/create-draft"}, "properties": {"repobilityId": "f0930dc0e3fa4fd5", "scanner": "scanner-primary", "fingerprint": "7d6e9dbfeaa806a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-caab864b539ecefa", "level": "note", "message": {"text": "Unused endpoint: POST /gmail-imap/send"}, "properties": {"repobilityId": "8514176efa4ea16b", "scanner": "scanner-primary", "fingerprint": "caab864b539ecefa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6bbee709773148e", "level": "note", "message": {"text": "Unused endpoint: POST /oauth/google/credentials"}, "properties": {"repobilityId": "ee66ef88ec67ad85", "scanner": "scanner-primary", "fingerprint": "b6bbee709773148e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2f74337aa6fdd3d", "level": "note", "message": {"text": "Unused endpoint: GET /oauth/google/start-url"}, "properties": {"repobilityId": "6aef54a6ab450371", "scanner": "scanner-primary", "fingerprint": "f2f74337aa6fdd3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb03a5115c2d8a71", "level": "note", "message": {"text": "Unused endpoint: GET /oauth/google/callback"}, "properties": {"repobilityId": "a363154f8a590c1e", "scanner": "scanner-primary", "fingerprint": "eb03a5115c2d8a71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28ce92359220924f", "level": "note", "message": {"text": "Unused endpoint: GET /oauth/google/status"}, "properties": {"repobilityId": "54e6f4ca174e77ed", "scanner": "scanner-primary", "fingerprint": "28ce92359220924f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd7a44494ef5cc7e", "level": "note", "message": {"text": "Unused endpoint: DELETE /oauth/google/disconnect"}, "properties": {"repobilityId": "d809378c846f7044", "scanner": "scanner-primary", "fingerprint": "bd7a44494ef5cc7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-033ef9aba26faabf", "level": "note", "message": {"text": "Unused endpoint: POST /notifications/emit"}, "properties": {"repobilityId": "02814a30942e09d1", "scanner": "scanner-primary", "fingerprint": "033ef9aba26faabf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de79dccb21c4b0a2", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/alerts"}, "properties": {"repobilityId": "4efb2b56d90b08da", "scanner": "scanner-primary", "fingerprint": "de79dccb21c4b0a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5787887cf924010", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/alerts/unread-count"}, "properties": {"repobilityId": "eb07cd89996722cb", "scanner": "scanner-primary", "fingerprint": "d5787887cf924010", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-068a2793ee933563", "level": "note", "message": {"text": "Unused endpoint: GET /notifications/alerts/:id"}, "properties": {"repobilityId": "12a18e04061de490", "scanner": "scanner-primary", "fingerprint": "068a2793ee933563", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}