{"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-797e409f910d772b", "name": "Possibly dead Python function: fetch", "shortDescription": {"text": "Possibly dead Python function: fetch"}, "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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3f2bcae613f7d51", "name": "Possible secret in app.py", "shortDescription": {"text": "Possible secret in app.py"}, "fullDescription": {"text": "Detected pattern matching openai_or_anthropic_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-bd8ad9cc95d8c5aa", "name": "Insecure pattern 'tls_verify_false' in app.py:829", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app.py:829"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3569448b7d2400fe", "name": "Possible secret in render.yaml", "shortDescription": {"text": "Possible secret in render.yaml"}, "fullDescription": {"text": "Detected pattern matching openai_or_anthropic_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-eb17970f07d1be20", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/index.html:258", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/index.html:258"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a392e102fc02464", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1952d1d674afcceb", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7dc60d1f06a549e3", "name": "Very large file: app.py (1632 lines)", "shortDescription": {"text": "Very large file: app.py (1632 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 16 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, operator-readme. 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": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9f15a1d6c4fbc05", "name": "Flask mutation route `api_rank` without `@login_required` \u2014 app.py:1257", "shortDescription": {"text": "Flask mutation route `api_rank` without `@login_required` \u2014 app.py:1257"}, "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-31297c8887433bf9", "name": "Flask mutation route `api_rank_start` without `@login_required` \u2014 app.py:1383", "shortDescription": {"text": "Flask mutation route `api_rank_start` without `@login_required` \u2014 app.py:1383"}, "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-c914621362ea8e0b", "name": "Flask mutation route `api_trade_buy` without `@login_required` \u2014 app.py:1581", "shortDescription": {"text": "Flask mutation route `api_trade_buy` without `@login_required` \u2014 app.py:1581"}, "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-7413dd95acef5748", "name": "Flask mutation route `api_trade_sell` without `@login_required` \u2014 app.py:1614", "shortDescription": {"text": "Flask mutation route `api_trade_sell` without `@login_required` \u2014 app.py:1614"}, "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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`app.py` declares `ANY /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e1a61ead29e17012", "name": "Unused endpoint: ANY /api/status", "shortDescription": {"text": "Unused endpoint: ANY /api/status"}, "fullDescription": {"text": "`app.py` declares `ANY /api/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12a7877722c7ea03", "name": "Unused endpoint: ANY /api/quotes", "shortDescription": {"text": "Unused endpoint: ANY /api/quotes"}, "fullDescription": {"text": "`app.py` declares `ANY /api/quotes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbf4ff4855b97607", "name": "Unused endpoint: ANY /api/rank", "shortDescription": {"text": "Unused endpoint: ANY /api/rank"}, "fullDescription": {"text": "`app.py` declares `ANY /api/rank` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a8b719c3cab17c9", "name": "Unused endpoint: ANY /api/rank/start", "shortDescription": {"text": "Unused endpoint: ANY /api/rank/start"}, "fullDescription": {"text": "`app.py` declares `ANY /api/rank/start` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c0df6c6c677ebdb", "name": "Unused endpoint: ANY /api/rank/status/<job_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/rank/status/<job_id>"}, "fullDescription": {"text": "`app.py` declares `ANY /api/rank/status/<job_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7257198924244c85", "name": "Unused endpoint: ANY /api/market", "shortDescription": {"text": "Unused endpoint: ANY /api/market"}, "fullDescription": {"text": "`app.py` declares `ANY /api/market` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-275d381da43eccc4", "name": "Unused endpoint: ANY /api/stock", "shortDescription": {"text": "Unused endpoint: ANY /api/stock"}, "fullDescription": {"text": "`app.py` declares `ANY /api/stock` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-946e7c25fd2307ac", "name": "Unused endpoint: ANY /api/sectors", "shortDescription": {"text": "Unused endpoint: ANY /api/sectors"}, "fullDescription": {"text": "`app.py` declares `ANY /api/sectors` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27955a9383dded68", "name": "Unused endpoint: ANY /api/news", "shortDescription": {"text": "Unused endpoint: ANY /api/news"}, "fullDescription": {"text": "`app.py` declares `ANY /api/news` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b3007b2db1513231", "name": "Unused endpoint: ANY /api/trade/portfolio", "shortDescription": {"text": "Unused endpoint: ANY /api/trade/portfolio"}, "fullDescription": {"text": "`app.py` declares `ANY /api/trade/portfolio` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9ba603d42bdc619", "name": "Unused endpoint: ANY /api/trade/buy", "shortDescription": {"text": "Unused endpoint: ANY /api/trade/buy"}, "fullDescription": {"text": "`app.py` declares `ANY /api/trade/buy` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-501720ea3f31828a", "name": "Unused endpoint: ANY /api/trade/sell", "shortDescription": {"text": "Unused endpoint: ANY /api/trade/sell"}, "fullDescription": {"text": "`app.py` declares `ANY /api/trade/sell` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23749"}, "properties": {"repository": "zz-dl/shortstockmaster", "repoUrl": "https://github.com/zz-dl/shortstockmaster", "branch": "main"}, "results": [{"ruleId": "scanner-797e409f910d772b", "level": "note", "message": {"text": "Possibly dead Python function: fetch"}, "properties": {"repobilityId": "fb6a231a1c8f160c", "scanner": "scanner-primary", "fingerprint": "797e409f910d772b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py:890"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-e3f2bcae613f7d51", "level": "error", "message": {"text": "Possible secret in app.py"}, "properties": {"repobilityId": "3047cfa7a6828fca", "scanner": "scanner-primary", "fingerprint": "e3f2bcae613f7d51", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-bd8ad9cc95d8c5aa", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app.py:829"}, "properties": {"repobilityId": "2388d4725bcd0470", "scanner": "scanner-primary", "fingerprint": "bd8ad9cc95d8c5aa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 829}}}]}, {"ruleId": "scanner-3569448b7d2400fe", "level": "error", "message": {"text": "Possible secret in render.yaml"}, "properties": {"repobilityId": "d68af020e97e4a11", "scanner": "scanner-primary", "fingerprint": "3569448b7d2400fe", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "render.yaml"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-eb17970f07d1be20", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/index.html:258"}, "properties": {"repobilityId": "54c44d8c983139f7", "scanner": "scanner-primary", "fingerprint": "eb17970f07d1be20", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/index.html"}, "region": {"startLine": 258}}}]}, {"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-8a392e102fc02464", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "68dc30d14e98aa69", "scanner": "scanner-primary", "fingerprint": "8a392e102fc02464", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily_report.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-8a392e102fc02464", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c335f2b93890fb56", "scanner": "scanner-primary", "fingerprint": "8a392e102fc02464", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily_report.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-1952d1d674afcceb", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "f93ad88cf734b219", "scanner": "scanner-primary", "fingerprint": "1952d1d674afcceb", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily_report.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7dc60d1f06a549e3", "level": "note", "message": {"text": "Very large file: app.py (1632 lines)"}, "properties": {"repobilityId": "5a74e6652f3a10d4", "scanner": "scanner-primary", "fingerprint": "7dc60d1f06a549e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "f1b8789440e3215d", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "e288e45b80f0a1f1", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "91ab546d6a7dce96", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "b3f7cc30bd43833d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "f88d05d7b7a4e433", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "9ccba0a993a31880", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f9f15a1d6c4fbc05", "level": "error", "message": {"text": "Flask mutation route `api_rank` without `@login_required` \u2014 app.py:1257"}, "properties": {"repobilityId": "38c6d03c398f37c9", "scanner": "scanner-primary", "fingerprint": "f9f15a1d6c4fbc05", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 1257}}}]}, {"ruleId": "scanner-31297c8887433bf9", "level": "error", "message": {"text": "Flask mutation route `api_rank_start` without `@login_required` \u2014 app.py:1383"}, "properties": {"repobilityId": "d5d769536a3c384d", "scanner": "scanner-primary", "fingerprint": "31297c8887433bf9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 1383}}}]}, {"ruleId": "scanner-c914621362ea8e0b", "level": "error", "message": {"text": "Flask mutation route `api_trade_buy` without `@login_required` \u2014 app.py:1581"}, "properties": {"repobilityId": "0e31fb81b4413202", "scanner": "scanner-primary", "fingerprint": "c914621362ea8e0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 1581}}}]}, {"ruleId": "scanner-7413dd95acef5748", "level": "error", "message": {"text": "Flask mutation route `api_trade_sell` without `@login_required` \u2014 app.py:1614"}, "properties": {"repobilityId": "0ebe2dd8e6361f27", "scanner": "scanner-primary", "fingerprint": "7413dd95acef5748", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 1614}}}]}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "302fe621a396c5fd", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1a61ead29e17012", "level": "note", "message": {"text": "Unused endpoint: ANY /api/status"}, "properties": {"repobilityId": "fd8f284df759eb1d", "scanner": "scanner-primary", "fingerprint": "e1a61ead29e17012", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12a7877722c7ea03", "level": "note", "message": {"text": "Unused endpoint: ANY /api/quotes"}, "properties": {"repobilityId": "8df3f4bad4a04987", "scanner": "scanner-primary", "fingerprint": "12a7877722c7ea03", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbf4ff4855b97607", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rank"}, "properties": {"repobilityId": "f30f810568cbb41b", "scanner": "scanner-primary", "fingerprint": "bbf4ff4855b97607", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a8b719c3cab17c9", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rank/start"}, "properties": {"repobilityId": "e887af93ed108a22", "scanner": "scanner-primary", "fingerprint": "9a8b719c3cab17c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c0df6c6c677ebdb", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rank/status/<job_id>"}, "properties": {"repobilityId": "1528f6045b4e62dc", "scanner": "scanner-primary", "fingerprint": "7c0df6c6c677ebdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7257198924244c85", "level": "note", "message": {"text": "Unused endpoint: ANY /api/market"}, "properties": {"repobilityId": "c0935c7fa7cda990", "scanner": "scanner-primary", "fingerprint": "7257198924244c85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-275d381da43eccc4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/stock"}, "properties": {"repobilityId": "af4f5d25b91adc77", "scanner": "scanner-primary", "fingerprint": "275d381da43eccc4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-946e7c25fd2307ac", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sectors"}, "properties": {"repobilityId": "e16ea14b5ae68b3b", "scanner": "scanner-primary", "fingerprint": "946e7c25fd2307ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27955a9383dded68", "level": "note", "message": {"text": "Unused endpoint: ANY /api/news"}, "properties": {"repobilityId": "7d5641e8147fb48e", "scanner": "scanner-primary", "fingerprint": "27955a9383dded68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b3007b2db1513231", "level": "note", "message": {"text": "Unused endpoint: ANY /api/trade/portfolio"}, "properties": {"repobilityId": "073197e6cc6b68c3", "scanner": "scanner-primary", "fingerprint": "b3007b2db1513231", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9ba603d42bdc619", "level": "note", "message": {"text": "Unused endpoint: ANY /api/trade/buy"}, "properties": {"repobilityId": "ea29cd399107ad89", "scanner": "scanner-primary", "fingerprint": "b9ba603d42bdc619", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-501720ea3f31828a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/trade/sell"}, "properties": {"repobilityId": "48eb33b6c9eee120", "scanner": "scanner-primary", "fingerprint": "501720ea3f31828a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}