{"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-f757d02340917741", "name": "Possibly dead Python function: extract_cards", "shortDescription": {"text": "Possibly dead Python function: extract_cards"}, "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-fa26d2d8ad496c7b", "name": "Possibly dead Python function: extract_card_values", "shortDescription": {"text": "Possibly dead Python function: extract_card_values"}, "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-c04e8e573890e074", "name": "Possibly dead Python function: generate_invite_code", "shortDescription": {"text": "Possibly dead Python function: generate_invite_code"}, "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-e257d21179af5de1", "name": "Possibly dead Python function: generate_grand_straight_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_grand_straight_flushes"}, "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-847c1ebd57d102f3", "name": "Possibly dead Python function: generate_palaces", "shortDescription": {"text": "Possibly dead Python function: generate_palaces"}, "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-c1ad30d6f152f616", "name": "Possibly dead Python function: generate_long_straight_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_long_straight_flushes"}, "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-8e004aa4c705c869", "name": "Possibly dead Python function: generate_grand_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_grand_flushes"}, "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-866ac319f462fb15", "name": "Possibly dead Python function: generate_mansions", "shortDescription": {"text": "Possibly dead Python function: generate_mansions"}, "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-b6318b8ebccb575b", "name": "Possibly dead Python function: generate_straight_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_straight_flushes"}, "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-f6371dd92f2140d1", "name": "Possibly dead Python function: generate_hotels", "shortDescription": {"text": "Possibly dead Python function: generate_hotels"}, "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-ae63b57931516bf7", "name": "Possibly dead Python function: generate_villas", "shortDescription": {"text": "Possibly dead Python function: generate_villas"}, "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-231eb97bf638765f", "name": "Possibly dead Python function: generate_grand_straights", "shortDescription": {"text": "Possibly dead Python function: generate_grand_straights"}, "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-e58937edc29f1c21", "name": "Possibly dead Python function: generate_four_of_a_kinds", "shortDescription": {"text": "Possibly dead Python function: generate_four_of_a_kinds"}, "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-4c65c2b1277458d7", "name": "Possibly dead Python function: generate_long_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_long_flushes"}, "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-5857c23a14a6c715", "name": "Possibly dead Python function: generate_long_straights", "shortDescription": {"text": "Possibly dead Python function: generate_long_straights"}, "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-b624ac31bb87cdce", "name": "Possibly dead Python function: generate_three_pairs", "shortDescription": {"text": "Possibly dead Python function: generate_three_pairs"}, "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-c97c2d94f20e6a95", "name": "Possibly dead Python function: generate_full_houses", "shortDescription": {"text": "Possibly dead Python function: generate_full_houses"}, "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-d3ddab3f708a61eb", "name": "Possibly dead Python function: generate_flushes", "shortDescription": {"text": "Possibly dead Python function: generate_flushes"}, "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-6e94114d4d13410d", "name": "Possibly dead Python function: generate_three_of_a_kinds", "shortDescription": {"text": "Possibly dead Python function: generate_three_of_a_kinds"}, "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-c9ef505db367cf9b", "name": "Possibly dead Python function: generate_one_pairs", "shortDescription": {"text": "Possibly dead Python function: generate_one_pairs"}, "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-9da8edd352afeca0", "name": "Possibly dead Python function: generate_high_cards", "shortDescription": {"text": "Possibly dead Python function: generate_high_cards"}, "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-4b92498f9aac6a79", "name": "Possibly dead Python function: save_hands_to_file", "shortDescription": {"text": "Possibly dead Python function: save_hands_to_file"}, "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-d4e57799def38fb3", "name": "Possibly dead Python function: sort_hands_list", "shortDescription": {"text": "Possibly dead Python function: sort_hands_list"}, "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-a55beb02d9182773", "name": "Possibly dead Python function: create_tuples", "shortDescription": {"text": "Possibly dead Python function: create_tuples"}, "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-4b74a44459471538", "name": "Possibly dead Python function: load_hand_rankings", "shortDescription": {"text": "Possibly dead Python function: load_hand_rankings"}, "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-fe3cfcba807474b8", "name": "Possibly dead Python function: drop_tables", "shortDescription": {"text": "Possibly dead Python function: drop_tables"}, "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-c2e8be0dd72436af", "name": "Possibly dead Python function: init_migrations", "shortDescription": {"text": "Possibly dead Python function: init_migrations"}, "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-5371c5d6cb95a493", "name": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/setup-auth.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/setup-auth.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a038aa89ccb7f838", "name": "Stray `console.log` in TS/JS \u2014 static/js/table.js:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/table.js:147"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-350bcb99c564687f", "name": "Stray `console.log` in TS/JS \u2014 static/js/lobby.js:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/lobby.js:129"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-372e1eb299d53345", "name": "Stray `console.log` in TS/JS \u2014 src/web/static/script.js:614", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/web/static/script.js:614"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "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-cc3933df753a5553", "name": "Insecure pattern 'debug_true' in app.py:209", "shortDescription": {"text": "Insecure pattern 'debug_true' in app.py:209"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42f812518e727e9b", "name": "Insecure pattern 'debug_true' in run_server.py:965", "shortDescription": {"text": "Insecure pattern 'debug_true' in run_server.py:965"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fd5e0e49227e3bc", "name": "Insecure pattern 'direct_innerhtml_assignment' in demo_enhanced_table.html:264", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo_enhanced_table.html:264"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7adeb999f629d21c", "name": "Insecure pattern 'debug_true' in pyproject.toml:116", "shortDescription": {"text": "Insecure pattern 'debug_true' in pyproject.toml:116"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7358eba45843dab", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/admin.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/admin.js:19"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4dc25e6ed53c6f48", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table.js:325", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table.js:325"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-02b3032d12c75a59", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lobby.js:227", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lobby.js:227"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08cb532ad0f12268", "name": "Insecure pattern 'insert_adjacent_html' in static/js/lobby.js:775", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/lobby.js:775"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b4b3f6999fa4447", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/timer.js:72", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/timer.js:72"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f89c35c818a6be1a", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/modals.js:29", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/modals.js:29"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f1064fcc780cf1f", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/showdown.js:183", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/showdown.js:183"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a7c6a547ab43db6", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/chat.js:37", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/chat.js:37"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa0db50ace7a9dee", "name": "Possible secret in tools/seed_db.py", "shortDescription": {"text": "Possible secret in tools/seed_db.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ef49f5e73011328d", "name": "Insecure pattern 'debug_true' in src/web/server.py:1507", "shortDescription": {"text": "Insecure pattern 'debug_true' in src/web/server.py:1507"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-158d2d34272ddd51", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/web/static/script.js:128", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/web/static/script.js:128"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b034b05711766df", "name": "Insecure pattern 'insert_adjacent_html' in src/web/static/script.js:284", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in src/web/static/script.js:284"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-638e33ee9402edb7", "name": "Very large file: tests/integration/test_socketio_integration.py (2262 lines)", "shortDescription": {"text": "Very large file: tests/integration/test_socketio_integration.py (2262 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-998754f91cfca36c", "name": "Very large file: tests/unit/test_showdown_manager.py (2535 lines)", "shortDescription": {"text": "Very large file: tests/unit/test_showdown_manager.py (2535 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-98ffc30c0d343db9", "name": "Very large file: tests/unit/test_pot.py (1587 lines)", "shortDescription": {"text": "Very large file: tests/unit/test_pot.py (1587 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-776f5a1c8010156e", "name": "Very large file: tests/game/test_paradise_road_pickem.py (1505 lines)", "shortDescription": {"text": "Very large file: tests/game/test_paradise_road_pickem.py (1505 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-2e67977c43bce640", "name": "Very large file: static/js/table.js (2594 lines)", "shortDescription": {"text": "Very large file: static/js/table.js (2594 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-5b21ca9e5f442f5a", "name": "Very large file: static/js/lobby.js (1436 lines)", "shortDescription": {"text": "Very large file: static/js/lobby.js (1436 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-584844fa63dbae18", "name": "Very large file: tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py (1055 lines)", "shortDescription": {"text": "Very large file: tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py (1055 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-7e356b23255a9079", "name": "Very large file: src/online_poker/services/player_action_manager.py (1344 lines)", "shortDescription": {"text": "Very large file: src/online_poker/services/player_action_manager.py (1344 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-5100db11720df9bf", "name": "Very large file: src/online_poker/services/websocket_manager.py (1505 lines)", "shortDescription": {"text": "Very large file: src/online_poker/services/websocket_manager.py (1505 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-2dda95b712720dff", "name": "Very large file: src/web/server.py (1507 lines)", "shortDescription": {"text": "Very large file: src/web/server.py (1507 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-1c474705167685dc", "name": "Very large file: src/generic_poker/game/player_action_handler.py (1640 lines)", "shortDescription": {"text": "Very large file: src/generic_poker/game/player_action_handler.py (1640 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-8f22f23cf684d8ae", "name": "Very large file: src/generic_poker/game/game.py (1673 lines)", "shortDescription": {"text": "Very large file: src/generic_poker/game/game.py (1673 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-bbdcaf26872bfed9", "name": "Very large file: src/generic_poker/game/showdown_manager.py (2978 lines)", "shortDescription": {"text": "Very large file: src/generic_poker/game/showdown_manager.py (2978 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-b019c52458f36f7f", "name": "95 TODO/FIXME markers", "shortDescription": {"text": "95 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-043088ad3f7470bd", "name": "Node manifest has dependencies but no lockfile: tests/e2e/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: tests/e2e/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 948 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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 16 placeholder/mock markers across 9 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a28ffb82b565401", "name": "Commented-code block (7 lines) in tests/unit/test_hand_description.py:280", "shortDescription": {"text": "Commented-code block (7 lines) in tests/unit/test_hand_description.py:280"}, "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-f865f8c6eee3e3ab", "name": "Commented-code block (6 lines) in tests/unit/test_grouped_betting.py:617", "shortDescription": {"text": "Commented-code block (6 lines) in tests/unit/test_grouped_betting.py:617"}, "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-a3f8bdd147160dad", "name": "Commented-code block (5 lines) in tests/unit/test_betting_manager.py:50", "shortDescription": {"text": "Commented-code block (5 lines) in tests/unit/test_betting_manager.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-cc7899688113b3ec", "name": "Commented-code block (5 lines) in tests/unit/test_betting_nl_pl.py:186", "shortDescription": {"text": "Commented-code block (5 lines) in tests/unit/test_betting_nl_pl.py:186"}, "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-6bbdd6a57c8ccf02", "name": "Commented-code block (6 lines) in tests/game/test_stampler.py:193", "shortDescription": {"text": "Commented-code block (6 lines) in tests/game/test_stampler.py:193"}, "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-7908819c429bb985", "name": "Commented-code block (5 lines) in tests/game/test_paradise_road_pickem.py:16", "shortDescription": {"text": "Commented-code block (5 lines) in tests/game/test_paradise_road_pickem.py:16"}, "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-a7e753eb98c1bd2b", "name": "Commented-code block (5 lines) in tests/game/test_hold_em_edge_cases.py:141", "shortDescription": {"text": "Commented-code block (5 lines) in tests/game/test_hold_em_edge_cases.py:141"}, "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-eb339e3a065b8ecd", "name": "Commented-code block (15 lines) in tests/game/test_mexican_poker.py:353", "shortDescription": {"text": "Commented-code block (15 lines) in tests/game/test_mexican_poker.py:353"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4312b1769a73af18", "name": "Commented-code block (6 lines) in tests/game/test_stumpler.py:193", "shortDescription": {"text": "Commented-code block (6 lines) in tests/game/test_stumpler.py:193"}, "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-a3a0060a3e7ff026", "name": "Commented-code block (5 lines) in tests/game/test_kryky.py:224", "shortDescription": {"text": "Commented-code block (5 lines) in tests/game/test_kryky.py:224"}, "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-8da2303c0db5506c", "name": "Commented-code block (6 lines) in tests/game/test_binglaha.py:75", "shortDescription": {"text": "Commented-code block (6 lines) in tests/game/test_binglaha.py:75"}, "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-2e0027a819a1493b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/admin.js:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/admin.js:159"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28a5b9c94c155604", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lobby.js:741", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lobby.js:741"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a8f96f435f31888", "name": "Network/subprocess call without timeout or try/except \u2014 tools/generate_poker_test.py:11", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 tools/generate_poker_test.py:11"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-571efa5875966e6a", "name": "Commented-code block (5 lines) in tools/generate_rankings/generate_high_suit_hand_rankings.py:48", "shortDescription": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_high_suit_hand_rankings.py:48"}, "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-46b3faeeac2cd00b", "name": "Commented-code block (22 lines) in tools/generate_rankings/generate_soko_high_hand_rankings.py:231", "shortDescription": {"text": "Commented-code block (22 lines) in tools/generate_rankings/generate_soko_high_hand_rankings.py:231"}, "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-68d3e38075581ade", "name": "Commented-code block (5 lines) in tools/generate_rankings/generate_low_suit_hand_rankings.py:27", "shortDescription": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_low_suit_hand_rankings.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-c55eb7ce9a7b11c3", "name": "Commented-code block (5 lines) in tools/generate_rankings/generate_49_0_6_21_hands.py:456", "shortDescription": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_49_0_6_21_hands.py:456"}, "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-b6fc887f5d03130d", "name": "Commented-code block (5 lines) in src/web/server.py:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/web/server.py:42"}, "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-4478004f93fd0039", "name": "Commented-code block (5 lines) in src/generic_poker/evaluation/hand_description.py:188", "shortDescription": {"text": "Commented-code block (5 lines) in src/generic_poker/evaluation/hand_description.py:188"}, "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-2ef06d618f878fbe", "name": "Stub function `get_sample_hand` (body is just `pass`/`return`) \u2014 src/generic_poker/evaluation/eval_types/base.py:87", "shortDescription": {"text": "Stub function `get_sample_hand` (body is just `pass`/`return`) \u2014 src/generic_poker/evaluation/eval_types/base.py:87"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7cb6eb8e2429c15a", "name": "Legacy-named symbol `card_copy` in src/generic_poker/game/showdown_manager.py:2436", "shortDescription": {"text": "Legacy-named symbol `card_copy` in src/generic_poker/game/showdown_manager.py:2436"}, "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-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:\nexamples/straight_poker.py:load_straight_poker_rules, examples/pineapple.py:load_straight_poker_rules\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-380b7cb95b387b9c", "name": "Near-duplicate function bodies in 11 places", "shortDescription": {"text": "Near-duplicate function bodies in 11 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/generate_rankings/generate_three_card_27_ja_ffh_high_wild_bug_hand_rankings.py:read_hands_from_file, tools/generate_rankings/generate_low_a5_wild_hand_rankings.py:read_hands_from_file, tools/generate_rankings/generate_high_wild_bug_hand_rankings.py:read_hands_from_file, tools/generate_rankings/generate_two_card_27_ja_ffh_high_wild_bug_hand_rankings.py:read_hands_from_file\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-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/generate_rankings/generate_three_card_27_ja_ffh_high_wild_bug_hand_rankings.py:normalize_hand, tools/generate_rankings/generate_high_wild_bug_hand_rankings.py:normalize_hand, tools/generate_rankings/generate_two_card_27_ja_ffh_high_wild_bug_hand_rankings.py:normalize_hand, tools/generate_rankings/generate_three_card_high_wild_bug_hand_rankings.py:normalize_hand\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-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_card_combos, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_card, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_card, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_card\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:\ntools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_two_card_hands, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_three_card_hands, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_high_four_card_hands\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-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_one_pair, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_one_pair, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_one_pair, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_one_pair\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:\ntools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_three_of_a_kind, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_three_of_a_kind, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_three_of_a_kind, tools/generate_rankings/generate_partial_hand_27_ja_ffh_rankings.py:generate_three_of_a_kind\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-18136f7324e9aba7", "name": "Flask mutation route `login` without `@login_required` \u2014 run_server.py:106", "shortDescription": {"text": "Flask mutation route `login` without `@login_required` \u2014 run_server.py:106"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d5f1366ba9eb5983", "name": "Dangling fetch: GET /admin/api/stats (static/js/admin.js:67)", "shortDescription": {"text": "Dangling fetch: GET /admin/api/stats (static/js/admin.js:67)"}, "fullDescription": {"text": "`static/js/admin.js:67` calls `GET /admin/api/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6a4c82fcbc462c8", "name": "Dangling fetch: GET /admin/api/sessions (static/js/admin.js:68)", "shortDescription": {"text": "Dangling fetch: GET /admin/api/sessions (static/js/admin.js:68)"}, "fullDescription": {"text": "`static/js/admin.js:68` calls `GET /admin/api/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dbf2f6de8def78da", "name": "Dangling fetch: GET /admin/api/users?${params} (static/js/admin.js:159)", "shortDescription": {"text": "Dangling fetch: GET /admin/api/users?${params} (static/js/admin.js:159)"}, "fullDescription": {"text": "`static/js/admin.js:159` calls `GET /admin/api/users?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7c9a74555599254", "name": "Dangling fetch: POST /admin/api/users/${this._bankrollUserId}/bankroll (static/js/admin.js:234)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/users/${this._bankrollUserId}/bankroll (static/js/admin.js:234)"}, "fullDescription": {"text": "`static/js/admin.js:234` calls `POST /admin/api/users/${this._bankrollUserId}/bankroll` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/users/<p>/bankroll`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ea9db92f70c5930b", "name": "Dangling fetch: POST /admin/api/users/${userId}/toggle-active (static/js/admin.js:255)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/users/${userId}/toggle-active (static/js/admin.js:255)"}, "fullDescription": {"text": "`static/js/admin.js:255` calls `POST /admin/api/users/${userId}/toggle-active` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/users/<p>/toggle-active`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-952b24662fd33e2a", "name": "Dangling fetch: GET /admin/api/tables (static/js/admin.js:276)", "shortDescription": {"text": "Dangling fetch: GET /admin/api/tables (static/js/admin.js:276)"}, "fullDescription": {"text": "`static/js/admin.js:276` calls `GET /admin/api/tables` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/tables`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f0085dc61a7283f8", "name": "Dangling fetch: POST /admin/api/tables/${tableId}/close (static/js/admin.js:315)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/tables/${tableId}/close (static/js/admin.js:315)"}, "fullDescription": {"text": "`static/js/admin.js:315` calls `POST /admin/api/tables/${tableId}/close` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/tables/<p>/close`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc9b5599529657c3", "name": "Dangling fetch: POST /admin/api/tables/${tableId}/delete (static/js/admin.js:336)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/tables/${tableId}/delete (static/js/admin.js:336)"}, "fullDescription": {"text": "`static/js/admin.js:336` calls `POST /admin/api/tables/${tableId}/delete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/tables/<p>/delete`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a628fef9713e8a35", "name": "Dangling fetch: POST /admin/api/tables/purge-all (static/js/admin.js:357)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/tables/purge-all (static/js/admin.js:357)"}, "fullDescription": {"text": "`static/js/admin.js:357` calls `POST /admin/api/tables/purge-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/tables/purge-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd9d46fd84330867", "name": "Dangling fetch: GET /admin/api/variants (static/js/admin.js:392)", "shortDescription": {"text": "Dangling fetch: GET /admin/api/variants (static/js/admin.js:392)"}, "fullDescription": {"text": "`static/js/admin.js:392` calls `GET /admin/api/variants` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/variants`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9f6ef152dedd1d6", "name": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/enable (static/js/admin.js:466)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/enable (static/js/admin.js:466)"}, "fullDescription": {"text": "`static/js/admin.js:466` calls `POST /admin/api/variants/${encodeURIComponent(name)}/enable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/variants/<p>/enable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07fea795361c4ccc", "name": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/disable (static/js/admin.js:503)", "shortDescription": {"text": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/disable (static/js/admin.js:503)"}, "fullDescription": {"text": "`static/js/admin.js:503` calls `POST /admin/api/variants/${encodeURIComponent(name)}/disable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/api/variants/<p>/disable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e8bca5505ecea069", "name": "Dangling fetch: GET /game/sessions/${this.store.tableId}/hand-result (static/js/table.js:451)", "shortDescription": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/hand-result (static/js/table.js:451)"}, "fullDescription": {"text": "`static/js/table.js:451` calls `GET /game/sessions/${this.store.tableId}/hand-result` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game/sessions/<p>/hand-result`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-572bb3e8fa629f52", "name": "Dangling fetch: POST /game/sessions/${this.store.tableId}/action (static/js/table.js:1504)", "shortDescription": {"text": "Dangling fetch: POST /game/sessions/${this.store.tableId}/action (static/js/table.js:1504)"}, "fullDescription": {"text": "`static/js/table.js:1504` calls `POST /game/sessions/${this.store.tableId}/action` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game/sessions/<p>/action`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04b5dbbd67137711", "name": "Dangling fetch: GET /game/sessions/${this.store.tableId}/state (static/js/table.js:1536)", "shortDescription": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/state (static/js/table.js:1536)"}, "fullDescription": {"text": "`static/js/table.js:1536` calls `GET /game/sessions/${this.store.tableId}/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game/sessions/<p>/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed216714a569c7a7", "name": "Dangling fetch: GET /game/sessions/${this.store.tableId}/actions (static/js/table.js:1553)", "shortDescription": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/actions (static/js/table.js:1553)"}, "fullDescription": {"text": "`static/js/table.js:1553` calls `GET /game/sessions/${this.store.tableId}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game/sessions/<p>/actions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa3f3cdfd2f7fee9", "name": "Dangling fetch: GET /api/games/tables/${this.store.tableId}/hand-history?limit=20 (static/js/table.js:1868)", "shortDescription": {"text": "Dangling fetch: GET /api/games/tables/${this.store.tableId}/hand-history?limit=20 (static/js/table.js:1868)"}, "fullDescription": {"text": "`static/js/table.js:1868` calls `GET /api/games/tables/${this.store.tableId}/hand-history?limit=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/games/tables/<p>/hand-history`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2745ea006565981", "name": "Dangling fetch: GET /table/variants (static/js/lobby.js:181)", "shortDescription": {"text": "Dangling fetch: GET /table/variants (static/js/lobby.js:181)"}, "fullDescription": {"text": "`static/js/lobby.js:181` calls `GET /table/variants` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/table/variants`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3c8aaf348e47fb66", "name": "Dangling fetch: POST /api/tables/${tableId}/leave (static/js/lobby.js:717)", "shortDescription": {"text": "Dangling fetch: POST /api/tables/${tableId}/leave (static/js/lobby.js:717)"}, "fullDescription": {"text": "`static/js/lobby.js:717` calls `POST /api/tables/${tableId}/leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tables/<p>/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65812a28f964fa49", "name": "Dangling fetch: GET /api/tables/${tableId}/seats (static/js/lobby.js:741)", "shortDescription": {"text": "Dangling fetch: GET /api/tables/${tableId}/seats (static/js/lobby.js:741)"}, "fullDescription": {"text": "`static/js/lobby.js:741` calls `GET /api/tables/${tableId}/seats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tables/<p>/seats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-77808522455c98ff", "name": "Dangling fetch: GET /table/variants/${variantId}/rules (static/js/lobby.js:1292)", "shortDescription": {"text": "Dangling fetch: GET /table/variants/${variantId}/rules (static/js/lobby.js:1292)"}, "fullDescription": {"text": "`static/js/lobby.js:1292` calls `GET /table/variants/${variantId}/rules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/table/variants/<p>/rules`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`app.py` declares `ANY /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c7ad61ba1b23915", "name": "Unused endpoint: ANY /login", "shortDescription": {"text": "Unused endpoint: ANY /login"}, "fullDescription": {"text": "`run_server.py` declares `ANY /login` 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-c9e449c3b9e73b73", "name": "Unused endpoint: ANY /logout", "shortDescription": {"text": "Unused endpoint: ANY /logout"}, "fullDescription": {"text": "`run_server.py` declares `ANY /logout` 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-7edb7c2b93e228d2", "name": "Unused endpoint: ANY /table/<table_id>", "shortDescription": {"text": "Unused endpoint: ANY /table/<table_id>"}, "fullDescription": {"text": "`run_server.py` declares `ANY /table/<table_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-90ec5e7babe2ee92", "name": "Unused endpoint: ANY /lobby", "shortDescription": {"text": "Unused endpoint: ANY /lobby"}, "fullDescription": {"text": "`run_server.py` declares `ANY /lobby` 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-e018f279aec06d09", "name": "Unused endpoint: ANY /api/tables/<table_id>/seats", "shortDescription": {"text": "Unused endpoint: ANY /api/tables/<table_id>/seats"}, "fullDescription": {"text": "`run_server.py` declares `ANY /api/tables/<table_id>/seats` 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-2f62cbf117f1fff0", "name": "Unused endpoint: ANY /api/games/sessions/<table_id>/action", "shortDescription": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/action"}, "fullDescription": {"text": "`run_server.py` declares `ANY /api/games/sessions/<table_id>/action` 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-435cc7fa6d51d4b6", "name": "Unused endpoint: ANY /api/games/sessions/<table_id>/test", "shortDescription": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/test"}, "fullDescription": {"text": "`run_server.py` declares `ANY /api/games/sessions/<table_id>/test` 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-25dc2ec55ef7f742", "name": "Unused endpoint: ANY /api/games/sessions/<table_id>/actions", "shortDescription": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/actions"}, "fullDescription": {"text": "`run_server.py` declares `ANY /api/games/sessions/<table_id>/actions` 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-18bb8e2ffb748560", "name": "Unused endpoint: ANY /sessions", "shortDescription": {"text": "Unused endpoint: ANY /sessions"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions` 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-ab8ca9cc5b22171d", "name": "Unused endpoint: ANY /sessions/<table_id>", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_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-e4125e91ad78e790", "name": "Unused endpoint: ANY /sessions/<table_id>/join", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/join"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/join` 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-90003022beaf9cd3", "name": "Unused endpoint: ANY /sessions/<table_id>/leave", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/leave"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/leave` 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-a5a14ade7d95e26a", "name": "Unused endpoint: ANY /sessions/<table_id>/action", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/action"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/action` 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-c103797613c850cf", "name": "Unused endpoint: ANY /sessions/<table_id>/disconnect", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/disconnect"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/disconnect` 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-0a6f58455e7d7310", "name": "Unused endpoint: ANY /sessions/<table_id>/reconnect", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/reconnect"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/reconnect` 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-b45e064b63184b76", "name": "Unused endpoint: ANY /stats", "shortDescription": {"text": "Unused endpoint: ANY /stats"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /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-b02edb248c589ad0", "name": "Unused endpoint: ANY /sessions/<table_id>/info", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/info"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/info` 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-5747c5d993e9570b", "name": "Unused endpoint: ANY /sessions/<table_id>/players/<user_id>", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/players/<user_id>"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/players/<user_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-57900bdf1453d7aa", "name": "Unused endpoint: ANY /sessions/<table_id>/validate-buyin", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/validate-buyin"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/validate-buyin` 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-341bc6d36416afaf", "name": "Unused endpoint: ANY /sessions/<table_id>/actions", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/actions` 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-beaa8d13c5e86789", "name": "Unused endpoint: ANY /sessions/<table_id>/actions/validate", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions/validate"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/actions/validate` 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-3e966d29b6806da2", "name": "Unused endpoint: ANY /sessions/<table_id>/actions/history", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions/history"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/actions/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a92bf495bfc0ec3e", "name": "Unused endpoint: ANY /sessions/<table_id>/state", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/state"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/state` 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-112fad52d74237c1", "name": "Unused endpoint: ANY /sessions/<table_id>/state/updates", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/state/updates"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/state/updates` 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-84e41c2e65a99e72", "name": "Unused endpoint: ANY /sessions/<table_id>/hand-result", "shortDescription": {"text": "Unused endpoint: ANY /sessions/<table_id>/hand-result"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /sessions/<table_id>/hand-result` 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-121a6c79c20fee52", "name": "Unused endpoint: ANY /tables/<table_id>/hand-history", "shortDescription": {"text": "Unused endpoint: ANY /tables/<table_id>/hand-history"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /tables/<table_id>/hand-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65b71f5ac415850c", "name": "Unused endpoint: ANY /cleanup", "shortDescription": {"text": "Unused endpoint: ANY /cleanup"}, "fullDescription": {"text": "`src/online_poker/routes/game_routes.py` declares `ANY /cleanup` 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-df9f60161f767fce", "name": "Unused endpoint: ANY /api/tables/<table_id>/join", "shortDescription": {"text": "Unused endpoint: ANY /api/tables/<table_id>/join"}, "fullDescription": {"text": "`src/online_poker/routes/lobby_routes.py` declares `ANY /api/tables/<table_id>/join` 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-4df42ff15220fd74", "name": "Unused endpoint: ANY /api/tables/<table_id>/leave", "shortDescription": {"text": "Unused endpoint: ANY /api/tables/<table_id>/leave"}, "fullDescription": {"text": "`src/online_poker/routes/lobby_routes.py` declares `ANY /api/tables/<table_id>/leave` 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-404d253e1ba0e93d", "name": "Unused endpoint: ANY /api/tables/private/join", "shortDescription": {"text": "Unused endpoint: ANY /api/tables/private/join"}, "fullDescription": {"text": "`src/online_poker/routes/lobby_routes.py` declares `ANY /api/tables/private/join` 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-2daf08b841143a7a", "name": "Unused endpoint: ANY /api/tables/<table_id>/spectate", "shortDescription": {"text": "Unused endpoint: ANY /api/tables/<table_id>/spectate"}, "fullDescription": {"text": "`src/online_poker/routes/lobby_routes.py` declares `ANY /api/tables/<table_id>/spectate` 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-ed2cb1702f1f600d", "name": "Unused endpoint: ANY /register", "shortDescription": {"text": "Unused endpoint: ANY /register"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /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-7e0f95cb102ce3d3", "name": "Unused endpoint: ANY /api/register", "shortDescription": {"text": "Unused endpoint: ANY /api/register"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /api/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-cee1b1903574e9ca", "name": "Unused endpoint: ANY /api/login", "shortDescription": {"text": "Unused endpoint: ANY /api/login"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /api/login` 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-8c60a66fb2a1dff2", "name": "Unused endpoint: ANY /api/logout", "shortDescription": {"text": "Unused endpoint: ANY /api/logout"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /api/logout` 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-b75682f8c28684f8", "name": "Unused endpoint: ANY /me", "shortDescription": {"text": "Unused endpoint: ANY /me"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /me` 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-71610025521f929d", "name": "Unused endpoint: ANY /refresh", "shortDescription": {"text": "Unused endpoint: ANY /refresh"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /refresh` 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-22aeb6f2f86ee26a", "name": "Unused endpoint: ANY /forgot-password", "shortDescription": {"text": "Unused endpoint: ANY /forgot-password"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /forgot-password` 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-7bcc7a57e742d03e", "name": "Unused endpoint: ANY /reset-password", "shortDescription": {"text": "Unused endpoint: ANY /reset-password"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /reset-password` 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-fd3a097eb21f99ae", "name": "Unused endpoint: ANY /check-auth", "shortDescription": {"text": "Unused endpoint: ANY /check-auth"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /check-auth` 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-ac5fac29a67f4312", "name": "Unused endpoint: ANY /validate-session", "shortDescription": {"text": "Unused endpoint: ANY /validate-session"}, "fullDescription": {"text": "`src/online_poker/routes/auth_routes.py` declares `ANY /validate-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-844f255ceef7cc7d", "name": "Unused endpoint: ANY /users", "shortDescription": {"text": "Unused endpoint: ANY /users"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /users` 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-a945917bc56c5e98", "name": "Unused endpoint: ANY /tables", "shortDescription": {"text": "Unused endpoint: ANY /tables"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /tables` 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-7f22d5b985dfb706", "name": "Unused endpoint: ANY /variants", "shortDescription": {"text": "Unused endpoint: ANY /variants"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /variants` 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-ec3442aa0b6ba39d", "name": "Unused endpoint: ANY /api/stats", "shortDescription": {"text": "Unused endpoint: ANY /api/stats"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /api/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-916d42aea8f4a3f8", "name": "Unused endpoint: ANY /api/sessions", "shortDescription": {"text": "Unused endpoint: ANY /api/sessions"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /api/sessions` 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-33de9c10cc501140", "name": "Unused endpoint: ANY /api/users", "shortDescription": {"text": "Unused endpoint: ANY /api/users"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /api/users` 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-f2145c4e1de5f745", "name": "Unused endpoint: ANY /api/users/<user_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/users/<user_id>"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /api/users/<user_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-7969d804fce0b299", "name": "Unused endpoint: ANY /api/users/<user_id>/bankroll", "shortDescription": {"text": "Unused endpoint: ANY /api/users/<user_id>/bankroll"}, "fullDescription": {"text": "`src/online_poker/routes/admin_routes.py` declares `ANY /api/users/<user_id>/bankroll` 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/20802"}, "properties": {"repository": "talvola/generic_poker", "repoUrl": "https://github.com/talvola/generic_poker", "branch": "main"}, "results": [{"ruleId": "scanner-f757d02340917741", "level": "note", "message": {"text": "Possibly dead Python function: extract_cards"}, "properties": {"repobilityId": "6d174776f5404382", "scanner": "scanner-primary", "fingerprint": "f757d02340917741", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/compare_two_card_high_high.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa26d2d8ad496c7b", "level": "note", "message": {"text": "Possibly dead Python function: extract_card_values"}, "properties": {"repobilityId": "81012d0a041cd24e", "scanner": "scanner-primary", "fingerprint": "fa26d2d8ad496c7b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/compare_two_card_high_high.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c04e8e573890e074", "level": "note", "message": {"text": "Possibly dead Python function: generate_invite_code"}, "properties": {"repobilityId": "ebe7cb8ab80da991", "scanner": "scanner-primary", "fingerprint": "c04e8e573890e074", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/seed_db.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e257d21179af5de1", "level": "note", "message": {"text": "Possibly dead Python function: generate_grand_straight_flushes"}, "properties": {"repobilityId": "a7144b0a1abe6890", "scanner": "scanner-primary", "fingerprint": "e257d21179af5de1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:102"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-847c1ebd57d102f3", "level": "note", "message": {"text": "Possibly dead Python function: generate_palaces"}, "properties": {"repobilityId": "5b6e856e56d37499", "scanner": "scanner-primary", "fingerprint": "847c1ebd57d102f3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:137"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1ad30d6f152f616", "level": "note", "message": {"text": "Possibly dead Python function: generate_long_straight_flushes"}, "properties": {"repobilityId": "4e301474862451e0", "scanner": "scanner-primary", "fingerprint": "c1ad30d6f152f616", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:172"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e004aa4c705c869", "level": "note", "message": {"text": "Possibly dead Python function: generate_grand_flushes"}, "properties": {"repobilityId": "a3099d5cb63bf87a", "scanner": "scanner-primary", "fingerprint": "8e004aa4c705c869", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:222"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-866ac319f462fb15", "level": "note", "message": {"text": "Possibly dead Python function: generate_mansions"}, "properties": {"repobilityId": "e09e22c3c101c49f", "scanner": "scanner-primary", "fingerprint": "866ac319f462fb15", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:260"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b6318b8ebccb575b", "level": "note", "message": {"text": "Possibly dead Python function: generate_straight_flushes"}, "properties": {"repobilityId": "b8acab8542024216", "scanner": "scanner-primary", "fingerprint": "b6318b8ebccb575b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:302"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f6371dd92f2140d1", "level": "note", "message": {"text": "Possibly dead Python function: generate_hotels"}, "properties": {"repobilityId": "bd5f1d4c2091be91", "scanner": "scanner-primary", "fingerprint": "f6371dd92f2140d1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:359"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ae63b57931516bf7", "level": "note", "message": {"text": "Possibly dead Python function: generate_villas"}, "properties": {"repobilityId": "e981dc40eeb8d9f9", "scanner": "scanner-primary", "fingerprint": "ae63b57931516bf7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:398"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-231eb97bf638765f", "level": "note", "message": {"text": "Possibly dead Python function: generate_grand_straights"}, "properties": {"repobilityId": "9b7387f84a4d3e81", "scanner": "scanner-primary", "fingerprint": "231eb97bf638765f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:447"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e58937edc29f1c21", "level": "note", "message": {"text": "Possibly dead Python function: generate_four_of_a_kinds"}, "properties": {"repobilityId": "6f6732223ed58558", "scanner": "scanner-primary", "fingerprint": "e58937edc29f1c21", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:485"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c65c2b1277458d7", "level": "note", "message": {"text": "Possibly dead Python function: generate_long_flushes"}, "properties": {"repobilityId": "89de67dc5ce624d4", "scanner": "scanner-primary", "fingerprint": "4c65c2b1277458d7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:527"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5857c23a14a6c715", "level": "note", "message": {"text": "Possibly dead Python function: generate_long_straights"}, "properties": {"repobilityId": "3f5647aadc7acdb7", "scanner": "scanner-primary", "fingerprint": "5857c23a14a6c715", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:570"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b624ac31bb87cdce", "level": "note", "message": {"text": "Possibly dead Python function: generate_three_pairs"}, "properties": {"repobilityId": "4e01c8b593590e15", "scanner": "scanner-primary", "fingerprint": "b624ac31bb87cdce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:621"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c97c2d94f20e6a95", "level": "note", "message": {"text": "Possibly dead Python function: generate_full_houses"}, "properties": {"repobilityId": "33d3dc99b5f17c36", "scanner": "scanner-primary", "fingerprint": "c97c2d94f20e6a95", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:667"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3ddab3f708a61eb", "level": "note", "message": {"text": "Possibly dead Python function: generate_flushes"}, "properties": {"repobilityId": "7390c3a1ece36119", "scanner": "scanner-primary", "fingerprint": "d3ddab3f708a61eb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:709"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6e94114d4d13410d", "level": "note", "message": {"text": "Possibly dead Python function: generate_three_of_a_kinds"}, "properties": {"repobilityId": "c80aebeea9dfcc9d", "scanner": "scanner-primary", "fingerprint": "6e94114d4d13410d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:805"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9ef505db367cf9b", "level": "note", "message": {"text": "Possibly dead Python function: generate_one_pairs"}, "properties": {"repobilityId": "b79e2aac9abe8312", "scanner": "scanner-primary", "fingerprint": "c9ef505db367cf9b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:928"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9da8edd352afeca0", "level": "note", "message": {"text": "Possibly dead Python function: generate_high_cards"}, "properties": {"repobilityId": "784137bf56ca1b39", "scanner": "scanner-primary", "fingerprint": "9da8edd352afeca0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:986"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4b92498f9aac6a79", "level": "note", "message": {"text": "Possibly dead Python function: save_hands_to_file"}, "properties": {"repobilityId": "b0e2e7acc3b405ed", "scanner": "scanner-primary", "fingerprint": "4b92498f9aac6a79", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py:1041"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4e57799def38fb3", "level": "note", "message": {"text": "Possibly dead Python function: sort_hands_list"}, "properties": {"repobilityId": "480856650b77a1f9", "scanner": "scanner-primary", "fingerprint": "d4e57799def38fb3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_49_0_6_21_hands.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a55beb02d9182773", "level": "note", "message": {"text": "Possibly dead Python function: create_tuples"}, "properties": {"repobilityId": "242ee36c2ef609f1", "scanner": "scanner-primary", "fingerprint": "a55beb02d9182773", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_49_0_6_21_hands.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4b74a44459471538", "level": "note", "message": {"text": "Possibly dead Python function: load_hand_rankings"}, "properties": {"repobilityId": "ac5a55d9dde179f0", "scanner": "scanner-primary", "fingerprint": "4b74a44459471538", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/generate_rankings/generate_quick_quads_hand_rankings.py:8"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe3cfcba807474b8", "level": "note", "message": {"text": "Possibly dead Python function: drop_tables"}, "properties": {"repobilityId": "a51dc16d1b75198c", "scanner": "scanner-primary", "fingerprint": "fe3cfcba807474b8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/online_poker/database.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c2e8be0dd72436af", "level": "note", "message": {"text": "Possibly dead Python function: init_migrations"}, "properties": {"repobilityId": "93670b3777fc5a21", "scanner": "scanner-primary", "fingerprint": "c2e8be0dd72436af", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/online_poker/migrations.py:10"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5371c5d6cb95a493", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/setup-auth.ts:24"}, "properties": {"repobilityId": "31a3f5c0ae40c5d7", "scanner": "scanner-primary", "fingerprint": "5371c5d6cb95a493", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a038aa89ccb7f838", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/table.js:147"}, "properties": {"repobilityId": "fb0b25b94e81ec5a", "scanner": "scanner-primary", "fingerprint": "a038aa89ccb7f838", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-350bcb99c564687f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/lobby.js:129"}, "properties": {"repobilityId": "1e60eadeb636e257", "scanner": "scanner-primary", "fingerprint": "350bcb99c564687f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-372e1eb299d53345", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/web/static/script.js:614"}, "properties": {"repobilityId": "6e064ff6ad5a1265", "scanner": "scanner-primary", "fingerprint": "372e1eb299d53345", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"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-cc3933df753a5553", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in app.py:209"}, "properties": {"repobilityId": "820a29d1c28c9121", "scanner": "scanner-primary", "fingerprint": "cc3933df753a5553", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py"}, "region": {"startLine": 209}}}]}, {"ruleId": "scanner-42f812518e727e9b", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in run_server.py:965"}, "properties": {"repobilityId": "a15005830e6114c2", "scanner": "scanner-primary", "fingerprint": "42f812518e727e9b", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "run_server.py"}, "region": {"startLine": 965}}}]}, {"ruleId": "scanner-1fd5e0e49227e3bc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo_enhanced_table.html:264"}, "properties": {"repobilityId": "cf0ad48af0045fb8", "scanner": "scanner-primary", "fingerprint": "1fd5e0e49227e3bc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "demo_enhanced_table.html"}, "region": {"startLine": 264}}}]}, {"ruleId": "scanner-7adeb999f629d21c", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in pyproject.toml:116"}, "properties": {"repobilityId": "75795632fc76e10f", "scanner": "scanner-primary", "fingerprint": "7adeb999f629d21c", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pyproject.toml"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-e7358eba45843dab", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/admin.js:19"}, "properties": {"repobilityId": "2e893fbfa43c1aa4", "scanner": "scanner-primary", "fingerprint": "e7358eba45843dab", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/admin.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-4dc25e6ed53c6f48", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table.js:325"}, "properties": {"repobilityId": "1f04b3356bd211b8", "scanner": "scanner-primary", "fingerprint": "4dc25e6ed53c6f48", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/table.js"}, "region": {"startLine": 325}}}]}, {"ruleId": "scanner-02b3032d12c75a59", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lobby.js:227"}, "properties": {"repobilityId": "ae02bc50485809cc", "scanner": "scanner-primary", "fingerprint": "02b3032d12c75a59", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/lobby.js"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-08cb532ad0f12268", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/lobby.js:775"}, "properties": {"repobilityId": "852dd716f74b9bdb", "scanner": "scanner-primary", "fingerprint": "08cb532ad0f12268", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/lobby.js"}, "region": {"startLine": 775}}}]}, {"ruleId": "scanner-7b4b3f6999fa4447", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/timer.js:72"}, "properties": {"repobilityId": "0bffb00503f8ba5c", "scanner": "scanner-primary", "fingerprint": "7b4b3f6999fa4447", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/table/timer.js"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-f89c35c818a6be1a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/modals.js:29"}, "properties": {"repobilityId": "22999a524c0e45ad", "scanner": "scanner-primary", "fingerprint": "f89c35c818a6be1a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/table/modals.js"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-7f1064fcc780cf1f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/showdown.js:183"}, "properties": {"repobilityId": "c6f709ab408b0084", "scanner": "scanner-primary", "fingerprint": "7f1064fcc780cf1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/table/showdown.js"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-1a7c6a547ab43db6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/table/chat.js:37"}, "properties": {"repobilityId": "96656a6cc78787cb", "scanner": "scanner-primary", "fingerprint": "1a7c6a547ab43db6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/table/chat.js"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-aa0db50ace7a9dee", "level": "error", "message": {"text": "Possible secret in tools/seed_db.py"}, "properties": {"repobilityId": "0e8129a30821b885", "scanner": "scanner-primary", "fingerprint": "aa0db50ace7a9dee", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/seed_db.py"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-ef49f5e73011328d", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in src/web/server.py:1507"}, "properties": {"repobilityId": "12486e7fc6f0808e", "scanner": "scanner-primary", "fingerprint": "ef49f5e73011328d", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/web/server.py"}, "region": {"startLine": 1507}}}]}, {"ruleId": "scanner-158d2d34272ddd51", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/web/static/script.js:128"}, "properties": {"repobilityId": "6d5624ab7e8a7a67", "scanner": "scanner-primary", "fingerprint": "158d2d34272ddd51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/web/static/script.js"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-0b034b05711766df", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in src/web/static/script.js:284"}, "properties": {"repobilityId": "39338f5fd34f2ff6", "scanner": "scanner-primary", "fingerprint": "0b034b05711766df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/web/static/script.js"}, "region": {"startLine": 284}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-638e33ee9402edb7", "level": "note", "message": {"text": "Very large file: tests/integration/test_socketio_integration.py (2262 lines)"}, "properties": {"repobilityId": "e337337d8c933698", "scanner": "scanner-primary", "fingerprint": "638e33ee9402edb7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-998754f91cfca36c", "level": "note", "message": {"text": "Very large file: tests/unit/test_showdown_manager.py (2535 lines)"}, "properties": {"repobilityId": "0fa06089480b44c1", "scanner": "scanner-primary", "fingerprint": "998754f91cfca36c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98ffc30c0d343db9", "level": "note", "message": {"text": "Very large file: tests/unit/test_pot.py (1587 lines)"}, "properties": {"repobilityId": "a0760c2e1305e81a", "scanner": "scanner-primary", "fingerprint": "98ffc30c0d343db9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-776f5a1c8010156e", "level": "note", "message": {"text": "Very large file: tests/game/test_paradise_road_pickem.py (1505 lines)"}, "properties": {"repobilityId": "cdf2adc1e6d674d0", "scanner": "scanner-primary", "fingerprint": "776f5a1c8010156e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2e67977c43bce640", "level": "note", "message": {"text": "Very large file: static/js/table.js (2594 lines)"}, "properties": {"repobilityId": "75ca13caa631964d", "scanner": "scanner-primary", "fingerprint": "2e67977c43bce640", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b21ca9e5f442f5a", "level": "note", "message": {"text": "Very large file: static/js/lobby.js (1436 lines)"}, "properties": {"repobilityId": "3332c145823f86c8", "scanner": "scanner-primary", "fingerprint": "5b21ca9e5f442f5a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-584844fa63dbae18", "level": "note", "message": {"text": "Very large file: tools/generate_rankings/generate_ne_seven_card_high_hand_rankings.py (1055 lines)"}, "properties": {"repobilityId": "6f2c6faa89f8ff08", "scanner": "scanner-primary", "fingerprint": "584844fa63dbae18", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7e356b23255a9079", "level": "note", "message": {"text": "Very large file: src/online_poker/services/player_action_manager.py (1344 lines)"}, "properties": {"repobilityId": "72ba2cc5a0ef9592", "scanner": "scanner-primary", "fingerprint": "7e356b23255a9079", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5100db11720df9bf", "level": "note", "message": {"text": "Very large file: src/online_poker/services/websocket_manager.py (1505 lines)"}, "properties": {"repobilityId": "5068eebeb3ffab8b", "scanner": "scanner-primary", "fingerprint": "5100db11720df9bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2dda95b712720dff", "level": "note", "message": {"text": "Very large file: src/web/server.py (1507 lines)"}, "properties": {"repobilityId": "6362b35e2ee7c18b", "scanner": "scanner-primary", "fingerprint": "2dda95b712720dff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c474705167685dc", "level": "note", "message": {"text": "Very large file: src/generic_poker/game/player_action_handler.py (1640 lines)"}, "properties": {"repobilityId": "39ee7214c5bd05a1", "scanner": "scanner-primary", "fingerprint": "1c474705167685dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8f22f23cf684d8ae", "level": "note", "message": {"text": "Very large file: src/generic_poker/game/game.py (1673 lines)"}, "properties": {"repobilityId": "af11094534d226ba", "scanner": "scanner-primary", "fingerprint": "8f22f23cf684d8ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bbdcaf26872bfed9", "level": "note", "message": {"text": "Very large file: src/generic_poker/game/showdown_manager.py (2978 lines)"}, "properties": {"repobilityId": "7b731a4e4a4dcefa", "scanner": "scanner-primary", "fingerprint": "bbdcaf26872bfed9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b019c52458f36f7f", "level": "note", "message": {"text": "95 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "b019c52458f36f7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "be6fa6048073288d", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-043088ad3f7470bd", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: tests/e2e/package.json"}, "properties": {"repobilityId": "aadcb153dd4f50f3", "scanner": "scanner-primary", "fingerprint": "043088ad3f7470bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tests/e2e/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "cbc805910db54f5c", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "f32b0e0030b47a2b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "fba396416a560cf2", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f0c65e02e69ee3a2", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9dc7a59863ae099c", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "7a7ba1bfa4d381d0", "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": "21fbbbb19e054817", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-3a28ffb82b565401", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/unit/test_hand_description.py:280"}, "properties": {"repobilityId": "20b2fb85f1fa22d3", "scanner": "scanner-primary", "fingerprint": "3a28ffb82b565401", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f865f8c6eee3e3ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/unit/test_grouped_betting.py:617"}, "properties": {"repobilityId": "09b95c50142b9873", "scanner": "scanner-primary", "fingerprint": "f865f8c6eee3e3ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3f8bdd147160dad", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/unit/test_betting_manager.py:50"}, "properties": {"repobilityId": "34cf637e36bbc68c", "scanner": "scanner-primary", "fingerprint": "a3f8bdd147160dad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc7899688113b3ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/unit/test_betting_nl_pl.py:186"}, "properties": {"repobilityId": "6d7334bb4c49395b", "scanner": "scanner-primary", "fingerprint": "cc7899688113b3ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bbdd6a57c8ccf02", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/game/test_stampler.py:193"}, "properties": {"repobilityId": "5c872b4125458664", "scanner": "scanner-primary", "fingerprint": "6bbdd6a57c8ccf02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7908819c429bb985", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/game/test_paradise_road_pickem.py:16"}, "properties": {"repobilityId": "601284a31f1b8eaa", "scanner": "scanner-primary", "fingerprint": "7908819c429bb985", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7e753eb98c1bd2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/game/test_hold_em_edge_cases.py:141"}, "properties": {"repobilityId": "52d1282608c26468", "scanner": "scanner-primary", "fingerprint": "a7e753eb98c1bd2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb339e3a065b8ecd", "level": "none", "message": {"text": "Commented-code block (15 lines) in tests/game/test_mexican_poker.py:353"}, "properties": {"repobilityId": "197860f9e2169be8", "scanner": "scanner-primary", "fingerprint": "eb339e3a065b8ecd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4312b1769a73af18", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/game/test_stumpler.py:193"}, "properties": {"repobilityId": "b63e11dd43956535", "scanner": "scanner-primary", "fingerprint": "4312b1769a73af18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3a0060a3e7ff026", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/game/test_kryky.py:224"}, "properties": {"repobilityId": "3d95dc4cee02713f", "scanner": "scanner-primary", "fingerprint": "a3a0060a3e7ff026", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8da2303c0db5506c", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/game/test_binglaha.py:75"}, "properties": {"repobilityId": "1a787ceef7cc06d3", "scanner": "scanner-primary", "fingerprint": "8da2303c0db5506c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e0027a819a1493b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/admin.js:159"}, "properties": {"repobilityId": "b2af45426f92defc", "scanner": "scanner-primary", "fingerprint": "2e0027a819a1493b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28a5b9c94c155604", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lobby.js:741"}, "properties": {"repobilityId": "b0529a8f51bc8bad", "scanner": "scanner-primary", "fingerprint": "28a5b9c94c155604", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a8f96f435f31888", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 tools/generate_poker_test.py:11"}, "properties": {"repobilityId": "4079154429e2b937", "scanner": "scanner-primary", "fingerprint": "2a8f96f435f31888", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-571efa5875966e6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_high_suit_hand_rankings.py:48"}, "properties": {"repobilityId": "7f02f1d1a3ebce06", "scanner": "scanner-primary", "fingerprint": "571efa5875966e6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46b3faeeac2cd00b", "level": "none", "message": {"text": "Commented-code block (22 lines) in tools/generate_rankings/generate_soko_high_hand_rankings.py:231"}, "properties": {"repobilityId": "42a4ab7bcf536e6b", "scanner": "scanner-primary", "fingerprint": "46b3faeeac2cd00b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68d3e38075581ade", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_low_suit_hand_rankings.py:27"}, "properties": {"repobilityId": "4dd8e07b70028259", "scanner": "scanner-primary", "fingerprint": "68d3e38075581ade", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c55eb7ce9a7b11c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/generate_rankings/generate_49_0_6_21_hands.py:456"}, "properties": {"repobilityId": "f6757b7e1fdf9469", "scanner": "scanner-primary", "fingerprint": "c55eb7ce9a7b11c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6fc887f5d03130d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/web/server.py:42"}, "properties": {"repobilityId": "3d3754ebb7297c88", "scanner": "scanner-primary", "fingerprint": "b6fc887f5d03130d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4478004f93fd0039", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/generic_poker/evaluation/hand_description.py:188"}, "properties": {"repobilityId": "b9bc39455eeae066", "scanner": "scanner-primary", "fingerprint": "4478004f93fd0039", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ef06d618f878fbe", "level": "note", "message": {"text": "Stub function `get_sample_hand` (body is just `pass`/`return`) \u2014 src/generic_poker/evaluation/eval_types/base.py:87"}, "properties": {"repobilityId": "2fa1f8c028ec495e", "scanner": "scanner-primary", "fingerprint": "2ef06d618f878fbe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-7cb6eb8e2429c15a", "level": "note", "message": {"text": "Legacy-named symbol `card_copy` in src/generic_poker/game/showdown_manager.py:2436"}, "properties": {"repobilityId": "c03ce18c8d8045c6", "scanner": "scanner-primary", "fingerprint": "7cb6eb8e2429c15a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5a05a1e7f44cfde6", "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": "a3a2a0ae53ad026a", "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": "7d377357ea201716", "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": "ab3ecf74450d05a6", "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": "118c8b0b4099635c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "61a93adc76f0d90b", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "a49317d637525357", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "c3f70bae2d0e8819", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "e0ca1dc17c78a836", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "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": "29b25029d307e14d", "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": "66e2041cc811d387", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "5425b0983110a965", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "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": "a94a99f2d942294a", "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": "93d3252c544ddc37", "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": "22917bc6fb9b0e0c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "90afb42f33cc1212", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "f65582e39f79044c", "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": "eb1bdce2ff562a41", "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": "92ee5b2f61b08ec0", "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": "102034d6abb1d228", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-18136f7324e9aba7", "level": "error", "message": {"text": "Flask mutation route `login` without `@login_required` \u2014 run_server.py:106"}, "properties": {"repobilityId": "678966a29bbd3dd5", "scanner": "scanner-primary", "fingerprint": "18136f7324e9aba7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "run_server.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-d5f1366ba9eb5983", "level": "error", "message": {"text": "Dangling fetch: GET /admin/api/stats (static/js/admin.js:67)"}, "properties": {"repobilityId": "d23f0df259f43a81", "scanner": "scanner-primary", "fingerprint": "d5f1366ba9eb5983", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6a4c82fcbc462c8", "level": "error", "message": {"text": "Dangling fetch: GET /admin/api/sessions (static/js/admin.js:68)"}, "properties": {"repobilityId": "fcf08baa34930274", "scanner": "scanner-primary", "fingerprint": "e6a4c82fcbc462c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbf2f6de8def78da", "level": "error", "message": {"text": "Dangling fetch: GET /admin/api/users?${params} (static/js/admin.js:159)"}, "properties": {"repobilityId": "7b68195a8a13586a", "scanner": "scanner-primary", "fingerprint": "dbf2f6de8def78da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a7c9a74555599254", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/users/${this._bankrollUserId}/bankroll (static/js/admin.js:234)"}, "properties": {"repobilityId": "88418f6987fb4463", "scanner": "scanner-primary", "fingerprint": "a7c9a74555599254", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea9db92f70c5930b", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/users/${userId}/toggle-active (static/js/admin.js:255)"}, "properties": {"repobilityId": "bd0770aa867f269a", "scanner": "scanner-primary", "fingerprint": "ea9db92f70c5930b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-952b24662fd33e2a", "level": "error", "message": {"text": "Dangling fetch: GET /admin/api/tables (static/js/admin.js:276)"}, "properties": {"repobilityId": "a299d457bfc8aace", "scanner": "scanner-primary", "fingerprint": "952b24662fd33e2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0085dc61a7283f8", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/tables/${tableId}/close (static/js/admin.js:315)"}, "properties": {"repobilityId": "a071413a58afbe5e", "scanner": "scanner-primary", "fingerprint": "f0085dc61a7283f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc9b5599529657c3", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/tables/${tableId}/delete (static/js/admin.js:336)"}, "properties": {"repobilityId": "674bbc610576f0ae", "scanner": "scanner-primary", "fingerprint": "bc9b5599529657c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a628fef9713e8a35", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/tables/purge-all (static/js/admin.js:357)"}, "properties": {"repobilityId": "0d32788e6a3c6c0c", "scanner": "scanner-primary", "fingerprint": "a628fef9713e8a35", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd9d46fd84330867", "level": "error", "message": {"text": "Dangling fetch: GET /admin/api/variants (static/js/admin.js:392)"}, "properties": {"repobilityId": "1cb13eeddfd95521", "scanner": "scanner-primary", "fingerprint": "fd9d46fd84330867", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9f6ef152dedd1d6", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/enable (static/js/admin.js:466)"}, "properties": {"repobilityId": "b571894b2ca2949c", "scanner": "scanner-primary", "fingerprint": "f9f6ef152dedd1d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07fea795361c4ccc", "level": "error", "message": {"text": "Dangling fetch: POST /admin/api/variants/${encodeURIComponent(name)}/disable (static/js/admin.js:503)"}, "properties": {"repobilityId": "1f98817d545f0d9e", "scanner": "scanner-primary", "fingerprint": "07fea795361c4ccc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8bca5505ecea069", "level": "error", "message": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/hand-result (static/js/table.js:451)"}, "properties": {"repobilityId": "547969a463d857db", "scanner": "scanner-primary", "fingerprint": "e8bca5505ecea069", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-572bb3e8fa629f52", "level": "error", "message": {"text": "Dangling fetch: POST /game/sessions/${this.store.tableId}/action (static/js/table.js:1504)"}, "properties": {"repobilityId": "e9505cbd8735234f", "scanner": "scanner-primary", "fingerprint": "572bb3e8fa629f52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04b5dbbd67137711", "level": "error", "message": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/state (static/js/table.js:1536)"}, "properties": {"repobilityId": "2ccc3aa8ec1565fa", "scanner": "scanner-primary", "fingerprint": "04b5dbbd67137711", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed216714a569c7a7", "level": "error", "message": {"text": "Dangling fetch: GET /game/sessions/${this.store.tableId}/actions (static/js/table.js:1553)"}, "properties": {"repobilityId": "4efdfd42b2c94cfc", "scanner": "scanner-primary", "fingerprint": "ed216714a569c7a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa3f3cdfd2f7fee9", "level": "error", "message": {"text": "Dangling fetch: GET /api/games/tables/${this.store.tableId}/hand-history?limit=20 (static/js/table.js:1868)"}, "properties": {"repobilityId": "f30992c53f93e668", "scanner": "scanner-primary", "fingerprint": "fa3f3cdfd2f7fee9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2745ea006565981", "level": "error", "message": {"text": "Dangling fetch: GET /table/variants (static/js/lobby.js:181)"}, "properties": {"repobilityId": "32a28654e54802d3", "scanner": "scanner-primary", "fingerprint": "a2745ea006565981", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c8aaf348e47fb66", "level": "error", "message": {"text": "Dangling fetch: POST /api/tables/${tableId}/leave (static/js/lobby.js:717)"}, "properties": {"repobilityId": "978057bd896d1b6f", "scanner": "scanner-primary", "fingerprint": "3c8aaf348e47fb66", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65812a28f964fa49", "level": "error", "message": {"text": "Dangling fetch: GET /api/tables/${tableId}/seats (static/js/lobby.js:741)"}, "properties": {"repobilityId": "196df8d176346370", "scanner": "scanner-primary", "fingerprint": "65812a28f964fa49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77808522455c98ff", "level": "error", "message": {"text": "Dangling fetch: GET /table/variants/${variantId}/rules (static/js/lobby.js:1292)"}, "properties": {"repobilityId": "807d640f931ee734", "scanner": "scanner-primary", "fingerprint": "77808522455c98ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "302fe621a396c5fd", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c7ad61ba1b23915", "level": "note", "message": {"text": "Unused endpoint: ANY /login"}, "properties": {"repobilityId": "c37ae0c28121c951", "scanner": "scanner-primary", "fingerprint": "4c7ad61ba1b23915", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9e449c3b9e73b73", "level": "note", "message": {"text": "Unused endpoint: ANY /logout"}, "properties": {"repobilityId": "0e730b9e15fd5ba8", "scanner": "scanner-primary", "fingerprint": "c9e449c3b9e73b73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7edb7c2b93e228d2", "level": "note", "message": {"text": "Unused endpoint: ANY /table/<table_id>"}, "properties": {"repobilityId": "3f545889dba2fb2e", "scanner": "scanner-primary", "fingerprint": "7edb7c2b93e228d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90ec5e7babe2ee92", "level": "note", "message": {"text": "Unused endpoint: ANY /lobby"}, "properties": {"repobilityId": "721bb62865446fc4", "scanner": "scanner-primary", "fingerprint": "90ec5e7babe2ee92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e018f279aec06d09", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tables/<table_id>/seats"}, "properties": {"repobilityId": "b1d88ea7c2843d31", "scanner": "scanner-primary", "fingerprint": "e018f279aec06d09", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f62cbf117f1fff0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/action"}, "properties": {"repobilityId": "c1c61adec45aea17", "scanner": "scanner-primary", "fingerprint": "2f62cbf117f1fff0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-435cc7fa6d51d4b6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/test"}, "properties": {"repobilityId": "9e7c43b2ae560f27", "scanner": "scanner-primary", "fingerprint": "435cc7fa6d51d4b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-25dc2ec55ef7f742", "level": "note", "message": {"text": "Unused endpoint: ANY /api/games/sessions/<table_id>/actions"}, "properties": {"repobilityId": "102088c9934f3c90", "scanner": "scanner-primary", "fingerprint": "25dc2ec55ef7f742", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18bb8e2ffb748560", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions"}, "properties": {"repobilityId": "b7d3d66593b7fa5f", "scanner": "scanner-primary", "fingerprint": "18bb8e2ffb748560", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab8ca9cc5b22171d", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>"}, "properties": {"repobilityId": "f55c8ae4e1a98445", "scanner": "scanner-primary", "fingerprint": "ab8ca9cc5b22171d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4125e91ad78e790", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/join"}, "properties": {"repobilityId": "0ffc58a1cc6c1a6f", "scanner": "scanner-primary", "fingerprint": "e4125e91ad78e790", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90003022beaf9cd3", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/leave"}, "properties": {"repobilityId": "63460b86bde58223", "scanner": "scanner-primary", "fingerprint": "90003022beaf9cd3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5a14ade7d95e26a", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/action"}, "properties": {"repobilityId": "e8b6be4300a5943b", "scanner": "scanner-primary", "fingerprint": "a5a14ade7d95e26a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c103797613c850cf", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/disconnect"}, "properties": {"repobilityId": "43b7b29ec6b8d215", "scanner": "scanner-primary", "fingerprint": "c103797613c850cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a6f58455e7d7310", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/reconnect"}, "properties": {"repobilityId": "f68079b1e5f90b76", "scanner": "scanner-primary", "fingerprint": "0a6f58455e7d7310", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b45e064b63184b76", "level": "note", "message": {"text": "Unused endpoint: ANY /stats"}, "properties": {"repobilityId": "a21bdfbf4cca5222", "scanner": "scanner-primary", "fingerprint": "b45e064b63184b76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b02edb248c589ad0", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/info"}, "properties": {"repobilityId": "c1db0bf56183da81", "scanner": "scanner-primary", "fingerprint": "b02edb248c589ad0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5747c5d993e9570b", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/players/<user_id>"}, "properties": {"repobilityId": "1a1f1fee5db43852", "scanner": "scanner-primary", "fingerprint": "5747c5d993e9570b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57900bdf1453d7aa", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/validate-buyin"}, "properties": {"repobilityId": "6e683a0bc2e1f18e", "scanner": "scanner-primary", "fingerprint": "57900bdf1453d7aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-341bc6d36416afaf", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions"}, "properties": {"repobilityId": "26abb3add15f9199", "scanner": "scanner-primary", "fingerprint": "341bc6d36416afaf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-beaa8d13c5e86789", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions/validate"}, "properties": {"repobilityId": "e7e20d47ed7585b7", "scanner": "scanner-primary", "fingerprint": "beaa8d13c5e86789", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e966d29b6806da2", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/actions/history"}, "properties": {"repobilityId": "21a9ab46a72eb9d0", "scanner": "scanner-primary", "fingerprint": "3e966d29b6806da2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a92bf495bfc0ec3e", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/state"}, "properties": {"repobilityId": "ee57986760f39dcc", "scanner": "scanner-primary", "fingerprint": "a92bf495bfc0ec3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-112fad52d74237c1", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/state/updates"}, "properties": {"repobilityId": "5b187db8789b875d", "scanner": "scanner-primary", "fingerprint": "112fad52d74237c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84e41c2e65a99e72", "level": "note", "message": {"text": "Unused endpoint: ANY /sessions/<table_id>/hand-result"}, "properties": {"repobilityId": "72ae43df45350123", "scanner": "scanner-primary", "fingerprint": "84e41c2e65a99e72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-121a6c79c20fee52", "level": "note", "message": {"text": "Unused endpoint: ANY /tables/<table_id>/hand-history"}, "properties": {"repobilityId": "7e6302f221ebc926", "scanner": "scanner-primary", "fingerprint": "121a6c79c20fee52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65b71f5ac415850c", "level": "note", "message": {"text": "Unused endpoint: ANY /cleanup"}, "properties": {"repobilityId": "d42d0f597628121a", "scanner": "scanner-primary", "fingerprint": "65b71f5ac415850c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df9f60161f767fce", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tables/<table_id>/join"}, "properties": {"repobilityId": "59fa7665a968cb38", "scanner": "scanner-primary", "fingerprint": "df9f60161f767fce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4df42ff15220fd74", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tables/<table_id>/leave"}, "properties": {"repobilityId": "9aefa102a0b44bea", "scanner": "scanner-primary", "fingerprint": "4df42ff15220fd74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-404d253e1ba0e93d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tables/private/join"}, "properties": {"repobilityId": "0994bdc719fa3585", "scanner": "scanner-primary", "fingerprint": "404d253e1ba0e93d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2daf08b841143a7a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tables/<table_id>/spectate"}, "properties": {"repobilityId": "2096bb0c77360347", "scanner": "scanner-primary", "fingerprint": "2daf08b841143a7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed2cb1702f1f600d", "level": "note", "message": {"text": "Unused endpoint: ANY /register"}, "properties": {"repobilityId": "77a87dcdd2f7b8a7", "scanner": "scanner-primary", "fingerprint": "ed2cb1702f1f600d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e0f95cb102ce3d3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/register"}, "properties": {"repobilityId": "9ea370c5f85cdc30", "scanner": "scanner-primary", "fingerprint": "7e0f95cb102ce3d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cee1b1903574e9ca", "level": "note", "message": {"text": "Unused endpoint: ANY /api/login"}, "properties": {"repobilityId": "68a7b7359fc2ea37", "scanner": "scanner-primary", "fingerprint": "cee1b1903574e9ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c60a66fb2a1dff2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/logout"}, "properties": {"repobilityId": "d6868a03ed1f781b", "scanner": "scanner-primary", "fingerprint": "8c60a66fb2a1dff2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b75682f8c28684f8", "level": "note", "message": {"text": "Unused endpoint: ANY /me"}, "properties": {"repobilityId": "ece2f66fab5d2553", "scanner": "scanner-primary", "fingerprint": "b75682f8c28684f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71610025521f929d", "level": "note", "message": {"text": "Unused endpoint: ANY /refresh"}, "properties": {"repobilityId": "ead66417aebae0e7", "scanner": "scanner-primary", "fingerprint": "71610025521f929d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-22aeb6f2f86ee26a", "level": "note", "message": {"text": "Unused endpoint: ANY /forgot-password"}, "properties": {"repobilityId": "905894e10f11bc1d", "scanner": "scanner-primary", "fingerprint": "22aeb6f2f86ee26a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7bcc7a57e742d03e", "level": "note", "message": {"text": "Unused endpoint: ANY /reset-password"}, "properties": {"repobilityId": "28400d91764fe934", "scanner": "scanner-primary", "fingerprint": "7bcc7a57e742d03e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd3a097eb21f99ae", "level": "note", "message": {"text": "Unused endpoint: ANY /check-auth"}, "properties": {"repobilityId": "44a031f75bdcdf8a", "scanner": "scanner-primary", "fingerprint": "fd3a097eb21f99ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac5fac29a67f4312", "level": "note", "message": {"text": "Unused endpoint: ANY /validate-session"}, "properties": {"repobilityId": "6ce9c34528a2263e", "scanner": "scanner-primary", "fingerprint": "ac5fac29a67f4312", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-844f255ceef7cc7d", "level": "note", "message": {"text": "Unused endpoint: ANY /users"}, "properties": {"repobilityId": "6ca870817f78c96c", "scanner": "scanner-primary", "fingerprint": "844f255ceef7cc7d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a945917bc56c5e98", "level": "note", "message": {"text": "Unused endpoint: ANY /tables"}, "properties": {"repobilityId": "f5c07fa30b61e26b", "scanner": "scanner-primary", "fingerprint": "a945917bc56c5e98", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f22d5b985dfb706", "level": "note", "message": {"text": "Unused endpoint: ANY /variants"}, "properties": {"repobilityId": "6a27d14a3e91a635", "scanner": "scanner-primary", "fingerprint": "7f22d5b985dfb706", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec3442aa0b6ba39d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/stats"}, "properties": {"repobilityId": "a8b7ecd9ca0d6172", "scanner": "scanner-primary", "fingerprint": "ec3442aa0b6ba39d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-916d42aea8f4a3f8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sessions"}, "properties": {"repobilityId": "4602b8eba992503d", "scanner": "scanner-primary", "fingerprint": "916d42aea8f4a3f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33de9c10cc501140", "level": "note", "message": {"text": "Unused endpoint: ANY /api/users"}, "properties": {"repobilityId": "08f640bc48c23701", "scanner": "scanner-primary", "fingerprint": "33de9c10cc501140", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2145c4e1de5f745", "level": "note", "message": {"text": "Unused endpoint: ANY /api/users/<user_id>"}, "properties": {"repobilityId": "0c22e87c0f8f5749", "scanner": "scanner-primary", "fingerprint": "f2145c4e1de5f745", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7969d804fce0b299", "level": "note", "message": {"text": "Unused endpoint: ANY /api/users/<user_id>/bankroll"}, "properties": {"repobilityId": "ed6c8365d3f4b4f8", "scanner": "scanner-primary", "fingerprint": "7969d804fce0b299", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}