← Legacy view v2 (rp.*)

thysrael/horizon

https://github.com/Thysrael/Horizon · lang: python · LOC: · source: user_submitted

Quality
91.9
Grade A
Security
98.8
Findings
110
2 critical · 61 high
Status
completed
May 24, 2026 01:19
high: 61 medium: 32 info: 10 low: 5 critical: 2
Top rules by occurrence
RuleSeverityCount
MINED108 self.attribute used but never assigned in __init__ high 25
MINED111 Bare except continues silently medium 24
MINED106 Phantom test coverage (assertion-free test) high 22
MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) high 6
COMP001 [COMP001] High cognitive complexity: Function `load_yfinanc… low 4
MINED050 Stub Only Function info 4
SEC136 AI-typical over-broad exception handler swallowing all erro… medium 3
MINED062 Python Dataclass No Fields info 3
MINED006 Overcatch Baseexception high 2
MINED107 Missing Python import (NameError at runtime) critical 2
First 110 findings (severity-sorted)
critical MINED107 Missing Python import (NameError at runtime) CWE-1075
src/mcp/service.py:184 · conf 1.00
[MINED107] Missing import: `warnings` used but not imported: The file uses `warnings.something(...)` but never imports `warnings`. This raises NameError at runtime the first time the line executes.
critical MINED107 Missing Python import (NameError at runtime) CWE-1075
src/services/webhook.py:191 · conf 1.00
[MINED107] Missing import: `platform` used but not imported: The file uses `platform.something(...)` but never imports `platform`. This raises NameError at runtime the first time the line executes.
high COMP001 [COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
src/ai/enricher.py:135 · conf 0.95
[COMP001] High cognitive complexity: Function `_enrich_item` has cognitive complexity 44 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested…
high MINED001 Bare Except Pass CWE-755
src/ai/utils.py:18 · conf 1.00
[MINED001] Bare Except Pass: except: pass or except Exception: pass — silently swallows everything including KeyboardInterrupt and bugs.
high MINED006 Overcatch Baseexception CWE-705
src/main.py:74 · conf 1.00
[MINED006] Overcatch Baseexception: except BaseException: ... — prevents Ctrl+C and SystemExit from working.
high MINED006 Overcatch Baseexception CWE-705
src/services/webhook_cli.py:206 · conf 1.00
[MINED006] Overcatch Baseexception: except BaseException: ... — prevents Ctrl+C and SystemExit from working.
high MINED020 Logging Credential Via Fstring CWE-532
src/services/email.py:46 · conf 1.00
[MINED020] Logging Credential Via Fstring: logger.error(f"failed for {api_key}") — secrets end up in log aggregators / sentry.
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_azure_client.py:46 · conf 1.00
[MINED106] Phantom test coverage: test_raises_when_api_key_missing: Test function `test_raises_when_api_key_missing` runs code but contains no assert / expect / should call — it passes regardless of …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_azure_client.py:53 · conf 1.00
[MINED106] Phantom test coverage: test_raises_when_endpoint_missing: Test function `test_raises_when_endpoint_missing` runs code but contains no assert / expect / should call — it passes regardless o…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_mcp_run_store.py:55 · conf 1.00
[MINED106] Phantom test coverage: test_unsupported_stage_raises: Test function `test_unsupported_stage_raises` runs code but contains no assert / expect / should call — it passes regardless of behavi…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_mcp_run_store.py:63 · conf 1.00
[MINED106] Phantom test coverage: test_missing_run_raises: Test function `test_missing_run_raises` runs code but contains no assert / expect / should call — it passes regardless of behaviour. Adds li…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_mcp_run_store.py:79 · conf 1.00
[MINED106] Phantom test coverage: test_rejects_unsafe_summary_language: Test function `test_rejects_unsafe_summary_language` runs code but contains no assert / expect / should call — it passes regard…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_mcp_run_store.py:87 · conf 1.00
[MINED106] Phantom test coverage: test_missing_artifact_raises: Test function `test_missing_artifact_raises` runs code but contains no assert / expect / should call — it passes regardless of behaviou…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_minimax_client.py:35 · conf 1.00
[MINED106] Phantom test coverage: test_raises_when_api_key_missing: Test function `test_raises_when_api_key_missing` runs code but contains no assert / expect / should call — it passes regardless of …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_storage.py:6 · conf 1.00
[MINED106] Phantom test coverage: test_load_config_missing_file: Test function `test_load_config_missing_file` runs code but contains no assert / expect / should call — it passes regardless of behavi…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:382 · conf 1.00
[MINED106] Phantom test coverage: test_disabled_webhook_skips_notification: Test function `test_disabled_webhook_skips_notification` runs code but contains no assert / expect / should call — it passe…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:691 · conf 1.00
[MINED106] Phantom test coverage: test_http_error_logged: Test function `test_http_error_logged` runs code but contains no assert / expect / should call — it passes regardless of behaviour. Adds line…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:977 · conf 1.00
[MINED106] Phantom test coverage: test_language_filter_skips_non_matching_lang: Test function `test_language_filter_skips_non_matching_lang` runs code but contains no assert / expect / should call — …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1004 · conf 1.00
[MINED106] Phantom test coverage: test_language_filter_passes_matching_lang: Test function `test_language_filter_passes_matching_lang` runs code but contains no assert / expect / should call — it pas…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1031 · conf 1.00
[MINED106] Phantom test coverage: test_no_language_filter_sends_all: Test function `test_no_language_filter_sends_all` runs code but contains no assert / expect / should call — it passes regardless o…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1189 · conf 1.00
[MINED106] Phantom test coverage: test_no_hostname_raises_value_error: Test function `test_no_hostname_raises_value_error` runs code but contains no assert / expect / should call — it passes regardle…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1197 · conf 1.00
[MINED106] Phantom test coverage: test_wrong_scheme_raises_value_error: Test function `test_wrong_scheme_raises_value_error` runs code but contains no assert / expect / should call — it passes regard…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1208 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_port_raises_value_error: Test function `test_invalid_port_raises_value_error` runs code but contains no assert / expect / should call — it passes regard…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1216 · conf 1.00
[MINED106] Phantom test coverage: test_empty_env_var_value_raises_value_error: Test function `test_empty_env_var_value_raises_value_error` runs code but contains no assert / expect / should call — it…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1549 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_delivery_raises_validation_error: Test function `test_invalid_delivery_raises_validation_error` runs code but contains no assert / expect / should call …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1553 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_platform_raises_validation_error: Test function `test_invalid_platform_raises_validation_error` runs code but contains no assert / expect / should call …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1557 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_layout_raises_validation_error: Test function `test_invalid_layout_raises_validation_error` runs code but contains no assert / expect / should call — it…
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1561 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_fallback_layout_raises_validation_error: Test function `test_invalid_fallback_layout_raises_validation_error` runs code but contains no assert / expect …
high MINED106 Phantom test coverage (assertion-free test) CWE-1126
tests/test_webhook.py:1565 · conf 1.00
[MINED106] Phantom test coverage: test_invalid_overview_position_raises_validation_error: Test function `test_invalid_overview_position_raises_validation_error` runs code but contains no assert / exp…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:70 · conf 1.00
[MINED108] `self._determine_time_window` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self._determine_time_window`, but no assignment to it exists in __init…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:74 · conf 1.00
[MINED108] `self.fetch_all_sources` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self.fetch_all_sources`, but no assignment to it exists in __init__ (and no…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:82 · conf 1.00
[MINED108] `self.merge_cross_source_duplicates` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self.merge_cross_source_duplicates`, but no assignment to it ex…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:90 · conf 1.00
[MINED108] `self._analyze_content` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self._analyze_content`, but no assignment to it exists in __init__ (and no c…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:106 · conf 1.00
[MINED108] `self.merge_topic_duplicates` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self.merge_topic_duplicates`, but no assignment to it exists in __init…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:115 · conf 1.00
[MINED108] `self._expand_twitter_discussion` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self._expand_twitter_discussion`, but no assignment to it exists i…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:120 · conf 1.00
[MINED108] `self._sub_source_label` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self._sub_source_label`, but no assignment to it exists in __init__ (and no…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:127 · conf 1.00
[MINED108] `self._enrich_important_items` used but never assigned in __init__: Method `run` of class `HorizonOrchestrator` reads `self._enrich_important_items`, but no assignment to it exists in __in…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:245 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:250 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:255 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:260 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:265 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:270 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:275 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:280 · conf 1.00
[MINED108] `self._fetch_with_progress` used but never assigned in __init__: Method `fetch_all_sources` of class `HorizonOrchestrator` reads `self._fetch_with_progress`, but no assignment to it exists…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
src/orchestrator.py:313 · conf 1.00
[MINED108] `self._sub_source_label` used but never assigned in __init__: Method `_fetch_with_progress` of class `HorizonOrchestrator` reads `self._sub_source_label`, but no assignment to it exists in…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1268 · conf 1.00
[MINED108] `self._make_notifier` used but never assigned in __init__: Method `test_2xx_success_prints_response` of class `TestHTTPStatusHandling` reads `self._make_notifier`, but no assignment to it …
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1290 · conf 1.00
[MINED108] `self._cleanup` used but never assigned in __init__: Method `test_2xx_success_prints_response` of class `TestHTTPStatusHandling` reads `self._cleanup`, but no assignment to it exists in __…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1294 · conf 1.00
[MINED108] `self._make_notifier` used but never assigned in __init__: Method `test_2xx_feishu_error_code_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._make_notifier`, but no a…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1315 · conf 1.00
[MINED108] `self._cleanup` used but never assigned in __init__: Method `test_2xx_feishu_error_code_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._cleanup`, but no assignment to…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1319 · conf 1.00
[MINED108] `self._make_notifier` used but never assigned in __init__: Method `test_2xx_dingtalk_error_code_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._make_notifier`, but no…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1340 · conf 1.00
[MINED108] `self._cleanup` used but never assigned in __init__: Method `test_2xx_dingtalk_error_code_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._cleanup`, but no assignment …
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1344 · conf 1.00
[MINED108] `self._make_notifier` used but never assigned in __init__: Method `test_2xx_slack_ok_false_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._make_notifier`, but no assi…
high MINED108 self.attribute used but never assigned in __init__ CWE-476
tests/test_webhook.py:1364 · conf 1.00
[MINED108] `self._cleanup` used but never assigned in __init__: Method `test_2xx_slack_ok_false_prints_yellow_warning` of class `TestHTTPStatusHandling` reads `self._cleanup`, but no assignment to it…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/daily-summary.yml:16 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v6`: `uses: actions/checkout@v6` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/daily-summary.yml:19 · conf 0.90
[MINED115] Action `actions/setup-python` pinned to mutable ref `@v5`: `uses: actions/setup-python@v5` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made …
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/daily-summary.yml:24 · conf 0.90
[MINED115] Action `astral-sh/setup-uv` pinned to mutable ref `@v3`: `uses: astral-sh/setup-uv@v3` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the …
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/daily-summary.yml:43 · conf 0.90
[MINED115] Action `peaceiris/actions-gh-pages` pinned to mutable ref `@v4`: `uses: peaceiris/actions-gh-pages@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/deploy-docs.yml:18 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v6`: `uses: actions/checkout@v6` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/deploy-docs.yml:21 · conf 0.90
[MINED115] Action `peaceiris/actions-gh-pages` pinned to mutable ref `@v4`: `uses: peaceiris/actions-gh-pages@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner…
high MINED118 Dockerfile FROM not pinned by sha256 digest CWE-829
Dockerfile:2 · conf 0.90
[MINED118] Dockerfile FROM `python:3.11-slim` not pinned by digest: `FROM python:3.11-slim` resolves the tag at build time. The registry CAN re-push a different image for the same tag, so every build…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
src/scrapers/openbb.py:149 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC128 Async function without await — fire-and-forget Promise (AI mistake)
src/mcp/run_store.py:73 · conf 1.00
[SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call invoked without `await` returns an unhandled Promise. The outer function resolves before the inner work comple…
medium AGT007 localStorage write failures are swallowed silently
docs/assets/js/horizon.js:109 · conf 0.80
localStorage write failures are swallowed silently
medium COMP001 [COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
src/ai/summarizer.py:159 · conf 0.95
[COMP001] High cognitive complexity: Function `_format_item` has cognitive complexity 23 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested…
medium DKR001 Docker final stage has no non-root USER
Dockerfile:2 · conf 0.82
Docker final stage has no non-root USER
medium MINED111 Bare except continues silently
src/ai/analyzer.py:53 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/ai/client.py:186 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/ai/client.py:319 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/ai/enricher.py:52 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/ai/enricher.py:85 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/ai/enricher.py:128 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/main.py:66 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/main.py:77 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:101 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:117 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:301 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:323 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:345 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:367 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/server.py:389 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/mcp/service.py:585 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/orchestrator.py:171 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/orchestrator.py:432 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/orchestrator.py:502 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/scrapers/rss.py:142 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/search.py:23 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/search.py:48 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/services/webhook_cli.py:209 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium MINED111 Bare except continues silently
src/setup/ai_recommend.py:49 · conf 1.00
[MINED111] Bare except continues silently: Bare `except:` (or `except Exception:`) that runs code without re-raising or logging the exception. Hides real failures and makes bugs hard to diagnose.
medium SEC034 Log Injection / Log Forging — unsanitized user input in log
src/scrapers/twitter.py:46 · conf 1.00
[SEC034] Log Injection / Log Forging — unsanitized user input in log: User input is logged without sanitizing newlines or control characters. Attackers inject `\n` to forge fake log entries, hide tra…
medium SEC134 AI scaffold leftover — Lorem ipsum / example.com / John Doe in code
src/services/webhook_cli.py:29 · conf 1.00
[SEC134] AI scaffold leftover — Lorem ipsum / example.com / John Doe in code: Lorem ipsum / John Doe / example.com left in non-test code. AI agents emit these as 'reasonable defaults' when they don't…
medium SEC136 AI-typical over-broad exception handler swallowing all errors
src/ai/enricher.py:75 · conf 1.00
[SEC136] AI-typical over-broad exception handler swallowing all errors: Catch-all exception block that silently returns success or no-ops. AI agents reach for this pattern when a flaky test or an unf…
medium SEC136 AI-typical over-broad exception handler swallowing all errors
src/search.py:19 · conf 1.00
[SEC136] AI-typical over-broad exception handler swallowing all errors: Catch-all exception block that silently returns success or no-ops. AI agents reach for this pattern when a flaky test or an unf…
medium SEC136 AI-typical over-broad exception handler swallowing all errors
src/setup/ai_recommend.py:44 · conf 1.00
[SEC136] AI-typical over-broad exception handler swallowing all errors: Catch-all exception block that silently returns success or no-ops. AI agents reach for this pattern when a flaky test or an unf…
low COMP001 [COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
src/ai/summarizer.py:112 · conf 0.95
[COMP001] High cognitive complexity: Function `generate_webhook_overview` has cognitive complexity 8 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to underst…
low DKC006 Compose service does not declare a runtime user
docker-compose.yml:1 · conf 0.56
Compose service does not declare a runtime user
low DKC010 Compose service lacks no-new-privileges hardening
docker-compose.yml:1 · conf 0.62
Compose service lacks no-new-privileges hardening
low DKR008 .dockerignore misses sensitive defaults
.dockerignore · conf 0.72
.dockerignore misses sensitive defaults
low SEC006 XSS Risk
docs/assets/js/horizon.js:17 · conf 0.40
[SEC006] XSS Risk: Direct HTML injection without sanitization.
info COMP001 [COMP001] High cognitive complexity: Function `load_yfinance_data` has cognitive complexity 9 (SonarSource scale). Cognitive complexity measures how hard the function is for a human to understand — nested branches, boolean chains, and recursion all weigh in. Breakdown: except=1, for=1, if=2, nested_bonus=3, or=2.
· conf 0.20
[COMP001] High cognitive complexity (and 26 more): Same pattern found in 26 additional files. Review if needed.
info MINED049 Print Pii CWE-532
src/services/email.py:49 · conf 1.00
[MINED049] Print Pii: Logging password/token/email/ssn directly to stdout.
info MINED050 Stub Only Function CWE-1188
· conf 0.20
[MINED050] Stub Only Function (and 1 more): Same pattern found in 1 additional files. Review if needed.
info MINED050 Stub Only Function CWE-1188
src/ai/summarizer.py:64 · conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
info MINED050 Stub Only Function CWE-1188
src/ai/utils.py:19 · conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
info MINED050 Stub Only Function CWE-1188
src/scrapers/base.py:34 · conf 1.00
[MINED050] Stub Only Function: Function declared but body is just pass, return None, raise NotImplementedError, or TODO comment.
info MINED062 Python Dataclass No Fields
src/mcp/errors.py:9 · conf 1.00
[MINED062] Python Dataclass No Fields: @dataclass over an empty class — unfinished model.
info MINED062 Python Dataclass No Fields
src/mcp/horizon_adapter.py:31 · conf 1.00
[MINED062] Python Dataclass No Fields: @dataclass over an empty class — unfinished model.
info MINED062 Python Dataclass No Fields
src/mcp/run_store.py:24 · conf 1.00
[MINED062] Python Dataclass No Fields: @dataclass over an empty class — unfinished model.
info SEC020 Secret Printed to Logs
src/services/webhook_cli.py:106 · conf 0.10
[SEC020] Secret Printed to Logs: Debug or diagnostic code appears to print a credential-bearing value. This is a frequent AI-assisted coding failure: the helper exposes the exact value needed for tro…

Reading from rp.scan + rp.finding + rp.rule (unified schema, R78 series). Legacy data path unchanged. Compare with /scan/232cd5aa-f1f3-48cd-a1c5-3b1fd6cfbaab/.