v1.6.0_DEV
Mode: Balanced • 3 LLM(s) • 2026-05-26 19:16
Health
40
Score
0
Critical
0
High
98
Medium
1
Low
99
Total
Score based on provider consensus — 3 provider(s) counted for confidence
Reliability: Partial confidence • Useful signal, but not full-strength consensus. Re-run when all selected providers are healthy.
Executive Readout
Review the hotspots and decide what ships next.
Built for a dev-facing handoff: fast signal up top, evidence below, ready-to-export detail.
1. Review critical and high findings first.
2. Check provider disagreements before making a final call.
3. Use Project Intelligence to spot hotspots before refactoring.
LLM Providers
Runtime coverage, provider health, and confidence participation for this run.
✓ gemini (18 results) ✓ groq (206 results) ✓ cerebras (267 results) ✗ ollama — temporary
API Optimizer
Current provider lineup mapped to speed, budget posture, and strongest use case.

Active model fit

Gemini Flash (Google)Speed: Very fast • Budget: $
Best fit: Wide coverage and inexpensive parallel passes
Local benchmark: Steady, 36.72s/chunk avg, 69% success, signal High
Groq (LLaMA)Speed: Lightning • Budget: Free/$
Best fit: Instant first pass and low-friction daily scans
Local benchmark: Steady, 16.33s/chunk avg, 91% success, signal High
Cerebras (GPT OSS)Speed: Lightning • Budget: Free/$
Best fit: Fastest turnaround when time matters most
Local benchmark: Steady, 26.74s/chunk avg, 97% success, signal High

Suggested combo

Recommended active combo: Speed RunnerBest when you want a fast yes/no quality check before every commit.
Project Intelligence
Local architecture clues, stack signals, hotspots, and review guidance inferred before LLM consensus.

Architecture

Desktop application
Primary languages: Python (92), HTML (15)

Coverage Signals

107 files / 155 chunks
30103 lines scanned • 192 tests • 77 docs

Priority Review

118 local risk markers
5 entry point(s) • 0 skipped file(s)

Hotspots

tests/test_core.py2519 lines • 93.0 KB
app/core/arbiter.py947 lines • 32.9 KB
app/ui/main_window.py924 lines • 36.7 KB

Executive Signals

Sensitive patterns deserve priority review738 local risk markers detected before any LLM call.
Documentation signal detected77 documentation file(s) can help models keep architectural context.
Clear execution entry points foundcli.py, main.py, app/core/analyzer.py
Baseline & History
Automatic comparison against the previous saved run for this same project.

Change Summary

Regressions or new findings detected versus previous run.
Previous run: 2026-05-23 20:54

Delta

Score -55
Issues +88 • Critical 0

Finding Diff

99 new • 11 fixed
0 worsened • 0 improved • 0 unchanged
Decision Trace
Why these findings are visible: provider participation, project rules, suppressions, and score inputs.

Providers

Requestedgemini, groq, cerebras, ollama
Returned resultsgemini: 18, groq: 206, cerebras: 267
Failedollama: Request timed out.
Coverage3/4 provider(s) returned usable results

Provider Health

ollamaTemporary provider outage • Retry later or rely on another provider for this run.

Filtering

Visible findings99 findings • 383 observations
Project ignore rules0 findings • 0 observations • 0 conflicts • 0 logic hotspots
Suppressions0 findings • 0 observations • 0 active rules

Run Scope

