{"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-6a8e6a7fc81fecdf", "name": "Possibly dead Python function: save_current_as_default", "shortDescription": {"text": "Possibly dead Python function: save_current_as_default"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4043ce07b80133dd", "name": "Possibly dead Python function: load_mode_resources", "shortDescription": {"text": "Possibly dead Python function: load_mode_resources"}, "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-11e15aff9d7f037a", "name": "Possibly dead Python function: finish_loading_mode", "shortDescription": {"text": "Possibly dead Python function: finish_loading_mode"}, "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-270ba4ee4fba32de", "name": "Possibly dead Python function: fail_loading_mode", "shortDescription": {"text": "Possibly dead Python function: fail_loading_mode"}, "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-cfc2f284b42fa621", "name": "Possibly dead Python function: capture_audio_loop", "shortDescription": {"text": "Possibly dead Python function: capture_audio_loop"}, "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-cc3fec94bd869a42", "name": "Possibly dead Python function: process_audio", "shortDescription": {"text": "Possibly dead Python function: process_audio"}, "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-681a4fff70769d9f", "name": "Possibly dead Python function: after_no_audio", "shortDescription": {"text": "Possibly dead Python function: after_no_audio"}, "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-8bcfe98ba64a7677", "name": "Possibly dead Python function: after_transcription_success", "shortDescription": {"text": "Possibly dead Python function: after_transcription_success"}, "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-4764cd550db79183", "name": "Possibly dead Python function: after_transcription_error", "shortDescription": {"text": "Possibly dead Python function: after_transcription_error"}, "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-520df73fd317c80c", "name": "Possibly dead Python function: handle_capture_failure", "shortDescription": {"text": "Possibly dead Python function: handle_capture_failure"}, "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-fd8f91eff58e3a54", "name": "Possibly dead Python function: refresh_models", "shortDescription": {"text": "Possibly dead Python function: refresh_models"}, "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-0c96dcb6de434464", "name": "Possibly dead Python function: refresh_models_worker", "shortDescription": {"text": "Possibly dead Python function: refresh_models_worker"}, "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-94d0f9419044cbe2", "name": "Possibly dead Python function: finish_refresh_models", "shortDescription": {"text": "Possibly dead Python function: finish_refresh_models"}, "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-6c20706d990b13d8", "name": "Possibly dead Python function: fail_refresh_models", "shortDescription": {"text": "Possibly dead Python function: fail_refresh_models"}, "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-f5873adc15546449", "name": "Possibly dead Python function: copy_customer_comment", "shortDescription": {"text": "Possibly dead Python function: copy_customer_comment"}, "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-6f1a73ef15b602d4", "name": "Possibly dead Python function: copy_internal_note", "shortDescription": {"text": "Possibly dead Python function: copy_internal_note"}, "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-f5c69eccafe56522", "name": "Possibly dead Python function: clear_jira_notes", "shortDescription": {"text": "Possibly dead Python function: clear_jira_notes"}, "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-899a8f92ee8dd143", "name": "Possibly dead Python function: generate_jira_from_notes", "shortDescription": {"text": "Possibly dead Python function: generate_jira_from_notes"}, "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-bad44a0b373a8cf5", "name": "Possibly dead Python function: generate_jira_worker", "shortDescription": {"text": "Possibly dead Python function: generate_jira_worker"}, "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-e75da51492379e66", "name": "Possibly dead Python function: finish_generate_jira", "shortDescription": {"text": "Possibly dead Python function: finish_generate_jira"}, "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-cad92232375817c6", "name": "Possibly dead Python function: fail_generate_jira", "shortDescription": {"text": "Possibly dead Python function: fail_generate_jira"}, "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-18fa5bb800abac80", "name": "Possibly dead Python function: toggle_jira_mode", "shortDescription": {"text": "Possibly dead Python function: toggle_jira_mode"}, "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-506be2b95088f5d3", "name": "git log failed \u2014 history analysis incomplete", "shortDescription": {"text": "git log failed \u2014 history analysis incomplete"}, "fullDescription": {"text": "fatal: not a git repository (or any parent up to mount point /data)\nStopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "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-6d075ec4c8c5670f", "name": "Very large file: bananaphone_v2.py (2130 lines)", "shortDescription": {"text": "Very large file: bananaphone_v2.py (2130 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 2 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "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: ci, tests. 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-83598492a7324845", "name": "Legacy-named symbol `bananaphone_v2` in bananaphone_v2.py:30", "shortDescription": {"text": "Legacy-named symbol `bananaphone_v2` in bananaphone_v2.py:30"}, "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-831d11082b85af22", "name": "Commented-code block (5 lines) in bananaphone_v2.py:835", "shortDescription": {"text": "Commented-code block (5 lines) in bananaphone_v2.py:835"}, "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:\nbananafone.py:setup_bindings, bananaphone_v2.py:setup_bindings\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}}]}}, "automationDetails": {"id": "repobility/4892"}, "properties": {"repository": "cascodigital/bananaphone_v2", "repoUrl": "https://github.com/cascodigital/bananaphone_v2", "branch": "main"}, "results": [{"ruleId": "scanner-6a8e6a7fc81fecdf", "level": "note", "message": {"text": "Possibly dead Python function: save_current_as_default"}, "properties": {"repobilityId": "925335c9390451bb", "scanner": "scanner-primary", "fingerprint": "6a8e6a7fc81fecdf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:464"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4043ce07b80133dd", "level": "note", "message": {"text": "Possibly dead Python function: load_mode_resources"}, "properties": {"repobilityId": "388ed11f0caef4db", "scanner": "scanner-primary", "fingerprint": "4043ce07b80133dd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:487"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-11e15aff9d7f037a", "level": "note", "message": {"text": "Possibly dead Python function: finish_loading_mode"}, "properties": {"repobilityId": "aef37628cc27f6a9", "scanner": "scanner-primary", "fingerprint": "11e15aff9d7f037a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:520"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-270ba4ee4fba32de", "level": "note", "message": {"text": "Possibly dead Python function: fail_loading_mode"}, "properties": {"repobilityId": "cdd8f5041dde8137", "scanner": "scanner-primary", "fingerprint": "270ba4ee4fba32de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:529"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cfc2f284b42fa621", "level": "note", "message": {"text": "Possibly dead Python function: capture_audio_loop"}, "properties": {"repobilityId": "87a9b6243753d7ad", "scanner": "scanner-primary", "fingerprint": "cfc2f284b42fa621", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:596"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc3fec94bd869a42", "level": "note", "message": {"text": "Possibly dead Python function: process_audio"}, "properties": {"repobilityId": "96920884d26cde01", "scanner": "scanner-primary", "fingerprint": "cc3fec94bd869a42", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:627"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-681a4fff70769d9f", "level": "note", "message": {"text": "Possibly dead Python function: after_no_audio"}, "properties": {"repobilityId": "f324549a63d3cce8", "scanner": "scanner-primary", "fingerprint": "681a4fff70769d9f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:660"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8bcfe98ba64a7677", "level": "note", "message": {"text": "Possibly dead Python function: after_transcription_success"}, "properties": {"repobilityId": "fde53dda765c95c8", "scanner": "scanner-primary", "fingerprint": "8bcfe98ba64a7677", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:665"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4764cd550db79183", "level": "note", "message": {"text": "Possibly dead Python function: after_transcription_error"}, "properties": {"repobilityId": "b46ee384a56f987b", "scanner": "scanner-primary", "fingerprint": "4764cd550db79183", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:676"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-520df73fd317c80c", "level": "note", "message": {"text": "Possibly dead Python function: handle_capture_failure"}, "properties": {"repobilityId": "88d317dddb230f40", "scanner": "scanner-primary", "fingerprint": "520df73fd317c80c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:681"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fd8f91eff58e3a54", "level": "note", "message": {"text": "Possibly dead Python function: refresh_models"}, "properties": {"repobilityId": "c01e5c24a2138d2d", "scanner": "scanner-primary", "fingerprint": "fd8f91eff58e3a54", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:701"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0c96dcb6de434464", "level": "note", "message": {"text": "Possibly dead Python function: refresh_models_worker"}, "properties": {"repobilityId": "da947ab396f337d2", "scanner": "scanner-primary", "fingerprint": "0c96dcb6de434464", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:710"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-94d0f9419044cbe2", "level": "note", "message": {"text": "Possibly dead Python function: finish_refresh_models"}, "properties": {"repobilityId": "5fc639d309e75c8e", "scanner": "scanner-primary", "fingerprint": "94d0f9419044cbe2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:900"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6c20706d990b13d8", "level": "note", "message": {"text": "Possibly dead Python function: fail_refresh_models"}, "properties": {"repobilityId": "11ea2ac3eae4a496", "scanner": "scanner-primary", "fingerprint": "6c20706d990b13d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananafone.py:907"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f5873adc15546449", "level": "note", "message": {"text": "Possibly dead Python function: copy_customer_comment"}, "properties": {"repobilityId": "9ce470a97a7ad55b", "scanner": "scanner-primary", "fingerprint": "f5873adc15546449", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:645"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f1a73ef15b602d4", "level": "note", "message": {"text": "Possibly dead Python function: copy_internal_note"}, "properties": {"repobilityId": "f5317da0d0effd67", "scanner": "scanner-primary", "fingerprint": "6f1a73ef15b602d4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:651"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f5c69eccafe56522", "level": "note", "message": {"text": "Possibly dead Python function: clear_jira_notes"}, "properties": {"repobilityId": "fa577cc466e60ef0", "scanner": "scanner-primary", "fingerprint": "f5c69eccafe56522", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:657"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-899a8f92ee8dd143", "level": "note", "message": {"text": "Possibly dead Python function: generate_jira_from_notes"}, "properties": {"repobilityId": "9ff635becb4c37a1", "scanner": "scanner-primary", "fingerprint": "899a8f92ee8dd143", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:672"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bad44a0b373a8cf5", "level": "note", "message": {"text": "Possibly dead Python function: generate_jira_worker"}, "properties": {"repobilityId": "45c1c9455937d0de", "scanner": "scanner-primary", "fingerprint": "bad44a0b373a8cf5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:689"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e75da51492379e66", "level": "note", "message": {"text": "Possibly dead Python function: finish_generate_jira"}, "properties": {"repobilityId": "2ff51746afaf0b12", "scanner": "scanner-primary", "fingerprint": "e75da51492379e66", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:704"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cad92232375817c6", "level": "note", "message": {"text": "Possibly dead Python function: fail_generate_jira"}, "properties": {"repobilityId": "e514f22b5fe6f09c", "scanner": "scanner-primary", "fingerprint": "cad92232375817c6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:712"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18fa5bb800abac80", "level": "note", "message": {"text": "Possibly dead Python function: toggle_jira_mode"}, "properties": {"repobilityId": "e3a92a3267dbc532", "scanner": "scanner-primary", "fingerprint": "18fa5bb800abac80", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bananaphone_v2.py:764"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-506be2b95088f5d3", "level": "none", "message": {"text": "git log failed \u2014 history analysis incomplete"}, "properties": {"repobilityId": "b424308a11bb9b22", "scanner": "scanner-primary", "fingerprint": "506be2b95088f5d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["git", "tooling"]}}, {"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-6d075ec4c8c5670f", "level": "note", "message": {"text": "Very large file: bananaphone_v2.py (2130 lines)"}, "properties": {"repobilityId": "3f9c31cc59316fe9", "scanner": "scanner-primary", "fingerprint": "6d075ec4c8c5670f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "cd1daca07c756216", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-83598492a7324845", "level": "note", "message": {"text": "Legacy-named symbol `bananaphone_v2` in bananaphone_v2.py:30"}, "properties": {"repobilityId": "705b28af41006de3", "scanner": "scanner-primary", "fingerprint": "83598492a7324845", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-831d11082b85af22", "level": "none", "message": {"text": "Commented-code block (5 lines) in bananaphone_v2.py:835"}, "properties": {"repobilityId": "53776dead00c0b6a", "scanner": "scanner-primary", "fingerprint": "831d11082b85af22", "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": "9ffa100c3020872e", "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": "402210f5b77e813d", "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": "896d9b1cb3cf6161", "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": "b0b7166cde714bab", "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": "da392bb5a0e304b1", "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": "a640306f0ecb996e", "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": "9df6487ee5267fb6", "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": "4ac0098f4b98c266", "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": "d7124878f05a5ac6", "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": "325ffbd382afc0ad", "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": "fed58dcdc34d2145", "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": "35d5143a8cdde0c2", "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": "dfd90a5009419efe", "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": "d2cfe475d4904d26", "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": "917f8e91d67e6c7c", "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": "e9b3db7ad1ec21fb", "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": "e0c31496fa4b566d", "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": "26bffc7044e13354", "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": "58e6e3beedf20db1", "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": "4b0ad73be71cfd4a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}