{"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-d9591f9feacaa948", "name": "Possibly dead Python function: clear_shared_face_analyzer_cache", "shortDescription": {"text": "Possibly dead Python function: clear_shared_face_analyzer_cache"}, "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-11011ac25ba2d4f9", "name": "Possibly dead Python function: preload_shared_face_analyzer_async", "shortDescription": {"text": "Possibly dead Python function: preload_shared_face_analyzer_async"}, "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-23cc64e63aa5ddde", "name": "Possibly dead Python function: build_inventory_service", "shortDescription": {"text": "Possibly dead Python function: build_inventory_service"}, "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-455e61b98205fe5d", "name": "Possibly dead Python function: isoformat_utc", "shortDescription": {"text": "Possibly dead Python function: isoformat_utc"}, "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-429fd781656e8e91", "name": "Possibly dead Python function: load_partial_payloads", "shortDescription": {"text": "Possibly dead Python function: load_partial_payloads"}, "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-9645d80c1498c44f", "name": "Possibly dead Python function: save_frame", "shortDescription": {"text": "Possibly dead Python function: save_frame"}, "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-83c645f69b2b2819", "name": "Possibly dead Python function: estimate_norm", "shortDescription": {"text": "Possibly dead Python function: estimate_norm"}, "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-506f504b3d8510e4", "name": "Possibly dead Python function: occurrences_by_track", "shortDescription": {"text": "Possibly dead Python function: occurrences_by_track"}, "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-92f7c8406f73daea", "name": "Possibly dead Python function: tracks_by_video", "shortDescription": {"text": "Possibly dead Python function: tracks_by_video"}, "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-31079883ce4a3821", "name": "Possibly dead Python function: candidate_cluster_pairs", "shortDescription": {"text": "Possibly dead Python function: candidate_cluster_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-a952b74edd9dda34", "name": "Possibly dead Python function: keyframe_reference_text", "shortDescription": {"text": "Possibly dead Python function: keyframe_reference_text"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2c26b36c03c36d8", "name": "Possibly dead Python function: inventory_progress", "shortDescription": {"text": "Possibly dead Python function: inventory_progress"}, "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-4e978ed82c07ef99", "name": "Possibly dead Python function: media_files", "shortDescription": {"text": "Possibly dead Python function: media_files"}, "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-d8aab153110890d0", "name": "Possibly dead Python function: summarize", "shortDescription": {"text": "Possibly dead Python function: summarize"}, "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-61057e4cd833edaf", "name": "Possibly dead Python function: describe_video", "shortDescription": {"text": "Possibly dead Python function: describe_video"}, "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-9def6dfde55aadfa", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-868a06ca52b99393", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-92abdc243c684d4f", "name": "Very large file: tests/test_inventory_pipeline.py (1150 lines)", "shortDescription": {"text": "Very large file: tests/test_inventory_pipeline.py (1150 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-1c770075e407a658", "name": "Very large file: src/inventario_faces/gui/config_dialog.py (1060 lines)", "shortDescription": {"text": "Very large file: src/inventario_faces/gui/config_dialog.py (1060 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-c1f8104779eb3f92", "name": "Very large file: src/inventario_faces/gui/face_set_comparison_dialog.py (1842 lines)", "shortDescription": {"text": "Very large file: src/inventario_faces/gui/face_set_comparison_dialog.py (1842 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-ffcb99c03d01d364", "name": "Very large file: src/inventario_faces/services/inventory_service.py (1998 lines)", "shortDescription": {"text": "Very large file: src/inventario_faces/services/inventory_service.py (1998 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-a2a6de39876c5759", "name": "Very large file: src/inventario_faces/services/face_set_comparison_service.py (1403 lines)", "shortDescription": {"text": "Very large file: src/inventario_faces/services/face_set_comparison_service.py (1403 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-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-76dbaef210070362", "name": "Legacy-named symbol `run_old` in tests/test_inventory_pipeline.py:311", "shortDescription": {"text": "Legacy-named symbol `run_old` in tests/test_inventory_pipeline.py:311"}, "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-cacc55a0c11130ae", "name": "Legacy-named symbol `use_local_temp_copy` in tests/test_config_persistence.py:36", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in tests/test_config_persistence.py:36"}, "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-88ba4f7948320232", "name": "Stub function `executable_path` (body is just `pass`/`return`) \u2014 src/inventario_faces/infrastructure/media_info_service.", "shortDescription": {"text": "Stub function `executable_path` (body is just `pass`/`return`) \u2014 src/inventario_faces/infrastructure/media_info_service.py:22"}, "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-a27f293ff70436a6", "name": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/infrastructure/config_loader.py:101", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/infrastructure/config_loader.py:101"}, "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-5f11fdc0f9e8c967", "name": "Network/subprocess call without timeout or try/except \u2014 src/inventario_faces/infrastructure/latex_compiler.py:25", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 src/inventario_faces/infrastructure/latex_compiler.py:25"}, "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-787af776b4380082", "name": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/gui/config_dialog.py:755", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/gui/config_dialog.py:755"}, "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-35bcff1d9347d35c", "name": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/reporting/report_support.py:225", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/reporting/report_support.py:225"}, "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-58bea69f20e7f42a", "name": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/export_service.py:415", "shortDescription": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/export_service.py:415"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93ed28d537e4e93a", "name": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/services/pipeline_support.py:157", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/services/pipeline_support.py:157"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eef0c0d8e4db71f1", "name": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/face_set_comparison_service.py:817", "shortDescription": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/face_set_comparison_service.py:817"}, "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-71ef10da4593a4be", "name": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/domain/config.py:65", "shortDescription": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/domain/config.py:65"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e14e2a1c2611f9b", "name": "Legacy-named symbol `export_source_copy` in src/inventario_faces/domain/entities.py:353", "shortDescription": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/domain/entities.py:353"}, "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:\nsrc/inventario_faces/utils/density_utils.py:evaluate_raw, src/inventario_faces/utils/density_utils.py:evaluate\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:\nsrc/inventario_faces/gui/worker.py:run, src/inventario_faces/gui/worker.py:run, src/inventario_faces/gui/worker.py:run, src/inventario_faces/gui/worker.py:run\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/25328"}, "properties": {"repository": "demusis/inventario_faces", "repoUrl": "https://github.com/demusis/inventario_faces", "branch": "main"}, "results": [{"ruleId": "scanner-d9591f9feacaa948", "level": "note", "message": {"text": "Possibly dead Python function: clear_shared_face_analyzer_cache"}, "properties": {"repobilityId": "8ed1188c05afe276", "scanner": "scanner-primary", "fingerprint": "d9591f9feacaa948", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/app.py:143"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-11011ac25ba2d4f9", "level": "note", "message": {"text": "Possibly dead Python function: preload_shared_face_analyzer_async"}, "properties": {"repobilityId": "eacb2c60b318149f", "scanner": "scanner-primary", "fingerprint": "11011ac25ba2d4f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/app.py:181"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23cc64e63aa5ddde", "level": "note", "message": {"text": "Possibly dead Python function: build_inventory_service"}, "properties": {"repobilityId": "2db159e714b3d0af", "scanner": "scanner-primary", "fingerprint": "23cc64e63aa5ddde", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/app.py:195"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-455e61b98205fe5d", "level": "note", "message": {"text": "Possibly dead Python function: isoformat_utc"}, "properties": {"repobilityId": "4059c77c3f657aa7", "scanner": "scanner-primary", "fingerprint": "455e61b98205fe5d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/utils/time_utils.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-429fd781656e8e91", "level": "note", "message": {"text": "Possibly dead Python function: load_partial_payloads"}, "properties": {"repobilityId": "acf74aa0b1f2df85", "scanner": "scanner-primary", "fingerprint": "429fd781656e8e91", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/infrastructure/distributed_coordination.py:385"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9645d80c1498c44f", "level": "note", "message": {"text": "Possibly dead Python function: save_frame"}, "properties": {"repobilityId": "f6571666ef6719da", "scanner": "scanner-primary", "fingerprint": "9645d80c1498c44f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/infrastructure/artifact_store.py:19"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-83c645f69b2b2819", "level": "note", "message": {"text": "Possibly dead Python function: estimate_norm"}, "properties": {"repobilityId": "7b860c15c1aa7d00", "scanner": "scanner-primary", "fingerprint": "83c645f69b2b2819", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/infrastructure/face_analyzer_insight.py:312"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-506f504b3d8510e4", "level": "note", "message": {"text": "Possibly dead Python function: occurrences_by_track"}, "properties": {"repobilityId": "fe0ad106e68430ce", "scanner": "scanner-primary", "fingerprint": "506f504b3d8510e4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/reporting/report_context.py:10"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92f7c8406f73daea", "level": "note", "message": {"text": "Possibly dead Python function: tracks_by_video"}, "properties": {"repobilityId": "88a0603ba6187825", "scanner": "scanner-primary", "fingerprint": "92f7c8406f73daea", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/reporting/report_context.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-31079883ce4a3821", "level": "note", "message": {"text": "Possibly dead Python function: candidate_cluster_pairs"}, "properties": {"repobilityId": "2a0e2ce03ee72703", "scanner": "scanner-primary", "fingerprint": "31079883ce4a3821", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/reporting/report_context.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a952b74edd9dda34", "level": "note", "message": {"text": "Possibly dead Python function: keyframe_reference_text"}, "properties": {"repobilityId": "fa34d2b19fd7975a", "scanner": "scanner-primary", "fingerprint": "a952b74edd9dda34", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/reporting/report_support.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c2c26b36c03c36d8", "level": "note", "message": {"text": "Possibly dead Python function: inventory_progress"}, "properties": {"repobilityId": "0370ddf32e5efc76", "scanner": "scanner-primary", "fingerprint": "c2c26b36c03c36d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/services/face_search_service.py:123"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4e978ed82c07ef99", "level": "note", "message": {"text": "Possibly dead Python function: media_files"}, "properties": {"repobilityId": "d9e8ca6b90180150", "scanner": "scanner-primary", "fingerprint": "4e978ed82c07ef99", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/services/scanner_service.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8aab153110890d0", "level": "note", "message": {"text": "Possibly dead Python function: summarize"}, "properties": {"repobilityId": "2f031b6e55dee53f", "scanner": "scanner-primary", "fingerprint": "d8aab153110890d0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/services/scanner_service.py:47"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61057e4cd833edaf", "level": "note", "message": {"text": "Possibly dead Python function: describe_video"}, "properties": {"repobilityId": "29965012e6d3ff2a", "scanner": "scanner-primary", "fingerprint": "61057e4cd833edaf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/inventario_faces/services/video_service.py:58"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9def6dfde55aadfa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c957c0b814faba08", "scanner": "scanner-primary", "fingerprint": "9def6dfde55aadfa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/auto-bump-version.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-9def6dfde55aadfa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "061877fba444d29c", "scanner": "scanner-primary", "fingerprint": "9def6dfde55aadfa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/auto-bump-version.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-868a06ca52b99393", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "eaf00c35a42133b4", "scanner": "scanner-primary", "fingerprint": "868a06ca52b99393", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/auto-bump-version.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92abdc243c684d4f", "level": "note", "message": {"text": "Very large file: tests/test_inventory_pipeline.py (1150 lines)"}, "properties": {"repobilityId": "0203566fae552fcd", "scanner": "scanner-primary", "fingerprint": "92abdc243c684d4f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c770075e407a658", "level": "note", "message": {"text": "Very large file: src/inventario_faces/gui/config_dialog.py (1060 lines)"}, "properties": {"repobilityId": "6c3e03be3784193b", "scanner": "scanner-primary", "fingerprint": "1c770075e407a658", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c1f8104779eb3f92", "level": "note", "message": {"text": "Very large file: src/inventario_faces/gui/face_set_comparison_dialog.py (1842 lines)"}, "properties": {"repobilityId": "732aadb64d047047", "scanner": "scanner-primary", "fingerprint": "c1f8104779eb3f92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ffcb99c03d01d364", "level": "note", "message": {"text": "Very large file: src/inventario_faces/services/inventory_service.py (1998 lines)"}, "properties": {"repobilityId": "156dd6f2fa4bfd9f", "scanner": "scanner-primary", "fingerprint": "ffcb99c03d01d364", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a2a6de39876c5759", "level": "note", "message": {"text": "Very large file: src/inventario_faces/services/face_set_comparison_service.py (1403 lines)"}, "properties": {"repobilityId": "7e47f472066f6f02", "scanner": "scanner-primary", "fingerprint": "a2a6de39876c5759", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "8a3020245607958f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-76dbaef210070362", "level": "note", "message": {"text": "Legacy-named symbol `run_old` in tests/test_inventory_pipeline.py:311"}, "properties": {"repobilityId": "ae9542b3f72d3ab3", "scanner": "scanner-primary", "fingerprint": "76dbaef210070362", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cacc55a0c11130ae", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in tests/test_config_persistence.py:36"}, "properties": {"repobilityId": "17969fa904f29c93", "scanner": "scanner-primary", "fingerprint": "cacc55a0c11130ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-88ba4f7948320232", "level": "note", "message": {"text": "Stub function `executable_path` (body is just `pass`/`return`) \u2014 src/inventario_faces/infrastructure/media_info_service.py:22"}, "properties": {"repobilityId": "c4134873a0a49ec0", "scanner": "scanner-primary", "fingerprint": "88ba4f7948320232", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-a27f293ff70436a6", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/infrastructure/config_loader.py:101"}, "properties": {"repobilityId": "3368c625523f868c", "scanner": "scanner-primary", "fingerprint": "a27f293ff70436a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5f11fdc0f9e8c967", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 src/inventario_faces/infrastructure/latex_compiler.py:25"}, "properties": {"repobilityId": "7a51d00cc99f08b2", "scanner": "scanner-primary", "fingerprint": "5f11fdc0f9e8c967", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-787af776b4380082", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/gui/config_dialog.py:755"}, "properties": {"repobilityId": "c4d6337b5d5b5c44", "scanner": "scanner-primary", "fingerprint": "787af776b4380082", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-35bcff1d9347d35c", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/reporting/report_support.py:225"}, "properties": {"repobilityId": "3d3088bfc9da1990", "scanner": "scanner-primary", "fingerprint": "35bcff1d9347d35c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-58bea69f20e7f42a", "level": "note", "message": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/export_service.py:415"}, "properties": {"repobilityId": "82b42e1db07700d8", "scanner": "scanner-primary", "fingerprint": "58bea69f20e7f42a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-93ed28d537e4e93a", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/services/pipeline_support.py:157"}, "properties": {"repobilityId": "b89e188cbd2b6525", "scanner": "scanner-primary", "fingerprint": "93ed28d537e4e93a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eef0c0d8e4db71f1", "level": "note", "message": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/services/face_set_comparison_service.py:817"}, "properties": {"repobilityId": "05f05f3f2ec9d19f", "scanner": "scanner-primary", "fingerprint": "eef0c0d8e4db71f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-71ef10da4593a4be", "level": "note", "message": {"text": "Legacy-named symbol `use_local_temp_copy` in src/inventario_faces/domain/config.py:65"}, "properties": {"repobilityId": "43366378f67c6de5", "scanner": "scanner-primary", "fingerprint": "71ef10da4593a4be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e14e2a1c2611f9b", "level": "note", "message": {"text": "Legacy-named symbol `export_source_copy` in src/inventario_faces/domain/entities.py:353"}, "properties": {"repobilityId": "bb28cfb30060fe29", "scanner": "scanner-primary", "fingerprint": "5e14e2a1c2611f9b", "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": "8abae1ce32e8feca", "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": "287330141ac8737e", "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": "4d9226054af638fe", "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": "bbff7ac0bb8faf2e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "74fb30fc73bfc6cc", "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": "8cf8903de1a132d2", "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": "c3aa780828745e69", "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": "0854b2fa5d974585", "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": "75b4da7be2694ca4", "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": "13589e96f2a7113c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}