{"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-b8653d13aff6be27", "name": "Possibly dead Python function: run_command", "shortDescription": {"text": "Possibly dead Python function: run_command"}, "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-c86a88e40eb39a46", "name": "Possibly dead Python function: build_source_freshness_decay_timeline", "shortDescription": {"text": "Possibly dead Python function: build_source_freshness_decay_timeline"}, "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-24bc7675c544cadc", "name": "Possibly dead Python function: calculate_from_snapshot", "shortDescription": {"text": "Possibly dead Python function: calculate_from_snapshot"}, "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-76e6833595f95dc4", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-171850f9bfde3f12", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-d7bdac7d4bc42863", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AssetGrid.tsx:372", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AssetGrid.tsx:372"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b20bf1d631f00ace", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/SystemHealthPanel.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/SystemHealthPanel.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d674c9ef108b5c4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionCenter.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionCenter.tsx:141"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e71b6252e76f4cd4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalPanelShell.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalPanelShell.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7be34ff8c8bc0182", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/TechnicalPanel.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/TechnicalPanel.tsx:85"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0e7b7f8f47f90a5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalLaunchLayer.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalLaunchLayer.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0c72b14844d8cc8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31da7491bb4c826d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendarPanelShell.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendarPanelShell.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7be33a47b42e4041", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a27b8d8dde9b272", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentCommandCenter.tsx:1100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentCommandCenter.tsx:1100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c27d82f1a7727b3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalRaceLayer.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalRaceLayer.tsx:242"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3ef13242a2b08b0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/MacroRiskFilterStrip.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/MacroRiskFilterStrip.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9664acbf18f69500", "name": "Icon-only button without accessible name \u2014 frontend/components/PaperTradingTicker.tsx:1200", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/components/PaperTradingTicker.tsx:1200"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad28f60f85fc4bac", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/PaperTradingTicker.tsx:960", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/PaperTradingTicker.tsx:960"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eacf9efd39da79b3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/LearningPanel.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/LearningPanel.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-afff3bcaea19e071", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendar3DLayer.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendar3DLayer.tsx:281"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bd98457a9eb3826", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentHolographicLayer.tsx:468", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentHolographicLayer.tsx:468"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e39219fd868d9e59", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentMainPanel.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentMainPanel.tsx:334"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec15b1143acdce2f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/NewsMapRadarLayer.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/NewsMapRadarLayer.tsx:257"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b467dfc9775ecc6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentBriefPanel.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentBriefPanel.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae59ef9f3116bae6", "name": "Stray `console.log` in TS/JS \u2014 frontend/lib/__tests__/formatPrice.verify.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/lib/__tests__/formatPrice.verify.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-714c31ca9f474ae6", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "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-52675ccd88d7038e", "name": "Very large file: frontend/components/AgentCommandCenter.tsx (1205 lines)", "shortDescription": {"text": "Very large file: frontend/components/AgentCommandCenter.tsx (1205 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-bda2bf2711c31f5b", "name": "Very large file: frontend/components/PaperTradingTicker.tsx (2438 lines)", "shortDescription": {"text": "Very large file: frontend/components/PaperTradingTicker.tsx (2438 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-79745beb6b9e6ce5", "name": "Very large file: frontend/components/AgentHolographicLayer.tsx (1316 lines)", "shortDescription": {"text": "Very large file: frontend/components/AgentHolographicLayer.tsx (1316 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-9517ba56adb5caec", "name": "Very large file: backend/tests/test_snapshot_replay_api.py (5236 lines)", "shortDescription": {"text": "Very large file: backend/tests/test_snapshot_replay_api.py (5236 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-f88584d5bd58d771", "name": "Very large file: backend/tests/test_snapshot_replay_service.py (8435 lines)", "shortDescription": {"text": "Very large file: backend/tests/test_snapshot_replay_service.py (8435 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-38376557eae79df2", "name": "Very large file: backend/app/api/snapshot_replay_routes_source_quality.py (1283 lines)", "shortDescription": {"text": "Very large file: backend/app/api/snapshot_replay_routes_source_quality.py (1283 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-16a53ef929569268", "name": "Very large file: backend/app/api/snapshot_replay_source_serializers_registry.py (1266 lines)", "shortDescription": {"text": "Very large file: backend/app/api/snapshot_replay_source_serializers_registry.py (1266 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-0cc8b28dce7175b7", "name": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_counts_severity.py (1220 lines)", "shortDescription": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_counts_severity.py (1220 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-c6710d7a45069bad", "name": "Very large file: backend/app/services/paper_trading_service.py (3099 lines)", "shortDescription": {"text": "Very large file: backend/app/services/paper_trading_service.py (3099 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-fa55d3747088fda0", "name": "Very large file: backend/app/services/regime_report_service.py (2348 lines)", "shortDescription": {"text": "Very large file: backend/app/services/regime_report_service.py (2348 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-456e6ee5b437067f", "name": "Very large file: backend/app/services/snapshot_replay_source_registry_verification.py (1279 lines)", "shortDescription": {"text": "Very large file: backend/app/services/snapshot_replay_source_registry_verification.py (1279 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-c1435a9fdf150dad", "name": "Very large file: backend/app/services/snapshot_replay_source_quality_drift_summary.py (1175 lines)", "shortDescription": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_drift_summary.py (1175 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-8cee1452a75d8f96", "name": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_order.py (1038 lines)", "shortDescription": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_order.py (1038 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 19 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 58 placeholder/mock markers across 21 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-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a2457d1d06d3b56", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/AssetGrid.tsx:323", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/AssetGrid.tsx:323"}, "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-6adfc57950a9e274", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:223", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:223"}, "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-29f9fa72e2de4b5c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:224", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:224"}, "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-b51002d49644748d", "name": "Legacy-named symbol `ai_trade_opinion_v1` in frontend/components/AgentCommandCenter.tsx:83", "shortDescription": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in frontend/components/AgentCommandCenter.tsx:83"}, "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-2b730f05fcf488c1", "name": "Commented-code block (5 lines) in frontend/components/ActionSignalRaceLayer.tsx:182", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/components/ActionSignalRaceLayer.tsx:182"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee78c7171c6abdc1", "name": "Legacy-named symbol `auto_plan_backup` in frontend/components/PaperTradingTicker.tsx:76", "shortDescription": {"text": "Legacy-named symbol `auto_plan_backup` in frontend/components/PaperTradingTicker.tsx:76"}, "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-c2fa5ee5e9153ad8", "name": "Commented-code block (7 lines) in frontend/components/PaperTradingTicker.tsx:937", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/components/PaperTradingTicker.tsx:937"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67a0c9c845947597", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/PaperTradingTicker.tsx:326", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/PaperTradingTicker.tsx:326"}, "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-37e6a6929bc13e42", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:8"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-184443d06a3d5498", "name": "Legacy-named symbol `feature_registry_v1` in tests/test_phase1_config.py:13", "shortDescription": {"text": "Legacy-named symbol `feature_registry_v1` in tests/test_phase1_config.py:13"}, "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-0a9efccdfcaec2f6", "name": "Legacy-named symbol `source_registry_v1` in tests/test_source_registry.py:21", "shortDescription": {"text": "Legacy-named symbol `source_registry_v1` in tests/test_source_registry.py:21"}, "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-677e3101f30535d3", "name": "Legacy-named symbol `test_report_surfaces_stale_source_diagnostics_when_observations_are_old` in tests/test_phase1_repor", "shortDescription": {"text": "Legacy-named symbol `test_report_surfaces_stale_source_diagnostics_when_observations_are_old` in tests/test_phase1_report_audit.py:77"}, "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-ffb32357732c241c", "name": "Legacy-named symbol `existing_backup` in tests/test_verify_and_snapshot.py:123", "shortDescription": {"text": "Legacy-named symbol `existing_backup` in tests/test_verify_and_snapshot.py:123"}, "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-709d83ae49712ac0", "name": "Legacy-named symbol `create_clean_backup` in scripts/verify_and_snapshot.py:216", "shortDescription": {"text": "Legacy-named symbol `create_clean_backup` in scripts/verify_and_snapshot.py:216"}, "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-6887ddd4b47219fd", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_and_snapshot.py:54", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_and_snapshot.py:54"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-987fb7af8dfd4f03", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/update_event_calendar.py:389", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/update_event_calendar.py:389"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12db5b753ac616c4", "name": "Legacy-named symbol `source_registry_v1` in registry/source_registry.py:51", "shortDescription": {"text": "Legacy-named symbol `source_registry_v1` in registry/source_registry.py:51"}, "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-2ae713d9fc830131", "name": "Legacy-named symbol `feature_registry_v1` in reports/generator.py:45", "shortDescription": {"text": "Legacy-named symbol `feature_registry_v1` in reports/generator.py:45"}, "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-c243ff46b5d7ec2d", "name": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/tests/test_agent_thesis_sanity.py:21", "shortDescription": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/tests/test_agent_thesis_sanity.py:21"}, "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-d063b5c47cd72ac9", "name": "Legacy-named symbol `position_recheck_v1` in backend/tests/test_position_recheck.py:376", "shortDescription": {"text": "Legacy-named symbol `position_recheck_v1` in backend/tests/test_position_recheck.py:376"}, "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-45ccbe1d5dab3fa3", "name": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_learning_candidate.py:588", "shortDescription": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_learning_candidate.py:588"}, "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-b970a4ae73241444", "name": "Commented-code block (8 lines) in backend/tests/test_learning_candidate.py:429", "shortDescription": {"text": "Commented-code block (8 lines) in backend/tests/test_learning_candidate.py:429"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df3c4de1cb4d33d8", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_source_observation_service.py:72", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_source_observation_service.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-7361a3f3f45af63c", "name": "Commented-code block (5 lines) in backend/tests/test_paper_risk_sizing.py:273", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/test_paper_risk_sizing.py:273"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cbc93c7a5ea69103", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_stooq_ingestion.py:183", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_stooq_ingestion.py:183"}, "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-6dc462d607065f80", "name": "Legacy-named symbol `closes_old` in backend/tests/test_sr_quality_service.py:97", "shortDescription": {"text": "Legacy-named symbol `closes_old` in backend/tests/test_sr_quality_service.py:97"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58ba979041d2cf33", "name": "Legacy-named symbol `mistake_memory_v1` in backend/tests/test_weekly_calibration.py:41", "shortDescription": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/tests/test_weekly_calibration.py:41"}, "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-43df01204cd4f6e7", "name": "Legacy-named symbol `safe_old` in backend/tests/test_agent_thesis_context.py:107", "shortDescription": {"text": "Legacy-named symbol `safe_old` in backend/tests/test_agent_thesis_context.py:107"}, "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-fe6a53bc161383a6", "name": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_mistake_memory.py:127", "shortDescription": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_mistake_memory.py:127"}, "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-d0c55846675246d3", "name": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_agent_hourly_thesis_service.py:48", "shortDescription": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_agent_hourly_thesis_service.py:48"}, "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-dd7e2b31d7bc2341", "name": "Legacy-named symbol `test_manual_sl_tp_saves_auto_plan_backup` in backend/tests/test_position_management.py:272", "shortDescription": {"text": "Legacy-named symbol `test_manual_sl_tp_saves_auto_plan_backup` in backend/tests/test_position_management.py:272"}, "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-8e9a1a7c0e29c47c", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_api.py:81", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_api.py:81"}, "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-524860d875477b4b", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_provider_ingestion_service.py:75", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_provider_ingestion_service.py:75"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6ba5bae9c5e5bf4", "name": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_learning_summary.py:54", "shortDescription": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_learning_summary.py:54"}, "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-987807f4cd43604f", "name": "Legacy-named symbol `auto_tune_overrides_v1` in backend/tests/test_auto_tune_override_reader.py:50", "shortDescription": {"text": "Legacy-named symbol `auto_tune_overrides_v1` in backend/tests/test_auto_tune_override_reader.py:50"}, "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-d797d032e1302e87", "name": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_hourly_snapshots_api.py:112", "shortDescription": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_hourly_snapshots_api.py:112"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89e90685d542d1a2", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_ceo_report_api.py:62", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_ceo_report_api.py:62"}, "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-c1aea952152f0296", "name": "Commented-code block (5 lines) in backend/tests/test_ceo_report_api.py:18", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/test_ceo_report_api.py:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75edf50b4f43de85", "name": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_auto_tune.py:59", "shortDescription": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_auto_tune.py:59"}, "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-4358c3921bc5f6a7", "name": "Legacy-named symbol `test_schema_version_is_hourly_snapshot_v1` in backend/tests/test_hourly_snapshot_store.py:178", "shortDescription": {"text": "Legacy-named symbol `test_schema_version_is_hourly_snapshot_v1` in backend/tests/test_hourly_snapshot_store.py:178"}, "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-0a8f486c734f75de", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_service.py:113", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_service.py:113"}, "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-c1aac60ad0633e9d", "name": "Commented-code block (5 lines) in backend/app/api/ai_report.py:225", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/ai_report.py:225"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8ce877a967b1c8c", "name": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/api/hourly_snapshots.py:34", "shortDescription": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/api/hourly_snapshots.py:34"}, "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-993d3699469d9671", "name": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/api/capital_rotation_visual.py:48", "shortDescription": {"text": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/api/capital_rotation_visual.py:48"}, "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-c148c1e606c801b1", "name": "Legacy-named symbol `source_registry_v1` in backend/app/dashboard/gradio_dashboard.py:401", "shortDescription": {"text": "Legacy-named symbol `source_registry_v1` in backend/app/dashboard/gradio_dashboard.py:401"}, "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-d727bd81575fe963", "name": "Stub function `add` (body is just `pass`/`return`) \u2014 backend/app/dashboard/gradio_dashboard.py:422", "shortDescription": {"text": "Stub function `add` (body is just `pass`/`return`) \u2014 backend/app/dashboard/gradio_dashboard.py:422"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b279230fb841e79", "name": "Commented-code block (8 lines) in backend/app/providers/technical_provider.py:99", "shortDescription": {"text": "Commented-code block (8 lines) in backend/app/providers/technical_provider.py:99"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cae64725b3139d63", "name": "Legacy-named symbol `source_registry_v1` in backend/app/providers/stooq_adapter.py:144", "shortDescription": {"text": "Legacy-named symbol `source_registry_v1` in backend/app/providers/stooq_adapter.py:144"}, "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-fa6f906412fdbd88", "name": "Legacy-named symbol `auto_backup` in backend/app/services/position_management_service.py:561", "shortDescription": {"text": "Legacy-named symbol `auto_backup` in backend/app/services/position_management_service.py:561"}, "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-e99e4c1dbb5da551", "name": "Legacy-named symbol `position_recheck_v1` in backend/app/services/position_recheck_service.py:33", "shortDescription": {"text": "Legacy-named symbol `position_recheck_v1` in backend/app/services/position_recheck_service.py:33"}, "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-637b5139c71794da", "name": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/services/capital_rotation_visual_adapter.py:18", "shortDescription": {"text": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/services/capital_rotation_visual_adapter.py:18"}, "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-9af0e6441273d898", "name": "Legacy-named symbol `learning_candidate_v1` in backend/app/services/learning_candidate_service.py:5", "shortDescription": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/app/services/learning_candidate_service.py: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-f4962123327421a5", "name": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/services/agent_hourly_thesis_service.py:28", "shortDescription": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/services/agent_hourly_thesis_service.py:28"}, "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-bb457d53e4bb1fcf", "name": "Commented-code block (6 lines) in backend/app/services/ai_analyst_service.py:75", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/services/ai_analyst_service.py:75"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1241ac9d697820f", "name": "Legacy-named symbol `auto_plan_backup` in backend/app/services/paper_trading_service.py:392", "shortDescription": {"text": "Legacy-named symbol `auto_plan_backup` in backend/app/services/paper_trading_service.py:392"}, "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-68d726e04b125cf4", "name": "Commented-code block (7 lines) in backend/app/services/paper_trading_service.py:37", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/services/paper_trading_service.py:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-858bfdff194aba96", "name": "Legacy-named symbol `breaking_news_visual_v1` in backend/app/services/breaking_news_visual_adapter.py:14", "shortDescription": {"text": "Legacy-named symbol `breaking_news_visual_v1` in backend/app/services/breaking_news_visual_adapter.py:14"}, "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-749c49a45efab1ff", "name": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/services/ai_trade_opinion_service.py:14", "shortDescription": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/services/ai_trade_opinion_service.py:14"}, "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-f2e48b540ade8085", "name": "Legacy-named symbol `mistake_memory_v1` in backend/app/services/mistake_memory_service.py:41", "shortDescription": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/app/services/mistake_memory_service.py:41"}, "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-83997c6d4c771265", "name": "Legacy-named symbol `weekly_calibration_v1` in backend/app/services/weekly_calibration_service.py:46", "shortDescription": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/app/services/weekly_calibration_service.py:46"}, "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-48ab37400bd837bc", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/source_observation_service.py:77", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/source_observation_service.py:77"}, "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-7d3cf9994fb69352", "name": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/snapshot_replay_source_common.py:151", "shortDescription": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/snapshot_replay_source_common.py:151"}, "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-e7f82795c9bb3c8f", "name": "Legacy-named symbol `learning_candidate_v1` in backend/app/storage/learning_candidate_store.py:31", "shortDescription": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/app/storage/learning_candidate_store.py:31"}, "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-a38054b2f6ed66b4", "name": "Legacy-named symbol `mistake_memory_v1` in backend/app/storage/mistake_memory_store.py:34", "shortDescription": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/app/storage/mistake_memory_store.py:34"}, "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-494c7523d4722b65", "name": "Legacy-named symbol `scheduler_run_v1` in backend/app/storage/scheduler_run_store.py:30", "shortDescription": {"text": "Legacy-named symbol `scheduler_run_v1` in backend/app/storage/scheduler_run_store.py:30"}, "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-ae4803d11029631e", "name": "Legacy-named symbol `auto_tune_adjustment_v1` in backend/app/storage/auto_tune_store.py:41", "shortDescription": {"text": "Legacy-named symbol `auto_tune_adjustment_v1` in backend/app/storage/auto_tune_store.py:41"}, "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-dbda4fcc3a387871", "name": "Legacy-named symbol `weekly_calibration_v1` in backend/app/storage/weekly_calibration_store.py:29", "shortDescription": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/app/storage/weekly_calibration_store.py:29"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62701d4183632fa4", "name": "Legacy-named symbol `position_recheck_v1` in backend/app/storage/position_recheck_store.py:29", "shortDescription": {"text": "Legacy-named symbol `position_recheck_v1` in backend/app/storage/position_recheck_store.py:29"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5165718e77adf4d6", "name": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/storage/ai_trade_opinion_store.py:26", "shortDescription": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/storage/ai_trade_opinion_store.py:26"}, "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-5fa7ecac8d2dea0b", "name": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/storage/agent_thesis_store.py:29", "shortDescription": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/storage/agent_thesis_store.py:29"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3219f59753398bb9", "name": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/storage/hourly_snapshot_store.py:24", "shortDescription": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/storage/hourly_snapshot_store.py:24"}, "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-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/app/market_state/risk_gate_view.py:to_dict, backend/app/market_state/risk_gate_view.py:to_dict, backend/app/market_state/risk_gate_view.py:to_dict\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-a1df580af9537a61", "name": "Near-duplicate function bodies in 65 places", "shortDescription": {"text": "Near-duplicate function bodies in 65 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/api/snapshot_replay_routes_source_quality.py:snapshot_backtest_source_gap_recurrence_leaderboard, backend/app/api/snapshot_replay_routes_source_quality.py:snapshot_backtest_raw_payload_reference_completeness, backend/app/api/snapshot_replay_routes_source_quality.py:snapshot_backtest_source_record_completeness, backend/app/api/snapshot_replay_routes_source_quality.py:snapshot_backtest_source_decision_usage_consistency\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/api/agent_stream.py:gen, backend/app/api/agent_stream.py:gen\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-de4cf2e402ffc319", "name": "Near-duplicate function bodies in 59 places", "shortDescription": {"text": "Near-duplicate function bodies in 59 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/services/snapshot_replay_source_diagnostics.py:build_source_freshness_decay_timeline, backend/app/services/snapshot_replay_source_diagnostics.py:build_fallback_usage_recurrence, backend/app/services/snapshot_replay_source_diagnostics.py:build_raw_payload_reference_completeness, backend/app/services/snapshot_replay_source_diagnostics.py:build_source_observation_cadence_drift\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-58216ffb0c1bcf31", "name": "FastAPI POST `submit_ai_report_job` without auth dependency \u2014 backend/app/api/ai_report.py:312", "shortDescription": {"text": "FastAPI POST `submit_ai_report_job` without auth dependency \u2014 backend/app/api/ai_report.py:312"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4547f3f76f5800b5", "name": "FastAPI POST `post_owner_feedback` without auth dependency \u2014 backend/app/api/learning.py:61", "shortDescription": {"text": "FastAPI POST `post_owner_feedback` without auth dependency \u2014 backend/app/api/learning.py:61"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-636d45668117e711", "name": "FastAPI POST `post_rebalance_propose` without auth dependency \u2014 backend/app/api/learning.py:89", "shortDescription": {"text": "FastAPI POST `post_rebalance_propose` without auth dependency \u2014 backend/app/api/learning.py:89"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ad77cf99b93fdec", "name": "FastAPI POST `post_rebalance_approve` without auth dependency \u2014 backend/app/api/learning.py:108", "shortDescription": {"text": "FastAPI POST `post_rebalance_approve` without auth dependency \u2014 backend/app/api/learning.py:108"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-934fd306d8ebf5e0", "name": "FastAPI POST `invoke_tool` without auth dependency \u2014 backend/app/api/agent_tools.py:34", "shortDescription": {"text": "FastAPI POST `invoke_tool` without auth dependency \u2014 backend/app/api/agent_tools.py:34"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-503713ff22c5df8e", "name": "FastAPI POST `run_ensemble` without auth dependency \u2014 backend/app/api/agent_ensemble.py:150", "shortDescription": {"text": "FastAPI POST `run_ensemble` without auth dependency \u2014 backend/app/api/agent_ensemble.py:150"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-918b845f7f89f2e8", "name": "FastAPI POST `submit_ensemble_job` without auth dependency \u2014 backend/app/api/agent_ensemble.py:162", "shortDescription": {"text": "FastAPI POST `submit_ensemble_job` without auth dependency \u2014 backend/app/api/agent_ensemble.py:162"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-731377f9a068b9f8", "name": "FastAPI POST `critique_payload` without auth dependency \u2014 backend/app/api/agent_critique.py:157", "shortDescription": {"text": "FastAPI POST `critique_payload` without auth dependency \u2014 backend/app/api/agent_critique.py:157"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a68b62ed75fcd13", "name": "FastAPI POST `remember` without auth dependency \u2014 backend/app/api/agent_memory.py:59", "shortDescription": {"text": "FastAPI POST `remember` without auth dependency \u2014 backend/app/api/agent_memory.py:59"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-534d03d776f47f85", "name": "FastAPI POST `forget` without auth dependency \u2014 backend/app/api/agent_memory.py:76", "shortDescription": {"text": "FastAPI POST `forget` without auth dependency \u2014 backend/app/api/agent_memory.py:76"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c8a7c539e6f7bf28", "name": "FastAPI POST `market_strategist_chat` without auth dependency \u2014 backend/app/api/market_strategist.py:45", "shortDescription": {"text": "FastAPI POST `market_strategist_chat` without auth dependency \u2014 backend/app/api/market_strategist.py:45"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e98abea4133479b", "name": "FastAPI POST `chat` without auth dependency \u2014 backend/app/api/chat.py:42", "shortDescription": {"text": "FastAPI POST `chat` without auth dependency \u2014 backend/app/api/chat.py:42"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c79591ee865bf058", "name": "FastAPI POST `run_eval` without auth dependency \u2014 backend/app/api/agent_eval.py:28", "shortDescription": {"text": "FastAPI POST `run_eval` without auth dependency \u2014 backend/app/api/agent_eval.py:28"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-665a4021ada46c00", "name": "Dangling fetch: GET /api/backend/agent/chart/${signal.asset_code}?timeframes=1h,4h,1d (frontend/components/AssetGrid.tsx", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/chart/${signal.asset_code}?timeframes=1h,4h,1d (frontend/components/AssetGrid.tsx:323)"}, "fullDescription": {"text": "`frontend/components/AssetGrid.tsx:323` calls `GET /api/backend/agent/chart/${signal.asset_code}?timeframes=1h,4h,1d` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/chart/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd8c661524ae616a", "name": "Dangling fetch: GET /api/backend/system-health/summary (frontend/components/SystemHealthPanel.tsx:160)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/system-health/summary (frontend/components/SystemHealthPanel.tsx:160)"}, "fullDescription": {"text": "`frontend/components/SystemHealthPanel.tsx:160` calls `GET /api/backend/system-health/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/system-health/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a19b12b33861f57b", "name": "Dangling fetch: GET /api/backend/breaking-news/visual (frontend/components/BreakingNewsRadarLayer.tsx:223)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/breaking-news/visual (frontend/components/BreakingNewsRadarLayer.tsx:223)"}, "fullDescription": {"text": "`frontend/components/BreakingNewsRadarLayer.tsx:223` calls `GET /api/backend/breaking-news/visual` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/breaking-news/visual`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15cae85d48316c6a", "name": "Dangling fetch: GET /api/backend/capital-rotation/visual (frontend/components/CapitalFlowAnimatedLayer.tsx:224)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/capital-rotation/visual (frontend/components/CapitalFlowAnimatedLayer.tsx:224)"}, "fullDescription": {"text": "`frontend/components/CapitalFlowAnimatedLayer.tsx:224` calls `GET /api/backend/capital-rotation/visual` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/capital-rotation/visual`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e885044216556e2", "name": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentCommandCenter.tsx:347)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentCommandCenter.tsx:347)"}, "fullDescription": {"text": "`frontend/components/AgentCommandCenter.tsx:347` calls `GET /api/backend/agent/banner` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/banner`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6690fe9a59d076ef", "name": "Dangling fetch: GET /api/backend/agent/trade-opinion (frontend/components/AgentCommandCenter.tsx:363)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/trade-opinion (frontend/components/AgentCommandCenter.tsx:363)"}, "fullDescription": {"text": "`frontend/components/AgentCommandCenter.tsx:363` calls `GET /api/backend/agent/trade-opinion` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/trade-opinion`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e470a80b9ab54bc", "name": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentCommandCenter.tsx:380)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentCommandCenter.tsx:380)"}, "fullDescription": {"text": "`frontend/components/AgentCommandCenter.tsx:380` calls `GET /api/backend/agent/insight` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/insight`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b8ac0d75ba41f99", "name": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentCommandCenter.tsx:381)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentCommandCenter.tsx:381)"}, "fullDescription": {"text": "`frontend/components/AgentCommandCenter.tsx:381` calls `GET /api/backend/trading/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3a0a99cfdd0620b", "name": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:326)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:326)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:326` calls `GET /api/backend/trading/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-326f2546803612d1", "name": "Dangling fetch: GET /api/backend/chart-patterns (frontend/components/PaperTradingTicker.tsx:390)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/chart-patterns (frontend/components/PaperTradingTicker.tsx:390)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:390` calls `GET /api/backend/chart-patterns` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/chart-patterns`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d60312a6774f2190", "name": "Dangling fetch: GET /api/backend/alerts/recent?limit=20 (frontend/components/PaperTradingTicker.tsx:400)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/alerts/recent?limit=20 (frontend/components/PaperTradingTicker.tsx:400)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:400` calls `GET /api/backend/alerts/recent?limit=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/alerts/recent`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ef1f1ca15d81433f", "name": "Dangling fetch: GET /api/backend/alerts/recent?limit=1 (frontend/components/PaperTradingTicker.tsx:422)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/alerts/recent?limit=1 (frontend/components/PaperTradingTicker.tsx:422)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:422` calls `GET /api/backend/alerts/recent?limit=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/alerts/recent`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8388818a48c5c849", "name": "Dangling fetch: POST /api/backend/trading/close/${pair} (frontend/components/PaperTradingTicker.tsx:460)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/close/${pair} (frontend/components/PaperTradingTicker.tsx:460)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:460` calls `POST /api/backend/trading/close/${pair}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/close/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68ba6894b6139166", "name": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:461)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:461)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:461` calls `GET /api/backend/trading/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96c8a679bd1a0b5c", "name": "Dangling fetch: POST /api/backend/trading/state/reset (frontend/components/PaperTradingTicker.tsx:501)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/state/reset (frontend/components/PaperTradingTicker.tsx:501)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:501` calls `POST /api/backend/trading/state/reset` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state/reset`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97fe4503a5731b59", "name": "Dangling fetch: POST /api/backend/trading/state/repair (frontend/components/PaperTradingTicker.tsx:520)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/state/repair (frontend/components/PaperTradingTicker.tsx:520)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:520` calls `POST /api/backend/trading/state/repair` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state/repair`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fabfbe8142938fc1", "name": "Dangling fetch: POST /api/backend/trading/pending/${pair}/reject (frontend/components/PaperTradingTicker.tsx:560)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/pending/${pair}/reject (frontend/components/PaperTradingTicker.tsx:560)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:560` calls `POST /api/backend/trading/pending/${pair}/reject` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/pending/<p>/reject`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d14c7a63bbc8dbb", "name": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/open (frontend/components/PaperTradingTicker.tsx:572)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/open (frontend/components/PaperTradingTicker.tsx:572)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:572` calls `POST /api/backend/trading/manual-ready/${pair}/open` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/manual-ready/<p>/open`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc424a13af6f0ac2", "name": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/dismiss (frontend/components/PaperTradingTicker.tsx:584)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/dismiss (frontend/components/PaperTradingTicker.tsx:584)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:584` calls `POST /api/backend/trading/manual-ready/${pair}/dismiss` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/manual-ready/<p>/dismiss`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1489111eeed7cb91", "name": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:761)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:761)"}, "fullDescription": {"text": "`frontend/components/PaperTradingTicker.tsx:761` calls `GET /api/backend/trading/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e61c975af0a4342", "name": "Dangling fetch: GET /api/backend/learning/summary (frontend/components/LearningPanel.tsx:385)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/learning/summary (frontend/components/LearningPanel.tsx:385)"}, "fullDescription": {"text": "`frontend/components/LearningPanel.tsx:385` calls `GET /api/backend/learning/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/learning/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-709e62d1f4411e74", "name": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentMainPanel.tsx:166)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentMainPanel.tsx:166)"}, "fullDescription": {"text": "`frontend/components/AgentMainPanel.tsx:166` calls `GET /api/backend/trading/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84ca705553dba790", "name": "Dangling fetch: POST /api/backend/trading/signal-chain/${asset}/cancel (frontend/components/AgentMainPanel.tsx:211)", "shortDescription": {"text": "Dangling fetch: POST /api/backend/trading/signal-chain/${asset}/cancel (frontend/components/AgentMainPanel.tsx:211)"}, "fullDescription": {"text": "`frontend/components/AgentMainPanel.tsx:211` calls `POST /api/backend/trading/signal-chain/${asset}/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/trading/signal-chain/<p>/cancel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c69233d03165e8e", "name": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentMainPanel.tsx:237)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentMainPanel.tsx:237)"}, "fullDescription": {"text": "`frontend/components/AgentMainPanel.tsx:237` calls `GET /api/backend/agent/banner` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/banner`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66c5eea975c8cb32", "name": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentInsightBar.tsx:131)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentInsightBar.tsx:131)"}, "fullDescription": {"text": "`frontend/components/AgentInsightBar.tsx:131` calls `GET /api/backend/agent/banner` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/banner`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7635578f9e5e1c4d", "name": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentInsightBar.tsx:153)", "shortDescription": {"text": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentInsightBar.tsx:153)"}, "fullDescription": {"text": "`frontend/components/AgentInsightBar.tsx:153` calls `GET /api/backend/agent/insight` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backend/agent/insight`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-959e83c0a87139d8", "name": "Unused endpoint: GET /current", "shortDescription": {"text": "Unused endpoint: GET /current"}, "fullDescription": {"text": "`backend/app/api/ai_report.py` declares `GET /current` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b73face5b06aa67", "name": "Unused endpoint: POST /jobs", "shortDescription": {"text": "Unused endpoint: POST /jobs"}, "fullDescription": {"text": "`backend/app/api/ai_report.py` declares `POST /jobs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee53a8b03729481e", "name": "Unused endpoint: GET /jobs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /jobs/{job_id}"}, "fullDescription": {"text": "`backend/app/api/ai_report.py` declares `GET /jobs/{job_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1008c575819b3d37", "name": "Unused endpoint: GET /jobs", "shortDescription": {"text": "Unused endpoint: GET /jobs"}, "fullDescription": {"text": "`backend/app/api/ai_report.py` declares `GET /jobs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e6c416fbd2d631c", "name": "Unused endpoint: GET /backtest/source-gap-recurrence-leaderboard", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-gap-recurrence-leaderboard"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-gap-recurrence-leaderboard` 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-9f374fc9687912be", "name": "Unused endpoint: GET /backtest/raw-payload-reference-completeness", "shortDescription": {"text": "Unused endpoint: GET /backtest/raw-payload-reference-completeness"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/raw-payload-reference-completeness` 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-e31b122d9354442f", "name": "Unused endpoint: GET /backtest/source-record-completeness", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-record-completeness"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-record-completeness` 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-4c8462cc6957a47b", "name": "Unused endpoint: GET /backtest/source-decision-usage-consistency", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-decision-usage-consistency"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-decision-usage-consistency` 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-f428ff34df996881", "name": "Unused endpoint: GET /backtest/source-observation-summary-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-observation-summary-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-observation-summary-drift` 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-34fda13b54178b5f", "name": "Unused endpoint: GET /backtest/source-observation-record-summary-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-observation-record-summary-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-observation-record-summary-reconciliation` 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-92f785338b6aa84c", "name": "Unused endpoint: GET /backtest/source-observation-confidence-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-observation-confidence-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-observation-confidence-drift` 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-66f3c3715717a95f", "name": "Unused endpoint: GET /backtest/verified-source-coverage-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/verified-source-coverage-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/verified-source-coverage-reconciliation` 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-41d724acb60b3915", "name": "Unused endpoint: GET /backtest/source-diagnostics-stale-asset-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-stale-asset-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-stale-asset-count-reconciliation` 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-20d173adcb38dff2", "name": "Unused endpoint: GET /backtest/source-diagnostics-average-coverage-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-average-coverage-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-average-coverage-drift` 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-a34b717317c576f0", "name": "Unused endpoint: GET /backtest/source-diagnostics-minimum-coverage-floor-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-minimum-coverage-floor-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-minimum-coverage-floor-reconciliation` 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-af66b50d57305772", "name": "Unused endpoint: GET /backtest/source-diagnostics-ready-feature-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-ready-feature-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-ready-feature-drift` 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-262861169b9f6459", "name": "Unused endpoint: GET /backtest/source-diagnostics-stale-feature-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-stale-feature-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-stale-feature-drift` 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-39a52dd0b521fa4a", "name": "Unused endpoint: GET /backtest/source-diagnostics-critical-feature-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-critical-feature-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-critical-feature-drift` 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-fee379e06c16bc55", "name": "Unused endpoint: GET /backtest/source-diagnostics-high-severity-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-high-severity-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-high-severity-drift` 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-84a3273e086a270d", "name": "Unused endpoint: GET /backtest/source-diagnostics-warning-feature-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-warning-feature-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-warning-feature-drift` 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-b1bd2beea5d337c8", "name": "Unused endpoint: GET /backtest/source-diagnostics-info-feature-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-info-feature-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-info-feature-drift` 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-ccf3ca9076c5f8fb", "name": "Unused endpoint: GET /backtest/source-diagnostics-zero-rank-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-zero-rank-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-zero-rank-drift` 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-311406dbd2a603de", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-label-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-label-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-label-drift` 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-03fd894e843ef0b8", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-rank-drift` 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-dac6176e421ac52a", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-density-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-density-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-rank-density-drift` 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-e77ae231c97947fe", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-spread-drift", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-spread-drift"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-rank-spread-drift` 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-72f432a75989976e", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-feature-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-feature-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-feature-count-reconciliation` 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-8a024a7bca3375d2", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-warning-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-warning-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-warning-count-reconciliation` 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-f5b0c4c4adffe1a8", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-info-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-info-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-info-count-reconciliation` 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-be1c3e478776e4a1", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-non-actionable-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-non-actionable-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-non-actionable-count-reconciliation` 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-311b920aa9786111", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-label-consistency-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-label-consistency-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-rank-label-consistency-reconciliation` 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-9b4d5da2508603c8", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-order-continuity-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-order-continuity-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-rank-order-continuity-reconciliation` 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-5fb4da2d523db7a2", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-continuity-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-continuity-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-rank-gap-continuity-reconciliation` 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-115308f76082a90c", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-magnitude-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-magnitude-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-rank-gap-magnitude-reconciliation` 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-4f876d7d256bf55d", "name": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-critical-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-critical-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-severity-ranking-critical-count-reconciliation` 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-f78d960d6d273465", "name": "Unused endpoint: GET /backtest/source-diagnostics-missing-source-feature-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-missing-source-feature-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-missing-source-feature-count-reconciliation` 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-08dc4d54fe5e2881", "name": "Unused endpoint: GET /backtest/source-diagnostics-missing-asset-count-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /backtest/source-diagnostics-missing-asset-count-reconciliation"}, "fullDescription": {"text": "`backend/app/api/snapshot_replay_routes_source_quality.py` declares `GET /backtest/source-diagnostics-missing-asset-count-reconciliation` 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-f6405cd2fa068c18", "name": "Unused endpoint: GET /insight", "shortDescription": {"text": "Unused endpoint: GET /insight"}, "fullDescription": {"text": "`backend/app/api/agent_insight.py` declares `GET /insight` 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/app/api/chart_patterns.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-a39f39434b763271", "name": "Unused endpoint: GET /{pair}", "shortDescription": {"text": "Unused endpoint: GET /{pair}"}, "fullDescription": {"text": "`backend/app/api/chart_patterns.py` declares `GET /{pair}` 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-797c2b0fb55397fe", "name": "Unused endpoint: POST /owner-feedback", "shortDescription": {"text": "Unused endpoint: POST /owner-feedback"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `POST /owner-feedback` 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-afa158f54bc1300b", "name": "Unused endpoint: GET /owner-feedback/recent", "shortDescription": {"text": "Unused endpoint: GET /owner-feedback/recent"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `GET /owner-feedback/recent` 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-7f00ca5f362e03f2", "name": "Unused endpoint: GET /daily-report", "shortDescription": {"text": "Unused endpoint: GET /daily-report"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `GET /daily-report` 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-ba482286c8870ae4", "name": "Unused endpoint: POST /rebalance/propose", "shortDescription": {"text": "Unused endpoint: POST /rebalance/propose"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `POST /rebalance/propose` 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-0e699966442dc65d", "name": "Unused endpoint: POST /rebalance/approve", "shortDescription": {"text": "Unused endpoint: POST /rebalance/approve"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `POST /rebalance/approve` 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-2ce176bde310fde8", "name": "Unused endpoint: GET /rebalance/proposals", "shortDescription": {"text": "Unused endpoint: GET /rebalance/proposals"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `GET /rebalance/proposals` 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-468b2e4f505cb1be", "name": "Unused endpoint: GET /active-weights", "shortDescription": {"text": "Unused endpoint: GET /active-weights"}, "fullDescription": {"text": "`backend/app/api/learning.py` declares `GET /active-weights` 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-d486ee9ba0cacb59", "name": "Unused endpoint: GET /anthropic", "shortDescription": {"text": "Unused endpoint: GET /anthropic"}, "fullDescription": {"text": "`backend/app/api/agent_tools.py` declares `GET /anthropic` 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-a2d152fcf608bf63", "name": "Unused endpoint: POST /invoke", "shortDescription": {"text": "Unused endpoint: POST /invoke"}, "fullDescription": {"text": "`backend/app/api/agent_tools.py` declares `POST /invoke` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/app/api/system_health.py` declares `GET /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}}]}}, "automationDetails": {"id": "repobility/21774"}, "properties": {"repository": "twonezerotwo-hue/e-yay-codex", "repoUrl": "https://github.com/twonezerotwo-hue/e-yay-codex", "branch": "main"}, "results": [{"ruleId": "scanner-b8653d13aff6be27", "level": "note", "message": {"text": "Possibly dead Python function: run_command"}, "properties": {"repobilityId": "a3ea986bd8aa82b4", "scanner": "scanner-primary", "fingerprint": "b8653d13aff6be27", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify_and_snapshot.py:53"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c86a88e40eb39a46", "level": "note", "message": {"text": "Possibly dead Python function: build_source_freshness_decay_timeline"}, "properties": {"repobilityId": "33b092cb9d5e8279", "scanner": "scanner-primary", "fingerprint": "c86a88e40eb39a46", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/snapshot_replay_source_diagnostics.py:84"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-24bc7675c544cadc", "level": "note", "message": {"text": "Possibly dead Python function: calculate_from_snapshot"}, "properties": {"repobilityId": "84ac869c6980c416", "scanner": "scanner-primary", "fingerprint": "24bc7675c544cadc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/data_quality_service.py:83"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-76e6833595f95dc4", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "76e6833595f95dc4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/20260518_0001_create_audit_logs.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-171850f9bfde3f12", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "171850f9bfde3f12", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/20260519_0002_create_market_snapshots.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7bdac7d4bc42863", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AssetGrid.tsx:372"}, "properties": {"repobilityId": "2c50bf4ae77fc3ce", "scanner": "scanner-primary", "fingerprint": "d7bdac7d4bc42863", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b20bf1d631f00ace", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/SystemHealthPanel.tsx:84"}, "properties": {"repobilityId": "9148f454a0f7fd39", "scanner": "scanner-primary", "fingerprint": "b20bf1d631f00ace", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d674c9ef108b5c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionCenter.tsx:141"}, "properties": {"repobilityId": "135f0bd16fda3afc", "scanner": "scanner-primary", "fingerprint": "6d674c9ef108b5c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e71b6252e76f4cd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalPanelShell.tsx:44"}, "properties": {"repobilityId": "f84a2d115379ac0c", "scanner": "scanner-primary", "fingerprint": "e71b6252e76f4cd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7be34ff8c8bc0182", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/TechnicalPanel.tsx:85"}, "properties": {"repobilityId": "bb3e5f8785d2c86f", "scanner": "scanner-primary", "fingerprint": "7be34ff8c8bc0182", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0e7b7f8f47f90a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalLaunchLayer.tsx:361"}, "properties": {"repobilityId": "bf60f6485ad114e6", "scanner": "scanner-primary", "fingerprint": "d0e7b7f8f47f90a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0c72b14844d8cc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:113"}, "properties": {"repobilityId": "c36beed1a1045351", "scanner": "scanner-primary", "fingerprint": "e0c72b14844d8cc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31da7491bb4c826d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendarPanelShell.tsx:44"}, "properties": {"repobilityId": "06564f64ee96d3b3", "scanner": "scanner-primary", "fingerprint": "31da7491bb4c826d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7be33a47b42e4041", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:129"}, "properties": {"repobilityId": "eb1ad904eac9cad1", "scanner": "scanner-primary", "fingerprint": "7be33a47b42e4041", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a27b8d8dde9b272", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentCommandCenter.tsx:1100"}, "properties": {"repobilityId": "9d4be189ca0358b4", "scanner": "scanner-primary", "fingerprint": "6a27b8d8dde9b272", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c27d82f1a7727b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ActionSignalRaceLayer.tsx:242"}, "properties": {"repobilityId": "fcba6e422a48eea4", "scanner": "scanner-primary", "fingerprint": "7c27d82f1a7727b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3ef13242a2b08b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/MacroRiskFilterStrip.tsx:101"}, "properties": {"repobilityId": "ebde08ff32b708ef", "scanner": "scanner-primary", "fingerprint": "d3ef13242a2b08b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9664acbf18f69500", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/components/PaperTradingTicker.tsx:1200"}, "properties": {"repobilityId": "3840bb29fed16a2e", "scanner": "scanner-primary", "fingerprint": "9664acbf18f69500", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ad28f60f85fc4bac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/PaperTradingTicker.tsx:960"}, "properties": {"repobilityId": "f22321897a543132", "scanner": "scanner-primary", "fingerprint": "ad28f60f85fc4bac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eacf9efd39da79b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/LearningPanel.tsx:101"}, "properties": {"repobilityId": "5d750c17b28150d5", "scanner": "scanner-primary", "fingerprint": "eacf9efd39da79b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afff3bcaea19e071", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/EventCalendar3DLayer.tsx:281"}, "properties": {"repobilityId": "d5c834a15491f07d", "scanner": "scanner-primary", "fingerprint": "afff3bcaea19e071", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bd98457a9eb3826", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentHolographicLayer.tsx:468"}, "properties": {"repobilityId": "8d36e8741b3b78d4", "scanner": "scanner-primary", "fingerprint": "0bd98457a9eb3826", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e39219fd868d9e59", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentMainPanel.tsx:334"}, "properties": {"repobilityId": "d300b1bd127e2af9", "scanner": "scanner-primary", "fingerprint": "e39219fd868d9e59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec15b1143acdce2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/NewsMapRadarLayer.tsx:257"}, "properties": {"repobilityId": "c542d8322e0fc304", "scanner": "scanner-primary", "fingerprint": "ec15b1143acdce2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b467dfc9775ecc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/AgentBriefPanel.tsx:130"}, "properties": {"repobilityId": "2e15002da5967414", "scanner": "scanner-primary", "fingerprint": "7b467dfc9775ecc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae59ef9f3116bae6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/lib/__tests__/formatPrice.verify.ts:12"}, "properties": {"repobilityId": "bd9a75c7b0c5e6bf", "scanner": "scanner-primary", "fingerprint": "ae59ef9f3116bae6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-714c31ca9f474ae6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "f614a1e41f331b37", "scanner": "scanner-primary", "fingerprint": "714c31ca9f474ae6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "04f57d208548fcef", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-52675ccd88d7038e", "level": "note", "message": {"text": "Very large file: frontend/components/AgentCommandCenter.tsx (1205 lines)"}, "properties": {"repobilityId": "020cf16649564584", "scanner": "scanner-primary", "fingerprint": "52675ccd88d7038e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bda2bf2711c31f5b", "level": "note", "message": {"text": "Very large file: frontend/components/PaperTradingTicker.tsx (2438 lines)"}, "properties": {"repobilityId": "a51cdc9930f8925c", "scanner": "scanner-primary", "fingerprint": "bda2bf2711c31f5b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-79745beb6b9e6ce5", "level": "note", "message": {"text": "Very large file: frontend/components/AgentHolographicLayer.tsx (1316 lines)"}, "properties": {"repobilityId": "ac1aec9b3f312b24", "scanner": "scanner-primary", "fingerprint": "79745beb6b9e6ce5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9517ba56adb5caec", "level": "note", "message": {"text": "Very large file: backend/tests/test_snapshot_replay_api.py (5236 lines)"}, "properties": {"repobilityId": "f9443833038a1538", "scanner": "scanner-primary", "fingerprint": "9517ba56adb5caec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f88584d5bd58d771", "level": "note", "message": {"text": "Very large file: backend/tests/test_snapshot_replay_service.py (8435 lines)"}, "properties": {"repobilityId": "75ffdb0e1fd97dbe", "scanner": "scanner-primary", "fingerprint": "f88584d5bd58d771", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-38376557eae79df2", "level": "note", "message": {"text": "Very large file: backend/app/api/snapshot_replay_routes_source_quality.py (1283 lines)"}, "properties": {"repobilityId": "c4a8d940dd2d8bec", "scanner": "scanner-primary", "fingerprint": "38376557eae79df2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16a53ef929569268", "level": "note", "message": {"text": "Very large file: backend/app/api/snapshot_replay_source_serializers_registry.py (1266 lines)"}, "properties": {"repobilityId": "e164213f2bdda6a8", "scanner": "scanner-primary", "fingerprint": "16a53ef929569268", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0cc8b28dce7175b7", "level": "note", "message": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_counts_severity.py (1220 lines)"}, "properties": {"repobilityId": "1a035b61990b2f91", "scanner": "scanner-primary", "fingerprint": "0cc8b28dce7175b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c6710d7a45069bad", "level": "note", "message": {"text": "Very large file: backend/app/services/paper_trading_service.py (3099 lines)"}, "properties": {"repobilityId": "0ed504572d48901d", "scanner": "scanner-primary", "fingerprint": "c6710d7a45069bad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fa55d3747088fda0", "level": "note", "message": {"text": "Very large file: backend/app/services/regime_report_service.py (2348 lines)"}, "properties": {"repobilityId": "11fde46cb0c1fb00", "scanner": "scanner-primary", "fingerprint": "fa55d3747088fda0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-456e6ee5b437067f", "level": "note", "message": {"text": "Very large file: backend/app/services/snapshot_replay_source_registry_verification.py (1279 lines)"}, "properties": {"repobilityId": "0fc8fe79efde4200", "scanner": "scanner-primary", "fingerprint": "456e6ee5b437067f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c1435a9fdf150dad", "level": "note", "message": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_drift_summary.py (1175 lines)"}, "properties": {"repobilityId": "30d94c53941a3d81", "scanner": "scanner-primary", "fingerprint": "c1435a9fdf150dad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8cee1452a75d8f96", "level": "note", "message": {"text": "Very large file: backend/app/services/snapshot_replay_source_quality_reconciliation_order.py (1038 lines)"}, "properties": {"repobilityId": "97bde497e2bf9f75", "scanner": "scanner-primary", "fingerprint": "8cee1452a75d8f96", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "696e2a3bea4113ff", "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": "621ce41cea049bf5", "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": "61997ec92ca2f61f", "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": "1108616228a0659c", "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": "30979abd1aa644ce", "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": "d4eff1b8291b3f9e", "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": "ece1311a10764ae4", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-3a2457d1d06d3b56", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/AssetGrid.tsx:323"}, "properties": {"repobilityId": "f4f01d5a5084ff57", "scanner": "scanner-primary", "fingerprint": "3a2457d1d06d3b56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6adfc57950a9e274", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/BreakingNewsRadarLayer.tsx:223"}, "properties": {"repobilityId": "ba772e5803ef60e7", "scanner": "scanner-primary", "fingerprint": "6adfc57950a9e274", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29f9fa72e2de4b5c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/CapitalFlowAnimatedLayer.tsx:224"}, "properties": {"repobilityId": "71cf074d5323bf05", "scanner": "scanner-primary", "fingerprint": "29f9fa72e2de4b5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b51002d49644748d", "level": "note", "message": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in frontend/components/AgentCommandCenter.tsx:83"}, "properties": {"repobilityId": "d3558217a5fefae4", "scanner": "scanner-primary", "fingerprint": "b51002d49644748d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2b730f05fcf488c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/components/ActionSignalRaceLayer.tsx:182"}, "properties": {"repobilityId": "0e8cb0e33bee6995", "scanner": "scanner-primary", "fingerprint": "2b730f05fcf488c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee78c7171c6abdc1", "level": "note", "message": {"text": "Legacy-named symbol `auto_plan_backup` in frontend/components/PaperTradingTicker.tsx:76"}, "properties": {"repobilityId": "e0d59df95ca018c2", "scanner": "scanner-primary", "fingerprint": "ee78c7171c6abdc1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c2fa5ee5e9153ad8", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/components/PaperTradingTicker.tsx:937"}, "properties": {"repobilityId": "904da0d1d71cce14", "scanner": "scanner-primary", "fingerprint": "c2fa5ee5e9153ad8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67a0c9c845947597", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/PaperTradingTicker.tsx:326"}, "properties": {"repobilityId": "8def7b0075f79573", "scanner": "scanner-primary", "fingerprint": "67a0c9c845947597", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37e6a6929bc13e42", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:8"}, "properties": {"repobilityId": "8451e00d8c9506da", "scanner": "scanner-primary", "fingerprint": "37e6a6929bc13e42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-184443d06a3d5498", "level": "note", "message": {"text": "Legacy-named symbol `feature_registry_v1` in tests/test_phase1_config.py:13"}, "properties": {"repobilityId": "0f72d80fcb60f44b", "scanner": "scanner-primary", "fingerprint": "184443d06a3d5498", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0a9efccdfcaec2f6", "level": "note", "message": {"text": "Legacy-named symbol `source_registry_v1` in tests/test_source_registry.py:21"}, "properties": {"repobilityId": "b0a25ff5f22d0f56", "scanner": "scanner-primary", "fingerprint": "0a9efccdfcaec2f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-677e3101f30535d3", "level": "note", "message": {"text": "Legacy-named symbol `test_report_surfaces_stale_source_diagnostics_when_observations_are_old` in tests/test_phase1_report_audit.py:77"}, "properties": {"repobilityId": "cb4640bda4c28ce7", "scanner": "scanner-primary", "fingerprint": "677e3101f30535d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ffb32357732c241c", "level": "note", "message": {"text": "Legacy-named symbol `existing_backup` in tests/test_verify_and_snapshot.py:123"}, "properties": {"repobilityId": "2143c178d03c6f98", "scanner": "scanner-primary", "fingerprint": "ffb32357732c241c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-709d83ae49712ac0", "level": "note", "message": {"text": "Legacy-named symbol `create_clean_backup` in scripts/verify_and_snapshot.py:216"}, "properties": {"repobilityId": "d53aa2b4c902edbc", "scanner": "scanner-primary", "fingerprint": "709d83ae49712ac0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6887ddd4b47219fd", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_and_snapshot.py:54"}, "properties": {"repobilityId": "8995daf81ceafb1a", "scanner": "scanner-primary", "fingerprint": "6887ddd4b47219fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-987fb7af8dfd4f03", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/update_event_calendar.py:389"}, "properties": {"repobilityId": "09ef57d925140a8e", "scanner": "scanner-primary", "fingerprint": "987fb7af8dfd4f03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12db5b753ac616c4", "level": "note", "message": {"text": "Legacy-named symbol `source_registry_v1` in registry/source_registry.py:51"}, "properties": {"repobilityId": "fd1080b84e72a51e", "scanner": "scanner-primary", "fingerprint": "12db5b753ac616c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2ae713d9fc830131", "level": "note", "message": {"text": "Legacy-named symbol `feature_registry_v1` in reports/generator.py:45"}, "properties": {"repobilityId": "9449d414ee2e7c89", "scanner": "scanner-primary", "fingerprint": "2ae713d9fc830131", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c243ff46b5d7ec2d", "level": "note", "message": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/tests/test_agent_thesis_sanity.py:21"}, "properties": {"repobilityId": "b253ab9c34cebe85", "scanner": "scanner-primary", "fingerprint": "c243ff46b5d7ec2d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d063b5c47cd72ac9", "level": "note", "message": {"text": "Legacy-named symbol `position_recheck_v1` in backend/tests/test_position_recheck.py:376"}, "properties": {"repobilityId": "02dcdd940acfef5c", "scanner": "scanner-primary", "fingerprint": "d063b5c47cd72ac9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-45ccbe1d5dab3fa3", "level": "note", "message": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_learning_candidate.py:588"}, "properties": {"repobilityId": "47c033799ea958b0", "scanner": "scanner-primary", "fingerprint": "45ccbe1d5dab3fa3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b970a4ae73241444", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/tests/test_learning_candidate.py:429"}, "properties": {"repobilityId": "ff5f6bbc1e9d434d", "scanner": "scanner-primary", "fingerprint": "b970a4ae73241444", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df3c4de1cb4d33d8", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_source_observation_service.py:72"}, "properties": {"repobilityId": "3208654f1a69fa0a", "scanner": "scanner-primary", "fingerprint": "df3c4de1cb4d33d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7361a3f3f45af63c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/test_paper_risk_sizing.py:273"}, "properties": {"repobilityId": "8ceb289d182c2d4b", "scanner": "scanner-primary", "fingerprint": "7361a3f3f45af63c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbc93c7a5ea69103", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_stooq_ingestion.py:183"}, "properties": {"repobilityId": "53749949056c6fe9", "scanner": "scanner-primary", "fingerprint": "cbc93c7a5ea69103", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6dc462d607065f80", "level": "note", "message": {"text": "Legacy-named symbol `closes_old` in backend/tests/test_sr_quality_service.py:97"}, "properties": {"repobilityId": "d12cde8a43cda9ab", "scanner": "scanner-primary", "fingerprint": "6dc462d607065f80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-58ba979041d2cf33", "level": "note", "message": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/tests/test_weekly_calibration.py:41"}, "properties": {"repobilityId": "fd041d3ad5decc13", "scanner": "scanner-primary", "fingerprint": "58ba979041d2cf33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-43df01204cd4f6e7", "level": "note", "message": {"text": "Legacy-named symbol `safe_old` in backend/tests/test_agent_thesis_context.py:107"}, "properties": {"repobilityId": "c8c86803dccd0ab5", "scanner": "scanner-primary", "fingerprint": "43df01204cd4f6e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe6a53bc161383a6", "level": "note", "message": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/tests/test_mistake_memory.py:127"}, "properties": {"repobilityId": "4dc8cdaacac089be", "scanner": "scanner-primary", "fingerprint": "fe6a53bc161383a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d0c55846675246d3", "level": "note", "message": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_agent_hourly_thesis_service.py:48"}, "properties": {"repobilityId": "0727531cef81c156", "scanner": "scanner-primary", "fingerprint": "d0c55846675246d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dd7e2b31d7bc2341", "level": "note", "message": {"text": "Legacy-named symbol `test_manual_sl_tp_saves_auto_plan_backup` in backend/tests/test_position_management.py:272"}, "properties": {"repobilityId": "480d7eb9582ee310", "scanner": "scanner-primary", "fingerprint": "dd7e2b31d7bc2341", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8e9a1a7c0e29c47c", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_api.py:81"}, "properties": {"repobilityId": "43affebd80d5265b", "scanner": "scanner-primary", "fingerprint": "8e9a1a7c0e29c47c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-524860d875477b4b", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_provider_ingestion_service.py:75"}, "properties": {"repobilityId": "db07f52931cbb7c7", "scanner": "scanner-primary", "fingerprint": "524860d875477b4b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b6ba5bae9c5e5bf4", "level": "note", "message": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_learning_summary.py:54"}, "properties": {"repobilityId": "baf1e12825a49d5e", "scanner": "scanner-primary", "fingerprint": "b6ba5bae9c5e5bf4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-987807f4cd43604f", "level": "note", "message": {"text": "Legacy-named symbol `auto_tune_overrides_v1` in backend/tests/test_auto_tune_override_reader.py:50"}, "properties": {"repobilityId": "3f336dd6b956c0e7", "scanner": "scanner-primary", "fingerprint": "987807f4cd43604f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d797d032e1302e87", "level": "note", "message": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/tests/test_hourly_snapshots_api.py:112"}, "properties": {"repobilityId": "ad46188de5acc879", "scanner": "scanner-primary", "fingerprint": "d797d032e1302e87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-89e90685d542d1a2", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_ceo_report_api.py:62"}, "properties": {"repobilityId": "333abc5205e83be1", "scanner": "scanner-primary", "fingerprint": "89e90685d542d1a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c1aea952152f0296", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/test_ceo_report_api.py:18"}, "properties": {"repobilityId": "74d3ffa394505f7a", "scanner": "scanner-primary", "fingerprint": "c1aea952152f0296", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75edf50b4f43de85", "level": "note", "message": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/tests/test_auto_tune.py:59"}, "properties": {"repobilityId": "81088a0ad80cb950", "scanner": "scanner-primary", "fingerprint": "75edf50b4f43de85", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4358c3921bc5f6a7", "level": "note", "message": {"text": "Legacy-named symbol `test_schema_version_is_hourly_snapshot_v1` in backend/tests/test_hourly_snapshot_store.py:178"}, "properties": {"repobilityId": "7530c725462b14e0", "scanner": "scanner-primary", "fingerprint": "4358c3921bc5f6a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0a8f486c734f75de", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/tests/test_snapshot_replay_service.py:113"}, "properties": {"repobilityId": "1f639d89639bbf76", "scanner": "scanner-primary", "fingerprint": "0a8f486c734f75de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c1aac60ad0633e9d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/ai_report.py:225"}, "properties": {"repobilityId": "54dbfe4c08609e96", "scanner": "scanner-primary", "fingerprint": "c1aac60ad0633e9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8ce877a967b1c8c", "level": "note", "message": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/api/hourly_snapshots.py:34"}, "properties": {"repobilityId": "0db12e4bf7619ec1", "scanner": "scanner-primary", "fingerprint": "d8ce877a967b1c8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-993d3699469d9671", "level": "note", "message": {"text": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/api/capital_rotation_visual.py:48"}, "properties": {"repobilityId": "3d7200a4a08d2fd5", "scanner": "scanner-primary", "fingerprint": "993d3699469d9671", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c148c1e606c801b1", "level": "note", "message": {"text": "Legacy-named symbol `source_registry_v1` in backend/app/dashboard/gradio_dashboard.py:401"}, "properties": {"repobilityId": "1285ba918a792149", "scanner": "scanner-primary", "fingerprint": "c148c1e606c801b1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d727bd81575fe963", "level": "note", "message": {"text": "Stub function `add` (body is just `pass`/`return`) \u2014 backend/app/dashboard/gradio_dashboard.py:422"}, "properties": {"repobilityId": "9fbfd3d75838706a", "scanner": "scanner-primary", "fingerprint": "d727bd81575fe963", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-7b279230fb841e79", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/app/providers/technical_provider.py:99"}, "properties": {"repobilityId": "95dce6795b1f866a", "scanner": "scanner-primary", "fingerprint": "7b279230fb841e79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cae64725b3139d63", "level": "note", "message": {"text": "Legacy-named symbol `source_registry_v1` in backend/app/providers/stooq_adapter.py:144"}, "properties": {"repobilityId": "fa04d820a0252531", "scanner": "scanner-primary", "fingerprint": "cae64725b3139d63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fa6f906412fdbd88", "level": "note", "message": {"text": "Legacy-named symbol `auto_backup` in backend/app/services/position_management_service.py:561"}, "properties": {"repobilityId": "72da1a249e58857f", "scanner": "scanner-primary", "fingerprint": "fa6f906412fdbd88", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e99e4c1dbb5da551", "level": "note", "message": {"text": "Legacy-named symbol `position_recheck_v1` in backend/app/services/position_recheck_service.py:33"}, "properties": {"repobilityId": "212a12d2e048b2d2", "scanner": "scanner-primary", "fingerprint": "e99e4c1dbb5da551", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-637b5139c71794da", "level": "note", "message": {"text": "Legacy-named symbol `capital_rotation_visual_v1` in backend/app/services/capital_rotation_visual_adapter.py:18"}, "properties": {"repobilityId": "6c24176dfa381058", "scanner": "scanner-primary", "fingerprint": "637b5139c71794da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9af0e6441273d898", "level": "note", "message": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/app/services/learning_candidate_service.py:5"}, "properties": {"repobilityId": "3cd77c9dee744650", "scanner": "scanner-primary", "fingerprint": "9af0e6441273d898", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f4962123327421a5", "level": "note", "message": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/services/agent_hourly_thesis_service.py:28"}, "properties": {"repobilityId": "a9f8f879b33e84e0", "scanner": "scanner-primary", "fingerprint": "f4962123327421a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bb457d53e4bb1fcf", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/services/ai_analyst_service.py:75"}, "properties": {"repobilityId": "c133956e51444083", "scanner": "scanner-primary", "fingerprint": "bb457d53e4bb1fcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1241ac9d697820f", "level": "note", "message": {"text": "Legacy-named symbol `auto_plan_backup` in backend/app/services/paper_trading_service.py:392"}, "properties": {"repobilityId": "143c457cb3e2d770", "scanner": "scanner-primary", "fingerprint": "c1241ac9d697820f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-68d726e04b125cf4", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/services/paper_trading_service.py:37"}, "properties": {"repobilityId": "d2ae8b97027e396e", "scanner": "scanner-primary", "fingerprint": "68d726e04b125cf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-858bfdff194aba96", "level": "note", "message": {"text": "Legacy-named symbol `breaking_news_visual_v1` in backend/app/services/breaking_news_visual_adapter.py:14"}, "properties": {"repobilityId": "85b827cd1099ea13", "scanner": "scanner-primary", "fingerprint": "858bfdff194aba96", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-749c49a45efab1ff", "level": "note", "message": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/services/ai_trade_opinion_service.py:14"}, "properties": {"repobilityId": "fa3a13ec0a203bc7", "scanner": "scanner-primary", "fingerprint": "749c49a45efab1ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f2e48b540ade8085", "level": "note", "message": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/app/services/mistake_memory_service.py:41"}, "properties": {"repobilityId": "858fe074193bb9f4", "scanner": "scanner-primary", "fingerprint": "f2e48b540ade8085", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-83997c6d4c771265", "level": "note", "message": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/app/services/weekly_calibration_service.py:46"}, "properties": {"repobilityId": "5586465ac1b3cb48", "scanner": "scanner-primary", "fingerprint": "83997c6d4c771265", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-48ab37400bd837bc", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/source_observation_service.py:77"}, "properties": {"repobilityId": "1f05a9d48306f588", "scanner": "scanner-primary", "fingerprint": "48ab37400bd837bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7d3cf9994fb69352", "level": "note", "message": {"text": "Legacy-named symbol `verified_provider_adapter_v1` in backend/app/services/snapshot_replay_source_common.py:151"}, "properties": {"repobilityId": "cdd9216bafaf8a2f", "scanner": "scanner-primary", "fingerprint": "7d3cf9994fb69352", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e7f82795c9bb3c8f", "level": "note", "message": {"text": "Legacy-named symbol `learning_candidate_v1` in backend/app/storage/learning_candidate_store.py:31"}, "properties": {"repobilityId": "10cbf644d0d9b8d9", "scanner": "scanner-primary", "fingerprint": "e7f82795c9bb3c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a38054b2f6ed66b4", "level": "note", "message": {"text": "Legacy-named symbol `mistake_memory_v1` in backend/app/storage/mistake_memory_store.py:34"}, "properties": {"repobilityId": "a7814c42f3853f83", "scanner": "scanner-primary", "fingerprint": "a38054b2f6ed66b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-494c7523d4722b65", "level": "note", "message": {"text": "Legacy-named symbol `scheduler_run_v1` in backend/app/storage/scheduler_run_store.py:30"}, "properties": {"repobilityId": "623f8d065ec207ce", "scanner": "scanner-primary", "fingerprint": "494c7523d4722b65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ae4803d11029631e", "level": "note", "message": {"text": "Legacy-named symbol `auto_tune_adjustment_v1` in backend/app/storage/auto_tune_store.py:41"}, "properties": {"repobilityId": "cdf7422aab98439f", "scanner": "scanner-primary", "fingerprint": "ae4803d11029631e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dbda4fcc3a387871", "level": "note", "message": {"text": "Legacy-named symbol `weekly_calibration_v1` in backend/app/storage/weekly_calibration_store.py:29"}, "properties": {"repobilityId": "7042ba9f420f212b", "scanner": "scanner-primary", "fingerprint": "dbda4fcc3a387871", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62701d4183632fa4", "level": "note", "message": {"text": "Legacy-named symbol `position_recheck_v1` in backend/app/storage/position_recheck_store.py:29"}, "properties": {"repobilityId": "6d873075bb41c41e", "scanner": "scanner-primary", "fingerprint": "62701d4183632fa4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5165718e77adf4d6", "level": "note", "message": {"text": "Legacy-named symbol `ai_trade_opinion_v1` in backend/app/storage/ai_trade_opinion_store.py:26"}, "properties": {"repobilityId": "2ff38c5264139870", "scanner": "scanner-primary", "fingerprint": "5165718e77adf4d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5fa7ecac8d2dea0b", "level": "note", "message": {"text": "Legacy-named symbol `agent_hourly_thesis_v1` in backend/app/storage/agent_thesis_store.py:29"}, "properties": {"repobilityId": "9b718f26c24f6ea8", "scanner": "scanner-primary", "fingerprint": "5fa7ecac8d2dea0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3219f59753398bb9", "level": "note", "message": {"text": "Legacy-named symbol `hourly_snapshot_v1` in backend/app/storage/hourly_snapshot_store.py:24"}, "properties": {"repobilityId": "095be2ef7b7c5ba1", "scanner": "scanner-primary", "fingerprint": "3219f59753398bb9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "8f0d48939b94e101", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a1df580af9537a61", "level": "note", "message": {"text": "Near-duplicate function bodies in 65 places"}, "properties": {"repobilityId": "8fe4721f82b6321d", "scanner": "scanner-primary", "fingerprint": "a1df580af9537a61", "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": "03d903112b6e90a3", "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": "ba3576ec218c825d", "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": "5e21b8c7ec7c5422", "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": "11eaaac121d92ea7", "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": "0694f01dc764baa3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-de4cf2e402ffc319", "level": "note", "message": {"text": "Near-duplicate function bodies in 59 places"}, "properties": {"repobilityId": "433e1388e5b1dedf", "scanner": "scanner-primary", "fingerprint": "de4cf2e402ffc319", "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": "82b422f4c1708b9a", "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": "1035f73f251710da", "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": "a4ee1f9c7e076eb9", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "afb1a8bf9af0ac45", "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": "44de086c65bd692d", "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": "833b200ddf2a692d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-58216ffb0c1bcf31", "level": "error", "message": {"text": "FastAPI POST `submit_ai_report_job` without auth dependency \u2014 backend/app/api/ai_report.py:312"}, "properties": {"repobilityId": "46c8d21d11e3b324", "scanner": "scanner-primary", "fingerprint": "58216ffb0c1bcf31", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/ai_report.py"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-4547f3f76f5800b5", "level": "error", "message": {"text": "FastAPI POST `post_owner_feedback` without auth dependency \u2014 backend/app/api/learning.py:61"}, "properties": {"repobilityId": "bd957b37d0d0e0ac", "scanner": "scanner-primary", "fingerprint": "4547f3f76f5800b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/learning.py"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-636d45668117e711", "level": "error", "message": {"text": "FastAPI POST `post_rebalance_propose` without auth dependency \u2014 backend/app/api/learning.py:89"}, "properties": {"repobilityId": "c4a74c2318d27e88", "scanner": "scanner-primary", "fingerprint": "636d45668117e711", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/learning.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-4ad77cf99b93fdec", "level": "error", "message": {"text": "FastAPI POST `post_rebalance_approve` without auth dependency \u2014 backend/app/api/learning.py:108"}, "properties": {"repobilityId": "828f85df5bdb9a6c", "scanner": "scanner-primary", "fingerprint": "4ad77cf99b93fdec", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/learning.py"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-934fd306d8ebf5e0", "level": "error", "message": {"text": "FastAPI POST `invoke_tool` without auth dependency \u2014 backend/app/api/agent_tools.py:34"}, "properties": {"repobilityId": "318cecef902025f6", "scanner": "scanner-primary", "fingerprint": "934fd306d8ebf5e0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_tools.py"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-503713ff22c5df8e", "level": "error", "message": {"text": "FastAPI POST `run_ensemble` without auth dependency \u2014 backend/app/api/agent_ensemble.py:150"}, "properties": {"repobilityId": "2f59a838a8a41e6e", "scanner": "scanner-primary", "fingerprint": "503713ff22c5df8e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_ensemble.py"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-918b845f7f89f2e8", "level": "error", "message": {"text": "FastAPI POST `submit_ensemble_job` without auth dependency \u2014 backend/app/api/agent_ensemble.py:162"}, "properties": {"repobilityId": "b86f68ef8c0eb59b", "scanner": "scanner-primary", "fingerprint": "918b845f7f89f2e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_ensemble.py"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-731377f9a068b9f8", "level": "error", "message": {"text": "FastAPI POST `critique_payload` without auth dependency \u2014 backend/app/api/agent_critique.py:157"}, "properties": {"repobilityId": "6866d91a2b65f84b", "scanner": "scanner-primary", "fingerprint": "731377f9a068b9f8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_critique.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-0a68b62ed75fcd13", "level": "error", "message": {"text": "FastAPI POST `remember` without auth dependency \u2014 backend/app/api/agent_memory.py:59"}, "properties": {"repobilityId": "df637298ef29899e", "scanner": "scanner-primary", "fingerprint": "0a68b62ed75fcd13", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_memory.py"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-534d03d776f47f85", "level": "error", "message": {"text": "FastAPI POST `forget` without auth dependency \u2014 backend/app/api/agent_memory.py:76"}, "properties": {"repobilityId": "ef4ad19e16e9c097", "scanner": "scanner-primary", "fingerprint": "534d03d776f47f85", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_memory.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-c8a7c539e6f7bf28", "level": "error", "message": {"text": "FastAPI POST `market_strategist_chat` without auth dependency \u2014 backend/app/api/market_strategist.py:45"}, "properties": {"repobilityId": "4691269638f01b05", "scanner": "scanner-primary", "fingerprint": "c8a7c539e6f7bf28", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/market_strategist.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-7e98abea4133479b", "level": "error", "message": {"text": "FastAPI POST `chat` without auth dependency \u2014 backend/app/api/chat.py:42"}, "properties": {"repobilityId": "854ecae97486d942", "scanner": "scanner-primary", "fingerprint": "7e98abea4133479b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/chat.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-c79591ee865bf058", "level": "error", "message": {"text": "FastAPI POST `run_eval` without auth dependency \u2014 backend/app/api/agent_eval.py:28"}, "properties": {"repobilityId": "1742a91ad2532b14", "scanner": "scanner-primary", "fingerprint": "c79591ee865bf058", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/agent_eval.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-665a4021ada46c00", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/chart/${signal.asset_code}?timeframes=1h,4h,1d (frontend/components/AssetGrid.tsx:323)"}, "properties": {"repobilityId": "f3ac60255e11b7ed", "scanner": "scanner-primary", "fingerprint": "665a4021ada46c00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd8c661524ae616a", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/system-health/summary (frontend/components/SystemHealthPanel.tsx:160)"}, "properties": {"repobilityId": "8680cceac142ae30", "scanner": "scanner-primary", "fingerprint": "fd8c661524ae616a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a19b12b33861f57b", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/breaking-news/visual (frontend/components/BreakingNewsRadarLayer.tsx:223)"}, "properties": {"repobilityId": "67313b5828d8676a", "scanner": "scanner-primary", "fingerprint": "a19b12b33861f57b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-15cae85d48316c6a", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/capital-rotation/visual (frontend/components/CapitalFlowAnimatedLayer.tsx:224)"}, "properties": {"repobilityId": "1a8a3680063ea9c4", "scanner": "scanner-primary", "fingerprint": "15cae85d48316c6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e885044216556e2", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentCommandCenter.tsx:347)"}, "properties": {"repobilityId": "5a9dacf6faccd994", "scanner": "scanner-primary", "fingerprint": "2e885044216556e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6690fe9a59d076ef", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/trade-opinion (frontend/components/AgentCommandCenter.tsx:363)"}, "properties": {"repobilityId": "b8ed033366595721", "scanner": "scanner-primary", "fingerprint": "6690fe9a59d076ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e470a80b9ab54bc", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentCommandCenter.tsx:380)"}, "properties": {"repobilityId": "69bff732ec7cf0a0", "scanner": "scanner-primary", "fingerprint": "9e470a80b9ab54bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b8ac0d75ba41f99", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentCommandCenter.tsx:381)"}, "properties": {"repobilityId": "fe2240e235ab8c72", "scanner": "scanner-primary", "fingerprint": "1b8ac0d75ba41f99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3a0a99cfdd0620b", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:326)"}, "properties": {"repobilityId": "74ef24021098083c", "scanner": "scanner-primary", "fingerprint": "e3a0a99cfdd0620b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-326f2546803612d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/chart-patterns (frontend/components/PaperTradingTicker.tsx:390)"}, "properties": {"repobilityId": "49d065f1e015fdfc", "scanner": "scanner-primary", "fingerprint": "326f2546803612d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d60312a6774f2190", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/alerts/recent?limit=20 (frontend/components/PaperTradingTicker.tsx:400)"}, "properties": {"repobilityId": "16d266a8d4a22883", "scanner": "scanner-primary", "fingerprint": "d60312a6774f2190", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef1f1ca15d81433f", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/alerts/recent?limit=1 (frontend/components/PaperTradingTicker.tsx:422)"}, "properties": {"repobilityId": "5b3003b5e87f44f9", "scanner": "scanner-primary", "fingerprint": "ef1f1ca15d81433f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8388818a48c5c849", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/close/${pair} (frontend/components/PaperTradingTicker.tsx:460)"}, "properties": {"repobilityId": "be82e82c6948c4ba", "scanner": "scanner-primary", "fingerprint": "8388818a48c5c849", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68ba6894b6139166", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:461)"}, "properties": {"repobilityId": "227b06610c228197", "scanner": "scanner-primary", "fingerprint": "68ba6894b6139166", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-96c8a679bd1a0b5c", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/state/reset (frontend/components/PaperTradingTicker.tsx:501)"}, "properties": {"repobilityId": "65c27f77f56cf7c0", "scanner": "scanner-primary", "fingerprint": "96c8a679bd1a0b5c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97fe4503a5731b59", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/state/repair (frontend/components/PaperTradingTicker.tsx:520)"}, "properties": {"repobilityId": "c9700da3aeb81f47", "scanner": "scanner-primary", "fingerprint": "97fe4503a5731b59", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fabfbe8142938fc1", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/pending/${pair}/reject (frontend/components/PaperTradingTicker.tsx:560)"}, "properties": {"repobilityId": "f5fa5733cd5aa340", "scanner": "scanner-primary", "fingerprint": "fabfbe8142938fc1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d14c7a63bbc8dbb", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/open (frontend/components/PaperTradingTicker.tsx:572)"}, "properties": {"repobilityId": "2b678da3a10624e3", "scanner": "scanner-primary", "fingerprint": "7d14c7a63bbc8dbb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc424a13af6f0ac2", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/manual-ready/${pair}/dismiss (frontend/components/PaperTradingTicker.tsx:584)"}, "properties": {"repobilityId": "b4731de426e052d0", "scanner": "scanner-primary", "fingerprint": "bc424a13af6f0ac2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1489111eeed7cb91", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/PaperTradingTicker.tsx:761)"}, "properties": {"repobilityId": "6351acf037e5a4d0", "scanner": "scanner-primary", "fingerprint": "1489111eeed7cb91", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e61c975af0a4342", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/learning/summary (frontend/components/LearningPanel.tsx:385)"}, "properties": {"repobilityId": "1eca8d9b2643cc05", "scanner": "scanner-primary", "fingerprint": "3e61c975af0a4342", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-709e62d1f4411e74", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/trading/state (frontend/components/AgentMainPanel.tsx:166)"}, "properties": {"repobilityId": "b27cb55ab5b6fb68", "scanner": "scanner-primary", "fingerprint": "709e62d1f4411e74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84ca705553dba790", "level": "error", "message": {"text": "Dangling fetch: POST /api/backend/trading/signal-chain/${asset}/cancel (frontend/components/AgentMainPanel.tsx:211)"}, "properties": {"repobilityId": "8e5a90c1cfb03763", "scanner": "scanner-primary", "fingerprint": "84ca705553dba790", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c69233d03165e8e", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentMainPanel.tsx:237)"}, "properties": {"repobilityId": "7d26cfd2842a737a", "scanner": "scanner-primary", "fingerprint": "6c69233d03165e8e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66c5eea975c8cb32", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/banner (frontend/components/AgentInsightBar.tsx:131)"}, "properties": {"repobilityId": "69a1e2cb153b483d", "scanner": "scanner-primary", "fingerprint": "66c5eea975c8cb32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7635578f9e5e1c4d", "level": "error", "message": {"text": "Dangling fetch: GET /api/backend/agent/insight (frontend/components/AgentInsightBar.tsx:153)"}, "properties": {"repobilityId": "136b6208b15629ab", "scanner": "scanner-primary", "fingerprint": "7635578f9e5e1c4d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-959e83c0a87139d8", "level": "note", "message": {"text": "Unused endpoint: GET /current"}, "properties": {"repobilityId": "4d005b5dfe3bf9a1", "scanner": "scanner-primary", "fingerprint": "959e83c0a87139d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b73face5b06aa67", "level": "note", "message": {"text": "Unused endpoint: POST /jobs"}, "properties": {"repobilityId": "7804682d99d97e04", "scanner": "scanner-primary", "fingerprint": "2b73face5b06aa67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee53a8b03729481e", "level": "note", "message": {"text": "Unused endpoint: GET /jobs/{job_id}"}, "properties": {"repobilityId": "300c960aa7bcee58", "scanner": "scanner-primary", "fingerprint": "ee53a8b03729481e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1008c575819b3d37", "level": "note", "message": {"text": "Unused endpoint: GET /jobs"}, "properties": {"repobilityId": "485d23599b2b11ec", "scanner": "scanner-primary", "fingerprint": "1008c575819b3d37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e6c416fbd2d631c", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-gap-recurrence-leaderboard"}, "properties": {"repobilityId": "a0b841f877b97935", "scanner": "scanner-primary", "fingerprint": "6e6c416fbd2d631c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f374fc9687912be", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/raw-payload-reference-completeness"}, "properties": {"repobilityId": "d6b7c7e8b0ab5a5b", "scanner": "scanner-primary", "fingerprint": "9f374fc9687912be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e31b122d9354442f", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-record-completeness"}, "properties": {"repobilityId": "63c30ae7994e9bb8", "scanner": "scanner-primary", "fingerprint": "e31b122d9354442f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c8462cc6957a47b", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-decision-usage-consistency"}, "properties": {"repobilityId": "ae30b1c8dccf6d03", "scanner": "scanner-primary", "fingerprint": "4c8462cc6957a47b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f428ff34df996881", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-observation-summary-drift"}, "properties": {"repobilityId": "b6259115f447567e", "scanner": "scanner-primary", "fingerprint": "f428ff34df996881", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34fda13b54178b5f", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-observation-record-summary-reconciliation"}, "properties": {"repobilityId": "1b7b758292d8dba0", "scanner": "scanner-primary", "fingerprint": "34fda13b54178b5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92f785338b6aa84c", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-observation-confidence-drift"}, "properties": {"repobilityId": "d181617d7a243d6a", "scanner": "scanner-primary", "fingerprint": "92f785338b6aa84c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66f3c3715717a95f", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/verified-source-coverage-reconciliation"}, "properties": {"repobilityId": "5c05064bb58fd079", "scanner": "scanner-primary", "fingerprint": "66f3c3715717a95f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41d724acb60b3915", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-stale-asset-count-reconciliation"}, "properties": {"repobilityId": "8b857d0e6d14bfa1", "scanner": "scanner-primary", "fingerprint": "41d724acb60b3915", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20d173adcb38dff2", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-average-coverage-drift"}, "properties": {"repobilityId": "6fbea8cf52cb1ad5", "scanner": "scanner-primary", "fingerprint": "20d173adcb38dff2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a34b717317c576f0", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-minimum-coverage-floor-reconciliation"}, "properties": {"repobilityId": "b3ad8fe7a8c592d3", "scanner": "scanner-primary", "fingerprint": "a34b717317c576f0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af66b50d57305772", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-ready-feature-drift"}, "properties": {"repobilityId": "ac30238e927fead3", "scanner": "scanner-primary", "fingerprint": "af66b50d57305772", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-262861169b9f6459", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-stale-feature-drift"}, "properties": {"repobilityId": "b67766fe67fb18de", "scanner": "scanner-primary", "fingerprint": "262861169b9f6459", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39a52dd0b521fa4a", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-critical-feature-drift"}, "properties": {"repobilityId": "c77daa7369b91646", "scanner": "scanner-primary", "fingerprint": "39a52dd0b521fa4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fee379e06c16bc55", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-high-severity-drift"}, "properties": {"repobilityId": "370496410b46d7f0", "scanner": "scanner-primary", "fingerprint": "fee379e06c16bc55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84a3273e086a270d", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-warning-feature-drift"}, "properties": {"repobilityId": "55a6e7f5766eb757", "scanner": "scanner-primary", "fingerprint": "84a3273e086a270d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b1bd2beea5d337c8", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-info-feature-drift"}, "properties": {"repobilityId": "2d1748c9b354f98c", "scanner": "scanner-primary", "fingerprint": "b1bd2beea5d337c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccf3ca9076c5f8fb", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-zero-rank-drift"}, "properties": {"repobilityId": "9262727aa466d90c", "scanner": "scanner-primary", "fingerprint": "ccf3ca9076c5f8fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-311406dbd2a603de", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-label-drift"}, "properties": {"repobilityId": "aefb6965ec747b36", "scanner": "scanner-primary", "fingerprint": "311406dbd2a603de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03fd894e843ef0b8", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-drift"}, "properties": {"repobilityId": "b4a420f156d50c22", "scanner": "scanner-primary", "fingerprint": "03fd894e843ef0b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dac6176e421ac52a", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-density-drift"}, "properties": {"repobilityId": "26876ecdc2fb4f1e", "scanner": "scanner-primary", "fingerprint": "dac6176e421ac52a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e77ae231c97947fe", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-rank-spread-drift"}, "properties": {"repobilityId": "d61f2aabad4bd6b6", "scanner": "scanner-primary", "fingerprint": "e77ae231c97947fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72f432a75989976e", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-feature-count-reconciliation"}, "properties": {"repobilityId": "9766f9d0ef9174d5", "scanner": "scanner-primary", "fingerprint": "72f432a75989976e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a024a7bca3375d2", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-warning-count-reconciliation"}, "properties": {"repobilityId": "871628f35e33eaea", "scanner": "scanner-primary", "fingerprint": "8a024a7bca3375d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5b0c4c4adffe1a8", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-info-count-reconciliation"}, "properties": {"repobilityId": "0382028dbecb6529", "scanner": "scanner-primary", "fingerprint": "f5b0c4c4adffe1a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be1c3e478776e4a1", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-non-actionable-count-reconciliation"}, "properties": {"repobilityId": "0104c865a57508e1", "scanner": "scanner-primary", "fingerprint": "be1c3e478776e4a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-311b920aa9786111", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-label-consistency-reconciliation"}, "properties": {"repobilityId": "f8efffbbc870dd12", "scanner": "scanner-primary", "fingerprint": "311b920aa9786111", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b4d5da2508603c8", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-order-continuity-reconciliation"}, "properties": {"repobilityId": "93d6c3cc98c16dd0", "scanner": "scanner-primary", "fingerprint": "9b4d5da2508603c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fb4da2d523db7a2", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-continuity-reconciliation"}, "properties": {"repobilityId": "95fbf03c1b8ccd7e", "scanner": "scanner-primary", "fingerprint": "5fb4da2d523db7a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-115308f76082a90c", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-rank-gap-magnitude-reconciliation"}, "properties": {"repobilityId": "1fe63db575cac022", "scanner": "scanner-primary", "fingerprint": "115308f76082a90c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f876d7d256bf55d", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-severity-ranking-critical-count-reconciliation"}, "properties": {"repobilityId": "482eaf82bc1bd95e", "scanner": "scanner-primary", "fingerprint": "4f876d7d256bf55d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f78d960d6d273465", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-missing-source-feature-count-reconciliation"}, "properties": {"repobilityId": "5253cca52b77ca6c", "scanner": "scanner-primary", "fingerprint": "f78d960d6d273465", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08dc4d54fe5e2881", "level": "note", "message": {"text": "Unused endpoint: GET /backtest/source-diagnostics-missing-asset-count-reconciliation"}, "properties": {"repobilityId": "84542fedb304a7c9", "scanner": "scanner-primary", "fingerprint": "08dc4d54fe5e2881", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6405cd2fa068c18", "level": "note", "message": {"text": "Unused endpoint: GET /insight"}, "properties": {"repobilityId": "16d6a8c6eb46bbab", "scanner": "scanner-primary", "fingerprint": "f6405cd2fa068c18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "5e5c2bf598022a45", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a39f39434b763271", "level": "note", "message": {"text": "Unused endpoint: GET /{pair}"}, "properties": {"repobilityId": "293ba0a7ecea7cc0", "scanner": "scanner-primary", "fingerprint": "a39f39434b763271", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-797c2b0fb55397fe", "level": "note", "message": {"text": "Unused endpoint: POST /owner-feedback"}, "properties": {"repobilityId": "3539f966c96b0fbc", "scanner": "scanner-primary", "fingerprint": "797c2b0fb55397fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afa158f54bc1300b", "level": "note", "message": {"text": "Unused endpoint: GET /owner-feedback/recent"}, "properties": {"repobilityId": "4526b4b027d297f1", "scanner": "scanner-primary", "fingerprint": "afa158f54bc1300b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f00ca5f362e03f2", "level": "note", "message": {"text": "Unused endpoint: GET /daily-report"}, "properties": {"repobilityId": "93bf3277c33db3b9", "scanner": "scanner-primary", "fingerprint": "7f00ca5f362e03f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba482286c8870ae4", "level": "note", "message": {"text": "Unused endpoint: POST /rebalance/propose"}, "properties": {"repobilityId": "b9a8e3910adec638", "scanner": "scanner-primary", "fingerprint": "ba482286c8870ae4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e699966442dc65d", "level": "note", "message": {"text": "Unused endpoint: POST /rebalance/approve"}, "properties": {"repobilityId": "eaf6a2f0e605771e", "scanner": "scanner-primary", "fingerprint": "0e699966442dc65d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ce176bde310fde8", "level": "note", "message": {"text": "Unused endpoint: GET /rebalance/proposals"}, "properties": {"repobilityId": "0a2913b86dd805ea", "scanner": "scanner-primary", "fingerprint": "2ce176bde310fde8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-468b2e4f505cb1be", "level": "note", "message": {"text": "Unused endpoint: GET /active-weights"}, "properties": {"repobilityId": "90ed1db620630f09", "scanner": "scanner-primary", "fingerprint": "468b2e4f505cb1be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d486ee9ba0cacb59", "level": "note", "message": {"text": "Unused endpoint: GET /anthropic"}, "properties": {"repobilityId": "51656daeade27679", "scanner": "scanner-primary", "fingerprint": "d486ee9ba0cacb59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2d152fcf608bf63", "level": "note", "message": {"text": "Unused endpoint: POST /invoke"}, "properties": {"repobilityId": "a3952f597b8b54dc", "scanner": "scanner-primary", "fingerprint": "a2d152fcf608bf63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "cf71b6ba01d6e9be", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}