{"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-323b033ccc0e7884", "name": "Possibly dead Python function: htf_strength_enforcement", "shortDescription": {"text": "Possibly dead Python function: htf_strength_enforcement"}, "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-32ab88f34a39decc", "name": "Possibly dead Python function: premium_zone_filter", "shortDescription": {"text": "Possibly dead Python function: premium_zone_filter"}, "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-92452f88c0e35b47", "name": "Possibly dead Python function: optimal_filter", "shortDescription": {"text": "Possibly dead Python function: optimal_filter"}, "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-d281b478eca6f4a2", "name": "Possibly dead Python function: directional_filters", "shortDescription": {"text": "Possibly dead Python function: directional_filters"}, "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-31fd34de42e409af", "name": "Possibly dead Python function: call_position_closer_endpoint", "shortDescription": {"text": "Possibly dead Python function: call_position_closer_endpoint"}, "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-112eed72f8c62f55", "name": "Possibly dead Python function: weekly_scrape_task", "shortDescription": {"text": "Possibly dead Python function: weekly_scrape_task"}, "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-113b3a2e08e70330", "name": "Possibly dead Python function: daily_cleanup_task", "shortDescription": {"text": "Possibly dead Python function: daily_cleanup_task"}, "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-e85e2e5e9cd126ec", "name": "Possibly dead Python function: health_check_task", "shortDescription": {"text": "Possibly dead Python function: health_check_task"}, "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-51d63046e13ef4d4", "name": "Possibly dead Python function: drop_tables", "shortDescription": {"text": "Possibly dead Python function: drop_tables"}, "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-63d415ae18ade578", "name": "Possibly dead Python function: classify_pnl", "shortDescription": {"text": "Possibly dead Python function: classify_pnl"}, "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-839f9f26e3d4e157", "name": "Possibly dead Python function: core_score", "shortDescription": {"text": "Possibly dead Python function: core_score"}, "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-68909909c9f130c1", "name": "Possibly dead Python function: swing_core", "shortDescription": {"text": "Possibly dead Python function: swing_core"}, "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-ad0c320a46f8a530", "name": "Possibly dead Python function: build_confluence_factors", "shortDescription": {"text": "Possibly dead Python function: build_confluence_factors"}, "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-a7f4f1c7a778cb43", "name": "Possibly dead Python function: run_single_scanner", "shortDescription": {"text": "Possibly dead Python function: run_single_scanner"}, "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-81a9af2fc01f8fba", "name": "Possibly dead Python function: update_signal_status", "shortDescription": {"text": "Possibly dead Python function: update_signal_status"}, "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-540e39fa50f807aa", "name": "Possibly dead Python function: expire_old_signals", "shortDescription": {"text": "Possibly dead Python function: expire_old_signals"}, "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-08e8fdf5a8857d6d", "name": "Possibly dead Python function: enrich_signals_with_news", "shortDescription": {"text": "Possibly dead Python function: enrich_signals_with_news"}, "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-148e6c9c2a98365a", "name": "Possibly dead Python function: enrich_single_signal_news", "shortDescription": {"text": "Possibly dead Python function: enrich_single_signal_news"}, "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-e9d34024780a98c6", "name": "Possibly dead Python function: add_filter", "shortDescription": {"text": "Possibly dead Python function: add_filter"}, "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-27bf268e045b6737", "name": "Possibly dead Python function: add_custom_rule", "shortDescription": {"text": "Possibly dead Python function: add_custom_rule"}, "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-2fc9049f243ee5dc", "name": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SaveModal.tsx:55", "shortDescription": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SaveModal.tsx:55"}, "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-191ff008ccad93ab", "name": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotDiffView.tsx:68", "shortDescription": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotDiffView.tsx:68"}, "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-e307c3cf4dc3aaa7", "name": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotPanel.tsx:116", "shortDescription": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotPanel.tsx:116"}, "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-f9a65384c1b24747", "name": "Icon-only button without accessible name \u2014 trading-ui/components/ops/ContainerLogsDrawer.tsx:58", "shortDescription": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/ops/ContainerLogsDrawer.tsx:58"}, "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-ce4a0a369f5ec6a0", "name": "Privileged port 23 in use", "shortDescription": {"text": "Privileged port 23 in use"}, "fullDescription": {"text": "Port 23 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c3d951d53d02de6", "name": "Privileged port 46 in use", "shortDescription": {"text": "Privileged port 46 in use"}, "fullDescription": {"text": "Port 46 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d8f622fa9f0e218", "name": "Dockerfile runs as root: fastapi-general/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: fastapi-general/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-98e723349e01e0b9", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-b06ab89eeb6ce673", "name": "Dockerfile runs as root: economic-calendar/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: economic-calendar/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-37df3b6952cdf35e", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-cd83d09236ecf4a8", "name": "Dockerfile runs as root: stock-scanner/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: stock-scanner/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-1313b3f6b3c9e9e3", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-468058dbb59c39a2", "name": "Dockerfile runs as root: worker/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: worker/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-282e0c07973c01d9", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-9ab6fb2b1b8d2e48", "name": "Dockerfile runs as root: nginx/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: nginx/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-12a739d8d937bc98", "name": "Docker base image uses a mutable or implicit tag: nginx:latest", "shortDescription": {"text": "Docker base image uses a mutable or implicit tag: nginx:latest"}, "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": "medium", "confidence": 1.0}}, {"id": "scanner-de3b6f130536ec01", "name": "Dockerfile runs as root: streamlit/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: streamlit/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-11d6dc2e2170a5f1", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-219ade7ad048e22a", "name": "Dockerfile runs as root: trading-ui/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: trading-ui/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-45936722748bb168", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-edde1f8d7e4a028a", "name": "Dockerfile runs as root: system-monitor/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: system-monitor/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-0d95d2184ad95add", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-8f0d0bf50ec9ed6c", "name": "Possible secret in prod-app/config.py", "shortDescription": {"text": "Possible secret in prod-app/config.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-40ba6bd1f45e79bc", "name": "Insecure pattern 'cors_wildcard' in economic-calendar/app/main.py:122", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in economic-calendar/app/main.py:122"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c070cadb7be512b", "name": "Possible secret in worker/app/range_fade_diag3.py", "shortDescription": {"text": "Possible secret in worker/app/range_fade_diag3.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9816d110105eb848", "name": "Possible secret in worker/app/fx_xsec_momentum_probe.py", "shortDescription": {"text": "Possible secret in worker/app/fx_xsec_momentum_probe.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-fb6c2cd323ec3ecd", "name": "Possible secret in worker/app/htf_edge_probe.py", "shortDescription": {"text": "Possible secret in worker/app/htf_edge_probe.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-016fca8168f31d79", "name": "Possible secret in worker/app/eurjpy_model_search.py", "shortDescription": {"text": "Possible secret in worker/app/eurjpy_model_search.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-280a5c103752f380", "name": "Possible secret in worker/app/range_fade_width_sweep.py", "shortDescription": {"text": "Possible secret in worker/app/range_fade_width_sweep.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7c079a0c0b1f91a9", "name": "Insecure pattern 'debug_true' in worker/app/old_data/OldScans/trade_scan copy.py:1116", "shortDescription": {"text": "Insecure pattern 'debug_true' in worker/app/old_data/OldScans/trade_scan copy.py:1116"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a668bdfe28d8394", "name": "Possible secret in worker/app/old_data/services/scanner_config.py", "shortDescription": {"text": "Possible secret in worker/app/old_data/services/scanner_config.py"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-a84a5bc06f7f6b2e", "name": "Possible secret in worker/app/forex_scanner/scripts/diag_range_fade_adx.py", "shortDescription": {"text": "Possible secret in worker/app/forex_scanner/scripts/diag_range_fade_adx.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-053faddafc6b9b68", "name": "Possible secret in worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py", "shortDescription": {"text": "Possible secret in worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-696de9364cce4883", "name": "Possible secret in worker/app/forex_scanner/scripts/verify_claude.py", "shortDescription": {"text": "Possible secret in worker/app/forex_scanner/scripts/verify_claude.py"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-76c23b6d86929c7f", "name": "Possible secret in worker/app/forex_scanner/scripts/analyze_pair_performance.py", "shortDescription": {"text": "Possible secret in worker/app/forex_scanner/scripts/analyze_pair_performance.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0ae4c7facc53b528", "name": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py", "shortDescription": {"text": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7746defe6a17c1f1", "name": "Possible secret in stream-app/config.py", "shortDescription": {"text": "Possible secret in stream-app/config.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b8129fa2c8010e59", "name": "Possible secret in streamlit/config.py", "shortDescription": {"text": "Possible secret in streamlit/config.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-5618cd85137980c4", "name": "Possible secret in dev-app/config.py", "shortDescription": {"text": "Possible secret in dev-app/config.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f27a7153bd6363ff", "name": "Possible secret in dev-app/dependencies.py", "shortDescription": {"text": "Possible secret in dev-app/dependencies.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-dfe7ebccab37d0ae", "name": "Possible secret in optimization/rag_data_preparation.py", "shortDescription": {"text": "Possible secret in optimization/rag_data_preparation.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-003d83638857dd1b", "name": "Insecure pattern 'cors_wildcard' in system-monitor/app/main.py:239", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in system-monitor/app/main.py:239"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3cf71bc2bdb9dd0", "name": "Very large file: stock-scanner/app/stock_scanner/scheduler.py (2095 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/scheduler.py (2095 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-4e3334d6900da2d5", "name": "Very large file: stock-scanner/app/stock_scanner/main.py (2274 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/main.py (2274 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-7acdd5dc7f6f25bb", "name": "Very large file: stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py (1209 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py (1209 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-8a516e61d478ee99", "name": "Very large file: stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py (1196 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py (1196 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-66c7cea451707a30", "name": "Very large file: stock-scanner/app/stock_scanner/scanners/watchlist_scanner.py (1309 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/scanners/watchlist_scanner.py (1309 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-500783aac3bfd050", "name": "Very large file: stock-scanner/app/stock_scanner/scanners/scanner_manager.py (1669 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/scanners/scanner_manager.py (1669 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-49014a7645dff9b4", "name": "Very large file: stock-scanner/app/stock_scanner/services/broker_trade_analyzer.py (1398 lines)", "shortDescription": {"text": "Very large file: stock-scanner/app/stock_scanner/services/broker_trade_analyzer.py (1398 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-5804f7fcfe273328", "name": "Very large file: worker/app/old_data/services/backtesting.py (1232 lines)", "shortDescription": {"text": "Very large file: worker/app/old_data/services/backtesting.py (1232 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-5b57988ce90cc878", "name": "Very large file: worker/app/forex_scanner/backtest_cli.py (2114 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/backtest_cli.py (2114 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-526166c7cf700380", "name": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_signal_detector.py (1377 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_signal_detector.py (1377 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-969b93e9f642f8ae", "name": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.py (2372 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.py (2372 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-16a2e85157ef1c3d", "name": "Very large file: worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py (1169 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py (1169 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-1f9af690bb3b7bcb", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ichimoku_strategy.py (2062 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ichimoku_strategy.py (2062 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-54132c477f156984", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py (1607 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py (1607 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-47b50d5abba8a656", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py (2817 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py (2817 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-62e1fe81336f44d4", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_strategy.py (1057 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_strategy.py (1057 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-2c82dd03093eb40e", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_double_confirmation_strategy.py (1289 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_double_confirmation_strategy.py (1289 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-e1a045e029be037c", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py (2683 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py (2683 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-7fa5c5625deee177", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py (2032 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py (2032 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-f2867526ee5d2298", "name": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/macd_strategy.py (1333 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/macd_strategy.py (1333 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-20797aad57321425", "name": "Very large file: worker/app/forex_scanner/configdata/strategies/config_smc_simple.py (1277 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/configdata/strategies/config_smc_simple.py (1277 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-e28241bd02052e7d", "name": "Very large file: worker/app/forex_scanner/alerts/claude_analyzer.py (1901 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/claude_analyzer.py (1901 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-931edc35dfe23111", "name": "Very large file: worker/app/forex_scanner/alerts/forex_chart_generator.py (1696 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/forex_chart_generator.py (1696 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-691290cf85c97c22", "name": "Very large file: worker/app/forex_scanner/alerts/order_executor.py (1993 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/order_executor.py (1993 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-d9847f1121ac3e8c", "name": "Very large file: worker/app/forex_scanner/alerts/claude_api.py (2726 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/claude_api.py (2726 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-068ca21b3d4cdc0f", "name": "Very large file: worker/app/forex_scanner/alerts/alert_history.py (2000 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/alert_history.py (2000 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-e236720e63524540", "name": "Very large file: worker/app/forex_scanner/alerts/analysis/prompt_builder.py (2008 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/alerts/analysis/prompt_builder.py (2008 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-7390c1d1688f5138", "name": "Very large file: worker/app/forex_scanner/validation/signal_replay_validator.py (1164 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/validation/signal_replay_validator.py (1164 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f98fa5c16ece5540", "name": "Very large file: worker/app/forex_scanner/validation/historical_data_manager.py (1262 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/validation/historical_data_manager.py (1262 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cbd37b5b6014f92", "name": "Very large file: worker/app/forex_scanner/services/smc_simple_config_service.py (2667 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/services/smc_simple_config_service.py (2667 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-8d2c115cb964af9f", "name": "Very large file: worker/app/forex_scanner/core/data_fetcher.py (1921 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/data_fetcher.py (1921 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-797eb320593f0819", "name": "Very large file: worker/app/forex_scanner/core/backtest_scanner.py (1952 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/backtest_scanner.py (1952 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-33d417bd80e2eebc", "name": "Very large file: worker/app/forex_scanner/core/signal_detector.py (2521 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/signal_detector.py (2521 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-ddbf89cb7ce4a7c4", "name": "Very large file: worker/app/forex_scanner/core/scanner.py (1728 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/scanner.py (1728 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-1f8952a8c6b65ef0", "name": "Very large file: worker/app/forex_scanner/core/backtest_data_fetcher.py (1167 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/backtest_data_fetcher.py (1167 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-ea480d3acd76f795", "name": "Very large file: worker/app/forex_scanner/core/processing/signal_processor.py (1806 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/processing/signal_processor.py (1806 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-cd4ac8f61ce9856c", "name": "Very large file: worker/app/forex_scanner/core/monitoring/performance_monitor.py (1344 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/monitoring/performance_monitor.py (1344 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-00461c8123f3e9c8", "name": "Very large file: worker/app/forex_scanner/core/intelligence/market_intelligence.py (1923 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/intelligence/market_intelligence.py (1923 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-5b1137d6001f86a4", "name": "Very large file: worker/app/forex_scanner/core/strategies/smc_simple_strategy.py (8097 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/strategies/smc_simple_strategy.py (8097 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-aca47ae147cb5a1c", "name": "Very large file: worker/app/forex_scanner/core/strategies/xau_gold_strategy.py (1527 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/strategies/xau_gold_strategy.py (1527 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-b016069d8f3bda12", "name": "Very large file: worker/app/forex_scanner/core/strategies/helpers/smc_market_structure.py (1552 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/strategies/helpers/smc_market_structure.py (1552 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-57836f338f91c804", "name": "Very large file: worker/app/forex_scanner/core/trading/trading_orchestrator.py (2939 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/trading/trading_orchestrator.py (2939 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-1fd420d47889b5c4", "name": "Very large file: worker/app/forex_scanner/core/trading/trailing_stop_simulator.py (1277 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/trading/trailing_stop_simulator.py (1277 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-75d59355dee91c05", "name": "Very large file: worker/app/forex_scanner/core/trading/trade_validator.py (3353 lines)", "shortDescription": {"text": "Very large file: worker/app/forex_scanner/core/trading/trade_validator.py (3353 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-c65090be86525ea3", "name": "Very large file: streamlit/components/stock_tabs/watchlists_tab.py (1164 lines)", "shortDescription": {"text": "Very large file: streamlit/components/stock_tabs/watchlists_tab.py (1164 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87be4bebceac7f55", "name": "Very large file: streamlit/components/stock_tabs/deep_dive_tab.py (1317 lines)", "shortDescription": {"text": "Very large file: streamlit/components/stock_tabs/deep_dive_tab.py (1317 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-a1d5317c5201fb9c", "name": "Very large file: streamlit/components/stock_tabs/signals_tab.py (1218 lines)", "shortDescription": {"text": "Very large file: streamlit/components/stock_tabs/signals_tab.py (1218 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-3071cd8ebfff19b5", "name": "Very large file: streamlit/components/tabs/scanner_config_tab.py (1813 lines)", "shortDescription": {"text": "Very large file: streamlit/components/tabs/scanner_config_tab.py (1813 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-0b800b83e5c19cab", "name": "Very large file: streamlit/components/tabs/smc_rejections_tab.py (1571 lines)", "shortDescription": {"text": "Very large file: streamlit/components/tabs/smc_rejections_tab.py (1571 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-c7334ba3e2fec97f", "name": "Very large file: streamlit/components/tabs/smc_config_tab.py (2287 lines)", "shortDescription": {"text": "Very large file: streamlit/components/tabs/smc_config_tab.py (2287 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-91419ef806567f26", "name": "Very large file: streamlit/pages/system_status.py (2339 lines)", "shortDescription": {"text": "Very large file: streamlit/pages/system_status.py (2339 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-e2caf06a59e9976f", "name": "Very large file: streamlit/pages/tvchart.py (1958 lines)", "shortDescription": {"text": "Very large file: streamlit/pages/tvchart.py (1958 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-94111c3f8d331fea", "name": "Very large file: streamlit/services/stock_analytics_service.py (4666 lines)", "shortDescription": {"text": "Very large file: streamlit/services/stock_analytics_service.py (4666 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-53e278559681c2b0", "name": "Very large file: streamlit/services/simple_log_intelligence.py (1119 lines)", "shortDescription": {"text": "Very large file: streamlit/services/simple_log_intelligence.py (1119 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-7161ec7e8f3805b9", "name": "Very large file: dev-app/trade_monitor.py (1290 lines)", "shortDescription": {"text": "Very large file: dev-app/trade_monitor.py (1290 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-e58dfd6306bfde54", "name": "Very large file: dev-app/enhanced_trade_processor.py (1194 lines)", "shortDescription": {"text": "Very large file: dev-app/enhanced_trade_processor.py (1194 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-10aa12ff80c994ba", "name": "Very large file: dev-app/trailing_class.py (2959 lines)", "shortDescription": {"text": "Very large file: dev-app/trailing_class.py (2959 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-19153a8208b6b5c5", "name": "Very large file: dev-app/main.py (1281 lines)", "shortDescription": {"text": "Very large file: dev-app/main.py (1281 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-45ab3fd9733675ff", "name": "Very large file: dev-app/routers/trading_analytics_router.py (1692 lines)", "shortDescription": {"text": "Very large file: dev-app/routers/trading_analytics_router.py (1692 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-9d0602c7ad2ac3c7", "name": "Very large file: dev-app/routers/orders_router.py (1757 lines)", "shortDescription": {"text": "Very large file: dev-app/routers/orders_router.py (1757 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-01097af5ce2c13c6", "name": "Very large file: dev-app/routers/trade_analysis_router.py (1487 lines)", "shortDescription": {"text": "Very large file: dev-app/routers/trade_analysis_router.py (1487 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-49e0842dccc383d4", "name": "Very large file: trading-ui/app/signals/page.tsx (1625 lines)", "shortDescription": {"text": "Very large file: trading-ui/app/signals/page.tsx (1625 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-eb826f6a6a9e4814", "name": "Very large file: trading-ui/app/watchlists/page.tsx (1975 lines)", "shortDescription": {"text": "Very large file: trading-ui/app/watchlists/page.tsx (1975 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c363ee532f758e31", "name": "Very large file: trading-ui/app/forex/smc-rejections/page.tsx (1345 lines)", "shortDescription": {"text": "Very large file: trading-ui/app/forex/smc-rejections/page.tsx (1345 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "141 tests / 1086 src (ratio 0.13)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fbe176a90ede8a4", "name": "33 TODO/FIXME markers", "shortDescription": {"text": "33 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "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-b86b44282cc08815", "name": "Node manifest has dependencies but no lockfile: trading-ui/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: trading-ui/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 6777 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 266 placeholder/mock markers across 106 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, lockfile. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b05d10ad7b42afd", "name": "Agent authority lacks a verifier contract: .claude/agents/smc-simple-config-schema.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/smc-simple-config-schema.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39e94b04c458c3c3", "name": "Agent authority lacks a verifier contract: .claude/agents/db-expert.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/db-expert.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7679b8a32eb31ad1", "name": "Agent instruction/config may expose a secret: .claude/skills/docker-environment.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/docker-environment.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c38afc62e35dff5b", "name": "Agent authority lacks a verifier contract: .claude/skills/backtest-runner.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/backtest-runner.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b83a3eef2e4ddc2", "name": "Legacy-named symbol `smc_structure_strategy_v2` in smc_strategy_fixes_v2.6.0.py:270", "shortDescription": {"text": "Legacy-named symbol `smc_structure_strategy_v2` in smc_strategy_fixes_v2.6.0.py:270"}, "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-5bff50726f33d80d", "name": "Network/subprocess call without timeout or try/except \u2014 rag_interface.py:94", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 rag_interface.py:94"}, "fullDescription": {"text": "`requests.post(...)` 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-6838821d1aeb53c0", "name": "Legacy-named symbol `smc_15m_v2` in smc_deep_analysis.py:477", "shortDescription": {"text": "Legacy-named symbol `smc_15m_v2` in smc_deep_analysis.py:477"}, "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-4e4e2c5efe0ae5b7", "name": "Commented-code block (7 lines) in prod-app/main.py:93", "shortDescription": {"text": "Commented-code block (7 lines) in prod-app/main.py:93"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6251e6d79da0224", "name": "Network/subprocess call without timeout or try/except \u2014 stock-scanner/app/stock_scanner/bt_stocks.py:133", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 stock-scanner/app/stock_scanner/bt_stocks.py:133"}, "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-eb7c6e346ef4b552", "name": "Commented-code block (6 lines) in stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py:563", "shortDescription": {"text": "Commented-code block (6 lines) in stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py:563"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-39889da805dc5c14", "name": "Commented-code block (9 lines) in stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py:464", "shortDescription": {"text": "Commented-code block (9 lines) in stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py:464"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed37dbc96a48689a", "name": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/scanners/scanner_manager.py:733", "shortDescription": {"text": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/scanners/scanner_manager.py:733"}, "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-1b5667cc85fd29bc", "name": "Commented-code block (7 lines) in stock-scanner/app/stock_scanner/services/auto_open_trader.py:32", "shortDescription": {"text": "Commented-code block (7 lines) in stock-scanner/app/stock_scanner/services/auto_open_trader.py:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec8de26608b1574b", "name": "Commented-code block (5 lines) in stock-scanner/app/stock_scanner/services/intraday_vwap_sync.py:40", "shortDescription": {"text": "Commented-code block (5 lines) in stock-scanner/app/stock_scanner/services/intraday_vwap_sync.py:40"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6733f2e476116f2", "name": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/core/news/sentiment_analyzer.py:206", "shortDescription": {"text": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/core/news/sentiment_analyzer.py:206"}, "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-8ba01a358f186f94", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/search_ig_markets.py:27", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/search_ig_markets.py:27"}, "fullDescription": {"text": "`requests.post(...)` 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-2273c876fbeb8666", "name": "Commented-code block (5 lines) in worker/app/fx_xsec_momentum_probe.py:85", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/fx_xsec_momentum_probe.py:85"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ccc60017f7fe7434", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/search_ig_markets.py:27", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/search_ig_markets.py:27"}, "fullDescription": {"text": "`requests.post(...)` 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-bb8a438b141ace50", "name": "Commented-code block (5 lines) in worker/app/htf_edge_probe.py:381", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/htf_edge_probe.py:381"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23377a7cddd6e9f6", "name": "Commented-code block (5 lines) in worker/app/trade_scan.py:647", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/trade_scan.py:647"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8913c858f01ebeee", "name": "Legacy-named symbol `signals_london_open_breakout_v2` in worker/app/eurjpy_model_search.py:416", "shortDescription": {"text": "Legacy-named symbol `signals_london_open_breakout_v2` in worker/app/eurjpy_model_search.py:416"}, "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-8ad74e93f71324bd", "name": "Commented-code block (5 lines) in worker/app/old_data/OldScans/pictureandchatgtp.py:438", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/old_data/OldScans/pictureandchatgtp.py:438"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-968e486e3a5c4017", "name": "Commented-code block (7 lines) in worker/app/old_data/services/scanner_config.py:1028", "shortDescription": {"text": "Commented-code block (7 lines) in worker/app/old_data/services/scanner_config.py:1028"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a3fe9ab5b5ba435", "name": "Legacy-named symbol `df_copy` in worker/app/old_data/services/enhance_data.py:102", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/old_data/services/enhance_data.py:102"}, "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-62108a7ecab745eb", "name": "Legacy-named symbol `smc_15m_v2` in worker/app/info/extract_smc_signals.py:123", "shortDescription": {"text": "Legacy-named symbol `smc_15m_v2` in worker/app/info/extract_smc_signals.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-1bc39bfb96c8d085", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/backtest_cli.py:1570", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/backtest_cli.py:1570"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6af4e640bbfee04f", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/monitoring/monitor_outcome_analyzer.py:186", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/monitoring/monitor_outcome_analyzer.py:186"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-682910d89aab7aea", "name": "Commented-code block (8 lines) in worker/app/forex_scanner/monitoring/gate_edge_analyzer.py:91", "shortDescription": {"text": "Commented-code block (8 lines) in worker/app/forex_scanner/monitoring/gate_edge_analyzer.py:91"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36bfe9b65f8f180a", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_indicator_calculator.p", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_indicator_calculator.py:130"}, "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-c25beb890e6109e0", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_helpers/adaptive_volatility_calculator.py:39", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_helpers/adaptive_volatility_calculator.py:392"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b148993b696e4ef7", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/smc_mtf_analyzer.py:429", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/smc_mtf_analyzer.py:429"}, "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-17d178c12629f652", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/ichimoku_indicator_calculator.py:90", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/ichimoku_indicator_calculator.py:90"}, "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-f6db15b2ffd2ed94", "name": "Commented-code block (8 lines) in worker/app/forex_scanner/archive/disabled_helpers/macd_signal_calculator.py:132", "shortDescription": {"text": "Commented-code block (8 lines) in worker/app/forex_scanner/archive/disabled_helpers/macd_signal_calculator.py:132"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-923ccbfbab9165c6", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_mtf_analyzer.py:233", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_mtf_analyzer.py:233"}, "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-ee0d38e5bdcd947d", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.py:77", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.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-bdfac8a3d24bbc21", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_macd_strategy.py:218", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_macd_strategy.py:218"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56bb0c2577fb2a1a", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_zerolag_strategy.py:372", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_zerolag_strategy.py:372"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be8b8f64ddc1a9ef", "name": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ichimoku_strategy.py:319", "shortDescription": {"text": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ichimoku_strategy.py:319"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e4b129dc6b6262a", "name": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ranging_market_strategy.py:484", "shortDescription": {"text": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ranging_market_strategy.py:484"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f77dfa1a8c01ed9c", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_double_confirmation.py:7", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_double_confirmation.py:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c793ef122d22d474", "name": "Commented-code block (129 lines) in worker/app/forex_scanner/archive/legacy_configs/config_smc_structure.py:32", "shortDescription": {"text": "Commented-code block (129 lines) in worker/app/forex_scanner/archive/legacy_configs/config_smc_structure.py:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-373ed8c0528e67f6", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py:142", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py:142"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fecc9879b2e5bbf", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/volume_profile_strategy.py:271", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/volume_profile_strategy.py:271"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f935d53326e76810", "name": "Commented-code block (7 lines) in worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py:298", "shortDescription": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py:298"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55e8cc010caa4e88", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py:2383", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py:2383"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-86fffd934f6039bb", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py:2150", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py:2150"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e865b5c3c0a9493", "name": "Legacy-named symbol `_merge_enhanced_config_with_legacy` in worker/app/forex_scanner/archive/disabled_strategies/bb_supe", "shortDescription": {"text": "Legacy-named symbol `_merge_enhanced_config_with_legacy` in worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.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-e682f2ba9b438fba", "name": "Stub function `fx15m_default` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/archive/disabled_strategies/bb_s", "shortDescription": {"text": "Stub function `fx15m_default` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py:56"}, "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-86c3124a96c4ed6e", "name": "Legacy-named symbol `final_backup` in worker/app/forex_scanner/scripts/alert_fx1.py:317", "shortDescription": {"text": "Legacy-named symbol `final_backup` in worker/app/forex_scanner/scripts/alert_fx1.py:317"}, "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-43fc7cfd77370879", "name": "Legacy-named symbol `files_to_backup` in worker/app/forex_scanner/scripts/fix_alert_saver.py:17", "shortDescription": {"text": "Legacy-named symbol `files_to_backup` in worker/app/forex_scanner/scripts/fix_alert_saver.py:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1150c4f736695560", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_xau_gold.py:164", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_xau_gold.py:164"}, "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-2f99f34bf1452794", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py:140", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py:140"}, "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-dffa986d17b814d3", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/sweep_gbpusd_range_fade.py:68", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/sweep_gbpusd_range_fade.py:68"}, "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-607002da8588a053", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_smc_simple.py:211", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_smc_simple.py:211"}, "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-0b85faf0cb2567ab", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/eval_range_fade.py:61", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/eval_range_fade.py:61"}, "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-58d473d41c4e8abe", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_range_fade.py:116", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_range_fade.py:116"}, "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-5b82ee0fd387dbf7", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_mean_reversion.py:137", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_mean_reversion.py:137"}, "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-890ddf6489dc9cc0", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/scripts/scout/templates.py:263", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/scripts/scout/templates.py:263"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfd9fa5268df41fa", "name": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/analysis/smc_simple/run_smc_eur", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/analysis/smc_simple/run_smc_eurusd_quality_sweep.py:123"}, "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-22d580bdae059754", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/configdata/market_intelligence_config.py:32", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/configdata/market_intelligence_config.py:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85fb38e4588f32e9", "name": "Commented-code block (17 lines) in worker/app/forex_scanner/configdata/strategies/config_smc_simple.py:5", "shortDescription": {"text": "Commented-code block (17 lines) in worker/app/forex_scanner/configdata/strategies/config_smc_simple.py:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a27b29d2f79fa550", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/claude_analyzer.py:921", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/claude_analyzer.py:921"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0ee07fa9633b206", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/order_executor.py:78", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/order_executor.py:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c8507d9962f929d", "name": "Legacy-named symbol `_validate_ema_signal_legacy` in worker/app/forex_scanner/alerts/claude_api.py:1581", "shortDescription": {"text": "Legacy-named symbol `_validate_ema_signal_legacy` in worker/app/forex_scanner/alerts/claude_api.py:1581"}, "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-c2e6c6882f668dc8", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/alerts/alert_history.py:1260", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/alerts/alert_history.py:1260"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d57e340acb42c58e", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/analysis/response_parser.py:15", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/analysis/response_parser.py:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7627bd4d6e82f90c", "name": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompt_builder.py:596", "shortDescription": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompt_builder.py:596"}, "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-792d2005fd05a5ca", "name": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompts/smc_simple_v2.py:24", "shortDescription": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompts/smc_simple_v2.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-0288688c997e185e", "name": "Legacy-named symbol `live_v1` in worker/app/forex_scanner/validation/pipeline_consistency_validator.py:719", "shortDescription": {"text": "Legacy-named symbol `live_v1` in worker/app/forex_scanner/validation/pipeline_consistency_validator.py:719"}, "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-39c7e5f7cc943e44", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/services/strategy_router_service.py:159", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/strategy_router_service.py:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fae9e1011eca9aab", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/services/range_fade_config_service.py:94", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/range_fade_config_service.py:94"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9192e3c97842c301", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/services/smc_simple_config_service.py:102", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/smc_simple_config_service.py:102"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41995328c3e73657", "name": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/backtest_scanner.py:151", "shortDescription": {"text": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/backtest_scanner.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-76c3b5463c6ec9d6", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/backtest_scanner.py:237", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/backtest_scanner.py:237"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f5e80c8b3b2782ad", "name": "Legacy-named symbol `kama_v2` in worker/app/forex_scanner/core/signal_detector.py:1085", "shortDescription": {"text": "Legacy-named symbol `kama_v2` in worker/app/forex_scanner/core/signal_detector.py:1085"}, "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-c2359d868552c16e", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/signal_detector.py:916", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/signal_detector.py:916"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b6b613c938ce2ea", "name": "Legacy-named symbol `enhanced_v1` in worker/app/forex_scanner/core/scanner.py:1078", "shortDescription": {"text": "Legacy-named symbol `enhanced_v1` in worker/app/forex_scanner/core/scanner.py:1078"}, "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-82b13cb7a6307fe2", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/scanner.py:741", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/scanner.py:741"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b44e8d714cb158c1", "name": "Commented-code block (7 lines) in worker/app/forex_scanner/core/backtesting/backtest_trailing_engine.py:354", "shortDescription": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/core/backtesting/backtest_trailing_engine.py:354"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6805b7fbd61f0199", "name": "Legacy-named symbol `_enhance_signal_metadata_v2` in worker/app/forex_scanner/core/processing/signal_processor.py:428", "shortDescription": {"text": "Legacy-named symbol `_enhance_signal_metadata_v2` in worker/app/forex_scanner/core/processing/signal_processor.py:428"}, "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-e7159bb302f9014d", "name": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/core/intelligence/order_flow_analyzer.py:284", "shortDescription": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/core/intelligence/order_flow_analyzer.py:284"}, "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-1902ad3136223dfe", "name": "Blocking `time.sleep(...)` inside `async def test_performance_counter_accuracy` \u2014 worker/app/forex_scanner/core/concurre", "shortDescription": {"text": "Blocking `time.sleep(...)` inside `async def test_performance_counter_accuracy` \u2014 worker/app/forex_scanner/core/concurrent_execution/integration_test.py:143"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `time.sleep(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-be7f1430f3ab6ff8", "name": "Stub function `start` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/concurrent_execution/backtest_execu", "shortDescription": {"text": "Stub function `start` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/concurrent_execution/backtest_execution_manager.py:707"}, "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-d61e998e5749f84b", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/core/strategies/smc_simple_strategy.py:1145", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/core/strategies/smc_simple_strategy.py:1145"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0394b0563b8fb7f5", "name": "Legacy-named symbol `kama_old` in worker/app/forex_scanner/core/strategies/kama_v2_strategy.py:324", "shortDescription": {"text": "Legacy-named symbol `kama_old` in worker/app/forex_scanner/core/strategies/kama_v2_strategy.py:324"}, "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-05eddc4787e88046", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/range_fade_strategy.py:307", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/range_fade_strategy.py:307"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3dedf45023b8117", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/strategy_registry.py:317", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/strategy_registry.py:317"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-699ef50c1fb891cc", "name": "Commented-code block (7 lines) in worker/app/forex_scanner/core/strategies/xau_gold_strategy.py:246", "shortDescription": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/core/strategies/xau_gold_strategy.py:246"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dee80fcc5272305f", "name": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/core/strategies/smc_simple_v2_strategy.py:73", "shortDescription": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/core/strategies/smc_simple_v2_strategy.py:73"}, "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-b693d03f1fcbde48", "name": "Stub function `reset_cooldowns` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/strategies/smc_simple_v2_", "shortDescription": {"text": "Stub function `reset_cooldowns` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/strategies/smc_simple_v2_strategy.py:108"}, "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-0433a47898b45e7f", "name": "Legacy-named symbol `_calculate_confidence_legacy` in worker/app/forex_scanner/core/strategies/base_strategy.py:103", "shortDescription": {"text": "Legacy-named symbol `_calculate_confidence_legacy` in worker/app/forex_scanner/core/strategies/base_strategy.py:103"}, "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-cdaacaab321ada67", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/templates/strategy_template.py:313", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/templates/strategy_template.py:313"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15aaf30a7d4081f7", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trading_orchestrator.py:1865", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trading_orchestrator.py:1865"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6fb2e375370d5cee", "name": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trade_validator.py:1535", "shortDescription": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trade_validator.py:1535"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94751e52ef41d137", "name": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/trading/backtest_trading_orchestrator.py:393", "shortDescription": {"text": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/trading/backtest_trading_orchestrator.py:393"}, "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-9e3cc52649a51431", "name": "Commented-code block (6 lines) in worker/app/forex_scanner/core/detection/large_candle_filter.py:337", "shortDescription": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/core/detection/large_candle_filter.py:337"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5556d31aa9d65b2", "name": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/check_actual_corruption.py:79", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/check_actual_corruption.py:79"}, "fullDescription": {"text": "`requests.get(...)` 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-f19ae1516155029d", "name": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/fill_specific_gap.py:101", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/fill_specific_gap.py:101"}, "fullDescription": {"text": "`requests.get(...)` 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-71198e8cfc37bef1", "name": "Blocking `requests.get(...)` inside `async def fill_specific_gap` \u2014 stream-app/validation/fill_specific_gap.py:101", "shortDescription": {"text": "Blocking `requests.get(...)` inside `async def fill_specific_gap` \u2014 stream-app/validation/fill_specific_gap.py:101"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `requests.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83bc70d04ab4a58d", "name": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/correct_specific_entries.py:91", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/correct_specific_entries.py:91"}, "fullDescription": {"text": "`requests.get(...)` 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-9a3ccadd429231ee", "name": "Blocking `requests.get(...)` inside `async def correct_specific_entries` \u2014 stream-app/validation/correct_specific_entrie", "shortDescription": {"text": "Blocking `requests.get(...)` inside `async def correct_specific_entries` \u2014 stream-app/validation/correct_specific_entries.py:91"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `requests.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7f849788a22c8c0d", "name": "Legacy-named symbol `days_old` in stream-app/maintenance/mark_old_failed_gaps.py:23", "shortDescription": {"text": "Legacy-named symbol `days_old` in stream-app/maintenance/mark_old_failed_gaps.py:23"}, "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-b56e56b97d373fef", "name": "Legacy-named symbol `df_copy` in streamlit/components/tabs/ema_rejections_tab.py:219", "shortDescription": {"text": "Legacy-named symbol `df_copy` in streamlit/components/tabs/ema_rejections_tab.py:219"}, "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-74522760706c9aba", "name": "Legacy-named symbol `df_copy` in streamlit/components/tabs/smc_rejections_tab.py:859", "shortDescription": {"text": "Legacy-named symbol `df_copy` in streamlit/components/tabs/smc_rejections_tab.py:859"}, "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-e1b14d7d58d9faa3", "name": "Legacy-named symbol `enhanced_backup` in streamlit/pages/forex_documentation.py:507", "shortDescription": {"text": "Legacy-named symbol `enhanced_backup` in streamlit/pages/forex_documentation.py:507"}, "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-e34e7d289218d0f1", "name": "Legacy-named symbol `s_copy` in streamlit/pages/tvchart.py:1356", "shortDescription": {"text": "Legacy-named symbol `s_copy` in streamlit/pages/tvchart.py:1356"}, "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-871362acccd7afb9", "name": "Commented-code block (7 lines) in streamlit/services/stock_analytics_service.py:1655", "shortDescription": {"text": "Commented-code block (7 lines) in streamlit/services/stock_analytics_service.py:1655"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bc0033ea4a69a50", "name": "Network/subprocess call without timeout or try/except \u2014 streamlit/services/backtest_runner_service.py:289", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 streamlit/services/backtest_runner_service.py:289"}, "fullDescription": {"text": "`subprocess.Popen(...)` 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-6a3f437754ebd4a5", "name": "Commented-code block (10 lines) in dev-app/config.py:188", "shortDescription": {"text": "Commented-code block (10 lines) in dev-app/config.py:188"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba229b1a9a4d663a", "name": "Commented-code block (6 lines) in dev-app/config_virtual_stop.py:64", "shortDescription": {"text": "Commented-code block (6 lines) in dev-app/config_virtual_stop.py:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c9cb97c1b8b6bc9", "name": "Commented-code block (7 lines) in dev-app/services/trade_pnl_correlator.py:466", "shortDescription": {"text": "Commented-code block (7 lines) in dev-app/services/trade_pnl_correlator.py:466"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e4c5915aa8eca24", "name": "Commented-code block (5 lines) in dev-app/services/adjust_stop_service.py:314", "shortDescription": {"text": "Commented-code block (5 lines) in dev-app/services/adjust_stop_service.py:314"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18b47658abb16961", "name": "Commented-code block (6 lines) in dev-app/routers/orders_router.py:844", "shortDescription": {"text": "Commented-code block (6 lines) in dev-app/routers/orders_router.py:844"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-badd3b0d655e1d1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/CandlestickChart.tsx:311", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/CandlestickChart.tsx:311"}, "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-d0918900bbc0b766", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ScannerContextPanel.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ScannerContextPanel.tsx:57"}, "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-27a53356627bef09", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ParameterContextPanel.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ParameterContextPanel.tsx:50"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d5cb0cbcc769b9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/page.tsx:278", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/page.tsx:278"}, "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-927ca50295074fb2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/page.tsx:30"}, "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-a8e6fc1adf5c41cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/strategy/page.tsx:846", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/strategy/page.tsx:846"}, "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-491a7b9bd69085b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/audit/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/audit/page.tsx:29"}, "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-659e71beba05628e", "name": "Commented-code block (5 lines) in trading-ui/app/api/settings/strategy/status-summary/route.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/strategy/status-summary/route.ts:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbe81ace8623c07f", "name": "Legacy-named symbol `smc_strategy_v2` in trading-ui/app/api/settings/strategy/smc/snapshots/route.ts:23", "shortDescription": {"text": "Legacy-named symbol `smc_strategy_v2` in trading-ui/app/api/settings/strategy/smc/snapshots/route.ts:23"}, "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-416ede9ada7af82d", "name": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/route.ts:90", "shortDescription": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/route.ts:90"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3708c4ddd6be0c80", "name": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/audit/route.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/audit/route.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3fb234fb99792a26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/orders/place/route.ts:178", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/orders/place/route.ts:178"}, "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-df94f6e31f8bdbc3", "name": "Commented-code block (6 lines) in trading-ui/app/api/signals/top/route.ts:12", "shortDescription": {"text": "Commented-code block (6 lines) in trading-ui/app/api/signals/top/route.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36bcbe586e3987f8", "name": "Commented-code block (8 lines) in trading-ui/app/api/forex/monitor-outcomes/route.ts:65", "shortDescription": {"text": "Commented-code block (8 lines) in trading-ui/app/api/forex/monitor-outcomes/route.ts:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-708ac866fb376bca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/forex/smc-rejections/outcomes/route.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/forex/smc-rejections/outcomes/route.ts:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-461c79ace4ab6718", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/signals/page.tsx:456", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/signals/page.tsx:456"}, "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-ead97a3457a74745", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/stocks/[ticker]/page.tsx:311", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/stocks/[ticker]/page.tsx:311"}, "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-9f1fc227e995b72d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/page.tsx:507", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/page.tsx:507"}, "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-a1c5e128b985162a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/log-search/page.tsx:179", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/log-search/page.tsx:179"}, "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-7e4eacfd6e4332e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/sw.js/route.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/sw.js/route.ts:49"}, "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-7279a6560063ec3b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/market/page.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/market/page.tsx:78"}, "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-9ca840f4ffa747e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/infrastructure/page.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/infrastructure/page.tsx:109"}, "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-a6f90396d8477b69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/watchlists/page.tsx:256", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/watchlists/page.tsx:256"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-710d40d971e7a99a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/trade-analysis/page.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/trade-analysis/page.tsx:97"}, "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-93d084659b8b4766", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/validator-rejections/page.tsx:185", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/validator-rejections/page.tsx:185"}, "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-98145523886de1fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/smc-rejections/page.tsx:153", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/smc-rejections/page.tsx:153"}, "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-3bd6f3466c482b0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/broker/page.tsx:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/broker/page.tsx:108"}, "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-50148f2aa6827f9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useSnapshots.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useSnapshots.ts:58"}, "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-5b50c8b0e2c91c05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingRatios.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingRatios.ts:70"}, "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-4defdbe770896047", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingConfig.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingConfig.ts:64"}, "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-f25a8a718531266e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/usePairOverrides.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/usePairOverrides.ts:47"}, "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-a2658a52ff6429d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/public/sw.js:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/public/sw.js:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b673918452ee2583", "name": "70 env vars used in code but missing from .env.example", "shortDescription": {"text": "70 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `API_SUBSCRIPTION_KEY`, `AUTO_PAUSE_ENABLED`, `AUTO_TRADER_INTERVAL_SECONDS`, `BACKTEST_USE_LEGACY_SIMULATOR`, `BREAKEVEN_MONITOR_DRY_RUN`, `BREAKEVEN_MONITOR_INTERVAL_SECONDS`, `BROKER_CREATE_POSITION_COOLDOWN_SECONDS` + 62 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntest_time_controls.py:test_closure_logic, test_time_controls.py:test_closure\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nprod-app/services/keyvault.py:get_secret, worker/app/old_data/services/keyvault.py:get_secret, stream-app/services/keyvault.py:get_secret, streamlit/services/keyvault.py:get_secret\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-f1ab6fa8e9f73154", "name": "FastAPI POST `claude_analyze` without auth dependency \u2014 fastapi-general/app/main.py:55", "shortDescription": {"text": "FastAPI POST `claude_analyze` without auth dependency \u2014 fastapi-general/app/main.py:55"}, "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-1c053abe4479628f", "name": "FastAPI POST `claude_analyze_watchlist` without auth dependency \u2014 fastapi-general/app/main.py:98", "shortDescription": {"text": "FastAPI POST `claude_analyze_watchlist` without auth dependency \u2014 fastapi-general/app/main.py:98"}, "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-7c8c3dc7056bd974", "name": "FastAPI POST `block_root` without auth dependency \u2014 prod-app/main.py:135", "shortDescription": {"text": "FastAPI POST `block_root` without auth dependency \u2014 prod-app/main.py:135"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-929beadc48e296d5", "name": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.py:4", "shortDescription": {"text": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.py:44"}, "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-f12228d9b3cbc116", "name": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.py:", "shortDescription": {"text": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.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-f2e32e68d296afe5", "name": "FastAPI POST `start_stream` without auth dependency \u2014 stream-app/routers/stream_router.py:28", "shortDescription": {"text": "FastAPI POST `start_stream` without auth dependency \u2014 stream-app/routers/stream_router.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-af693333ac9cdd2e", "name": "FastAPI POST `stop_stream` without auth dependency \u2014 stream-app/routers/stream_router.py:67", "shortDescription": {"text": "FastAPI POST `stop_stream` without auth dependency \u2014 stream-app/routers/stream_router.py:67"}, "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-1f6b69805b2d7c2b", "name": "FastAPI POST `track_trade` without auth dependency \u2014 stream-app/routers/stream_router.py:108", "shortDescription": {"text": "FastAPI POST `track_trade` without auth dependency \u2014 stream-app/routers/stream_router.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-cbdde8ede3b10e27", "name": "FastAPI DELETE `stop_tracking_trade` without auth dependency \u2014 stream-app/routers/stream_router.py:146", "shortDescription": {"text": "FastAPI DELETE `stop_tracking_trade` without auth dependency \u2014 stream-app/routers/stream_router.py:146"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec01c45a47c6bbc5", "name": "FastAPI POST `block_root` without auth dependency \u2014 dev-app/main.py:856", "shortDescription": {"text": "FastAPI POST `block_root` without auth dependency \u2014 dev-app/main.py:856"}, "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-576961daba4a7e71", "name": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:58", "shortDescription": {"text": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:58"}, "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-9943eb35c74cfff3", "name": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:9", "shortDescription": {"text": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:91"}, "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-683e06fa54aeeb3f", "name": "FastAPI POST `calculate_complete_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:57", "shortDescription": {"text": "FastAPI POST `calculate_complete_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:57"}, "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-b9bf6c407ecc8289", "name": "FastAPI POST `correlate_activity_based_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:186", "shortDescription": {"text": "FastAPI POST `correlate_activity_based_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:186"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de2a5ff2167959e1", "name": "FastAPI POST `fetch_ig_transactions` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:392", "shortDescription": {"text": "FastAPI POST `fetch_ig_transactions` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:392"}, "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-dc628ebd12f86310", "name": "FastAPI POST `test_activity_extraction` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:862", "shortDescription": {"text": "FastAPI POST `test_activity_extraction` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:862"}, "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-ee8a894fb7764130", "name": "FastAPI POST `verify_database_structure` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:965", "shortDescription": {"text": "FastAPI POST `verify_database_structure` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:965"}, "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-3e59e97c41c805dd", "name": "FastAPI POST `verify_pnl_calculations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1083", "shortDescription": {"text": "FastAPI POST `verify_pnl_calculations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1083"}, "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-5ce9d7bc1cc69427", "name": "FastAPI POST `verify_trade_correlations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1237", "shortDescription": {"text": "FastAPI POST `verify_trade_correlations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1237"}, "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-8172cdd12fef06d0", "name": "FastAPI POST `inspect_trade_log_entries` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1340", "shortDescription": {"text": "FastAPI POST `inspect_trade_log_entries` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1340"}, "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-5815229bb23fbddf", "name": "FastAPI POST `test_database_updates` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1446", "shortDescription": {"text": "FastAPI POST `test_database_updates` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1446"}, "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-934cffcf734497ca", "name": "FastAPI POST `manual_evaluate` without auth dependency \u2014 dev-app/routers/manual_trigger_router.py:29", "shortDescription": {"text": "FastAPI POST `manual_evaluate` without auth dependency \u2014 dev-app/routers/manual_trigger_router.py:29"}, "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-a38e327023ce6b73", "name": "FastAPI POST `run_backtest` without auth dependency \u2014 dev-app/routers/backtest_router.py:214", "shortDescription": {"text": "FastAPI POST `run_backtest` without auth dependency \u2014 dev-app/routers/backtest_router.py:214"}, "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-279b756f010b22b8", "name": "FastAPI POST `run_backtest_async` without auth dependency \u2014 dev-app/routers/backtest_router.py:284", "shortDescription": {"text": "FastAPI POST `run_backtest_async` without auth dependency \u2014 dev-app/routers/backtest_router.py:284"}, "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-211fc081a2f419d7", "name": "FastAPI POST `run_parameter_variations` without auth dependency \u2014 dev-app/routers/backtest_router.py:483", "shortDescription": {"text": "FastAPI POST `run_parameter_variations` without auth dependency \u2014 dev-app/routers/backtest_router.py:483"}, "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-cebd6d5ee1d2853e", "name": "FastAPI PUT `upsert` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:191", "shortDescription": {"text": "FastAPI PUT `upsert` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:191"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95db01dfd3a55ffb", "name": "FastAPI POST `invalidate_cache` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:225", "shortDescription": {"text": "FastAPI POST `invalidate_cache` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:225"}, "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-93adafa94574c31b", "name": "FastAPI DELETE `delete` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:232", "shortDescription": {"text": "FastAPI DELETE `delete` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:232"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-28e621a55e7c0ae0", "name": "FastAPI POST `refresh_positions` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:52", "shortDescription": {"text": "FastAPI POST `refresh_positions` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:52"}, "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-71353fcd32eb28ef", "name": "FastAPI DELETE `remove_position` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:121", "shortDescription": {"text": "FastAPI DELETE `remove_position` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:121"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff34f0588c83bd0b", "name": "FastAPI POST `add_position_manual` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:159", "shortDescription": {"text": "FastAPI POST `add_position_manual` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:159"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8745a7cd34378b51", "name": "FastAPI POST `restart_container` without auth dependency \u2014 system-monitor/app/api/routes.py:189", "shortDescription": {"text": "FastAPI POST `restart_container` without auth dependency \u2014 system-monitor/app/api/routes.py:189"}, "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-9973c104ac4f4a45", "name": "FastAPI POST `acknowledge_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:291", "shortDescription": {"text": "FastAPI POST `acknowledge_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:291"}, "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-b50176c6a4522077", "name": "FastAPI POST `resolve_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:310", "shortDescription": {"text": "FastAPI POST `resolve_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:310"}, "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-181d8b6d02df7eaf", "name": "FastAPI POST `test_notification` without auth dependency \u2014 system-monitor/app/api/routes.py:328", "shortDescription": {"text": "FastAPI POST `test_notification` without auth dependency \u2014 system-monitor/app/api/routes.py:328"}, "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-b6b1297521f6e7ba", "name": "Dangling fetch: GET /trading/api/chart/epics?config_set=${configSet} (trading-ui/components/CandlestickChart.tsx:222)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/chart/epics?config_set=${configSet} (trading-ui/components/CandlestickChart.tsx:222)"}, "fullDescription": {"text": "`trading-ui/components/CandlestickChart.tsx:222` calls `GET /trading/api/chart/epics?config_set=${configSet}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/chart/epics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bde5dc35d3b5677", "name": "Dangling fetch: GET /trading/api/chart/candles?${params} (trading-ui/components/CandlestickChart.tsx:311)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/chart/candles?${params} (trading-ui/components/CandlestickChart.tsx:311)"}, "fullDescription": {"text": "`trading-ui/components/CandlestickChart.tsx:311` calls `GET /trading/api/chart/candles?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/chart/candles`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d7edf59b79ac555a", "name": "Dangling fetch: POST /trading/api/orders/place (trading-ui/components/PlaceOrderForm.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /trading/api/orders/place (trading-ui/components/PlaceOrderForm.tsx:54)"}, "fullDescription": {"text": "`trading-ui/components/PlaceOrderForm.tsx:54` calls `POST /trading/api/orders/place` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/orders/place`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf8231d0373f1ebe", "name": "Dangling fetch: GET /trading/api/infra/containers/${encodeURIComponent(containerName)}/logs?lines=${lines} (trading-ui/c", "shortDescription": {"text": "Dangling fetch: GET /trading/api/infra/containers/${encodeURIComponent(containerName)}/logs?lines=${lines} (trading-ui/components/ops/ContainerLogsDrawer.tsx:20)"}, "fullDescription": {"text": "`trading-ui/components/ops/ContainerLogsDrawer.tsx:20` calls `GET /trading/api/infra/containers/${encodeURIComponent(containerName)}/logs?lines=${lines}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/infra/containers/<p>/logs`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ef9a643fb01b7fc", "name": "Dangling fetch: GET /trading/api/market/regime (trading-ui/app/page.tsx:276)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/market/regime (trading-ui/app/page.tsx:276)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:276` calls `GET /trading/api/market/regime` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/market/regime`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97762bf46d427397", "name": "Dangling fetch: GET /trading/api/infra/status (trading-ui/app/page.tsx:277)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/infra/status (trading-ui/app/page.tsx:277)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:277` calls `GET /trading/api/infra/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/infra/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dd62565332c75515", "name": "Dangling fetch: GET /trading/api/infra/alerts/active (trading-ui/app/page.tsx:278)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/infra/alerts/active (trading-ui/app/page.tsx:278)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:278` calls `GET /trading/api/infra/alerts/active` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/infra/alerts/active`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9764878dc65a76f3", "name": "Dangling fetch: GET /trading/api/infra/containers (trading-ui/app/page.tsx:279)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/infra/containers (trading-ui/app/page.tsx:279)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:279` calls `GET /trading/api/infra/containers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/infra/containers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-90210aa042164251", "name": "Dangling fetch: GET /trading/api/stream/summary (trading-ui/app/page.tsx:280)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/stream/summary (trading-ui/app/page.tsx:280)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:280` calls `GET /trading/api/stream/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/stream/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-093aece440582874", "name": "Dangling fetch: GET /trading/api/stream/operations/recent?limit=5 (trading-ui/app/page.tsx:281)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/stream/operations/recent?limit=5 (trading-ui/app/page.tsx:281)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:281` calls `GET /trading/api/stream/operations/recent?limit=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/stream/operations/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-02832917fcf568ea", "name": "Dangling fetch: GET /trading/api/forex/alert-history/?days=1&page=1&limit=5&status=All&strategy=All&pair=All&env=${envir", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/alert-history/?days=1&page=1&limit=5&status=All&strategy=All&pair=All&env=${environment} (trading-ui/app/page.tsx:282)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:282` calls `GET /trading/api/forex/alert-history/?days=1&page=1&limit=5&status=All&strategy=All&pair=All&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/alert-history`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a9121ed8b514cd55", "name": "Dangling fetch: GET /trading/api/forex/overview/?days=7&env=${environment} (trading-ui/app/page.tsx:285)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/overview/?days=7&env=${environment} (trading-ui/app/page.tsx:285)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:285` calls `GET /trading/api/forex/overview/?days=7&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/overview`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e2933d1c0e0294c", "name": "Dangling fetch: GET /trading/api/forex/market-intelligence/?env=${environment} (trading-ui/app/page.tsx:286)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/market-intelligence/?env=${environment} (trading-ui/app/page.tsx:286)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:286` calls `GET /trading/api/forex/market-intelligence/?env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/market-intelligence`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c86e052192e6b444", "name": "Dangling fetch: GET /trading/api/broker/overview?days=7 (trading-ui/app/page.tsx:287)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/broker/overview?days=7 (trading-ui/app/page.tsx:287)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:287` calls `GET /trading/api/broker/overview?days=7` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/broker/overview`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-916d43dfbb42348e", "name": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/page.tsx:288)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/page.tsx:288)"}, "fullDescription": {"text": "`trading-ui/app/page.tsx:288` calls `GET /trading/api/market/holiday` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/market/holiday`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72de4ccfe5db5523", "name": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/forex/page.tsx:159)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/forex/page.tsx:159)"}, "fullDescription": {"text": "`trading-ui/app/forex/page.tsx:159` calls `GET /trading/api/market/holiday` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/market/holiday`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a0431f0105f3c8c9", "name": "Dangling fetch: GET /trading/api/forex/overview/?days=${overviewDays}&env=${environment} (trading-ui/app/forex/page.tsx:", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/overview/?days=${overviewDays}&env=${environment} (trading-ui/app/forex/page.tsx:169)"}, "fullDescription": {"text": "`trading-ui/app/forex/page.tsx:169` calls `GET /trading/api/forex/overview/?days=${overviewDays}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/overview`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b45141cc6c9f0b1", "name": "Dangling fetch: GET /trading/api/forex/analysis/?days=${analysisDays}&env=${environment} (trading-ui/app/forex/page.tsx:", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/analysis/?days=${analysisDays}&env=${environment} (trading-ui/app/forex/page.tsx:187)"}, "fullDescription": {"text": "`trading-ui/app/forex/page.tsx:187` calls `GET /trading/api/forex/analysis/?days=${analysisDays}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-484e1c21af7ab604", "name": "Dangling fetch: GET /trading/api/forex/unfilled-orders/ (trading-ui/app/forex/unfilled-orders/page.tsx:109)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/unfilled-orders/ (trading-ui/app/forex/unfilled-orders/page.tsx:109)"}, "fullDescription": {"text": "`trading-ui/app/forex/unfilled-orders/page.tsx:109` calls `GET /trading/api/forex/unfilled-orders/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/unfilled-orders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e28c534f8603634", "name": "Dangling fetch: GET /trading/api/forex/analysis/?days=${days}&env=${environment} (trading-ui/app/forex/strategy/page.tsx", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/analysis/?days=${days}&env=${environment} (trading-ui/app/forex/strategy/page.tsx:67)"}, "fullDescription": {"text": "`trading-ui/app/forex/strategy/page.tsx:67` calls `GET /trading/api/forex/analysis/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1ae0760db56a7ae", "name": "Dangling fetch: GET /trading/api/forex/monitor-outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/monitor-o", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/monitor-outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/monitor-outcomes/page.tsx:114)"}, "fullDescription": {"text": "`trading-ui/app/forex/monitor-outcomes/page.tsx:114` calls `GET /trading/api/forex/monitor-outcomes/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/monitor-outcomes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-120affa10432f0eb", "name": "Dangling fetch: GET /trading/api/forex/entry-timing/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strat", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/entry-timing/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)} (trading-ui/app/forex/entry-timing/page.tsx:123)"}, "fullDescription": {"text": "`trading-ui/app/forex/entry-timing/page.tsx:123` calls `GET /trading/api/forex/entry-timing/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/entry-timing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e87d733741ec7346", "name": "Dangling fetch: GET /trading/api/forex/strategy-rejections/options (trading-ui/app/forex/strategy-rejections/page.tsx:20", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/options (trading-ui/app/forex/strategy-rejections/page.tsx:205)"}, "fullDescription": {"text": "`trading-ui/app/forex/strategy-rejections/page.tsx:205` calls `GET /trading/api/forex/strategy-rejections/options` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/strategy-rejections/options`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe9251d82ae7c1e1", "name": "Dangling fetch: GET /trading/api/forex/strategy-rejections/stats?${params} (trading-ui/app/forex/strategy-rejections/pag", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/stats?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:216)"}, "fullDescription": {"text": "`trading-ui/app/forex/strategy-rejections/page.tsx:216` calls `GET /trading/api/forex/strategy-rejections/stats?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/strategy-rejections/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-79080c79501646a8", "name": "Dangling fetch: GET /trading/api/forex/strategy-rejections/top-stages?${params} (trading-ui/app/forex/strategy-rejection", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/top-stages?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:217)"}, "fullDescription": {"text": "`trading-ui/app/forex/strategy-rejections/page.tsx:217` calls `GET /trading/api/forex/strategy-rejections/top-stages?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/strategy-rejections/top-stages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db01f51a70677860", "name": "Dangling fetch: GET /trading/api/forex/strategy-rejections/list?${params} (trading-ui/app/forex/strategy-rejections/page", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/list?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:240)"}, "fullDescription": {"text": "`trading-ui/app/forex/strategy-rejections/page.tsx:240` calls `GET /trading/api/forex/strategy-rejections/list?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/strategy-rejections/list`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b1fdaf599a18c3e2", "name": "Dangling fetch: GET /trading/api/forex/economic-calendar?${params.toString()} (trading-ui/app/forex/economic-calendar/pa", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/economic-calendar?${params.toString()} (trading-ui/app/forex/economic-calendar/page.tsx:166)"}, "fullDescription": {"text": "`trading-ui/app/forex/economic-calendar/page.tsx:166` calls `GET /trading/api/forex/economic-calendar?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/economic-calendar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc1ed9becc580392", "name": "Dangling fetch: GET /trading/api/market/holidays?days=${holidayDays} (trading-ui/app/forex/economic-calendar/page.tsx:18", "shortDescription": {"text": "Dangling fetch: GET /trading/api/market/holidays?days=${holidayDays} (trading-ui/app/forex/economic-calendar/page.tsx:181)"}, "fullDescription": {"text": "`trading-ui/app/forex/economic-calendar/page.tsx:181` calls `GET /trading/api/market/holidays?days=${holidayDays}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/market/holidays`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4254f7672e30863a", "name": "Dangling fetch: GET /trading/api/forex/filter-effectiveness/?days=${days}&env=${environment} (trading-ui/app/forex/filte", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/filter-effectiveness/?days=${days}&env=${environment} (trading-ui/app/forex/filter-effectiveness/page.tsx:71)"}, "fullDescription": {"text": "`trading-ui/app/forex/filter-effectiveness/page.tsx:71` calls `GET /trading/api/forex/filter-effectiveness/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/filter-effectiveness`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e36645888a3ab6a7", "name": "Dangling fetch: GET /trading/api/forex/htf-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/htf-analysis/", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/htf-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/htf-analysis/page.tsx:130)"}, "fullDescription": {"text": "`trading-ui/app/forex/htf-analysis/page.tsx:130` calls `GET /trading/api/forex/htf-analysis/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/htf-analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6ce32471d6a2b478", "name": "Dangling fetch: GET /trading/api/forex/alert-history/?${params.toString()}&env=${environment} (trading-ui/app/forex/aler", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/alert-history/?${params.toString()}&env=${environment} (trading-ui/app/forex/alert-history/page.tsx:96)"}, "fullDescription": {"text": "`trading-ui/app/forex/alert-history/page.tsx:96` calls `GET /trading/api/forex/alert-history/?${params.toString()}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/alert-history`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-03e9037d5c8af491", "name": "Dangling fetch: GET /trading/api/forex/trade-analysis/trades/?${params} (trading-ui/app/forex/trade-analysis/page.tsx:76", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/trades/?${params} (trading-ui/app/forex/trade-analysis/page.tsx:76)"}, "fullDescription": {"text": "`trading-ui/app/forex/trade-analysis/page.tsx:76` calls `GET /trading/api/forex/trade-analysis/trades/?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/trade-analysis/trades`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e66ec058555f135", "name": "Dangling fetch: GET /trading/api/forex/trade-analysis/postmortem/?tradeId=${id}&env=${env} (trading-ui/app/forex/trade-a", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/postmortem/?tradeId=${id}&env=${env} (trading-ui/app/forex/trade-analysis/page.tsx:97)"}, "fullDescription": {"text": "`trading-ui/app/forex/trade-analysis/page.tsx:97` calls `GET /trading/api/forex/trade-analysis/postmortem/?tradeId=${id}&env=${env}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/trade-analysis/postmortem`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3b10cae5ef1558cd", "name": "Dangling fetch: GET /trading/api/forex/trade-analysis/chart-data/?tradeId=${id}&env=${environment} (trading-ui/app/forex", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/chart-data/?tradeId=${id}&env=${environment} (trading-ui/app/forex/trade-analysis/page.tsx:125)"}, "fullDescription": {"text": "`trading-ui/app/forex/trade-analysis/page.tsx:125` calls `GET /trading/api/forex/trade-analysis/chart-data/?tradeId=${id}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/trade-analysis/chart-data`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69bbe8d67e4fa0c9", "name": "Dangling fetch: GET /trading/api/forex/mae-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/mae-analysis/", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/mae-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/mae-analysis/page.tsx:123)"}, "fullDescription": {"text": "`trading-ui/app/forex/mae-analysis/page.tsx:123` calls `GET /trading/api/forex/mae-analysis/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/mae-analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-960030fefba91de6", "name": "Dangling fetch: GET /trading/api/forex/adx-regime/?days=${days} (trading-ui/app/forex/adx-regime/page.tsx:250)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/adx-regime/?days=${days} (trading-ui/app/forex/adx-regime/page.tsx:250)"}, "fullDescription": {"text": "`trading-ui/app/forex/adx-regime/page.tsx:250` calls `GET /trading/api/forex/adx-regime/?days=${days}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/adx-regime`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc9de62547df8d46", "name": "Dangling fetch: GET /trading/api/forex/validator-rejections/options/?env=${environment} (trading-ui/app/forex/validator-", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/options/?env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:173)"}, "fullDescription": {"text": "`trading-ui/app/forex/validator-rejections/page.tsx:173` calls `GET /trading/api/forex/validator-rejections/options/?env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/validator-rejections/options`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d473753de4433c3f", "name": "Dangling fetch: GET /trading/api/forex/validator-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:185)"}, "fullDescription": {"text": "`trading-ui/app/forex/validator-rejections/page.tsx:185` calls `GET /trading/api/forex/validator-rejections/stats/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/validator-rejections/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa79bc489e46b863", "name": "Dangling fetch: GET /trading/api/forex/validator-rejections/list/?${params}&env=${environment} (trading-ui/app/forex/val", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/list/?${params}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:186)"}, "fullDescription": {"text": "`trading-ui/app/forex/validator-rejections/page.tsx:186` calls `GET /trading/api/forex/validator-rejections/list/?${params}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/validator-rejections/list`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df7a6badebcdacc8", "name": "Dangling fetch: GET /trading/api/forex/validator-rejections/lpf/?days=${days}&env=${environment} (trading-ui/app/forex/v", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/lpf/?days=${days}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:187)"}, "fullDescription": {"text": "`trading-ui/app/forex/validator-rejections/page.tsx:187` calls `GET /trading/api/forex/validator-rejections/lpf/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/validator-rejections/lpf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a605897298308eea", "name": "Dangling fetch: GET /trading/api/forex/alert-data?${query}&env=${environment} (trading-ui/app/forex/alert-data/page.tsx:", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/alert-data?${query}&env=${environment} (trading-ui/app/forex/alert-data/page.tsx:53)"}, "fullDescription": {"text": "`trading-ui/app/forex/alert-data/page.tsx:53` calls `GET /trading/api/forex/alert-data?${query}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/alert-data`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0dbcec14e3c58560", "name": "Dangling fetch: GET /trading/api/forex/claude-rejections/?${params.toString()} (trading-ui/app/forex/claude-rejections/p", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/claude-rejections/?${params.toString()} (trading-ui/app/forex/claude-rejections/page.tsx:206)"}, "fullDescription": {"text": "`trading-ui/app/forex/claude-rejections/page.tsx:206` calls `GET /trading/api/forex/claude-rejections/?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/claude-rejections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f1e5a9c26a2cee3d", "name": "Dangling fetch: GET /trading/api/forex/smc-rejections/options/?env=${environment} (trading-ui/app/forex/smc-rejections/p", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/options/?env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:136)"}, "fullDescription": {"text": "`trading-ui/app/forex/smc-rejections/page.tsx:136` calls `GET /trading/api/forex/smc-rejections/options/?env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/smc-rejections/options`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3608d23380b8ae92", "name": "Dangling fetch: GET /trading/api/forex/smc-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex/smc-r", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:153)"}, "fullDescription": {"text": "`trading-ui/app/forex/smc-rejections/page.tsx:153` calls `GET /trading/api/forex/smc-rejections/stats/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/smc-rejections/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dd89fd0bd806d614", "name": "Dangling fetch: GET /trading/api/forex/smc-rejections/list/?${params.toString()}&env=${environment} (trading-ui/app/fore", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/list/?${params.toString()}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:154)"}, "fullDescription": {"text": "`trading-ui/app/forex/smc-rejections/page.tsx:154` calls `GET /trading/api/forex/smc-rejections/list/?${params.toString()}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/smc-rejections/list`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a30060fba0eebd2", "name": "Dangling fetch: GET /trading/api/forex/smc-rejections/conflicts/?days=${days}&env=${environment} (trading-ui/app/forex/s", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/conflicts/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:157)"}, "fullDescription": {"text": "`trading-ui/app/forex/smc-rejections/page.tsx:157` calls `GET /trading/api/forex/smc-rejections/conflicts/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/smc-rejections/conflicts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed79f0c10005d27d", "name": "Dangling fetch: GET /trading/api/forex/smc-rejections/outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/sm", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:160)"}, "fullDescription": {"text": "`trading-ui/app/forex/smc-rejections/page.tsx:160` calls `GET /trading/api/forex/smc-rejections/outcomes/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/smc-rejections/outcomes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94bedb10adcc6e53", "name": "Dangling fetch: GET /trading/api/forex/backtests/?${params}&env=${environment} (trading-ui/app/forex/backtests/page.tsx:", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/backtests/?${params}&env=${environment} (trading-ui/app/forex/backtests/page.tsx:65)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/page.tsx:65` calls `GET /trading/api/forex/backtests/?${params}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f8a95f9954beaec", "name": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:88)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:88)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/page.tsx:88` calls `GET /trading/api/forex/backtests/jobs/${selectedJobId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests/jobs/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e09b773449afea77", "name": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:105)", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:105)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/page.tsx:105` calls `GET /trading/api/forex/backtests/jobs/${selectedJobId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests/jobs/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5b3dbf813b7e8acb", "name": "Dangling fetch: POST /trading/api/forex/backtests/ (trading-ui/app/forex/backtests/page.tsx:154)", "shortDescription": {"text": "Dangling fetch: POST /trading/api/forex/backtests/ (trading-ui/app/forex/backtests/page.tsx:154)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/page.tsx:154` calls `POST /trading/api/forex/backtests/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4393f6b2cd72648d", "name": "Dangling fetch: POST /trading/api/forex/backtests/jobs/${jobId}/${action}/ (trading-ui/app/forex/backtests/page.tsx:182)", "shortDescription": {"text": "Dangling fetch: POST /trading/api/forex/backtests/jobs/${jobId}/${action}/ (trading-ui/app/forex/backtests/page.tsx:182)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/page.tsx:182` calls `POST /trading/api/forex/backtests/jobs/${jobId}/${action}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests/jobs/<p>/<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-3de63bef6fc82134", "name": "Dangling fetch: GET /trading/api/forex/backtests/executions/${executionId}/ (trading-ui/app/forex/backtests/[id]/page.ts", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/backtests/executions/${executionId}/ (trading-ui/app/forex/backtests/[id]/page.tsx:55)"}, "fullDescription": {"text": "`trading-ui/app/forex/backtests/[id]/page.tsx:55` calls `GET /trading/api/forex/backtests/executions/${executionId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/backtests/executions/<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-941f96cb75eebf69", "name": "Dangling fetch: GET /trading/api/forex/breakeven-optimizer/?days=${days}&env=${environment}&strategy=${encodeURIComponen", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/breakeven-optimizer/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)} (trading-ui/app/forex/breakeven-optimizer/page.tsx:94)"}, "fullDescription": {"text": "`trading-ui/app/forex/breakeven-optimizer/page.tsx:94` calls `GET /trading/api/forex/breakeven-optimizer/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/breakeven-optimizer`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4552a09e6043ef1", "name": "Dangling fetch: GET /trading/api/forex/market-conditions?${params.toString()} (trading-ui/app/forex/market-conditions/pa", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/market-conditions?${params.toString()} (trading-ui/app/forex/market-conditions/page.tsx:237)"}, "fullDescription": {"text": "`trading-ui/app/forex/market-conditions/page.tsx:237` calls `GET /trading/api/forex/market-conditions?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/market-conditions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65fcb5b68dd4c30e", "name": "Dangling fetch: GET /trading/api/forex/trades/?days=${days}&env=${environment} (trading-ui/app/forex/trade-performance/p", "shortDescription": {"text": "Dangling fetch: GET /trading/api/forex/trades/?days=${days}&env=${environment} (trading-ui/app/forex/trade-performance/page.tsx:107)"}, "fullDescription": {"text": "`trading-ui/app/forex/trade-performance/page.tsx:107` calls `GET /trading/api/forex/trades/?days=${days}&env=${environment}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trading/api/forex/trades`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9bd3c203b6aed9ae", "name": "Unused endpoint: POST /claude/analyze", "shortDescription": {"text": "Unused endpoint: POST /claude/analyze"}, "fullDescription": {"text": "`fastapi-general/app/main.py` declares `POST /claude/analyze` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7ab8598397a70f5", "name": "Unused endpoint: POST /claude/analyze-watchlist", "shortDescription": {"text": "Unused endpoint: POST /claude/analyze-watchlist"}, "fullDescription": {"text": "`fastapi-general/app/main.py` declares `POST /claude/analyze-watchlist` 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": "`prod-app/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`prod-app/main.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc5a92b082e15c69", "name": "Unused endpoint: GET /validate", "shortDescription": {"text": "Unused endpoint: GET /validate"}, "fullDescription": {"text": "`prod-app/main.py` declares `GET /validate` 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-5f7ae5c309c8a5c8", "name": "Unused endpoint: POST /check-and-close", "shortDescription": {"text": "Unused endpoint: POST /check-and-close"}, "fullDescription": {"text": "`prod-app/routers/position_closer_router.py` declares `POST /check-and-close` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6181e3828c8f462e", "name": "Unused endpoint: POST /manual-close-all", "shortDescription": {"text": "Unused endpoint: POST /manual-close-all"}, "fullDescription": {"text": "`prod-app/routers/position_closer_router.py` declares `POST /manual-close-all` 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-afc064028ae39ea9", "name": "Unused endpoint: GET /history", "shortDescription": {"text": "Unused endpoint: GET /history"}, "fullDescription": {"text": "`prod-app/routers/position_closer_router.py` declares `GET /history` 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-a99d35bebbf4aef6", "name": "Unused endpoint: GET /next-closure-time", "shortDescription": {"text": "Unused endpoint: GET /next-closure-time"}, "fullDescription": {"text": "`prod-app/routers/position_closer_router.py` declares `GET /next-closure-time` 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-6ceac03b0c72ae8c", "name": "Unused endpoint: POST /place-order", "shortDescription": {"text": "Unused endpoint: POST /place-order"}, "fullDescription": {"text": "`prod-app/routers/orders_router.py` declares `POST /place-order` 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-6e9b57ad229a15c9", "name": "Unused endpoint: GET /sl-tp", "shortDescription": {"text": "Unused endpoint: GET /sl-tp"}, "fullDescription": {"text": "`prod-app/routers/sl_tp_router.py` declares `GET /sl-tp` 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-43269e4e79c2e69e", "name": "Unused endpoint: GET /events", "shortDescription": {"text": "Unused endpoint: GET /events"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `GET /events` 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-a4dddda7025a157b", "name": "Unused endpoint: GET /events/upcoming", "shortDescription": {"text": "Unused endpoint: GET /events/upcoming"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `GET /events/upcoming` 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-813efbb4ece16e40", "name": "Unused endpoint: POST /scrape/manual", "shortDescription": {"text": "Unused endpoint: POST /scrape/manual"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `POST /scrape/manual` 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-70ababfedb9fb876", "name": "Unused endpoint: GET /scrape/logs", "shortDescription": {"text": "Unused endpoint: GET /scrape/logs"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `GET /scrape/logs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f387d433fa3574da", "name": "Unused endpoint: GET /events/currency/{currency}", "shortDescription": {"text": "Unused endpoint: GET /events/currency/{currency}"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `GET /events/currency/{currency}` 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-2289cbc506d185a6", "name": "Unused endpoint: POST /scheduler/pause/{job_id}", "shortDescription": {"text": "Unused endpoint: POST /scheduler/pause/{job_id}"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `POST /scheduler/pause/{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-41970900c5f25284", "name": "Unused endpoint: POST /scheduler/resume/{job_id}", "shortDescription": {"text": "Unused endpoint: POST /scheduler/resume/{job_id}"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `POST /scheduler/resume/{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-a2f6e9c3c083928c", "name": "Unused endpoint: GET /events/impact-analysis", "shortDescription": {"text": "Unused endpoint: GET /events/impact-analysis"}, "fullDescription": {"text": "`economic-calendar/app/api/routes.py` declares `GET /events/impact-analysis` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0c57be06d53b5aa", "name": "Unused endpoint: GET /backfill/status", "shortDescription": {"text": "Unused endpoint: GET /backfill/status"}, "fullDescription": {"text": "`stream-app/main.py` declares `GET /backfill/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c161a5d941ca315f", "name": "Unused endpoint: GET /backfill/gaps", "shortDescription": {"text": "Unused endpoint: GET /backfill/gaps"}, "fullDescription": {"text": "`stream-app/main.py` declares `GET /backfill/gaps` 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-b6f18a04b6a58c4b", "name": "Unused endpoint: POST /stream/start-stream", "shortDescription": {"text": "Unused endpoint: POST /stream/start-stream"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `POST /stream/start-stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-22a4e7eb344dbdfc", "name": "Unused endpoint: GET /stream/track-trade", "shortDescription": {"text": "Unused endpoint: GET /stream/track-trade"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/track-trade` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4ee8feab688c847", "name": "Unused endpoint: GET /stream/status", "shortDescription": {"text": "Unused endpoint: GET /stream/status"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d250b54aed84b20", "name": "Unused endpoint: POST /stream/stop-stream", "shortDescription": {"text": "Unused endpoint: POST /stream/stop-stream"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `POST /stream/stop-stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06a90db3dd42934c", "name": "Unused endpoint: GET /stream/candles/{epic}", "shortDescription": {"text": "Unused endpoint: GET /stream/candles/{epic}"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/candles/{epic}` 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-93d6f98bd5875809", "name": "Unused endpoint: GET /stream/candle/latest/{epic}", "shortDescription": {"text": "Unused endpoint: GET /stream/candle/latest/{epic}"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/candle/latest/{epic}` 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-570f39a517f300c4", "name": "Unused endpoint: POST /stream/track-trade/{deal_id}", "shortDescription": {"text": "Unused endpoint: POST /stream/track-trade/{deal_id}"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `POST /stream/track-trade/{deal_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-31389303ec0ee158", "name": "Unused endpoint: DELETE /stream/track-trade/{deal_id}", "shortDescription": {"text": "Unused endpoint: DELETE /stream/track-trade/{deal_id}"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `DELETE /stream/track-trade/{deal_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-3dd98a6a2f18a2c2", "name": "Unused endpoint: GET /stream/health", "shortDescription": {"text": "Unused endpoint: GET /stream/health"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cccffb039b0fa67", "name": "Unused endpoint: GET /stream/alerts/recent", "shortDescription": {"text": "Unused endpoint: GET /stream/alerts/recent"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/alerts/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-129797a999d442ac", "name": "Unused endpoint: GET /stream/operations/recent", "shortDescription": {"text": "Unused endpoint: GET /stream/operations/recent"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/operations/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-6e08ed7dcf074bd1", "name": "Unused endpoint: GET /stream/logs/recent", "shortDescription": {"text": "Unused endpoint: GET /stream/logs/recent"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/logs/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-8b3c5918334052e5", "name": "Unused endpoint: GET /stream/system/summary", "shortDescription": {"text": "Unused endpoint: GET /stream/system/summary"}, "fullDescription": {"text": "`stream-app/routers/stream_router.py` declares `GET /stream/system/summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-337ff3957de42e7d", "name": "Unused endpoint: GET /monitor-status", "shortDescription": {"text": "Unused endpoint: GET /monitor-status"}, "fullDescription": {"text": "`dev-app/main.py` declares `GET /monitor-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3c93dfc153f428a", "name": "Unused endpoint: POST /deals/calculate-complete-pnl", "shortDescription": {"text": "Unused endpoint: POST /deals/calculate-complete-pnl"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /deals/calculate-complete-pnl` 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-b7d093f5b4f6aa62", "name": "Unused endpoint: POST /deals/correlate-activities", "shortDescription": {"text": "Unused endpoint: POST /deals/correlate-activities"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /deals/correlate-activities` 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-d7ce5e1da4e52004", "name": "Unused endpoint: GET /deals/pnl-calculation-status", "shortDescription": {"text": "Unused endpoint: GET /deals/pnl-calculation-status"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `GET /deals/pnl-calculation-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ecca578302b56553", "name": "Unused endpoint: POST /transactions/fetch-ig", "shortDescription": {"text": "Unused endpoint: POST /transactions/fetch-ig"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /transactions/fetch-ig` 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-1e49f123681f47a4", "name": "Unused endpoint: GET /transactions/today", "shortDescription": {"text": "Unused endpoint: GET /transactions/today"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `GET /transactions/today` 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-9f7541d412d0388b", "name": "Unused endpoint: POST /transactions/upload", "shortDescription": {"text": "Unused endpoint: POST /transactions/upload"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /transactions/upload` 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-7c30c711d68dc5f9", "name": "Unused endpoint: GET /statistics", "shortDescription": {"text": "Unused endpoint: GET /statistics"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `GET /statistics` 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-48a0659fa61cd052", "name": "Unused endpoint: GET /performance/summary", "shortDescription": {"text": "Unused endpoint: GET /performance/summary"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `GET /performance/summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb5a3f913bc1b8ad", "name": "Unused endpoint: GET /ig/connection-test", "shortDescription": {"text": "Unused endpoint: GET /ig/connection-test"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `GET /ig/connection-test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41646c3235285505", "name": "Unused endpoint: POST /deals/test-activity-extraction", "shortDescription": {"text": "Unused endpoint: POST /deals/test-activity-extraction"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /deals/test-activity-extraction` 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-54dff8a72943c95d", "name": "Unused endpoint: POST /verify/database-structure", "shortDescription": {"text": "Unused endpoint: POST /verify/database-structure"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /verify/database-structure` 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-375fd2237f8e64fb", "name": "Unused endpoint: POST /verify/pnl-calculations", "shortDescription": {"text": "Unused endpoint: POST /verify/pnl-calculations"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /verify/pnl-calculations` 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-720860436d66173a", "name": "Unused endpoint: POST /verify/trade-correlations", "shortDescription": {"text": "Unused endpoint: POST /verify/trade-correlations"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /verify/trade-correlations` 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-e2e1584d15c79527", "name": "Unused endpoint: POST /inspect/trade-log", "shortDescription": {"text": "Unused endpoint: POST /inspect/trade-log"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /inspect/trade-log` 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-7d15b70a8b0cc1c5", "name": "Unused endpoint: POST /test/database-updates", "shortDescription": {"text": "Unused endpoint: POST /test/database-updates"}, "fullDescription": {"text": "`dev-app/routers/trading_analytics_router.py` declares `POST /test/database-updates` 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/18002"}, "properties": {"repository": "rehnmark75/TradeSystemV1-Moved", "repoUrl": "https://github.com/rehnmark75/TradeSystemV1-Moved", "branch": "main"}, "results": [{"ruleId": "scanner-323b033ccc0e7884", "level": "note", "message": {"text": "Possibly dead Python function: htf_strength_enforcement"}, "properties": {"repobilityId": "260d4d30cf20b10d", "scanner": "scanner-primary", "fingerprint": "323b033ccc0e7884", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "smc_strategy_fixes_v2.6.0.py:48"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-32ab88f34a39decc", "level": "note", "message": {"text": "Possibly dead Python function: premium_zone_filter"}, "properties": {"repobilityId": "432d900c9a03dbde", "scanner": "scanner-primary", "fingerprint": "32ab88f34a39decc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "smc_strategy_fixes_v2.6.0.py:92"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92452f88c0e35b47", "level": "note", "message": {"text": "Possibly dead Python function: optimal_filter"}, "properties": {"repobilityId": "c76f0f7f36343e5f", "scanner": "scanner-primary", "fingerprint": "92452f88c0e35b47", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "smc_strategy_fixes_v2.6.0.py:124"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d281b478eca6f4a2", "level": "note", "message": {"text": "Possibly dead Python function: directional_filters"}, "properties": {"repobilityId": "943fe71cf31d96a3", "scanner": "scanner-primary", "fingerprint": "d281b478eca6f4a2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "smc_strategy_fixes_v2.6.0.py:181"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-31fd34de42e409af", "level": "note", "message": {"text": "Possibly dead Python function: call_position_closer_endpoint"}, "properties": {"repobilityId": "22702e498fdbeffd", "scanner": "scanner-primary", "fingerprint": "31fd34de42e409af", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prod-app/main.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-112eed72f8c62f55", "level": "note", "message": {"text": "Possibly dead Python function: weekly_scrape_task"}, "properties": {"repobilityId": "c3e777b3effed2d9", "scanner": "scanner-primary", "fingerprint": "112eed72f8c62f55", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/app/scraper/scheduler.py:119"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-113b3a2e08e70330", "level": "note", "message": {"text": "Possibly dead Python function: daily_cleanup_task"}, "properties": {"repobilityId": "15b322f1be898f63", "scanner": "scanner-primary", "fingerprint": "113b3a2e08e70330", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/app/scraper/scheduler.py:154"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e85e2e5e9cd126ec", "level": "note", "message": {"text": "Possibly dead Python function: health_check_task"}, "properties": {"repobilityId": "fbe4c736281efb8d", "scanner": "scanner-primary", "fingerprint": "e85e2e5e9cd126ec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/app/scraper/scheduler.py:165"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-51d63046e13ef4d4", "level": "note", "message": {"text": "Possibly dead Python function: drop_tables"}, "properties": {"repobilityId": "a51dc16d1b75198c", "scanner": "scanner-primary", "fingerprint": "51d63046e13ef4d4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/app/database/connection.py:66"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-63d415ae18ade578", "level": "note", "message": {"text": "Possibly dead Python function: classify_pnl"}, "properties": {"repobilityId": "bd47ae194e97e0c8", "scanner": "scanner-primary", "fingerprint": "63d415ae18ade578", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/analysis/sltp_calibration.py:306"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-839f9f26e3d4e157", "level": "note", "message": {"text": "Possibly dead Python function: core_score"}, "properties": {"repobilityId": "67fbe50494908198", "scanner": "scanner-primary", "fingerprint": "839f9f26e3d4e157", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/analysis/grading_replay.py:119"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-68909909c9f130c1", "level": "note", "message": {"text": "Possibly dead Python function: swing_core"}, "properties": {"repobilityId": "d5419ac5251c4fe7", "scanner": "scanner-primary", "fingerprint": "68909909c9f130c1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/analysis/swing_replay.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad0c320a46f8a530", "level": "note", "message": {"text": "Possibly dead Python function: build_confluence_factors"}, "properties": {"repobilityId": "359015ed9f4700f3", "scanner": "scanner-primary", "fingerprint": "ad0c320a46f8a530", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/base_scanner.py:760"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7f4f1c7a778cb43", "level": "note", "message": {"text": "Possibly dead Python function: run_single_scanner"}, "properties": {"repobilityId": "54fcda77a17fdb3d", "scanner": "scanner-primary", "fingerprint": "a7f4f1c7a778cb43", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/scanner_manager.py:566"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81a9af2fc01f8fba", "level": "note", "message": {"text": "Possibly dead Python function: update_signal_status"}, "properties": {"repobilityId": "8a035c93e77187f5", "scanner": "scanner-primary", "fingerprint": "81a9af2fc01f8fba", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/scanner_manager.py:702"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-540e39fa50f807aa", "level": "note", "message": {"text": "Possibly dead Python function: expire_old_signals"}, "properties": {"repobilityId": "df8a8f5a3afc8b63", "scanner": "scanner-primary", "fingerprint": "540e39fa50f807aa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/scanner_manager.py:733"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-08e8fdf5a8857d6d", "level": "note", "message": {"text": "Possibly dead Python function: enrich_signals_with_news"}, "properties": {"repobilityId": "a903f1daa0941e75", "scanner": "scanner-primary", "fingerprint": "08e8fdf5a8857d6d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/scanner_manager.py:1409"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-148e6c9c2a98365a", "level": "note", "message": {"text": "Possibly dead Python function: enrich_single_signal_news"}, "properties": {"repobilityId": "8e4fb8ec65aeb5e2", "scanner": "scanner-primary", "fingerprint": "148e6c9c2a98365a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/scanner_manager.py:1498"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e9d34024780a98c6", "level": "note", "message": {"text": "Possibly dead Python function: add_filter"}, "properties": {"repobilityId": "b25ef1f8d34836ed", "scanner": "scanner-primary", "fingerprint": "e9d34024780a98c6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/exclusion_filters.py:353"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27bf268e045b6737", "level": "note", "message": {"text": "Possibly dead Python function: add_custom_rule"}, "properties": {"repobilityId": "f2458bf861e2647f", "scanner": "scanner-primary", "fingerprint": "27bf268e045b6737", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/app/stock_scanner/scanners/exclusion_filters.py:357"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2fc9049f243ee5dc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SaveModal.tsx:55"}, "properties": {"repobilityId": "0e26ee2849c4e272", "scanner": "scanner-primary", "fingerprint": "2fc9049f243ee5dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-191ff008ccad93ab", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotDiffView.tsx:68"}, "properties": {"repobilityId": "317f10b47540fed6", "scanner": "scanner-primary", "fingerprint": "191ff008ccad93ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e307c3cf4dc3aaa7", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/settings/SnapshotPanel.tsx:116"}, "properties": {"repobilityId": "7f294ffc5cb6d781", "scanner": "scanner-primary", "fingerprint": "e307c3cf4dc3aaa7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f9a65384c1b24747", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 trading-ui/components/ops/ContainerLogsDrawer.tsx:58"}, "properties": {"repobilityId": "fe9f1475217ef7ef", "scanner": "scanner-primary", "fingerprint": "f9a65384c1b24747", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ce4a0a369f5ec6a0", "level": "warning", "message": {"text": "Privileged port 23 in use"}, "properties": {"repobilityId": "a1230e3dfc4becfa", "scanner": "scanner-primary", "fingerprint": "ce4a0a369f5ec6a0", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/count_patterns.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1c3d951d53d02de6", "level": "warning", "message": {"text": "Privileged port 46 in use"}, "properties": {"repobilityId": "e83b659b6ec9a0fc", "scanner": "scanner-primary", "fingerprint": "1c3d951d53d02de6", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/count_patterns.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d8f622fa9f0e218", "level": "warning", "message": {"text": "Dockerfile runs as root: fastapi-general/Dockerfile"}, "properties": {"repobilityId": "46494788ce80723c", "scanner": "scanner-primary", "fingerprint": "2d8f622fa9f0e218", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-98e723349e01e0b9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "13740f7846399514", "scanner": "scanner-primary", "fingerprint": "98e723349e01e0b9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fastapi-general/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b06ab89eeb6ce673", "level": "warning", "message": {"text": "Dockerfile runs as root: economic-calendar/Dockerfile"}, "properties": {"repobilityId": "a0ea21da141ce31c", "scanner": "scanner-primary", "fingerprint": "b06ab89eeb6ce673", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-37df3b6952cdf35e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "bdebd39ec81db216", "scanner": "scanner-primary", "fingerprint": "37df3b6952cdf35e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cd83d09236ecf4a8", "level": "warning", "message": {"text": "Dockerfile runs as root: stock-scanner/Dockerfile"}, "properties": {"repobilityId": "35a20167319a6cb5", "scanner": "scanner-primary", "fingerprint": "cd83d09236ecf4a8", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-1313b3f6b3c9e9e3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "71753baee8426fba", "scanner": "scanner-primary", "fingerprint": "1313b3f6b3c9e9e3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1313b3f6b3c9e9e3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "17dab34a37f07688", "scanner": "scanner-primary", "fingerprint": "1313b3f6b3c9e9e3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock-scanner/Dockerfile"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-468058dbb59c39a2", "level": "warning", "message": {"text": "Dockerfile runs as root: worker/Dockerfile"}, "properties": {"repobilityId": "afa47d310a7f3283", "scanner": "scanner-primary", "fingerprint": "468058dbb59c39a2", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-282e0c07973c01d9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "cdf2df7d55f86380", "scanner": "scanner-primary", "fingerprint": "282e0c07973c01d9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-9ab6fb2b1b8d2e48", "level": "warning", "message": {"text": "Dockerfile runs as root: nginx/Dockerfile"}, "properties": {"repobilityId": "8c69aa8bb7200b4b", "scanner": "scanner-primary", "fingerprint": "9ab6fb2b1b8d2e48", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-12a739d8d937bc98", "level": "warning", "message": {"text": "Docker base image uses a mutable or implicit tag: nginx:latest"}, "properties": {"repobilityId": "0a6d4fd8c6677121", "scanner": "scanner-primary", "fingerprint": "12a739d8d937bc98", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "nginx/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-de3b6f130536ec01", "level": "warning", "message": {"text": "Dockerfile runs as root: streamlit/Dockerfile"}, "properties": {"repobilityId": "c53eb2de6a352456", "scanner": "scanner-primary", "fingerprint": "de3b6f130536ec01", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-11d6dc2e2170a5f1", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "009cd9447330841e", "scanner": "scanner-primary", "fingerprint": "11d6dc2e2170a5f1", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "streamlit/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-219ade7ad048e22a", "level": "warning", "message": {"text": "Dockerfile runs as root: trading-ui/Dockerfile"}, "properties": {"repobilityId": "be3a00efbc49e3dc", "scanner": "scanner-primary", "fingerprint": "219ade7ad048e22a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-45936722748bb168", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "475040102a8b101a", "scanner": "scanner-primary", "fingerprint": "45936722748bb168", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "trading-ui/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45936722748bb168", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "c2e39019d1952c05", "scanner": "scanner-primary", "fingerprint": "45936722748bb168", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "trading-ui/Dockerfile"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-45936722748bb168", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "f54efa3a2d451057", "scanner": "scanner-primary", "fingerprint": "45936722748bb168", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "trading-ui/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-edde1f8d7e4a028a", "level": "warning", "message": {"text": "Dockerfile runs as root: system-monitor/Dockerfile"}, "properties": {"repobilityId": "52e5e2aefeb49a60", "scanner": "scanner-primary", "fingerprint": "edde1f8d7e4a028a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-0d95d2184ad95add", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "802afeed309caa09", "scanner": "scanner-primary", "fingerprint": "0d95d2184ad95add", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/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-8f0d0bf50ec9ed6c", "level": "error", "message": {"text": "Possible secret in prod-app/config.py"}, "properties": {"repobilityId": "6c06c4ddb5fb9e5e", "scanner": "scanner-primary", "fingerprint": "8f0d0bf50ec9ed6c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prod-app/config.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-40ba6bd1f45e79bc", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in economic-calendar/app/main.py:122"}, "properties": {"repobilityId": "1ed85a580094098d", "scanner": "scanner-primary", "fingerprint": "40ba6bd1f45e79bc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "economic-calendar/app/main.py"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-4c070cadb7be512b", "level": "error", "message": {"text": "Possible secret in worker/app/range_fade_diag3.py"}, "properties": {"repobilityId": "834ec09a18341ace", "scanner": "scanner-primary", "fingerprint": "4c070cadb7be512b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/range_fade_diag3.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-9816d110105eb848", "level": "error", "message": {"text": "Possible secret in worker/app/fx_xsec_momentum_probe.py"}, "properties": {"repobilityId": "bc45e6801b682980", "scanner": "scanner-primary", "fingerprint": "9816d110105eb848", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/fx_xsec_momentum_probe.py"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-fb6c2cd323ec3ecd", "level": "error", "message": {"text": "Possible secret in worker/app/htf_edge_probe.py"}, "properties": {"repobilityId": "9e5b4e0c5e72b112", "scanner": "scanner-primary", "fingerprint": "fb6c2cd323ec3ecd", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/htf_edge_probe.py"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-016fca8168f31d79", "level": "error", "message": {"text": "Possible secret in worker/app/eurjpy_model_search.py"}, "properties": {"repobilityId": "2a7e9c6da7a92f54", "scanner": "scanner-primary", "fingerprint": "016fca8168f31d79", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/eurjpy_model_search.py"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-280a5c103752f380", "level": "error", "message": {"text": "Possible secret in worker/app/range_fade_width_sweep.py"}, "properties": {"repobilityId": "4a4b70874a29d155", "scanner": "scanner-primary", "fingerprint": "280a5c103752f380", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/range_fade_width_sweep.py"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-7c079a0c0b1f91a9", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in worker/app/old_data/OldScans/trade_scan copy.py:1116"}, "properties": {"repobilityId": "3f0e89cd47f92edf", "scanner": "scanner-primary", "fingerprint": "7c079a0c0b1f91a9", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/old_data/OldScans/trade_scan copy.py"}, "region": {"startLine": 1116}}}]}, {"ruleId": "scanner-0a668bdfe28d8394", "level": "error", "message": {"text": "Possible secret in worker/app/old_data/services/scanner_config.py"}, "properties": {"repobilityId": "79352e59c6dd39f8", "scanner": "scanner-primary", "fingerprint": "0a668bdfe28d8394", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/old_data/services/scanner_config.py"}, "region": {"startLine": 1026}}}]}, {"ruleId": "scanner-a84a5bc06f7f6b2e", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/scripts/diag_range_fade_adx.py"}, "properties": {"repobilityId": "82c84f1476f94ad0", "scanner": "scanner-primary", "fingerprint": "a84a5bc06f7f6b2e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/scripts/diag_range_fade_adx.py"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-053faddafc6b9b68", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py"}, "properties": {"repobilityId": "e27b0bf518f6ca35", "scanner": "scanner-primary", "fingerprint": "053faddafc6b9b68", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py"}, "region": {"startLine": 390}}}]}, {"ruleId": "scanner-696de9364cce4883", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/scripts/verify_claude.py"}, "properties": {"repobilityId": "666a5d573de426e0", "scanner": "scanner-primary", "fingerprint": "696de9364cce4883", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/scripts/verify_claude.py"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-76c23b6d86929c7f", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/scripts/analyze_pair_performance.py"}, "properties": {"repobilityId": "88c888a034bdf3f5", "scanner": "scanner-primary", "fingerprint": "76c23b6d86929c7f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/scripts/analyze_pair_performance.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-0ae4c7facc53b528", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py"}, "properties": {"repobilityId": "402d4e5d076e3e22", "scanner": "scanner-primary", "fingerprint": "0ae4c7facc53b528", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/alerts/order_executor.py"}, "region": {"startLine": 1755}}}]}, {"ruleId": "scanner-0ae4c7facc53b528", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py"}, "properties": {"repobilityId": "402d4e5d076e3e22", "scanner": "scanner-primary", "fingerprint": "0ae4c7facc53b528", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/alerts/order_executor.py"}, "region": {"startLine": 1851}}}]}, {"ruleId": "scanner-0ae4c7facc53b528", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py"}, "properties": {"repobilityId": "402d4e5d076e3e22", "scanner": "scanner-primary", "fingerprint": "0ae4c7facc53b528", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/alerts/order_executor.py"}, "region": {"startLine": 1898}}}]}, {"ruleId": "scanner-0ae4c7facc53b528", "level": "error", "message": {"text": "Possible secret in worker/app/forex_scanner/alerts/order_executor.py"}, "properties": {"repobilityId": "402d4e5d076e3e22", "scanner": "scanner-primary", "fingerprint": "0ae4c7facc53b528", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/alerts/order_executor.py"}, "region": {"startLine": 1955}}}]}, {"ruleId": "scanner-7746defe6a17c1f1", "level": "error", "message": {"text": "Possible secret in stream-app/config.py"}, "properties": {"repobilityId": "62ff34988b6f3710", "scanner": "scanner-primary", "fingerprint": "7746defe6a17c1f1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/config.py"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-b8129fa2c8010e59", "level": "error", "message": {"text": "Possible secret in streamlit/config.py"}, "properties": {"repobilityId": "85c86a082d264d5d", "scanner": "scanner-primary", "fingerprint": "b8129fa2c8010e59", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "streamlit/config.py"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-5618cd85137980c4", "level": "error", "message": {"text": "Possible secret in dev-app/config.py"}, "properties": {"repobilityId": "c684d3bcbe5364bd", "scanner": "scanner-primary", "fingerprint": "5618cd85137980c4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/config.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-5618cd85137980c4", "level": "error", "message": {"text": "Possible secret in dev-app/config.py"}, "properties": {"repobilityId": "c684d3bcbe5364bd", "scanner": "scanner-primary", "fingerprint": "5618cd85137980c4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/config.py"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-f27a7153bd6363ff", "level": "error", "message": {"text": "Possible secret in dev-app/dependencies.py"}, "properties": {"repobilityId": "d4072dcf8586c8ab", "scanner": "scanner-primary", "fingerprint": "f27a7153bd6363ff", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/dependencies.py"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-dfe7ebccab37d0ae", "level": "error", "message": {"text": "Possible secret in optimization/rag_data_preparation.py"}, "properties": {"repobilityId": "cbaf58bff58aca27", "scanner": "scanner-primary", "fingerprint": "dfe7ebccab37d0ae", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "optimization/rag_data_preparation.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-003d83638857dd1b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in system-monitor/app/main.py:239"}, "properties": {"repobilityId": "e84418b5b6293960", "scanner": "scanner-primary", "fingerprint": "003d83638857dd1b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/app/main.py"}, "region": {"startLine": 239}}}]}, {"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-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-a3cf71bc2bdb9dd0", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/scheduler.py (2095 lines)"}, "properties": {"repobilityId": "f202cdf6d0e1fa4a", "scanner": "scanner-primary", "fingerprint": "a3cf71bc2bdb9dd0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4e3334d6900da2d5", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/main.py (2274 lines)"}, "properties": {"repobilityId": "1d83addaf04589ae", "scanner": "scanner-primary", "fingerprint": "4e3334d6900da2d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7acdd5dc7f6f25bb", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py (1209 lines)"}, "properties": {"repobilityId": "7561230852523624", "scanner": "scanner-primary", "fingerprint": "7acdd5dc7f6f25bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a516e61d478ee99", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py (1196 lines)"}, "properties": {"repobilityId": "a2b5f2f3f4aa4230", "scanner": "scanner-primary", "fingerprint": "8a516e61d478ee99", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66c7cea451707a30", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/scanners/watchlist_scanner.py (1309 lines)"}, "properties": {"repobilityId": "b2894ca5d1698e9f", "scanner": "scanner-primary", "fingerprint": "66c7cea451707a30", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-500783aac3bfd050", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/scanners/scanner_manager.py (1669 lines)"}, "properties": {"repobilityId": "fe093c3b3fce7322", "scanner": "scanner-primary", "fingerprint": "500783aac3bfd050", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49014a7645dff9b4", "level": "note", "message": {"text": "Very large file: stock-scanner/app/stock_scanner/services/broker_trade_analyzer.py (1398 lines)"}, "properties": {"repobilityId": "1ee92e46d1ff3f1f", "scanner": "scanner-primary", "fingerprint": "49014a7645dff9b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5804f7fcfe273328", "level": "note", "message": {"text": "Very large file: worker/app/old_data/services/backtesting.py (1232 lines)"}, "properties": {"repobilityId": "01b32c10165f5af3", "scanner": "scanner-primary", "fingerprint": "5804f7fcfe273328", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b57988ce90cc878", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/backtest_cli.py (2114 lines)"}, "properties": {"repobilityId": "de6ad9f26f87cbb7", "scanner": "scanner-primary", "fingerprint": "5b57988ce90cc878", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-526166c7cf700380", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_signal_detector.py (1377 lines)"}, "properties": {"repobilityId": "10affdd4722d5e38", "scanner": "scanner-primary", "fingerprint": "526166c7cf700380", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-969b93e9f642f8ae", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.py (2372 lines)"}, "properties": {"repobilityId": "ef490d00982bdabb", "scanner": "scanner-primary", "fingerprint": "969b93e9f642f8ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16a2e85157ef1c3d", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py (1169 lines)"}, "properties": {"repobilityId": "a0cad9b1eff9016b", "scanner": "scanner-primary", "fingerprint": "16a2e85157ef1c3d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1f9af690bb3b7bcb", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ichimoku_strategy.py (2062 lines)"}, "properties": {"repobilityId": "cc05430e0d872581", "scanner": "scanner-primary", "fingerprint": "1f9af690bb3b7bcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54132c477f156984", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py (1607 lines)"}, "properties": {"repobilityId": "60f9d9c8b5340763", "scanner": "scanner-primary", "fingerprint": "54132c477f156984", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47b50d5abba8a656", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py (2817 lines)"}, "properties": {"repobilityId": "24d658a569af2b57", "scanner": "scanner-primary", "fingerprint": "47b50d5abba8a656", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-62e1fe81336f44d4", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_strategy.py (1057 lines)"}, "properties": {"repobilityId": "36fac23f4003e667", "scanner": "scanner-primary", "fingerprint": "62e1fe81336f44d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2c82dd03093eb40e", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/ema_double_confirmation_strategy.py (1289 lines)"}, "properties": {"repobilityId": "9600c2b5329ec1e9", "scanner": "scanner-primary", "fingerprint": "2c82dd03093eb40e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e1a045e029be037c", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py (2683 lines)"}, "properties": {"repobilityId": "bf679953ea3569a3", "scanner": "scanner-primary", "fingerprint": "e1a045e029be037c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7fa5c5625deee177", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py (2032 lines)"}, "properties": {"repobilityId": "3da5b5d1bf3e6a36", "scanner": "scanner-primary", "fingerprint": "7fa5c5625deee177", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2867526ee5d2298", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/archive/disabled_strategies/macd_strategy.py (1333 lines)"}, "properties": {"repobilityId": "aefe8553378b14bf", "scanner": "scanner-primary", "fingerprint": "f2867526ee5d2298", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-20797aad57321425", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/configdata/strategies/config_smc_simple.py (1277 lines)"}, "properties": {"repobilityId": "421e0d5a66d12770", "scanner": "scanner-primary", "fingerprint": "20797aad57321425", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e28241bd02052e7d", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/claude_analyzer.py (1901 lines)"}, "properties": {"repobilityId": "625f51058d8f29de", "scanner": "scanner-primary", "fingerprint": "e28241bd02052e7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-931edc35dfe23111", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/forex_chart_generator.py (1696 lines)"}, "properties": {"repobilityId": "1cfd7c233a259098", "scanner": "scanner-primary", "fingerprint": "931edc35dfe23111", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-691290cf85c97c22", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/order_executor.py (1993 lines)"}, "properties": {"repobilityId": "a19593cf83ccc873", "scanner": "scanner-primary", "fingerprint": "691290cf85c97c22", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d9847f1121ac3e8c", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/claude_api.py (2726 lines)"}, "properties": {"repobilityId": "caf57de525dad55e", "scanner": "scanner-primary", "fingerprint": "d9847f1121ac3e8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-068ca21b3d4cdc0f", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/alert_history.py (2000 lines)"}, "properties": {"repobilityId": "08b929d97bbcd91e", "scanner": "scanner-primary", "fingerprint": "068ca21b3d4cdc0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e236720e63524540", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/alerts/analysis/prompt_builder.py (2008 lines)"}, "properties": {"repobilityId": "494b5486dd3599de", "scanner": "scanner-primary", "fingerprint": "e236720e63524540", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7390c1d1688f5138", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/validation/signal_replay_validator.py (1164 lines)"}, "properties": {"repobilityId": "7eae3d2e9e288faf", "scanner": "scanner-primary", "fingerprint": "7390c1d1688f5138", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f98fa5c16ece5540", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/validation/historical_data_manager.py (1262 lines)"}, "properties": {"repobilityId": "b904f7f39bace50b", "scanner": "scanner-primary", "fingerprint": "f98fa5c16ece5540", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6cbd37b5b6014f92", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/services/smc_simple_config_service.py (2667 lines)"}, "properties": {"repobilityId": "66c0082cac6b6c69", "scanner": "scanner-primary", "fingerprint": "6cbd37b5b6014f92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8d2c115cb964af9f", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/data_fetcher.py (1921 lines)"}, "properties": {"repobilityId": "f145ae070585118e", "scanner": "scanner-primary", "fingerprint": "8d2c115cb964af9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-797eb320593f0819", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/backtest_scanner.py (1952 lines)"}, "properties": {"repobilityId": "c7ac25d8415bf38b", "scanner": "scanner-primary", "fingerprint": "797eb320593f0819", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-33d417bd80e2eebc", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/signal_detector.py (2521 lines)"}, "properties": {"repobilityId": "40ff030572946414", "scanner": "scanner-primary", "fingerprint": "33d417bd80e2eebc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ddbf89cb7ce4a7c4", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/scanner.py (1728 lines)"}, "properties": {"repobilityId": "c360e66fa5e70f50", "scanner": "scanner-primary", "fingerprint": "ddbf89cb7ce4a7c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1f8952a8c6b65ef0", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/backtest_data_fetcher.py (1167 lines)"}, "properties": {"repobilityId": "e0065729ec3623b3", "scanner": "scanner-primary", "fingerprint": "1f8952a8c6b65ef0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea480d3acd76f795", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/processing/signal_processor.py (1806 lines)"}, "properties": {"repobilityId": "ccfafc62b3b0b50d", "scanner": "scanner-primary", "fingerprint": "ea480d3acd76f795", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cd4ac8f61ce9856c", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/monitoring/performance_monitor.py (1344 lines)"}, "properties": {"repobilityId": "4e8463f89106d6ea", "scanner": "scanner-primary", "fingerprint": "cd4ac8f61ce9856c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-00461c8123f3e9c8", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/intelligence/market_intelligence.py (1923 lines)"}, "properties": {"repobilityId": "2e8293f9f024f531", "scanner": "scanner-primary", "fingerprint": "00461c8123f3e9c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b1137d6001f86a4", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/strategies/smc_simple_strategy.py (8097 lines)"}, "properties": {"repobilityId": "9a0b4bda42a2a68a", "scanner": "scanner-primary", "fingerprint": "5b1137d6001f86a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aca47ae147cb5a1c", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/strategies/xau_gold_strategy.py (1527 lines)"}, "properties": {"repobilityId": "3557cf4080a1ddcf", "scanner": "scanner-primary", "fingerprint": "aca47ae147cb5a1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b016069d8f3bda12", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/strategies/helpers/smc_market_structure.py (1552 lines)"}, "properties": {"repobilityId": "39d77dc63547a0f8", "scanner": "scanner-primary", "fingerprint": "b016069d8f3bda12", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-57836f338f91c804", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/trading/trading_orchestrator.py (2939 lines)"}, "properties": {"repobilityId": "c8d9bfa534cb21c7", "scanner": "scanner-primary", "fingerprint": "57836f338f91c804", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1fd420d47889b5c4", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/trading/trailing_stop_simulator.py (1277 lines)"}, "properties": {"repobilityId": "d4ffd3be8f4c19a5", "scanner": "scanner-primary", "fingerprint": "1fd420d47889b5c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75d59355dee91c05", "level": "note", "message": {"text": "Very large file: worker/app/forex_scanner/core/trading/trade_validator.py (3353 lines)"}, "properties": {"repobilityId": "18ef50a0fc3b5f46", "scanner": "scanner-primary", "fingerprint": "75d59355dee91c05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c65090be86525ea3", "level": "note", "message": {"text": "Very large file: streamlit/components/stock_tabs/watchlists_tab.py (1164 lines)"}, "properties": {"repobilityId": "cb7f64600c6aa686", "scanner": "scanner-primary", "fingerprint": "c65090be86525ea3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-87be4bebceac7f55", "level": "note", "message": {"text": "Very large file: streamlit/components/stock_tabs/deep_dive_tab.py (1317 lines)"}, "properties": {"repobilityId": "811bae4efe1163b5", "scanner": "scanner-primary", "fingerprint": "87be4bebceac7f55", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a1d5317c5201fb9c", "level": "note", "message": {"text": "Very large file: streamlit/components/stock_tabs/signals_tab.py (1218 lines)"}, "properties": {"repobilityId": "06837f056618da13", "scanner": "scanner-primary", "fingerprint": "a1d5317c5201fb9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3071cd8ebfff19b5", "level": "note", "message": {"text": "Very large file: streamlit/components/tabs/scanner_config_tab.py (1813 lines)"}, "properties": {"repobilityId": "55f0df5e587b3c39", "scanner": "scanner-primary", "fingerprint": "3071cd8ebfff19b5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0b800b83e5c19cab", "level": "note", "message": {"text": "Very large file: streamlit/components/tabs/smc_rejections_tab.py (1571 lines)"}, "properties": {"repobilityId": "9ad135e6c7d048d2", "scanner": "scanner-primary", "fingerprint": "0b800b83e5c19cab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c7334ba3e2fec97f", "level": "note", "message": {"text": "Very large file: streamlit/components/tabs/smc_config_tab.py (2287 lines)"}, "properties": {"repobilityId": "234038894585cc92", "scanner": "scanner-primary", "fingerprint": "c7334ba3e2fec97f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-91419ef806567f26", "level": "note", "message": {"text": "Very large file: streamlit/pages/system_status.py (2339 lines)"}, "properties": {"repobilityId": "781d7c2d755a0c44", "scanner": "scanner-primary", "fingerprint": "91419ef806567f26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e2caf06a59e9976f", "level": "note", "message": {"text": "Very large file: streamlit/pages/tvchart.py (1958 lines)"}, "properties": {"repobilityId": "d9e5dc22a0a66aae", "scanner": "scanner-primary", "fingerprint": "e2caf06a59e9976f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-94111c3f8d331fea", "level": "note", "message": {"text": "Very large file: streamlit/services/stock_analytics_service.py (4666 lines)"}, "properties": {"repobilityId": "b484802c999833e2", "scanner": "scanner-primary", "fingerprint": "94111c3f8d331fea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-53e278559681c2b0", "level": "note", "message": {"text": "Very large file: streamlit/services/simple_log_intelligence.py (1119 lines)"}, "properties": {"repobilityId": "0d7e4d09ff97195c", "scanner": "scanner-primary", "fingerprint": "53e278559681c2b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7161ec7e8f3805b9", "level": "note", "message": {"text": "Very large file: dev-app/trade_monitor.py (1290 lines)"}, "properties": {"repobilityId": "43559b92d875f2ee", "scanner": "scanner-primary", "fingerprint": "7161ec7e8f3805b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e58dfd6306bfde54", "level": "note", "message": {"text": "Very large file: dev-app/enhanced_trade_processor.py (1194 lines)"}, "properties": {"repobilityId": "bdd9b20a19411439", "scanner": "scanner-primary", "fingerprint": "e58dfd6306bfde54", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-10aa12ff80c994ba", "level": "note", "message": {"text": "Very large file: dev-app/trailing_class.py (2959 lines)"}, "properties": {"repobilityId": "26f8486de22b3e67", "scanner": "scanner-primary", "fingerprint": "10aa12ff80c994ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-19153a8208b6b5c5", "level": "note", "message": {"text": "Very large file: dev-app/main.py (1281 lines)"}, "properties": {"repobilityId": "1cb633c8f91a6029", "scanner": "scanner-primary", "fingerprint": "19153a8208b6b5c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-45ab3fd9733675ff", "level": "note", "message": {"text": "Very large file: dev-app/routers/trading_analytics_router.py (1692 lines)"}, "properties": {"repobilityId": "2a3c8bf107d754e3", "scanner": "scanner-primary", "fingerprint": "45ab3fd9733675ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9d0602c7ad2ac3c7", "level": "note", "message": {"text": "Very large file: dev-app/routers/orders_router.py (1757 lines)"}, "properties": {"repobilityId": "ab82f79b010ecbf1", "scanner": "scanner-primary", "fingerprint": "9d0602c7ad2ac3c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01097af5ce2c13c6", "level": "note", "message": {"text": "Very large file: dev-app/routers/trade_analysis_router.py (1487 lines)"}, "properties": {"repobilityId": "a0afecfa1f26d862", "scanner": "scanner-primary", "fingerprint": "01097af5ce2c13c6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49e0842dccc383d4", "level": "note", "message": {"text": "Very large file: trading-ui/app/signals/page.tsx (1625 lines)"}, "properties": {"repobilityId": "82fcc9d3b5e6eb38", "scanner": "scanner-primary", "fingerprint": "49e0842dccc383d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb826f6a6a9e4814", "level": "note", "message": {"text": "Very large file: trading-ui/app/watchlists/page.tsx (1975 lines)"}, "properties": {"repobilityId": "4e02a4f7845e1d4c", "scanner": "scanner-primary", "fingerprint": "eb826f6a6a9e4814", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c363ee532f758e31", "level": "note", "message": {"text": "Very large file: trading-ui/app/forex/smc-rejections/page.tsx (1345 lines)"}, "properties": {"repobilityId": "e4151b15ba2cd0a7", "scanner": "scanner-primary", "fingerprint": "c363ee532f758e31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-2fbe176a90ede8a4", "level": "note", "message": {"text": "33 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "2fbe176a90ede8a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b29c1e9bf1ec3b2e", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b86b44282cc08815", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: trading-ui/package.json"}, "properties": {"repobilityId": "9d20f1c198ff83f5", "scanner": "scanner-primary", "fingerprint": "b86b44282cc08815", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "trading-ui/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "902d8cdd170dca88", "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": "ede108d4e05c0cae", "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": "766784c4d7b6339c", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "a3d2b8925d0f47cb", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "bd2d874f321bd4c7", "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": "0d565c104ee782ff", "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": "d91836c12414b91b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 633}}}]}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b05d10ad7b42afd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/smc-simple-config-schema.md"}, "properties": {"repobilityId": "fc64cd3539f45a28", "scanner": "scanner-primary", "fingerprint": "8b05d10ad7b42afd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/smc-simple-config-schema.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-39e94b04c458c3c3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/db-expert.md"}, "properties": {"repobilityId": "cbcbb491ebdcaa6d", "scanner": "scanner-primary", "fingerprint": "39e94b04c458c3c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/db-expert.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7679b8a32eb31ad1", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/docker-environment.md"}, "properties": {"repobilityId": "d6ea8d44f6df308d", "scanner": "scanner-primary", "fingerprint": "7679b8a32eb31ad1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/docker-environment.md"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-c38afc62e35dff5b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/backtest-runner.md"}, "properties": {"repobilityId": "e2e47b4b1475289a", "scanner": "scanner-primary", "fingerprint": "c38afc62e35dff5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/backtest-runner.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b83a3eef2e4ddc2", "level": "note", "message": {"text": "Legacy-named symbol `smc_structure_strategy_v2` in smc_strategy_fixes_v2.6.0.py:270"}, "properties": {"repobilityId": "e45d63866a4131d6", "scanner": "scanner-primary", "fingerprint": "0b83a3eef2e4ddc2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5bff50726f33d80d", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 rag_interface.py:94"}, "properties": {"repobilityId": "fac6b3c25b6390a4", "scanner": "scanner-primary", "fingerprint": "5bff50726f33d80d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6838821d1aeb53c0", "level": "note", "message": {"text": "Legacy-named symbol `smc_15m_v2` in smc_deep_analysis.py:477"}, "properties": {"repobilityId": "0c907053985d07ba", "scanner": "scanner-primary", "fingerprint": "6838821d1aeb53c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4e4e2c5efe0ae5b7", "level": "none", "message": {"text": "Commented-code block (7 lines) in prod-app/main.py:93"}, "properties": {"repobilityId": "f18e6551765240b9", "scanner": "scanner-primary", "fingerprint": "4e4e2c5efe0ae5b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6251e6d79da0224", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 stock-scanner/app/stock_scanner/bt_stocks.py:133"}, "properties": {"repobilityId": "5b4e78b300c53290", "scanner": "scanner-primary", "fingerprint": "a6251e6d79da0224", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb7c6e346ef4b552", "level": "none", "message": {"text": "Commented-code block (6 lines) in stock-scanner/app/stock_scanner/analysis/swing_horizon_test.py:563"}, "properties": {"repobilityId": "ba37c15eece2a8a1", "scanner": "scanner-primary", "fingerprint": "eb7c6e346ef4b552", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39889da805dc5c14", "level": "none", "message": {"text": "Commented-code block (9 lines) in stock-scanner/app/stock_scanner/analysis/daytrade_edge_sim.py:464"}, "properties": {"repobilityId": "281fe9877adf8ae6", "scanner": "scanner-primary", "fingerprint": "39889da805dc5c14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed37dbc96a48689a", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/scanners/scanner_manager.py:733"}, "properties": {"repobilityId": "ce91bf4d742fd7bc", "scanner": "scanner-primary", "fingerprint": "ed37dbc96a48689a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1b5667cc85fd29bc", "level": "none", "message": {"text": "Commented-code block (7 lines) in stock-scanner/app/stock_scanner/services/auto_open_trader.py:32"}, "properties": {"repobilityId": "a1fdc78795d3c995", "scanner": "scanner-primary", "fingerprint": "1b5667cc85fd29bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec8de26608b1574b", "level": "none", "message": {"text": "Commented-code block (5 lines) in stock-scanner/app/stock_scanner/services/intraday_vwap_sync.py:40"}, "properties": {"repobilityId": "e1143ee2eab9d12c", "scanner": "scanner-primary", "fingerprint": "ec8de26608b1574b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6733f2e476116f2", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in stock-scanner/app/stock_scanner/core/news/sentiment_analyzer.py:206"}, "properties": {"repobilityId": "0507e2c35bddd750", "scanner": "scanner-primary", "fingerprint": "e6733f2e476116f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ba01a358f186f94", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/search_ig_markets.py:27"}, "properties": {"repobilityId": "215fc17f2915ffdc", "scanner": "scanner-primary", "fingerprint": "8ba01a358f186f94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2273c876fbeb8666", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/fx_xsec_momentum_probe.py:85"}, "properties": {"repobilityId": "24a0e92c31aad08e", "scanner": "scanner-primary", "fingerprint": "2273c876fbeb8666", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccc60017f7fe7434", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/search_ig_markets.py:27"}, "properties": {"repobilityId": "b2c781a6fd88c022", "scanner": "scanner-primary", "fingerprint": "ccc60017f7fe7434", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb8a438b141ace50", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/htf_edge_probe.py:381"}, "properties": {"repobilityId": "e684fddbfdfccd16", "scanner": "scanner-primary", "fingerprint": "bb8a438b141ace50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23377a7cddd6e9f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/trade_scan.py:647"}, "properties": {"repobilityId": "51be41dfc5ee268b", "scanner": "scanner-primary", "fingerprint": "23377a7cddd6e9f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8913c858f01ebeee", "level": "note", "message": {"text": "Legacy-named symbol `signals_london_open_breakout_v2` in worker/app/eurjpy_model_search.py:416"}, "properties": {"repobilityId": "aa9622a03d50f234", "scanner": "scanner-primary", "fingerprint": "8913c858f01ebeee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ad74e93f71324bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/old_data/OldScans/pictureandchatgtp.py:438"}, "properties": {"repobilityId": "45b6304189a8cc27", "scanner": "scanner-primary", "fingerprint": "8ad74e93f71324bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-968e486e3a5c4017", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/app/old_data/services/scanner_config.py:1028"}, "properties": {"repobilityId": "c29aaee6f7324130", "scanner": "scanner-primary", "fingerprint": "968e486e3a5c4017", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a3fe9ab5b5ba435", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/old_data/services/enhance_data.py:102"}, "properties": {"repobilityId": "71272acd92535c27", "scanner": "scanner-primary", "fingerprint": "0a3fe9ab5b5ba435", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62108a7ecab745eb", "level": "note", "message": {"text": "Legacy-named symbol `smc_15m_v2` in worker/app/info/extract_smc_signals.py:123"}, "properties": {"repobilityId": "fc2d135659c40d8e", "scanner": "scanner-primary", "fingerprint": "62108a7ecab745eb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1bc39bfb96c8d085", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/backtest_cli.py:1570"}, "properties": {"repobilityId": "5d0db1f64cc95dc5", "scanner": "scanner-primary", "fingerprint": "1bc39bfb96c8d085", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6af4e640bbfee04f", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/monitoring/monitor_outcome_analyzer.py:186"}, "properties": {"repobilityId": "1fbc3771273146fa", "scanner": "scanner-primary", "fingerprint": "6af4e640bbfee04f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-682910d89aab7aea", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/app/forex_scanner/monitoring/gate_edge_analyzer.py:91"}, "properties": {"repobilityId": "d8b47f4416143fd8", "scanner": "scanner-primary", "fingerprint": "682910d89aab7aea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36bfe9b65f8f180a", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/mean_reversion_indicator_calculator.py:130"}, "properties": {"repobilityId": "ddb2a22db4346b14", "scanner": "scanner-primary", "fingerprint": "36bfe9b65f8f180a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c25beb890e6109e0", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_helpers/adaptive_volatility_calculator.py:392"}, "properties": {"repobilityId": "56c966eebe9c3622", "scanner": "scanner-primary", "fingerprint": "c25beb890e6109e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b148993b696e4ef7", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/smc_mtf_analyzer.py:429"}, "properties": {"repobilityId": "43c60acd6fc4c6c8", "scanner": "scanner-primary", "fingerprint": "b148993b696e4ef7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-17d178c12629f652", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/ichimoku_indicator_calculator.py:90"}, "properties": {"repobilityId": "fdbf3ac315ff7a77", "scanner": "scanner-primary", "fingerprint": "17d178c12629f652", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f6db15b2ffd2ed94", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/app/forex_scanner/archive/disabled_helpers/macd_signal_calculator.py:132"}, "properties": {"repobilityId": "9d01115ed44ca92a", "scanner": "scanner-primary", "fingerprint": "f6db15b2ffd2ed94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-923ccbfbab9165c6", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_mtf_analyzer.py:233"}, "properties": {"repobilityId": "898ff5f898af505e", "scanner": "scanner-primary", "fingerprint": "923ccbfbab9165c6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ee0d38e5bdcd947d", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/archive/disabled_helpers/macd_indicator_calculator.py:77"}, "properties": {"repobilityId": "201ad236a6e13aee", "scanner": "scanner-primary", "fingerprint": "ee0d38e5bdcd947d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bdfac8a3d24bbc21", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_macd_strategy.py:218"}, "properties": {"repobilityId": "2ec39b1ca986f518", "scanner": "scanner-primary", "fingerprint": "bdfac8a3d24bbc21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56bb0c2577fb2a1a", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_zerolag_strategy.py:372"}, "properties": {"repobilityId": "3ca150e58f70b70e", "scanner": "scanner-primary", "fingerprint": "56bb0c2577fb2a1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be8b8f64ddc1a9ef", "level": "none", "message": {"text": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ichimoku_strategy.py:319"}, "properties": {"repobilityId": "55495ea499b71694", "scanner": "scanner-primary", "fingerprint": "be8b8f64ddc1a9ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e4b129dc6b6262a", "level": "none", "message": {"text": "Commented-code block (10 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ranging_market_strategy.py:484"}, "properties": {"repobilityId": "08e7551c68c0949e", "scanner": "scanner-primary", "fingerprint": "1e4b129dc6b6262a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f77dfa1a8c01ed9c", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_double_confirmation.py:7"}, "properties": {"repobilityId": "15daa2077de78593", "scanner": "scanner-primary", "fingerprint": "f77dfa1a8c01ed9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c793ef122d22d474", "level": "none", "message": {"text": "Commented-code block (129 lines) in worker/app/forex_scanner/archive/legacy_configs/config_smc_structure.py:32"}, "properties": {"repobilityId": "c109aa853a46bcc1", "scanner": "scanner-primary", "fingerprint": "c793ef122d22d474", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-373ed8c0528e67f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/legacy_configs/config_ema_strategy.py:142"}, "properties": {"repobilityId": "3a7b58fbcfb5448a", "scanner": "scanner-primary", "fingerprint": "373ed8c0528e67f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fecc9879b2e5bbf", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/volume_profile_strategy.py:271"}, "properties": {"repobilityId": "8ba1640a40cfa2bb", "scanner": "scanner-primary", "fingerprint": "1fecc9879b2e5bbf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f935d53326e76810", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/archive/disabled_strategies/ranging_market_strategy.py:298"}, "properties": {"repobilityId": "7b21bcd0f27feb8d", "scanner": "scanner-primary", "fingerprint": "f935d53326e76810", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55e8cc010caa4e88", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/archive/disabled_strategies/scalping_strategy.py:2383"}, "properties": {"repobilityId": "2d6e3d0509c11ab1", "scanner": "scanner-primary", "fingerprint": "55e8cc010caa4e88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86fffd934f6039bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/archive/disabled_strategies/smc_structure_strategy.py:2150"}, "properties": {"repobilityId": "e3456f1fd6706ebb", "scanner": "scanner-primary", "fingerprint": "86fffd934f6039bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e865b5c3c0a9493", "level": "note", "message": {"text": "Legacy-named symbol `_merge_enhanced_config_with_legacy` in worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py:144"}, "properties": {"repobilityId": "03eedb907222067c", "scanner": "scanner-primary", "fingerprint": "7e865b5c3c0a9493", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e682f2ba9b438fba", "level": "note", "message": {"text": "Stub function `fx15m_default` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/archive/disabled_strategies/bb_supertrend_strategy.py:56"}, "properties": {"repobilityId": "df0e57ddb8b5003b", "scanner": "scanner-primary", "fingerprint": "e682f2ba9b438fba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-86c3124a96c4ed6e", "level": "note", "message": {"text": "Legacy-named symbol `final_backup` in worker/app/forex_scanner/scripts/alert_fx1.py:317"}, "properties": {"repobilityId": "760b9104f7de6a1f", "scanner": "scanner-primary", "fingerprint": "86c3124a96c4ed6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-43fc7cfd77370879", "level": "note", "message": {"text": "Legacy-named symbol `files_to_backup` in worker/app/forex_scanner/scripts/fix_alert_saver.py:17"}, "properties": {"repobilityId": "9232976ffa9bf523", "scanner": "scanner-primary", "fingerprint": "43fc7cfd77370879", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1150c4f736695560", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_xau_gold.py:164"}, "properties": {"repobilityId": "a1129156c85231cf", "scanner": "scanner-primary", "fingerprint": "1150c4f736695560", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2f99f34bf1452794", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/diag_audjpy_range_fade.py:140"}, "properties": {"repobilityId": "05ebb563ef666830", "scanner": "scanner-primary", "fingerprint": "2f99f34bf1452794", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dffa986d17b814d3", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/sweep_gbpusd_range_fade.py:68"}, "properties": {"repobilityId": "ea0747227eede8c1", "scanner": "scanner-primary", "fingerprint": "dffa986d17b814d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-607002da8588a053", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_smc_simple.py:211"}, "properties": {"repobilityId": "63ea795307092cd5", "scanner": "scanner-primary", "fingerprint": "607002da8588a053", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b85faf0cb2567ab", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/eval_range_fade.py:61"}, "properties": {"repobilityId": "94baed7cb8b02f5b", "scanner": "scanner-primary", "fingerprint": "0b85faf0cb2567ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58d473d41c4e8abe", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_range_fade.py:116"}, "properties": {"repobilityId": "6c5a9adec7bfc6de", "scanner": "scanner-primary", "fingerprint": "58d473d41c4e8abe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b82ee0fd387dbf7", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/ablate_mean_reversion.py:137"}, "properties": {"repobilityId": "7f0501c4e5f27fde", "scanner": "scanner-primary", "fingerprint": "5b82ee0fd387dbf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-890ddf6489dc9cc0", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/scripts/scout/templates.py:263"}, "properties": {"repobilityId": "eef0255d20e3e79d", "scanner": "scanner-primary", "fingerprint": "890ddf6489dc9cc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfd9fa5268df41fa", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 worker/app/forex_scanner/scripts/analysis/smc_simple/run_smc_eurusd_quality_sweep.py:123"}, "properties": {"repobilityId": "fe942f34e40f327b", "scanner": "scanner-primary", "fingerprint": "bfd9fa5268df41fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-22d580bdae059754", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/configdata/market_intelligence_config.py:32"}, "properties": {"repobilityId": "a5c9b737ca77c1e2", "scanner": "scanner-primary", "fingerprint": "22d580bdae059754", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85fb38e4588f32e9", "level": "none", "message": {"text": "Commented-code block (17 lines) in worker/app/forex_scanner/configdata/strategies/config_smc_simple.py:5"}, "properties": {"repobilityId": "0dcdae17ad1ff77b", "scanner": "scanner-primary", "fingerprint": "85fb38e4588f32e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a27b29d2f79fa550", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/claude_analyzer.py:921"}, "properties": {"repobilityId": "f03dee3310bb7fef", "scanner": "scanner-primary", "fingerprint": "a27b29d2f79fa550", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0ee07fa9633b206", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/order_executor.py:78"}, "properties": {"repobilityId": "2c476dfb5b1d2497", "scanner": "scanner-primary", "fingerprint": "e0ee07fa9633b206", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c8507d9962f929d", "level": "note", "message": {"text": "Legacy-named symbol `_validate_ema_signal_legacy` in worker/app/forex_scanner/alerts/claude_api.py:1581"}, "properties": {"repobilityId": "19f246c28e0b9c53", "scanner": "scanner-primary", "fingerprint": "4c8507d9962f929d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c2e6c6882f668dc8", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/alerts/alert_history.py:1260"}, "properties": {"repobilityId": "ab9a60ccb5055d15", "scanner": "scanner-primary", "fingerprint": "c2e6c6882f668dc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d57e340acb42c58e", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/alerts/analysis/response_parser.py:15"}, "properties": {"repobilityId": "feab26115cb8e861", "scanner": "scanner-primary", "fingerprint": "d57e340acb42c58e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7627bd4d6e82f90c", "level": "note", "message": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompt_builder.py:596"}, "properties": {"repobilityId": "3adecd226009c675", "scanner": "scanner-primary", "fingerprint": "7627bd4d6e82f90c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-792d2005fd05a5ca", "level": "note", "message": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/alerts/analysis/prompts/smc_simple_v2.py:24"}, "properties": {"repobilityId": "9645356958414b57", "scanner": "scanner-primary", "fingerprint": "792d2005fd05a5ca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0288688c997e185e", "level": "note", "message": {"text": "Legacy-named symbol `live_v1` in worker/app/forex_scanner/validation/pipeline_consistency_validator.py:719"}, "properties": {"repobilityId": "db4b76addcdad1b3", "scanner": "scanner-primary", "fingerprint": "0288688c997e185e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-39c7e5f7cc943e44", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/strategy_router_service.py:159"}, "properties": {"repobilityId": "4da86b98d99992fc", "scanner": "scanner-primary", "fingerprint": "39c7e5f7cc943e44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fae9e1011eca9aab", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/range_fade_config_service.py:94"}, "properties": {"repobilityId": "bf91de3b432b596a", "scanner": "scanner-primary", "fingerprint": "fae9e1011eca9aab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9192e3c97842c301", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/services/smc_simple_config_service.py:102"}, "properties": {"repobilityId": "1b4619681e96c764", "scanner": "scanner-primary", "fingerprint": "9192e3c97842c301", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41995328c3e73657", "level": "note", "message": {"text": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/backtest_scanner.py:151"}, "properties": {"repobilityId": "a4431ab6c30781a0", "scanner": "scanner-primary", "fingerprint": "41995328c3e73657", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-76c3b5463c6ec9d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/backtest_scanner.py:237"}, "properties": {"repobilityId": "e921df9ac2f1433e", "scanner": "scanner-primary", "fingerprint": "76c3b5463c6ec9d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5e80c8b3b2782ad", "level": "note", "message": {"text": "Legacy-named symbol `kama_v2` in worker/app/forex_scanner/core/signal_detector.py:1085"}, "properties": {"repobilityId": "f54f881b1f5635e4", "scanner": "scanner-primary", "fingerprint": "f5e80c8b3b2782ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c2359d868552c16e", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/signal_detector.py:916"}, "properties": {"repobilityId": "46c468189673e28f", "scanner": "scanner-primary", "fingerprint": "c2359d868552c16e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b6b613c938ce2ea", "level": "note", "message": {"text": "Legacy-named symbol `enhanced_v1` in worker/app/forex_scanner/core/scanner.py:1078"}, "properties": {"repobilityId": "18cbbd4898753b03", "scanner": "scanner-primary", "fingerprint": "1b6b613c938ce2ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-82b13cb7a6307fe2", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/scanner.py:741"}, "properties": {"repobilityId": "c9a39d568377c833", "scanner": "scanner-primary", "fingerprint": "82b13cb7a6307fe2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b44e8d714cb158c1", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/core/backtesting/backtest_trailing_engine.py:354"}, "properties": {"repobilityId": "668a5d0332cd0dee", "scanner": "scanner-primary", "fingerprint": "b44e8d714cb158c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6805b7fbd61f0199", "level": "note", "message": {"text": "Legacy-named symbol `_enhance_signal_metadata_v2` in worker/app/forex_scanner/core/processing/signal_processor.py:428"}, "properties": {"repobilityId": "52206d8cb5a9ea3b", "scanner": "scanner-primary", "fingerprint": "6805b7fbd61f0199", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e7159bb302f9014d", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in worker/app/forex_scanner/core/intelligence/order_flow_analyzer.py:284"}, "properties": {"repobilityId": "e858a29be02c2225", "scanner": "scanner-primary", "fingerprint": "e7159bb302f9014d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1902ad3136223dfe", "level": "error", "message": {"text": "Blocking `time.sleep(...)` inside `async def test_performance_counter_accuracy` \u2014 worker/app/forex_scanner/core/concurrent_execution/integration_test.py:143"}, "properties": {"repobilityId": "6b78143c997d56fd", "scanner": "scanner-primary", "fingerprint": "1902ad3136223dfe", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/app/forex_scanner/core/concurrent_execution/integration_test.py"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-be7f1430f3ab6ff8", "level": "note", "message": {"text": "Stub function `start` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/concurrent_execution/backtest_execution_manager.py:707"}, "properties": {"repobilityId": "9bbe1a532461e6d2", "scanner": "scanner-primary", "fingerprint": "be7f1430f3ab6ff8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-d61e998e5749f84b", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/core/strategies/smc_simple_strategy.py:1145"}, "properties": {"repobilityId": "bbb97a2ff07ce85c", "scanner": "scanner-primary", "fingerprint": "d61e998e5749f84b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0394b0563b8fb7f5", "level": "note", "message": {"text": "Legacy-named symbol `kama_old` in worker/app/forex_scanner/core/strategies/kama_v2_strategy.py:324"}, "properties": {"repobilityId": "a8dc871a2fa4ad68", "scanner": "scanner-primary", "fingerprint": "0394b0563b8fb7f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-05eddc4787e88046", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/range_fade_strategy.py:307"}, "properties": {"repobilityId": "524c0a463a79fd85", "scanner": "scanner-primary", "fingerprint": "05eddc4787e88046", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3dedf45023b8117", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/strategy_registry.py:317"}, "properties": {"repobilityId": "111e8d976806f05e", "scanner": "scanner-primary", "fingerprint": "c3dedf45023b8117", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-699ef50c1fb891cc", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/app/forex_scanner/core/strategies/xau_gold_strategy.py:246"}, "properties": {"repobilityId": "ecd651de7f6846e3", "scanner": "scanner-primary", "fingerprint": "699ef50c1fb891cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dee80fcc5272305f", "level": "note", "message": {"text": "Legacy-named symbol `smc_simple_v2` in worker/app/forex_scanner/core/strategies/smc_simple_v2_strategy.py:73"}, "properties": {"repobilityId": "e5bd2907ceceaa35", "scanner": "scanner-primary", "fingerprint": "dee80fcc5272305f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b693d03f1fcbde48", "level": "note", "message": {"text": "Stub function `reset_cooldowns` (body is just `pass`/`return`) \u2014 worker/app/forex_scanner/core/strategies/smc_simple_v2_strategy.py:108"}, "properties": {"repobilityId": "95de559c8983abef", "scanner": "scanner-primary", "fingerprint": "b693d03f1fcbde48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-0433a47898b45e7f", "level": "note", "message": {"text": "Legacy-named symbol `_calculate_confidence_legacy` in worker/app/forex_scanner/core/strategies/base_strategy.py:103"}, "properties": {"repobilityId": "aacb863c7e68392a", "scanner": "scanner-primary", "fingerprint": "0433a47898b45e7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cdaacaab321ada67", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/strategies/templates/strategy_template.py:313"}, "properties": {"repobilityId": "c0996b9dd98ac261", "scanner": "scanner-primary", "fingerprint": "cdaacaab321ada67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15aaf30a7d4081f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trading_orchestrator.py:1865"}, "properties": {"repobilityId": "77e4a450d5503bf1", "scanner": "scanner-primary", "fingerprint": "15aaf30a7d4081f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fb2e375370d5cee", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/app/forex_scanner/core/trading/trade_validator.py:1535"}, "properties": {"repobilityId": "3964d1cdd2cb8c94", "scanner": "scanner-primary", "fingerprint": "6fb2e375370d5cee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94751e52ef41d137", "level": "note", "message": {"text": "Legacy-named symbol `backtest_v1` in worker/app/forex_scanner/core/trading/backtest_trading_orchestrator.py:393"}, "properties": {"repobilityId": "e94f69bf6f7b33f1", "scanner": "scanner-primary", "fingerprint": "94751e52ef41d137", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9e3cc52649a51431", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/app/forex_scanner/core/detection/large_candle_filter.py:337"}, "properties": {"repobilityId": "5904ae43325999b7", "scanner": "scanner-primary", "fingerprint": "9e3cc52649a51431", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5556d31aa9d65b2", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/check_actual_corruption.py:79"}, "properties": {"repobilityId": "6406b5df1eeec9d8", "scanner": "scanner-primary", "fingerprint": "a5556d31aa9d65b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f19ae1516155029d", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/fill_specific_gap.py:101"}, "properties": {"repobilityId": "b549947d778b7775", "scanner": "scanner-primary", "fingerprint": "f19ae1516155029d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71198e8cfc37bef1", "level": "error", "message": {"text": "Blocking `requests.get(...)` inside `async def fill_specific_gap` \u2014 stream-app/validation/fill_specific_gap.py:101"}, "properties": {"repobilityId": "4351bf6eb05534d7", "scanner": "scanner-primary", "fingerprint": "71198e8cfc37bef1", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/validation/fill_specific_gap.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-83bc70d04ab4a58d", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 stream-app/validation/correct_specific_entries.py:91"}, "properties": {"repobilityId": "80defb42ea136da1", "scanner": "scanner-primary", "fingerprint": "83bc70d04ab4a58d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a3ccadd429231ee", "level": "error", "message": {"text": "Blocking `requests.get(...)` inside `async def correct_specific_entries` \u2014 stream-app/validation/correct_specific_entries.py:91"}, "properties": {"repobilityId": "dd2da4124d754d9d", "scanner": "scanner-primary", "fingerprint": "9a3ccadd429231ee", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/validation/correct_specific_entries.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-7f849788a22c8c0d", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in stream-app/maintenance/mark_old_failed_gaps.py:23"}, "properties": {"repobilityId": "cf72a5502f801f52", "scanner": "scanner-primary", "fingerprint": "7f849788a22c8c0d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b56e56b97d373fef", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in streamlit/components/tabs/ema_rejections_tab.py:219"}, "properties": {"repobilityId": "db08fe7c535db063", "scanner": "scanner-primary", "fingerprint": "b56e56b97d373fef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-74522760706c9aba", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in streamlit/components/tabs/smc_rejections_tab.py:859"}, "properties": {"repobilityId": "8a9b32772e7a0e0b", "scanner": "scanner-primary", "fingerprint": "74522760706c9aba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e1b14d7d58d9faa3", "level": "note", "message": {"text": "Legacy-named symbol `enhanced_backup` in streamlit/pages/forex_documentation.py:507"}, "properties": {"repobilityId": "e5d7c8097212fad6", "scanner": "scanner-primary", "fingerprint": "e1b14d7d58d9faa3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e34e7d289218d0f1", "level": "note", "message": {"text": "Legacy-named symbol `s_copy` in streamlit/pages/tvchart.py:1356"}, "properties": {"repobilityId": "072bb108670f15c5", "scanner": "scanner-primary", "fingerprint": "e34e7d289218d0f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-871362acccd7afb9", "level": "none", "message": {"text": "Commented-code block (7 lines) in streamlit/services/stock_analytics_service.py:1655"}, "properties": {"repobilityId": "0ba62b99550ce010", "scanner": "scanner-primary", "fingerprint": "871362acccd7afb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bc0033ea4a69a50", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 streamlit/services/backtest_runner_service.py:289"}, "properties": {"repobilityId": "f1b422016d5b1056", "scanner": "scanner-primary", "fingerprint": "3bc0033ea4a69a50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a3f437754ebd4a5", "level": "none", "message": {"text": "Commented-code block (10 lines) in dev-app/config.py:188"}, "properties": {"repobilityId": "d4b35a3a73329e18", "scanner": "scanner-primary", "fingerprint": "6a3f437754ebd4a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba229b1a9a4d663a", "level": "none", "message": {"text": "Commented-code block (6 lines) in dev-app/config_virtual_stop.py:64"}, "properties": {"repobilityId": "a05c846fbd6ae948", "scanner": "scanner-primary", "fingerprint": "ba229b1a9a4d663a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c9cb97c1b8b6bc9", "level": "none", "message": {"text": "Commented-code block (7 lines) in dev-app/services/trade_pnl_correlator.py:466"}, "properties": {"repobilityId": "ec888be327725e20", "scanner": "scanner-primary", "fingerprint": "0c9cb97c1b8b6bc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e4c5915aa8eca24", "level": "none", "message": {"text": "Commented-code block (5 lines) in dev-app/services/adjust_stop_service.py:314"}, "properties": {"repobilityId": "78b2850aeeadd5e7", "scanner": "scanner-primary", "fingerprint": "0e4c5915aa8eca24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18b47658abb16961", "level": "none", "message": {"text": "Commented-code block (6 lines) in dev-app/routers/orders_router.py:844"}, "properties": {"repobilityId": "5d4603e648d7a644", "scanner": "scanner-primary", "fingerprint": "18b47658abb16961", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-badd3b0d655e1d1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/CandlestickChart.tsx:311"}, "properties": {"repobilityId": "28bbbd26b0a0d4e5", "scanner": "scanner-primary", "fingerprint": "badd3b0d655e1d1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0918900bbc0b766", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ScannerContextPanel.tsx:57"}, "properties": {"repobilityId": "25ea889a6d1529d9", "scanner": "scanner-primary", "fingerprint": "d0918900bbc0b766", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27a53356627bef09", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/components/settings/ParameterContextPanel.tsx:50"}, "properties": {"repobilityId": "bde2a2982849f777", "scanner": "scanner-primary", "fingerprint": "27a53356627bef09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d5cb0cbcc769b9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/page.tsx:278"}, "properties": {"repobilityId": "f1a80453fe9da76c", "scanner": "scanner-primary", "fingerprint": "0d5cb0cbcc769b9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-927ca50295074fb2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/page.tsx:30"}, "properties": {"repobilityId": "80ae37c2735e25c4", "scanner": "scanner-primary", "fingerprint": "927ca50295074fb2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8e6fc1adf5c41cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/strategy/page.tsx:846"}, "properties": {"repobilityId": "944bda21b7b64478", "scanner": "scanner-primary", "fingerprint": "a8e6fc1adf5c41cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-491a7b9bd69085b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/settings/audit/page.tsx:29"}, "properties": {"repobilityId": "f880d53cc3b03e3a", "scanner": "scanner-primary", "fingerprint": "491a7b9bd69085b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-659e71beba05628e", "level": "none", "message": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/strategy/status-summary/route.ts:21"}, "properties": {"repobilityId": "4f709e1419e6c8e1", "scanner": "scanner-primary", "fingerprint": "659e71beba05628e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbe81ace8623c07f", "level": "note", "message": {"text": "Legacy-named symbol `smc_strategy_v2` in trading-ui/app/api/settings/strategy/smc/snapshots/route.ts:23"}, "properties": {"repobilityId": "8be28c67663f48f0", "scanner": "scanner-primary", "fingerprint": "dbe81ace8623c07f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-416ede9ada7af82d", "level": "none", "message": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/route.ts:90"}, "properties": {"repobilityId": "637fa99f40796145", "scanner": "scanner-primary", "fingerprint": "416ede9ada7af82d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3708c4ddd6be0c80", "level": "none", "message": {"text": "Commented-code block (5 lines) in trading-ui/app/api/settings/trailing/audit/route.ts:12"}, "properties": {"repobilityId": "4289c22943be37ff", "scanner": "scanner-primary", "fingerprint": "3708c4ddd6be0c80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fb234fb99792a26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/orders/place/route.ts:178"}, "properties": {"repobilityId": "ffa4ccf8ba4795a0", "scanner": "scanner-primary", "fingerprint": "3fb234fb99792a26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df94f6e31f8bdbc3", "level": "none", "message": {"text": "Commented-code block (6 lines) in trading-ui/app/api/signals/top/route.ts:12"}, "properties": {"repobilityId": "efebe2c07ea4abaa", "scanner": "scanner-primary", "fingerprint": "df94f6e31f8bdbc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36bcbe586e3987f8", "level": "none", "message": {"text": "Commented-code block (8 lines) in trading-ui/app/api/forex/monitor-outcomes/route.ts:65"}, "properties": {"repobilityId": "7222b80db65997c7", "scanner": "scanner-primary", "fingerprint": "36bcbe586e3987f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-708ac866fb376bca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/api/forex/smc-rejections/outcomes/route.ts:11"}, "properties": {"repobilityId": "f014fa96d492dc9f", "scanner": "scanner-primary", "fingerprint": "708ac866fb376bca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-461c79ace4ab6718", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/signals/page.tsx:456"}, "properties": {"repobilityId": "b4cd4b642bec7976", "scanner": "scanner-primary", "fingerprint": "461c79ace4ab6718", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ead97a3457a74745", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/stocks/[ticker]/page.tsx:311"}, "properties": {"repobilityId": "004aa60c2456bd0b", "scanner": "scanner-primary", "fingerprint": "ead97a3457a74745", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f1fc227e995b72d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/page.tsx:507"}, "properties": {"repobilityId": "b87b61941758ec20", "scanner": "scanner-primary", "fingerprint": "9f1fc227e995b72d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1c5e128b985162a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/system/log-search/page.tsx:179"}, "properties": {"repobilityId": "9f22ae5374ab3a58", "scanner": "scanner-primary", "fingerprint": "a1c5e128b985162a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e4eacfd6e4332e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/sw.js/route.ts:49"}, "properties": {"repobilityId": "3f992d710bd9d2b4", "scanner": "scanner-primary", "fingerprint": "7e4eacfd6e4332e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7279a6560063ec3b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/market/page.tsx:78"}, "properties": {"repobilityId": "fde88dd9996b5cb7", "scanner": "scanner-primary", "fingerprint": "7279a6560063ec3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ca840f4ffa747e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/infrastructure/page.tsx:109"}, "properties": {"repobilityId": "132082f4dd40c409", "scanner": "scanner-primary", "fingerprint": "9ca840f4ffa747e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6f90396d8477b69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/watchlists/page.tsx:256"}, "properties": {"repobilityId": "263171119ad9036d", "scanner": "scanner-primary", "fingerprint": "a6f90396d8477b69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-710d40d971e7a99a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/trade-analysis/page.tsx:97"}, "properties": {"repobilityId": "d14ea6ca32178083", "scanner": "scanner-primary", "fingerprint": "710d40d971e7a99a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93d084659b8b4766", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/validator-rejections/page.tsx:185"}, "properties": {"repobilityId": "7554d8abe06ae340", "scanner": "scanner-primary", "fingerprint": "93d084659b8b4766", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98145523886de1fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/forex/smc-rejections/page.tsx:153"}, "properties": {"repobilityId": "3cd4e3d58cefca84", "scanner": "scanner-primary", "fingerprint": "98145523886de1fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bd6f3466c482b0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/app/broker/page.tsx:108"}, "properties": {"repobilityId": "f31ce042d7e9b20f", "scanner": "scanner-primary", "fingerprint": "3bd6f3466c482b0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50148f2aa6827f9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useSnapshots.ts:58"}, "properties": {"repobilityId": "fa991e9f4b7e56cb", "scanner": "scanner-primary", "fingerprint": "50148f2aa6827f9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b50c8b0e2c91c05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingRatios.ts:70"}, "properties": {"repobilityId": "1d2b45f8565fd749", "scanner": "scanner-primary", "fingerprint": "5b50c8b0e2c91c05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4defdbe770896047", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/useTrailingConfig.ts:64"}, "properties": {"repobilityId": "66b3ae9f265fd8fa", "scanner": "scanner-primary", "fingerprint": "4defdbe770896047", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f25a8a718531266e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/hooks/settings/usePairOverrides.ts:47"}, "properties": {"repobilityId": "45c280630aace2b0", "scanner": "scanner-primary", "fingerprint": "f25a8a718531266e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2658a52ff6429d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 trading-ui/public/sw.js:53"}, "properties": {"repobilityId": "0e4425fc6d8ffc68", "scanner": "scanner-primary", "fingerprint": "a2658a52ff6429d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b673918452ee2583", "level": "note", "message": {"text": "70 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "abf836fe9ec81133", "scanner": "scanner-primary", "fingerprint": "b673918452ee2583", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0622831e6a3c2aac", "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": "4367b60278c33b63", "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": "dd8ca225b853fe76", "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": "c81c2f533a8229fe", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "736b8b58c9a760c9", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "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": "203e98516152e2fd", "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": "5a59532f176aee5d", "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": "15e9cdc48308f652", "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": "df394bae5f4d9492", "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": "61ff4d6a1db99b3a", "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": "34b7d489173572e6", "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": "83118e5c64580eb2", "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": "33e6f5983f9fa94b", "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": "3f904bbfb1a118c9", "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": "ba79817c9c5f8568", "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": "f61a434851b1f4e2", "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": "279b1fa7af23ab85", "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": "294350dc369e9afd", "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": "ec3f9bca8240ecbf", "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": "93b296a97d548035", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-f1ab6fa8e9f73154", "level": "error", "message": {"text": "FastAPI POST `claude_analyze` without auth dependency \u2014 fastapi-general/app/main.py:55"}, "properties": {"repobilityId": "7ccf4967ffe2ebc7", "scanner": "scanner-primary", "fingerprint": "f1ab6fa8e9f73154", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fastapi-general/app/main.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-1c053abe4479628f", "level": "error", "message": {"text": "FastAPI POST `claude_analyze_watchlist` without auth dependency \u2014 fastapi-general/app/main.py:98"}, "properties": {"repobilityId": "1eacd998ccc7988d", "scanner": "scanner-primary", "fingerprint": "1c053abe4479628f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fastapi-general/app/main.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-7c8c3dc7056bd974", "level": "error", "message": {"text": "FastAPI POST `block_root` without auth dependency \u2014 prod-app/main.py:135"}, "properties": {"repobilityId": "d57d2c0f980d3f94", "scanner": "scanner-primary", "fingerprint": "7c8c3dc7056bd974", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prod-app/main.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-929beadc48e296d5", "level": "error", "message": {"text": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.py:44"}, "properties": {"repobilityId": "ebee1ca6d01a21af", "scanner": "scanner-primary", "fingerprint": "929beadc48e296d5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prod-app/routers/position_closer_router.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-f12228d9b3cbc116", "level": "error", "message": {"text": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 prod-app/routers/position_closer_router.py:76"}, "properties": {"repobilityId": "403861f756132587", "scanner": "scanner-primary", "fingerprint": "f12228d9b3cbc116", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prod-app/routers/position_closer_router.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-f2e32e68d296afe5", "level": "error", "message": {"text": "FastAPI POST `start_stream` without auth dependency \u2014 stream-app/routers/stream_router.py:28"}, "properties": {"repobilityId": "3bc780620b406ad0", "scanner": "scanner-primary", "fingerprint": "f2e32e68d296afe5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/routers/stream_router.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-af693333ac9cdd2e", "level": "error", "message": {"text": "FastAPI POST `stop_stream` without auth dependency \u2014 stream-app/routers/stream_router.py:67"}, "properties": {"repobilityId": "8c18ee2db62678f2", "scanner": "scanner-primary", "fingerprint": "af693333ac9cdd2e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/routers/stream_router.py"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-1f6b69805b2d7c2b", "level": "error", "message": {"text": "FastAPI POST `track_trade` without auth dependency \u2014 stream-app/routers/stream_router.py:108"}, "properties": {"repobilityId": "207abd384b4b21cc", "scanner": "scanner-primary", "fingerprint": "1f6b69805b2d7c2b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/routers/stream_router.py"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-cbdde8ede3b10e27", "level": "error", "message": {"text": "FastAPI DELETE `stop_tracking_trade` without auth dependency \u2014 stream-app/routers/stream_router.py:146"}, "properties": {"repobilityId": "aa0b445d4b8561b6", "scanner": "scanner-primary", "fingerprint": "cbdde8ede3b10e27", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stream-app/routers/stream_router.py"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-ec01c45a47c6bbc5", "level": "error", "message": {"text": "FastAPI POST `block_root` without auth dependency \u2014 dev-app/main.py:856"}, "properties": {"repobilityId": "719bd0827a1de3fb", "scanner": "scanner-primary", "fingerprint": "ec01c45a47c6bbc5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/main.py"}, "region": {"startLine": 856}}}]}, {"ruleId": "scanner-576961daba4a7e71", "level": "error", "message": {"text": "FastAPI POST `check_and_close_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:58"}, "properties": {"repobilityId": "e012729852e2536f", "scanner": "scanner-primary", "fingerprint": "576961daba4a7e71", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/position_closer_router.py"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-9943eb35c74cfff3", "level": "error", "message": {"text": "FastAPI POST `manual_close_all_positions_endpoint` without auth dependency \u2014 dev-app/routers/position_closer_router.py:91"}, "properties": {"repobilityId": "3729d6c31aadd305", "scanner": "scanner-primary", "fingerprint": "9943eb35c74cfff3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/position_closer_router.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-683e06fa54aeeb3f", "level": "error", "message": {"text": "FastAPI POST `calculate_complete_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:57"}, "properties": {"repobilityId": "03af9c85406156d8", "scanner": "scanner-primary", "fingerprint": "683e06fa54aeeb3f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-b9bf6c407ecc8289", "level": "error", "message": {"text": "FastAPI POST `correlate_activity_based_pnl` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:186"}, "properties": {"repobilityId": "26dc92c213d729fb", "scanner": "scanner-primary", "fingerprint": "b9bf6c407ecc8289", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-de2a5ff2167959e1", "level": "error", "message": {"text": "FastAPI POST `fetch_ig_transactions` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:392"}, "properties": {"repobilityId": "002fe3aeec567d79", "scanner": "scanner-primary", "fingerprint": "de2a5ff2167959e1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 392}}}]}, {"ruleId": "scanner-dc628ebd12f86310", "level": "error", "message": {"text": "FastAPI POST `test_activity_extraction` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:862"}, "properties": {"repobilityId": "68b4d525151e4675", "scanner": "scanner-primary", "fingerprint": "dc628ebd12f86310", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 862}}}]}, {"ruleId": "scanner-ee8a894fb7764130", "level": "error", "message": {"text": "FastAPI POST `verify_database_structure` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:965"}, "properties": {"repobilityId": "e4b2805cb39dd236", "scanner": "scanner-primary", "fingerprint": "ee8a894fb7764130", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 965}}}]}, {"ruleId": "scanner-3e59e97c41c805dd", "level": "error", "message": {"text": "FastAPI POST `verify_pnl_calculations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1083"}, "properties": {"repobilityId": "c62dfb02764735b3", "scanner": "scanner-primary", "fingerprint": "3e59e97c41c805dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 1083}}}]}, {"ruleId": "scanner-5ce9d7bc1cc69427", "level": "error", "message": {"text": "FastAPI POST `verify_trade_correlations` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1237"}, "properties": {"repobilityId": "14f169eae2f1bb5a", "scanner": "scanner-primary", "fingerprint": "5ce9d7bc1cc69427", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 1237}}}]}, {"ruleId": "scanner-8172cdd12fef06d0", "level": "error", "message": {"text": "FastAPI POST `inspect_trade_log_entries` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1340"}, "properties": {"repobilityId": "6325f70d1bbf020a", "scanner": "scanner-primary", "fingerprint": "8172cdd12fef06d0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 1340}}}]}, {"ruleId": "scanner-5815229bb23fbddf", "level": "error", "message": {"text": "FastAPI POST `test_database_updates` without auth dependency \u2014 dev-app/routers/trading_analytics_router.py:1446"}, "properties": {"repobilityId": "7d352a73fcb7fc32", "scanner": "scanner-primary", "fingerprint": "5815229bb23fbddf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trading_analytics_router.py"}, "region": {"startLine": 1446}}}]}, {"ruleId": "scanner-934cffcf734497ca", "level": "error", "message": {"text": "FastAPI POST `manual_evaluate` without auth dependency \u2014 dev-app/routers/manual_trigger_router.py:29"}, "properties": {"repobilityId": "b1cb1d8100e7eb40", "scanner": "scanner-primary", "fingerprint": "934cffcf734497ca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/manual_trigger_router.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-a38e327023ce6b73", "level": "error", "message": {"text": "FastAPI POST `run_backtest` without auth dependency \u2014 dev-app/routers/backtest_router.py:214"}, "properties": {"repobilityId": "3daff0f41e2b8757", "scanner": "scanner-primary", "fingerprint": "a38e327023ce6b73", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/backtest_router.py"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-279b756f010b22b8", "level": "error", "message": {"text": "FastAPI POST `run_backtest_async` without auth dependency \u2014 dev-app/routers/backtest_router.py:284"}, "properties": {"repobilityId": "1ccb86bfae894dc3", "scanner": "scanner-primary", "fingerprint": "279b756f010b22b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/backtest_router.py"}, "region": {"startLine": 284}}}]}, {"ruleId": "scanner-211fc081a2f419d7", "level": "error", "message": {"text": "FastAPI POST `run_parameter_variations` without auth dependency \u2014 dev-app/routers/backtest_router.py:483"}, "properties": {"repobilityId": "7c534b95af70af1c", "scanner": "scanner-primary", "fingerprint": "211fc081a2f419d7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/backtest_router.py"}, "region": {"startLine": 483}}}]}, {"ruleId": "scanner-cebd6d5ee1d2853e", "level": "error", "message": {"text": "FastAPI PUT `upsert` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:191"}, "properties": {"repobilityId": "0f3174379ca4598b", "scanner": "scanner-primary", "fingerprint": "cebd6d5ee1d2853e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trailing_config_router.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-95db01dfd3a55ffb", "level": "error", "message": {"text": "FastAPI POST `invalidate_cache` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:225"}, "properties": {"repobilityId": "23be3b28e33d020a", "scanner": "scanner-primary", "fingerprint": "95db01dfd3a55ffb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trailing_config_router.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-93adafa94574c31b", "level": "error", "message": {"text": "FastAPI DELETE `delete` without auth dependency \u2014 dev-app/routers/trailing_config_router.py:232"}, "properties": {"repobilityId": "2837b91872e92acf", "scanner": "scanner-primary", "fingerprint": "93adafa94574c31b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/trailing_config_router.py"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-28e621a55e7c0ae0", "level": "error", "message": {"text": "FastAPI POST `refresh_positions` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:52"}, "properties": {"repobilityId": "afcca9e6abef7f5a", "scanner": "scanner-primary", "fingerprint": "28e621a55e7c0ae0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/virtual_stop_loss_router.py"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-71353fcd32eb28ef", "level": "error", "message": {"text": "FastAPI DELETE `remove_position` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:121"}, "properties": {"repobilityId": "6fb7b2c64f8d2e27", "scanner": "scanner-primary", "fingerprint": "71353fcd32eb28ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/virtual_stop_loss_router.py"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-ff34f0588c83bd0b", "level": "error", "message": {"text": "FastAPI POST `add_position_manual` without auth dependency \u2014 dev-app/routers/virtual_stop_loss_router.py:159"}, "properties": {"repobilityId": "9802877e2c14ccd0", "scanner": "scanner-primary", "fingerprint": "ff34f0588c83bd0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dev-app/routers/virtual_stop_loss_router.py"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-8745a7cd34378b51", "level": "error", "message": {"text": "FastAPI POST `restart_container` without auth dependency \u2014 system-monitor/app/api/routes.py:189"}, "properties": {"repobilityId": "fd56de0c3f6dfa08", "scanner": "scanner-primary", "fingerprint": "8745a7cd34378b51", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/app/api/routes.py"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-9973c104ac4f4a45", "level": "error", "message": {"text": "FastAPI POST `acknowledge_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:291"}, "properties": {"repobilityId": "82f8b5b78cbb8aaf", "scanner": "scanner-primary", "fingerprint": "9973c104ac4f4a45", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/app/api/routes.py"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-b50176c6a4522077", "level": "error", "message": {"text": "FastAPI POST `resolve_alert` without auth dependency \u2014 system-monitor/app/api/routes.py:310"}, "properties": {"repobilityId": "f3a19f0ff33ac7c2", "scanner": "scanner-primary", "fingerprint": "b50176c6a4522077", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/app/api/routes.py"}, "region": {"startLine": 310}}}]}, {"ruleId": "scanner-181d8b6d02df7eaf", "level": "error", "message": {"text": "FastAPI POST `test_notification` without auth dependency \u2014 system-monitor/app/api/routes.py:328"}, "properties": {"repobilityId": "7787057c0f395b1b", "scanner": "scanner-primary", "fingerprint": "181d8b6d02df7eaf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "system-monitor/app/api/routes.py"}, "region": {"startLine": 328}}}]}, {"ruleId": "scanner-b6b1297521f6e7ba", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/chart/epics?config_set=${configSet} (trading-ui/components/CandlestickChart.tsx:222)"}, "properties": {"repobilityId": "3fb0800481cb3b66", "scanner": "scanner-primary", "fingerprint": "b6b1297521f6e7ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bde5dc35d3b5677", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/chart/candles?${params} (trading-ui/components/CandlestickChart.tsx:311)"}, "properties": {"repobilityId": "0fbf7ec8ad2f91b4", "scanner": "scanner-primary", "fingerprint": "7bde5dc35d3b5677", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d7edf59b79ac555a", "level": "error", "message": {"text": "Dangling fetch: POST /trading/api/orders/place (trading-ui/components/PlaceOrderForm.tsx:54)"}, "properties": {"repobilityId": "6dd19e68e95d0200", "scanner": "scanner-primary", "fingerprint": "d7edf59b79ac555a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf8231d0373f1ebe", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/infra/containers/${encodeURIComponent(containerName)}/logs?lines=${lines} (trading-ui/components/ops/ContainerLogsDrawer.tsx:20)"}, "properties": {"repobilityId": "86d46bb33cdc6681", "scanner": "scanner-primary", "fingerprint": "bf8231d0373f1ebe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ef9a643fb01b7fc", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/market/regime (trading-ui/app/page.tsx:276)"}, "properties": {"repobilityId": "cb28f29eba4c71f6", "scanner": "scanner-primary", "fingerprint": "8ef9a643fb01b7fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97762bf46d427397", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/infra/status (trading-ui/app/page.tsx:277)"}, "properties": {"repobilityId": "a42aa0b2b4aaa39a", "scanner": "scanner-primary", "fingerprint": "97762bf46d427397", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd62565332c75515", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/infra/alerts/active (trading-ui/app/page.tsx:278)"}, "properties": {"repobilityId": "a8be01e4ede03a43", "scanner": "scanner-primary", "fingerprint": "dd62565332c75515", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9764878dc65a76f3", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/infra/containers (trading-ui/app/page.tsx:279)"}, "properties": {"repobilityId": "0548d91c77bf6fe7", "scanner": "scanner-primary", "fingerprint": "9764878dc65a76f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90210aa042164251", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/stream/summary (trading-ui/app/page.tsx:280)"}, "properties": {"repobilityId": "5a905151dcd1f28f", "scanner": "scanner-primary", "fingerprint": "90210aa042164251", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-093aece440582874", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/stream/operations/recent?limit=5 (trading-ui/app/page.tsx:281)"}, "properties": {"repobilityId": "b6653e5ec35b5e37", "scanner": "scanner-primary", "fingerprint": "093aece440582874", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02832917fcf568ea", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/alert-history/?days=1&page=1&limit=5&status=All&strategy=All&pair=All&env=${environment} (trading-ui/app/page.tsx:282)"}, "properties": {"repobilityId": "2f65a9257cae1779", "scanner": "scanner-primary", "fingerprint": "02832917fcf568ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9121ed8b514cd55", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/overview/?days=7&env=${environment} (trading-ui/app/page.tsx:285)"}, "properties": {"repobilityId": "4d7668d842d5ba8e", "scanner": "scanner-primary", "fingerprint": "a9121ed8b514cd55", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e2933d1c0e0294c", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/market-intelligence/?env=${environment} (trading-ui/app/page.tsx:286)"}, "properties": {"repobilityId": "66fd2645bde56987", "scanner": "scanner-primary", "fingerprint": "2e2933d1c0e0294c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c86e052192e6b444", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/broker/overview?days=7 (trading-ui/app/page.tsx:287)"}, "properties": {"repobilityId": "e64b4e17a8edddb9", "scanner": "scanner-primary", "fingerprint": "c86e052192e6b444", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-916d43dfbb42348e", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/page.tsx:288)"}, "properties": {"repobilityId": "4047c327838058c4", "scanner": "scanner-primary", "fingerprint": "916d43dfbb42348e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72de4ccfe5db5523", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/market/holiday (trading-ui/app/forex/page.tsx:159)"}, "properties": {"repobilityId": "20a8e7112a804b50", "scanner": "scanner-primary", "fingerprint": "72de4ccfe5db5523", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a0431f0105f3c8c9", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/overview/?days=${overviewDays}&env=${environment} (trading-ui/app/forex/page.tsx:169)"}, "properties": {"repobilityId": "199d452efbdf9428", "scanner": "scanner-primary", "fingerprint": "a0431f0105f3c8c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b45141cc6c9f0b1", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/analysis/?days=${analysisDays}&env=${environment} (trading-ui/app/forex/page.tsx:187)"}, "properties": {"repobilityId": "6e1720cb74a388cb", "scanner": "scanner-primary", "fingerprint": "8b45141cc6c9f0b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-484e1c21af7ab604", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/unfilled-orders/ (trading-ui/app/forex/unfilled-orders/page.tsx:109)"}, "properties": {"repobilityId": "493d7a0f14c81c17", "scanner": "scanner-primary", "fingerprint": "484e1c21af7ab604", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e28c534f8603634", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/analysis/?days=${days}&env=${environment} (trading-ui/app/forex/strategy/page.tsx:67)"}, "properties": {"repobilityId": "b1da27d4ee8d0e6d", "scanner": "scanner-primary", "fingerprint": "2e28c534f8603634", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1ae0760db56a7ae", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/monitor-outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/monitor-outcomes/page.tsx:114)"}, "properties": {"repobilityId": "482d8f4300b9de0f", "scanner": "scanner-primary", "fingerprint": "a1ae0760db56a7ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-120affa10432f0eb", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/entry-timing/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)} (trading-ui/app/forex/entry-timing/page.tsx:123)"}, "properties": {"repobilityId": "591d988c0d44829a", "scanner": "scanner-primary", "fingerprint": "120affa10432f0eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e87d733741ec7346", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/options (trading-ui/app/forex/strategy-rejections/page.tsx:205)"}, "properties": {"repobilityId": "0b52fc666865feef", "scanner": "scanner-primary", "fingerprint": "e87d733741ec7346", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe9251d82ae7c1e1", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/stats?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:216)"}, "properties": {"repobilityId": "06e4d32f615eecbe", "scanner": "scanner-primary", "fingerprint": "fe9251d82ae7c1e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-79080c79501646a8", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/top-stages?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:217)"}, "properties": {"repobilityId": "f1a4227a46bc23f2", "scanner": "scanner-primary", "fingerprint": "79080c79501646a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-db01f51a70677860", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/strategy-rejections/list?${params} (trading-ui/app/forex/strategy-rejections/page.tsx:240)"}, "properties": {"repobilityId": "c8fe8459d78f2149", "scanner": "scanner-primary", "fingerprint": "db01f51a70677860", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1fdaf599a18c3e2", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/economic-calendar?${params.toString()} (trading-ui/app/forex/economic-calendar/page.tsx:166)"}, "properties": {"repobilityId": "00feab2c85580edb", "scanner": "scanner-primary", "fingerprint": "b1fdaf599a18c3e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc1ed9becc580392", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/market/holidays?days=${holidayDays} (trading-ui/app/forex/economic-calendar/page.tsx:181)"}, "properties": {"repobilityId": "88219517b0436343", "scanner": "scanner-primary", "fingerprint": "cc1ed9becc580392", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4254f7672e30863a", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/filter-effectiveness/?days=${days}&env=${environment} (trading-ui/app/forex/filter-effectiveness/page.tsx:71)"}, "properties": {"repobilityId": "54f037efa22f3154", "scanner": "scanner-primary", "fingerprint": "4254f7672e30863a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e36645888a3ab6a7", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/htf-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/htf-analysis/page.tsx:130)"}, "properties": {"repobilityId": "bc7206eda58334d5", "scanner": "scanner-primary", "fingerprint": "e36645888a3ab6a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ce32471d6a2b478", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/alert-history/?${params.toString()}&env=${environment} (trading-ui/app/forex/alert-history/page.tsx:96)"}, "properties": {"repobilityId": "24a1093d9cc24427", "scanner": "scanner-primary", "fingerprint": "6ce32471d6a2b478", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-03e9037d5c8af491", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/trades/?${params} (trading-ui/app/forex/trade-analysis/page.tsx:76)"}, "properties": {"repobilityId": "83a7f4630c7c5b2d", "scanner": "scanner-primary", "fingerprint": "03e9037d5c8af491", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1e66ec058555f135", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/postmortem/?tradeId=${id}&env=${env} (trading-ui/app/forex/trade-analysis/page.tsx:97)"}, "properties": {"repobilityId": "4ab5134172f761cc", "scanner": "scanner-primary", "fingerprint": "1e66ec058555f135", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b10cae5ef1558cd", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/trade-analysis/chart-data/?tradeId=${id}&env=${environment} (trading-ui/app/forex/trade-analysis/page.tsx:125)"}, "properties": {"repobilityId": "066d90da13d2da71", "scanner": "scanner-primary", "fingerprint": "3b10cae5ef1558cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69bbe8d67e4fa0c9", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/mae-analysis/?days=${days}&env=${environment} (trading-ui/app/forex/mae-analysis/page.tsx:123)"}, "properties": {"repobilityId": "8485017238405de4", "scanner": "scanner-primary", "fingerprint": "69bbe8d67e4fa0c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-960030fefba91de6", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/adx-regime/?days=${days} (trading-ui/app/forex/adx-regime/page.tsx:250)"}, "properties": {"repobilityId": "7338df8e9476eb13", "scanner": "scanner-primary", "fingerprint": "960030fefba91de6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc9de62547df8d46", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/options/?env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:173)"}, "properties": {"repobilityId": "1d42595b25079636", "scanner": "scanner-primary", "fingerprint": "fc9de62547df8d46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d473753de4433c3f", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:185)"}, "properties": {"repobilityId": "23bab493e08a475a", "scanner": "scanner-primary", "fingerprint": "d473753de4433c3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa79bc489e46b863", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/list/?${params}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:186)"}, "properties": {"repobilityId": "089987d3382dc26e", "scanner": "scanner-primary", "fingerprint": "fa79bc489e46b863", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df7a6badebcdacc8", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/validator-rejections/lpf/?days=${days}&env=${environment} (trading-ui/app/forex/validator-rejections/page.tsx:187)"}, "properties": {"repobilityId": "9a682173dd025439", "scanner": "scanner-primary", "fingerprint": "df7a6badebcdacc8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a605897298308eea", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/alert-data?${query}&env=${environment} (trading-ui/app/forex/alert-data/page.tsx:53)"}, "properties": {"repobilityId": "76acc53228844d8a", "scanner": "scanner-primary", "fingerprint": "a605897298308eea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0dbcec14e3c58560", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/claude-rejections/?${params.toString()} (trading-ui/app/forex/claude-rejections/page.tsx:206)"}, "properties": {"repobilityId": "e84755c408c1a4f8", "scanner": "scanner-primary", "fingerprint": "0dbcec14e3c58560", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f1e5a9c26a2cee3d", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/options/?env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:136)"}, "properties": {"repobilityId": "d8c08e4998e827e4", "scanner": "scanner-primary", "fingerprint": "f1e5a9c26a2cee3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3608d23380b8ae92", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/stats/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:153)"}, "properties": {"repobilityId": "b240f09b254fa3ad", "scanner": "scanner-primary", "fingerprint": "3608d23380b8ae92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd89fd0bd806d614", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/list/?${params.toString()}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:154)"}, "properties": {"repobilityId": "d4b142d58dacd094", "scanner": "scanner-primary", "fingerprint": "dd89fd0bd806d614", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a30060fba0eebd2", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/conflicts/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:157)"}, "properties": {"repobilityId": "be754196db61667f", "scanner": "scanner-primary", "fingerprint": "4a30060fba0eebd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed79f0c10005d27d", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/smc-rejections/outcomes/?days=${days}&env=${environment} (trading-ui/app/forex/smc-rejections/page.tsx:160)"}, "properties": {"repobilityId": "bd272d823dc10d71", "scanner": "scanner-primary", "fingerprint": "ed79f0c10005d27d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94bedb10adcc6e53", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/backtests/?${params}&env=${environment} (trading-ui/app/forex/backtests/page.tsx:65)"}, "properties": {"repobilityId": "af6f8d6534243a09", "scanner": "scanner-primary", "fingerprint": "94bedb10adcc6e53", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f8a95f9954beaec", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:88)"}, "properties": {"repobilityId": "940e13704bd6e4e3", "scanner": "scanner-primary", "fingerprint": "0f8a95f9954beaec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e09b773449afea77", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/backtests/jobs/${selectedJobId}/ (trading-ui/app/forex/backtests/page.tsx:105)"}, "properties": {"repobilityId": "6d3bea88e5a02b2e", "scanner": "scanner-primary", "fingerprint": "e09b773449afea77", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b3dbf813b7e8acb", "level": "error", "message": {"text": "Dangling fetch: POST /trading/api/forex/backtests/ (trading-ui/app/forex/backtests/page.tsx:154)"}, "properties": {"repobilityId": "bd909f1a79124b30", "scanner": "scanner-primary", "fingerprint": "5b3dbf813b7e8acb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4393f6b2cd72648d", "level": "error", "message": {"text": "Dangling fetch: POST /trading/api/forex/backtests/jobs/${jobId}/${action}/ (trading-ui/app/forex/backtests/page.tsx:182)"}, "properties": {"repobilityId": "ad8a2ae08f624312", "scanner": "scanner-primary", "fingerprint": "4393f6b2cd72648d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3de63bef6fc82134", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/backtests/executions/${executionId}/ (trading-ui/app/forex/backtests/[id]/page.tsx:55)"}, "properties": {"repobilityId": "9f198892d556a38f", "scanner": "scanner-primary", "fingerprint": "3de63bef6fc82134", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-941f96cb75eebf69", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/breakeven-optimizer/?days=${days}&env=${environment}&strategy=${encodeURIComponent(strategyFilter)} (trading-ui/app/forex/breakeven-optimizer/page.tsx:94)"}, "properties": {"repobilityId": "cad612ba23f86ae2", "scanner": "scanner-primary", "fingerprint": "941f96cb75eebf69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4552a09e6043ef1", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/market-conditions?${params.toString()} (trading-ui/app/forex/market-conditions/page.tsx:237)"}, "properties": {"repobilityId": "b259e0010f0e2f80", "scanner": "scanner-primary", "fingerprint": "c4552a09e6043ef1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65fcb5b68dd4c30e", "level": "error", "message": {"text": "Dangling fetch: GET /trading/api/forex/trades/?days=${days}&env=${environment} (trading-ui/app/forex/trade-performance/page.tsx:107)"}, "properties": {"repobilityId": "0af0843979ff45af", "scanner": "scanner-primary", "fingerprint": "65fcb5b68dd4c30e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9bd3c203b6aed9ae", "level": "note", "message": {"text": "Unused endpoint: POST /claude/analyze"}, "properties": {"repobilityId": "0d5376752dd3cf84", "scanner": "scanner-primary", "fingerprint": "9bd3c203b6aed9ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7ab8598397a70f5", "level": "note", "message": {"text": "Unused endpoint: POST /claude/analyze-watchlist"}, "properties": {"repobilityId": "c366a8482360a38d", "scanner": "scanner-primary", "fingerprint": "e7ab8598397a70f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "fdb80984598d00dd", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "26b41bb98c888391", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc5a92b082e15c69", "level": "note", "message": {"text": "Unused endpoint: GET /validate"}, "properties": {"repobilityId": "ed566721cd9e545a", "scanner": "scanner-primary", "fingerprint": "fc5a92b082e15c69", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f7ae5c309c8a5c8", "level": "note", "message": {"text": "Unused endpoint: POST /check-and-close"}, "properties": {"repobilityId": "97e6049fe9f19dfa", "scanner": "scanner-primary", "fingerprint": "5f7ae5c309c8a5c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6181e3828c8f462e", "level": "note", "message": {"text": "Unused endpoint: POST /manual-close-all"}, "properties": {"repobilityId": "f02e1519db22b98c", "scanner": "scanner-primary", "fingerprint": "6181e3828c8f462e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afc064028ae39ea9", "level": "note", "message": {"text": "Unused endpoint: GET /history"}, "properties": {"repobilityId": "bf6120bf4d889a95", "scanner": "scanner-primary", "fingerprint": "afc064028ae39ea9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a99d35bebbf4aef6", "level": "note", "message": {"text": "Unused endpoint: GET /next-closure-time"}, "properties": {"repobilityId": "e80cfe2ad4c587d5", "scanner": "scanner-primary", "fingerprint": "a99d35bebbf4aef6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ceac03b0c72ae8c", "level": "note", "message": {"text": "Unused endpoint: POST /place-order"}, "properties": {"repobilityId": "f4f74a22e46e6408", "scanner": "scanner-primary", "fingerprint": "6ceac03b0c72ae8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e9b57ad229a15c9", "level": "note", "message": {"text": "Unused endpoint: GET /sl-tp"}, "properties": {"repobilityId": "e4aca05e5950dcb3", "scanner": "scanner-primary", "fingerprint": "6e9b57ad229a15c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-43269e4e79c2e69e", "level": "note", "message": {"text": "Unused endpoint: GET /events"}, "properties": {"repobilityId": "a5cdd212ad9cd470", "scanner": "scanner-primary", "fingerprint": "43269e4e79c2e69e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4dddda7025a157b", "level": "note", "message": {"text": "Unused endpoint: GET /events/upcoming"}, "properties": {"repobilityId": "186fe6cc32d32724", "scanner": "scanner-primary", "fingerprint": "a4dddda7025a157b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-813efbb4ece16e40", "level": "note", "message": {"text": "Unused endpoint: POST /scrape/manual"}, "properties": {"repobilityId": "7fcdab149c42bfd2", "scanner": "scanner-primary", "fingerprint": "813efbb4ece16e40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70ababfedb9fb876", "level": "note", "message": {"text": "Unused endpoint: GET /scrape/logs"}, "properties": {"repobilityId": "42b4d4a7363d31c0", "scanner": "scanner-primary", "fingerprint": "70ababfedb9fb876", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f387d433fa3574da", "level": "note", "message": {"text": "Unused endpoint: GET /events/currency/{currency}"}, "properties": {"repobilityId": "47348a86e3e253d1", "scanner": "scanner-primary", "fingerprint": "f387d433fa3574da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2289cbc506d185a6", "level": "note", "message": {"text": "Unused endpoint: POST /scheduler/pause/{job_id}"}, "properties": {"repobilityId": "b3cae21fd134b733", "scanner": "scanner-primary", "fingerprint": "2289cbc506d185a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41970900c5f25284", "level": "note", "message": {"text": "Unused endpoint: POST /scheduler/resume/{job_id}"}, "properties": {"repobilityId": "a560440e00cd7460", "scanner": "scanner-primary", "fingerprint": "41970900c5f25284", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2f6e9c3c083928c", "level": "note", "message": {"text": "Unused endpoint: GET /events/impact-analysis"}, "properties": {"repobilityId": "5e00dd2245413349", "scanner": "scanner-primary", "fingerprint": "a2f6e9c3c083928c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0c57be06d53b5aa", "level": "note", "message": {"text": "Unused endpoint: GET /backfill/status"}, "properties": {"repobilityId": "d62dccedcbd13654", "scanner": "scanner-primary", "fingerprint": "e0c57be06d53b5aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c161a5d941ca315f", "level": "note", "message": {"text": "Unused endpoint: GET /backfill/gaps"}, "properties": {"repobilityId": "1295b3c8cd112cbf", "scanner": "scanner-primary", "fingerprint": "c161a5d941ca315f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6f18a04b6a58c4b", "level": "note", "message": {"text": "Unused endpoint: POST /stream/start-stream"}, "properties": {"repobilityId": "c22a194de0cb2be4", "scanner": "scanner-primary", "fingerprint": "b6f18a04b6a58c4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-22a4e7eb344dbdfc", "level": "note", "message": {"text": "Unused endpoint: GET /stream/track-trade"}, "properties": {"repobilityId": "2d50f69411745b99", "scanner": "scanner-primary", "fingerprint": "22a4e7eb344dbdfc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4ee8feab688c847", "level": "note", "message": {"text": "Unused endpoint: GET /stream/status"}, "properties": {"repobilityId": "d1fc758e822b0f8d", "scanner": "scanner-primary", "fingerprint": "d4ee8feab688c847", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d250b54aed84b20", "level": "note", "message": {"text": "Unused endpoint: POST /stream/stop-stream"}, "properties": {"repobilityId": "2e75d78221c17d7b", "scanner": "scanner-primary", "fingerprint": "9d250b54aed84b20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06a90db3dd42934c", "level": "note", "message": {"text": "Unused endpoint: GET /stream/candles/{epic}"}, "properties": {"repobilityId": "8f552797e1b53011", "scanner": "scanner-primary", "fingerprint": "06a90db3dd42934c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93d6f98bd5875809", "level": "note", "message": {"text": "Unused endpoint: GET /stream/candle/latest/{epic}"}, "properties": {"repobilityId": "41d42a24adac91c4", "scanner": "scanner-primary", "fingerprint": "93d6f98bd5875809", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-570f39a517f300c4", "level": "note", "message": {"text": "Unused endpoint: POST /stream/track-trade/{deal_id}"}, "properties": {"repobilityId": "663e9a767c5ba144", "scanner": "scanner-primary", "fingerprint": "570f39a517f300c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31389303ec0ee158", "level": "note", "message": {"text": "Unused endpoint: DELETE /stream/track-trade/{deal_id}"}, "properties": {"repobilityId": "e81fd618d7dbc8e4", "scanner": "scanner-primary", "fingerprint": "31389303ec0ee158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dd98a6a2f18a2c2", "level": "note", "message": {"text": "Unused endpoint: GET /stream/health"}, "properties": {"repobilityId": "d9740408ccba8ce0", "scanner": "scanner-primary", "fingerprint": "3dd98a6a2f18a2c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cccffb039b0fa67", "level": "note", "message": {"text": "Unused endpoint: GET /stream/alerts/recent"}, "properties": {"repobilityId": "6ec17fb1a89801cf", "scanner": "scanner-primary", "fingerprint": "9cccffb039b0fa67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-129797a999d442ac", "level": "note", "message": {"text": "Unused endpoint: GET /stream/operations/recent"}, "properties": {"repobilityId": "226d321147d35f54", "scanner": "scanner-primary", "fingerprint": "129797a999d442ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e08ed7dcf074bd1", "level": "note", "message": {"text": "Unused endpoint: GET /stream/logs/recent"}, "properties": {"repobilityId": "474000db99c39f59", "scanner": "scanner-primary", "fingerprint": "6e08ed7dcf074bd1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b3c5918334052e5", "level": "note", "message": {"text": "Unused endpoint: GET /stream/system/summary"}, "properties": {"repobilityId": "fcf9493dbcc5c8b0", "scanner": "scanner-primary", "fingerprint": "8b3c5918334052e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-337ff3957de42e7d", "level": "note", "message": {"text": "Unused endpoint: GET /monitor-status"}, "properties": {"repobilityId": "c43f6cbf5ea655a2", "scanner": "scanner-primary", "fingerprint": "337ff3957de42e7d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3c93dfc153f428a", "level": "note", "message": {"text": "Unused endpoint: POST /deals/calculate-complete-pnl"}, "properties": {"repobilityId": "c6a92d7909b382fc", "scanner": "scanner-primary", "fingerprint": "c3c93dfc153f428a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7d093f5b4f6aa62", "level": "note", "message": {"text": "Unused endpoint: POST /deals/correlate-activities"}, "properties": {"repobilityId": "8651a4808c65841a", "scanner": "scanner-primary", "fingerprint": "b7d093f5b4f6aa62", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7ce5e1da4e52004", "level": "note", "message": {"text": "Unused endpoint: GET /deals/pnl-calculation-status"}, "properties": {"repobilityId": "9e6d9df007678d8c", "scanner": "scanner-primary", "fingerprint": "d7ce5e1da4e52004", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecca578302b56553", "level": "note", "message": {"text": "Unused endpoint: POST /transactions/fetch-ig"}, "properties": {"repobilityId": "0e3ee73ce4f167b5", "scanner": "scanner-primary", "fingerprint": "ecca578302b56553", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e49f123681f47a4", "level": "note", "message": {"text": "Unused endpoint: GET /transactions/today"}, "properties": {"repobilityId": "c89410ff862eb7c0", "scanner": "scanner-primary", "fingerprint": "1e49f123681f47a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f7541d412d0388b", "level": "note", "message": {"text": "Unused endpoint: POST /transactions/upload"}, "properties": {"repobilityId": "79acc8d634f89c03", "scanner": "scanner-primary", "fingerprint": "9f7541d412d0388b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c30c711d68dc5f9", "level": "note", "message": {"text": "Unused endpoint: GET /statistics"}, "properties": {"repobilityId": "1edc6a680197c577", "scanner": "scanner-primary", "fingerprint": "7c30c711d68dc5f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48a0659fa61cd052", "level": "note", "message": {"text": "Unused endpoint: GET /performance/summary"}, "properties": {"repobilityId": "ff75f40175412db3", "scanner": "scanner-primary", "fingerprint": "48a0659fa61cd052", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb5a3f913bc1b8ad", "level": "note", "message": {"text": "Unused endpoint: GET /ig/connection-test"}, "properties": {"repobilityId": "5ba1b1f6e3ef8a00", "scanner": "scanner-primary", "fingerprint": "cb5a3f913bc1b8ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41646c3235285505", "level": "note", "message": {"text": "Unused endpoint: POST /deals/test-activity-extraction"}, "properties": {"repobilityId": "77519f38cf8af845", "scanner": "scanner-primary", "fingerprint": "41646c3235285505", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54dff8a72943c95d", "level": "note", "message": {"text": "Unused endpoint: POST /verify/database-structure"}, "properties": {"repobilityId": "18559e676592b9a5", "scanner": "scanner-primary", "fingerprint": "54dff8a72943c95d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-375fd2237f8e64fb", "level": "note", "message": {"text": "Unused endpoint: POST /verify/pnl-calculations"}, "properties": {"repobilityId": "66abea31214fc7f3", "scanner": "scanner-primary", "fingerprint": "375fd2237f8e64fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-720860436d66173a", "level": "note", "message": {"text": "Unused endpoint: POST /verify/trade-correlations"}, "properties": {"repobilityId": "bf41a65a139fd83f", "scanner": "scanner-primary", "fingerprint": "720860436d66173a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2e1584d15c79527", "level": "note", "message": {"text": "Unused endpoint: POST /inspect/trade-log"}, "properties": {"repobilityId": "5f84eb5b6ac95b77", "scanner": "scanner-primary", "fingerprint": "e2e1584d15c79527", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d15b70a8b0cc1c5", "level": "note", "message": {"text": "Unused endpoint: POST /test/database-updates"}, "properties": {"repobilityId": "ade5203e6c290caf", "scanner": "scanner-primary", "fingerprint": "7d15b70a8b0cc1c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}