{"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-00f2dd9b95db29ef", "name": "Possibly dead Python function: normalize_confidence_block", "shortDescription": {"text": "Possibly dead Python function: normalize_confidence_block"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc0bf1f00628a220", "name": "Possibly dead Python function: dismiss_user_alert", "shortDescription": {"text": "Possibly dead Python function: dismiss_user_alert"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f84238d8e333c75", "name": "Possibly dead Python function: clear_user_alerts", "shortDescription": {"text": "Possibly dead Python function: clear_user_alerts"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e3b2aed1e680982", "name": "Possibly dead Python function: init_tradedesk_db", "shortDescription": {"text": "Possibly dead Python function: init_tradedesk_db"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6416a123f456b685", "name": "Possibly dead Python function: run_all_engines_cached", "shortDescription": {"text": "Possibly dead Python function: run_all_engines_cached"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e656d8c327b71e6", "name": "Possibly dead Python function: cancel_order", "shortDescription": {"text": "Possibly dead Python function: cancel_order"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3815b3e0a785d342", "name": "Possibly dead Python function: close_position", "shortDescription": {"text": "Possibly dead Python function: close_position"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aeb1f4bb22b05f45", "name": "Possibly dead Python function: execute_recommendation", "shortDescription": {"text": "Possibly dead Python function: execute_recommendation"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-378653e62d459e2d", "name": "Possibly dead Python function: as_dict", "shortDescription": {"text": "Possibly dead Python function: as_dict"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c4dba39149cecb81", "name": "Possibly dead Python function: invalidate", "shortDescription": {"text": "Possibly dead Python function: invalidate"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2dfb63d93d71d0c0", "name": "Possibly dead Python function: require_access_email", "shortDescription": {"text": "Possibly dead Python function: require_access_email"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05f21b9989bfdb38", "name": "Possibly dead Python function: invalidate", "shortDescription": {"text": "Possibly dead Python function: invalidate"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-643f99ba9c1f45b5", "name": "Possibly dead Python function: evaluate_user_alerts", "shortDescription": {"text": "Possibly dead Python function: evaluate_user_alerts"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea4350fd5fde43f9", "name": "Possibly dead Python function: calibrate_thresholds", "shortDescription": {"text": "Possibly dead Python function: calibrate_thresholds"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d6c695384cb5fcd4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SwingTradeEnginePanel.tsx:932", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SwingTradeEnginePanel.tsx:932"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60a92fd5038c63fc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeEnginePanel.tsx:968", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeEnginePanel.tsx:968"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43ef38dec8464adc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeTraderDecision.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeTraderDecision.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0111da8e6992a7d6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Sidebar.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Sidebar.tsx:308"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b38fa400094fcace", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecommendationCard.tsx:1062", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecommendationCard.tsx:1062"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce7092a4401dbb3e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PositionHubCard.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PositionHubCard.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82bb6f9ac5c90a5f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/desk/VerdictTab.tsx:437", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/desk/VerdictTab.tsx:437"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17582e9a186bb1ea", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortfolioPage.tsx:1101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortfolioPage.tsx:1101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-585fd716838c8b98", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AutoTradePage.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AutoTradePage.tsx: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-c916c7495499dd77", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TickerScannerPage.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TickerScannerPage.tsx:232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e52e737d3a0f9b48", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalFeedPage.tsx:731", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalFeedPage.tsx:731"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f858797a3edde22d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeSignalsPage.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeSignalsPage.tsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d770c8baadf74e29", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeIdeasPage.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeIdeasPage.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c26f9af12ff00ffb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MyTickersPage.tsx:431", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MyTickersPage.tsx:431"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c95c73da5fbf384", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SwingTradeWatchlistPage.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SwingTradeWatchlistPage.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a2efc3fcb75d46d1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeWatchlistPage.tsx:427", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeWatchlistPage.tsx:427"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a6e7dadf0115346", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/UnifiedWatchlistPage.tsx:652", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/UnifiedWatchlistPage.tsx:652"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1079127a5b64b9c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:498", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:498"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13929d5ea5c0b78c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/WatchlistPage.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/WatchlistPage.tsx: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-20ab7b00bca01943", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalPage.tsx:514", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalPage.tsx:514"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2904f1b14e5382f0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeSessionPage.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeSessionPage.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc26d4717ed673e4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AIStocksPage.tsx:898", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AIStocksPage.tsx:898"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b3aab284f2bd126f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HelpPage.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HelpPage.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d24f5148e5936d28", "name": "Insecure pattern 'direct_innerhtml_assignment' in trade-journal.html:563", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in trade-journal.html:563"}, "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-cbf1423511365b73", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/trade-journal.html:618", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/trade-journal.html:618"}, "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-248002a70f8e5182", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/desk/VerdictTab.tsx:437", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/desk/VerdictTab.tsx:437"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98eac7c7ee5d35f9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "appleboy/ssh-action@v1.2.2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-682d992f1315c06d", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d943ad45863a686", "name": "Very large file: frontend/src/components/SwingTradeEnginePanel.tsx (1652 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/SwingTradeEnginePanel.tsx (1652 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-ab34b2fe63d12b2a", "name": "Very large file: frontend/src/components/DayTradeEnginePanel.tsx (1964 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/DayTradeEnginePanel.tsx (1964 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-a33268b5f1c0a4c0", "name": "Very large file: frontend/src/components/RecommendationCard.tsx (1122 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/RecommendationCard.tsx (1122 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-cc134feac371bf4e", "name": "Very large file: frontend/src/contexts/AppContext.tsx (1529 lines)", "shortDescription": {"text": "Very large file: frontend/src/contexts/AppContext.tsx (1529 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-fff405ce2950b695", "name": "Very large file: frontend/src/pages/PortfolioPage.tsx (2281 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/PortfolioPage.tsx (2281 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-17903ac6a61f1d63", "name": "Very large file: frontend/src/pages/SignalFeedPage.tsx (1375 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/SignalFeedPage.tsx (1375 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-9ab88fa3097001d2", "name": "Very large file: frontend/src/pages/DayTradeDashboardPage.tsx (1087 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/DayTradeDashboardPage.tsx (1087 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-1b2a3b90ed0e001c", "name": "Very large file: frontend/src/pages/TradeSignalsPage.tsx (990 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/TradeSignalsPage.tsx (990 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-c377a11123d9093f", "name": "Very large file: frontend/src/pages/PositionsCenter.tsx (3333 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/PositionsCenter.tsx (3333 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-4d3f64f37399f5e1", "name": "Very large file: frontend/src/pages/TickerPage.tsx (1052 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/TickerPage.tsx (1052 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-d1d99fc1bc17956c", "name": "Very large file: frontend/src/pages/JournalPage.tsx (1268 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/JournalPage.tsx (1268 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-decbea1a4db2281b", "name": "Very large file: frontend/src/pages/DayTradePage.tsx (2118 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/DayTradePage.tsx (2118 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-5a0ece7ee52f4b37", "name": "Very large file: frontend/src/pages/AIStocksPage.tsx (1043 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/AIStocksPage.tsx (1043 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-9c04567369bf300e", "name": "Very large file: frontend/src/pages/EODJournalPage.tsx (1975 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/EODJournalPage.tsx (1975 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-c0efd34dc9c00565", "name": "Very large file: frontend/src/pages/HelpPage.tsx (5139 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/HelpPage.tsx (5139 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-1130354b2189207b", "name": "Very large file: frontend/src/pages/SwingTradePage.tsx (1267 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/SwingTradePage.tsx (1267 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-61f9d3b680571c13", "name": "Very large file: backend/command_center_router.py (2201 lines)", "shortDescription": {"text": "Very large file: backend/command_center_router.py (2201 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-40c17ed220277ce6", "name": "Very large file: backend/ai_coach.py (1164 lines)", "shortDescription": {"text": "Very large file: backend/ai_coach.py (1164 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-247a19c7858a2034", "name": "Very large file: backend/swing_trade.py (2616 lines)", "shortDescription": {"text": "Very large file: backend/swing_trade.py (2616 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a121111d2509d987", "name": "Very large file: backend/storage.py (2694 lines)", "shortDescription": {"text": "Very large file: backend/storage.py (2694 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-a4fae9ac17276029", "name": "Very large file: backend/day_trade.py (4160 lines)", "shortDescription": {"text": "Very large file: backend/day_trade.py (4160 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-75c1c1518b7f4eaa", "name": "Very large file: backend/trade_aggregator.py (1183 lines)", "shortDescription": {"text": "Very large file: backend/trade_aggregator.py (1183 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-8c7d21415dd4f68a", "name": "Very large file: backend/engine.py (1853 lines)", "shortDescription": {"text": "Very large file: backend/engine.py (1853 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-e9b9305c1586e148", "name": "Very large file: backend/main.py (5108 lines)", "shortDescription": {"text": "Very large file: backend/main.py (5108 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-c19de37ea0c3cc83", "name": "Very large file: backend/tests/test_engine_comprehensive.py (1162 lines)", "shortDescription": {"text": "Very large file: backend/tests/test_engine_comprehensive.py (1162 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 45 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 156 placeholder/mock markers across 40 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-161602cac2b5cf7a", "name": "Agent authority lacks a verifier contract: .cursorrules", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursorrules"}, "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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-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-0181c0b0e89683d0", "name": "Legacy-named symbol `oa_day_trade_watchlist_v1` in frontend/src/constants/storageKeys.ts:5", "shortDescription": {"text": "Legacy-named symbol `oa_day_trade_watchlist_v1` in frontend/src/constants/storageKeys.ts:5"}, "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-ff42ebc63724759c", "name": "Commented-code block (5 lines) in frontend/src/components/SwingTradeEnginePanel.tsx:912", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/SwingTradeEnginePanel.tsx:912"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7eb29631c833c71", "name": "Commented-code block (6 lines) in frontend/src/components/PreTradeChecklist.tsx:22", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/PreTradeChecklist.tsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04950a71921f76f3", "name": "Legacy-named symbol `oa_signal_feed_favorites_v1` in frontend/src/pages/SignalFeedPage.tsx:55", "shortDescription": {"text": "Legacy-named symbol `oa_signal_feed_favorites_v1` in frontend/src/pages/SignalFeedPage.tsx:55"}, "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-ecf2a88af464a606", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/OptionChainPage.tsx:359", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/OptionChainPage.tsx:359"}, "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-dd58b5ae6984a39b", "name": "Legacy-named symbol `oa_watchlist_favorites_v1` in frontend/src/pages/UnifiedWatchlistPage.tsx:40", "shortDescription": {"text": "Legacy-named symbol `oa_watchlist_favorites_v1` in frontend/src/pages/UnifiedWatchlistPage.tsx:40"}, "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-4204d4873be6c98b", "name": "Commented-code block (6 lines) in frontend/src/pages/AIStocksPage.tsx:254", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/AIStocksPage.tsx:254"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0cb089db3f5b67e3", "name": "Commented-code block (6 lines) in backend/ai_coach.py:213", "shortDescription": {"text": "Commented-code block (6 lines) in backend/ai_coach.py:213"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7e6f66794aaa653", "name": "Commented-code block (6 lines) in backend/swing_trade.py:58", "shortDescription": {"text": "Commented-code block (6 lines) in backend/swing_trade.py:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a62f63a88d5c99e5", "name": "Commented-code block (6 lines) in backend/day_trade.py:1648", "shortDescription": {"text": "Commented-code block (6 lines) in backend/day_trade.py:1648"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-841371418956f632", "name": "Commented-code block (7 lines) in backend/unified_analysis.py:525", "shortDescription": {"text": "Commented-code block (7 lines) in backend/unified_analysis.py:525"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6fa1b3c56c56e560", "name": "Commented-code block (5 lines) in backend/engine.py:277", "shortDescription": {"text": "Commented-code block (5 lines) in backend/engine.py:277"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9801cd0a1099b8c", "name": "Commented-code block (5 lines) in backend/analysis.py:136", "shortDescription": {"text": "Commented-code block (5 lines) in backend/analysis.py:136"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37bbf9e10296928c", "name": "Legacy-named symbol `test_put_wait_breakdown_copy` in backend/tests/test_active_trade_decision.py:72", "shortDescription": {"text": "Legacy-named symbol `test_put_wait_breakdown_copy` in backend/tests/test_active_trade_decision.py:72"}, "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-02d4f58bf5b970ab", "name": "36 env vars used in code but missing from .env.example", "shortDescription": {"text": "36 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_COACH_ENABLED`, `AI_COACH_MODEL`, `ALERT_ANALYSIS_CACHE_TTL_SECONDS`, `ALERT_SCAN_INTERVAL_SECONDS`, `ALERT_SCAN_MARKET_HOURS_ONLY`, `ALERT_SCAN_START_DELAY_SECONDS`, `ANALYZE_CACHE_TTL_MARKET_HOURS`, `ANALYZE_CACHE_TTL_OFF_HOURS` + 28 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/command_center_router.py:post_portfolio_remove, backend/command_center_router.py:post_portfolio_update_note\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/alerts/alert_normalizer.py:normalize_day_trade_alert, backend/alerts/alert_normalizer.py:normalize_swing_trade_alert, backend/alerts/alert_normalizer.py:normalize_regular_trade_alert\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebc5babea833455c", "name": "Frontend route `/forgot-password` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/forgot-password` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51f618330dfe7078", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8fbc8025895d84e3", "name": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a00527372d9f640b", "name": "Frontend route `/landing` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/landing` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d252e8d5157b1069", "name": "Frontend route `/day-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d96678b8afdeb04", "name": "Frontend route `/swing-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/swing-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e845c1212c5f7f4", "name": "Frontend route `/watchlistx` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/watchlistx` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f99b95f5d71770f2", "name": "Frontend route `/portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46e26c5195bd621b", "name": "Frontend route `/dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0a198ccaa3154dec", "name": "Frontend route `/discovery` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/discovery` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46a7a7a391890da8", "name": "Frontend route `/scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf7351bf71adc463", "name": "Frontend route `/ticker` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/ticker` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63427103c508e99f", "name": "Frontend route `/strategy-finder` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/strategy-finder` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e090f004414f707", "name": "Frontend route `/trading-glossary` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/trading-glossary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40f620a1ed18cf6d", "name": "Frontend route `/desk` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/desk` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-977782bea574613f", "name": "Frontend route `/ai-coach` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/ai-coach` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0048cf37294bd37", "name": "Frontend route `/positions` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/positions` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a71f7142a09aa24d", "name": "Frontend route `/alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74d704cac2dcfa1c", "name": "Frontend route `/settings` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da48bf02879bc32f", "name": "Frontend route `/ai-stocks` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/ai-stocks` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a781b3a90b944881", "name": "Frontend route `/q-radar` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/q-radar` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9804133e1bc002e5", "name": "Frontend route `/backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-268dce2a4eab8a94", "name": "Frontend route `/trade-signals` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/trade-signals` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95f4f82f9656c65e", "name": "Frontend route `/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39e28cb70d45abee", "name": "Frontend route `/auto-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/auto-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53ea12db75757ed7", "name": "Frontend route `/watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05f3dbaa45539175", "name": "Frontend route `/day-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37e650863ff4ead0", "name": "Frontend route `/day-trade-alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade-alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9c9bf85f0ff06a32", "name": "Frontend route `/active-trades` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/active-trades` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f9985c4655e026a", "name": "Frontend route `/swing-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/swing-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d680e7fc955e9e98", "name": "Frontend route `/my-tickers` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/my-tickers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c914768ba5904083", "name": "Frontend route `/day-trade-dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade-dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b78f41a7dda825e", "name": "Frontend route `/ticker-scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/ticker-scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51807700a6c7920f", "name": "Frontend route `/tools` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/tools` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b6dc11aa30fb9011", "name": "Frontend route `/day-trade-session` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade-session` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fa124c7a3a09f3b", "name": "Frontend route `/option-chain` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/option-chain` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-253e5c548d271d1c", "name": "Frontend route `/eod-journal` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/eod-journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77026d6423600f2f", "name": "Frontend route `/day-trade-backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/day-trade-backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f89a180c58e26f73", "name": "Frontend route `/journal-tool` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/journal-tool` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30b204c5317311f8", "name": "Unused endpoint: GET /market-position", "shortDescription": {"text": "Unused endpoint: GET /market-position"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /market-position` 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-e7d77075f6c8b497", "name": "Unused endpoint: GET /trade-command-center", "shortDescription": {"text": "Unused endpoint: GET /trade-command-center"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /trade-command-center` 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-67db81ff589a2912", "name": "Unused endpoint: GET /alerts", "shortDescription": {"text": "Unused endpoint: GET /alerts"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /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-6f20c7f20f0fca02", "name": "Unused endpoint: POST /alerts/{alert_id}/acknowledge", "shortDescription": {"text": "Unused endpoint: POST /alerts/{alert_id}/acknowledge"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /alerts/{alert_id}/acknowledge` 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-c7e10ccdfff98543", "name": "Unused endpoint: POST /alerts/{alert_id}/resolve", "shortDescription": {"text": "Unused endpoint: POST /alerts/{alert_id}/resolve"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /alerts/{alert_id}/resolve` 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-58f22752a26ef73e", "name": "Unused endpoint: POST /alerts/{alert_id}/note", "shortDescription": {"text": "Unused endpoint: POST /alerts/{alert_id}/note"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /alerts/{alert_id}/note` 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-c42e7566ff3a2241", "name": "Unused endpoint: GET /alerts/summary", "shortDescription": {"text": "Unused endpoint: GET /alerts/summary"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /alerts/summary` 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-7d59dc3ede723282", "name": "Unused endpoint: GET /positions-center", "shortDescription": {"text": "Unused endpoint: GET /positions-center"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /positions-center` 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-0b01d143dcd4a0f1", "name": "Unused endpoint: GET /premarket-bias", "shortDescription": {"text": "Unused endpoint: GET /premarket-bias"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /premarket-bias` 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-76c928b3a04ef2d6", "name": "Unused endpoint: GET /early-entry-trigger", "shortDescription": {"text": "Unused endpoint: GET /early-entry-trigger"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /early-entry-trigger` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c875924aa31c0bb4", "name": "Unused endpoint: GET /stock-targets", "shortDescription": {"text": "Unused endpoint: GET /stock-targets"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /stock-targets` 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-6b512484695c3757", "name": "Unused endpoint: POST /watchlist/add", "shortDescription": {"text": "Unused endpoint: POST /watchlist/add"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /watchlist/add` 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-ab0da68923a77740", "name": "Unused endpoint: POST /watchlist/remove", "shortDescription": {"text": "Unused endpoint: POST /watchlist/remove"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /watchlist/remove` 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-286d0cc01b909123", "name": "Unused endpoint: POST /portfolio/add", "shortDescription": {"text": "Unused endpoint: POST /portfolio/add"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /portfolio/add` 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-20da37cb11d8572f", "name": "Unused endpoint: POST /portfolio/update", "shortDescription": {"text": "Unused endpoint: POST /portfolio/update"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /portfolio/update` 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-620b6f102c35839d", "name": "Unused endpoint: POST /portfolio/close", "shortDescription": {"text": "Unused endpoint: POST /portfolio/close"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /portfolio/close` 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-2342ef8e4868f3fe", "name": "Unused endpoint: POST /portfolio/remove", "shortDescription": {"text": "Unused endpoint: POST /portfolio/remove"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /portfolio/remove` 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-8912cdb9203b70e0", "name": "Unused endpoint: POST /portfolio/update-note", "shortDescription": {"text": "Unused endpoint: POST /portfolio/update-note"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /portfolio/update-note` 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-de486dc1cbd7402f", "name": "Unused endpoint: GET /my-tickers", "shortDescription": {"text": "Unused endpoint: GET /my-tickers"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /my-tickers` 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-e26cb6151a3140e0", "name": "Unused endpoint: POST /my-tickers", "shortDescription": {"text": "Unused endpoint: POST /my-tickers"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /my-tickers` 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-0a0bbe71b96d4eb7", "name": "Unused endpoint: PATCH /my-tickers/{symbol}", "shortDescription": {"text": "Unused endpoint: PATCH /my-tickers/{symbol}"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `PATCH /my-tickers/{symbol}` 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-28e81c1d87bd0b5d", "name": "Unused endpoint: DELETE /my-tickers/{symbol}", "shortDescription": {"text": "Unused endpoint: DELETE /my-tickers/{symbol}"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `DELETE /my-tickers/{symbol}` 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-639c38c312356e05", "name": "Unused endpoint: GET /search-tickers", "shortDescription": {"text": "Unused endpoint: GET /search-tickers"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `GET /search-tickers` 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-7011769b00414bbd", "name": "Unused endpoint: DELETE /my-tickers/{symbol}/type/{trade_type}", "shortDescription": {"text": "Unused endpoint: DELETE /my-tickers/{symbol}/type/{trade_type}"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `DELETE /my-tickers/{symbol}/type/{trade_type}` 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-c97dfc3210e359e4", "name": "Unused endpoint: PUT /my-tickers/reorder", "shortDescription": {"text": "Unused endpoint: PUT /my-tickers/reorder"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `PUT /my-tickers/reorder` 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-7db0cd117ce7c4f9", "name": "Unused endpoint: POST /day-trade/overnight-runner", "shortDescription": {"text": "Unused endpoint: POST /day-trade/overnight-runner"}, "fullDescription": {"text": "`backend/command_center_router.py` declares `POST /day-trade/overnight-runner` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5887f6beb60dee57", "name": "Unused endpoint: POST /google", "shortDescription": {"text": "Unused endpoint: POST /google"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `POST /google` 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-0c9496120828a934", "name": "Unused endpoint: GET /activate", "shortDescription": {"text": "Unused endpoint: GET /activate"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `GET /activate` 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-4257ec01219aa99a", "name": "Unused endpoint: POST /forgot-password", "shortDescription": {"text": "Unused endpoint: POST /forgot-password"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `POST /forgot-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68a5d356c0cac9e3", "name": "Unused endpoint: POST /reset-password", "shortDescription": {"text": "Unused endpoint: POST /reset-password"}, "fullDescription": {"text": "`backend/auth_routes.py` declares `POST /reset-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c916030f714253e", "name": "Unused endpoint: POST /api/send-alert", "shortDescription": {"text": "Unused endpoint: POST /api/send-alert"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/send-alert` 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-9f637ccef5923460", "name": "Unused endpoint: POST /api/test-email", "shortDescription": {"text": "Unused endpoint: POST /api/test-email"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/test-email` 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-c4b44143072f5ab8", "name": "Unused endpoint: GET /api/email-status", "shortDescription": {"text": "Unused endpoint: GET /api/email-status"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/email-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-339b604a3afc45e7", "name": "Unused endpoint: GET /api/user-data/{email}", "shortDescription": {"text": "Unused endpoint: GET /api/user-data/{email}"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/user-data/{email}` 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-67c68694fd7a0686", "name": "Unused endpoint: PUT /api/user-data/{email}", "shortDescription": {"text": "Unused endpoint: PUT /api/user-data/{email}"}, "fullDescription": {"text": "`backend/main.py` declares `PUT /api/user-data/{email}` 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-d7e90783dee3618a", "name": "Unused endpoint: POST /api/analyze", "shortDescription": {"text": "Unused endpoint: POST /api/analyze"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/analyze` 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-dd65955e7b43b87f", "name": "Unused endpoint: GET /api/v2/analyze/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/v2/analyze/{ticker}"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/v2/analyze/{ticker}` 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-18a2f16e14cdea9a", "name": "Unused endpoint: GET /api/v2/analyze/{ticker}/public", "shortDescription": {"text": "Unused endpoint: GET /api/v2/analyze/{ticker}/public"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/v2/analyze/{ticker}/public` 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-efed2e81cb756621", "name": "Unused endpoint: GET /api/signal-feed", "shortDescription": {"text": "Unused endpoint: GET /api/signal-feed"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/signal-feed` 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-f9bd19299f3f83a8", "name": "Unused endpoint: POST /api/signal-feed/refresh", "shortDescription": {"text": "Unused endpoint: POST /api/signal-feed/refresh"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/signal-feed/refresh` 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-fa76f4d732e6409c", "name": "Unused endpoint: POST /api/cache/clear", "shortDescription": {"text": "Unused endpoint: POST /api/cache/clear"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/cache/clear` 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-9caf24a87d25e815", "name": "Unused endpoint: POST /api/signal-feed/alerts", "shortDescription": {"text": "Unused endpoint: POST /api/signal-feed/alerts"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/signal-feed/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-5cce8a2a0f605214", "name": "Unused endpoint: POST /api/day-trade", "shortDescription": {"text": "Unused endpoint: POST /api/day-trade"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/day-trade` 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-7bf38d5e4f13dc17", "name": "Unused endpoint: POST /api/swing-trade", "shortDescription": {"text": "Unused endpoint: POST /api/swing-trade"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/swing-trade` 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-37915a79c4177022", "name": "Unused endpoint: POST /api/trades/enter", "shortDescription": {"text": "Unused endpoint: POST /api/trades/enter"}, "fullDescription": {"text": "`backend/main.py` declares `POST /api/trades/enter` 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-f65774462900fbe0", "name": "Unused endpoint: GET /api/trades/active", "shortDescription": {"text": "Unused endpoint: GET /api/trades/active"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/trades/active` 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-1bdb3096acbe6aa4", "name": "Unused endpoint: GET /api/trades/{trade_id}/decision", "shortDescription": {"text": "Unused endpoint: GET /api/trades/{trade_id}/decision"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/trades/{trade_id}/decision` 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/22225"}, "properties": {"repository": "vijender-marthi/OptionAdvisor", "repoUrl": "https://github.com/vijender-marthi/OptionAdvisor", "branch": "main"}, "results": [{"ruleId": "scanner-00f2dd9b95db29ef", "level": "note", "message": {"text": "Possibly dead Python function: normalize_confidence_block"}, "properties": {"repobilityId": "65d3eadd32fae7d2", "scanner": "scanner-primary", "fingerprint": "00f2dd9b95db29ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/score_normalizer.py:462"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fc0bf1f00628a220", "level": "note", "message": {"text": "Possibly dead Python function: dismiss_user_alert"}, "properties": {"repobilityId": "31f0c3e234ca0419", "scanner": "scanner-primary", "fingerprint": "fc0bf1f00628a220", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/storage.py:1158"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f84238d8e333c75", "level": "note", "message": {"text": "Possibly dead Python function: clear_user_alerts"}, "properties": {"repobilityId": "eb2be4424de77791", "scanner": "scanner-primary", "fingerprint": "2f84238d8e333c75", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/storage.py:1167"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0e3b2aed1e680982", "level": "note", "message": {"text": "Possibly dead Python function: init_tradedesk_db"}, "properties": {"repobilityId": "9aaf40ea02cd25d0", "scanner": "scanner-primary", "fingerprint": "0e3b2aed1e680982", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/storage.py:2281"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6416a123f456b685", "level": "note", "message": {"text": "Possibly dead Python function: run_all_engines_cached"}, "properties": {"repobilityId": "948039fc1779a3ab", "scanner": "scanner-primary", "fingerprint": "6416a123f456b685", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/trade_aggregator.py:655"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e656d8c327b71e6", "level": "note", "message": {"text": "Possibly dead Python function: cancel_order"}, "properties": {"repobilityId": "466246ae9a8d1252", "scanner": "scanner-primary", "fingerprint": "8e656d8c327b71e6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alpaca_trader.py:411"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3815b3e0a785d342", "level": "note", "message": {"text": "Possibly dead Python function: close_position"}, "properties": {"repobilityId": "8ff14179eb0d5e3c", "scanner": "scanner-primary", "fingerprint": "3815b3e0a785d342", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alpaca_trader.py:431"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aeb1f4bb22b05f45", "level": "note", "message": {"text": "Possibly dead Python function: execute_recommendation"}, "properties": {"repobilityId": "ceabaf84b968eb25", "scanner": "scanner-primary", "fingerprint": "aeb1f4bb22b05f45", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alpaca_trader.py:458"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-378653e62d459e2d", "level": "note", "message": {"text": "Possibly dead Python function: as_dict"}, "properties": {"repobilityId": "69f3c90a88921b5d", "scanner": "scanner-primary", "fingerprint": "378653e62d459e2d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/quote_cache.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c4dba39149cecb81", "level": "note", "message": {"text": "Possibly dead Python function: invalidate"}, "properties": {"repobilityId": "528be77e1d75b539", "scanner": "scanner-primary", "fingerprint": "c4dba39149cecb81", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/quote_cache.py:250"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2dfb63d93d71d0c0", "level": "note", "message": {"text": "Possibly dead Python function: require_access_email"}, "properties": {"repobilityId": "9611bd8c5a1719c1", "scanner": "scanner-primary", "fingerprint": "2dfb63d93d71d0c0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/auth_routes.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05f21b9989bfdb38", "level": "note", "message": {"text": "Possibly dead Python function: invalidate"}, "properties": {"repobilityId": "528be77e1d75b539", "scanner": "scanner-primary", "fingerprint": "05f21b9989bfdb38", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bar_cache.py:153"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-643f99ba9c1f45b5", "level": "note", "message": {"text": "Possibly dead Python function: evaluate_user_alerts"}, "properties": {"repobilityId": "26a2703abf0984cf", "scanner": "scanner-primary", "fingerprint": "643f99ba9c1f45b5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alert_service.py:313"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea4350fd5fde43f9", "level": "note", "message": {"text": "Possibly dead Python function: calibrate_thresholds"}, "properties": {"repobilityId": "66048667a7d784db", "scanner": "scanner-primary", "fingerprint": "ea4350fd5fde43f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/config/day_config.py:68"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d6c695384cb5fcd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SwingTradeEnginePanel.tsx:932"}, "properties": {"repobilityId": "db0fece8673634ff", "scanner": "scanner-primary", "fingerprint": "d6c695384cb5fcd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60a92fd5038c63fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeEnginePanel.tsx:968"}, "properties": {"repobilityId": "2ef06db12c3510a4", "scanner": "scanner-primary", "fingerprint": "60a92fd5038c63fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43ef38dec8464adc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DayTradeTraderDecision.tsx:145"}, "properties": {"repobilityId": "665d4f35f0153298", "scanner": "scanner-primary", "fingerprint": "43ef38dec8464adc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0111da8e6992a7d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Sidebar.tsx:308"}, "properties": {"repobilityId": "d939641c15c40bf5", "scanner": "scanner-primary", "fingerprint": "0111da8e6992a7d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b38fa400094fcace", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecommendationCard.tsx:1062"}, "properties": {"repobilityId": "cf088469a101d726", "scanner": "scanner-primary", "fingerprint": "b38fa400094fcace", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce7092a4401dbb3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PositionHubCard.tsx:124"}, "properties": {"repobilityId": "f93bd64679753bec", "scanner": "scanner-primary", "fingerprint": "ce7092a4401dbb3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82bb6f9ac5c90a5f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/desk/VerdictTab.tsx:437"}, "properties": {"repobilityId": "d13e8a486a4fa153", "scanner": "scanner-primary", "fingerprint": "82bb6f9ac5c90a5f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-17582e9a186bb1ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortfolioPage.tsx:1101"}, "properties": {"repobilityId": "bc538d564ad0c0e9", "scanner": "scanner-primary", "fingerprint": "17582e9a186bb1ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-585fd716838c8b98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AutoTradePage.tsx:214"}, "properties": {"repobilityId": "9c41d3dc60f50093", "scanner": "scanner-primary", "fingerprint": "585fd716838c8b98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c916c7495499dd77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TickerScannerPage.tsx:232"}, "properties": {"repobilityId": "3df80f5d7201ed64", "scanner": "scanner-primary", "fingerprint": "c916c7495499dd77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e52e737d3a0f9b48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalFeedPage.tsx:731"}, "properties": {"repobilityId": "356b8c3bc38dd1e4", "scanner": "scanner-primary", "fingerprint": "e52e737d3a0f9b48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f858797a3edde22d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeSignalsPage.tsx:411"}, "properties": {"repobilityId": "10b96c6c31c822b0", "scanner": "scanner-primary", "fingerprint": "f858797a3edde22d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d770c8baadf74e29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TradeIdeasPage.tsx:207"}, "properties": {"repobilityId": "4692e8ee1877f758", "scanner": "scanner-primary", "fingerprint": "d770c8baadf74e29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c26f9af12ff00ffb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MyTickersPage.tsx:431"}, "properties": {"repobilityId": "8bab2c19e339cda0", "scanner": "scanner-primary", "fingerprint": "c26f9af12ff00ffb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c95c73da5fbf384", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SwingTradeWatchlistPage.tsx:74"}, "properties": {"repobilityId": "d3438f4e7b160bfd", "scanner": "scanner-primary", "fingerprint": "6c95c73da5fbf384", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2efc3fcb75d46d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeWatchlistPage.tsx:427"}, "properties": {"repobilityId": "5a1d429184291388", "scanner": "scanner-primary", "fingerprint": "a2efc3fcb75d46d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a6e7dadf0115346", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/UnifiedWatchlistPage.tsx:652"}, "properties": {"repobilityId": "61961544c320a933", "scanner": "scanner-primary", "fingerprint": "3a6e7dadf0115346", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1079127a5b64b9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:498"}, "properties": {"repobilityId": "44a7002df62c85a0", "scanner": "scanner-primary", "fingerprint": "d1079127a5b64b9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13929d5ea5c0b78c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/WatchlistPage.tsx:118"}, "properties": {"repobilityId": "d313fc86383d5394", "scanner": "scanner-primary", "fingerprint": "13929d5ea5c0b78c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20ab7b00bca01943", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalPage.tsx:514"}, "properties": {"repobilityId": "1e3f91f31302e81c", "scanner": "scanner-primary", "fingerprint": "20ab7b00bca01943", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2904f1b14e5382f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DayTradeSessionPage.tsx:204"}, "properties": {"repobilityId": "bb7db52c5565588d", "scanner": "scanner-primary", "fingerprint": "2904f1b14e5382f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc26d4717ed673e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AIStocksPage.tsx:898"}, "properties": {"repobilityId": "931fd4a97d50c4f4", "scanner": "scanner-primary", "fingerprint": "cc26d4717ed673e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3aab284f2bd126f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HelpPage.tsx:256"}, "properties": {"repobilityId": "8c1581c475b93ad3", "scanner": "scanner-primary", "fingerprint": "b3aab284f2bd126f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d24f5148e5936d28", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in trade-journal.html:563"}, "properties": {"repobilityId": "dcc79cbe96425768", "scanner": "scanner-primary", "fingerprint": "d24f5148e5936d28", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "trade-journal.html"}, "region": {"startLine": 563}}}]}, {"ruleId": "scanner-cbf1423511365b73", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/trade-journal.html:618"}, "properties": {"repobilityId": "bd5b54c2d02b5e94", "scanner": "scanner-primary", "fingerprint": "cbf1423511365b73", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/trade-journal.html"}, "region": {"startLine": 618}}}]}, {"ruleId": "scanner-248002a70f8e5182", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/desk/VerdictTab.tsx:437"}, "properties": {"repobilityId": "16ddc71a1372fa95", "scanner": "scanner-primary", "fingerprint": "248002a70f8e5182", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/desk/VerdictTab.tsx"}, "region": {"startLine": 437}}}]}, {"ruleId": "scanner-98eac7c7ee5d35f9", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c5e34c7075738566", "scanner": "scanner-primary", "fingerprint": "98eac7c7ee5d35f9", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-production.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-682d992f1315c06d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a012ccf29e916c03", "scanner": "scanner-primary", "fingerprint": "682d992f1315c06d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/engine-validation.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-682d992f1315c06d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f0fa611a174b17ce", "scanner": "scanner-primary", "fingerprint": "682d992f1315c06d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/engine-validation.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-4d943ad45863a686", "level": "note", "message": {"text": "Very large file: frontend/src/components/SwingTradeEnginePanel.tsx (1652 lines)"}, "properties": {"repobilityId": "640d69fd7e2ceed4", "scanner": "scanner-primary", "fingerprint": "4d943ad45863a686", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab34b2fe63d12b2a", "level": "note", "message": {"text": "Very large file: frontend/src/components/DayTradeEnginePanel.tsx (1964 lines)"}, "properties": {"repobilityId": "716299edb8938847", "scanner": "scanner-primary", "fingerprint": "ab34b2fe63d12b2a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a33268b5f1c0a4c0", "level": "note", "message": {"text": "Very large file: frontend/src/components/RecommendationCard.tsx (1122 lines)"}, "properties": {"repobilityId": "91253f1d0fcdf677", "scanner": "scanner-primary", "fingerprint": "a33268b5f1c0a4c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cc134feac371bf4e", "level": "note", "message": {"text": "Very large file: frontend/src/contexts/AppContext.tsx (1529 lines)"}, "properties": {"repobilityId": "9ae0763333bf7ff7", "scanner": "scanner-primary", "fingerprint": "cc134feac371bf4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fff405ce2950b695", "level": "note", "message": {"text": "Very large file: frontend/src/pages/PortfolioPage.tsx (2281 lines)"}, "properties": {"repobilityId": "9c26c566aeda039d", "scanner": "scanner-primary", "fingerprint": "fff405ce2950b695", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-17903ac6a61f1d63", "level": "note", "message": {"text": "Very large file: frontend/src/pages/SignalFeedPage.tsx (1375 lines)"}, "properties": {"repobilityId": "dd6d15dcf18db784", "scanner": "scanner-primary", "fingerprint": "17903ac6a61f1d63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9ab88fa3097001d2", "level": "note", "message": {"text": "Very large file: frontend/src/pages/DayTradeDashboardPage.tsx (1087 lines)"}, "properties": {"repobilityId": "2bfb726c07e8c6c0", "scanner": "scanner-primary", "fingerprint": "9ab88fa3097001d2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1b2a3b90ed0e001c", "level": "note", "message": {"text": "Very large file: frontend/src/pages/TradeSignalsPage.tsx (990 lines)"}, "properties": {"repobilityId": "0bbb6aa70df49a0e", "scanner": "scanner-primary", "fingerprint": "1b2a3b90ed0e001c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c377a11123d9093f", "level": "note", "message": {"text": "Very large file: frontend/src/pages/PositionsCenter.tsx (3333 lines)"}, "properties": {"repobilityId": "0c9438d69d5f8eb7", "scanner": "scanner-primary", "fingerprint": "c377a11123d9093f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4d3f64f37399f5e1", "level": "note", "message": {"text": "Very large file: frontend/src/pages/TickerPage.tsx (1052 lines)"}, "properties": {"repobilityId": "8a4a86689fce2f72", "scanner": "scanner-primary", "fingerprint": "4d3f64f37399f5e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1d99fc1bc17956c", "level": "note", "message": {"text": "Very large file: frontend/src/pages/JournalPage.tsx (1268 lines)"}, "properties": {"repobilityId": "51b3caec079447f8", "scanner": "scanner-primary", "fingerprint": "d1d99fc1bc17956c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-decbea1a4db2281b", "level": "note", "message": {"text": "Very large file: frontend/src/pages/DayTradePage.tsx (2118 lines)"}, "properties": {"repobilityId": "43c704e07f502ad2", "scanner": "scanner-primary", "fingerprint": "decbea1a4db2281b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5a0ece7ee52f4b37", "level": "note", "message": {"text": "Very large file: frontend/src/pages/AIStocksPage.tsx (1043 lines)"}, "properties": {"repobilityId": "35b7a1d3d0da9825", "scanner": "scanner-primary", "fingerprint": "5a0ece7ee52f4b37", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9c04567369bf300e", "level": "note", "message": {"text": "Very large file: frontend/src/pages/EODJournalPage.tsx (1975 lines)"}, "properties": {"repobilityId": "a62fe15bb3542f8f", "scanner": "scanner-primary", "fingerprint": "9c04567369bf300e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c0efd34dc9c00565", "level": "note", "message": {"text": "Very large file: frontend/src/pages/HelpPage.tsx (5139 lines)"}, "properties": {"repobilityId": "80d22acd22cec0a3", "scanner": "scanner-primary", "fingerprint": "c0efd34dc9c00565", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1130354b2189207b", "level": "note", "message": {"text": "Very large file: frontend/src/pages/SwingTradePage.tsx (1267 lines)"}, "properties": {"repobilityId": "1fb89c6746c3391c", "scanner": "scanner-primary", "fingerprint": "1130354b2189207b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-61f9d3b680571c13", "level": "note", "message": {"text": "Very large file: backend/command_center_router.py (2201 lines)"}, "properties": {"repobilityId": "fa856eb99ee8aa5d", "scanner": "scanner-primary", "fingerprint": "61f9d3b680571c13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-40c17ed220277ce6", "level": "note", "message": {"text": "Very large file: backend/ai_coach.py (1164 lines)"}, "properties": {"repobilityId": "c479793be75cd8ff", "scanner": "scanner-primary", "fingerprint": "40c17ed220277ce6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-247a19c7858a2034", "level": "note", "message": {"text": "Very large file: backend/swing_trade.py (2616 lines)"}, "properties": {"repobilityId": "6c058333ab7aad34", "scanner": "scanner-primary", "fingerprint": "247a19c7858a2034", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a121111d2509d987", "level": "note", "message": {"text": "Very large file: backend/storage.py (2694 lines)"}, "properties": {"repobilityId": "aff6eca47c786fe1", "scanner": "scanner-primary", "fingerprint": "a121111d2509d987", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a4fae9ac17276029", "level": "note", "message": {"text": "Very large file: backend/day_trade.py (4160 lines)"}, "properties": {"repobilityId": "94e0188d12762072", "scanner": "scanner-primary", "fingerprint": "a4fae9ac17276029", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75c1c1518b7f4eaa", "level": "note", "message": {"text": "Very large file: backend/trade_aggregator.py (1183 lines)"}, "properties": {"repobilityId": "5b08c1fc0c9ddde4", "scanner": "scanner-primary", "fingerprint": "75c1c1518b7f4eaa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c7d21415dd4f68a", "level": "note", "message": {"text": "Very large file: backend/engine.py (1853 lines)"}, "properties": {"repobilityId": "19d2a58f4ec81e3b", "scanner": "scanner-primary", "fingerprint": "8c7d21415dd4f68a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e9b9305c1586e148", "level": "note", "message": {"text": "Very large file: backend/main.py (5108 lines)"}, "properties": {"repobilityId": "fb764a5c13811891", "scanner": "scanner-primary", "fingerprint": "e9b9305c1586e148", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c19de37ea0c3cc83", "level": "note", "message": {"text": "Very large file: backend/tests/test_engine_comprehensive.py (1162 lines)"}, "properties": {"repobilityId": "9d63aad410f09192", "scanner": "scanner-primary", "fingerprint": "c19de37ea0c3cc83", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0b426284b8f5b000", "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": "627fa0ed817ecaa2", "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": "bc781fe0f32e0f69", "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": "9515dd0cb1c18f5e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "5c887f518cbff5b9", "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": "3008872851150341", "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": "1cd1a5847c96d2e0", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-161602cac2b5cf7a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursorrules"}, "properties": {"repobilityId": "2c319532e2ded78d", "scanner": "scanner-primary", "fingerprint": "161602cac2b5cf7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursorrules"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"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-0181c0b0e89683d0", "level": "note", "message": {"text": "Legacy-named symbol `oa_day_trade_watchlist_v1` in frontend/src/constants/storageKeys.ts:5"}, "properties": {"repobilityId": "e9294df6b0f48e0f", "scanner": "scanner-primary", "fingerprint": "0181c0b0e89683d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ff42ebc63724759c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/SwingTradeEnginePanel.tsx:912"}, "properties": {"repobilityId": "e3decc737cd5b396", "scanner": "scanner-primary", "fingerprint": "ff42ebc63724759c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7eb29631c833c71", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/PreTradeChecklist.tsx:22"}, "properties": {"repobilityId": "470998906dcba720", "scanner": "scanner-primary", "fingerprint": "e7eb29631c833c71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04950a71921f76f3", "level": "note", "message": {"text": "Legacy-named symbol `oa_signal_feed_favorites_v1` in frontend/src/pages/SignalFeedPage.tsx:55"}, "properties": {"repobilityId": "dfb011d7cc37c964", "scanner": "scanner-primary", "fingerprint": "04950a71921f76f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ecf2a88af464a606", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/OptionChainPage.tsx:359"}, "properties": {"repobilityId": "328dac0b2937c211", "scanner": "scanner-primary", "fingerprint": "ecf2a88af464a606", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd58b5ae6984a39b", "level": "note", "message": {"text": "Legacy-named symbol `oa_watchlist_favorites_v1` in frontend/src/pages/UnifiedWatchlistPage.tsx:40"}, "properties": {"repobilityId": "24320d83c9434cec", "scanner": "scanner-primary", "fingerprint": "dd58b5ae6984a39b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4204d4873be6c98b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/AIStocksPage.tsx:254"}, "properties": {"repobilityId": "aa1074645e2c1f5b", "scanner": "scanner-primary", "fingerprint": "4204d4873be6c98b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0cb089db3f5b67e3", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/ai_coach.py:213"}, "properties": {"repobilityId": "9c29eaa026f5aaf3", "scanner": "scanner-primary", "fingerprint": "0cb089db3f5b67e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7e6f66794aaa653", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/swing_trade.py:58"}, "properties": {"repobilityId": "7b585620331bf96a", "scanner": "scanner-primary", "fingerprint": "f7e6f66794aaa653", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a62f63a88d5c99e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/day_trade.py:1648"}, "properties": {"repobilityId": "4f7133efbe00d51f", "scanner": "scanner-primary", "fingerprint": "a62f63a88d5c99e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-841371418956f632", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/unified_analysis.py:525"}, "properties": {"repobilityId": "be642afaf35e588a", "scanner": "scanner-primary", "fingerprint": "841371418956f632", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fa1b3c56c56e560", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/engine.py:277"}, "properties": {"repobilityId": "66aa44d0c34dbd7f", "scanner": "scanner-primary", "fingerprint": "6fa1b3c56c56e560", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9801cd0a1099b8c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/analysis.py:136"}, "properties": {"repobilityId": "9b054b6324bfcd8b", "scanner": "scanner-primary", "fingerprint": "b9801cd0a1099b8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37bbf9e10296928c", "level": "note", "message": {"text": "Legacy-named symbol `test_put_wait_breakdown_copy` in backend/tests/test_active_trade_decision.py:72"}, "properties": {"repobilityId": "76f887d9e2a88e4f", "scanner": "scanner-primary", "fingerprint": "37bbf9e10296928c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-02d4f58bf5b970ab", "level": "note", "message": {"text": "36 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "8842434a0f433d2d", "scanner": "scanner-primary", "fingerprint": "02d4f58bf5b970ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5d60ddad3bc02f79", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bc4957119f2e3f81", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "353d484a3970b47c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "df90df69ba533dbb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "58f0f0e526aba306", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6464daa781f84383", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3c115ebb174f299c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "126ba9a3f1c16c4a", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-ebc5babea833455c", "level": "warning", "message": {"text": "Frontend route `/forgot-password` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "97a7e12ee5c28ca9", "scanner": "scanner-primary", "fingerprint": "ebc5babea833455c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51f618330dfe7078", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "cf3723c8e14033a7", "scanner": "scanner-primary", "fingerprint": "51f618330dfe7078", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8fbc8025895d84e3", "level": "warning", "message": {"text": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e7c393f59d84f3cc", "scanner": "scanner-primary", "fingerprint": "8fbc8025895d84e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a00527372d9f640b", "level": "warning", "message": {"text": "Frontend route `/landing` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a73a2d644d23793b", "scanner": "scanner-primary", "fingerprint": "a00527372d9f640b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d252e8d5157b1069", "level": "warning", "message": {"text": "Frontend route `/day-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d4284b7563b7d12e", "scanner": "scanner-primary", "fingerprint": "d252e8d5157b1069", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7d96678b8afdeb04", "level": "warning", "message": {"text": "Frontend route `/swing-trade-watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "30456d746db97a04", "scanner": "scanner-primary", "fingerprint": "7d96678b8afdeb04", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3e845c1212c5f7f4", "level": "warning", "message": {"text": "Frontend route `/watchlistx` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "173d2dce3a642113", "scanner": "scanner-primary", "fingerprint": "3e845c1212c5f7f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f99b95f5d71770f2", "level": "warning", "message": {"text": "Frontend route `/portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0d3f9debb85dbb77", "scanner": "scanner-primary", "fingerprint": "f99b95f5d71770f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-46e26c5195bd621b", "level": "warning", "message": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d672aeb931a8067d", "scanner": "scanner-primary", "fingerprint": "46e26c5195bd621b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0a198ccaa3154dec", "level": "warning", "message": {"text": "Frontend route `/discovery` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "dfaa5615b0599bcc", "scanner": "scanner-primary", "fingerprint": "0a198ccaa3154dec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-46a7a7a391890da8", "level": "warning", "message": {"text": "Frontend route `/scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "02b056999479dfe5", "scanner": "scanner-primary", "fingerprint": "46a7a7a391890da8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cf7351bf71adc463", "level": "warning", "message": {"text": "Frontend route `/ticker` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3873836b369d5cf6", "scanner": "scanner-primary", "fingerprint": "cf7351bf71adc463", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-63427103c508e99f", "level": "warning", "message": {"text": "Frontend route `/strategy-finder` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3aefdae1f2f8058c", "scanner": "scanner-primary", "fingerprint": "63427103c508e99f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6e090f004414f707", "level": "warning", "message": {"text": "Frontend route `/trading-glossary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "301260cf283b49d4", "scanner": "scanner-primary", "fingerprint": "6e090f004414f707", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-40f620a1ed18cf6d", "level": "warning", "message": {"text": "Frontend route `/desk` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0c64f09c270c9675", "scanner": "scanner-primary", "fingerprint": "40f620a1ed18cf6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-977782bea574613f", "level": "warning", "message": {"text": "Frontend route `/ai-coach` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "01e15e3782926861", "scanner": "scanner-primary", "fingerprint": "977782bea574613f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b0048cf37294bd37", "level": "warning", "message": {"text": "Frontend route `/positions` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "467ce17c755a28ba", "scanner": "scanner-primary", "fingerprint": "b0048cf37294bd37", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a71f7142a09aa24d", "level": "warning", "message": {"text": "Frontend route `/alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8040acc835c5eb05", "scanner": "scanner-primary", "fingerprint": "a71f7142a09aa24d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-74d704cac2dcfa1c", "level": "warning", "message": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d06efaba0fd275f7", "scanner": "scanner-primary", "fingerprint": "74d704cac2dcfa1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-da48bf02879bc32f", "level": "warning", "message": {"text": "Frontend route `/ai-stocks` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0ad953a931022b7e", "scanner": "scanner-primary", "fingerprint": "da48bf02879bc32f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a781b3a90b944881", "level": "warning", "message": {"text": "Frontend route `/q-radar` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f13e9d8e4d49e231", "scanner": "scanner-primary", "fingerprint": "a781b3a90b944881", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9804133e1bc002e5", "level": "warning", "message": {"text": "Frontend route `/backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d1837b11f8b4cf23", "scanner": "scanner-primary", "fingerprint": "9804133e1bc002e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-268dce2a4eab8a94", "level": "warning", "message": {"text": "Frontend route `/trade-signals` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c300acedc522235c", "scanner": "scanner-primary", "fingerprint": "268dce2a4eab8a94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-95f4f82f9656c65e", "level": "warning", "message": {"text": "Frontend route `/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "43509b2eddddcb6e", "scanner": "scanner-primary", "fingerprint": "95f4f82f9656c65e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39e28cb70d45abee", "level": "warning", "message": {"text": "Frontend route `/auto-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e8c088f9c5987a3b", "scanner": "scanner-primary", "fingerprint": "39e28cb70d45abee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-53ea12db75757ed7", "level": "warning", "message": {"text": "Frontend route `/watchlist` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "66615fbcf08a3f21", "scanner": "scanner-primary", "fingerprint": "53ea12db75757ed7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-05f3dbaa45539175", "level": "warning", "message": {"text": "Frontend route `/day-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "30f77e9ec922c0f0", "scanner": "scanner-primary", "fingerprint": "05f3dbaa45539175", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-37e650863ff4ead0", "level": "warning", "message": {"text": "Frontend route `/day-trade-alerts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "978055bb9f87da63", "scanner": "scanner-primary", "fingerprint": "37e650863ff4ead0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9c9bf85f0ff06a32", "level": "warning", "message": {"text": "Frontend route `/active-trades` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a0d310d9b504769f", "scanner": "scanner-primary", "fingerprint": "9c9bf85f0ff06a32", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6f9985c4655e026a", "level": "warning", "message": {"text": "Frontend route `/swing-trade` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "00a83fc929b4ed1e", "scanner": "scanner-primary", "fingerprint": "6f9985c4655e026a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d680e7fc955e9e98", "level": "warning", "message": {"text": "Frontend route `/my-tickers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "6b19c82e690eb2e3", "scanner": "scanner-primary", "fingerprint": "d680e7fc955e9e98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c914768ba5904083", "level": "warning", "message": {"text": "Frontend route `/day-trade-dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b7ee0b1d5c7d4c97", "scanner": "scanner-primary", "fingerprint": "c914768ba5904083", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6b78f41a7dda825e", "level": "warning", "message": {"text": "Frontend route `/ticker-scanner` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "16552c272cdb2237", "scanner": "scanner-primary", "fingerprint": "6b78f41a7dda825e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51807700a6c7920f", "level": "warning", "message": {"text": "Frontend route `/tools` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "405e3b434d9b3d8e", "scanner": "scanner-primary", "fingerprint": "51807700a6c7920f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b6dc11aa30fb9011", "level": "warning", "message": {"text": "Frontend route `/day-trade-session` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "44aef85ab08c1806", "scanner": "scanner-primary", "fingerprint": "b6dc11aa30fb9011", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3fa124c7a3a09f3b", "level": "warning", "message": {"text": "Frontend route `/option-chain` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "18e5e950c21ad110", "scanner": "scanner-primary", "fingerprint": "3fa124c7a3a09f3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-253e5c548d271d1c", "level": "warning", "message": {"text": "Frontend route `/eod-journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "84876e7990f9071b", "scanner": "scanner-primary", "fingerprint": "253e5c548d271d1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-77026d6423600f2f", "level": "warning", "message": {"text": "Frontend route `/day-trade-backtest` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "517189948849ef00", "scanner": "scanner-primary", "fingerprint": "77026d6423600f2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f89a180c58e26f73", "level": "warning", "message": {"text": "Frontend route `/journal-tool` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "be89644059192f0e", "scanner": "scanner-primary", "fingerprint": "f89a180c58e26f73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-30b204c5317311f8", "level": "note", "message": {"text": "Unused endpoint: GET /market-position"}, "properties": {"repobilityId": "d6681e5f624070a9", "scanner": "scanner-primary", "fingerprint": "30b204c5317311f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7d77075f6c8b497", "level": "note", "message": {"text": "Unused endpoint: GET /trade-command-center"}, "properties": {"repobilityId": "ea46b78323cd49d5", "scanner": "scanner-primary", "fingerprint": "e7d77075f6c8b497", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67db81ff589a2912", "level": "note", "message": {"text": "Unused endpoint: GET /alerts"}, "properties": {"repobilityId": "81dfa4a961d2b7fe", "scanner": "scanner-primary", "fingerprint": "67db81ff589a2912", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f20c7f20f0fca02", "level": "note", "message": {"text": "Unused endpoint: POST /alerts/{alert_id}/acknowledge"}, "properties": {"repobilityId": "96d8f70095dde7da", "scanner": "scanner-primary", "fingerprint": "6f20c7f20f0fca02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7e10ccdfff98543", "level": "note", "message": {"text": "Unused endpoint: POST /alerts/{alert_id}/resolve"}, "properties": {"repobilityId": "59dcb8eefffeea4c", "scanner": "scanner-primary", "fingerprint": "c7e10ccdfff98543", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-58f22752a26ef73e", "level": "note", "message": {"text": "Unused endpoint: POST /alerts/{alert_id}/note"}, "properties": {"repobilityId": "856877c9e597dbe3", "scanner": "scanner-primary", "fingerprint": "58f22752a26ef73e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c42e7566ff3a2241", "level": "note", "message": {"text": "Unused endpoint: GET /alerts/summary"}, "properties": {"repobilityId": "398b2f329265cc17", "scanner": "scanner-primary", "fingerprint": "c42e7566ff3a2241", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d59dc3ede723282", "level": "note", "message": {"text": "Unused endpoint: GET /positions-center"}, "properties": {"repobilityId": "d2180103c36204e5", "scanner": "scanner-primary", "fingerprint": "7d59dc3ede723282", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b01d143dcd4a0f1", "level": "note", "message": {"text": "Unused endpoint: GET /premarket-bias"}, "properties": {"repobilityId": "4a256123019f2388", "scanner": "scanner-primary", "fingerprint": "0b01d143dcd4a0f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76c928b3a04ef2d6", "level": "note", "message": {"text": "Unused endpoint: GET /early-entry-trigger"}, "properties": {"repobilityId": "f99ed35c68c5258d", "scanner": "scanner-primary", "fingerprint": "76c928b3a04ef2d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c875924aa31c0bb4", "level": "note", "message": {"text": "Unused endpoint: GET /stock-targets"}, "properties": {"repobilityId": "577e3bd50c7628cb", "scanner": "scanner-primary", "fingerprint": "c875924aa31c0bb4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b512484695c3757", "level": "note", "message": {"text": "Unused endpoint: POST /watchlist/add"}, "properties": {"repobilityId": "e894a005e3bc7739", "scanner": "scanner-primary", "fingerprint": "6b512484695c3757", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab0da68923a77740", "level": "note", "message": {"text": "Unused endpoint: POST /watchlist/remove"}, "properties": {"repobilityId": "ee8c04d764a3c2ff", "scanner": "scanner-primary", "fingerprint": "ab0da68923a77740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-286d0cc01b909123", "level": "note", "message": {"text": "Unused endpoint: POST /portfolio/add"}, "properties": {"repobilityId": "7b2300c1c3020e2e", "scanner": "scanner-primary", "fingerprint": "286d0cc01b909123", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20da37cb11d8572f", "level": "note", "message": {"text": "Unused endpoint: POST /portfolio/update"}, "properties": {"repobilityId": "c40745eedc8d3a78", "scanner": "scanner-primary", "fingerprint": "20da37cb11d8572f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-620b6f102c35839d", "level": "note", "message": {"text": "Unused endpoint: POST /portfolio/close"}, "properties": {"repobilityId": "0d70602059a791bd", "scanner": "scanner-primary", "fingerprint": "620b6f102c35839d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2342ef8e4868f3fe", "level": "note", "message": {"text": "Unused endpoint: POST /portfolio/remove"}, "properties": {"repobilityId": "f8e6b20a865f61ce", "scanner": "scanner-primary", "fingerprint": "2342ef8e4868f3fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8912cdb9203b70e0", "level": "note", "message": {"text": "Unused endpoint: POST /portfolio/update-note"}, "properties": {"repobilityId": "5e46e9f6bab1c8a7", "scanner": "scanner-primary", "fingerprint": "8912cdb9203b70e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de486dc1cbd7402f", "level": "note", "message": {"text": "Unused endpoint: GET /my-tickers"}, "properties": {"repobilityId": "160abc307f1d0624", "scanner": "scanner-primary", "fingerprint": "de486dc1cbd7402f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e26cb6151a3140e0", "level": "note", "message": {"text": "Unused endpoint: POST /my-tickers"}, "properties": {"repobilityId": "c7fdb4880e2a51e6", "scanner": "scanner-primary", "fingerprint": "e26cb6151a3140e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a0bbe71b96d4eb7", "level": "note", "message": {"text": "Unused endpoint: PATCH /my-tickers/{symbol}"}, "properties": {"repobilityId": "4e193cf75a00e3c9", "scanner": "scanner-primary", "fingerprint": "0a0bbe71b96d4eb7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28e81c1d87bd0b5d", "level": "note", "message": {"text": "Unused endpoint: DELETE /my-tickers/{symbol}"}, "properties": {"repobilityId": "fabbde9c4d0a621b", "scanner": "scanner-primary", "fingerprint": "28e81c1d87bd0b5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-639c38c312356e05", "level": "note", "message": {"text": "Unused endpoint: GET /search-tickers"}, "properties": {"repobilityId": "4cf36207a5f5176f", "scanner": "scanner-primary", "fingerprint": "639c38c312356e05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7011769b00414bbd", "level": "note", "message": {"text": "Unused endpoint: DELETE /my-tickers/{symbol}/type/{trade_type}"}, "properties": {"repobilityId": "6f49ea1c0cd4c757", "scanner": "scanner-primary", "fingerprint": "7011769b00414bbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c97dfc3210e359e4", "level": "note", "message": {"text": "Unused endpoint: PUT /my-tickers/reorder"}, "properties": {"repobilityId": "16b7c0fa4ce84a26", "scanner": "scanner-primary", "fingerprint": "c97dfc3210e359e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7db0cd117ce7c4f9", "level": "note", "message": {"text": "Unused endpoint: POST /day-trade/overnight-runner"}, "properties": {"repobilityId": "d866a59709abcc75", "scanner": "scanner-primary", "fingerprint": "7db0cd117ce7c4f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "bbaa45ab38a3368e", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "d3e1498e3b363a67", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5887f6beb60dee57", "level": "note", "message": {"text": "Unused endpoint: POST /google"}, "properties": {"repobilityId": "76a8d0d1799c26de", "scanner": "scanner-primary", "fingerprint": "5887f6beb60dee57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c9496120828a934", "level": "note", "message": {"text": "Unused endpoint: GET /activate"}, "properties": {"repobilityId": "19276d765f79b34d", "scanner": "scanner-primary", "fingerprint": "0c9496120828a934", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4257ec01219aa99a", "level": "note", "message": {"text": "Unused endpoint: POST /forgot-password"}, "properties": {"repobilityId": "68c89fef4bef6d85", "scanner": "scanner-primary", "fingerprint": "4257ec01219aa99a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a5d356c0cac9e3", "level": "note", "message": {"text": "Unused endpoint: POST /reset-password"}, "properties": {"repobilityId": "819d4b03227ab5b5", "scanner": "scanner-primary", "fingerprint": "68a5d356c0cac9e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9266ee3970fba636", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c916030f714253e", "level": "note", "message": {"text": "Unused endpoint: POST /api/send-alert"}, "properties": {"repobilityId": "6c6769ac95de8128", "scanner": "scanner-primary", "fingerprint": "0c916030f714253e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f637ccef5923460", "level": "note", "message": {"text": "Unused endpoint: POST /api/test-email"}, "properties": {"repobilityId": "d58a6d07df0f5d71", "scanner": "scanner-primary", "fingerprint": "9f637ccef5923460", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c4b44143072f5ab8", "level": "note", "message": {"text": "Unused endpoint: GET /api/email-status"}, "properties": {"repobilityId": "8112af4ca0edacaf", "scanner": "scanner-primary", "fingerprint": "c4b44143072f5ab8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-339b604a3afc45e7", "level": "note", "message": {"text": "Unused endpoint: GET /api/user-data/{email}"}, "properties": {"repobilityId": "82704e190a90617b", "scanner": "scanner-primary", "fingerprint": "339b604a3afc45e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67c68694fd7a0686", "level": "note", "message": {"text": "Unused endpoint: PUT /api/user-data/{email}"}, "properties": {"repobilityId": "45120cf3329b3456", "scanner": "scanner-primary", "fingerprint": "67c68694fd7a0686", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7e90783dee3618a", "level": "note", "message": {"text": "Unused endpoint: POST /api/analyze"}, "properties": {"repobilityId": "98067785f3902421", "scanner": "scanner-primary", "fingerprint": "d7e90783dee3618a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd65955e7b43b87f", "level": "note", "message": {"text": "Unused endpoint: GET /api/v2/analyze/{ticker}"}, "properties": {"repobilityId": "60a54fe6e06daf92", "scanner": "scanner-primary", "fingerprint": "dd65955e7b43b87f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18a2f16e14cdea9a", "level": "note", "message": {"text": "Unused endpoint: GET /api/v2/analyze/{ticker}/public"}, "properties": {"repobilityId": "bd5a6a00879d9ff6", "scanner": "scanner-primary", "fingerprint": "18a2f16e14cdea9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efed2e81cb756621", "level": "note", "message": {"text": "Unused endpoint: GET /api/signal-feed"}, "properties": {"repobilityId": "40c81fc21bd687f1", "scanner": "scanner-primary", "fingerprint": "efed2e81cb756621", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f9bd19299f3f83a8", "level": "note", "message": {"text": "Unused endpoint: POST /api/signal-feed/refresh"}, "properties": {"repobilityId": "df616292abbe6015", "scanner": "scanner-primary", "fingerprint": "f9bd19299f3f83a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa76f4d732e6409c", "level": "note", "message": {"text": "Unused endpoint: POST /api/cache/clear"}, "properties": {"repobilityId": "0df333bb78a55896", "scanner": "scanner-primary", "fingerprint": "fa76f4d732e6409c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9caf24a87d25e815", "level": "note", "message": {"text": "Unused endpoint: POST /api/signal-feed/alerts"}, "properties": {"repobilityId": "7888e529a04fbe9d", "scanner": "scanner-primary", "fingerprint": "9caf24a87d25e815", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5cce8a2a0f605214", "level": "note", "message": {"text": "Unused endpoint: POST /api/day-trade"}, "properties": {"repobilityId": "91d927161e8f65d7", "scanner": "scanner-primary", "fingerprint": "5cce8a2a0f605214", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7bf38d5e4f13dc17", "level": "note", "message": {"text": "Unused endpoint: POST /api/swing-trade"}, "properties": {"repobilityId": "ce62089121c2136d", "scanner": "scanner-primary", "fingerprint": "7bf38d5e4f13dc17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37915a79c4177022", "level": "note", "message": {"text": "Unused endpoint: POST /api/trades/enter"}, "properties": {"repobilityId": "ca8a12bf646d31b7", "scanner": "scanner-primary", "fingerprint": "37915a79c4177022", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f65774462900fbe0", "level": "note", "message": {"text": "Unused endpoint: GET /api/trades/active"}, "properties": {"repobilityId": "f1ab6a9d9dbba2eb", "scanner": "scanner-primary", "fingerprint": "f65774462900fbe0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bdb3096acbe6aa4", "level": "note", "message": {"text": "Unused endpoint: GET /api/trades/{trade_id}/decision"}, "properties": {"repobilityId": "05523ff4ba21a071", "scanner": "scanner-primary", "fingerprint": "1bdb3096acbe6aa4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}