{"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-7b9cdb3b16a4a286", "name": "Possibly dead Python function: safe_default", "shortDescription": {"text": "Possibly dead Python function: safe_default"}, "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-5cf6776f5a62a313", "name": "Possibly dead Python function: extract_field_text", "shortDescription": {"text": "Possibly dead Python function: extract_field_text"}, "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-4422081f851ce1b3", "name": "Possibly dead Python function: write_record", "shortDescription": {"text": "Possibly dead Python function: write_record"}, "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-84088b317d4db0d8", "name": "Possibly dead Python function: score_to_points", "shortDescription": {"text": "Possibly dead Python function: score_to_points"}, "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-8f2f080f5c852dd1", "name": "Possibly dead Python function: fetch_latest_portfolio_plan_baseline", "shortDescription": {"text": "Possibly dead Python function: fetch_latest_portfolio_plan_baseline"}, "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-0b45b7bd385f8fd9", "name": "Possibly dead Python function: backfill_real_holding_entry_fx", "shortDescription": {"text": "Possibly dead Python function: backfill_real_holding_entry_fx"}, "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-ce615a3d7140511a", "name": "Possibly dead Python function: update_holding", "shortDescription": {"text": "Possibly dead Python function: update_holding"}, "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-6fe68dccb44e118a", "name": "Possibly dead Python function: delete_holding", "shortDescription": {"text": "Possibly dead Python function: delete_holding"}, "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-61068dabb111151b", "name": "Possibly dead Python function: bulk_replace_holdings", "shortDescription": {"text": "Possibly dead Python function: bulk_replace_holdings"}, "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-0bd731a1353a03a0", "name": "Possibly dead Python function: format_market_cap", "shortDescription": {"text": "Possibly dead Python function: format_market_cap"}, "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-3d58d1efb4a928dd", "name": "Possibly dead Python function: fmt_money_rmb", "shortDescription": {"text": "Possibly dead Python function: fmt_money_rmb"}, "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-7ac73b5d28fe2a02", "name": "Possibly dead Python function: load_audit_snapshot", "shortDescription": {"text": "Possibly dead Python function: load_audit_snapshot"}, "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-e0c1935570047a60", "name": "Possibly dead Python function: sort_key", "shortDescription": {"text": "Possibly dead Python function: sort_key"}, "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-d8fa16e9b7fa6529", "name": "Possibly dead Python function: show_source_tiers", "shortDescription": {"text": "Possibly dead Python function: show_source_tiers"}, "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-ead0f3493f2557a0", "name": "Possibly dead Python function: load_all_json", "shortDescription": {"text": "Possibly dead Python function: load_all_json"}, "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-9f283f6f2e9bd831", "name": "Possibly dead Python function: duckdb_available", "shortDescription": {"text": "Possibly dead Python function: duckdb_available"}, "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-dd1d243575f53b8c", "name": "Possibly dead Python function: db_load_latest", "shortDescription": {"text": "Possibly dead Python function: db_load_latest"}, "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-78adad53127eac5d", "name": "Possibly dead Python function: db_load_all", "shortDescription": {"text": "Possibly dead Python function: db_load_all"}, "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-e5c8f38f969d3962", "name": "Possibly dead Python function: pipeline_save", "shortDescription": {"text": "Possibly dead Python function: pipeline_save"}, "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-29fc01e76f1a65f1", "name": "Possibly dead Python function: pipeline_load_latest", "shortDescription": {"text": "Possibly dead Python function: pipeline_load_latest"}, "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-a118166e96871932", "name": "Possibly dead Python function: upsert_enrichment", "shortDescription": {"text": "Possibly dead Python function: upsert_enrichment"}, "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-96155d6912beded2", "name": "Possibly dead Python function: install_default_timeout", "shortDescription": {"text": "Possibly dead Python function: install_default_timeout"}, "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-10020477bf0c77b9", "name": "Possibly dead Python function: fetch_realized_move", "shortDescription": {"text": "Possibly dead Python function: fetch_realized_move"}, "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-0d7500b3848fd9b2", "name": "Possibly dead Python function: attribute", "shortDescription": {"text": "Possibly dead Python function: attribute"}, "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-a56e67768f09586a", "name": "Possibly dead Python function: format_text", "shortDescription": {"text": "Possibly dead Python function: format_text"}, "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-69e7b7bef99bddbe", "name": "Possibly dead Python function: reset_throttle_disable", "shortDescription": {"text": "Possibly dead Python function: reset_throttle_disable"}, "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-a674d00cff02f04d", "name": "Possibly dead Python function: fetch_quote", "shortDescription": {"text": "Possibly dead Python function: fetch_quote"}, "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-03f1a57e14f3bc18", "name": "Possibly dead Python function: fetch_grade_events", "shortDescription": {"text": "Possibly dead Python function: fetch_grade_events"}, "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-c89cdb7990c383ac", "name": "Privileged port 21 in use", "shortDescription": {"text": "Privileged port 21 in use"}, "fullDescription": {"text": "Port 21 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44377a915c887735", "name": "Privileged port 16 in use", "shortDescription": {"text": "Privileged port 16 in use"}, "fullDescription": {"text": "Port 16 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-945e21117482edc7", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2add503864dc2147", "name": "Privileged port 36 in use", "shortDescription": {"text": "Privileged port 36 in use"}, "fullDescription": {"text": "Port 36 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f00ada564d824350", "name": "Privileged port 20 in use", "shortDescription": {"text": "Privileged port 20 in use"}, "fullDescription": {"text": "Port 20 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-80d05f8eeb1d0ea3", "name": "Privileged port 10 in use", "shortDescription": {"text": "Privileged port 10 in use"}, "fullDescription": {"text": "Port 10 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ca1b9e9811b5e39", "name": "Privileged port 45 in use", "shortDescription": {"text": "Privileged port 45 in use"}, "fullDescription": {"text": "Port 45 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-903cc4822c910bf0", "name": "Privileged port 15 in use", "shortDescription": {"text": "Privileged port 15 in use"}, "fullDescription": {"text": "Port 15 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f34535e79eaa6e34", "name": "Privileged port 23 in use", "shortDescription": {"text": "Privileged port 23 in use"}, "fullDescription": {"text": "Port 23 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f661ebc0a9ae9743", "name": "Privileged port 55 in use", "shortDescription": {"text": "Privileged port 55 in use"}, "fullDescription": {"text": "Port 55 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5952f13f65019b4c", "name": "Privileged port 5 in use", "shortDescription": {"text": "Privileged port 5 in use"}, "fullDescription": {"text": "Port 5 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-58527b14032c7da4", "name": "Insecure pattern 'cors_wildcard' in stock_research/api/main.py:327", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in stock_research/api/main.py:327"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac1bdcecf5434e20", "name": "Insecure pattern 'direct_innerhtml_assignment' in .claude/settings.json:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/settings.json:42"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2bf83cd57c196db0", "name": "Very large file: daily_refresh.sh (891 lines)", "shortDescription": {"text": "Very large file: daily_refresh.sh (891 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-8831f900d5c0aa75", "name": "Very large file: scripts/lib/stock_db.py (3954 lines)", "shortDescription": {"text": "Very large file: scripts/lib/stock_db.py (3954 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-bd2f3bc451de8193", "name": "Very large file: scripts/tools/production_acceptance_check.py (1905 lines)", "shortDescription": {"text": "Very large file: scripts/tools/production_acceptance_check.py (1905 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-da5593e2f2ff33fc", "name": "Very large file: scripts/tools/build_v2_recommendations.py (1698 lines)", "shortDescription": {"text": "Very large file: scripts/tools/build_v2_recommendations.py (1698 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-6794763a45b72d46", "name": "Very large file: stock_research/api/main.py (2595 lines)", "shortDescription": {"text": "Very large file: stock_research/api/main.py (2595 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-374e77463803d18c", "name": "Very large file: stock_research/core/premarket_gate.py (1512 lines)", "shortDescription": {"text": "Very large file: stock_research/core/premarket_gate.py (1512 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-970d9cd05d1e7efe", "name": "Very large file: stock_research/core/ai_radar.py (2687 lines)", "shortDescription": {"text": "Very large file: stock_research/core/ai_radar.py (2687 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-f1f4dd35433c7f05", "name": "Very large file: stock_research/jobs/morning_brief.py (3436 lines)", "shortDescription": {"text": "Very large file: stock_research/jobs/morning_brief.py (3436 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-e117f752fc342c0e", "name": "Very large file: stock_research/jobs/optimize_portfolio.py (1316 lines)", "shortDescription": {"text": "Very large file: stock_research/jobs/optimize_portfolio.py (1316 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-8a9929b72ec4e806", "name": "Very large file: stock_research/jobs/real_holding_review.py (1193 lines)", "shortDescription": {"text": "Very large file: stock_research/jobs/real_holding_review.py (1193 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-6ab8be0082214e28", "name": "Very large file: stock_research/jobs/junior_stock_watcher.py (2506 lines)", "shortDescription": {"text": "Very large file: stock_research/jobs/junior_stock_watcher.py (2506 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "51 tests / 213 src (ratio 0.24)."}, "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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 1645 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. 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-897ac6da81a78860", "name": "Legacy-named symbol `reverse_validation_v2` in archive/legacy/reverse_validate_v2.py:152", "shortDescription": {"text": "Legacy-named symbol `reverse_validation_v2` in archive/legacy/reverse_validate_v2.py:152"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-beb9496cdb0e173f", "name": "Legacy-named symbol `init_stock_db_v2` in tests/test_discover_candidates.py:14", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_discover_candidates.py:14"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc7a74e13be0d03e", "name": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_validation_v2.py:8", "shortDescription": {"text": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_validation_v2.py:8"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cab96b30ae81012", "name": "Legacy-named symbol `init_stock_db_v2` in tests/test_ai_radar.py:11", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_ai_radar.py:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0348b9533121d1bc", "name": "Legacy-named symbol `init_stock_db_v2` in tests/test_strategy_failure_diagnosis.py:11", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_strategy_failure_diagnosis.py:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcf4ebeecbeb60ea", "name": "Commented-code block (5 lines) in tests/test_appearance_index_fork.py:127", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test_appearance_index_fork.py:127"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e14397174a3a905", "name": "Legacy-named symbol `init_stock_db_v2` in tests/test_evaluate_v2_picks.py:13", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_evaluate_v2_picks.py:13"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-983526a5c36af236", "name": "Legacy-named symbol `shadow_old` in tests/test_evaluate_shadow_tuning_run.py:115", "shortDescription": {"text": "Legacy-named symbol `shadow_old` in tests/test_evaluate_shadow_tuning_run.py:115"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a60719248dd7c0c8", "name": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_eval.py:4", "shortDescription": {"text": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_eval.py:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f885d47026a96c4", "name": "Legacy-named symbol `shadow_v1` in tests/test_us_shadow_preflight_check.py:28", "shortDescription": {"text": "Legacy-named symbol `shadow_v1` in tests/test_us_shadow_preflight_check.py:28"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bee12c09cffe5c58", "name": "Legacy-named symbol `tech_ai_v2` in tests/test_build_shadow_tuning_run.py:108", "shortDescription": {"text": "Legacy-named symbol `tech_ai_v2` in tests/test_build_shadow_tuning_run.py:108"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0a79df6ba31716e", "name": "Legacy-named symbol `build_v2` in tests/test_build_v2_recommendations.py:14", "shortDescription": {"text": "Legacy-named symbol `build_v2` in tests/test_build_v2_recommendations.py:14"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-975a3e095ec724ad", "name": "Legacy-named symbol `init_stock_db_v2` in tests/test_recommendation_evidence_report.py:11", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_recommendation_evidence_report.py:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b40a1bdde67b7c5", "name": "Legacy-named symbol `state_backup` in scripts/lib/stock_db.py:6", "shortDescription": {"text": "Legacy-named symbol `state_backup` in scripts/lib/stock_db.py:6"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f2f66eb6795fb0e", "name": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/intraday_refresh_holdings.py:33", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/intraday_refresh_holdings.py:33"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6fd294719d252de8", "name": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/ingest_benchmark_prices.py:85", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/ingest_benchmark_prices.py:85"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da8ff74522a50b23", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/production_acceptance_check.py:1002", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/production_acceptance_check.py:1002"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a553bf5a1986efd3", "name": "Legacy-named symbol `_move_to_backup` in scripts/tools/reset_for_clean_proof.py:77", "shortDescription": {"text": "Legacy-named symbol `_move_to_backup` in scripts/tools/reset_for_clean_proof.py:77"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff080d7363b71f56", "name": "Legacy-named symbol `us_shadow_preflight_v1` in scripts/tools/us_shadow_preflight_check.py:393", "shortDescription": {"text": "Legacy-named symbol `us_shadow_preflight_v1` in scripts/tools/us_shadow_preflight_check.py:393"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf2f297fceb8ae51", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/migrate_holdings_ledger_v2.py:5", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/migrate_holdings_ledger_v2.py:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-729995d631d6fdf1", "name": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/build_v2_recommendations.py:290", "shortDescription": {"text": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/build_v2_recommendations.py:290"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-944a36566f3bbec7", "name": "Commented-code block (5 lines) in scripts/tools/build_v2_recommendations.py:68", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/tools/build_v2_recommendations.py:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4b3e372e880da25", "name": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/compute_piotroski_v2.py:23", "shortDescription": {"text": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/compute_piotroski_v2.py:23"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30789d576b399275", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/classify_chain_v2.py:23", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/classify_chain_v2.py:23"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-22c14afadbaced24", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/current_state_report.py:135", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/current_state_report.py:135"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6fa4cc96bc68aef", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_catalyst_signals.py:65", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_catalyst_signals.py:65"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ca0ce6f642111be", "name": "Legacy-named symbol `us_strict_trial_v1` in scripts/tools/us_strict_trial.py:678", "shortDescription": {"text": "Legacy-named symbol `us_strict_trial_v1` in scripts/tools/us_strict_trial.py:678"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-615070298a546d4a", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/check_cutover_readiness.py:27", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/check_cutover_readiness.py:27"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25dfc48a7bee673e", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_v2_picks.py:148", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_v2_picks.py:148"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26336d6013b22702", "name": "Legacy-named symbol `p0_policy_validation_v1` in scripts/tools/build_strategy_validation_v2.py:352", "shortDescription": {"text": "Legacy-named symbol `p0_policy_validation_v1` in scripts/tools/build_strategy_validation_v2.py:352"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abc6cc1872ed967c", "name": "Legacy-named symbol `state_backup` in scripts/tools/restore_state_from_json.py:2", "shortDescription": {"text": "Legacy-named symbol `state_backup` in scripts/tools/restore_state_from_json.py:2"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-deb90130082f3864", "name": "Legacy-named symbol `recommendation_readiness_v1` in scripts/tools/recommendation_readiness_check.py:433", "shortDescription": {"text": "Legacy-named symbol `recommendation_readiness_v1` in scripts/tools/recommendation_readiness_check.py:433"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d17be9c14d10b73", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/drop_v1_tables_v2.py:24", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/drop_v1_tables_v2.py:24"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f3b19444567a604", "name": "Legacy-named symbol `strategy_tuning_proposal_v1` in scripts/tools/strategy_tuning_proposal.py:203", "shortDescription": {"text": "Legacy-named symbol `strategy_tuning_proposal_v1` in scripts/tools/strategy_tuning_proposal.py:203"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f222ebb36d6f931", "name": "Legacy-named symbol `strategy_failure_diagnosis_v1` in scripts/tools/strategy_failure_diagnosis.py:850", "shortDescription": {"text": "Legacy-named symbol `strategy_failure_diagnosis_v1` in scripts/tools/strategy_failure_diagnosis.py:850"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-783fa777064c522e", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/refresh_system_universe_v2.py:25", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/refresh_system_universe_v2.py:25"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7072cbc8e2d92ad3", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/discover_candidates.py:9", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/discover_candidates.py:9"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dec024db70dd519", "name": "Legacy-named symbol `state_backup` in scripts/tools/backup_state_to_json.py:2", "shortDescription": {"text": "Legacy-named symbol `state_backup` in scripts/tools/backup_state_to_json.py:2"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf104fc19168a154", "name": "Legacy-named symbol `shadow_tuning_run_v1` in scripts/tools/build_shadow_tuning_run.py:563", "shortDescription": {"text": "Legacy-named symbol `shadow_tuning_run_v1` in scripts/tools/build_shadow_tuning_run.py:563"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffa503d5ef650f58", "name": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/init_stock_db_v2.py:648", "shortDescription": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/init_stock_db_v2.py:648"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c57f3325811c2d5", "name": "Legacy-named symbol `v2_system_enrichment_v1` in scripts/tools/enrich_system_universe_v2.py:722", "shortDescription": {"text": "Legacy-named symbol `v2_system_enrichment_v1` in scripts/tools/enrich_system_universe_v2.py:722"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ede6d89bc80e3d6", "name": "Legacy-named symbol `shadow_tuning_evidence_v1` in scripts/tools/evaluate_shadow_tuning_run.py:533", "shortDescription": {"text": "Legacy-named symbol `shadow_tuning_evidence_v1` in scripts/tools/evaluate_shadow_tuning_run.py:533"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b048059517d4dec0", "name": "Legacy-named symbol `clear_legacy` in scripts/tools/migrate_holdings_split_v2.py:23", "shortDescription": {"text": "Legacy-named symbol `clear_legacy` in scripts/tools/migrate_holdings_split_v2.py:23"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-800e682eb1d6aae6", "name": "Legacy-named symbol `us_production_acceptance_v1` in scripts/tools/us_production_acceptance_check.py:502", "shortDescription": {"text": "Legacy-named symbol `us_production_acceptance_v1` in scripts/tools/us_production_acceptance_check.py:502"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28658f1693f1eb4a", "name": "Legacy-named symbol `stock_history_v2` in scripts/tools/strict_caliber_backtest.py:38", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/strict_caliber_backtest.py:38"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8a98693fbdd5404", "name": "Legacy-named symbol `stock_history_v2` in stock_research/config.py:26", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/config.py:26"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9836a35915755b73", "name": "Legacy-named symbol `refresh_system_universe_v2` in stock_research/api/main.py:333", "shortDescription": {"text": "Legacy-named symbol `refresh_system_universe_v2` in stock_research/api/main.py:333"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dcfba7ef355b217", "name": "Legacy-named symbol `compute_piotroski_v2` in stock_research/core/baostock_client.py:158", "shortDescription": {"text": "Legacy-named symbol `compute_piotroski_v2` in stock_research/core/baostock_client.py:158"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6102ff28c6bf7af1", "name": "Legacy-named symbol `stock_history_v2` in stock_research/core/premarket_gate.py:1285", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/core/premarket_gate.py:1285"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b0af8b9f4d61e6e", "name": "Legacy-named symbol `classify_chain_v2` in stock_research/core/ai_radar.py:1719", "shortDescription": {"text": "Legacy-named symbol `classify_chain_v2` in stock_research/core/ai_radar.py:1719"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca1ab4586ac84a82", "name": "Commented-code block (6 lines) in stock_research/core/ai_radar.py:274", "shortDescription": {"text": "Commented-code block (6 lines) in stock_research/core/ai_radar.py:274"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f8534be604418af", "name": "Commented-code block (5 lines) in stock_research/core/regime_filter.py:467", "shortDescription": {"text": "Commented-code block (5 lines) in stock_research/core/regime_filter.py:467"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63489d538889313d", "name": "Commented-code block (7 lines) in stock_research/core/technical_indicators.py:360", "shortDescription": {"text": "Commented-code block (7 lines) in stock_research/core/technical_indicators.py:360"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-652525753f30de8f", "name": "Commented-code block (7 lines) in stock_research/core/portfolio_optimizer_pro.py:353", "shortDescription": {"text": "Commented-code block (7 lines) in stock_research/core/portfolio_optimizer_pro.py:353"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-627fa31f1b7c0cf5", "name": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/core/watchlist_enrich.py:400", "shortDescription": {"text": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/core/watchlist_enrich.py:400"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-086b02d50eb1071c", "name": "Legacy-named symbol `tech_ai_v1` in stock_research/core/strategy_eval.py:6", "shortDescription": {"text": "Legacy-named symbol `tech_ai_v1` in stock_research/core/strategy_eval.py:6"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9416e0aefdb7f1a", "name": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_form4_daily.py:157", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_form4_daily.py:157"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa6d97386bca13dc", "name": "Commented-code block (5 lines) in stock_research/jobs/morning_brief.py:885", "shortDescription": {"text": "Commented-code block (5 lines) in stock_research/jobs/morning_brief.py:885"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f9f163d76cd0c8b", "name": "Legacy-named symbol `fallback_v2` in stock_research/jobs/optimize_portfolio.py:476", "shortDescription": {"text": "Legacy-named symbol `fallback_v2` in stock_research/jobs/optimize_portfolio.py:476"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1ba1d08efcc67a6", "name": "Commented-code block (5 lines) in stock_research/jobs/real_holding_review.py:734", "shortDescription": {"text": "Commented-code block (5 lines) in stock_research/jobs/real_holding_review.py:734"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87d9ec68d4033d87", "name": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_daily.py:38", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_daily.py:38"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c696d6ac7ec78fc", "name": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/archive_picks.py:60", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/archive_picks.py:60"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29bb27a1365cf93e", "name": "Legacy-named symbol `audit_picks_v2` in stock_research/jobs/audit_picks_v2.py:15", "shortDescription": {"text": "Legacy-named symbol `audit_picks_v2` in stock_research/jobs/audit_picks_v2.py:15"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ce04c3492dd64df", "name": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/junior_stock_watcher.py:490", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/junior_stock_watcher.py:490"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6f1ef8c4dd97041", "name": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_sec_daily.py:265", "shortDescription": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_sec_daily.py:265"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c73b4f56b222c51", "name": "Legacy-named symbol `days_old` in stock_research/jobs/aggregate_theme_tags.py:132", "shortDescription": {"text": "Legacy-named symbol `days_old` in stock_research/jobs/aggregate_theme_tags.py:132"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1de180878cab6882", "name": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/jobs/enrich_watchlist.py:175", "shortDescription": {"text": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/jobs/enrich_watchlist.py:175"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-df27f93108c7e64b", "name": "Commented-code block (6 lines) in stock_research/jobs/apply_a_share_constraints.py:218", "shortDescription": {"text": "Commented-code block (6 lines) in stock_research/jobs/apply_a_share_constraints.py:218"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0584d4d0f0ca3f89", "name": "Legacy-named symbol `state_backup` in stock_research/jobs/weekly_self_review.py:4", "shortDescription": {"text": "Legacy-named symbol `state_backup` in stock_research/jobs/weekly_self_review.py:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d19c4d97d89052a", "name": "Commented-code block (5 lines) in stock_research/jobs/stress_test.py:277", "shortDescription": {"text": "Commented-code block (5 lines) in stock_research/jobs/stress_test.py:277"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64bc033a45ab26f1", "name": "34 env vars used in code but missing from .env.example", "shortDescription": {"text": "34 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `A_SHARE_DEEP_RISK`, `A_SHARE_PRODUCTION_MODE`, `A_SHARE_UNIVERSE`, `A_SHARE_UNIVERSE_LIMIT`, `FEISHU_ALERT_WEBHOOK`, `FEISHU_BRIEF_CHAT_ID`, `FEISHU_BRIEF_USER_ID` + 26 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/lib/stock_db.py:insert_real_holding_result, scripts/lib/stock_db.py:insert_real_holding\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-cd6e16fed365b7ab", "name": "FastAPI POST `create_watchlist` without auth dependency \u2014 stock_research/api/main.py:484", "shortDescription": {"text": "FastAPI POST `create_watchlist` without auth dependency \u2014 stock_research/api/main.py:484"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc14e1890d8120ef", "name": "FastAPI PUT `update_watchlist` without auth dependency \u2014 stock_research/api/main.py:510", "shortDescription": {"text": "FastAPI PUT `update_watchlist` without auth dependency \u2014 stock_research/api/main.py:510"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e0e1c3e157e5e0c8", "name": "FastAPI DELETE `delete_watchlist` without auth dependency \u2014 stock_research/api/main.py:559", "shortDescription": {"text": "FastAPI DELETE `delete_watchlist` without auth dependency \u2014 stock_research/api/main.py:559"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3fff0bef80154ffd", "name": "FastAPI POST `auto_enrich_watchlist` without auth dependency \u2014 stock_research/api/main.py:1077", "shortDescription": {"text": "FastAPI POST `auto_enrich_watchlist` without auth dependency \u2014 stock_research/api/main.py:1077"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec5df4992792d7ec", "name": "FastAPI POST `picks_rerun` without auth dependency \u2014 stock_research/api/main.py:1236", "shortDescription": {"text": "FastAPI POST `picks_rerun` without auth dependency \u2014 stock_research/api/main.py:1236"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2393b384452e0801", "name": "FastAPI POST `create_real_holding` without auth dependency \u2014 stock_research/api/main.py:1360", "shortDescription": {"text": "FastAPI POST `create_real_holding` without auth dependency \u2014 stock_research/api/main.py:1360"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-100879592d25b9f7", "name": "FastAPI POST `fetch_holdings_prices` without auth dependency \u2014 stock_research/api/main.py:1396", "shortDescription": {"text": "FastAPI POST `fetch_holdings_prices` without auth dependency \u2014 stock_research/api/main.py:1396"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-551251bef6b03c3a", "name": "FastAPI POST `sync_holdings_to_watchlist` without auth dependency \u2014 stock_research/api/main.py:1426", "shortDescription": {"text": "FastAPI POST `sync_holdings_to_watchlist` without auth dependency \u2014 stock_research/api/main.py:1426"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e95d747a3d70e5e", "name": "FastAPI POST `record_real_holding_buy` without auth dependency \u2014 stock_research/api/main.py:1456", "shortDescription": {"text": "FastAPI POST `record_real_holding_buy` without auth dependency \u2014 stock_research/api/main.py:1456"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ced3c27a6a28ea52", "name": "FastAPI POST `add_to_real_holding` without auth dependency \u2014 stock_research/api/main.py:1523", "shortDescription": {"text": "FastAPI POST `add_to_real_holding` without auth dependency \u2014 stock_research/api/main.py:1523"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7ea70aa08a4e0a0", "name": "FastAPI POST `close_real_holding` without auth dependency \u2014 stock_research/api/main.py:1541", "shortDescription": {"text": "FastAPI POST `close_real_holding` without auth dependency \u2014 stock_research/api/main.py:1541"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7dc77d6b6d38275", "name": "FastAPI POST `create_cash_flow` without auth dependency \u2014 stock_research/api/main.py:1619", "shortDescription": {"text": "FastAPI POST `create_cash_flow` without auth dependency \u2014 stock_research/api/main.py:1619"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e999ff141fa15be", "name": "FastAPI DELETE `delete_cash_flow_one` without auth dependency \u2014 stock_research/api/main.py:1629", "shortDescription": {"text": "FastAPI DELETE `delete_cash_flow_one` without auth dependency \u2014 stock_research/api/main.py:1629"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab76cb25f6d3798e", "name": "FastAPI POST `void_real_holding_trade_one` without auth dependency \u2014 stock_research/api/main.py:1645", "shortDescription": {"text": "FastAPI POST `void_real_holding_trade_one` without auth dependency \u2014 stock_research/api/main.py:1645"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3161661336247469", "name": "FastAPI POST `rebuild_real_holdings` without auth dependency \u2014 stock_research/api/main.py:1658", "shortDescription": {"text": "FastAPI POST `rebuild_real_holdings` without auth dependency \u2014 stock_research/api/main.py:1658"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b7a71d9aff5e5ab", "name": "FastAPI POST `create_real_holding_discipline` without auth dependency \u2014 stock_research/api/main.py:1688", "shortDescription": {"text": "FastAPI POST `create_real_holding_discipline` without auth dependency \u2014 stock_research/api/main.py:1688"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-016487268206fe22", "name": "FastAPI PATCH `update_real_holding_discipline_status` without auth dependency \u2014 stock_research/api/main.py:1712", "shortDescription": {"text": "FastAPI PATCH `update_real_holding_discipline_status` without auth dependency \u2014 stock_research/api/main.py:1712"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba2c14319a82c4de", "name": "FastAPI PUT `update_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1727", "shortDescription": {"text": "FastAPI PUT `update_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1727"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ea10930512ad4d5", "name": "FastAPI DELETE `delete_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1763", "shortDescription": {"text": "FastAPI DELETE `delete_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1763"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6190cfb489da028d", "name": "FastAPI POST `bottleneck_review_save` without auth dependency \u2014 stock_research/api/main.py:1786", "shortDescription": {"text": "FastAPI POST `bottleneck_review_save` without auth dependency \u2014 stock_research/api/main.py:1786"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de0c4cd96da91cdf", "name": "FastAPI POST `real_holdings_daily_review_run` without auth dependency \u2014 stock_research/api/main.py:2193", "shortDescription": {"text": "FastAPI POST `real_holdings_daily_review_run` without auth dependency \u2014 stock_research/api/main.py:2193"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df43614d2115811f", "name": "FastAPI POST `bulk_replace_model_sim_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2296", "shortDescription": {"text": "FastAPI POST `bulk_replace_model_sim_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2296"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-70c9c6db8fddac1b", "name": "FastAPI DELETE `delete_model_sim_holding_one` without auth dependency \u2014 stock_research/api/main.py:2302", "shortDescription": {"text": "FastAPI DELETE `delete_model_sim_holding_one` without auth dependency \u2014 stock_research/api/main.py:2302"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e78a747fdc05cd96", "name": "FastAPI POST `create_holding` without auth dependency \u2014 stock_research/api/main.py:2315", "shortDescription": {"text": "FastAPI POST `create_holding` without auth dependency \u2014 stock_research/api/main.py:2315"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3817f3c8420c7488", "name": "FastAPI PUT `update_holding_one` without auth dependency \u2014 stock_research/api/main.py:2319", "shortDescription": {"text": "FastAPI PUT `update_holding_one` without auth dependency \u2014 stock_research/api/main.py:2319"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12bcfded8879922f", "name": "FastAPI DELETE `delete_holding_one` without auth dependency \u2014 stock_research/api/main.py:2323", "shortDescription": {"text": "FastAPI DELETE `delete_holding_one` without auth dependency \u2014 stock_research/api/main.py:2323"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0d62185dd89ae2ec", "name": "FastAPI POST `bulk_replace_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2327", "shortDescription": {"text": "FastAPI POST `bulk_replace_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2327"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab4daee375d29333", "name": "FastAPI PUT `update_user_config` without auth dependency \u2014 stock_research/api/main.py:2338", "shortDescription": {"text": "FastAPI PUT `update_user_config` without auth dependency \u2014 stock_research/api/main.py:2338"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ef40d742e7f0aa0", "name": "FastAPI POST `trigger_13f_refresh` without auth dependency \u2014 stock_research/api/main.py:2376", "shortDescription": {"text": "FastAPI POST `trigger_13f_refresh` without auth dependency \u2014 stock_research/api/main.py:2376"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f1f7b4db54af73e", "name": "FastAPI POST `trigger_enrich` without auth dependency \u2014 stock_research/api/main.py:2383", "shortDescription": {"text": "FastAPI POST `trigger_enrich` without auth dependency \u2014 stock_research/api/main.py:2383"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bdbde91462862993", "name": "FastAPI POST `trigger_audit` without auth dependency \u2014 stock_research/api/main.py:2390", "shortDescription": {"text": "FastAPI POST `trigger_audit` without auth dependency \u2014 stock_research/api/main.py:2390"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e7896099f88c049", "name": "FastAPI POST `trigger_refresh_v2_recommendations` without auth dependency \u2014 stock_research/api/main.py:2548", "shortDescription": {"text": "FastAPI POST `trigger_refresh_v2_recommendations` without auth dependency \u2014 stock_research/api/main.py:2548"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c2f599d3f4c4f1d8", "name": "FastAPI POST `trigger_ipo_refresh` without auth dependency \u2014 stock_research/api/main.py:2571", "shortDescription": {"text": "FastAPI POST `trigger_ipo_refresh` without auth dependency \u2014 stock_research/api/main.py:2571"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1014fb98bff509bb", "name": "Unused endpoint: GET /api/fx-rates", "shortDescription": {"text": "Unused endpoint: GET /api/fx-rates"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/fx-rates` 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-703d50298ef754bc", "name": "Unused endpoint: GET /api/13f/investors", "shortDescription": {"text": "Unused endpoint: GET /api/13f/investors"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/13f/investors` 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-10afff696b84ac54", "name": "Unused endpoint: GET /api/13f/changes/{cik}", "shortDescription": {"text": "Unused endpoint: GET /api/13f/changes/{cik}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/13f/changes/{cik}` 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-891f1abfb9f66bcb", "name": "Unused endpoint: GET /api/13f/filings/{cik}", "shortDescription": {"text": "Unused endpoint: GET /api/13f/filings/{cik}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/13f/filings/{cik}` 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-19c8531eb02471bd", "name": "Unused endpoint: GET /api/watchlist", "shortDescription": {"text": "Unused endpoint: GET /api/watchlist"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/watchlist` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e38c950a5669644", "name": "Unused endpoint: GET /api/watchlist/{code}", "shortDescription": {"text": "Unused endpoint: GET /api/watchlist/{code}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/watchlist/{code}` 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-1b4bc3e641888422", "name": "Unused endpoint: POST /api/watchlist", "shortDescription": {"text": "Unused endpoint: POST /api/watchlist"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/watchlist` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4bb50fb3802eb14", "name": "Unused endpoint: PUT /api/watchlist/{code}", "shortDescription": {"text": "Unused endpoint: PUT /api/watchlist/{code}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `PUT /api/watchlist/{code}` 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-6d3524d83f8c83e9", "name": "Unused endpoint: GET /api/chain-metadata", "shortDescription": {"text": "Unused endpoint: GET /api/chain-metadata"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/chain-metadata` 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-af9a7f746eb6bb75", "name": "Unused endpoint: DELETE /api/watchlist/{code}", "shortDescription": {"text": "Unused endpoint: DELETE /api/watchlist/{code}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `DELETE /api/watchlist/{code}` 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-b43435beaac8f258", "name": "Unused endpoint: GET /api/db/all-stocks", "shortDescription": {"text": "Unused endpoint: GET /api/db/all-stocks"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/db/all-stocks` 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-b28417b04e0868a0", "name": "Unused endpoint: GET /api/db/tables-overview", "shortDescription": {"text": "Unused endpoint: GET /api/db/tables-overview"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/db/tables-overview` 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-a1077a1e2c866378", "name": "Unused endpoint: GET /api/db/table/{name}", "shortDescription": {"text": "Unused endpoint: GET /api/db/table/{name}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/db/table/{name}` 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-bab803105889e87b", "name": "Unused endpoint: GET /api/db/stock-history/{code}", "shortDescription": {"text": "Unused endpoint: GET /api/db/stock-history/{code}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/db/stock-history/{code}` 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-0f0bf84b48ae3c0a", "name": "Unused endpoint: POST /api/watchlist/auto-enrich", "shortDescription": {"text": "Unused endpoint: POST /api/watchlist/auto-enrich"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/watchlist/auto-enrich` 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-a0f5117a01030c31", "name": "Unused endpoint: GET /api/picks/rerun-status", "shortDescription": {"text": "Unused endpoint: GET /api/picks/rerun-status"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/picks/rerun-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-811a75ac77626eec", "name": "Unused endpoint: POST /api/picks/rerun", "shortDescription": {"text": "Unused endpoint: POST /api/picks/rerun"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/picks/rerun` 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-caec49ec089f1d8e", "name": "Unused endpoint: GET /api/picks/latest-summary", "shortDescription": {"text": "Unused endpoint: GET /api/picks/latest-summary"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/picks/latest-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1a94407ec99ba61", "name": "Unused endpoint: GET /api/picks/by-code/{code}", "shortDescription": {"text": "Unused endpoint: GET /api/picks/by-code/{code}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/picks/by-code/{code}` 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-e3ac8f7900220760", "name": "Unused endpoint: GET /api/real-holdings", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings` 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-ad72a76a87cee431", "name": "Unused endpoint: POST /api/real-holdings", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings` 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-1215e6799d07a722", "name": "Unused endpoint: POST /api/real-holdings/fetch-prices", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/fetch-prices"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/fetch-prices` 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-5accb21eeeba3296", "name": "Unused endpoint: POST /api/real-holdings/sync-to-watchlist", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/sync-to-watchlist"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/sync-to-watchlist` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc74c864fd06125d", "name": "Unused endpoint: POST /api/real-holdings/buy", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/buy"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/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-79678eb98aa984b3", "name": "Unused endpoint: POST /api/real-holdings/{holding_id}/add", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/add"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/{holding_id}/add` 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-df10690c71d4e2e1", "name": "Unused endpoint: POST /api/real-holdings/{holding_id}/close", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/close"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/{holding_id}/close` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49b3c1311cc9dfed", "name": "Unused endpoint: GET /api/real-holdings/trade-history", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/trade-history"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/trade-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2cc64bf53b1e02e", "name": "Unused endpoint: GET /api/real-holdings/pnl-summary", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/pnl-summary"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/pnl-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0d6f84a276a1e60", "name": "Unused endpoint: GET /api/real-holdings/account-summary", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/account-summary"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/account-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba8bec321f927a5e", "name": "Unused endpoint: GET /api/real-holdings/cash-flows", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/cash-flows"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/cash-flows` 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-fb1ddc7aa9e662e3", "name": "Unused endpoint: POST /api/real-holdings/cash-flows", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/cash-flows"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/cash-flows` 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-870881daee167d85", "name": "Unused endpoint: DELETE /api/real-holdings/cash-flows/{flow_id}", "shortDescription": {"text": "Unused endpoint: DELETE /api/real-holdings/cash-flows/{flow_id}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `DELETE /api/real-holdings/cash-flows/{flow_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-b89de0cb544ee55b", "name": "Unused endpoint: GET /api/real-holdings/{holding_id}/records", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/{holding_id}/records"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/{holding_id}/records` 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-2c052bf81049a824", "name": "Unused endpoint: POST /api/real-holdings/trades/{trade_id}/void", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/trades/{trade_id}/void"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/trades/{trade_id}/void` 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-496b7d4c5637c38c", "name": "Unused endpoint: POST /api/real-holdings/rebuild-from-trades", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/rebuild-from-trades"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/rebuild-from-trades` 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-24ba00537f044d6c", "name": "Unused endpoint: GET /api/real-holdings/discipline", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/discipline"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/discipline` 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-e8fd4b131e33d7e9", "name": "Unused endpoint: GET /api/real-holdings/{holding_id}/discipline", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/{holding_id}/discipline"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/{holding_id}/discipline` 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-29a7362451beda32", "name": "Unused endpoint: POST /api/real-holdings/{holding_id}/discipline", "shortDescription": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/discipline"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/real-holdings/{holding_id}/discipline` 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-ab745bf1fb64134a", "name": "Unused endpoint: PATCH /api/real-holdings/discipline/{plan_id}", "shortDescription": {"text": "Unused endpoint: PATCH /api/real-holdings/discipline/{plan_id}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `PATCH /api/real-holdings/discipline/{plan_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-d9cee44780503f54", "name": "Unused endpoint: PUT /api/real-holdings/{holding_id}", "shortDescription": {"text": "Unused endpoint: PUT /api/real-holdings/{holding_id}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `PUT /api/real-holdings/{holding_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-71909ba7d6542157", "name": "Unused endpoint: DELETE /api/real-holdings/{holding_id}", "shortDescription": {"text": "Unused endpoint: DELETE /api/real-holdings/{holding_id}"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `DELETE /api/real-holdings/{holding_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-e54cd7c8824db502", "name": "Unused endpoint: GET /api/bottleneck-reviews", "shortDescription": {"text": "Unused endpoint: GET /api/bottleneck-reviews"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/bottleneck-reviews` 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-fb58b3b275159caf", "name": "Unused endpoint: POST /api/bottleneck-review", "shortDescription": {"text": "Unused endpoint: POST /api/bottleneck-review"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `POST /api/bottleneck-review` 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-7fb65c44338a1077", "name": "Unused endpoint: GET /api/premarket-gate", "shortDescription": {"text": "Unused endpoint: GET /api/premarket-gate"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/premarket-gate` 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-d4c4d402e2b3e53f", "name": "Unused endpoint: GET /api/premarket-gate/history", "shortDescription": {"text": "Unused endpoint: GET /api/premarket-gate/history"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/premarket-gate/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5e3eb643f031c26", "name": "Unused endpoint: GET /premarket", "shortDescription": {"text": "Unused endpoint: GET /premarket"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /premarket` 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-128e14200ab48c1d", "name": "Unused endpoint: GET /premarket/history", "shortDescription": {"text": "Unused endpoint: GET /premarket/history"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /premarket/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18e83b1e0197af55", "name": "Unused endpoint: GET /api/real-holdings/daily-verdict", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/daily-verdict"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/daily-verdict` 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-5478c32b637e23ae", "name": "Unused endpoint: GET /api/real-holdings/daily-review/latest", "shortDescription": {"text": "Unused endpoint: GET /api/real-holdings/daily-review/latest"}, "fullDescription": {"text": "`stock_research/api/main.py` declares `GET /api/real-holdings/daily-review/latest` 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/23618"}, "properties": {"repository": "zexpp5/StockAssistant", "repoUrl": "https://github.com/zexpp5/StockAssistant", "branch": "main"}, "results": [{"ruleId": "scanner-7b9cdb3b16a4a286", "level": "note", "message": {"text": "Possibly dead Python function: safe_default"}, "properties": {"repobilityId": "116aef905f16f759", "scanner": "scanner-primary", "fingerprint": "7b9cdb3b16a4a286", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy/track_13f.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5cf6776f5a62a313", "level": "note", "message": {"text": "Possibly dead Python function: extract_field_text"}, "properties": {"repobilityId": "a2e26e137ac82f2c", "scanner": "scanner-primary", "fingerprint": "5cf6776f5a62a313", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/daily_news_to_feishu.py:83"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4422081f851ce1b3", "level": "note", "message": {"text": "Possibly dead Python function: write_record"}, "properties": {"repobilityId": "6347e480e27fd02e", "scanner": "scanner-primary", "fingerprint": "4422081f851ce1b3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/daily_news_to_feishu.py:128"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-84088b317d4db0d8", "level": "note", "message": {"text": "Possibly dead Python function: score_to_points"}, "properties": {"repobilityId": "e436cf88576f1375", "scanner": "scanner-primary", "fingerprint": "84088b317d4db0d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/gics_classifier.py:269"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f2f080f5c852dd1", "level": "note", "message": {"text": "Possibly dead Python function: fetch_latest_portfolio_plan_baseline"}, "properties": {"repobilityId": "0741154e0a0e7c36", "scanner": "scanner-primary", "fingerprint": "8f2f080f5c852dd1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/stock_db.py:1229"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b45b7bd385f8fd9", "level": "note", "message": {"text": "Possibly dead Python function: backfill_real_holding_entry_fx"}, "properties": {"repobilityId": "341abdbbd4d8cb44", "scanner": "scanner-primary", "fingerprint": "0b45b7bd385f8fd9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/stock_db.py:1998"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ce615a3d7140511a", "level": "note", "message": {"text": "Possibly dead Python function: update_holding"}, "properties": {"repobilityId": "5c843df57baffd86", "scanner": "scanner-primary", "fingerprint": "ce615a3d7140511a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/stock_db.py:3810"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6fe68dccb44e118a", "level": "note", "message": {"text": "Possibly dead Python function: delete_holding"}, "properties": {"repobilityId": "5345133812ba38cb", "scanner": "scanner-primary", "fingerprint": "6fe68dccb44e118a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/stock_db.py:3835"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61068dabb111151b", "level": "note", "message": {"text": "Possibly dead Python function: bulk_replace_holdings"}, "properties": {"repobilityId": "fe15f6591acf39f7", "scanner": "scanner-primary", "fingerprint": "61068dabb111151b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/stock_db.py:3849"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0bd731a1353a03a0", "level": "note", "message": {"text": "Possibly dead Python function: format_market_cap"}, "properties": {"repobilityId": "607ca7d879b444dd", "scanner": "scanner-primary", "fingerprint": "0bd731a1353a03a0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pipeline/fetch_stock_prices.py:871"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d58d1efb4a928dd", "level": "note", "message": {"text": "Possibly dead Python function: fmt_money_rmb"}, "properties": {"repobilityId": "f4303f0806b8c9c7", "scanner": "scanner-primary", "fingerprint": "3d58d1efb4a928dd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pipeline/build_stock_dashboard_html.py:17031"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ac73b5d28fe2a02", "level": "note", "message": {"text": "Possibly dead Python function: load_audit_snapshot"}, "properties": {"repobilityId": "bf371e232ef8de17", "scanner": "scanner-primary", "fingerprint": "7ac73b5d28fe2a02", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pipeline/build_stock_dashboard_html.py:20269"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e0c1935570047a60", "level": "note", "message": {"text": "Possibly dead Python function: sort_key"}, "properties": {"repobilityId": "ac2a4181eae38738", "scanner": "scanner-primary", "fingerprint": "e0c1935570047a60", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/tools/strategy_failure_diagnosis.py:514"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8fa16e9b7fa6529", "level": "note", "message": {"text": "Possibly dead Python function: show_source_tiers"}, "properties": {"repobilityId": "af8718f8d1dc7659", "scanner": "scanner-primary", "fingerprint": "d8fa16e9b7fa6529", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/tools/verify_data_sources.py:133"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ead0f3493f2557a0", "level": "note", "message": {"text": "Possibly dead Python function: load_all_json"}, "properties": {"repobilityId": "30e447751ff75e7f", "scanner": "scanner-primary", "fingerprint": "ead0f3493f2557a0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:59"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9f283f6f2e9bd831", "level": "note", "message": {"text": "Possibly dead Python function: duckdb_available"}, "properties": {"repobilityId": "97b7a4b3d894e2e3", "scanner": "scanner-primary", "fingerprint": "9f283f6f2e9bd831", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dd1d243575f53b8c", "level": "note", "message": {"text": "Possibly dead Python function: db_load_latest"}, "properties": {"repobilityId": "c5f2cbe30d6e9adb", "scanner": "scanner-primary", "fingerprint": "dd1d243575f53b8c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:146"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-78adad53127eac5d", "level": "note", "message": {"text": "Possibly dead Python function: db_load_all"}, "properties": {"repobilityId": "46a8bb990df7b589", "scanner": "scanner-primary", "fingerprint": "78adad53127eac5d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:165"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e5c8f38f969d3962", "level": "note", "message": {"text": "Possibly dead Python function: pipeline_save"}, "properties": {"repobilityId": "5811a9ac539a129b", "scanner": "scanner-primary", "fingerprint": "e5c8f38f969d3962", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:197"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-29fc01e76f1a65f1", "level": "note", "message": {"text": "Possibly dead Python function: pipeline_load_latest"}, "properties": {"repobilityId": "7cd8a2a5b8998340", "scanner": "scanner-primary", "fingerprint": "29fc01e76f1a65f1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:213"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a118166e96871932", "level": "note", "message": {"text": "Possibly dead Python function: upsert_enrichment"}, "properties": {"repobilityId": "183b91cf999faf97", "scanner": "scanner-primary", "fingerprint": "a118166e96871932", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/adapters/store.py:236"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96155d6912beded2", "level": "note", "message": {"text": "Possibly dead Python function: install_default_timeout"}, "properties": {"repobilityId": "a202b18b1deff2c6", "scanner": "scanner-primary", "fingerprint": "96155d6912beded2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/http_timeout.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-10020477bf0c77b9", "level": "note", "message": {"text": "Possibly dead Python function: fetch_realized_move"}, "properties": {"repobilityId": "4a7db936424fec29", "scanner": "scanner-primary", "fingerprint": "10020477bf0c77b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/premarket_gate.py:1186"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0d7500b3848fd9b2", "level": "note", "message": {"text": "Possibly dead Python function: attribute"}, "properties": {"repobilityId": "162d41b882b80d27", "scanner": "scanner-primary", "fingerprint": "0d7500b3848fd9b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/brinson.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a56e67768f09586a", "level": "note", "message": {"text": "Possibly dead Python function: format_text"}, "properties": {"repobilityId": "9c7ef936813f694d", "scanner": "scanner-primary", "fingerprint": "a56e67768f09586a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/brinson.py:163"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-69e7b7bef99bddbe", "level": "note", "message": {"text": "Possibly dead Python function: reset_throttle_disable"}, "properties": {"repobilityId": "dc09e749d0867df1", "scanner": "scanner-primary", "fingerprint": "69e7b7bef99bddbe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/fmp_client.py:131"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a674d00cff02f04d", "level": "note", "message": {"text": "Possibly dead Python function: fetch_quote"}, "properties": {"repobilityId": "6a3706271e89d303", "scanner": "scanner-primary", "fingerprint": "a674d00cff02f04d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/fmp_client.py:210"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03f1a57e14f3bc18", "level": "note", "message": {"text": "Possibly dead Python function: fetch_grade_events"}, "properties": {"repobilityId": "a08ce75cac67cf18", "scanner": "scanner-primary", "fingerprint": "03f1a57e14f3bc18", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/core/fmp_client.py:489"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c89cdb7990c383ac", "level": "warning", "message": {"text": "Privileged port 21 in use"}, "properties": {"repobilityId": "d920b7cd1b1a16dc", "scanner": "scanner-primary", "fingerprint": "c89cdb7990c383ac", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "enhancement_refresh.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44377a915c887735", "level": "warning", "message": {"text": "Privileged port 16 in use"}, "properties": {"repobilityId": "d31009168c502ace", "scanner": "scanner-primary", "fingerprint": "44377a915c887735", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daily_refresh.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-945e21117482edc7", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "945e21117482edc7", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daily_refresh.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2add503864dc2147", "level": "warning", "message": {"text": "Privileged port 36 in use"}, "properties": {"repobilityId": "d1c2650d13d67a60", "scanner": "scanner-primary", "fingerprint": "2add503864dc2147", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "daily_refresh.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f00ada564d824350", "level": "warning", "message": {"text": "Privileged port 20 in use"}, "properties": {"repobilityId": "a59f3e53d617e0f8", "scanner": "scanner-primary", "fingerprint": "f00ada564d824350", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_premarket_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-80d05f8eeb1d0ea3", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "80d05f8eeb1d0ea3", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_premarket_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4ca1b9e9811b5e39", "level": "warning", "message": {"text": "Privileged port 45 in use"}, "properties": {"repobilityId": "73cf64d92574d41c", "scanner": "scanner-primary", "fingerprint": "4ca1b9e9811b5e39", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_premarket_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-903cc4822c910bf0", "level": "warning", "message": {"text": "Privileged port 15 in use"}, "properties": {"repobilityId": "3340f9a170f285cd", "scanner": "scanner-primary", "fingerprint": "903cc4822c910bf0", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_premarket_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f34535e79eaa6e34", "level": "warning", "message": {"text": "Privileged port 23 in use"}, "properties": {"repobilityId": "a1230e3dfc4becfa", "scanner": "scanner-primary", "fingerprint": "f34535e79eaa6e34", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_defense_watcher_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f661ebc0a9ae9743", "level": "warning", "message": {"text": "Privileged port 55 in use"}, "properties": {"repobilityId": "51a768b3e1831ac0", "scanner": "scanner-primary", "fingerprint": "f661ebc0a9ae9743", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_defense_watcher_launchd.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5952f13f65019b4c", "level": "warning", "message": {"text": "Privileged port 5 in use"}, "properties": {"repobilityId": "a8f80b4866464301", "scanner": "scanner-primary", "fingerprint": "5952f13f65019b4c", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup_defense_watcher_launchd.sh"}, "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-58527b14032c7da4", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in stock_research/api/main.py:327"}, "properties": {"repobilityId": "0f04c30bebf7b16b", "scanner": "scanner-primary", "fingerprint": "58527b14032c7da4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 327}}}]}, {"ruleId": "scanner-ac1bdcecf5434e20", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/settings.json:42"}, "properties": {"repobilityId": "cedb51c5a255db85", "scanner": "scanner-primary", "fingerprint": "ac1bdcecf5434e20", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-2bf83cd57c196db0", "level": "note", "message": {"text": "Very large file: daily_refresh.sh (891 lines)"}, "properties": {"repobilityId": "ad6595b697c9cc89", "scanner": "scanner-primary", "fingerprint": "2bf83cd57c196db0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8831f900d5c0aa75", "level": "note", "message": {"text": "Very large file: scripts/lib/stock_db.py (3954 lines)"}, "properties": {"repobilityId": "0142053afed2d3f4", "scanner": "scanner-primary", "fingerprint": "8831f900d5c0aa75", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd2f3bc451de8193", "level": "note", "message": {"text": "Very large file: scripts/tools/production_acceptance_check.py (1905 lines)"}, "properties": {"repobilityId": "aa77b2fb9ff2ee5c", "scanner": "scanner-primary", "fingerprint": "bd2f3bc451de8193", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da5593e2f2ff33fc", "level": "note", "message": {"text": "Very large file: scripts/tools/build_v2_recommendations.py (1698 lines)"}, "properties": {"repobilityId": "401b07b7148c7082", "scanner": "scanner-primary", "fingerprint": "da5593e2f2ff33fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6794763a45b72d46", "level": "note", "message": {"text": "Very large file: stock_research/api/main.py (2595 lines)"}, "properties": {"repobilityId": "d09ba23f9db975e2", "scanner": "scanner-primary", "fingerprint": "6794763a45b72d46", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-374e77463803d18c", "level": "note", "message": {"text": "Very large file: stock_research/core/premarket_gate.py (1512 lines)"}, "properties": {"repobilityId": "2543b817987e1c93", "scanner": "scanner-primary", "fingerprint": "374e77463803d18c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-970d9cd05d1e7efe", "level": "note", "message": {"text": "Very large file: stock_research/core/ai_radar.py (2687 lines)"}, "properties": {"repobilityId": "075a021cfc0fcfcd", "scanner": "scanner-primary", "fingerprint": "970d9cd05d1e7efe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1f4dd35433c7f05", "level": "note", "message": {"text": "Very large file: stock_research/jobs/morning_brief.py (3436 lines)"}, "properties": {"repobilityId": "68e5926591d754db", "scanner": "scanner-primary", "fingerprint": "f1f4dd35433c7f05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e117f752fc342c0e", "level": "note", "message": {"text": "Very large file: stock_research/jobs/optimize_portfolio.py (1316 lines)"}, "properties": {"repobilityId": "f60f5e4f5672f1e2", "scanner": "scanner-primary", "fingerprint": "e117f752fc342c0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a9929b72ec4e806", "level": "note", "message": {"text": "Very large file: stock_research/jobs/real_holding_review.py (1193 lines)"}, "properties": {"repobilityId": "6f170e39d8f98964", "scanner": "scanner-primary", "fingerprint": "8a9929b72ec4e806", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6ab8be0082214e28", "level": "note", "message": {"text": "Very large file: stock_research/jobs/junior_stock_watcher.py (2506 lines)"}, "properties": {"repobilityId": "38ef640aa39605af", "scanner": "scanner-primary", "fingerprint": "6ab8be0082214e28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "350c2556ce35de3d", "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": "590909a602deaeec", "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": "8e19d139c639f963", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "cd712b3e57d81d36", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "10a3df0e54d224f2", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "10029f63cc30a32f", "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": "9205fe0290a6ec33", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-897ac6da81a78860", "level": "note", "message": {"text": "Legacy-named symbol `reverse_validation_v2` in archive/legacy/reverse_validate_v2.py:152"}, "properties": {"repobilityId": "fcdac305e1ef3b1a", "scanner": "scanner-primary", "fingerprint": "897ac6da81a78860", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-beb9496cdb0e173f", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_discover_candidates.py:14"}, "properties": {"repobilityId": "b26a4bd0f2354979", "scanner": "scanner-primary", "fingerprint": "beb9496cdb0e173f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fc7a74e13be0d03e", "level": "note", "message": {"text": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_validation_v2.py:8"}, "properties": {"repobilityId": "89401b74c585abee", "scanner": "scanner-primary", "fingerprint": "fc7a74e13be0d03e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0cab96b30ae81012", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_ai_radar.py:11"}, "properties": {"repobilityId": "3d246d9fba918195", "scanner": "scanner-primary", "fingerprint": "0cab96b30ae81012", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0348b9533121d1bc", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_strategy_failure_diagnosis.py:11"}, "properties": {"repobilityId": "99e3c2938ebe9913", "scanner": "scanner-primary", "fingerprint": "0348b9533121d1bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bcf4ebeecbeb60ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test_appearance_index_fork.py:127"}, "properties": {"repobilityId": "c6ca0886e2fedeae", "scanner": "scanner-primary", "fingerprint": "bcf4ebeecbeb60ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e14397174a3a905", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_evaluate_v2_picks.py:13"}, "properties": {"repobilityId": "0b396d637e8621ed", "scanner": "scanner-primary", "fingerprint": "7e14397174a3a905", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-983526a5c36af236", "level": "note", "message": {"text": "Legacy-named symbol `shadow_old` in tests/test_evaluate_shadow_tuning_run.py:115"}, "properties": {"repobilityId": "eb6a33353084f3d3", "scanner": "scanner-primary", "fingerprint": "983526a5c36af236", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a60719248dd7c0c8", "level": "note", "message": {"text": "Legacy-named symbol `build_strategy_validation_v2` in tests/test_strategy_eval.py:4"}, "properties": {"repobilityId": "a58abac8254333d4", "scanner": "scanner-primary", "fingerprint": "a60719248dd7c0c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f885d47026a96c4", "level": "note", "message": {"text": "Legacy-named symbol `shadow_v1` in tests/test_us_shadow_preflight_check.py:28"}, "properties": {"repobilityId": "8f1964da6988ad69", "scanner": "scanner-primary", "fingerprint": "6f885d47026a96c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bee12c09cffe5c58", "level": "note", "message": {"text": "Legacy-named symbol `tech_ai_v2` in tests/test_build_shadow_tuning_run.py:108"}, "properties": {"repobilityId": "16f70ed664f8f959", "scanner": "scanner-primary", "fingerprint": "bee12c09cffe5c58", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f0a79df6ba31716e", "level": "note", "message": {"text": "Legacy-named symbol `build_v2` in tests/test_build_v2_recommendations.py:14"}, "properties": {"repobilityId": "e8e3d7145dd867a3", "scanner": "scanner-primary", "fingerprint": "f0a79df6ba31716e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-975a3e095ec724ad", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in tests/test_recommendation_evidence_report.py:11"}, "properties": {"repobilityId": "ce4e358d45a0e0ae", "scanner": "scanner-primary", "fingerprint": "975a3e095ec724ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b40a1bdde67b7c5", "level": "note", "message": {"text": "Legacy-named symbol `state_backup` in scripts/lib/stock_db.py:6"}, "properties": {"repobilityId": "3b99c70b74c6dea0", "scanner": "scanner-primary", "fingerprint": "4b40a1bdde67b7c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4f2f66eb6795fb0e", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/intraday_refresh_holdings.py:33"}, "properties": {"repobilityId": "c46bbd58cd1e5fa7", "scanner": "scanner-primary", "fingerprint": "4f2f66eb6795fb0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6fd294719d252de8", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/pipeline/ingest_benchmark_prices.py:85"}, "properties": {"repobilityId": "104dcbecbb530e2d", "scanner": "scanner-primary", "fingerprint": "6fd294719d252de8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da8ff74522a50b23", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/production_acceptance_check.py:1002"}, "properties": {"repobilityId": "fd0e8a7d588a40d1", "scanner": "scanner-primary", "fingerprint": "da8ff74522a50b23", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a553bf5a1986efd3", "level": "note", "message": {"text": "Legacy-named symbol `_move_to_backup` in scripts/tools/reset_for_clean_proof.py:77"}, "properties": {"repobilityId": "2e5e4ce367877632", "scanner": "scanner-primary", "fingerprint": "a553bf5a1986efd3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ff080d7363b71f56", "level": "note", "message": {"text": "Legacy-named symbol `us_shadow_preflight_v1` in scripts/tools/us_shadow_preflight_check.py:393"}, "properties": {"repobilityId": "6f33775ac14ddcda", "scanner": "scanner-primary", "fingerprint": "ff080d7363b71f56", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bf2f297fceb8ae51", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/migrate_holdings_ledger_v2.py:5"}, "properties": {"repobilityId": "e90b2f917efb57bd", "scanner": "scanner-primary", "fingerprint": "bf2f297fceb8ae51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-729995d631d6fdf1", "level": "note", "message": {"text": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/build_v2_recommendations.py:290"}, "properties": {"repobilityId": "e47a512bb22192a5", "scanner": "scanner-primary", "fingerprint": "729995d631d6fdf1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-944a36566f3bbec7", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/tools/build_v2_recommendations.py:68"}, "properties": {"repobilityId": "3c3ae964b6e85457", "scanner": "scanner-primary", "fingerprint": "944a36566f3bbec7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4b3e372e880da25", "level": "note", "message": {"text": "Legacy-named symbol `compute_piotroski_v2` in scripts/tools/compute_piotroski_v2.py:23"}, "properties": {"repobilityId": "eee9d29d92169f85", "scanner": "scanner-primary", "fingerprint": "d4b3e372e880da25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-30789d576b399275", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/classify_chain_v2.py:23"}, "properties": {"repobilityId": "2d8e6fed9ef8e502", "scanner": "scanner-primary", "fingerprint": "30789d576b399275", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-22c14afadbaced24", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/current_state_report.py:135"}, "properties": {"repobilityId": "89c631912433091e", "scanner": "scanner-primary", "fingerprint": "22c14afadbaced24", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a6fa4cc96bc68aef", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_catalyst_signals.py:65"}, "properties": {"repobilityId": "dc2770deeced38c7", "scanner": "scanner-primary", "fingerprint": "a6fa4cc96bc68aef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ca0ce6f642111be", "level": "note", "message": {"text": "Legacy-named symbol `us_strict_trial_v1` in scripts/tools/us_strict_trial.py:678"}, "properties": {"repobilityId": "52fb8e7e00d087a4", "scanner": "scanner-primary", "fingerprint": "8ca0ce6f642111be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-615070298a546d4a", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/check_cutover_readiness.py:27"}, "properties": {"repobilityId": "bebc637bcd7c5caa", "scanner": "scanner-primary", "fingerprint": "615070298a546d4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-25dfc48a7bee673e", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/evaluate_v2_picks.py:148"}, "properties": {"repobilityId": "975679a93fadebfd", "scanner": "scanner-primary", "fingerprint": "25dfc48a7bee673e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26336d6013b22702", "level": "note", "message": {"text": "Legacy-named symbol `p0_policy_validation_v1` in scripts/tools/build_strategy_validation_v2.py:352"}, "properties": {"repobilityId": "f20c404be7754b35", "scanner": "scanner-primary", "fingerprint": "26336d6013b22702", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-abc6cc1872ed967c", "level": "note", "message": {"text": "Legacy-named symbol `state_backup` in scripts/tools/restore_state_from_json.py:2"}, "properties": {"repobilityId": "8ae7b5f9eb516237", "scanner": "scanner-primary", "fingerprint": "abc6cc1872ed967c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-deb90130082f3864", "level": "note", "message": {"text": "Legacy-named symbol `recommendation_readiness_v1` in scripts/tools/recommendation_readiness_check.py:433"}, "properties": {"repobilityId": "40ab9f51bf32511f", "scanner": "scanner-primary", "fingerprint": "deb90130082f3864", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8d17be9c14d10b73", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/drop_v1_tables_v2.py:24"}, "properties": {"repobilityId": "79ef0cd2ef1f1dd3", "scanner": "scanner-primary", "fingerprint": "8d17be9c14d10b73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7f3b19444567a604", "level": "note", "message": {"text": "Legacy-named symbol `strategy_tuning_proposal_v1` in scripts/tools/strategy_tuning_proposal.py:203"}, "properties": {"repobilityId": "2cb02f9618ba8ccd", "scanner": "scanner-primary", "fingerprint": "7f3b19444567a604", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9f222ebb36d6f931", "level": "note", "message": {"text": "Legacy-named symbol `strategy_failure_diagnosis_v1` in scripts/tools/strategy_failure_diagnosis.py:850"}, "properties": {"repobilityId": "1fbc62dbeed190bd", "scanner": "scanner-primary", "fingerprint": "9f222ebb36d6f931", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-783fa777064c522e", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/refresh_system_universe_v2.py:25"}, "properties": {"repobilityId": "ca17b1eb5917ea7c", "scanner": "scanner-primary", "fingerprint": "783fa777064c522e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7072cbc8e2d92ad3", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/discover_candidates.py:9"}, "properties": {"repobilityId": "dd9e022231924178", "scanner": "scanner-primary", "fingerprint": "7072cbc8e2d92ad3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7dec024db70dd519", "level": "note", "message": {"text": "Legacy-named symbol `state_backup` in scripts/tools/backup_state_to_json.py:2"}, "properties": {"repobilityId": "f0368e5011287747", "scanner": "scanner-primary", "fingerprint": "7dec024db70dd519", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bf104fc19168a154", "level": "note", "message": {"text": "Legacy-named symbol `shadow_tuning_run_v1` in scripts/tools/build_shadow_tuning_run.py:563"}, "properties": {"repobilityId": "83d8ba1d2d8dec7b", "scanner": "scanner-primary", "fingerprint": "bf104fc19168a154", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ffa503d5ef650f58", "level": "note", "message": {"text": "Legacy-named symbol `init_stock_db_v2` in scripts/tools/init_stock_db_v2.py:648"}, "properties": {"repobilityId": "e7c091a0f458609f", "scanner": "scanner-primary", "fingerprint": "ffa503d5ef650f58", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7c57f3325811c2d5", "level": "note", "message": {"text": "Legacy-named symbol `v2_system_enrichment_v1` in scripts/tools/enrich_system_universe_v2.py:722"}, "properties": {"repobilityId": "0fa07bde9cda6b74", "scanner": "scanner-primary", "fingerprint": "7c57f3325811c2d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9ede6d89bc80e3d6", "level": "note", "message": {"text": "Legacy-named symbol `shadow_tuning_evidence_v1` in scripts/tools/evaluate_shadow_tuning_run.py:533"}, "properties": {"repobilityId": "7de587003f276449", "scanner": "scanner-primary", "fingerprint": "9ede6d89bc80e3d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b048059517d4dec0", "level": "note", "message": {"text": "Legacy-named symbol `clear_legacy` in scripts/tools/migrate_holdings_split_v2.py:23"}, "properties": {"repobilityId": "6cbc92be56c5001e", "scanner": "scanner-primary", "fingerprint": "b048059517d4dec0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-800e682eb1d6aae6", "level": "note", "message": {"text": "Legacy-named symbol `us_production_acceptance_v1` in scripts/tools/us_production_acceptance_check.py:502"}, "properties": {"repobilityId": "e71df41ab68011e4", "scanner": "scanner-primary", "fingerprint": "800e682eb1d6aae6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-28658f1693f1eb4a", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in scripts/tools/strict_caliber_backtest.py:38"}, "properties": {"repobilityId": "e99f471e74d6256b", "scanner": "scanner-primary", "fingerprint": "28658f1693f1eb4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d8a98693fbdd5404", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/config.py:26"}, "properties": {"repobilityId": "453e8dcc2d95bb22", "scanner": "scanner-primary", "fingerprint": "d8a98693fbdd5404", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9836a35915755b73", "level": "note", "message": {"text": "Legacy-named symbol `refresh_system_universe_v2` in stock_research/api/main.py:333"}, "properties": {"repobilityId": "cc572c79fc314c32", "scanner": "scanner-primary", "fingerprint": "9836a35915755b73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1dcfba7ef355b217", "level": "note", "message": {"text": "Legacy-named symbol `compute_piotroski_v2` in stock_research/core/baostock_client.py:158"}, "properties": {"repobilityId": "3726b7abf5ee831d", "scanner": "scanner-primary", "fingerprint": "1dcfba7ef355b217", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6102ff28c6bf7af1", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/core/premarket_gate.py:1285"}, "properties": {"repobilityId": "f761c482458503fd", "scanner": "scanner-primary", "fingerprint": "6102ff28c6bf7af1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3b0af8b9f4d61e6e", "level": "note", "message": {"text": "Legacy-named symbol `classify_chain_v2` in stock_research/core/ai_radar.py:1719"}, "properties": {"repobilityId": "49b2a74252dbcb7b", "scanner": "scanner-primary", "fingerprint": "3b0af8b9f4d61e6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ca1ab4586ac84a82", "level": "none", "message": {"text": "Commented-code block (6 lines) in stock_research/core/ai_radar.py:274"}, "properties": {"repobilityId": "a04965270abc4645", "scanner": "scanner-primary", "fingerprint": "ca1ab4586ac84a82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f8534be604418af", "level": "none", "message": {"text": "Commented-code block (5 lines) in stock_research/core/regime_filter.py:467"}, "properties": {"repobilityId": "9d2e784620d7c8e2", "scanner": "scanner-primary", "fingerprint": "0f8534be604418af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63489d538889313d", "level": "none", "message": {"text": "Commented-code block (7 lines) in stock_research/core/technical_indicators.py:360"}, "properties": {"repobilityId": "a4da5fdcbd457c20", "scanner": "scanner-primary", "fingerprint": "63489d538889313d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-652525753f30de8f", "level": "none", "message": {"text": "Commented-code block (7 lines) in stock_research/core/portfolio_optimizer_pro.py:353"}, "properties": {"repobilityId": "33deb70b36f629ee", "scanner": "scanner-primary", "fingerprint": "652525753f30de8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-627fa31f1b7c0cf5", "level": "note", "message": {"text": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/core/watchlist_enrich.py:400"}, "properties": {"repobilityId": "4079cdd3ec1765b3", "scanner": "scanner-primary", "fingerprint": "627fa31f1b7c0cf5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-086b02d50eb1071c", "level": "note", "message": {"text": "Legacy-named symbol `tech_ai_v1` in stock_research/core/strategy_eval.py:6"}, "properties": {"repobilityId": "7501081b5f0c92ca", "scanner": "scanner-primary", "fingerprint": "086b02d50eb1071c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9416e0aefdb7f1a", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_form4_daily.py:157"}, "properties": {"repobilityId": "60e18d1f18ff8797", "scanner": "scanner-primary", "fingerprint": "a9416e0aefdb7f1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aa6d97386bca13dc", "level": "none", "message": {"text": "Commented-code block (5 lines) in stock_research/jobs/morning_brief.py:885"}, "properties": {"repobilityId": "b176bf6b5ef5ff7a", "scanner": "scanner-primary", "fingerprint": "aa6d97386bca13dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f9f163d76cd0c8b", "level": "note", "message": {"text": "Legacy-named symbol `fallback_v2` in stock_research/jobs/optimize_portfolio.py:476"}, "properties": {"repobilityId": "e0792ea6de5e6870", "scanner": "scanner-primary", "fingerprint": "0f9f163d76cd0c8b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d1ba1d08efcc67a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in stock_research/jobs/real_holding_review.py:734"}, "properties": {"repobilityId": "23d1d55f746e1c3f", "scanner": "scanner-primary", "fingerprint": "d1ba1d08efcc67a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87d9ec68d4033d87", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_daily.py:38"}, "properties": {"repobilityId": "5424941a7f62cb90", "scanner": "scanner-primary", "fingerprint": "87d9ec68d4033d87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4c696d6ac7ec78fc", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/archive_picks.py:60"}, "properties": {"repobilityId": "ce1b79d245261046", "scanner": "scanner-primary", "fingerprint": "4c696d6ac7ec78fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-29bb27a1365cf93e", "level": "note", "message": {"text": "Legacy-named symbol `audit_picks_v2` in stock_research/jobs/audit_picks_v2.py:15"}, "properties": {"repobilityId": "d0237af9e401bfc6", "scanner": "scanner-primary", "fingerprint": "29bb27a1365cf93e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ce04c3492dd64df", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/junior_stock_watcher.py:490"}, "properties": {"repobilityId": "8962e01bf1b536cb", "scanner": "scanner-primary", "fingerprint": "8ce04c3492dd64df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c6f1ef8c4dd97041", "level": "note", "message": {"text": "Legacy-named symbol `stock_history_v2` in stock_research/jobs/event_calendar_us_sec_daily.py:265"}, "properties": {"repobilityId": "ccb3a765283d1206", "scanner": "scanner-primary", "fingerprint": "c6f1ef8c4dd97041", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7c73b4f56b222c51", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in stock_research/jobs/aggregate_theme_tags.py:132"}, "properties": {"repobilityId": "c5afe1fcbcfd8a8c", "scanner": "scanner-primary", "fingerprint": "7c73b4f56b222c51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1de180878cab6882", "level": "note", "message": {"text": "Legacy-named symbol `enrich_system_universe_v2` in stock_research/jobs/enrich_watchlist.py:175"}, "properties": {"repobilityId": "9575bbf97361dec9", "scanner": "scanner-primary", "fingerprint": "1de180878cab6882", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-df27f93108c7e64b", "level": "none", "message": {"text": "Commented-code block (6 lines) in stock_research/jobs/apply_a_share_constraints.py:218"}, "properties": {"repobilityId": "898542dea7973f45", "scanner": "scanner-primary", "fingerprint": "df27f93108c7e64b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0584d4d0f0ca3f89", "level": "note", "message": {"text": "Legacy-named symbol `state_backup` in stock_research/jobs/weekly_self_review.py:4"}, "properties": {"repobilityId": "b78cfd5a660c0a5b", "scanner": "scanner-primary", "fingerprint": "0584d4d0f0ca3f89", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9d19c4d97d89052a", "level": "none", "message": {"text": "Commented-code block (5 lines) in stock_research/jobs/stress_test.py:277"}, "properties": {"repobilityId": "d978dcf9baf993d1", "scanner": "scanner-primary", "fingerprint": "9d19c4d97d89052a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64bc033a45ab26f1", "level": "note", "message": {"text": "34 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "dab9f6f977f9c414", "scanner": "scanner-primary", "fingerprint": "64bc033a45ab26f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9beef66c87c34a17", "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": "075d0c135048ec11", "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": "66bc3eb1d3bb5074", "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": "dd4478b56afc19ae", "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": "6c0d5446ce29be20", "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": "20f05c7a9a64abb8", "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": "19732a75f530d4c3", "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": "6d8d02ff06feed1d", "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": "14176de25750497c", "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": "2820a33b78e2f626", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-cd6e16fed365b7ab", "level": "error", "message": {"text": "FastAPI POST `create_watchlist` without auth dependency \u2014 stock_research/api/main.py:484"}, "properties": {"repobilityId": "81ec99f0d26e3168", "scanner": "scanner-primary", "fingerprint": "cd6e16fed365b7ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 484}}}]}, {"ruleId": "scanner-dc14e1890d8120ef", "level": "error", "message": {"text": "FastAPI PUT `update_watchlist` without auth dependency \u2014 stock_research/api/main.py:510"}, "properties": {"repobilityId": "57f9a302180529f9", "scanner": "scanner-primary", "fingerprint": "dc14e1890d8120ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 510}}}]}, {"ruleId": "scanner-e0e1c3e157e5e0c8", "level": "error", "message": {"text": "FastAPI DELETE `delete_watchlist` without auth dependency \u2014 stock_research/api/main.py:559"}, "properties": {"repobilityId": "ab9a9fa2151d30dd", "scanner": "scanner-primary", "fingerprint": "e0e1c3e157e5e0c8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 559}}}]}, {"ruleId": "scanner-3fff0bef80154ffd", "level": "error", "message": {"text": "FastAPI POST `auto_enrich_watchlist` without auth dependency \u2014 stock_research/api/main.py:1077"}, "properties": {"repobilityId": "0a372af8d2562341", "scanner": "scanner-primary", "fingerprint": "3fff0bef80154ffd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1077}}}]}, {"ruleId": "scanner-ec5df4992792d7ec", "level": "error", "message": {"text": "FastAPI POST `picks_rerun` without auth dependency \u2014 stock_research/api/main.py:1236"}, "properties": {"repobilityId": "c05fd348e1acf202", "scanner": "scanner-primary", "fingerprint": "ec5df4992792d7ec", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1236}}}]}, {"ruleId": "scanner-2393b384452e0801", "level": "error", "message": {"text": "FastAPI POST `create_real_holding` without auth dependency \u2014 stock_research/api/main.py:1360"}, "properties": {"repobilityId": "8ca52cfa1bf96bca", "scanner": "scanner-primary", "fingerprint": "2393b384452e0801", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1360}}}]}, {"ruleId": "scanner-100879592d25b9f7", "level": "error", "message": {"text": "FastAPI POST `fetch_holdings_prices` without auth dependency \u2014 stock_research/api/main.py:1396"}, "properties": {"repobilityId": "44970c368565283b", "scanner": "scanner-primary", "fingerprint": "100879592d25b9f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1396}}}]}, {"ruleId": "scanner-551251bef6b03c3a", "level": "error", "message": {"text": "FastAPI POST `sync_holdings_to_watchlist` without auth dependency \u2014 stock_research/api/main.py:1426"}, "properties": {"repobilityId": "e632071129fb057d", "scanner": "scanner-primary", "fingerprint": "551251bef6b03c3a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1426}}}]}, {"ruleId": "scanner-1e95d747a3d70e5e", "level": "error", "message": {"text": "FastAPI POST `record_real_holding_buy` without auth dependency \u2014 stock_research/api/main.py:1456"}, "properties": {"repobilityId": "a995f29ca89d964b", "scanner": "scanner-primary", "fingerprint": "1e95d747a3d70e5e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1456}}}]}, {"ruleId": "scanner-ced3c27a6a28ea52", "level": "error", "message": {"text": "FastAPI POST `add_to_real_holding` without auth dependency \u2014 stock_research/api/main.py:1523"}, "properties": {"repobilityId": "db3d0c04102d3fc4", "scanner": "scanner-primary", "fingerprint": "ced3c27a6a28ea52", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1523}}}]}, {"ruleId": "scanner-b7ea70aa08a4e0a0", "level": "error", "message": {"text": "FastAPI POST `close_real_holding` without auth dependency \u2014 stock_research/api/main.py:1541"}, "properties": {"repobilityId": "91a93b9ed04762b6", "scanner": "scanner-primary", "fingerprint": "b7ea70aa08a4e0a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1541}}}]}, {"ruleId": "scanner-e7dc77d6b6d38275", "level": "error", "message": {"text": "FastAPI POST `create_cash_flow` without auth dependency \u2014 stock_research/api/main.py:1619"}, "properties": {"repobilityId": "76d68dd22fa40af6", "scanner": "scanner-primary", "fingerprint": "e7dc77d6b6d38275", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1619}}}]}, {"ruleId": "scanner-8e999ff141fa15be", "level": "error", "message": {"text": "FastAPI DELETE `delete_cash_flow_one` without auth dependency \u2014 stock_research/api/main.py:1629"}, "properties": {"repobilityId": "b4f437fadd1deb7a", "scanner": "scanner-primary", "fingerprint": "8e999ff141fa15be", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1629}}}]}, {"ruleId": "scanner-ab76cb25f6d3798e", "level": "error", "message": {"text": "FastAPI POST `void_real_holding_trade_one` without auth dependency \u2014 stock_research/api/main.py:1645"}, "properties": {"repobilityId": "f6c236522ed156d0", "scanner": "scanner-primary", "fingerprint": "ab76cb25f6d3798e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1645}}}]}, {"ruleId": "scanner-3161661336247469", "level": "error", "message": {"text": "FastAPI POST `rebuild_real_holdings` without auth dependency \u2014 stock_research/api/main.py:1658"}, "properties": {"repobilityId": "633f2d5e5f264595", "scanner": "scanner-primary", "fingerprint": "3161661336247469", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1658}}}]}, {"ruleId": "scanner-7b7a71d9aff5e5ab", "level": "error", "message": {"text": "FastAPI POST `create_real_holding_discipline` without auth dependency \u2014 stock_research/api/main.py:1688"}, "properties": {"repobilityId": "03e13840c769a2ba", "scanner": "scanner-primary", "fingerprint": "7b7a71d9aff5e5ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1688}}}]}, {"ruleId": "scanner-016487268206fe22", "level": "error", "message": {"text": "FastAPI PATCH `update_real_holding_discipline_status` without auth dependency \u2014 stock_research/api/main.py:1712"}, "properties": {"repobilityId": "d1143eefa49c393a", "scanner": "scanner-primary", "fingerprint": "016487268206fe22", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1712}}}]}, {"ruleId": "scanner-ba2c14319a82c4de", "level": "error", "message": {"text": "FastAPI PUT `update_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1727"}, "properties": {"repobilityId": "e36844d09da81ab5", "scanner": "scanner-primary", "fingerprint": "ba2c14319a82c4de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1727}}}]}, {"ruleId": "scanner-1ea10930512ad4d5", "level": "error", "message": {"text": "FastAPI DELETE `delete_real_holding_one` without auth dependency \u2014 stock_research/api/main.py:1763"}, "properties": {"repobilityId": "526895a3fef8ebde", "scanner": "scanner-primary", "fingerprint": "1ea10930512ad4d5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1763}}}]}, {"ruleId": "scanner-6190cfb489da028d", "level": "error", "message": {"text": "FastAPI POST `bottleneck_review_save` without auth dependency \u2014 stock_research/api/main.py:1786"}, "properties": {"repobilityId": "ba886e28b49bb4b7", "scanner": "scanner-primary", "fingerprint": "6190cfb489da028d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 1786}}}]}, {"ruleId": "scanner-de0c4cd96da91cdf", "level": "error", "message": {"text": "FastAPI POST `real_holdings_daily_review_run` without auth dependency \u2014 stock_research/api/main.py:2193"}, "properties": {"repobilityId": "79829ad04f795d2a", "scanner": "scanner-primary", "fingerprint": "de0c4cd96da91cdf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2193}}}]}, {"ruleId": "scanner-df43614d2115811f", "level": "error", "message": {"text": "FastAPI POST `bulk_replace_model_sim_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2296"}, "properties": {"repobilityId": "43d87a2820aa169d", "scanner": "scanner-primary", "fingerprint": "df43614d2115811f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2296}}}]}, {"ruleId": "scanner-70c9c6db8fddac1b", "level": "error", "message": {"text": "FastAPI DELETE `delete_model_sim_holding_one` without auth dependency \u2014 stock_research/api/main.py:2302"}, "properties": {"repobilityId": "288d1294b61acad1", "scanner": "scanner-primary", "fingerprint": "70c9c6db8fddac1b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2302}}}]}, {"ruleId": "scanner-e78a747fdc05cd96", "level": "error", "message": {"text": "FastAPI POST `create_holding` without auth dependency \u2014 stock_research/api/main.py:2315"}, "properties": {"repobilityId": "16eb4206fa60063f", "scanner": "scanner-primary", "fingerprint": "e78a747fdc05cd96", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2315}}}]}, {"ruleId": "scanner-3817f3c8420c7488", "level": "error", "message": {"text": "FastAPI PUT `update_holding_one` without auth dependency \u2014 stock_research/api/main.py:2319"}, "properties": {"repobilityId": "c1e84baf034ac47f", "scanner": "scanner-primary", "fingerprint": "3817f3c8420c7488", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2319}}}]}, {"ruleId": "scanner-12bcfded8879922f", "level": "error", "message": {"text": "FastAPI DELETE `delete_holding_one` without auth dependency \u2014 stock_research/api/main.py:2323"}, "properties": {"repobilityId": "ceccc02f725a7054", "scanner": "scanner-primary", "fingerprint": "12bcfded8879922f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2323}}}]}, {"ruleId": "scanner-0d62185dd89ae2ec", "level": "error", "message": {"text": "FastAPI POST `bulk_replace_holdings_endpoint` without auth dependency \u2014 stock_research/api/main.py:2327"}, "properties": {"repobilityId": "8ceeb306bf3f2ceb", "scanner": "scanner-primary", "fingerprint": "0d62185dd89ae2ec", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2327}}}]}, {"ruleId": "scanner-ab4daee375d29333", "level": "error", "message": {"text": "FastAPI PUT `update_user_config` without auth dependency \u2014 stock_research/api/main.py:2338"}, "properties": {"repobilityId": "e501afd92e8c067e", "scanner": "scanner-primary", "fingerprint": "ab4daee375d29333", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2338}}}]}, {"ruleId": "scanner-1ef40d742e7f0aa0", "level": "error", "message": {"text": "FastAPI POST `trigger_13f_refresh` without auth dependency \u2014 stock_research/api/main.py:2376"}, "properties": {"repobilityId": "92e68bc45647c812", "scanner": "scanner-primary", "fingerprint": "1ef40d742e7f0aa0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2376}}}]}, {"ruleId": "scanner-3f1f7b4db54af73e", "level": "error", "message": {"text": "FastAPI POST `trigger_enrich` without auth dependency \u2014 stock_research/api/main.py:2383"}, "properties": {"repobilityId": "803bb10988ecfa2e", "scanner": "scanner-primary", "fingerprint": "3f1f7b4db54af73e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2383}}}]}, {"ruleId": "scanner-bdbde91462862993", "level": "error", "message": {"text": "FastAPI POST `trigger_audit` without auth dependency \u2014 stock_research/api/main.py:2390"}, "properties": {"repobilityId": "9fcd0a546fa781b6", "scanner": "scanner-primary", "fingerprint": "bdbde91462862993", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2390}}}]}, {"ruleId": "scanner-0e7896099f88c049", "level": "error", "message": {"text": "FastAPI POST `trigger_refresh_v2_recommendations` without auth dependency \u2014 stock_research/api/main.py:2548"}, "properties": {"repobilityId": "4f655d0daa86f91b", "scanner": "scanner-primary", "fingerprint": "0e7896099f88c049", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2548}}}]}, {"ruleId": "scanner-c2f599d3f4c4f1d8", "level": "error", "message": {"text": "FastAPI POST `trigger_ipo_refresh` without auth dependency \u2014 stock_research/api/main.py:2571"}, "properties": {"repobilityId": "73c8fdca50f7fd7e", "scanner": "scanner-primary", "fingerprint": "c2f599d3f4c4f1d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stock_research/api/main.py"}, "region": {"startLine": 2571}}}]}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "4b3ae8b844304f2e", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1014fb98bff509bb", "level": "note", "message": {"text": "Unused endpoint: GET /api/fx-rates"}, "properties": {"repobilityId": "da618bd1faf195f0", "scanner": "scanner-primary", "fingerprint": "1014fb98bff509bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-703d50298ef754bc", "level": "note", "message": {"text": "Unused endpoint: GET /api/13f/investors"}, "properties": {"repobilityId": "f74b0c906c24b487", "scanner": "scanner-primary", "fingerprint": "703d50298ef754bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10afff696b84ac54", "level": "note", "message": {"text": "Unused endpoint: GET /api/13f/changes/{cik}"}, "properties": {"repobilityId": "2286d175170a25ed", "scanner": "scanner-primary", "fingerprint": "10afff696b84ac54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-891f1abfb9f66bcb", "level": "note", "message": {"text": "Unused endpoint: GET /api/13f/filings/{cik}"}, "properties": {"repobilityId": "660f5d9b6b9fb0fa", "scanner": "scanner-primary", "fingerprint": "891f1abfb9f66bcb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19c8531eb02471bd", "level": "note", "message": {"text": "Unused endpoint: GET /api/watchlist"}, "properties": {"repobilityId": "5221d08356e4eb47", "scanner": "scanner-primary", "fingerprint": "19c8531eb02471bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e38c950a5669644", "level": "note", "message": {"text": "Unused endpoint: GET /api/watchlist/{code}"}, "properties": {"repobilityId": "51800aaff6dd0919", "scanner": "scanner-primary", "fingerprint": "4e38c950a5669644", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b4bc3e641888422", "level": "note", "message": {"text": "Unused endpoint: POST /api/watchlist"}, "properties": {"repobilityId": "9da32dc0f9814532", "scanner": "scanner-primary", "fingerprint": "1b4bc3e641888422", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4bb50fb3802eb14", "level": "note", "message": {"text": "Unused endpoint: PUT /api/watchlist/{code}"}, "properties": {"repobilityId": "1072407163d3658b", "scanner": "scanner-primary", "fingerprint": "e4bb50fb3802eb14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d3524d83f8c83e9", "level": "note", "message": {"text": "Unused endpoint: GET /api/chain-metadata"}, "properties": {"repobilityId": "b4be8253453a2e3d", "scanner": "scanner-primary", "fingerprint": "6d3524d83f8c83e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af9a7f746eb6bb75", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/watchlist/{code}"}, "properties": {"repobilityId": "fa71735b6d8d8834", "scanner": "scanner-primary", "fingerprint": "af9a7f746eb6bb75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b43435beaac8f258", "level": "note", "message": {"text": "Unused endpoint: GET /api/db/all-stocks"}, "properties": {"repobilityId": "00443a0478a569b2", "scanner": "scanner-primary", "fingerprint": "b43435beaac8f258", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b28417b04e0868a0", "level": "note", "message": {"text": "Unused endpoint: GET /api/db/tables-overview"}, "properties": {"repobilityId": "29e220891ae28e25", "scanner": "scanner-primary", "fingerprint": "b28417b04e0868a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a1077a1e2c866378", "level": "note", "message": {"text": "Unused endpoint: GET /api/db/table/{name}"}, "properties": {"repobilityId": "810268afb53ae8e7", "scanner": "scanner-primary", "fingerprint": "a1077a1e2c866378", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bab803105889e87b", "level": "note", "message": {"text": "Unused endpoint: GET /api/db/stock-history/{code}"}, "properties": {"repobilityId": "b7676c1ffe4d211d", "scanner": "scanner-primary", "fingerprint": "bab803105889e87b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f0bf84b48ae3c0a", "level": "note", "message": {"text": "Unused endpoint: POST /api/watchlist/auto-enrich"}, "properties": {"repobilityId": "cfb6407f509d2672", "scanner": "scanner-primary", "fingerprint": "0f0bf84b48ae3c0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0f5117a01030c31", "level": "note", "message": {"text": "Unused endpoint: GET /api/picks/rerun-status"}, "properties": {"repobilityId": "994eda962f89d5a1", "scanner": "scanner-primary", "fingerprint": "a0f5117a01030c31", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-811a75ac77626eec", "level": "note", "message": {"text": "Unused endpoint: POST /api/picks/rerun"}, "properties": {"repobilityId": "7ec47d66b57e4dc2", "scanner": "scanner-primary", "fingerprint": "811a75ac77626eec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-caec49ec089f1d8e", "level": "note", "message": {"text": "Unused endpoint: GET /api/picks/latest-summary"}, "properties": {"repobilityId": "0e7b4b44627f6e71", "scanner": "scanner-primary", "fingerprint": "caec49ec089f1d8e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1a94407ec99ba61", "level": "note", "message": {"text": "Unused endpoint: GET /api/picks/by-code/{code}"}, "properties": {"repobilityId": "e656c5cf5723f5c4", "scanner": "scanner-primary", "fingerprint": "d1a94407ec99ba61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3ac8f7900220760", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings"}, "properties": {"repobilityId": "f3beb580e1346de6", "scanner": "scanner-primary", "fingerprint": "e3ac8f7900220760", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad72a76a87cee431", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings"}, "properties": {"repobilityId": "460b5a5095e6a51b", "scanner": "scanner-primary", "fingerprint": "ad72a76a87cee431", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1215e6799d07a722", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/fetch-prices"}, "properties": {"repobilityId": "bae96a928599cac2", "scanner": "scanner-primary", "fingerprint": "1215e6799d07a722", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5accb21eeeba3296", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/sync-to-watchlist"}, "properties": {"repobilityId": "f921146d4014b160", "scanner": "scanner-primary", "fingerprint": "5accb21eeeba3296", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc74c864fd06125d", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/buy"}, "properties": {"repobilityId": "b634b80956d1293c", "scanner": "scanner-primary", "fingerprint": "fc74c864fd06125d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-79678eb98aa984b3", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/add"}, "properties": {"repobilityId": "fbda88d45cbf0b7e", "scanner": "scanner-primary", "fingerprint": "79678eb98aa984b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df10690c71d4e2e1", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/close"}, "properties": {"repobilityId": "1fbf8de08a6d8b3d", "scanner": "scanner-primary", "fingerprint": "df10690c71d4e2e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49b3c1311cc9dfed", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/trade-history"}, "properties": {"repobilityId": "b9ad0f1b8dedffa9", "scanner": "scanner-primary", "fingerprint": "49b3c1311cc9dfed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2cc64bf53b1e02e", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/pnl-summary"}, "properties": {"repobilityId": "b9cfd73cbfd06474", "scanner": "scanner-primary", "fingerprint": "e2cc64bf53b1e02e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0d6f84a276a1e60", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/account-summary"}, "properties": {"repobilityId": "e394185c7d63f51c", "scanner": "scanner-primary", "fingerprint": "b0d6f84a276a1e60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba8bec321f927a5e", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/cash-flows"}, "properties": {"repobilityId": "af57269127a05ed8", "scanner": "scanner-primary", "fingerprint": "ba8bec321f927a5e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb1ddc7aa9e662e3", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/cash-flows"}, "properties": {"repobilityId": "e07d5d9a50fb0b28", "scanner": "scanner-primary", "fingerprint": "fb1ddc7aa9e662e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-870881daee167d85", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/real-holdings/cash-flows/{flow_id}"}, "properties": {"repobilityId": "744c83d1eb1e949c", "scanner": "scanner-primary", "fingerprint": "870881daee167d85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b89de0cb544ee55b", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/{holding_id}/records"}, "properties": {"repobilityId": "08be84d8cc8b32bf", "scanner": "scanner-primary", "fingerprint": "b89de0cb544ee55b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c052bf81049a824", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/trades/{trade_id}/void"}, "properties": {"repobilityId": "6e4eeaf1108a5d32", "scanner": "scanner-primary", "fingerprint": "2c052bf81049a824", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-496b7d4c5637c38c", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/rebuild-from-trades"}, "properties": {"repobilityId": "a59272c92effc498", "scanner": "scanner-primary", "fingerprint": "496b7d4c5637c38c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24ba00537f044d6c", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/discipline"}, "properties": {"repobilityId": "6a47a9b0bf9336c6", "scanner": "scanner-primary", "fingerprint": "24ba00537f044d6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8fd4b131e33d7e9", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/{holding_id}/discipline"}, "properties": {"repobilityId": "3c098084545a1d72", "scanner": "scanner-primary", "fingerprint": "e8fd4b131e33d7e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29a7362451beda32", "level": "note", "message": {"text": "Unused endpoint: POST /api/real-holdings/{holding_id}/discipline"}, "properties": {"repobilityId": "306d103968ca0671", "scanner": "scanner-primary", "fingerprint": "29a7362451beda32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab745bf1fb64134a", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/real-holdings/discipline/{plan_id}"}, "properties": {"repobilityId": "a611dc0e3fd50167", "scanner": "scanner-primary", "fingerprint": "ab745bf1fb64134a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9cee44780503f54", "level": "note", "message": {"text": "Unused endpoint: PUT /api/real-holdings/{holding_id}"}, "properties": {"repobilityId": "b1aab2accbc94144", "scanner": "scanner-primary", "fingerprint": "d9cee44780503f54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71909ba7d6542157", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/real-holdings/{holding_id}"}, "properties": {"repobilityId": "996d2c03294a1af8", "scanner": "scanner-primary", "fingerprint": "71909ba7d6542157", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e54cd7c8824db502", "level": "note", "message": {"text": "Unused endpoint: GET /api/bottleneck-reviews"}, "properties": {"repobilityId": "a22f11431e1cbd9a", "scanner": "scanner-primary", "fingerprint": "e54cd7c8824db502", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb58b3b275159caf", "level": "note", "message": {"text": "Unused endpoint: POST /api/bottleneck-review"}, "properties": {"repobilityId": "af37d9639abdfa58", "scanner": "scanner-primary", "fingerprint": "fb58b3b275159caf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7fb65c44338a1077", "level": "note", "message": {"text": "Unused endpoint: GET /api/premarket-gate"}, "properties": {"repobilityId": "d8c417d659a49d76", "scanner": "scanner-primary", "fingerprint": "7fb65c44338a1077", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4c4d402e2b3e53f", "level": "note", "message": {"text": "Unused endpoint: GET /api/premarket-gate/history"}, "properties": {"repobilityId": "a6b8e7c25216ada2", "scanner": "scanner-primary", "fingerprint": "d4c4d402e2b3e53f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5e3eb643f031c26", "level": "note", "message": {"text": "Unused endpoint: GET /premarket"}, "properties": {"repobilityId": "fac4f6f1f0ee37a6", "scanner": "scanner-primary", "fingerprint": "a5e3eb643f031c26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-128e14200ab48c1d", "level": "note", "message": {"text": "Unused endpoint: GET /premarket/history"}, "properties": {"repobilityId": "14f415af9ae530e3", "scanner": "scanner-primary", "fingerprint": "128e14200ab48c1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18e83b1e0197af55", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/daily-verdict"}, "properties": {"repobilityId": "10e2656dd4cb4c68", "scanner": "scanner-primary", "fingerprint": "18e83b1e0197af55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5478c32b637e23ae", "level": "note", "message": {"text": "Unused endpoint: GET /api/real-holdings/daily-review/latest"}, "properties": {"repobilityId": "4f554539b71fc976", "scanner": "scanner-primary", "fingerprint": "5478c32b637e23ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}