Score40/100 visible review score
Score confidencePartial confidence — 3/4 provider(s) returned usable results.
Useful signal, but not full-strength consensus. Re-run when all selected providers are healthy.
Git diff modedisabled
Issues (99)
Validated findings ranked by severity, confidence, and provider agreement.
bug MEDIUM main.py:118 Weak signal — 36%
The call to `_init_settings()` is not wrapped in a try-except block. If `get_settings()` fails, subsequent calls like `settings.get_log_path()` will raise an AttributeError, preventing proper error handling and logging initialization.
Detected by: ✓ gemini ×0.9 1/3 provider(s) agreed
bug MEDIUM app/config/constants.py Weak signal — 36%
WINDOW_TITLE references undefined variables APP_DISPLAY and APP_TAGLINE, causing NameError on module import
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/analysis_support_v160.py:124 Weak signal — 36%
execute_analysis_pipeline does not return an AnalysisPipelineResult, leading to None being returned to callers
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/analysis_support_v160.py Weak signal — 36%
Reference to undefined name 'logger' in exception block may raise NameError if logger is not imported or defined
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/analysis_support_v160.py Weak signal — 36%
Variable 'started' used to compute elapsed_seconds may be undefined in this scope, leading to NameError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter.py Weak signal — 36%
Function build_consensus_output does not return a ConsensusOutput, causing callers to receive None
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter_proof.py:418 Weak signal — 36%
compute_signal_vector called with incorrect keyword argument 'location_spread'; if the function expects a different name this raises a TypeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/consensus.py:452 Weak signal — 36%
Calling issue.description.startswith() without checking if description is None can raise an AttributeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/consensus.py:165 Weak signal — 36%
Calls _provider_weight with an unsupported second argument (raw_type), which may raise a TypeError if the function signature does not accept it
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/consensus.py:260 Weak signal — 36%
_detect_conflicts builds conflict location data but never creates or returns ConflictZone objects, so detected conflicts are never reported
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter_wired.py Weak signal — 36%
Potential KeyError: the code uses level (likely an enum or object) as a key in _action_map which contains string keys ('routine','review','critical'), causing a mismatch and runtime error when accessing _action_map[level]
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py:41 Weak signal — 36%
Missing import for Optional and List, causing NameError when function is called
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py:55 Weak signal — 36%
Variable 'logger' is referenced but not defined or imported, leading to NameError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/llm_clients.py:320 Weak signal — 36%
Functions referenced in CALLERS (call_claude, call_gpt, call_gemini, etc.) are not defined in this module, leading to NameError at import time
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/llm_manager.py Weak signal — 36%
Missing method definition for _maybe_record_manifest; the code block after the raise statement is executed at class definition time, referencing 'self' which is undefined, causing a NameError when the class is imported.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/consensus_support.py:33 Weak signal — 36%
lines_close returns True when either line number is None, causing unrelated issues to be considered close and potentially matching incorrect issue reports.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/on_chain.py:735 Weak signal — 36%
hex_to_bytes32 uses assert for input length validation; asserts can be disabled with the -O flag, allowing invalid inputs to pass silently.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/on_chain.py:660 Weak signal — 36%
to_bytes32 pads short hex strings on the right (ljust) instead of left, producing incorrect bytes32 values for hashes shorter than 64 characters.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/on_chain.py:425 Weak signal — 36%
verify_chain reads chain.blocks without acquiring the chain's lock, which can cause race conditions if other threads modify the chain concurrently.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/reporter.py:147 Weak signal — 36%
_failed variable is assigned using inverted condition; it should use report.failed_providers when issues exist, not when they are absent
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/reporter.py:648 Weak signal — 36%
Duplicate method name _render_share_hooks defined twice; the second definition overwrites the first, causing the builder that returns a list to be unreachable and leading to type mismatches at call sites.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/suppression.py:168 Weak signal — 36%
export_shared overwrites the shared suppressions file, discarding any existing shared rules from other contributors, which can lead to data loss.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/token_economics.py Weak signal — 36%
Function annotation uses `Dict` without importing it from `typing`, leading to a NameError at import time.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/core/theme.py:94 Weak signal — 36%
palette() always returns the DARK theme, making it impossible to select the LIGHT palette as suggested by the module docstring
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/license/offline_activation.py Weak signal — 36%
Undefined variable _OFFLINE_PUBLIC_KEY_PEM used for loading the public key, causing a NameError at runtime
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/license/engine.py Weak signal — 36%
Offline cache is considered always fresh, bypassing expiration checks and allowing revoked licenses to remain valid indefinitely
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/analysis_support_patches.py:29 Weak signal — 36%
Reference to undefined variable 'active' will raise NameError at runtime
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/chrome_presenter.py:57 Weak signal — 36%
render_provider_matrix calls has_key_fn twice per provider (once in the loop and again when building ready_selected), causing possible state inconsistencies if has_key_fn has side effects
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/main_window.py Weak signal — 36%
_refresh_workspace_meta accesses self._selected_folder before it is initialized, causing AttributeError on startup.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/main_window.py Weak signal — 36%
placeholder_api_key may be None; calling placeholder_api_key(key) will raise TypeError if caller omits the argument or passes None.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/main_window.py Weak signal — 36%
Methods such as _toggle_pause_scan, _stop_scan, and _analysis_worker assume that self._state is always present and contain pause_token/cancel_token attributes; if _state is missing an AttributeError will be raised, causing crashes during analysis control flow.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/navigation.py Weak signal — 36%
open_report returns early even when open_browser_path fails, preventing the fallback log message from being shown
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/navigation.py Weak signal — 36%
open_last_html_report returns early on failure of open_browser_path, skipping the log that no report is available
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/results_presenter.py Weak signal — 36%
Potential KeyError in render_verdict_banner if meta_issues contain a verdict decision not present in _VERDICT_CONFIG dictionary
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/settings_static_tabs.py Weak signal — 36%
Assumes each entry in USER_UPDATES contains 'version', 'title', and 'summary' keys; missing keys will raise a KeyError and crash the UI.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/settings_static_tabs.py Weak signal — 36%
In build_optimizer_tab, the list comprehension for providers assumes each combo dict has a 'providers' list and that each provider entry has a 'label' key; missing data will raise a KeyError.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/settings_services.py Weak signal — 36%
activate_license does not catch exceptions from license_engine.activate, which can cause unhandled crashes if activation fails unexpectedly
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/settings_view.py Weak signal — 36%
Syntax error in _build_license: 'command' argument is placed outside the CTkButton call, causing a runtime crash.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/settings_view.py Weak signal — 36%
provider_key_status uses value.startswith on a list of prefixes, causing TypeError; should check against a tuple of strings or iterate over the list
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/ui_state.py:30 Weak signal — 36%
Fields of MainWindowState are accessed without synchronization; concurrent reads/writes may cause race conditions
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/conftest.py:57 Weak signal — 36%
cleanup() always ignores errors because of 'or True' expression, ignoring the ignore_cleanup_errors flag
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM app/ui/window_services.py:55 Weak signal — 36%
Potential KeyError if quota_info() dictionary does not contain the 'remaining' key, causing quota_label_text() to crash.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_consensus_integration.py:68 Weak signal — 36%
Assumes report has .observations attribute; if missing, AttributeError will be raised
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py Weak signal — 36%
Missing import for 'tempfile' module, causing NameError when used in test_quota_reset and test_quota_reset_sig_valid
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py Weak signal — 36%
Missing import for 'Path' from pathlib, causing NameError when constructing QuotaManager with a Path object
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py:862 Weak signal — 36%
Calling Reporter._build_json with a fifth positional argument (extra context dict) likely does not match the method signature and will raise a TypeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py:812 Weak signal — 36%
ValidatedIssue is instantiated with a 'raw_severity' argument which may not be defined in its constructor, causing a TypeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py Weak signal — 36%
Missing import for json module before using json.loads in test_reporter_json_and_html_include_decision_trace, causing NameError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_core.py Weak signal — 36%
Missing import for 'pytest' resulting in NameError when calling pytest.skip in UI smoke tests
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_token_economics.py:331 Weak signal — 36%
Logical error in test_warning_at_threshold: uses 'or' instead of 'and', allowing the assertion to pass even when warning is missing or budget is exceeded
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug MEDIUM tests/test_on_chain.py Weak signal — 36%
Missing import of json module causing NameError in test_ipfs_manifest_no_code_content
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
smell MEDIUM app/core/suppression.py:181 Weak signal — 34%
Potential race condition: multiple processes calling _save may overwrite each other's changes without file locking or atomic write.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell MEDIUM cli.py:249 Weak signal — 31%
Modifying `app.config.constants.LLM_PROVIDERS` at runtime. Constants modules should ideally contain immutable values; modifying them dynamically can lead to unexpected behavior and makes configuration harder to reason about.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
bug MEDIUM app/config/constants.py Weak signal — 28%
Null Dereference detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/config/constants.py Weak signal — 28%
Race Condition detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter.py:509 Weak signal — 28%
[Gap] Potential null pointer exception in _normalize_category function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter.py:544 Weak signal — 28%
[Gap] Potential division by zero error in _signal_diversity function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter.py:855 Weak signal — 28%
[Gap] Potential KeyError in _build_user_verdict function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter_proof.py:321 Weak signal — 28%
Potential infinite recursion in compute_signal_vector if input parameters are not properly validated
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/arbiter_wired.py:67 Weak signal — 28%
The MetaIssue_cls is not defined in the function scope, it should be imported or defined locally.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py:141 Weak signal — 28%
[Gap] build_conflict_map_from_arbiter has inconsistent return types
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py:104 Weak signal — 28%
[Gap] build_conflict_map_from_history does not handle report_history_entry.get("conflicts") as None
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py Weak signal — 28%
[Gap] Potential race condition if build_conflict_map_for_run is called concurrently
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/context_headers.py:150 Weak signal — 28%
[Gap] Potential KeyError if project_path is not present in history entry
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug MEDIUM app/core/llm_manager.py:340 Weak signal — 28%
Potential deadlock: `self._manifests_lock` and `self._telemetry_lock` might be acquired in different orders
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_support.py:170 Weak signal — 26%
normalize_provider_error returns the full exception string, which may contain sensitive information such as API keys or tokens, potentially leaking credentials through logs.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security MEDIUM app/core/quota.py:38 Weak signal — 26%
Quota file is signed with a secret derived from a machine fingerprint that is easy to compute, allowing an attacker to regenerate a valid HMAC after modifying usage fields and bypass quota enforcement.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security MEDIUM app/core/reporter.py:173 Weak signal — 26%
HTML sections (observations_section, suppressed_section) concatenate raw data from report into f‑strings without escaping, allowing possible XSS injection
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security MEDIUM app/core/reporter.py Weak signal — 26%
HTML template inserts unescaped variables such as provider_badges, optimizer_html, intelligence_html, baseline_html, decision_trace_html, upsell_html, issues_html, logic_html, conflict_html, share_html, suppressed_section, observations_section, potentially allowing XSS if any contain user-controlled content
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security MEDIUM app/ui/icons.py:74 Weak signal — 26%
class_name is inserted directly into the SVG tag without sanitization, allowing injection of arbitrary attributes or script content if user-controlled.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
financial_risk MEDIUM cli.py Weak signal — 24%
Potential quota/billing edge case with missing pagination on large data fetch
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM cli.py Weak signal — 24%
Potential financial risk with unclosed database connections
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM main.py Weak signal — 24%
Missing pagination on large data fetch in _init_settings function where settings are loaded
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/config/constants.py Weak signal — 24%
SQL Injection patterns detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/config/constants.py Weak signal — 24%
Potential security risk: API keys are stored in plain text in the code, specifically in the PROVIDER_SETUP dictionary.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/config/constants.py Weak signal — 24%
Missing pagination on large data fetch
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/analysis_support_v160.py:245 Weak signal — 24%
The api_keys dictionary is passed directly to the LLMManager without any validation or sanitization, potentially exposing sensitive API keys.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/analysis_support_v160.py:441 Weak signal — 24%
Potential exception handling issue in 'try: ... except Exception as exc:' block
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/analysis_support_v160.py:471 Weak signal — 24%
Potential security risk with 'record_report_history' function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/analysis_support_v160.py:452 Weak signal — 24%
Recursive function with external API call in 'build_sarif_v2' function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/arbiter.py:623 Weak signal — 24%
Potential SQL injection vulnerability in ArbiterEngine class
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/arbiter.py:920 Weak signal — 24%
Potential performance issue due to recursive function calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/arbiter_proof.py:146 Weak signal — 24%
Insecure hash function (_sha256) used for security-critical data
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/arbiter_proof.py:111 Weak signal — 24%
Input validation missing for _hash_inputs function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/arbiter_proof.py Weak signal — 24%
Database connection not properly closed (potential risk of high database costs)
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/consensus.py:156 Weak signal — 24%
Potential security risk due to missing validation of user input
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/consensus.py Weak signal — 24%
Missing pagination on large data fetch
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_clients.py:10 Weak signal — 24%
Potential API key exposure through logging
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_clients.py:50 Weak signal — 24%
Missing authentication for 'call_ollama' function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_clients.py:250 Weak signal — 24%
Insecure usage of 'httpx' library without verifying SSL certificates
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_manager.py:200 Weak signal — 24%
Potential SQL injection or NoSQL injection: `chunk.content` is not sanitized properly
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_manager.py:300 Weak signal — 24%
Missing authentication: `caller` function does not have any authentication or authorization checks
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/llm_manager.py:150 Weak signal — 24%
API call inside a loop: `caller` function is called in a loop without any caching or optimization
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security MEDIUM app/core/llm_support.py:301 Weak signal — 24%
extract_json_array() function does not validate the JSON data before loading it, which could lead to a JSON injection attack.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/on_chain.py:521 Weak signal — 24%
API call inside for/while loop
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/on_chain.py:596 Weak signal — 24%
Recursive function with external API call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/on_chain.py:673 Weak signal — 24%
Database connection not closed / no context manager
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk MEDIUM app/core/llm_manager.py Weak signal — 22%
External LLM API calls (caller) are executed inside a loop over chunks, leading to potentially unbounded API usage and cost escalation without throttling or quota checks.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
financial_risk LOW cli.py:410 Partial consensus — 54%
The `execute_analysis_pipeline` function likely makes external API calls. However, there is no explicit timeout parameter passed to it from this CLI entry point, which could lead to indefinite hangs if external services are unresponsive.
Detected by: ✓ gemini ×1.6 1/3 provider(s) agreed
Consensus Logic Watch
Subtle logical weak spots inferred from consensus and disagreement patterns.
Concurrency hazardapp/core/analysis_support_v160.py:303 • confidence 65% • 2 source(s)
Reference to undefined name 'logger' in exception block may raise NameError if logger is not imported or defined (providers disagree: groq: low vs cerebras: high)
Concurrency hazardapp/core/arbiter_proof.py • confidence 65% • 2 source(s)
compute_rule_trace may return an empty final_level string when no rule matches, leading to undefined downstream handling; should default to 'routine' (providers disagree: groq: low vs cerebras: high)
Fallback or retry driftcli.py:446 • confidence 55% • 3 source(s)
The logic for parsing and defaulting `args.fail_on_illusion` is convoluted. An empty string (`""`) provided by the user is explicitly set to "medium" (line 450), while a missing argument (`None`) becomes an empty string, which is then interpreted as "disabled" (line 457). This asymmetry and complex handling can be confusing for users and lead to unexpected behavior. (providers disagree: gemini: medium vs groq: low vs cerebras: low)
Fallback or retry driftcli.py:431 • confidence 55% • 2 source(s)
The quota.consume() method is called unconditionally after `execute_analysis_pipeline` completes, unless an exception is raised. If `execute_analysis_pipeline` can return a `result` indicating an analysis that should not consume quota (e.g., partial success, early exit due to invalid input not raising an exception), this could lead to incorrect quota usage or billing. (providers disagree: gemini: medium vs groq: low)
Fallback or retry driftcli.py:410 • confidence 54% • 1 source(s)
The `execute_analysis_pipeline` function likely makes external API calls. However, there is no explicit timeout parameter passed to it from this CLI entry point, which could lead to indefinite hangs if external services are unresponsive.
Concurrency hazardmain.py:118 • confidence 36% • 1 source(s)
The call to `_init_settings()` is not wrapped in a try-except block. If `get_settings()` fails, subsequent calls like `settings.get_log_path()` will raise an AttributeError, preventing proper error handling and logging initialization.
AI Conflict Heatmap
Zones where providers disagree on severity and a human decision matters most.
cli.py:249Modifying `app.config.constants.LLM_PROVIDERS` at runtime. Constants modules should ideally contain immutable values; modifying them dynamically can lead to unexpected behavior and makes configuration harder to reason about.
gemini: highgroq: low
Severity spread: 2 level(s)
cli.py:410The `execute_analysis_pipeline` function likely makes external API calls. However, there is no explicit timeout parameter passed to it from this CLI entry point, which could lead to indefinite hangs if external services are unresponsive.
gemini: lowgroq: high
Severity spread: 2 level(s)
cli.pyThe `execute_analysis_pipeline` function likely makes external API calls. However, there is no explicit timeout parameter passed to it from this CLI entry point, which could lead to indefinite hangs if external services are unresponsive.
gemini: lowgroq: highcerebras: low
Severity spread: 2 level(s)
app/core/analysis_support_v160.py:303Reference to undefined name 'logger' in exception block may raise NameError if logger is not imported or defined
groq: lowcerebras: high
Severity spread: 2 level(s)
app/core/arbiter_proof.pycompute_rule_trace may return an empty final_level string when no rule matches, leading to undefined downstream handling; should default to 'routine'
groq: lowcerebras: high
Severity spread: 2 level(s)
main.py:118The call to `_init_settings()` is not wrapped in a try-except block. If `get_settings()` fails, subsequent calls like `settings.get_log_path()` will raise an AttributeError, preventing proper error handling and logging initialization.
gemini: highgroq: medium
Severity spread: 1 level(s)
cli.py:431The quota.consume() method is called unconditionally after `execute_analysis_pipeline` completes, unless an exception is raised. If `execute_analysis_pipeline` can return a `result` indicating an analysis that should not consume quota (e.g., partial success, early exit due to invalid input not raising an exception), this could lead to incorrect quota usage or billing.
gemini: mediumgroq: low
Severity spread: 1 level(s)
cli.pyThe quota.consume() method is called unconditionally after `execute_analysis_pipeline` completes, unless an exception is raised. If `execute_analysis_pipeline` can return a `result` indicating an analysis that should not consume quota (e.g., partial success, early exit due to invalid input not raising an exception), this could lead to incorrect quota usage or billing.
gemini: mediumgroq: lowcerebras: medium
Severity spread: 1 level(s)
cli.py:446The logic for parsing and defaulting `args.fail_on_illusion` is convoluted. An empty string (`""`) provided by the user is explicitly set to "medium" (line 450), while a missing argument (`None`) becomes an empty string, which is then interpreted as "disabled" (line 457). This asymmetry and complex handling can be confusing for users and lead to unexpected behavior.
gemini: mediumgroq: lowcerebras: low
Severity spread: 1 level(s)
app/config/constants.pyThe 'requires_key' attribute is redundantly defined in both the 'LLM_PROVIDERS' and 'PROVIDER_SETUP' dictionaries for each LLM provider. This duplication creates two sources of truth and could lead to inconsistencies if updates are not synchronized.
gemini: lowgroq: mediumcerebras: low
Severity spread: 1 level(s)
Share Hooks
Built-in viral angles you can reuse in screenshots, launch posts, demos, and client updates.
AI disagreement revealNexaVerify found 10 places where models disagreed — exactly where human judgment still matters.
Disagreement zones are naturally curiosity-inducing and highly shareable.
Subtle logic catchThe consensus watchlist surfaced 6 subtle logic risks that a single-model pass could miss.
Highlights differentiated value beyond ordinary bug detection.
Budget saverThe report turned cloud-cost risks into concrete fixes before they shipped.
Cost-savings stories travel well with freelancers and small teams.
▶ Observations — 383 weak signal(s) (single-model only, below consensus threshold)
suggestion LOW main.py:151 Weak signal — 37%
Directly printing exception messages to the console can reveal internal details; prefer logging them and showing user‑friendly messages
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW cli.py:470 Weak signal — 37%
Move quota.consume() into a finally block to ensure quota is deducted even if an unexpected exception occurs after analysis.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/analysis_support_v160.py:170 Weak signal — 37%
Add a timeout parameter to LLMManager.analyze_chunks to prevent indefinite blocking on external LLM API calls
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/analysis_support_v160.py:158 Weak signal — 37%
Validate ollama_base_url obtained from settings to ensure it is a well‑formed URL and does not contain malicious content
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/analysis_support_v160.py Weak signal — 37%
Replace broad 'except Exception' with more specific exception types to avoid masking unrelated errors
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/config/constants.py Weak signal — 37%
Add an entry for "ollama" in ENV_API_KEYS to allow API key configuration for the Ollama provider
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/config/constants.py Weak signal — 37%
Consider using immutable tuples for constant sequences (e.g., ILLUSION_LEVELS_ORDERED) to prevent accidental modification at runtime
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/config/constants.py:8 Weak signal — 37%
Document or guard get_base_path() because the frozen and unfrozen branches return different base paths; a change in project layout could break the unfrozen path resolution.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/analyzer.py Weak signal — 37%
Path traversal protection in _collect_selected_files uses os.path.commonpath on string paths; replace with pathlib's is_relative_to for clearer and safer checks.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/analyzer.py Weak signal — 37%
Avoid repeated encoding of each line to compute byte size; cache the byte length or use len(line) for ASCII‑only content to improve performance
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/arbiter.py:934 Weak signal — 37%
Consider using a single dict comprehension or factory function to build CoverageMap entries, reducing nested loops and improving readability.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_proof.py:180 Weak signal — 37%
Add explicit return statement at end of compute_rule_trace for clarity (return trace, level)
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_proof.py:30 Weak signal — 37%
Replace raw string constants for levels and outcomes with Enum types for better type safety and maintainability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_proof.py:405 Weak signal — 37%
Validate that final_level and final_decision are non‑empty strings before building the proof bundle to avoid creating invalid proofs
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py:480 Weak signal — 37%
Replace magic numbers 0.35, 0.45, and 0.1 with named constants for readability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py Weak signal — 37%
Add docstrings to private methods (_detect_logic_hotspots, _calculate_score) to improve maintainability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py:170 Weak signal — 37%
Recalculates confidence variable twice; the first calculation is redundant
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/git_diff.py:17 Weak signal — 37%
Validate that the provided project_path exists and is a directory to avoid errors later.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/git_diff.py:48 Weak signal — 37%
Use subprocess.run with check=True and handle CalledProcessError for clearer error handling instead of manually checking returncode.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/context_headers.py Weak signal — 37%
Add explicit type annotation for output_dir (e.g., Union[str, Path]) and consider using pathlib.Path for consistency
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/ignore_rules.py:73 Weak signal — 37%
The _glob_match function recompiles a regular expression on every call for patterns containing '**'. Caching the compiled regex could improve performance.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/llm_clients.py:108 Weak signal — 37%
Log message in guard_truncation contains a typo "fence+backet"; correct to "fence+bracket" for clarity
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/llm_support.py:75 Weak signal — 37%
Use a context manager (with open(...)) when reading prompt files instead of Path.read_text to better handle file I/O errors and encoding issues.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py Weak signal — 37%
_record_to_dict stores a "_chain_version" field but _dict_to_record never validates that the stored version matches CHAIN_VERSION, risking silent incompatibility
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py Weak signal — 37%
The canonical block representation rounds timestamps to three decimals, which can cause hash collisions for scans that occur within the same millisecond; consider using full precision
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py Weak signal — 37%
load_chain reads the entire chain file into memory with read_text(); for large audit histories this can be memory‑intensive – switch to iterative line-by-line reading
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py Weak signal — 37%
record_scan_to_chain should validate that numeric fields (score, critical_count, high_count, issue_count) are within expected ranges before storing them.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/config/settings.py Weak signal — 37%
When saving settings, ensure the resulting file permissions restrict access to the owner to protect stored secrets.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/llm_manager.py Weak signal — 37%
Sanitize or validate the user-provided 'intent' string before embedding it in the prompt to reduce the risk of prompt injection attacks.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/prompt_sanitizer.py:84 Weak signal — 37%
Preserve the original trailing newline when returning sanitized content; currently "\n" is lost after "\n".join(sanitized_lines).
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/prompt_sanitizer.py:106 Weak signal — 37%
has_injection_risk discards the optional file_path argument, causing warnings to lack context; consider passing file_path to sanitize_code_content for consistent warning messages.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/provider_planner.py Weak signal — 37%
Consider using a tuple for ProviderPlan fields that never change to emphasize immutability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/provider_planner.py Weak signal — 37%
Add a docstring to build_provider_plan to clarify its behavior and edge cases
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/provider_planner.py Weak signal — 37%
Document that a 'custom' profile returns the enabled providers list without any reordering
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/report_history.py:78 Weak signal — 37%
When load_history detects a corrupted JSON file, it returns an empty list but leaves the corrupted file on disk, causing repeated warnings on each run. Consider deleting or archiving the corrupted file.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/report_history.py:115 Weak signal — 37%
save_history uses a static temporary filename (".tmp") which could clash if multiple processes write to the same history file simultaneously. Use a unique temporary filename (e.g., via tempfile.NamedTemporaryFile) to avoid race conditions.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/report_sections.py:140 Weak signal — 37%
Timestamp parsing uses hard‑coded length and slicing; consider using datetime parsing for robustness
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/reporter.py Weak signal — 37%
Apply html.escape (or a templating engine) to any user‑controlled strings before inserting them into generated HTML to mitigate XSS risks
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/reporter.py Weak signal — 37%
Consistently escape all dynamic values inserted into the HTML (e.g., score_desc, reliability_label, reliability_guidance) to prevent injection attacks
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/report_output_v2.py:394 Weak signal — 37%
Use deterministic JSON serialization (e.g., sort_keys=True) when generating fallback fingerprint to ensure consistent deduplication across runs
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/report_output_v2.py Weak signal — 37%
Move the import of _stable_issue_id out of the per-issue loop to avoid repeated imports and improve performance
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/suppression.py:181 Weak signal — 37%
Consider using an atomic file write (e.g., write to a temporary file then rename) or file locking when saving suppressions to avoid partial writes or race conditions.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/system_info.py:58 Weak signal — 37%
Add logging for subprocess failures in get_gpu_info to aid debugging
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/system_info.py:14 Weak signal — 37%
Log a warning when psutil is not installed in get_total_ram_gb to improve observability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/theme.py:8 Weak signal — 37%
Add an explicit type annotation for the DARK constant (e.g., DARK: Dict[str, str] = {...}) for consistency with LIGHT
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/theme.py:50 Weak signal — 37%
Consider making the theme palettes immutable (e.g., using MappingProxyType) to prevent unintended runtime modifications
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/theme.py:94 Weak signal — 37%
Implement a parameter or configuration mechanism for palette() to return either DARK or LIGHT based on application settings
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/core/typed_prompts.py Weak signal — 37%
Add validation to ensure confidence_basis values are within _VALID_CONFIDENCE_BASIS when constructing issue objects
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/analysis_support.py Weak signal — 37%
Progress calculation in on_progress uses the per‑file 'total' argument multiplied by number of providers, which can misrepresent overall progress when scanning multiple files; consider using the total number of chunks across all files (* len(active)) calculated once outside the callback
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/license/engine.py Weak signal — 37%
Use pathlib's Path.open() and set file mode 0o600 when writing the license cache to ensure proper permission handling
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/license/engine.py Weak signal — 37%
Catch specific exceptions in _verify_gumroad instead of a broad Exception to avoid masking unexpected errors
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/analysis_support_v160.py:11 Weak signal — 37%
Replace generic 'dict' type hints with concrete typing (e.g., Dict[str, Any]) for clearer static analysis and maintainability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/components.py:508 Weak signal — 37%
Import tkinter.filedialog at module level instead of inside _browse to avoid repeated imports on each call.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/components.py:470 Weak signal — 37%
In _validate_key, uses 'text_color' keyword for status label which may be incorrect for customtkinter; verify the correct property name (e.g., 'fg_color') to ensure the label updates as intended.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/layout_builder.py:14 Weak signal — 37%
Add a type hint for the 'window' parameter (e.g., CTk) to improve clarity and enable static analysis.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/layout_topbar.py:24 Weak signal — 37%
Hardcoded height value (72) for the topbar; consider using a named constant or configurable parameter.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/layout_topbar.py:91 Weak signal — 37%
Button text reads "⚠ Add API Key" but its command opens settings; the label may mislead users about the action performed.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/layout_topbar.py:28 Weak signal — 37%
Multiple UI elements use hardcoded padding, width, and height values; extracting these into constants would improve maintainability.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/main_window.py:158 Weak signal — 37%
Clean exit shuts down UI but does not explicitly wait for background analysis threads; consider joining non‑daemon threads to ensure graceful shutdown.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/main_window.py:751 Weak signal — 37%
In _svc_output_formats the fallback uses settings key "output_format" but the intended key is likely "output_formats"; this could return an unexpected value.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/main_window.py Weak signal — 37%
Replace the custom _log method's inner function with a direct call to self._log_box methods inside after to avoid the extra closure overhead and improve readability.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/navigation.py Weak signal — 37%
Add explicit type hints for the 'parent' and 'settings' parameters in show_welcome_modal for better readability and static analysis
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/results_presenter.py Weak signal — 37%
Add explicit type hints for function parameters and return types (e.g., render_conflict_heatmap, render_verdict_banner) to improve maintainability
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_static_tabs.py Weak signal — 37%
Replace hard‑coded provider ID tuple in build_optimizer_tab with iteration over PROVIDER_BENCHMARKS keys to keep the UI in sync with available providers.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_services.py Weak signal — 37%
When include_provider_health is True, export_diagnostics includes the raw api_key_health dict which may contain actual API keys; consider redacting or hashing the keys before adding to the payload
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_services.py Weak signal — 37%
Exporting diagnostics writes directly to the target file; to avoid race conditions or partial writes, write to a temporary file and rename atomically
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_services.py Weak signal — 37%
provider_health_snapshot passes an empty string for providers that do not require a key; clarify this behavior in documentation or rename variable to reflect that no key is used
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_view.py Weak signal — 37%
Default provider selection checkboxes always initialize to True; they should reflect saved settings to avoid unexpected defaults.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_view.py Weak signal — 37%
Wrap calls to self._on_save() in try/except to prevent unhandled exceptions from stopping the UI closure
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_view.py Weak signal — 37%
Recompute the prefixes dictionary once (e.g., as a class attribute) instead of rebuilding it on each _provider_key_status call for efficiency
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/settings_view.py Weak signal — 37%
Log exception details in _export_diagnostics when export fails for better debugging
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW tests/conftest.py:62 Weak signal — 37%
Monkey-patching tempfile.TemporaryDirectory globally may affect other imports; consider limiting scope or using a fixture
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/window_services.py:21 Weak signal — 37%
Consider adding a return type annotation to 'is_pro' to improve clarity (e.g., -> bool).
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/window_services.py:25 Weak signal — 37%
Method 'output_formats' accesses settings key 'output_format' while the method name suggests plural; verify consistency with settings schema.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/window_services.py:38 Weak signal — 37%
Method 'set_last_folder' accepts a string path; accepting a pathlib.Path object would be more flexible and type‑safe.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW app/ui/window_services.py:5 Weak signal — 37%
Add a class docstring to MainWindowServices to describe its responsibilities and usage.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW tests/test_consensus_integration.py:128 Weak signal — 37%
Use a context manager or atomic write when saving JSON output to avoid partial file writes on failure
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW tests/test_arbiter.py:410 Weak signal — 37%
Add a guard to ensure meta_issues is non‑empty before accessing meta_issues[0] to avoid potential IndexError if _run returns an empty list
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
suggestion LOW tests/test_core.py Weak signal — 37%
Add required imports (tempfile, pathlib.Path, pytest) at the top of the test file to ensure all tests run correctly
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
bug LOW cli.py:431 Weak signal — 36%
The quota.consume() method is called unconditionally after `execute_analysis_pipeline` completes, unless an exception is raised. If `execute_analysis_pipeline` can return a `result` indicating an analysis that should not consume quota (e.g., partial success, early exit due to invalid input not raising an exception), this could lead to incorrect quota usage or billing.
Detected by: ✓ gemini ×0.9 1/3 provider(s) agreed
bug LOW app/core/analyzer.py:286 Weak signal — 36%
The `tests_count` variable is initially populated by a scan of the entire project, then potentially overwritten to `1` by `max(tests_count, 1)` if any collected file is identified as a test file. This makes `tests_count` inconsistent: sometimes it's an actual count (from `_scan_project_signals`), and other times it's a boolean 'has tests' flag (effectively 0 or 1), which conflicts with its name.
Detected by: ✓ gemini ×0.9 1/3 provider(s) agreed
smell LOW main.py:64 Weak signal — 36%
Recursive function with external API call is not present but there are several function calls with potential for recursive calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW main.py Weak signal — 36%
Database connection is not explicitly closed but it is handled by the QuotaManager class
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW cli.py:406 Weak signal — 36%
Unused 'lambda' function for 'update_progress' and 'update_intelligence'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW cli.py Weak signal — 36%
Long methods and complex logic in main function, consider refactoring for better maintainability
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW cli.py Weak signal — 36%
Unused imports and variables, consider removing for better code quality
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/config/constants.py Weak signal — 36%
Duplicate code detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/config/constants.py Weak signal — 36%
The code has a large number of magic strings and hardcoded values, which could make it difficult to maintain and update.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:341 Weak signal — 36%
The except block for the ArbiterEngine failure is too broad and may mask other important exceptions.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:403 Weak signal — 36%
Unused import 'logger'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:423 Weak signal — 36%
Deep nesting in 'if comparison' block
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:461 Weak signal — 36%
Duplicate code in 'build_output_context' function calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/config/settings.py:156 Weak signal — 36%
Recursive function calls may lead to stack overflow
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/config/settings.py:354 Weak signal — 36%
Complexity of SettingsManager class may make it difficult to maintain
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analyzer.py:454 Weak signal — 36%
Magic number (30) used in LOOKAHEAD variable
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/analyzer.py:419 Weak signal — 36%
Hardcoded prefixes in _BOUNDARY_PREFIXES tuple
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter.py:801 Weak signal — 36%
Long method in MetaEngine class
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter.py:927 Weak signal — 36%
Magic number 0 used as default value for chunk_index
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter.py:941 Weak signal — 36%
Nested dictionary access without error handling
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py:74 Weak signal — 36%
Deeply nested conditional statements in RuleTrace evaluation
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py:245 Weak signal — 36%
Long method (compute_signal_vector) with complex logic
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py Weak signal — 36%
Complex function build_proof_bundle with many parameters
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py Weak signal — 36%
Deeply nested function calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py Weak signal — 36%
Magic string 'R10_no_signal' in compute_rule_trace
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:424 Weak signal — 36%
Magic number: cap at 10 conflicts may need to be adjusted in the future
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:448 Weak signal — 36%
Magic number: confidence calculation may need to be adjusted in the future
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:475 Weak signal — 36%
Magic number: score calculations may need to be adjusted in the future
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:34 Weak signal — 36%
Missing type hint for logger
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:201 Weak signal — 36%
Magic number used in _score_group method
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:391 Weak signal — 36%
Unused import
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_wired.py:121 Weak signal — 36%
The order dictionary is defined with magic numbers, it would be better to use named constants.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/diff_engine.py Weak signal — 36%
The compare method in the DiffEngine class is complex and has many nested loops, which could be simplified for better readability
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/git_diff.py:55 Weak signal — 36%
The `_run_git` function has a complex logic and it would be better to split it into smaller functions for better readability and maintainability.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus_support.py:34 Weak signal — 36%
Recursive function calls are not detected in the given code
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus_support.py:47 Weak signal — 36%
External API calls are not explicitly handled in the code
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus_support.py:101 Weak signal — 36%
The confidence_to_severity function has a complex logic and should be refactored for readability
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/context_headers.py:120 Weak signal — 36%
Deep nesting in build_conflict_map_from_arbiter function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/context_headers.py:100 Weak signal — 36%
Magic number (20) used in MAX_HEADER_FILES constant
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/ignore_rules.py:74 Weak signal — 36%
Recursive function call is not present but potential deep recursion can occur if the input file has many lines and complex rules
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/ignore_rules.py Weak signal — 36%
The method load can potentially throw an exception if the file does not exist or cannot be parsed, consider adding a try-except block for specific exceptions
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/ignore_rules.py Weak signal — 36%
Potential performance issue with the should_ignore_issue_like method if there are many rules and items to filter
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_clients.py:100 Weak signal — 36%
Duplicate code in 'call_claude' and 'call_gpt' functions
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_manager.py:280 Weak signal — 36%
Magic number: `45` and `15` are used in the code without clear explanation
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_manager.py:120 Weak signal — 36%
God object: `LLMManager` class has many responsibilities and attributes
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_support.py:123 Weak signal — 36%
The _prompt_cache dictionary is not properly synchronized, which could lead to data corruption in a multi-threaded environment.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW app/core/on_chain.py:797 Weak signal — 36%
Function chain_summary has multiple return paths
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW main.py:70 Weak signal — 36%
Creating a temporary probe file in _init_quota can cause a race condition when multiple instances start at the same time, potentially raising OSError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW cli.py:400 Weak signal — 36%
Calling args.format.split() without checking if args.format is None may raise AttributeError when the user omits the --format option.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/analyzer.py Weak signal — 36%
tests_count is set using max(tests_count, 1) for each entry, which resets the count to 1 instead of incrementing, leading to inaccurate test detection.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/analyzer.py Weak signal — 36%
The check for 'express()' in _looks_like_entrypoint is case‑sensitive, while other framework detections use lower‑cased content; this may miss matches like 'Express()'
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/analyzer.py Weak signal — 36%
Stack label inference compares language strings to capitalised names (e.g., "Python") but entry.language may be stored in lowercase, causing incorrect labeling of projects
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:27 Weak signal — 36%
build_score_reliability_context uses getattr(report, "requested_llms", report.total_llms) which will raise AttributeError if report.total_llms is missing; fallback should use getattr on report for total_llms as well
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/config/settings.py Weak signal — 36%
_save uses Path.replace for atomic rename, which is not reliably atomic on Windows and can raise PermissionError if the target file exists; consider using os.replace with proper error handling.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/arbiter.py Weak signal — 36%
_vote_states never assigns a 'partial' VoteStatus, so providers that should be marked as partial are incorrectly treated as 'full' or 'absent', breaking agreement calculations
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/arbiter_proof.py:115 Weak signal — 36%
Conflict signal uses '>' threshold but the documented threshold is 0.3 inclusive; should use '>=' to match specification
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/arbiter_proof.py:210 Weak signal — 36%
compute_rule_trace may return an empty final_level string when no rule matches, leading to undefined downstream handling; should default to 'routine'
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/consensus.py:480 Weak signal — 36%
Confidence calculation can exceed 1.0 because 0.45 + 0.1*severity_spread may be >1; should clamp to 1.0
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/consensus.py:496 Weak signal — 36%
Logic condition `if critical_issues and len(issues) <= 2:` seems inverted; likely should be `len(issues) >= 2` to apply soft floor when many issues exist
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/consensus.py:78 Weak signal — 36%
Mutates input issue dictionaries by adding a '_provider' key, causing side effects on callers
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/diff_engine.py:22 Weak signal — 36%
_same_issue returns False when either issue description is empty, causing identical issues without descriptions to be incorrectly classified as new or fixed
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/llm_support.py:75 Weak signal — 36%
In _resolve_prompt, only OSError is caught when reading prompt files; UnicodeDecodeError or other exceptions could propagate and crash the application.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/llm_support.py:56 Weak signal — 36%
normalize_issue_type replaces spaces with underscores but does not normalize hyphens or other separators, so inputs like "code-smell" will not be mapped correctly.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/ignore_rules.py:51 Weak signal — 36%
When parsing a "file:" rule, both type and severity can be present, but the code only handles one of them (type first, else severity). This can cause the severity part to be ignored.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/ignore_rules.py:56 Weak signal — 36%
If a "file:" line has neither type nor severity, the code adds a rule with kind "path" instead of a dedicated "file" kind, which is likely unintended and may affect rule matching logic.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/on_chain.py Weak signal — 36%
load_chain silently swallows JSONDecodeError and other exceptions, returning a partially loaded chain without any indication of corruption
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/prompt_sanitizer.py Weak signal — 36%
Block-level hidden Unicode patterns are removed without inserting a visible marker, violating the design rule "Never silently drop content — always replace with a visible marker".
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/provider_planner.py:22 Weak signal — 36%
Potential KeyError if SCAN_MODES entry for given scan_mode lacks the 'max_llms' key
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/provider_planner.py:44 Weak signal — 36%
If enabled_providers contains duplicate entries, prioritized_providers may return duplicate providers, leading to unexpected ordering
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/report_history.py:102 Weak signal — 36%
find_previous_entry sorts timestamps as plain strings, which may misorder entries if the timestamp format is not ISO‑lexicographically comparable.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/quota.py:56 Weak signal — 36%
_atomic_write does not ensure that the parent directory of the quota file exists, potentially raising an OSError and preventing the quota from being persisted.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/report_sections.py:12 Weak signal — 36%
Conditional check uses 'and' causing function to proceed when only one of profile or summary is missing, potentially leading to missing keys errors
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/report_sections.py:247 Weak signal — 36%
Assumes classify_provider_error returns a dict with 'short_label' key; missing key would raise a KeyError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/reporter.py:102 Weak signal — 36%
Walrus expression in debug_block always evaluates to truthy, making the else branch unreachable and unnecessary
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/reporter.py Weak signal — 36%
Button with onclick="openWhy()" references undefined JavaScript function, causing a runtime error when the user clicks the 'How is this score calculated?' button
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/report_output_v2.py:405 Weak signal — 36%
Appends a run object even when new_results is empty, resulting in empty runs in the merged SARIF output
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/system_info.py:176 Weak signal — 36%
_model_size_gb is annotated to return int but returns float values, causing type inconsistency
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/core/token_economics.py Weak signal — 36%
Comment lists five free providers (gemini, groq, cerebras, openrouter, ollama) but FREE_PROVIDERS list only includes three, causing the recommendation to ignore two available providers.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/analysis_support.py Weak signal — 36%
Using getattr with default report.total_llms evaluates report.total_llms even when the attribute may be missing, causing AttributeError if report lacks total_llms
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/analysis_support_patches.py:26 Weak signal — 36%
Assumes 'status' is a string; if None, status.startswith will raise AttributeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/chrome_presenter.py:33 Weak signal — 36%
ai_indicator_state returns a low‑priority color for exactly two ready providers, which is likely unintended (should probably use a medium priority color)
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/components.py:465 Weak signal — 36%
Uses value.startswith(prefixes) where prefixes may be a list, causing TypeError; ensure prefixes is a tuple or convert to tuple before calling startswith.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/components.py Weak signal — 36%
ApiKeyEntry references undefined method _toggle_show invoked by toggle button, causing AttributeError on click
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/components.py Weak signal — 36%
ApiKeyEntry context menu commands reference undefined methods _copy and _clear, leading to AttributeError when used
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/components.py Weak signal — 36%
ApiKeyEntry calls _validate_key method but it is not defined in this snippet, potentially causing AttributeError
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/icons.py:73 Weak signal — 36%
inline_svg adds width/height attributes without checking if they already exist, potentially resulting in duplicate attributes and malformed SVG.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/layout_topbar.py:79 Weak signal — 36%
Assumes 'window' has a '_settings' attribute; if missing an AttributeError will be raised.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/navigation.py Weak signal — 36%
open_browser_path uses success_message.format(name=target.name) without guarding against missing placeholder, which can raise a KeyError and crash the UI
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW app/ui/window_services.py:58 Weak signal — 36%
Missing validation that 'selected_folder' is a valid directory path; non‑existent paths could cause downstream failures.
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW tests/test_consensus_integration.py:91 Weak signal — 36%
Assumes each observation object has a .line attribute; may cause AttributeError or incorrect logic if structure differs
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW tests/test_core.py:744 Weak signal — 36%
Logic in test_consensus_observations_populated allows issues to pass if they meet a secondary condition, contradicting the docstring that solo low issues should never appear as issues
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
bug LOW tests/test_core.py:774 Weak signal — 36%
test_reporter_html_quota_failure asserts that "No issues detected" is not in the generated HTML, but a quota failure may still result in that phrase being present, making the test flaky
Detected by: ✓ cerebras ×0.9 1/3 provider(s) agreed
suggestion LOW main.py Weak signal — 34%
Consider implementing retry mechanism for API calls to handle potential network issues
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW cli.py:442 Weak signal — 34%
Consider adding a timeout for the 'execute_analysis_pipeline' function call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW cli.py Weak signal — 34%
Consider adding retry logic for timeout and connection errors in API calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW cli.py Weak signal — 34%
Consider adding logging and monitoring for better error tracking and debugging
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW pyinstaller_runtime_tk.py Weak signal — 34%
Consider using a try-except block to handle potential environment variable setting errors
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW pyinstaller_runtime_tk.py Weak signal — 34%
Path construction could be more robust, consider using os.path.join instead of the / operator
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/config/constants.py Weak signal — 34%
Consider using a more secure method to store API keys, such as environment variables or a secure key management system.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/analyzer.py:403 Weak signal — 34%
Consider using defaultdict for initializing counts dictionary
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/analyzer.py:471 Weak signal — 34%
Consider using a more efficient data structure for storing chunk boundaries
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/analyzer.py:524 Weak signal — 34%
Consider adding documentation for _chunk_files and _split_lines methods
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter.py:734 Weak signal — 34%
Consider using type hints for function return types
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter.py:123 Weak signal — 34%
Consider using a more efficient data structure for _CATEGORY_GROUPS
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter.py:943 Weak signal — 34%
Consider using defaultdict for coverage dictionary
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_proof.py:191 Weak signal — 34%
Consider adding input validation for function parameters
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_proof.py:17 Weak signal — 34%
Consider adding docstrings for complex functions
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py:464 Weak signal — 34%
Consider using a more robust sorting algorithm for hotspots
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py:271 Weak signal — 34%
Consider using a more efficient data structure for storing issues
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus.py:421 Weak signal — 34%
Consider adding more logging statements for debugging purposes
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_wired.py:67 Weak signal — 34%
The MetaIssue_cls could be defined as a dataclass to improve readability and maintainability.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/arbiter_wired.py:73 Weak signal — 34%
The _action_map dictionary could be replaced with a match statement to improve readability.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/diff_engine.py Weak signal — 34%
Consider adding a timeout to the SequenceMatcher ratio calculation to prevent potential performance issues
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/diff_engine.py Weak signal — 34%
Consider using a more efficient data structure than lists for the new, fixed, unchanged, worsened, and improved items
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/git_diff.py:66 Weak signal — 34%
The `last_commit_summary` function does not handle the case when there are no commits in the repository.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus_support.py:83 Weak signal — 34%
Consider adding error handling for the SequenceMatcher ratio method
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus_support.py:122 Weak signal — 34%
Consider adding a timeout for the best_description function to prevent potential performance issues
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/consensus_support.py Weak signal — 34%
The function names share_domain_keyword and lines_close could be more descriptive
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/context_headers.py:15 Weak signal — 34%
Consider adding error handling for load_history function call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/context_headers.py:180 Weak signal — 34%
Consider adding logging statements for exception handling in build_conflict_map_for_run
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/ignore_rules.py Weak signal — 34%
Consider using a context manager for the file operation in load method
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/ignore_rules.py Weak signal — 34%
Consider adding input validation for the project_root parameter in the load method
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/llm_clients.py:150 Weak signal — 34%
Consider using a more robust HTTP client library
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/llm_support.py:401 Weak signal — 34%
The classify_provider_error() function has a complex set of conditions, which could be simplified for better maintainability.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:807 Weak signal — 34%
Consider using a try-except block for potentially error-prone operations like time.strftime
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:389 Weak signal — 34%
Consider adding input validation for the chain and record parameters in the append_record function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:437 Weak signal — 34%
Consider adding a check to handle the case where the chain is empty before verifying it
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:521 Weak signal — 34%
Consider adding error handling for the case where the report_content or sarif_content is not a valid JSON string
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:596 Weak signal — 34%
Consider adding a check to ensure that the record_scan_to_chain function is called with the correct parameters
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:673 Weak signal — 34%
Consider adding a check to handle the case where the IPFS upload fails
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:734 Weak signal — 34%
Consider adding a check to handle the case where the EVM contract call fails
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
suggestion LOW app/core/on_chain.py:796 Weak signal — 34%
Consider adding a check to handle the case where the project_path_str is not a valid string
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
smell LOW main.py:31 Weak signal — 34%
RotatingFileHandler may fail if the parent directory of the log file does not exist; ensure the directory is created before adding the handler
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW main.py:115 Weak signal — 34%
Console logger is configured at INFO level, which may expose sensitive information in production; consider using WARNING or higher
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW cli.py:112 Weak signal — 34%
Duplicate 'key' and 'status' fields in provider row dict for non-ollama providers, both set to the same value
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW cli.py:447 Weak signal — 34%
Using an empty string ('') as a sentinel value for disabling the illusion gate makes the control flow harder to understand and maintain.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/config/constants.py Weak signal — 34%
Mutable module-level dictionaries (e.g., LLM_PROVIDERS, PROVIDER_SETUP, PROVIDER_BENCHMARKS) can be modified at runtime, potentially causing unintended side‑effects across imports.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:94 Weak signal — 34%
Dataclass AnalysisPipelineResult uses mutable default values (List, Dict) set to None; consider using default_factory for proper immutability
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py Weak signal — 34%
Inconsistent use of logging helpers: 'log' is used throughout, but 'logger.warning' is used in the SARIF v2 fallback block
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py Weak signal — 34%
Imported 'ReportOutputContext' in the SARIF v2 generation block but never used, leading to unnecessary import
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/analyzer.py Weak signal — 34%
Magic number 20 is used to filter out short/minified files (len(content.strip()) < 20). This should be a configurable constant.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/analyzer.py Weak signal — 34%
The docstring of _split_lines says "Yield" but the method returns a list, which is misleading and could cause confusion for maintainers
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter.py:923 Weak signal — 34%
Potential KeyError: provider_seen may not have key pid when accessing provider_seen[pid].setdefault; ensure provider_seen is a defaultdict or initialize an empty dict for each pid before use.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py:46 Weak signal — 34%
ProofBundle mentions a seal() method but it is not implemented, risking misuse of mutable state
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/arbiter_proof.py:465 Weak signal — 34%
summarize_proof prints Python list objects for signals and rule IDs; joining them into strings would improve readability
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:421 Weak signal — 34%
Hard‑coded limit of 10 conflicts may hide additional disagreements; consider making the limit configurable
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py Weak signal — 34%
Repeated use of inline lambda functions for sorting could be replaced with named functions for clarity
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus.py:101 Weak signal — 34%
Redundant assignment to report.total_llms before and after effective_providers calculation, which may cause confusion
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/diff_engine.py:41 Weak signal — 34%
compare method uses a nested loop with O(n^2) complexity; performance will degrade on large issue lists and could be optimized with hash‑based matching
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/git_diff.py:65 Weak signal — 34%
_filter_supported builds a list manually; can be expressed more concisely with a list comprehension for readability.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/consensus_support.py:46 Weak signal — 34%
confidence_to_severity caps severity index to 2, preventing a 'critical' raw_severity from being returned even when confidence is high enough, which may understate severity.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/context_headers.py:115 Weak signal — 34%
Broad except clause catches all exceptions and silently returns empty dict, which can mask errors
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_clients.py:190 Weak signal — 34%
call_ollama creates an httpx.Client without using a context manager, so the underlying connection pool may remain open after the request
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_clients.py:45 Weak signal — 34%
resolve_max_tokens silently defaults to a fixed value when an unknown scan_mode is provided, which may hide configuration errors
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_support.py:75 Weak signal — 34%
Catching only OSError when reading prompt files is a code smell; a broader exception handling (e.g., Exception) would be safer and more maintainable.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/llm_support.py:30 Weak signal — 34%
The _TYPED_PROMPT_FILES dictionary contains placeholder entries for prompts that may not exist (e.g., architecture_guard, speed_reviewer, smell_detector), leading to unnecessary filesystem checks.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/on_chain.py Weak signal — 34%
ScanChain._lock is defined but never used anywhere in the module, indicating dead code or missing thread‑safety when mutating the chain
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/on_chain.py:389 Weak signal — 34%
append_record rewrites the entire chain file on each append, leading to O(n) disk I/O and potential performance degradation as the chain grows.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/provider_planner.py:31 Weak signal — 34%
normalize_provider_profile is called twice for the same profile, causing redundant computation
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/report_history.py:71 Weak signal — 34%
load_history reads the entire history file into memory without any size guard; a very large or corrupted file could cause high memory usage.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/quota.py:44 Weak signal — 34%
Uses deprecated hmac.new() API instead of the modern hmac.HMAC() constructor.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/quota.py:92 Weak signal — 34%
Potential race condition: concurrent calls to consume() can interleave, leading to lost updates of the usage counter because _record is mutated without any locking.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/report_sections.py:176 Weak signal — 34%
Coverage line string is inserted into HTML without escaping, inconsistent with other fields
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/report_sections.py:210 Weak signal — 34%
Heavy use of inline f‑strings for HTML assembly reduces readability; a templating approach would be clearer
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/reporter.py:33 Weak signal — 34%
_SEV_COLOR dictionary is defined but never used anywhere in the module
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/reporter.py:605 Weak signal — 34%
Conditional `line_str = f":"{issue.line}` uses a falsy check, so a line number of 0 will be omitted, potentially hiding valid issue locations.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/reporter.py Weak signal — 34%
Large inline f-string HTML makes the function difficult to read and maintain; consider extracting the markup to a dedicated template or using a templating engine
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/report_output_v2.py:379 Weak signal — 34%
Loads entire SARIF file into memory with Path.read_text, which may cause high memory usage for large files
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/report_output_v2.py Weak signal — 34%
Linking all CWE taxon IDs to each rule (potentially large N^2 relationship) can cause SARIF document bloat; consider limiting relationships per rule
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/system_info.py:131 Weak signal — 34%
Unused import 'json' in _list_local_ollama_models
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/theme.py Weak signal — 34%
The DARK and LIGHT dictionaries are mutable globals and are returned directly, allowing external code to accidentally modify the theme constants at runtime
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/core/typed_prompts.py Weak signal — 34%
Unused constant _VALID_CONFIDENCE_BASIS is defined but never used
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/license/offline_activation.py Weak signal — 34%
Importing sha256 inside machine_fingerprint function instead of top-level import increases overhead
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/analysis_support.py Weak signal — 34%
Unused variable 'started' is assigned but never used in execute_analysis_pipeline
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/analysis_support.py Weak signal — 34%
The 'settings' parameter in execute_analysis_pipeline lacks a specific type hint, making the API less clear; add a proper SettingsManager type annotation
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/analysis_support.py Weak signal — 34%
In build_local_provider_benchmarks, the variable 'attempts' is already forced to be at least 1, so the extra max(1, attempts) when computing avg_chunk is redundant
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/analysis_support.py:393 Weak signal — 34%
Using datetime.now() creates naive timestamps; consider using timezone-aware UTC timestamps to avoid ambiguity across time zones
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/license/engine.py Weak signal — 34%
Repeated computation of machine fingerprint and secret could be cached to avoid unnecessary hashing on each call
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/analysis_support_patches.py:39 Weak signal — 34%
Catches generic Exception, which can mask unexpected errors
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/chrome_presenter.py:14 Weak signal — 34%
Importing os inside workspace_display_name adds unnecessary overhead; the import should be moved to module level
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/components.py:447 Weak signal — 34%
Catches generic Exception in _copy, which can mask unrelated errors; should catch only expected exceptions.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/components.py:442 Weak signal — 34%
Duplicate except blocks for tk.TclError and generic Exception both log the same message; can be consolidated into a single block.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/components.py Weak signal — 34%
Directly accessing private attribute self._entry._entry breaks encapsulation and may break with future customtkinter versions
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/layout_builder.py:14 Weak signal — 34%
Missing docstring for the 'build_layout' function; adding a docstring would improve maintainability and documentation.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/icons.py:75 Weak signal — 34%
Using str.replace to modify the <svg> tag replaces all occurrences, which could unintentionally alter nested <svg> elements or similar substrings.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/layout_topbar.py:9 Weak signal — 34%
Imported constant COLOR_BG is never used in this module.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/main_window.py:78 Weak signal — 34%
Broad except Exception blocks (e.g., icon loading, intent handling) swallow all errors, making debugging harder.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/main_window.py Weak signal — 34%
Repeated calls to MainWindow._svc(self) in each helper method cause unnecessary overhead; consider caching the service instance in a local variable.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/navigation.py Weak signal — 34%
Repeated pattern of calling open_browser_path followed by immediate return appears in open_report and open_last_html_report; consider extracting a helper to reduce duplication
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/results_presenter.py Weak signal — 34%
Repeated creation of CTkLabel widgets inside loops (render_conflict_heatmap and render_verdict_banner) may lead to performance degradation with many items; consider using a virtualized list or limiting rendered items
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/results_presenter.py Weak signal — 34%
Magic string fallback "#aaa" for unknown severity colors in render_conflict_heatmap is unclear; define a constant or handle unknown severities explicitly
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/settings_static_tabs.py Weak signal — 34%
Repeated pattern of creating a CTkFrame and adding two CTkLabel widgets for each card; consider extracting a helper function to reduce duplication and improve maintainability.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/settings_services.py Weak signal — 34%
Multiple functions catch generic Exception (quota_text, reset_quota, export_diagnostics) which hides specific errors and makes debugging harder
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/settings_view.py Weak signal — 34%
API key entry widgets are packed into the scrollable frame instead of their row container, leading to inconsistent UI layout.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/settings_view.py Weak signal — 34%
Catching generic Exception in _paste_license and _copy_machine_fingerprint masks errors; catch specific exceptions instead
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW tests/conftest.py:66 Weak signal — 34%
Setting OS-level TMP/TEMP/TMPDIR environment variables globally can unintentionally affect subprocesses; evaluate necessity
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/window_services.py:33 Weak signal — 34%
Method name 'selected_llms' shadows the attribute name, which may cause confusion and accidental recursion if an attribute with the same name is added later.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW app/ui/window_services.py:46 Weak signal — 34%
Hardcoded default LLM list ['claude', 'gpt'] inside 'build_analysis_launch_decision' reduces configurability; consider externalizing to settings.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW tests/test_consensus_integration.py:11 Weak signal — 34%
Modifying sys.path at runtime can introduce import side‑effects and mask import errors
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW tests/live_test.py Weak signal — 34%
Temporary file created for the built-in sample (tempfile.NamedTemporaryFile with delete=False) is never removed, leaving stray files on the filesystem after execution.
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW tests/test_core.py:794 Weak signal — 34%
Hard‑coded timestamp strings (e.g., "20260321_120000") make tests less flexible and may cause failures if the format changes
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
smell LOW main.py:78 Weak signal — 31%
The condition `if probe.exists():` before `probe.unlink()` is redundant. If `probe.touch()` succeeded, `probe.exists()` will always be true. If `probe.touch()` failed, `probe.unlink()` would not be reached, or an exception would already have occurred.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW main.py:70 Weak signal — 31%
The error message for a missing app data directory suggests it's 'usually caused by a permissions issue'. While possible, the primary problem is the directory not existing, which could also be due to misconfiguration or accidental deletion, making the 'permissions issue' part potentially misleading.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW cli.py:446 Weak signal — 31%
The logic for parsing and defaulting `args.fail_on_illusion` is convoluted. An empty string (`""`) provided by the user is explicitly set to "medium" (line 450), while a missing argument (`None`) becomes an empty string, which is then interpreted as "disabled" (line 457). This asymmetry and complex handling can be confusing for users and lead to unexpected behavior.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW cli.py:91 Weak signal — 31%
Redundant `import os` inside `resolve_api_keys`. The `os` module is already imported at the top of the file (line 20).
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW cli.py:228 Weak signal — 31%
The `sys.stdout.reconfigure` call is wrapped in an overly broad `except Exception`. This can silently suppress important errors related to stdout reconfiguration that might indicate environment issues.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW app/config/constants.py Weak signal — 31%
The 'requires_key' attribute is redundantly defined in both the 'LLM_PROVIDERS' and 'PROVIDER_SETUP' dictionaries for each LLM provider. This duplication creates two sources of truth and could lead to inconsistencies if updates are not synchronized.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:383 Weak signal — 31%
Direct instantiation of `SuppressionManager` inside the function reduces testability and flexibility. Consider passing an instance or a factory as a dependency.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
smell LOW app/core/analysis_support_v160.py:418 Weak signal — 31%
The `variable if variable else None` pattern (e.g., `meta_issues if meta_issues else None`) is verbose and repeated. If downstream functions treat `None` and empty collections equivalently, the variable can be passed directly. If `None` specifically signifies 'no data' while an empty collection signifies 'empty data set', this pattern might be intentional, but it's worth clarifying this intent.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
suggestion LOW main.py:58 Weak signal — 29%
Add a specific return type hint to `_init_settings` (e.g., `-> SettingsManager`) to match the detail in its docstring and improve type checking.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
suggestion LOW main.py:133 Weak signal — 29%
The string literal `"1"` used to check the `NEXAVERIFY_SMOKE_CHECK` environment variable could be defined as a named constant for improved readability and maintainability.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
suggestion LOW cli.py:141 Weak signal — 29%
Hardcoded French strings are used in `_classify_provider_error` and `_print_provider_summary`. This limits the application's internationalization capabilities. Consider using a localization framework for user-facing messages.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
suggestion LOW cli.py:69 Weak signal — 29%
The help text for `--fail-on-illusion` is slightly ambiguous regarding its default behavior. It states 'Default when flag present: `medium`', which could be misinterpreted when the flag is not present at all, as the `const` argument only applies when the flag is present without an explicit value.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
suggestion LOW app/core/analysis_support_v160.py:398 Weak signal — 29%
Using `datetime.now()` without timezone information can lead to inconsistencies. Consider using `datetime.now(timezone.utc)` or `datetime.utcnow()` for `run_timestamp` to ensure global consistency.
Detected by: ✓ gemini ×0.6 1/3 provider(s) agreed
bug LOW main.py:104 Weak signal — 28%
Potential N+1 query issue in _init_quota function where QuotaManager is instantiated inside a function call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW main.py Weak signal — 28%
No error handling is performed when loading the MainWindow which could lead to unhandled exceptions
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW cli.py:434 Weak signal — 28%
Missing error handling for 'quota.consume()' call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW cli.py Weak signal — 28%
Potential 'None' value for 'report.provider_stats' and 'report.failed_providers'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW cli.py Weak signal — 28%
Missing error handling for quota and rate limiting in resolve_selected_providers function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW cli.py Weak signal — 28%
Potential bug with missing validation for --min-occurrences argument
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analyzer.py Weak signal — 28%
Potential edge case: empty lines list in _split_lines method
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:303 Weak signal — 28%
The diversity score calculation is not validated for potential division by zero errors.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:369 Weak signal — 28%
The ignore_rules.filter_issue_like calls do not handle potential None values in the report issues, which could lead to AttributeError.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:408 Weak signal — 28%
Potential division by zero error in 'report.score = engine.calculate_score(report.issues)'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:446 Weak signal — 28%
Potential issue with 'sarif_v2_active' variable
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/analysis_support_v160.py:467 Weak signal — 28%
Potential issue with 'output_paths' dictionary
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/config/settings.py:203 Weak signal — 28%
Uncaught exception during settings load may cause data loss
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/config/settings.py:311 Weak signal — 28%
Decrypting secrets may fail silently and return empty string
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/config/settings.py:395 Weak signal — 28%
Singleton pattern may lead to issues with multiple threads or processes
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter.py:921 Weak signal — 28%
Potential KeyError when accessing 'chunk_index' key in issue dictionary
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter.py:936 Weak signal — 28%
Potential KeyError when accessing 'total_chunks' key in CoverageMap
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter_proof.py:428 Weak signal — 28%
Potential KeyError in compute_rule_trace if active_signal_names is empty
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter_proof.py Weak signal — 28%
No error handling for _hash_inputs and _hash_output
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:404 Weak signal — 28%
Potential KeyError: provider_severities dictionary may not contain all provider IDs
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:412 Weak signal — 28%
Potential IndexError: max(vals) - min(vals) may raise IndexError if vals is empty
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:441 Weak signal — 28%
Potential AttributeError: issue.description may be None
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:486 Weak signal — 28%
Potential ZeroDivisionError: issue.source_count may be zero
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:123 Weak signal — 28%
Potential AttributeError when accessing issue['file'] or issue['type']
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/consensus.py:306 Weak signal — 28%
Potential KeyError when accessing issue['_provider']
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter_wired.py:73 Weak signal — 28%
The _action_map dictionary does not handle the case where the attention level is not one of 'routine', 'review', or 'critical'.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/arbiter_wired.py:104 Weak signal — 28%
The build_proof_bundle function is called without error handling, which could lead to unexpected behavior if an exception is thrown.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/diff_engine.py Weak signal — 28%
The _same_issue function does not handle the case where the 'type' or 'file' key is missing from the issue dictionary
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/git_diff.py:34 Weak signal — 28%
The function `changed_files` does not handle the case when `base_ref` is not a valid Git reference.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/git_diff.py:64 Weak signal — 28%
The `current_branch` function does not handle the case when the repository is in a detached HEAD state.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_clients.py:70 Weak signal — 28%
Potential JSON parsing error in 'guard_truncation' function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_clients.py:300 Weak signal — 28%
Potential error in 'call_ollama' function when 'base_url' parameter is empty
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_manager.py:246 Weak signal — 28%
Potential null pointer exception: `api_key` or `cfg` might be null
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_manager.py:100 Weak signal — 28%
Potential threading issue: `self._providers` list is not thread-safe
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_support.py:173 Weak signal — 28%
Potential issue with load_prompt() function where it does not handle the case where the prompt file does not exist and logging does not capture the exception.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
bug LOW app/core/llm_support.py:246 Weak signal — 28%
validate_issues() function does not handle the case where the raw issue list is None, which could lead to a TypeError.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW cli.py:71 Weak signal — 26%
Imports os inside resolve_api_keys function despite being already imported at module level; may indicate unnecessary import and potential shadowing
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW cli.py:486 Weak signal — 26%
Printing raw provider error messages may expose internal exception details or sensitive information to the end user.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW main.py:134 Weak signal — 26%
Environment variable NEXAVERIFY_SMOKE_CHECK is used without validation, allowing an attacker to trigger the smoke‑check path unintentionally
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/config/settings.py Weak signal — 26%
The local secret key file is only chmod'ed on non-Windows platforms; on Windows the file may have overly permissive permissions, exposing encryption keys.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/core/arbiter_proof.py:440 Weak signal — 26%
Direct equality check of hashes may allow timing attacks; use constant-time comparison like hmac.compare_digest
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/core/git_diff.py:73 Weak signal — 26%
Path returned by git diff is not validated for directory traversal, allowing potentially unsafe relative paths to be processed.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/core/analyzer.py Weak signal — 26%
Symlink files could bypass the path traversal check if a symlink resolves outside the project root after the commonpath check; add explicit resolve and containment verification.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/core/reporter.py Weak signal — 26%
CSS style injects raw variable score_col into style attribute without sanitization, which could be exploited for CSS injection if score_col is not a trusted value
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/license/engine.py Weak signal — 26%
License cache file is written without restrictive permissions, potentially exposing the HMAC signature and cache contents to other users
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/ui/main_window.py:115 Weak signal — 26%
Folder paths are logged with self._log, potentially exposing sensitive user data in logs.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
security LOW app/ui/settings_view.py Weak signal — 26%
Web browser is opened directly from UI via webbrowser.open without validation; if PROVIDER_SETUP data is compromised, it could be used for phishing.
Detected by: ✓ cerebras ×0.8 1/3 provider(s) agreed
financial_risk LOW cli.py Weak signal — 24%
Potential N+1 query issue with 'report.provider_stats' and 'report.failed_providers'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW cli.py:393 Weak signal — 24%
Potential information leak through logging of 'exc' exception
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW cli.py Weak signal — 24%
Potential security vulnerability with unvalidated API keys in resolve_api_keys function
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW cli.py Weak signal — 24%
Potential security vulnerability with missing input validation for --scan argument
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW main.py Weak signal — 24%
API call missing timeout in _launch_ui function where MainWindow is instantiated
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW main.py Weak signal — 24%
No validation is performed on environment variables which could lead to security vulnerabilities
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/constants.py Weak signal — 24%
Hardcoded secrets detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/constants.py Weak signal — 24%
Improper Input Validation detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/constants.py Weak signal — 24%
XSS detected
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/constants.py Weak signal — 24%
The code uses the 'os' module to access environment variables, which could be a security risk if not properly validated.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/config/constants.py Weak signal — 24%
API call missing timeout
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/config/constants.py Weak signal — 24%
Heavy library used for a standard library capable task
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/config/constants.py Weak signal — 24%
API calls are made without a timeout, which could lead to financial losses due to unpredictable API response times.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/analysis_support_v160.py:278 Weak signal — 24%
The context_map is passed to the LLMManager without any validation or sanitization, potentially allowing an attacker to inject malicious context headers.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/analysis_support_v160.py:214 Weak signal — 24%
The LLMManager.analyze_chunks method makes API calls in a loop without any timeout or retry mechanism, which could lead to financial losses due to timeout or network issues.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/analysis_support_v160.py:418 Weak signal — 24%
API call missing timeout in 'comparison = compare_against_previous(load_history(output_dir), build_history_entry(project_path=folder, scan_mode=scan_mode, timestamp=run_timestamp, report=report, output_paths={}))'
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/settings.py:123 Weak signal — 24%
Potential data exposure due to plaintext storage of Ollama base URL
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/settings.py:244 Weak signal — 24%
Insecure encryption method used for secrets
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/settings.py:283 Weak signal — 24%
Windows-only DPAPI encryption may not be secure on other platforms
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/settings.py:333 Weak signal — 24%
Local secret key file permissions may be insecure
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/config/settings.py:375 Weak signal — 24%
Potential for timing attacks due to lack of timeout in API calls
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/arbiter.py:456 Weak signal — 24%
Potential data tampering vulnerability in ConsensusOutput class
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/arbiter.py:789 Weak signal — 24%
Potential N+1 query issue in MetaEngine class
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/arbiter_proof.py Weak signal — 24%
Potential hash collision vulnerability in _hash_proof_chain
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/consensus.py Weak signal — 24%
Potential information disclosure: issues and conflicts may contain sensitive data
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/consensus.py Weak signal — 24%
Missing API call timeout
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/consensus.py Weak signal — 24%
Potential performance issue: large number of issues and conflicts may impact system performance
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/arbiter_wired.py:104 Weak signal — 24%
The build_proof_bundle function may be vulnerable to a denial of service attack if it is called with malicious input.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/arbiter_wired.py:67 Weak signal — 24%
The MetaIssue_cls may be vulnerable to a data injection attack if it is not properly validated.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/arbiter_wired.py:104 Weak signal — 24%
The build_proof_bundle function is called inside a loop, which could lead to performance issues and increased costs.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/git_diff.py:44 Weak signal — 24%
The `subprocess.run` function is used with the `capture_output=True` argument, which can lead to security vulnerabilities if not handled properly.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/git_diff.py:44 Weak signal — 24%
The `subprocess.run` function is used without a timeout, which can lead to infinite waits and increased resource usage.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/context_headers.py:141 Weak signal — 24%
Potential DoS vulnerability if arbiter_summary is extremely large
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/context_headers.py Weak signal — 24%
Missing timeout for load_history function call
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/llm_clients.py:30 Weak signal — 24%
Unvalidated user input in 'scan_mode' parameter
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/llm_clients.py:200 Weak signal — 24%
Potential for excessive API calls without proper rate limiting
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/llm_manager.py:155 Weak signal — 24%
Potential information disclosure: logging of sensitive information like API keys or provider IDs
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/llm_manager.py:320 Weak signal — 24%
Potential API call without timeout: `caller` function call does not have a timeout
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/llm_support.py Weak signal — 24%
The load_prompt() function makes an API call to load the prompt, which could lead to additional costs if not properly handled.
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
security LOW app/core/on_chain.py:815 Weak signal — 24%
Potential command injection vulnerability in 'how_to_verify' string construction
Detected by: ✓ groq ×0.7 1/3 provider(s) agreed
financial_risk LOW cli.py:151 Weak signal — 22%
Call to get_ollama_recommendation may perform an external API request without explicit timeout handling
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/analysis_support_v160.py:170 Weak signal — 22%
API call to LLM providers via LLMManager.analyze_chunks may lack a timeout, risking hanging calls that can incur cost
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed
financial_risk LOW app/core/llm_clients.py:210 Weak signal — 22%
call_ollama does not pass an explicit timeout to the OpenAI chat completion request; relies on http_client timeout only which may be ignored in some client implementations
Detected by: ✓ cerebras ×0.7 1/3 provider(s) agreed