{"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-2cdd02dfc396199e", "name": "Possibly dead Python function: scrape_kap_ipo", "shortDescription": {"text": "Possibly dead Python function: scrape_kap_ipo"}, "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-a4b1be0712829283", "name": "Possibly dead Python function: scrape_kap_news", "shortDescription": {"text": "Possibly dead Python function: scrape_kap_news"}, "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-03383cebf6f32976", "name": "Possibly dead Python function: check_spk_bulletins_job", "shortDescription": {"text": "Possibly dead Python function: check_spk_bulletins_job"}, "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-7aecdb51a78f6a10", "name": "Possibly dead Python function: check_resmi_gazete_job", "shortDescription": {"text": "Possibly dead Python function: check_resmi_gazete_job"}, "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-470ed989c6afbb65", "name": "Possibly dead Python function: check_viop_notifications", "shortDescription": {"text": "Possibly dead Python function: check_viop_notifications"}, "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-8f2d085e99ef4896", "name": "Possibly dead Python function: poll_telegram_job", "shortDescription": {"text": "Possibly dead Python function: poll_telegram_job"}, "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-055321ade3ebb55d", "name": "Possibly dead Python function: generate_missing_ipo_reports", "shortDescription": {"text": "Possibly dead Python function: generate_missing_ipo_reports"}, "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-6d6bda800aa9eef2", "name": "Possibly dead Python function: cleanup_old_kap_disclosures", "shortDescription": {"text": "Possibly dead Python function: cleanup_old_kap_disclosures"}, "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-131ed9b737af1a35", "name": "Possibly dead Python function: cleanup_expired_coupons", "shortDescription": {"text": "Possibly dead Python function: cleanup_expired_coupons"}, "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-545fcb5c368907c7", "name": "Possibly dead Python function: tweet_distribution_morning_job", "shortDescription": {"text": "Possibly dead Python function: tweet_distribution_morning_job"}, "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-f3daff6cb5b99a85", "name": "Possibly dead Python function: archive_old_ipos", "shortDescription": {"text": "Possibly dead Python function: archive_old_ipos"}, "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-7c94c17f71ecaad5", "name": "Possibly dead Python function: check_morning_tweets", "shortDescription": {"text": "Possibly dead Python function: check_morning_tweets"}, "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-100ef0bba905972e", "name": "Possibly dead Python function: check_trading_start_halkarz", "shortDescription": {"text": "Possibly dead Python function: check_trading_start_halkarz"}, "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-6258556ef4b2f5ab", "name": "Possibly dead Python function: send_last_day_warnings", "shortDescription": {"text": "Possibly dead Python function: send_last_day_warnings"}, "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-3aabf7af6eff7b34", "name": "Possibly dead Python function: tweet_spk_approval_intro_job", "shortDescription": {"text": "Possibly dead Python function: tweet_spk_approval_intro_job"}, "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-0afa486eb858097e", "name": "Possibly dead Python function: tweet_last_day_morning_job", "shortDescription": {"text": "Possibly dead Python function: tweet_last_day_morning_job"}, "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-c82f0a6efcf6feed", "name": "Possibly dead Python function: tweet_company_intro_job", "shortDescription": {"text": "Possibly dead Python function: tweet_company_intro_job"}, "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-63c4940ad4f07adf", "name": "Possibly dead Python function: tweet_spk_pending_monthly_job", "shortDescription": {"text": "Possibly dead Python function: tweet_spk_pending_monthly_job"}, "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-c35f7bdfbb49cc9e", "name": "Possibly dead Python function: push_health_report_job", "shortDescription": {"text": "Possibly dead Python function: push_health_report_job"}, "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-0f743be3f11e90b2", "name": "Possibly dead Python function: ceiling_update_retry", "shortDescription": {"text": "Possibly dead Python function: ceiling_update_retry"}, "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-fba56f52589ba9cb", "name": "Possibly dead Python function: morning_scraper_run", "shortDescription": {"text": "Possibly dead Python function: morning_scraper_run"}, "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-2436cdade0170f1b", "name": "Possibly dead Python function: send_first_trading_day_notifications", "shortDescription": {"text": "Possibly dead Python function: send_first_trading_day_notifications"}, "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-c8e948c8de911a5a", "name": "Possibly dead Python function: tweet_opening_price_job", "shortDescription": {"text": "Possibly dead Python function: tweet_opening_price_job"}, "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-dfea8293876a8613", "name": "Possibly dead Python function: update_bist50_index_job", "shortDescription": {"text": "Possibly dead Python function: update_bist50_index_job"}, "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-7785c8f46c0ac4ef", "name": "Possibly dead Python function: kap_ai_retry_job", "shortDescription": {"text": "Possibly dead Python function: kap_ai_retry_job"}, "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-f4d76df22d059a47", "name": "Possibly dead Python function: cleanup_notification_logs", "shortDescription": {"text": "Possibly dead Python function: cleanup_notification_logs"}, "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-0f63bc23e24ec86d", "name": "Possibly dead Python function: news_scanner_breaking_job", "shortDescription": {"text": "Possibly dead Python function: news_scanner_breaking_job"}, "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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f1835bac5f5197b", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-835a85c772843e20", "name": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_scraper.py:36", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_scraper.py:36"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-243ba01900b9043a", "name": "Insecure pattern 'tls_verify_false' in app/scrapers/resmi_gazete_scraper.py:80", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/resmi_gazete_scraper.py:80"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34b06668f23c776d", "name": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_ihrac_scraper.py:56", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_ihrac_scraper.py:56"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08ed7f68cbdbf48c", "name": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_bulletin_scraper.py:415", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_bulletin_scraper.py:415"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7c4bb7639e94c7b1", "name": "Insecure pattern 'tls_verify_false' in app/admin/routes.py:2182", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/admin/routes.py:2182"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-794af7fa48c130b3", "name": "Insecure pattern 'weak_hash' in app/services/mentions_reply_service.py:137", "shortDescription": {"text": "Insecure pattern 'weak_hash' in app/services/mentions_reply_service.py:137"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-386cc420d513a8d1", "name": "Insecure pattern 'tls_verify_false' in app/services/prospectus_finder.py:217", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/services/prospectus_finder.py:217"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bdc3b5c8489c5d9c", "name": "Insecure pattern 'weak_hash' in app/services/twitter_service.py:604", "shortDescription": {"text": "Insecure pattern 'weak_hash' in app/services/twitter_service.py:604"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc6961b4977d5802", "name": "Insecure pattern 'weak_hash' in app/services/twitter_reply_service.py:167", "shortDescription": {"text": "Insecure pattern 'weak_hash' in app/services/twitter_reply_service.py:167"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "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-35f727cf7c61732d", "name": "Very large file: excel_sync.py (1336 lines)", "shortDescription": {"text": "Very large file: excel_sync.py (1336 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-5fea324a3f29b29a", "name": "Very large file: app/scheduler.py (7657 lines)", "shortDescription": {"text": "Very large file: app/scheduler.py (7657 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-996349497a635d7a", "name": "Very large file: app/main.py (20384 lines)", "shortDescription": {"text": "Very large file: app/main.py (20384 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-51b3ec0f0d9da093", "name": "Very large file: app/scrapers/telegram_poller.py (2461 lines)", "shortDescription": {"text": "Very large file: app/scrapers/telegram_poller.py (2461 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-d8b71b92d1947306", "name": "Very large file: app/scrapers/halkarz_scraper.py (1371 lines)", "shortDescription": {"text": "Very large file: app/scrapers/halkarz_scraper.py (1371 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-6aa892ee51176a61", "name": "Very large file: app/scrapers/spk_bulletin_scraper.py (1146 lines)", "shortDescription": {"text": "Very large file: app/scrapers/spk_bulletin_scraper.py (1146 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-9f7a7abc06b630bb", "name": "Very large file: app/admin/routes.py (6003 lines)", "shortDescription": {"text": "Very large file: app/admin/routes.py (6003 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-4e040025deaee139", "name": "Very large file: app/services/dividend_calendar_processor.py (1367 lines)", "shortDescription": {"text": "Very large file: app/services/dividend_calendar_processor.py (1367 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-126d92aa728dba4e", "name": "Very large file: app/services/ai_ipo_analyzer.py (1280 lines)", "shortDescription": {"text": "Very large file: app/services/ai_ipo_analyzer.py (1280 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-9c76ee37bda9cabf", "name": "Very large file: app/services/ai_news_scorer.py (4504 lines)", "shortDescription": {"text": "Very large file: app/services/ai_news_scorer.py (4504 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-b44f0f23bdf5b2ad", "name": "Very large file: app/services/notification.py (2161 lines)", "shortDescription": {"text": "Very large file: app/services/notification.py (2161 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-697b9a79a57609d1", "name": "Very large file: app/services/chart_image_generator.py (3119 lines)", "shortDescription": {"text": "Very large file: app/services/chart_image_generator.py (3119 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-f3de20fff6db8765", "name": "Very large file: app/services/prospectus_analyzer.py (1833 lines)", "shortDescription": {"text": "Very large file: app/services/prospectus_analyzer.py (1833 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-13ab6089d27f11be", "name": "Very large file: app/services/twitter_service.py (4146 lines)", "shortDescription": {"text": "Very large file: app/services/twitter_service.py (4146 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-ed024fc46ac39ae9", "name": "Very large file: app/services/ai_market_report.py (2049 lines)", "shortDescription": {"text": "Very large file: app/services/ai_market_report.py (2049 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-987d612c0e34d34d", "name": "Very large file: app/services/news_scanner_service.py (1772 lines)", "shortDescription": {"text": "Very large file: app/services/news_scanner_service.py (1772 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-7d265e49e13c1e3c", "name": "Very large file: app/services/twitter_reply_service.py (1770 lines)", "shortDescription": {"text": "Very large file: app/services/twitter_reply_service.py (1770 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-86805beb1810600b", "name": "Very large file: app/services/market_close_analyzer.py (1372 lines)", "shortDescription": {"text": "Very large file: app/services/market_close_analyzer.py (1372 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "5 test file(s) for 137 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 106 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-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-f9be02510d216d22", "name": "Commented-code block (10 lines) in sync_scripts/halka_arz_sync.py:132", "shortDescription": {"text": "Commented-code block (10 lines) in sync_scripts/halka_arz_sync.py:132"}, "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-77c254f01e8b842e", "name": "Commented-code block (5 lines) in app/database.py:711", "shortDescription": {"text": "Commented-code block (5 lines) in app/database.py:711"}, "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-7394cb0fee0aab9c", "name": "Legacy-named symbol `ipo_alerts_v2` in app/scheduler.py:1374", "shortDescription": {"text": "Legacy-named symbol `ipo_alerts_v2` in app/scheduler.py:1374"}, "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-5bb3a6c59bfcdf8b", "name": "Commented-code block (5 lines) in app/scheduler.py:432", "shortDescription": {"text": "Commented-code block (5 lines) in app/scheduler.py:432"}, "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-2767f67b051e8599", "name": "Blocking `httpx.post(...)` inside `async def _generate_index_cover_image` \u2014 app/scheduler.py:3369", "shortDescription": {"text": "Blocking `httpx.post(...)` inside `async def _generate_index_cover_image` \u2014 app/scheduler.py:3369"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.post(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca0a373e14df6eea", "name": "Blocking `httpx.post(...)` inside `async def _generate_kurum_oneri_cover` \u2014 app/scheduler.py:6781", "shortDescription": {"text": "Blocking `httpx.post(...)` inside `async def _generate_kurum_oneri_cover` \u2014 app/scheduler.py:6781"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.post(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a7d76e8954de5ac", "name": "Legacy-named symbol `kap_news_v2` in app/main.py:3270", "shortDescription": {"text": "Legacy-named symbol `kap_news_v2` in app/main.py:3270"}, "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-59594ecdf60190c0", "name": "Commented-code block (7 lines) in app/main.py:156", "shortDescription": {"text": "Commented-code block (7 lines) in app/main.py:156"}, "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-8b4d11864cb6ad40", "name": "Commented-code block (6 lines) in app/scrapers/telegram_poller.py:285", "shortDescription": {"text": "Commented-code block (6 lines) in app/scrapers/telegram_poller.py:285"}, "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-2f0ff0ed0b188d07", "name": "Commented-code block (5 lines) in app/scrapers/halkarz_scraper.py:1332", "shortDescription": {"text": "Commented-code block (5 lines) in app/scrapers/halkarz_scraper.py:1332"}, "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-dc5d22245a71c5b4", "name": "Commented-code block (6 lines) in app/scrapers/halkarz_sermaye_scraper.py:45", "shortDescription": {"text": "Commented-code block (6 lines) in app/scrapers/halkarz_sermaye_scraper.py:45"}, "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-91b898d1bf81c0bc", "name": "Commented-code block (5 lines) in app/scrapers/bist_tedbir_csv_scraper.py:233", "shortDescription": {"text": "Commented-code block (5 lines) in app/scrapers/bist_tedbir_csv_scraper.py:233"}, "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-a741202c57afd5ac", "name": "Commented-code block (5 lines) in app/scrapers/kap_all_scraper.py:469", "shortDescription": {"text": "Commented-code block (5 lines) in app/scrapers/kap_all_scraper.py:469"}, "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-dcf544e9d7cb6df1", "name": "Commented-code block (5 lines) in app/utils/bist_holidays.py:91", "shortDescription": {"text": "Commented-code block (5 lines) in app/utils/bist_holidays.py:91"}, "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-b08bae65251b3c13", "name": "Legacy-named symbol `ceiling_alerts_v2` in app/admin/routes.py:1871", "shortDescription": {"text": "Legacy-named symbol `ceiling_alerts_v2` in app/admin/routes.py:1871"}, "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-73cad6489cf6a80a", "name": "Commented-code block (6 lines) in app/admin/routes.py:1264", "shortDescription": {"text": "Commented-code block (6 lines) in app/admin/routes.py:1264"}, "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-779947327dfd70be", "name": "Commented-code block (7 lines) in app/services/capital_increase_processor.py:38", "shortDescription": {"text": "Commented-code block (7 lines) in app/services/capital_increase_processor.py:38"}, "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-ea76f6cc23702689", "name": "Commented-code block (6 lines) in app/services/dividend_calendar_processor.py:124", "shortDescription": {"text": "Commented-code block (6 lines) in app/services/dividend_calendar_processor.py:124"}, "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-7d8c20e8726b3d36", "name": "Commented-code block (6 lines) in app/services/dividend_weekly_calendar.py:655", "shortDescription": {"text": "Commented-code block (6 lines) in app/services/dividend_weekly_calendar.py:655"}, "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-abf4b358be5ab47a", "name": "Commented-code block (10 lines) in app/services/bilanco_kap_scraper.py:289", "shortDescription": {"text": "Commented-code block (10 lines) in app/services/bilanco_kap_scraper.py:289"}, "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-f813801a7334865d", "name": "Legacy-named symbol `default_v2` in app/services/broadcast.py:294", "shortDescription": {"text": "Legacy-named symbol `default_v2` in app/services/broadcast.py:294"}, "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-4d86acdb3d088cdb", "name": "Commented-code block (5 lines) in app/services/ipo_service.py:522", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/ipo_service.py:522"}, "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-28fa023916a57188", "name": "Commented-code block (5 lines) in app/services/kap_pay_alim_satim_fetcher.py:166", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/kap_pay_alim_satim_fetcher.py:166"}, "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-630d6bf1ec7133ba", "name": "Commented-code block (7 lines) in app/services/bilanco_pipeline.py:34", "shortDescription": {"text": "Commented-code block (7 lines) in app/services/bilanco_pipeline.py:34"}, "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-edc91d849c40ec63", "name": "Commented-code block (5 lines) in app/services/kap_category_processors.py:265", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/kap_category_processors.py:265"}, "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-9c120d313ee318b0", "name": "Commented-code block (6 lines) in app/services/kap_all_analyzer.py:420", "shortDescription": {"text": "Commented-code block (6 lines) in app/services/kap_all_analyzer.py:420"}, "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-2ea431f32f55e7b0", "name": "Commented-code block (5 lines) in app/services/ai_bilanco_analyzer.py:286", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/ai_bilanco_analyzer.py:286"}, "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-16c3edfedd94c7e8", "name": "Commented-code block (5 lines) in app/services/ai_news_scorer.py:50", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/ai_news_scorer.py:50"}, "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-28aee807dddc18e1", "name": "Commented-code block (6 lines) in app/services/capital_increase_weekly.py:47", "shortDescription": {"text": "Commented-code block (6 lines) in app/services/capital_increase_weekly.py:47"}, "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-2346700b9afd4635", "name": "Legacy-named symbol `default_v2` in app/services/notification.py:126", "shortDescription": {"text": "Legacy-named symbol `default_v2` in app/services/notification.py:126"}, "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-a1e8313b8a5285f5", "name": "Commented-code block (5 lines) in app/services/notification.py:189", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/notification.py:189"}, "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-5aa7ac5df2430579", "name": "Commented-code block (5 lines) in app/services/chart_image_generator.py:1532", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/chart_image_generator.py:1532"}, "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-6bff9102192cd1e9", "name": "Commented-code block (8 lines) in app/services/share_transaction_kap_processor.py:223", "shortDescription": {"text": "Commented-code block (8 lines) in app/services/share_transaction_kap_processor.py:223"}, "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-f31cd99fc1c13226", "name": "Commented-code block (5 lines) in app/services/twitter_service.py:348", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/twitter_service.py:348"}, "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-68189a66a385db45", "name": "Legacy-named symbol `skipped_old` in app/services/news_scanner_service.py:415", "shortDescription": {"text": "Legacy-named symbol `skipped_old` in app/services/news_scanner_service.py:415"}, "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-527334a9e9af3417", "name": "Commented-code block (7 lines) in app/services/twitter_reply_service.py:59", "shortDescription": {"text": "Commented-code block (7 lines) in app/services/twitter_reply_service.py:59"}, "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-cc15d9f8e5df93f1", "name": "Commented-code block (5 lines) in app/services/market_close_analyzer.py:27", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/market_close_analyzer.py:27"}, "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-cc0f9d8e41b33b0e", "name": "11 env vars used in code but missing from .env.example", "shortDescription": {"text": "11 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_TELEGRAM_BOT_TOKEN`, `ADMIN_TELEGRAM_CHAT_ID`, `ANTHROPIC_API_KEY`, `API_URL`, `BIST_ADMIN_PW`, `BIST_API_URL`, `CLOUDINARY_URL`, `FB_PAGE_ACCESS_TOKEN` + 3 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:\nexcel_sync.py:read_matriks_excel_live, excel_sync.py:read_matriks_excel\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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/main.py:clean_text, app/main.py:clean_text, app/main.py:clean_text\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/services/capital_increase_processor.py:process_kap_disclosure, app/services/dividend_calendar_processor.py:process_kap_disclosure, app/services/business_deal_processor.py:process_kap_disclosure, app/services/dividend_payment_processor.py:process_kap_disclosure\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-bb3563c7bdb084be", "name": "Unused endpoint: POST /api/v1/client-error", "shortDescription": {"text": "Unused endpoint: POST /api/v1/client-error"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/client-error` 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-3e90c0dd3e70898c", "name": "Unused endpoint: GET /api/v1/public/news-feed", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/news-feed"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/news-feed` 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-50de5461c1ea1fa8", "name": "Unused endpoint: GET /api/v1/public/daily-market-stats", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/daily-market-stats"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/daily-market-stats` 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-6c9d10b417b1768c", "name": "Unused endpoint: GET /api/v1/public/stock-price/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/stock-price/{ticker}"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/stock-price/{ticker}` 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-03760baa97594605", "name": "Unused endpoint: GET /api/v1/public/stock-prices", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/stock-prices"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/stock-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-4daa7313debee22d", "name": "Unused endpoint: GET /api/v1/public/viop-night-session", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/viop-night-session"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/viop-night-session` 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-97c7ca7621f6d756", "name": "Unused endpoint: GET /api/v1/public/spk-bulletin-analyses", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/spk-bulletin-analyses"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/spk-bulletin-analyses` 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-ad552567560fc462", "name": "Unused endpoint: POST /api/v1/admin/verify", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/verify"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/verify` 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-494bafc8ccee8c65", "name": "Unused endpoint: POST /api/v1/admin/service-status", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/service-status"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/service-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-0f46e643a0c43e0d", "name": "Unused endpoint: POST /api/v1/admin/toggle-kill-switch", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/toggle-kill-switch"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/toggle-kill-switch` 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-be2b08ed4bbf2f80", "name": "Unused endpoint: POST /api/v1/admin/test-gemini", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/test-gemini"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/test-gemini` 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-f3e78803e4a2aa7f", "name": "Unused endpoint: GET /api/v1/ipos", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos` 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-757e0648dd01e4ab", "name": "Unused endpoint: GET /api/v1/ipos/upcoming", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/upcoming"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/upcoming` 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-1e2bac8d7fdbf6b7", "name": "Unused endpoint: GET /api/v1/ipos/sections", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/sections"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/sections` 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-6a1cf8c9eb80ac1b", "name": "Unused endpoint: GET /api/v1/ipos/spk-applications", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/spk-applications"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/spk-applications` 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-3ba5171fb28cd08e", "name": "Unused endpoint: GET /api/v1/public/blogs", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/blogs"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/blogs` 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-797506f329c1fc34", "name": "Unused endpoint: GET /api/v1/public/system-announcements", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/system-announcements"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/system-announcements` 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-348c23b0ae15d348", "name": "Unused endpoint: GET /api/v1/public/blogs/{slug}", "shortDescription": {"text": "Unused endpoint: GET /api/v1/public/blogs/{slug}"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/public/blogs/{slug}` 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-80ff3e93b73ed730", "name": "Unused endpoint: POST /api/v1/admin/generate-blog", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/generate-blog"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/generate-blog` 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-e7b583d201f71c92", "name": "Unused endpoint: POST /api/v1/admin/update-bulletin-text", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/update-bulletin-text"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/update-bulletin-text` 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-8abc285b1ef04a00", "name": "Unused endpoint: POST /api/v1/admin/cleanup-spk-names", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/cleanup-spk-names"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/cleanup-spk-names` 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-5aff03372d6be0e4", "name": "Unused endpoint: POST /api/v1/admin/generate-spk-descriptions", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/generate-spk-descriptions"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/generate-spk-descriptions` 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-1677bcd0ae894e37", "name": "Unused endpoint: GET /api/v1/ipos/archived", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/archived"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/archived` 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-2f33913918e5576c", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_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-61190c5b5c660dbd", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-analysis", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-analysis"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_id}/prospectus-analysis` 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-53b2ae51b0751c58", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-image", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-image"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_id}/prospectus-image` 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-1a182acd01d0a8be", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-phase", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-phase"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_id}/poll-phase` 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-020a0f9ba9b857c3", "name": "Unused endpoint: POST /api/v1/ipos/{ipo_id}/poll-vote", "shortDescription": {"text": "Unused endpoint: POST /api/v1/ipos/{ipo_id}/poll-vote"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/ipos/{ipo_id}/poll-vote` 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-cd4e57f620bf2813", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-stats", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-stats"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_id}/poll-stats` 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-53cb58c934dc92b9", "name": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-my-vote", "shortDescription": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-my-vote"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/ipos/{ipo_id}/poll-my-vote` 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-2369a6ff56448b85", "name": "Unused endpoint: GET /api/v1/telegram-news", "shortDescription": {"text": "Unused endpoint: GET /api/v1/telegram-news"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/telegram-news` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dae6e47136147007", "name": "Unused endpoint: GET /api/v1/telegram-news/locked-teasers", "shortDescription": {"text": "Unused endpoint: GET /api/v1/telegram-news/locked-teasers"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/telegram-news/locked-teasers` 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-7632adb63e463b1d", "name": "Unused endpoint: POST /api/v1/telegram-news/test-send", "shortDescription": {"text": "Unused endpoint: POST /api/v1/telegram-news/test-send"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/telegram-news/test-send` 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-640e22c97643b136", "name": "Unused endpoint: GET /api/v1/news", "shortDescription": {"text": "Unused endpoint: GET /api/v1/news"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/news` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b841431c695c3c65", "name": "Unused endpoint: GET /api/v1/news/latest", "shortDescription": {"text": "Unused endpoint: GET /api/v1/news/latest"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/news/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}}, {"id": "scanner-b20adc1fc7cb47d5", "name": "Unused endpoint: GET /api/v1/notification-tiers", "shortDescription": {"text": "Unused endpoint: GET /api/v1/notification-tiers"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/notification-tiers` 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-b915af63f402b78f", "name": "Unused endpoint: GET /api/v1/news-tiers", "shortDescription": {"text": "Unused endpoint: GET /api/v1/news-tiers"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/news-tiers` 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-d29a22d2bde522ac", "name": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications", "shortDescription": {"text": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/users/{device_id}/stock-notifications` 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-667710496fa83e84", "name": "Unused endpoint: GET /api/v1/users/{device_id}/stock-notifications", "shortDescription": {"text": "Unused endpoint: GET /api/v1/users/{device_id}/stock-notifications"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/users/{device_id}/stock-notifications` 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-11ac1fc3a22cc0f1", "name": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/deactivate-all", "shortDescription": {"text": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/deactivate-all"}, "fullDescription": {"text": "`app/main.py` declares `PATCH /api/v1/users/{device_id}/stock-notifications/deactivate-all` 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-402f1b4673c0f297", "name": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications/sync", "shortDescription": {"text": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications/sync"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/users/{device_id}/stock-notifications/sync` 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-0eb57ba1e0cbaec6", "name": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/{sub_id}/mute", "shortDescription": {"text": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/{sub_id}/mute"}, "fullDescription": {"text": "`app/main.py` declares `PATCH /api/v1/users/{device_id}/stock-notifications/{sub_id}/mute` 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-597882382501ebba", "name": "Unused endpoint: POST /api/v1/users/register", "shortDescription": {"text": "Unused endpoint: POST /api/v1/users/register"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/users/register` 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-a0ea56e04ac99f7f", "name": "Unused endpoint: GET /api/v1/users/{device_id}", "shortDescription": {"text": "Unused endpoint: GET /api/v1/users/{device_id}"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/users/{device_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-83e131c6549d0315", "name": "Unused endpoint: PUT /api/v1/users/{device_id}", "shortDescription": {"text": "Unused endpoint: PUT /api/v1/users/{device_id}"}, "fullDescription": {"text": "`app/main.py` declares `PUT /api/v1/users/{device_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-b4330a6e6c3548c1", "name": "Unused endpoint: DELETE /api/v1/users/{device_id}", "shortDescription": {"text": "Unused endpoint: DELETE /api/v1/users/{device_id}"}, "fullDescription": {"text": "`app/main.py` declares `DELETE /api/v1/users/{device_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-f1ae0596fe3c1527", "name": "Unused endpoint: PUT /api/v1/users/{device_id}/reminder-settings", "shortDescription": {"text": "Unused endpoint: PUT /api/v1/users/{device_id}/reminder-settings"}, "fullDescription": {"text": "`app/main.py` declares `PUT /api/v1/users/{device_id}/reminder-settings` 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-ab8f315b1e103cda", "name": "Unused endpoint: GET /api/v1/users/{device_id}/subscription", "shortDescription": {"text": "Unused endpoint: GET /api/v1/users/{device_id}/subscription"}, "fullDescription": {"text": "`app/main.py` declares `GET /api/v1/users/{device_id}/subscription` 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-808f4796d7ada784", "name": "Unused endpoint: POST /api/v1/admin/activate-news-subscription/{device_id}", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/activate-news-subscription/{device_id}"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/activate-news-subscription/{device_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-4261b2b058142ceb", "name": "Unused endpoint: POST /api/v1/admin/deactivate-stock-notification/{sub_id}", "shortDescription": {"text": "Unused endpoint: POST /api/v1/admin/deactivate-stock-notification/{sub_id}"}, "fullDescription": {"text": "`app/main.py` declares `POST /api/v1/admin/deactivate-stock-notification/{sub_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}}]}}, "automationDetails": {"id": "repobility/19207"}, "properties": {"repository": "selimzenger-source/sz-bist-finans-backend", "repoUrl": "https://github.com/selimzenger-source/sz-bist-finans-backend", "branch": "main"}, "results": [{"ruleId": "scanner-2cdd02dfc396199e", "level": "note", "message": {"text": "Possibly dead Python function: scrape_kap_ipo"}, "properties": {"repobilityId": "dbcdb223f50a9b2a", "scanner": "scanner-primary", "fingerprint": "2cdd02dfc396199e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:211"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a4b1be0712829283", "level": "note", "message": {"text": "Possibly dead Python function: scrape_kap_news"}, "properties": {"repobilityId": "aa11a55eb828805f", "scanner": "scanner-primary", "fingerprint": "a4b1be0712829283", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:268"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03383cebf6f32976", "level": "note", "message": {"text": "Possibly dead Python function: check_spk_bulletins_job"}, "properties": {"repobilityId": "73bee36cb504d465", "scanner": "scanner-primary", "fingerprint": "03383cebf6f32976", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:541"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7aecdb51a78f6a10", "level": "note", "message": {"text": "Possibly dead Python function: check_resmi_gazete_job"}, "properties": {"repobilityId": "450fbb173de258f8", "scanner": "scanner-primary", "fingerprint": "7aecdb51a78f6a10", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:555"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-470ed989c6afbb65", "level": "note", "message": {"text": "Possibly dead Python function: check_viop_notifications"}, "properties": {"repobilityId": "51d5652f310df30d", "scanner": "scanner-primary", "fingerprint": "470ed989c6afbb65", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:598"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f2d085e99ef4896", "level": "note", "message": {"text": "Possibly dead Python function: poll_telegram_job"}, "properties": {"repobilityId": "bfd85350b758f12a", "scanner": "scanner-primary", "fingerprint": "8f2d085e99ef4896", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:757"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-055321ade3ebb55d", "level": "note", "message": {"text": "Possibly dead Python function: generate_missing_ipo_reports"}, "properties": {"repobilityId": "3b78f517fc1c5368", "scanner": "scanner-primary", "fingerprint": "055321ade3ebb55d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:803"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d6bda800aa9eef2", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_old_kap_disclosures"}, "properties": {"repobilityId": "85eb1ade13f2908d", "scanner": "scanner-primary", "fingerprint": "6d6bda800aa9eef2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:862"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-131ed9b737af1a35", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_expired_coupons"}, "properties": {"repobilityId": "d53f84fc7aeb944f", "scanner": "scanner-primary", "fingerprint": "131ed9b737af1a35", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:891"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-545fcb5c368907c7", "level": "note", "message": {"text": "Possibly dead Python function: tweet_distribution_morning_job"}, "properties": {"repobilityId": "4b018a4b834a40f1", "scanner": "scanner-primary", "fingerprint": "545fcb5c368907c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:913"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f3daff6cb5b99a85", "level": "note", "message": {"text": "Possibly dead Python function: archive_old_ipos"}, "properties": {"repobilityId": "e0203c5c098e0515", "scanner": "scanner-primary", "fingerprint": "f3daff6cb5b99a85", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:970"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c94c17f71ecaad5", "level": "note", "message": {"text": "Possibly dead Python function: check_morning_tweets"}, "properties": {"repobilityId": "847a3e3ed8adb83b", "scanner": "scanner-primary", "fingerprint": "7c94c17f71ecaad5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:1497"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-100ef0bba905972e", "level": "note", "message": {"text": "Possibly dead Python function: check_trading_start_halkarz"}, "properties": {"repobilityId": "ac4f127a7e5bfe13", "scanner": "scanner-primary", "fingerprint": "100ef0bba905972e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:1844"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6258556ef4b2f5ab", "level": "note", "message": {"text": "Possibly dead Python function: send_last_day_warnings"}, "properties": {"repobilityId": "70ccb28cb801ed3c", "scanner": "scanner-primary", "fingerprint": "6258556ef4b2f5ab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:1959"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3aabf7af6eff7b34", "level": "note", "message": {"text": "Possibly dead Python function: tweet_spk_approval_intro_job"}, "properties": {"repobilityId": "0522b8cad64c4f71", "scanner": "scanner-primary", "fingerprint": "3aabf7af6eff7b34", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2023"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0afa486eb858097e", "level": "note", "message": {"text": "Possibly dead Python function: tweet_last_day_morning_job"}, "properties": {"repobilityId": "114ded428582a9ef", "scanner": "scanner-primary", "fingerprint": "0afa486eb858097e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2103"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c82f0a6efcf6feed", "level": "note", "message": {"text": "Possibly dead Python function: tweet_company_intro_job"}, "properties": {"repobilityId": "fbe5a76d9cc7a174", "scanner": "scanner-primary", "fingerprint": "c82f0a6efcf6feed", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2142"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-63c4940ad4f07adf", "level": "note", "message": {"text": "Possibly dead Python function: tweet_spk_pending_monthly_job"}, "properties": {"repobilityId": "670282f00a9e0661", "scanner": "scanner-primary", "fingerprint": "63c4940ad4f07adf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2194"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c35f7bdfbb49cc9e", "level": "note", "message": {"text": "Possibly dead Python function: push_health_report_job"}, "properties": {"repobilityId": "ccc25077f9f73ce2", "scanner": "scanner-primary", "fingerprint": "c35f7bdfbb49cc9e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2237"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f743be3f11e90b2", "level": "note", "message": {"text": "Possibly dead Python function: ceiling_update_retry"}, "properties": {"repobilityId": "4564c7bc6be32b10", "scanner": "scanner-primary", "fingerprint": "0f743be3f11e90b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:2980"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fba56f52589ba9cb", "level": "note", "message": {"text": "Possibly dead Python function: morning_scraper_run"}, "properties": {"repobilityId": "b583e44a85b8c771", "scanner": "scanner-primary", "fingerprint": "fba56f52589ba9cb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:3018"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2436cdade0170f1b", "level": "note", "message": {"text": "Possibly dead Python function: send_first_trading_day_notifications"}, "properties": {"repobilityId": "6454c9340056c7c3", "scanner": "scanner-primary", "fingerprint": "2436cdade0170f1b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:3066"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c8e948c8de911a5a", "level": "note", "message": {"text": "Possibly dead Python function: tweet_opening_price_job"}, "properties": {"repobilityId": "91a5cda59da94e03", "scanner": "scanner-primary", "fingerprint": "c8e948c8de911a5a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:3137"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dfea8293876a8613", "level": "note", "message": {"text": "Possibly dead Python function: update_bist50_index_job"}, "properties": {"repobilityId": "5f0e24fe775e8c1d", "scanner": "scanner-primary", "fingerprint": "dfea8293876a8613", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:3574"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7785c8f46c0ac4ef", "level": "note", "message": {"text": "Possibly dead Python function: kap_ai_retry_job"}, "properties": {"repobilityId": "a00a1c032da61945", "scanner": "scanner-primary", "fingerprint": "7785c8f46c0ac4ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:3599"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f4d76df22d059a47", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_notification_logs"}, "properties": {"repobilityId": "8f21760cb6e781b6", "scanner": "scanner-primary", "fingerprint": "f4d76df22d059a47", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:4394"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f63bc23e24ec86d", "level": "note", "message": {"text": "Possibly dead Python function: news_scanner_breaking_job"}, "properties": {"repobilityId": "c1b7019787978280", "scanner": "scanner-primary", "fingerprint": "0f63bc23e24ec86d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py:6727"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-3f1835bac5f5197b", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim"}, "properties": {"repobilityId": "a7241f2d0eae7c36", "scanner": "scanner-primary", "fingerprint": "3f1835bac5f5197b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"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-835a85c772843e20", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_scraper.py:36"}, "properties": {"repobilityId": "acb763757f6f257c", "scanner": "scanner-primary", "fingerprint": "835a85c772843e20", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scrapers/spk_scraper.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-243ba01900b9043a", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/resmi_gazete_scraper.py:80"}, "properties": {"repobilityId": "491d157250e936da", "scanner": "scanner-primary", "fingerprint": "243ba01900b9043a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scrapers/resmi_gazete_scraper.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-34b06668f23c776d", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_ihrac_scraper.py:56"}, "properties": {"repobilityId": "f03a856e832dc489", "scanner": "scanner-primary", "fingerprint": "34b06668f23c776d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scrapers/spk_ihrac_scraper.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-08ed7f68cbdbf48c", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/scrapers/spk_bulletin_scraper.py:415"}, "properties": {"repobilityId": "62ffbdebc33d6eba", "scanner": "scanner-primary", "fingerprint": "08ed7f68cbdbf48c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scrapers/spk_bulletin_scraper.py"}, "region": {"startLine": 415}}}]}, {"ruleId": "scanner-7c4bb7639e94c7b1", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/admin/routes.py:2182"}, "properties": {"repobilityId": "fed106c017dc73f8", "scanner": "scanner-primary", "fingerprint": "7c4bb7639e94c7b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/admin/routes.py"}, "region": {"startLine": 2182}}}]}, {"ruleId": "scanner-794af7fa48c130b3", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in app/services/mentions_reply_service.py:137"}, "properties": {"repobilityId": "223455d310854e43", "scanner": "scanner-primary", "fingerprint": "794af7fa48c130b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/mentions_reply_service.py"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-386cc420d513a8d1", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/services/prospectus_finder.py:217"}, "properties": {"repobilityId": "7fcc7fdfd5e4f625", "scanner": "scanner-primary", "fingerprint": "386cc420d513a8d1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/prospectus_finder.py"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-bdc3b5c8489c5d9c", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in app/services/twitter_service.py:604"}, "properties": {"repobilityId": "2ac211d0f7c988ee", "scanner": "scanner-primary", "fingerprint": "bdc3b5c8489c5d9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/twitter_service.py"}, "region": {"startLine": 604}}}]}, {"ruleId": "scanner-bc6961b4977d5802", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in app/services/twitter_reply_service.py:167"}, "properties": {"repobilityId": "2838393b701a80ac", "scanner": "scanner-primary", "fingerprint": "bc6961b4977d5802", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/twitter_reply_service.py"}, "region": {"startLine": 167}}}]}, {"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-35f727cf7c61732d", "level": "note", "message": {"text": "Very large file: excel_sync.py (1336 lines)"}, "properties": {"repobilityId": "67e333a345351259", "scanner": "scanner-primary", "fingerprint": "35f727cf7c61732d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5fea324a3f29b29a", "level": "note", "message": {"text": "Very large file: app/scheduler.py (7657 lines)"}, "properties": {"repobilityId": "bd0e7d959f89c4e5", "scanner": "scanner-primary", "fingerprint": "5fea324a3f29b29a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-996349497a635d7a", "level": "note", "message": {"text": "Very large file: app/main.py (20384 lines)"}, "properties": {"repobilityId": "566b37e8922cbe53", "scanner": "scanner-primary", "fingerprint": "996349497a635d7a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-51b3ec0f0d9da093", "level": "note", "message": {"text": "Very large file: app/scrapers/telegram_poller.py (2461 lines)"}, "properties": {"repobilityId": "b06bbe26bc8b0d2c", "scanner": "scanner-primary", "fingerprint": "51b3ec0f0d9da093", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d8b71b92d1947306", "level": "note", "message": {"text": "Very large file: app/scrapers/halkarz_scraper.py (1371 lines)"}, "properties": {"repobilityId": "6189a9d2b06d1c5b", "scanner": "scanner-primary", "fingerprint": "d8b71b92d1947306", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6aa892ee51176a61", "level": "note", "message": {"text": "Very large file: app/scrapers/spk_bulletin_scraper.py (1146 lines)"}, "properties": {"repobilityId": "193334d8a70405cf", "scanner": "scanner-primary", "fingerprint": "6aa892ee51176a61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f7a7abc06b630bb", "level": "note", "message": {"text": "Very large file: app/admin/routes.py (6003 lines)"}, "properties": {"repobilityId": "48be3276450f70fe", "scanner": "scanner-primary", "fingerprint": "9f7a7abc06b630bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4e040025deaee139", "level": "note", "message": {"text": "Very large file: app/services/dividend_calendar_processor.py (1367 lines)"}, "properties": {"repobilityId": "e4d443c18b0cbe30", "scanner": "scanner-primary", "fingerprint": "4e040025deaee139", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-126d92aa728dba4e", "level": "note", "message": {"text": "Very large file: app/services/ai_ipo_analyzer.py (1280 lines)"}, "properties": {"repobilityId": "e19a570f9323f912", "scanner": "scanner-primary", "fingerprint": "126d92aa728dba4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9c76ee37bda9cabf", "level": "note", "message": {"text": "Very large file: app/services/ai_news_scorer.py (4504 lines)"}, "properties": {"repobilityId": "ac625691361316f5", "scanner": "scanner-primary", "fingerprint": "9c76ee37bda9cabf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b44f0f23bdf5b2ad", "level": "note", "message": {"text": "Very large file: app/services/notification.py (2161 lines)"}, "properties": {"repobilityId": "4be20afdad02acb2", "scanner": "scanner-primary", "fingerprint": "b44f0f23bdf5b2ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-697b9a79a57609d1", "level": "note", "message": {"text": "Very large file: app/services/chart_image_generator.py (3119 lines)"}, "properties": {"repobilityId": "5e7f65200e194e80", "scanner": "scanner-primary", "fingerprint": "697b9a79a57609d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f3de20fff6db8765", "level": "note", "message": {"text": "Very large file: app/services/prospectus_analyzer.py (1833 lines)"}, "properties": {"repobilityId": "19fdfbdbb233aa0b", "scanner": "scanner-primary", "fingerprint": "f3de20fff6db8765", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-13ab6089d27f11be", "level": "note", "message": {"text": "Very large file: app/services/twitter_service.py (4146 lines)"}, "properties": {"repobilityId": "a4239ac5e29a74dd", "scanner": "scanner-primary", "fingerprint": "13ab6089d27f11be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ed024fc46ac39ae9", "level": "note", "message": {"text": "Very large file: app/services/ai_market_report.py (2049 lines)"}, "properties": {"repobilityId": "eae23f7f4b6fcbe9", "scanner": "scanner-primary", "fingerprint": "ed024fc46ac39ae9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-987d612c0e34d34d", "level": "note", "message": {"text": "Very large file: app/services/news_scanner_service.py (1772 lines)"}, "properties": {"repobilityId": "aa8a7dbc08bb37c9", "scanner": "scanner-primary", "fingerprint": "987d612c0e34d34d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7d265e49e13c1e3c", "level": "note", "message": {"text": "Very large file: app/services/twitter_reply_service.py (1770 lines)"}, "properties": {"repobilityId": "b9fa308ebdc59c27", "scanner": "scanner-primary", "fingerprint": "7d265e49e13c1e3c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86805beb1810600b", "level": "note", "message": {"text": "Very large file: app/services/market_close_analyzer.py (1372 lines)"}, "properties": {"repobilityId": "f265634f07f7a13a", "scanner": "scanner-primary", "fingerprint": "86805beb1810600b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e3739ee2e2a6f0ab", "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": "692fbe9312d7c62f", "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": "9f0a4b0908f2a4fe", "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": "13ec3f4f391bb238", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "af2098260e902164", "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": "071fb1b7fcc3c1f8", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f9be02510d216d22", "level": "none", "message": {"text": "Commented-code block (10 lines) in sync_scripts/halka_arz_sync.py:132"}, "properties": {"repobilityId": "787cae4938885a74", "scanner": "scanner-primary", "fingerprint": "f9be02510d216d22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77c254f01e8b842e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/database.py:711"}, "properties": {"repobilityId": "a25c5fd254e07f75", "scanner": "scanner-primary", "fingerprint": "77c254f01e8b842e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7394cb0fee0aab9c", "level": "note", "message": {"text": "Legacy-named symbol `ipo_alerts_v2` in app/scheduler.py:1374"}, "properties": {"repobilityId": "7aa3a81409a6817d", "scanner": "scanner-primary", "fingerprint": "7394cb0fee0aab9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5bb3a6c59bfcdf8b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/scheduler.py:432"}, "properties": {"repobilityId": "47f78b6a2a6dae0a", "scanner": "scanner-primary", "fingerprint": "5bb3a6c59bfcdf8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2767f67b051e8599", "level": "error", "message": {"text": "Blocking `httpx.post(...)` inside `async def _generate_index_cover_image` \u2014 app/scheduler.py:3369"}, "properties": {"repobilityId": "76c35e91da1b1885", "scanner": "scanner-primary", "fingerprint": "2767f67b051e8599", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py"}, "region": {"startLine": 3369}}}]}, {"ruleId": "scanner-ca0a373e14df6eea", "level": "error", "message": {"text": "Blocking `httpx.post(...)` inside `async def _generate_kurum_oneri_cover` \u2014 app/scheduler.py:6781"}, "properties": {"repobilityId": "67d725b00e016118", "scanner": "scanner-primary", "fingerprint": "ca0a373e14df6eea", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/scheduler.py"}, "region": {"startLine": 6781}}}]}, {"ruleId": "scanner-3a7d76e8954de5ac", "level": "note", "message": {"text": "Legacy-named symbol `kap_news_v2` in app/main.py:3270"}, "properties": {"repobilityId": "310ce73c4aed7c1f", "scanner": "scanner-primary", "fingerprint": "3a7d76e8954de5ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-59594ecdf60190c0", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/main.py:156"}, "properties": {"repobilityId": "9818bf2eb819de12", "scanner": "scanner-primary", "fingerprint": "59594ecdf60190c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b4d11864cb6ad40", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/scrapers/telegram_poller.py:285"}, "properties": {"repobilityId": "8e357fa19780d5c4", "scanner": "scanner-primary", "fingerprint": "8b4d11864cb6ad40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f0ff0ed0b188d07", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/scrapers/halkarz_scraper.py:1332"}, "properties": {"repobilityId": "23a57bae8e01603a", "scanner": "scanner-primary", "fingerprint": "2f0ff0ed0b188d07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc5d22245a71c5b4", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/scrapers/halkarz_sermaye_scraper.py:45"}, "properties": {"repobilityId": "fb03b18c11fceb5e", "scanner": "scanner-primary", "fingerprint": "dc5d22245a71c5b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91b898d1bf81c0bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/scrapers/bist_tedbir_csv_scraper.py:233"}, "properties": {"repobilityId": "ab27fc9152baef0b", "scanner": "scanner-primary", "fingerprint": "91b898d1bf81c0bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a741202c57afd5ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/scrapers/kap_all_scraper.py:469"}, "properties": {"repobilityId": "13033f532f579da6", "scanner": "scanner-primary", "fingerprint": "a741202c57afd5ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcf544e9d7cb6df1", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/utils/bist_holidays.py:91"}, "properties": {"repobilityId": "8bbf1391d1bf8b23", "scanner": "scanner-primary", "fingerprint": "dcf544e9d7cb6df1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b08bae65251b3c13", "level": "note", "message": {"text": "Legacy-named symbol `ceiling_alerts_v2` in app/admin/routes.py:1871"}, "properties": {"repobilityId": "807306d7df748239", "scanner": "scanner-primary", "fingerprint": "b08bae65251b3c13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-73cad6489cf6a80a", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/admin/routes.py:1264"}, "properties": {"repobilityId": "d4bc432766f9d8dd", "scanner": "scanner-primary", "fingerprint": "73cad6489cf6a80a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-779947327dfd70be", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/services/capital_increase_processor.py:38"}, "properties": {"repobilityId": "7ce594817032056f", "scanner": "scanner-primary", "fingerprint": "779947327dfd70be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea76f6cc23702689", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/services/dividend_calendar_processor.py:124"}, "properties": {"repobilityId": "b99f8b04558eaf5d", "scanner": "scanner-primary", "fingerprint": "ea76f6cc23702689", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d8c20e8726b3d36", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/services/dividend_weekly_calendar.py:655"}, "properties": {"repobilityId": "3844b4994e54c309", "scanner": "scanner-primary", "fingerprint": "7d8c20e8726b3d36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abf4b358be5ab47a", "level": "none", "message": {"text": "Commented-code block (10 lines) in app/services/bilanco_kap_scraper.py:289"}, "properties": {"repobilityId": "631f50d97f428aca", "scanner": "scanner-primary", "fingerprint": "abf4b358be5ab47a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f813801a7334865d", "level": "note", "message": {"text": "Legacy-named symbol `default_v2` in app/services/broadcast.py:294"}, "properties": {"repobilityId": "d7ac7b8ffae2a8fb", "scanner": "scanner-primary", "fingerprint": "f813801a7334865d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4d86acdb3d088cdb", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/ipo_service.py:522"}, "properties": {"repobilityId": "3f0b20a1cac91f60", "scanner": "scanner-primary", "fingerprint": "4d86acdb3d088cdb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28fa023916a57188", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/kap_pay_alim_satim_fetcher.py:166"}, "properties": {"repobilityId": "758474fda30d650e", "scanner": "scanner-primary", "fingerprint": "28fa023916a57188", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-630d6bf1ec7133ba", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/services/bilanco_pipeline.py:34"}, "properties": {"repobilityId": "ad30bff3e60032de", "scanner": "scanner-primary", "fingerprint": "630d6bf1ec7133ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edc91d849c40ec63", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/kap_category_processors.py:265"}, "properties": {"repobilityId": "6310766d8cc1689e", "scanner": "scanner-primary", "fingerprint": "edc91d849c40ec63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c120d313ee318b0", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/services/kap_all_analyzer.py:420"}, "properties": {"repobilityId": "43cc1ad38370a8dc", "scanner": "scanner-primary", "fingerprint": "9c120d313ee318b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ea431f32f55e7b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/ai_bilanco_analyzer.py:286"}, "properties": {"repobilityId": "5d0e04b994f7b9a6", "scanner": "scanner-primary", "fingerprint": "2ea431f32f55e7b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16c3edfedd94c7e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/ai_news_scorer.py:50"}, "properties": {"repobilityId": "ae5cf0d87a9b1cc3", "scanner": "scanner-primary", "fingerprint": "16c3edfedd94c7e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28aee807dddc18e1", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/services/capital_increase_weekly.py:47"}, "properties": {"repobilityId": "de91f3b7903358d6", "scanner": "scanner-primary", "fingerprint": "28aee807dddc18e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2346700b9afd4635", "level": "note", "message": {"text": "Legacy-named symbol `default_v2` in app/services/notification.py:126"}, "properties": {"repobilityId": "4679c8d9e2f355a7", "scanner": "scanner-primary", "fingerprint": "2346700b9afd4635", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a1e8313b8a5285f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/notification.py:189"}, "properties": {"repobilityId": "5eeb51671621cd5a", "scanner": "scanner-primary", "fingerprint": "a1e8313b8a5285f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5aa7ac5df2430579", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/chart_image_generator.py:1532"}, "properties": {"repobilityId": "3fbe5fd6d4c9d208", "scanner": "scanner-primary", "fingerprint": "5aa7ac5df2430579", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bff9102192cd1e9", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/services/share_transaction_kap_processor.py:223"}, "properties": {"repobilityId": "f5a6956a83a871b2", "scanner": "scanner-primary", "fingerprint": "6bff9102192cd1e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f31cd99fc1c13226", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/twitter_service.py:348"}, "properties": {"repobilityId": "f84eb8c9bf62289a", "scanner": "scanner-primary", "fingerprint": "f31cd99fc1c13226", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68189a66a385db45", "level": "note", "message": {"text": "Legacy-named symbol `skipped_old` in app/services/news_scanner_service.py:415"}, "properties": {"repobilityId": "877a4665689d0498", "scanner": "scanner-primary", "fingerprint": "68189a66a385db45", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-527334a9e9af3417", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/services/twitter_reply_service.py:59"}, "properties": {"repobilityId": "145dc5f81ed97a6d", "scanner": "scanner-primary", "fingerprint": "527334a9e9af3417", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc15d9f8e5df93f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/market_close_analyzer.py:27"}, "properties": {"repobilityId": "e409ce0f35257792", "scanner": "scanner-primary", "fingerprint": "cc15d9f8e5df93f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc0f9d8e41b33b0e", "level": "note", "message": {"text": "11 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "c82cd8cd626c3599", "scanner": "scanner-primary", "fingerprint": "cc0f9d8e41b33b0e", "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": "94bf6798beb87b3f", "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": "8ef3937b9fff0d9f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7ac92876653dc044", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "d8bbc71fad5487ac", "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": "db8b37491a81bff4", "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": "932996633e594ba8", "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": "95fd1cf653b0849f", "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": "e5e8fc421d0ce18b", "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": "fb72622d5b04a0db", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "d922500bafb01b19", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "01aa6db4bd5af89f", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "e773a82e979b367c", "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": "7c2fbb6d28910e19", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "b1f637ab1e8f6cee", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "504059c5ffd65b78", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "9b2cee39aa89161e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-bb3563c7bdb084be", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/client-error"}, "properties": {"repobilityId": "d86e9f8e97000ed7", "scanner": "scanner-primary", "fingerprint": "bb3563c7bdb084be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e90c0dd3e70898c", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/news-feed"}, "properties": {"repobilityId": "91b51420d0bd9f29", "scanner": "scanner-primary", "fingerprint": "3e90c0dd3e70898c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50de5461c1ea1fa8", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/daily-market-stats"}, "properties": {"repobilityId": "9225813f4628b627", "scanner": "scanner-primary", "fingerprint": "50de5461c1ea1fa8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c9d10b417b1768c", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/stock-price/{ticker}"}, "properties": {"repobilityId": "be48213663e02496", "scanner": "scanner-primary", "fingerprint": "6c9d10b417b1768c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03760baa97594605", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/stock-prices"}, "properties": {"repobilityId": "a0f04e7ac662177e", "scanner": "scanner-primary", "fingerprint": "03760baa97594605", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4daa7313debee22d", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/viop-night-session"}, "properties": {"repobilityId": "d64662be80acbe52", "scanner": "scanner-primary", "fingerprint": "4daa7313debee22d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97c7ca7621f6d756", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/spk-bulletin-analyses"}, "properties": {"repobilityId": "005b38bd6e1e280b", "scanner": "scanner-primary", "fingerprint": "97c7ca7621f6d756", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad552567560fc462", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/verify"}, "properties": {"repobilityId": "3ca6982bedeaadad", "scanner": "scanner-primary", "fingerprint": "ad552567560fc462", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-494bafc8ccee8c65", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/service-status"}, "properties": {"repobilityId": "5a07a50386237766", "scanner": "scanner-primary", "fingerprint": "494bafc8ccee8c65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f46e643a0c43e0d", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/toggle-kill-switch"}, "properties": {"repobilityId": "ed6ca629b8ac586a", "scanner": "scanner-primary", "fingerprint": "0f46e643a0c43e0d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be2b08ed4bbf2f80", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/test-gemini"}, "properties": {"repobilityId": "2dd4c9891e6c03dc", "scanner": "scanner-primary", "fingerprint": "be2b08ed4bbf2f80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3e78803e4a2aa7f", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos"}, "properties": {"repobilityId": "655e90a2625f3121", "scanner": "scanner-primary", "fingerprint": "f3e78803e4a2aa7f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-757e0648dd01e4ab", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/upcoming"}, "properties": {"repobilityId": "9a28c681552249c2", "scanner": "scanner-primary", "fingerprint": "757e0648dd01e4ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e2bac8d7fdbf6b7", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/sections"}, "properties": {"repobilityId": "a5884df085eca354", "scanner": "scanner-primary", "fingerprint": "1e2bac8d7fdbf6b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a1cf8c9eb80ac1b", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/spk-applications"}, "properties": {"repobilityId": "4a6e799b280e8323", "scanner": "scanner-primary", "fingerprint": "6a1cf8c9eb80ac1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3ba5171fb28cd08e", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/blogs"}, "properties": {"repobilityId": "aeadaf2621aa35af", "scanner": "scanner-primary", "fingerprint": "3ba5171fb28cd08e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-797506f329c1fc34", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/system-announcements"}, "properties": {"repobilityId": "a9c1025b4c7b2734", "scanner": "scanner-primary", "fingerprint": "797506f329c1fc34", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-348c23b0ae15d348", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/public/blogs/{slug}"}, "properties": {"repobilityId": "17fe541141876a2d", "scanner": "scanner-primary", "fingerprint": "348c23b0ae15d348", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80ff3e93b73ed730", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/generate-blog"}, "properties": {"repobilityId": "288f448413feb7f3", "scanner": "scanner-primary", "fingerprint": "80ff3e93b73ed730", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7b583d201f71c92", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/update-bulletin-text"}, "properties": {"repobilityId": "00ffe27f87217473", "scanner": "scanner-primary", "fingerprint": "e7b583d201f71c92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8abc285b1ef04a00", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/cleanup-spk-names"}, "properties": {"repobilityId": "75605a32b74c7edb", "scanner": "scanner-primary", "fingerprint": "8abc285b1ef04a00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5aff03372d6be0e4", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/generate-spk-descriptions"}, "properties": {"repobilityId": "1bfea2d2edb792d4", "scanner": "scanner-primary", "fingerprint": "5aff03372d6be0e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1677bcd0ae894e37", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/archived"}, "properties": {"repobilityId": "93aaa1793112a560", "scanner": "scanner-primary", "fingerprint": "1677bcd0ae894e37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f33913918e5576c", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}"}, "properties": {"repobilityId": "4ecc79bacc9e2e38", "scanner": "scanner-primary", "fingerprint": "2f33913918e5576c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61190c5b5c660dbd", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-analysis"}, "properties": {"repobilityId": "2e671f9fcc194f22", "scanner": "scanner-primary", "fingerprint": "61190c5b5c660dbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53b2ae51b0751c58", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/prospectus-image"}, "properties": {"repobilityId": "a5e06314e950e972", "scanner": "scanner-primary", "fingerprint": "53b2ae51b0751c58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a182acd01d0a8be", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-phase"}, "properties": {"repobilityId": "d5e464f3f867b0b4", "scanner": "scanner-primary", "fingerprint": "1a182acd01d0a8be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-020a0f9ba9b857c3", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/ipos/{ipo_id}/poll-vote"}, "properties": {"repobilityId": "a4b9b28e88029195", "scanner": "scanner-primary", "fingerprint": "020a0f9ba9b857c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd4e57f620bf2813", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-stats"}, "properties": {"repobilityId": "fdf47f3feeec2488", "scanner": "scanner-primary", "fingerprint": "cd4e57f620bf2813", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53cb58c934dc92b9", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/ipos/{ipo_id}/poll-my-vote"}, "properties": {"repobilityId": "8e7bbb81e6036ca9", "scanner": "scanner-primary", "fingerprint": "53cb58c934dc92b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2369a6ff56448b85", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/telegram-news"}, "properties": {"repobilityId": "bec7191508d3732c", "scanner": "scanner-primary", "fingerprint": "2369a6ff56448b85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dae6e47136147007", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/telegram-news/locked-teasers"}, "properties": {"repobilityId": "ff00e91518d7f4e0", "scanner": "scanner-primary", "fingerprint": "dae6e47136147007", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7632adb63e463b1d", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/telegram-news/test-send"}, "properties": {"repobilityId": "ed5e4d2bc641f9ac", "scanner": "scanner-primary", "fingerprint": "7632adb63e463b1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-640e22c97643b136", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/news"}, "properties": {"repobilityId": "da8ed668f1e6773f", "scanner": "scanner-primary", "fingerprint": "640e22c97643b136", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b841431c695c3c65", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/news/latest"}, "properties": {"repobilityId": "a9bea6896ca4a6ba", "scanner": "scanner-primary", "fingerprint": "b841431c695c3c65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b20adc1fc7cb47d5", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/notification-tiers"}, "properties": {"repobilityId": "3ff9ecd162c91da0", "scanner": "scanner-primary", "fingerprint": "b20adc1fc7cb47d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b915af63f402b78f", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/news-tiers"}, "properties": {"repobilityId": "3dc55eaf413ec463", "scanner": "scanner-primary", "fingerprint": "b915af63f402b78f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d29a22d2bde522ac", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications"}, "properties": {"repobilityId": "48639daf2e603303", "scanner": "scanner-primary", "fingerprint": "d29a22d2bde522ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-667710496fa83e84", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/users/{device_id}/stock-notifications"}, "properties": {"repobilityId": "f91e7fb0a781acca", "scanner": "scanner-primary", "fingerprint": "667710496fa83e84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11ac1fc3a22cc0f1", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/deactivate-all"}, "properties": {"repobilityId": "2ef3d4300a38eb93", "scanner": "scanner-primary", "fingerprint": "11ac1fc3a22cc0f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-402f1b4673c0f297", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/users/{device_id}/stock-notifications/sync"}, "properties": {"repobilityId": "3198946c185f5303", "scanner": "scanner-primary", "fingerprint": "402f1b4673c0f297", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0eb57ba1e0cbaec6", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/v1/users/{device_id}/stock-notifications/{sub_id}/mute"}, "properties": {"repobilityId": "6bb018ea1c6d8502", "scanner": "scanner-primary", "fingerprint": "0eb57ba1e0cbaec6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-597882382501ebba", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/users/register"}, "properties": {"repobilityId": "c77064e650652454", "scanner": "scanner-primary", "fingerprint": "597882382501ebba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0ea56e04ac99f7f", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/users/{device_id}"}, "properties": {"repobilityId": "c103d4890ffc3110", "scanner": "scanner-primary", "fingerprint": "a0ea56e04ac99f7f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83e131c6549d0315", "level": "note", "message": {"text": "Unused endpoint: PUT /api/v1/users/{device_id}"}, "properties": {"repobilityId": "0ebab3e2bee496f2", "scanner": "scanner-primary", "fingerprint": "83e131c6549d0315", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4330a6e6c3548c1", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/v1/users/{device_id}"}, "properties": {"repobilityId": "dbac653303d754e5", "scanner": "scanner-primary", "fingerprint": "b4330a6e6c3548c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1ae0596fe3c1527", "level": "note", "message": {"text": "Unused endpoint: PUT /api/v1/users/{device_id}/reminder-settings"}, "properties": {"repobilityId": "edcc348ece9cb2aa", "scanner": "scanner-primary", "fingerprint": "f1ae0596fe3c1527", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab8f315b1e103cda", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/users/{device_id}/subscription"}, "properties": {"repobilityId": "0d2897d8258c1b04", "scanner": "scanner-primary", "fingerprint": "ab8f315b1e103cda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-808f4796d7ada784", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/activate-news-subscription/{device_id}"}, "properties": {"repobilityId": "25013bac1984bba9", "scanner": "scanner-primary", "fingerprint": "808f4796d7ada784", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4261b2b058142ceb", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/admin/deactivate-stock-notification/{sub_id}"}, "properties": {"repobilityId": "014634bd470cbc68", "scanner": "scanner-primary", "fingerprint": "4261b2b058142ceb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}