{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-e4894faf534625f4", "name": "Possibly dead Python function: env_bool", "shortDescription": {"text": "Possibly dead Python function: env_bool"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f6c2a56a4934ed5", "name": "Possibly dead Python function: print_context_summary", "shortDescription": {"text": "Possibly dead Python function: print_context_summary"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cefebc9d34b9f2a3", "name": "Possibly dead Python function: translate", "shortDescription": {"text": "Possibly dead Python function: translate"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e35fae6ca8f0a0fe", "name": "Possibly dead Python function: parse_strategy_symbols", "shortDescription": {"text": "Possibly dead Python function: parse_strategy_symbols"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ced379a806047008", "name": "Possibly dead Python function: restart_bot_after_state_reset", "shortDescription": {"text": "Possibly dead Python function: restart_bot_after_state_reset"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7adf26eaac56bec", "name": "Possibly dead Python function: task", "shortDescription": {"text": "Possibly dead Python function: task"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36ed3c4a7e28a582", "name": "Possibly dead Python function: load_summary", "shortDescription": {"text": "Possibly dead Python function: load_summary"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d9e986392f6b825", "name": "Possibly dead Python function: load_positions", "shortDescription": {"text": "Possibly dead Python function: load_positions"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a219ef70bf0a6af", "name": "Possibly dead Python function: record_close", "shortDescription": {"text": "Possibly dead Python function: record_close"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8892d8a75a4f9b7", "name": "Possibly dead Python function: load_account", "shortDescription": {"text": "Possibly dead Python function: load_account"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5335f82891084ae", "name": "Possibly dead Python function: background_task", "shortDescription": {"text": "Possibly dead Python function: background_task"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-34027e1cf1a8d846", "name": "Possibly dead Python function: run_forever", "shortDescription": {"text": "Possibly dead Python function: run_forever"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77a464701f01cedf", "name": "Possible secret in README.md", "shortDescription": {"text": "Possible secret in README.md"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9f48fab2e59d38ea", "name": "Public display field 'username' saved without validation in dashboard.py:2423", "shortDescription": {"text": "Public display field 'username' saved without validation in dashboard.py:2423"}, "fullDescription": {"text": "`username` is assigned directly from request field `username`. Public labels that accept URLs, HTML-like text, control characters, or bidi overrides can become trusted-looking phishing links in emails/UI even when templates escape HTML."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a7cbf7e26e697c9", "name": "Very large file: dashboard.py (3254 lines)", "shortDescription": {"text": "Very large file: dashboard.py (3254 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71080e25000cc762", "name": "Very large file: local_strategy_engine.py (1360 lines)", "shortDescription": {"text": "Very large file: local_strategy_engine.py (1360 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 13 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 11 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmarket_news.py:env_int, stock_intelligence.py:env_int\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1439a6cf49999700", "name": "Flask mutation route `webhook` without `@login_required` \u2014 bot.py:760", "shortDescription": {"text": "Flask mutation route `webhook` without `@login_required` \u2014 bot.py:760"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b82e4e800c9eefee", "name": "Flask mutation route `login` without `@login_required` \u2014 dashboard.py:1340", "shortDescription": {"text": "Flask mutation route `login` without `@login_required` \u2014 dashboard.py:1340"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-93ad4d83ba93c4d9", "name": "Flask mutation route `register` without `@login_required` \u2014 dashboard.py:1370", "shortDescription": {"text": "Flask mutation route `register` without `@login_required` \u2014 dashboard.py:1370"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a686f34e0cd7380", "name": "Flask mutation route `admin_db_management` without `@login_required` \u2014 dashboard.py:1519", "shortDescription": {"text": "Flask mutation route `admin_db_management` without `@login_required` \u2014 dashboard.py:1519"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f385bdc2c60290a7", "name": "Flask mutation route `admin_strategy` without `@login_required` \u2014 dashboard.py:1535", "shortDescription": {"text": "Flask mutation route `admin_strategy` without `@login_required` \u2014 dashboard.py:1535"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-acc787ea9fa1f166", "name": "Flask mutation route `api_strategy_remote_complete` without `@login_required` \u2014 dashboard.py:1968", "shortDescription": {"text": "Flask mutation route `api_strategy_remote_complete` without `@login_required` \u2014 dashboard.py:1968"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3ffd3f4a22711b1", "name": "Flask mutation route `admin_backfill_trades` without `@login_required` \u2014 dashboard.py:2123", "shortDescription": {"text": "Flask mutation route `admin_backfill_trades` without `@login_required` \u2014 dashboard.py:2123"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa912f0b23288032", "name": "Flask mutation route `admin_reset_trade_history` without `@login_required` \u2014 dashboard.py:2215", "shortDescription": {"text": "Flask mutation route `admin_reset_trade_history` without `@login_required` \u2014 dashboard.py:2215"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9986aeceb707ea4", "name": "Flask mutation route `api_admin_server_restart` without `@login_required` \u2014 dashboard.py:2315", "shortDescription": {"text": "Flask mutation route `api_admin_server_restart` without `@login_required` \u2014 dashboard.py:2315"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6736897030fd928", "name": "Flask mutation route `api_admin_pull_updates` without `@login_required` \u2014 dashboard.py:2323", "shortDescription": {"text": "Flask mutation route `api_admin_pull_updates` without `@login_required` \u2014 dashboard.py:2323"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f06b923281593d24", "name": "Flask mutation route `api_admin_rollback` without `@login_required` \u2014 dashboard.py:2364", "shortDescription": {"text": "Flask mutation route `api_admin_rollback` without `@login_required` \u2014 dashboard.py:2364"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e89b26fc84febb4", "name": "Flask mutation route `admin_create_user` without `@login_required` \u2014 dashboard.py:2393", "shortDescription": {"text": "Flask mutation route `admin_create_user` without `@login_required` \u2014 dashboard.py:2393"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd1b696fd593a18c", "name": "Flask mutation route `admin_update_user` without `@login_required` \u2014 dashboard.py:2416", "shortDescription": {"text": "Flask mutation route `admin_update_user` without `@login_required` \u2014 dashboard.py:2416"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e04ad5c9c5ef4dd", "name": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 dashboard.py:2432", "shortDescription": {"text": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 dashboard.py:2432"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a261b1914bdd56d9", "name": "Flask mutation route `admin_delete_user` without `@login_required` \u2014 dashboard.py:2450", "shortDescription": {"text": "Flask mutation route `admin_delete_user` without `@login_required` \u2014 dashboard.py:2450"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-348b5f1de694b2a8", "name": "Flask mutation route `api_admin_close_trades` without `@login_required` \u2014 dashboard.py:2736", "shortDescription": {"text": "Flask mutation route `api_admin_close_trades` without `@login_required` \u2014 dashboard.py:2736"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0cb02810e013e9e6", "name": "Flask mutation route `admin_investor_config` without `@login_required` \u2014 dashboard.py:3156", "shortDescription": {"text": "Flask mutation route `admin_investor_config` without `@login_required` \u2014 dashboard.py:3156"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/27668"}, "properties": {"repository": "marian1x/fallback", "repoUrl": "https://github.com/marian1x/fallback", "branch": "main"}, "results": [{"ruleId": "scanner-e4894faf534625f4", "level": "note", "message": {"text": "Possibly dead Python function: env_bool"}, "properties": {"repobilityId": "ac376b37cf19df97", "scanner": "scanner-primary", "fingerprint": "e4894faf534625f4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "market_news.py:41"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f6c2a56a4934ed5", "level": "note", "message": {"text": "Possibly dead Python function: print_context_summary"}, "properties": {"repobilityId": "e784bf0a58129dec", "scanner": "scanner-primary", "fingerprint": "0f6c2a56a4934ed5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "market_news.py:355"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cefebc9d34b9f2a3", "level": "note", "message": {"text": "Possibly dead Python function: translate"}, "properties": {"repobilityId": "80ee4284ee3a9ad6", "scanner": "scanner-primary", "fingerprint": "cefebc9d34b9f2a3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:225"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e35fae6ca8f0a0fe", "level": "note", "message": {"text": "Possibly dead Python function: parse_strategy_symbols"}, "properties": {"repobilityId": "2333df0aee2a5070", "scanner": "scanner-primary", "fingerprint": "e35fae6ca8f0a0fe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:872"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ced379a806047008", "level": "note", "message": {"text": "Possibly dead Python function: restart_bot_after_state_reset"}, "properties": {"repobilityId": "391b57522c82696a", "scanner": "scanner-primary", "fingerprint": "ced379a806047008", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2244"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f7adf26eaac56bec", "level": "note", "message": {"text": "Possibly dead Python function: task"}, "properties": {"repobilityId": "201fcc917f27bd31", "scanner": "scanner-primary", "fingerprint": "f7adf26eaac56bec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2304"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-36ed3c4a7e28a582", "level": "note", "message": {"text": "Possibly dead Python function: load_summary"}, "properties": {"repobilityId": "ec84c5f6cf02ef8c", "scanner": "scanner-primary", "fingerprint": "36ed3c4a7e28a582", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2628"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4d9e986392f6b825", "level": "note", "message": {"text": "Possibly dead Python function: load_positions"}, "properties": {"repobilityId": "58ae630d8c225405", "scanner": "scanner-primary", "fingerprint": "4d9e986392f6b825", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2814"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6a219ef70bf0a6af", "level": "note", "message": {"text": "Possibly dead Python function: record_close"}, "properties": {"repobilityId": "35d637a357d86882", "scanner": "scanner-primary", "fingerprint": "6a219ef70bf0a6af", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2765"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8892d8a75a4f9b7", "level": "note", "message": {"text": "Possibly dead Python function: load_account"}, "properties": {"repobilityId": "9ab0b503b1ecacd7", "scanner": "scanner-primary", "fingerprint": "d8892d8a75a4f9b7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:2932"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d5335f82891084ae", "level": "note", "message": {"text": "Possibly dead Python function: background_task"}, "properties": {"repobilityId": "20ae258c8487aacb", "scanner": "scanner-primary", "fingerprint": "d5335f82891084ae", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py:3099"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-34027e1cf1a8d846", "level": "note", "message": {"text": "Possibly dead Python function: run_forever"}, "properties": {"repobilityId": "98d17d01e2d07f4e", "scanner": "scanner-primary", "fingerprint": "34027e1cf1a8d846", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "local_strategy_engine.py:176"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-77a464701f01cedf", "level": "error", "message": {"text": "Possible secret in README.md"}, "properties": {"repobilityId": "03df1be0543b7759", "scanner": "scanner-primary", "fingerprint": "77a464701f01cedf", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "README.md"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-9f48fab2e59d38ea", "level": "warning", "message": {"text": "Public display field 'username' saved without validation in dashboard.py:2423"}, "properties": {"repobilityId": "5a6462b8b1e23ef5", "scanner": "scanner-primary", "fingerprint": "9f48fab2e59d38ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "input-validation", "display-name-validation", "security.public_display_name_unvalidated"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2423}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-3a7cbf7e26e697c9", "level": "note", "message": {"text": "Very large file: dashboard.py (3254 lines)"}, "properties": {"repobilityId": "706afce5fefb1019", "scanner": "scanner-primary", "fingerprint": "3a7cbf7e26e697c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71080e25000cc762", "level": "note", "message": {"text": "Very large file: local_strategy_engine.py (1360 lines)"}, "properties": {"repobilityId": "26260b8c66f68fc9", "scanner": "scanner-primary", "fingerprint": "71080e25000cc762", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d3ebe231b046660d", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "cba597fc8cc63e57", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "8ea41649a3400894", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "727a0bf9e13f78fe", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8b068e1298836fca", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "cdd62a2177dc638a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2348a4341e5963d6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "76c0416bd6b10e01", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "952c0b1828a025ec", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8e3bde21200ebcb1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f5f9bdd7a5127f52", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d18505abe90eb12d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e9408d16496dd87c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-1439a6cf49999700", "level": "error", "message": {"text": "Flask mutation route `webhook` without `@login_required` \u2014 bot.py:760"}, "properties": {"repobilityId": "b896cd38514c0c4b", "scanner": "scanner-primary", "fingerprint": "1439a6cf49999700", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bot.py"}, "region": {"startLine": 760}}}]}, {"ruleId": "scanner-b82e4e800c9eefee", "level": "error", "message": {"text": "Flask mutation route `login` without `@login_required` \u2014 dashboard.py:1340"}, "properties": {"repobilityId": "a881c8136c50ba60", "scanner": "scanner-primary", "fingerprint": "b82e4e800c9eefee", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 1340}}}]}, {"ruleId": "scanner-93ad4d83ba93c4d9", "level": "error", "message": {"text": "Flask mutation route `register` without `@login_required` \u2014 dashboard.py:1370"}, "properties": {"repobilityId": "784fd293a2ac3b92", "scanner": "scanner-primary", "fingerprint": "93ad4d83ba93c4d9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 1370}}}]}, {"ruleId": "scanner-2a686f34e0cd7380", "level": "error", "message": {"text": "Flask mutation route `admin_db_management` without `@login_required` \u2014 dashboard.py:1519"}, "properties": {"repobilityId": "1c99fcbf31c66e9e", "scanner": "scanner-primary", "fingerprint": "2a686f34e0cd7380", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 1519}}}]}, {"ruleId": "scanner-f385bdc2c60290a7", "level": "error", "message": {"text": "Flask mutation route `admin_strategy` without `@login_required` \u2014 dashboard.py:1535"}, "properties": {"repobilityId": "c47be05a57141533", "scanner": "scanner-primary", "fingerprint": "f385bdc2c60290a7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 1535}}}]}, {"ruleId": "scanner-acc787ea9fa1f166", "level": "error", "message": {"text": "Flask mutation route `api_strategy_remote_complete` without `@login_required` \u2014 dashboard.py:1968"}, "properties": {"repobilityId": "5db0ca86498bb282", "scanner": "scanner-primary", "fingerprint": "acc787ea9fa1f166", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 1968}}}]}, {"ruleId": "scanner-f3ffd3f4a22711b1", "level": "error", "message": {"text": "Flask mutation route `admin_backfill_trades` without `@login_required` \u2014 dashboard.py:2123"}, "properties": {"repobilityId": "47a2c22b874a65f2", "scanner": "scanner-primary", "fingerprint": "f3ffd3f4a22711b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2123}}}]}, {"ruleId": "scanner-aa912f0b23288032", "level": "error", "message": {"text": "Flask mutation route `admin_reset_trade_history` without `@login_required` \u2014 dashboard.py:2215"}, "properties": {"repobilityId": "d0fba70442cc915e", "scanner": "scanner-primary", "fingerprint": "aa912f0b23288032", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2215}}}]}, {"ruleId": "scanner-e9986aeceb707ea4", "level": "error", "message": {"text": "Flask mutation route `api_admin_server_restart` without `@login_required` \u2014 dashboard.py:2315"}, "properties": {"repobilityId": "76b6a4fd9a02b26a", "scanner": "scanner-primary", "fingerprint": "e9986aeceb707ea4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2315}}}]}, {"ruleId": "scanner-e6736897030fd928", "level": "error", "message": {"text": "Flask mutation route `api_admin_pull_updates` without `@login_required` \u2014 dashboard.py:2323"}, "properties": {"repobilityId": "15bb6525b9241303", "scanner": "scanner-primary", "fingerprint": "e6736897030fd928", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2323}}}]}, {"ruleId": "scanner-f06b923281593d24", "level": "error", "message": {"text": "Flask mutation route `api_admin_rollback` without `@login_required` \u2014 dashboard.py:2364"}, "properties": {"repobilityId": "8a946ba13fdeb343", "scanner": "scanner-primary", "fingerprint": "f06b923281593d24", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2364}}}]}, {"ruleId": "scanner-1e89b26fc84febb4", "level": "error", "message": {"text": "Flask mutation route `admin_create_user` without `@login_required` \u2014 dashboard.py:2393"}, "properties": {"repobilityId": "8c15079b9a4dcd75", "scanner": "scanner-primary", "fingerprint": "1e89b26fc84febb4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2393}}}]}, {"ruleId": "scanner-fd1b696fd593a18c", "level": "error", "message": {"text": "Flask mutation route `admin_update_user` without `@login_required` \u2014 dashboard.py:2416"}, "properties": {"repobilityId": "55f9ed53e7f22bbd", "scanner": "scanner-primary", "fingerprint": "fd1b696fd593a18c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2416}}}]}, {"ruleId": "scanner-1e04ad5c9c5ef4dd", "level": "error", "message": {"text": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 dashboard.py:2432"}, "properties": {"repobilityId": "9b14954d182d4400", "scanner": "scanner-primary", "fingerprint": "1e04ad5c9c5ef4dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2432}}}]}, {"ruleId": "scanner-a261b1914bdd56d9", "level": "error", "message": {"text": "Flask mutation route `admin_delete_user` without `@login_required` \u2014 dashboard.py:2450"}, "properties": {"repobilityId": "e420aebc654a1501", "scanner": "scanner-primary", "fingerprint": "a261b1914bdd56d9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2450}}}]}, {"ruleId": "scanner-348b5f1de694b2a8", "level": "error", "message": {"text": "Flask mutation route `api_admin_close_trades` without `@login_required` \u2014 dashboard.py:2736"}, "properties": {"repobilityId": "f1b2a2a88cd3ccbc", "scanner": "scanner-primary", "fingerprint": "348b5f1de694b2a8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 2736}}}]}, {"ruleId": "scanner-0cb02810e013e9e6", "level": "error", "message": {"text": "Flask mutation route `admin_investor_config` without `@login_required` \u2014 dashboard.py:3156"}, "properties": {"repobilityId": "c1701f3a1a535afd", "scanner": "scanner-primary", "fingerprint": "0cb02810e013e9e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.py"}, "region": {"startLine": 3156}}}]}]}]}