{"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-8bba36b084020861", "name": "Possibly dead Python function: set_player_names", "shortDescription": {"text": "Possibly dead Python function: set_player_names"}, "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-c55f68ebcbbb885f", "name": "Possibly dead Python function: mid_dist", "shortDescription": {"text": "Possibly dead Python function: mid_dist"}, "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-f006bcfc780980fb", "name": "Possibly dead Python function: describe", "shortDescription": {"text": "Possibly dead Python function: describe"}, "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-dc747b47b8437945", "name": "Possibly dead Python function: is_opened", "shortDescription": {"text": "Possibly dead Python function: is_opened"}, "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-598f2553aaabdb4b", "name": "Possibly dead Python function: clahe_loader", "shortDescription": {"text": "Possibly dead Python function: clahe_loader"}, "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-98e00ce851667795", "name": "Possibly dead Python function: predict_display", "shortDescription": {"text": "Possibly dead Python function: predict_display"}, "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-4a1d556c569b49b3", "name": "Possibly dead Python function: status_lines", "shortDescription": {"text": "Possibly dead Python function: status_lines"}, "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-45b55db74a6f3b7e", "name": "Possibly dead Python function: predict_display", "shortDescription": {"text": "Possibly dead Python function: predict_display"}, "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-5df459acc20f7eef", "name": "Possibly dead Python function: count_pips", "shortDescription": {"text": "Possibly dead Python function: count_pips"}, "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-d49df2031f201976", "name": "Possibly dead Python function: transform_pts", "shortDescription": {"text": "Possibly dead Python function: transform_pts"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 51 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 628 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96ba546bfb7c7037", "name": "Commented-code block (8 lines) in eval_harness.py:407", "shortDescription": {"text": "Commented-code block (8 lines) in eval_harness.py:407"}, "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-916270ea1d86bdf7", "name": "Commented-code block (9 lines) in dice_tracker.py:68", "shortDescription": {"text": "Commented-code block (9 lines) in dice_tracker.py:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2c4e2660fabc503", "name": "Commented-code block (6 lines) in d16_geometry.py:199", "shortDescription": {"text": "Commented-code block (6 lines) in d16_geometry.py:199"}, "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-987b06f3eeb79421", "name": "Commented-code block (5 lines) in archive/legacy_rule_based_detector/detect_dice.py:155", "shortDescription": {"text": "Commented-code block (5 lines) in archive/legacy_rule_based_detector/detect_dice.py:155"}, "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-bf7e7987bd2d7871", "name": "Commented-code block (5 lines) in training/live_detect_settle.py:239", "shortDescription": {"text": "Commented-code block (5 lines) in training/live_detect_settle.py:239"}, "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-8aef94bbbd2a9b6a", "name": "Commented-code block (5 lines) in training/train_all.py:79", "shortDescription": {"text": "Commented-code block (5 lines) in training/train_all.py:79"}, "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-dbfdafb78a1f0905", "name": "Commented-code block (5 lines) in training/analyze_recording.py:77", "shortDescription": {"text": "Commented-code block (5 lines) in training/analyze_recording.py:77"}, "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-bf9457affd573d89", "name": "Commented-code block (6 lines) in training/crop_common.py:46", "shortDescription": {"text": "Commented-code block (6 lines) in training/crop_common.py:46"}, "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-c2d141620d4edd7e", "name": "Commented-code block (6 lines) in training/synth_dice.py:82", "shortDescription": {"text": "Commented-code block (6 lines) in training/synth_dice.py:82"}, "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-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:\ncalibrate_tray_roi.py:on_mouse, archive/legacy_rule_based_detector/calibrate_tray_roi.py:on_mouse\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:\nd16_geometry.py:find, training/derive_d16_adjacency.py:find, training/synth_dice.py:find\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-5b1aa461d3bc4a78", "name": "FastAPI POST `api_dice_type` without auth dependency \u2014 webapp.py:491", "shortDescription": {"text": "FastAPI POST `api_dice_type` without auth dependency \u2014 webapp.py:491"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ac167b15b2309fde", "name": "FastAPI POST `api_player` without auth dependency \u2014 webapp.py:499", "shortDescription": {"text": "FastAPI POST `api_player` without auth dependency \u2014 webapp.py:499"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7192253ec9b74a9f", "name": "FastAPI POST `api_action` without auth dependency \u2014 webapp.py:511", "shortDescription": {"text": "FastAPI POST `api_action` without auth dependency \u2014 webapp.py:511"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0756611cf6b37e7", "name": "FastAPI POST `api_align_confirm` without auth dependency \u2014 webapp.py:566", "shortDescription": {"text": "FastAPI POST `api_align_confirm` without auth dependency \u2014 webapp.py:566"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37f0723757164019", "name": "FastAPI POST `roll_edit` without auth dependency \u2014 webapp.py:683", "shortDescription": {"text": "FastAPI POST `roll_edit` without auth dependency \u2014 webapp.py:683"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf043e7731008646", "name": "FastAPI POST `roll_delete` without auth dependency \u2014 webapp.py:696", "shortDescription": {"text": "FastAPI POST `roll_delete` without auth dependency \u2014 webapp.py:696"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`webapp.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-f28b8c840c6114ba", "name": "Unused endpoint: POST /api/dice_type", "shortDescription": {"text": "Unused endpoint: POST /api/dice_type"}, "fullDescription": {"text": "`webapp.py` declares `POST /api/dice_type` 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-405c343a2f3f7ad1", "name": "Unused endpoint: POST /api/player", "shortDescription": {"text": "Unused endpoint: POST /api/player"}, "fullDescription": {"text": "`webapp.py` declares `POST /api/player` 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-963710f42a2c8219", "name": "Unused endpoint: GET /api/status", "shortDescription": {"text": "Unused endpoint: GET /api/status"}, "fullDescription": {"text": "`webapp.py` declares `GET /api/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a10a1ec0d0e7530d", "name": "Unused endpoint: POST /api/action", "shortDescription": {"text": "Unused endpoint: POST /api/action"}, "fullDescription": {"text": "`webapp.py` declares `POST /api/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-c178268666276f66", "name": "Unused endpoint: GET /stream.mjpg", "shortDescription": {"text": "Unused endpoint: GET /stream.mjpg"}, "fullDescription": {"text": "`webapp.py` declares `GET /stream.mjpg` 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-f1da7b2144f85d47", "name": "Unused endpoint: ANY /align", "shortDescription": {"text": "Unused endpoint: ANY /align"}, "fullDescription": {"text": "`webapp.py` declares `ANY /align` 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-772c20aa4aa63874", "name": "Unused endpoint: POST /api/align_confirm", "shortDescription": {"text": "Unused endpoint: POST /api/align_confirm"}, "fullDescription": {"text": "`webapp.py` declares `POST /api/align_confirm` 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-ad94c5e8be7d3bd1", "name": "Unused endpoint: ANY /games", "shortDescription": {"text": "Unused endpoint: ANY /games"}, "fullDescription": {"text": "`webapp.py` declares `ANY /games` 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-f00954e12647509d", "name": "Unused endpoint: ANY /games/<int:game_id>", "shortDescription": {"text": "Unused endpoint: ANY /games/<int:game_id>"}, "fullDescription": {"text": "`webapp.py` declares `ANY /games/<int:game_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-6d51c6feed45b0cd", "name": "Unused endpoint: GET /api/games/<int:game_id>/roll_count", "shortDescription": {"text": "Unused endpoint: GET /api/games/<int:game_id>/roll_count"}, "fullDescription": {"text": "`webapp.py` declares `GET /api/games/<int:game_id>/roll_count` 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-65b500be302afdea", "name": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/edit", "shortDescription": {"text": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/edit"}, "fullDescription": {"text": "`webapp.py` declares `POST /games/<int:game_id>/rolls/<int:roll_id>/edit` 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-e9d2f9e78255cc6f", "name": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/delete", "shortDescription": {"text": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/delete"}, "fullDescription": {"text": "`webapp.py` declares `POST /games/<int:game_id>/rolls/<int:roll_id>/delete` 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-d1931f7da34f1608", "name": "Unused endpoint: GET /games/<int:game_id>/export.csv", "shortDescription": {"text": "Unused endpoint: GET /games/<int:game_id>/export.csv"}, "fullDescription": {"text": "`webapp.py` declares `GET /games/<int:game_id>/export.csv` 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/19311"}, "properties": {"repository": "Sevcav/dice-tracker", "repoUrl": "https://github.com/Sevcav/dice-tracker", "branch": "main"}, "results": [{"ruleId": "scanner-8bba36b084020861", "level": "note", "message": {"text": "Possibly dead Python function: set_player_names"}, "properties": {"repobilityId": "f37fa07593f4b1a9", "scanner": "scanner-primary", "fingerprint": "8bba36b084020861", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "db.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c55f68ebcbbb885f", "level": "note", "message": {"text": "Possibly dead Python function: mid_dist"}, "properties": {"repobilityId": "48925ad798bf06cc", "scanner": "scanner-primary", "fingerprint": "c55f68ebcbbb885f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "d16_geometry.py:182"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f006bcfc780980fb", "level": "note", "message": {"text": "Possibly dead Python function: describe"}, "properties": {"repobilityId": "031a29a46186597a", "scanner": "scanner-primary", "fingerprint": "f006bcfc780980fb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/classify_die_type.py:160"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc747b47b8437945", "level": "note", "message": {"text": "Possibly dead Python function: is_opened"}, "properties": {"repobilityId": "a3255607b68c971f", "scanner": "scanner-primary", "fingerprint": "dc747b47b8437945", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/camera.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-598f2553aaabdb4b", "level": "note", "message": {"text": "Possibly dead Python function: clahe_loader"}, "properties": {"repobilityId": "fbd3e2b4e748a4b6", "scanner": "scanner-primary", "fingerprint": "598f2553aaabdb4b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/train_block_dice.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98e00ce851667795", "level": "note", "message": {"text": "Possibly dead Python function: predict_display"}, "properties": {"repobilityId": "e670634ff033cb38", "scanner": "scanner-primary", "fingerprint": "98e00ce851667795", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/block_dice_classifier_onnx.py:97"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a1d556c569b49b3", "level": "note", "message": {"text": "Possibly dead Python function: status_lines"}, "properties": {"repobilityId": "7d371accd6547d70", "scanner": "scanner-primary", "fingerprint": "4a1d556c569b49b3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/state.py:363"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45b55db74a6f3b7e", "level": "note", "message": {"text": "Possibly dead Python function: predict_display"}, "properties": {"repobilityId": "e670634ff033cb38", "scanner": "scanner-primary", "fingerprint": "45b55db74a6f3b7e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/block_dice_classifier.py:114"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5df459acc20f7eef", "level": "note", "message": {"text": "Possibly dead Python function: count_pips"}, "properties": {"repobilityId": "cce08a444b03ae6e", "scanner": "scanner-primary", "fingerprint": "5df459acc20f7eef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/legacy_rule_based_detector/reading/read_numbered.py:152"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d49df2031f201976", "level": "note", "message": {"text": "Possibly dead Python function: transform_pts"}, "properties": {"repobilityId": "7b232c3f4f9d5cdd", "scanner": "scanner-primary", "fingerprint": "d49df2031f201976", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "training/synth_dice.py:117"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-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-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "f63ed4068052033d", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "7e9dafa06a42e1db", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "00986f1c7e53caf4", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "4aeefcd68ed8923a", "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": "63bde92fa2f585b9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-96ba546bfb7c7037", "level": "none", "message": {"text": "Commented-code block (8 lines) in eval_harness.py:407"}, "properties": {"repobilityId": "6114312c7200a6ec", "scanner": "scanner-primary", "fingerprint": "96ba546bfb7c7037", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-916270ea1d86bdf7", "level": "none", "message": {"text": "Commented-code block (9 lines) in dice_tracker.py:68"}, "properties": {"repobilityId": "92cedcb9777c0394", "scanner": "scanner-primary", "fingerprint": "916270ea1d86bdf7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2c4e2660fabc503", "level": "none", "message": {"text": "Commented-code block (6 lines) in d16_geometry.py:199"}, "properties": {"repobilityId": "f24c19a145dde4ed", "scanner": "scanner-primary", "fingerprint": "f2c4e2660fabc503", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-987b06f3eeb79421", "level": "none", "message": {"text": "Commented-code block (5 lines) in archive/legacy_rule_based_detector/detect_dice.py:155"}, "properties": {"repobilityId": "03e951d0ef421dfb", "scanner": "scanner-primary", "fingerprint": "987b06f3eeb79421", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf7e7987bd2d7871", "level": "none", "message": {"text": "Commented-code block (5 lines) in training/live_detect_settle.py:239"}, "properties": {"repobilityId": "d4eb4f62fa5500be", "scanner": "scanner-primary", "fingerprint": "bf7e7987bd2d7871", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aef94bbbd2a9b6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in training/train_all.py:79"}, "properties": {"repobilityId": "426f3d1aa1f5800b", "scanner": "scanner-primary", "fingerprint": "8aef94bbbd2a9b6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbfdafb78a1f0905", "level": "none", "message": {"text": "Commented-code block (5 lines) in training/analyze_recording.py:77"}, "properties": {"repobilityId": "27c81d23a4007617", "scanner": "scanner-primary", "fingerprint": "dbfdafb78a1f0905", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf9457affd573d89", "level": "none", "message": {"text": "Commented-code block (6 lines) in training/crop_common.py:46"}, "properties": {"repobilityId": "ba579036b82f8292", "scanner": "scanner-primary", "fingerprint": "bf9457affd573d89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2d141620d4edd7e", "level": "none", "message": {"text": "Commented-code block (6 lines) in training/synth_dice.py:82"}, "properties": {"repobilityId": "c229015467b82229", "scanner": "scanner-primary", "fingerprint": "c2d141620d4edd7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0d8129e92932d7a4", "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": "d97a26d7a335386e", "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": "d74eeb7f1e3dd42f", "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": "8755ee4c066bc7d5", "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": "d7dba075359fc702", "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": "8f21c7995d0f1b05", "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": "4ab19d5b0670358c", "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": "62990461f219ae23", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "112e63a3b040fe28", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6b8496d134a06243", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-5b1aa461d3bc4a78", "level": "error", "message": {"text": "FastAPI POST `api_dice_type` without auth dependency \u2014 webapp.py:491"}, "properties": {"repobilityId": "425e369779bd6048", "scanner": "scanner-primary", "fingerprint": "5b1aa461d3bc4a78", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 491}}}]}, {"ruleId": "scanner-ac167b15b2309fde", "level": "error", "message": {"text": "FastAPI POST `api_player` without auth dependency \u2014 webapp.py:499"}, "properties": {"repobilityId": "636bbfd0266709ee", "scanner": "scanner-primary", "fingerprint": "ac167b15b2309fde", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 499}}}]}, {"ruleId": "scanner-7192253ec9b74a9f", "level": "error", "message": {"text": "FastAPI POST `api_action` without auth dependency \u2014 webapp.py:511"}, "properties": {"repobilityId": "139c7ae348bf151b", "scanner": "scanner-primary", "fingerprint": "7192253ec9b74a9f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 511}}}]}, {"ruleId": "scanner-b0756611cf6b37e7", "level": "error", "message": {"text": "FastAPI POST `api_align_confirm` without auth dependency \u2014 webapp.py:566"}, "properties": {"repobilityId": "69e1f682ee577db2", "scanner": "scanner-primary", "fingerprint": "b0756611cf6b37e7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 566}}}]}, {"ruleId": "scanner-37f0723757164019", "level": "error", "message": {"text": "FastAPI POST `roll_edit` without auth dependency \u2014 webapp.py:683"}, "properties": {"repobilityId": "db52d2876eebca44", "scanner": "scanner-primary", "fingerprint": "37f0723757164019", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 683}}}]}, {"ruleId": "scanner-cf043e7731008646", "level": "error", "message": {"text": "FastAPI POST `roll_delete` without auth dependency \u2014 webapp.py:696"}, "properties": {"repobilityId": "00b75a0749005f0b", "scanner": "scanner-primary", "fingerprint": "cf043e7731008646", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp.py"}, "region": {"startLine": 696}}}]}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "366351d465cb3889", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f28b8c840c6114ba", "level": "note", "message": {"text": "Unused endpoint: POST /api/dice_type"}, "properties": {"repobilityId": "5fb199b3c0ede0f6", "scanner": "scanner-primary", "fingerprint": "f28b8c840c6114ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-405c343a2f3f7ad1", "level": "note", "message": {"text": "Unused endpoint: POST /api/player"}, "properties": {"repobilityId": "898d0884c04e9249", "scanner": "scanner-primary", "fingerprint": "405c343a2f3f7ad1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-963710f42a2c8219", "level": "note", "message": {"text": "Unused endpoint: GET /api/status"}, "properties": {"repobilityId": "a5680781ee435d16", "scanner": "scanner-primary", "fingerprint": "963710f42a2c8219", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a10a1ec0d0e7530d", "level": "note", "message": {"text": "Unused endpoint: POST /api/action"}, "properties": {"repobilityId": "6d5109e08812cbe7", "scanner": "scanner-primary", "fingerprint": "a10a1ec0d0e7530d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c178268666276f66", "level": "note", "message": {"text": "Unused endpoint: GET /stream.mjpg"}, "properties": {"repobilityId": "ed63de5b8cf5c3ec", "scanner": "scanner-primary", "fingerprint": "c178268666276f66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1da7b2144f85d47", "level": "note", "message": {"text": "Unused endpoint: ANY /align"}, "properties": {"repobilityId": "3287d23efa637b65", "scanner": "scanner-primary", "fingerprint": "f1da7b2144f85d47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-772c20aa4aa63874", "level": "note", "message": {"text": "Unused endpoint: POST /api/align_confirm"}, "properties": {"repobilityId": "aed03eb776fb94af", "scanner": "scanner-primary", "fingerprint": "772c20aa4aa63874", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad94c5e8be7d3bd1", "level": "note", "message": {"text": "Unused endpoint: ANY /games"}, "properties": {"repobilityId": "97c3dc6198abce86", "scanner": "scanner-primary", "fingerprint": "ad94c5e8be7d3bd1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f00954e12647509d", "level": "note", "message": {"text": "Unused endpoint: ANY /games/<int:game_id>"}, "properties": {"repobilityId": "f69aa5cee9b6003b", "scanner": "scanner-primary", "fingerprint": "f00954e12647509d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d51c6feed45b0cd", "level": "note", "message": {"text": "Unused endpoint: GET /api/games/<int:game_id>/roll_count"}, "properties": {"repobilityId": "5e7d5b84820abd24", "scanner": "scanner-primary", "fingerprint": "6d51c6feed45b0cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65b500be302afdea", "level": "note", "message": {"text": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/edit"}, "properties": {"repobilityId": "4f9d6ce966ed560a", "scanner": "scanner-primary", "fingerprint": "65b500be302afdea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9d2f9e78255cc6f", "level": "note", "message": {"text": "Unused endpoint: POST /games/<int:game_id>/rolls/<int:roll_id>/delete"}, "properties": {"repobilityId": "f31e41cd9edfbb88", "scanner": "scanner-primary", "fingerprint": "e9d2f9e78255cc6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1931f7da34f1608", "level": "note", "message": {"text": "Unused endpoint: GET /games/<int:game_id>/export.csv"}, "properties": {"repobilityId": "6674640d77a59b70", "scanner": "scanner-primary", "fingerprint": "d1931f7da34f1608", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}