{"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-645c7e9c4bba667a", "name": "Possibly dead Python function: async_setup", "shortDescription": {"text": "Possibly dead Python function: async_setup"}, "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-7da3c604192c754e", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-b1c95d46edd9c610", "name": "Possibly dead Python function: async_unload_entry", "shortDescription": {"text": "Possibly dead Python function: async_unload_entry"}, "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-2694ec267390aeda", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-c7aa6f26a7954aa4", "name": "Possibly dead Python function: async_get_config_entry_diagnostics", "shortDescription": {"text": "Possibly dead Python function: async_get_config_entry_diagnostics"}, "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-ef988afa872974df", "name": "Possibly dead Python function: async_step_user", "shortDescription": {"text": "Possibly dead Python function: async_step_user"}, "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-a2e6d9746db06304", "name": "Possibly dead Python function: async_step_init", "shortDescription": {"text": "Possibly dead Python function: async_step_init"}, "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-44c776a0acc71de6", "name": "Possibly dead Python function: async_step_runtime", "shortDescription": {"text": "Possibly dead Python function: async_step_runtime"}, "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-1ad12dc8d783a789", "name": "Possibly dead Python function: async_step_battery", "shortDescription": {"text": "Possibly dead Python function: async_step_battery"}, "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-750413658250662e", "name": "Possibly dead Python function: async_step_ev_settings", "shortDescription": {"text": "Possibly dead Python function: async_step_ev_settings"}, "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-2a677331b384c30c", "name": "Possibly dead Python function: async_step_mapping", "shortDescription": {"text": "Possibly dead Python function: async_step_mapping"}, "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-3f383c9071c6166b", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-5ebfe892ec10b896", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-5e4ffae9d39db5f9", "name": "Possibly dead Python function: async_select_option", "shortDescription": {"text": "Possibly dead Python function: async_select_option"}, "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-69b2c521389af435", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-a0f41d443bf08986", "name": "Possibly dead Python function: async_press", "shortDescription": {"text": "Possibly dead Python function: async_press"}, "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-a7420bf13f6483eb", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-aeb4a07a0116bb5b", "name": "Possibly dead Python function: async_turn_on", "shortDescription": {"text": "Possibly dead Python function: async_turn_on"}, "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-96c8e021bede7c19", "name": "Possibly dead Python function: async_turn_off", "shortDescription": {"text": "Possibly dead Python function: async_turn_off"}, "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-4da75fd062c382b9", "name": "Possibly dead Python function: async_setup_entry", "shortDescription": {"text": "Possibly dead Python function: async_setup_entry"}, "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-17249adc21f46d50", "name": "Possibly dead Python function: async_set_native_value", "shortDescription": {"text": "Possibly dead Python function: async_set_native_value"}, "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-764210fdf27d3c4a", "name": "Possibly dead Python function: wrapped", "shortDescription": {"text": "Possibly dead Python function: wrapped"}, "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-c0e5c279f4e4b681", "name": "Possibly dead Python function: test_horizon", "shortDescription": {"text": "Possibly dead Python function: test_horizon"}, "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-5eb3117c8bdc7c12", "name": "Possibly dead Python function: test_write_verification", "shortDescription": {"text": "Possibly dead Python function: test_write_verification"}, "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-187a0c7e21c69dc2", "name": "Possibly dead Python function: test_a2_planning", "shortDescription": {"text": "Possibly dead Python function: test_a2_planning"}, "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-6fb8933fded94f1b", "name": "Possibly dead Python function: test_b_profiles", "shortDescription": {"text": "Possibly dead Python function: test_b_profiles"}, "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-b9e09b6daa7d494b", "name": "Possibly dead Python function: test_c_smartcharge", "shortDescription": {"text": "Possibly dead Python function: test_c_smartcharge"}, "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-0b8d8a9a3dd7fde3", "name": "Possibly dead Python function: test_d_learning", "shortDescription": {"text": "Possibly dead Python function: test_d_learning"}, "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-69e60d9809b996ce", "name": "Possibly dead Python function: test_f_savings", "shortDescription": {"text": "Possibly dead Python function: test_f_savings"}, "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-671f1a490ba8cd17", "name": "Possibly dead Python function: test_self_consumption_schedule", "shortDescription": {"text": "Possibly dead Python function: test_self_consumption_schedule"}, "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-a5f786efd4005dc1", "name": "Very large file: custom_components/wattson/coordinator.py (1231 lines)", "shortDescription": {"text": "Very large file: custom_components/wattson/coordinator.py (1231 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-7407cf67cdd38051", "name": "Very large file: custom_components/wattson/planner.py (2175 lines)", "shortDescription": {"text": "Very large file: custom_components/wattson/planner.py (2175 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-9d1d039e702dbcf9", "name": "Very large file: sim/wattson_sim.py (2729 lines)", "shortDescription": {"text": "Very large file: sim/wattson_sim.py (2729 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": "1 test file(s) for 24 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 50 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-f71d4e50ec307afa", "name": "Commented-code block (6 lines) in custom_components/wattson/horizon.py:119", "shortDescription": {"text": "Commented-code block (6 lines) in custom_components/wattson/horizon.py:119"}, "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-5e0f48be7f4835a8", "name": "Commented-code block (7 lines) in custom_components/wattson/telemetry.py:268", "shortDescription": {"text": "Commented-code block (7 lines) in custom_components/wattson/telemetry.py:268"}, "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-78e08a9fb7306a84", "name": "Commented-code block (5 lines) in custom_components/wattson/control.py:20", "shortDescription": {"text": "Commented-code block (5 lines) in custom_components/wattson/control.py:20"}, "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-087d7393aeb4fbaf", "name": "Commented-code block (6 lines) in custom_components/wattson/models.py:127", "shortDescription": {"text": "Commented-code block (6 lines) in custom_components/wattson/models.py:127"}, "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-36c97dfbe2d09d11", "name": "Commented-code block (5 lines) in custom_components/wattson/coordinator.py:198", "shortDescription": {"text": "Commented-code block (5 lines) in custom_components/wattson/coordinator.py:198"}, "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-4466baf5a3f337ae", "name": "Commented-code block (8 lines) in custom_components/wattson/mapping.py:355", "shortDescription": {"text": "Commented-code block (8 lines) in custom_components/wattson/mapping.py:355"}, "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-46867aa6f1be6278", "name": "Commented-code block (5 lines) in custom_components/wattson/const.py:39", "shortDescription": {"text": "Commented-code block (5 lines) in custom_components/wattson/const.py:39"}, "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-7b0f2093b9801326", "name": "Commented-code block (6 lines) in custom_components/wattson/planner.py:51", "shortDescription": {"text": "Commented-code block (6 lines) in custom_components/wattson/planner.py:51"}, "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-3545cf4262136469", "name": "Legacy-named symbol `w_old` in sim/wattson_backtest.py:335", "shortDescription": {"text": "Legacy-named symbol `w_old` in sim/wattson_backtest.py:335"}, "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-1147400e16993c9b", "name": "Legacy-named symbol `w_old` in sim/wattson_analyze.py:44", "shortDescription": {"text": "Legacy-named symbol `w_old` in sim/wattson_analyze.py:44"}, "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-9f1a65e5ffa2789b", "name": "Commented-code block (7 lines) in sim/wattson_analyze.py:53", "shortDescription": {"text": "Commented-code block (7 lines) in sim/wattson_analyze.py:53"}, "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-dee9130bac2b1c7a", "name": "Legacy-named symbol `bp_legacy` in sim/wattson_sim.py:813", "shortDescription": {"text": "Legacy-named symbol `bp_legacy` in sim/wattson_sim.py:813"}, "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-a9e44621fb8a99d1", "name": "Commented-code block (5 lines) in sim/wattson_sim.py:917", "shortDescription": {"text": "Commented-code block (5 lines) in sim/wattson_sim.py:917"}, "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-fc23dfa4fc29392a", "name": "Stub function `get` (body is just `pass`/`return`) \u2014 sim/wattson_sim.py:1038", "shortDescription": {"text": "Stub function `get` (body is just `pass`/`return`) \u2014 sim/wattson_sim.py:1038"}, "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-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ncustom_components/wattson/sensor.py:native_value, custom_components/wattson/sensor.py:native_value, custom_components/wattson/sensor.py:native_value, custom_components/wattson/sensor.py:native_value\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:\ncustom_components/wattson/sensor.py:extra_state_attributes, custom_components/wattson/sensor.py:extra_state_attributes, custom_components/wattson/sensor.py:extra_state_attributes, custom_components/wattson/sensor.py:extra_state_attributes\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ncustom_components/wattson/select.py:current_option, custom_components/wattson/select.py:current_option, custom_components/wattson/select.py:current_option, custom_components/wattson/select.py:current_option\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-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:\ncustom_components/wattson/select.py:extra_state_attributes, custom_components/wattson/select.py:extra_state_attributes\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:\ncustom_components/wattson/button.py:async_press, custom_components/wattson/button.py:async_press, custom_components/wattson/button.py:async_press\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ncustom_components/wattson/number.py:native_value, custom_components/wattson/number.py:native_value, custom_components/wattson/number.py:native_value, custom_components/wattson/number.py:native_value\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsim/wattson_sim.py:get, sim/wattson_sim.py:get, sim/wattson_sim.py:get, sim/wattson_sim.py:get\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-46969939caf8120b", "name": "Near-duplicate function bodies in 9 places", "shortDescription": {"text": "Near-duplicate function bodies in 9 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsim/wattson_sim.py:test_a2_planning, sim/wattson_sim.py:test_b_profiles, sim/wattson_sim.py:test_d_learning, sim/wattson_sim.py:test_self_consumption_schedule\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-6297377883dd7783", "name": "Near-duplicate function bodies in 13 places", "shortDescription": {"text": "Near-duplicate function bodies in 13 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsim/wattson_sim.py:at, sim/wattson_sim.py:at, sim/wattson_sim.py:at, sim/wattson_sim.py:at\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/21434"}, "properties": {"repository": "Tokebjerg/Wattson", "repoUrl": "https://github.com/Tokebjerg/Wattson", "branch": "main"}, "results": [{"ruleId": "scanner-645c7e9c4bba667a", "level": "note", "message": {"text": "Possibly dead Python function: async_setup"}, "properties": {"repobilityId": "b4525be7b78b6114", "scanner": "scanner-primary", "fingerprint": "645c7e9c4bba667a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/__init__.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7da3c604192c754e", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "7da3c604192c754e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/__init__.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b1c95d46edd9c610", "level": "note", "message": {"text": "Possibly dead Python function: async_unload_entry"}, "properties": {"repobilityId": "30a9c97872d972d2", "scanner": "scanner-primary", "fingerprint": "b1c95d46edd9c610", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/__init__.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2694ec267390aeda", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "2694ec267390aeda", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/binary_sensor.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c7aa6f26a7954aa4", "level": "note", "message": {"text": "Possibly dead Python function: async_get_config_entry_diagnostics"}, "properties": {"repobilityId": "30b926b23d28c658", "scanner": "scanner-primary", "fingerprint": "c7aa6f26a7954aa4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/diagnostics.py:14"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ef988afa872974df", "level": "note", "message": {"text": "Possibly dead Python function: async_step_user"}, "properties": {"repobilityId": "3e711d68888368f0", "scanner": "scanner-primary", "fingerprint": "ef988afa872974df", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:330"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a2e6d9746db06304", "level": "note", "message": {"text": "Possibly dead Python function: async_step_init"}, "properties": {"repobilityId": "a2d8666a207dd7f1", "scanner": "scanner-primary", "fingerprint": "a2e6d9746db06304", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:492"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44c776a0acc71de6", "level": "note", "message": {"text": "Possibly dead Python function: async_step_runtime"}, "properties": {"repobilityId": "ebee5b6e7f00668e", "scanner": "scanner-primary", "fingerprint": "44c776a0acc71de6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:499"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1ad12dc8d783a789", "level": "note", "message": {"text": "Possibly dead Python function: async_step_battery"}, "properties": {"repobilityId": "bf6b57af3f675b0b", "scanner": "scanner-primary", "fingerprint": "1ad12dc8d783a789", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:511"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-750413658250662e", "level": "note", "message": {"text": "Possibly dead Python function: async_step_ev_settings"}, "properties": {"repobilityId": "c25590ffe7817a45", "scanner": "scanner-primary", "fingerprint": "750413658250662e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:523"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a677331b384c30c", "level": "note", "message": {"text": "Possibly dead Python function: async_step_mapping"}, "properties": {"repobilityId": "f1907403865e06f9", "scanner": "scanner-primary", "fingerprint": "2a677331b384c30c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/config_flow.py:535"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3f383c9071c6166b", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "3f383c9071c6166b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/sensor.py:211"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ebfe892ec10b896", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "5ebfe892ec10b896", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/select.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5e4ffae9d39db5f9", "level": "note", "message": {"text": "Possibly dead Python function: async_select_option"}, "properties": {"repobilityId": "774b9c27c960d04f", "scanner": "scanner-primary", "fingerprint": "5e4ffae9d39db5f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/select.py:206"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-69b2c521389af435", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "69b2c521389af435", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/button.py:13"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a0f41d443bf08986", "level": "note", "message": {"text": "Possibly dead Python function: async_press"}, "properties": {"repobilityId": "6ab8b39b52db459f", "scanner": "scanner-primary", "fingerprint": "a0f41d443bf08986", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/button.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7420bf13f6483eb", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "a7420bf13f6483eb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/switch.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aeb4a07a0116bb5b", "level": "note", "message": {"text": "Possibly dead Python function: async_turn_on"}, "properties": {"repobilityId": "b33cc9153eec2f7e", "scanner": "scanner-primary", "fingerprint": "aeb4a07a0116bb5b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/switch.py:168"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96c8e021bede7c19", "level": "note", "message": {"text": "Possibly dead Python function: async_turn_off"}, "properties": {"repobilityId": "284a7b930f5bb2f8", "scanner": "scanner-primary", "fingerprint": "96c8e021bede7c19", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/switch.py:172"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4da75fd062c382b9", "level": "note", "message": {"text": "Possibly dead Python function: async_setup_entry"}, "properties": {"repobilityId": "c8b792a45e339d83", "scanner": "scanner-primary", "fingerprint": "4da75fd062c382b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/number.py:15"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-17249adc21f46d50", "level": "note", "message": {"text": "Possibly dead Python function: async_set_native_value"}, "properties": {"repobilityId": "f56f8bc2e0a269b2", "scanner": "scanner-primary", "fingerprint": "17249adc21f46d50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "custom_components/wattson/number.py:276"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-764210fdf27d3c4a", "level": "note", "message": {"text": "Possibly dead Python function: wrapped"}, "properties": {"repobilityId": "faacdada21d43bd9", "scanner": "scanner-primary", "fingerprint": "764210fdf27d3c4a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:307"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c0e5c279f4e4b681", "level": "note", "message": {"text": "Possibly dead Python function: test_horizon"}, "properties": {"repobilityId": "485747455c3cb57f", "scanner": "scanner-primary", "fingerprint": "c0e5c279f4e4b681", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:482"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5eb3117c8bdc7c12", "level": "note", "message": {"text": "Possibly dead Python function: test_write_verification"}, "properties": {"repobilityId": "16da9cc1db724caf", "scanner": "scanner-primary", "fingerprint": "5eb3117c8bdc7c12", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:630"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-187a0c7e21c69dc2", "level": "note", "message": {"text": "Possibly dead Python function: test_a2_planning"}, "properties": {"repobilityId": "49e41d8a52670b51", "scanner": "scanner-primary", "fingerprint": "187a0c7e21c69dc2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:708"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6fb8933fded94f1b", "level": "note", "message": {"text": "Possibly dead Python function: test_b_profiles"}, "properties": {"repobilityId": "340784130d4a4e40", "scanner": "scanner-primary", "fingerprint": "6fb8933fded94f1b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:826"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b9e09b6daa7d494b", "level": "note", "message": {"text": "Possibly dead Python function: test_c_smartcharge"}, "properties": {"repobilityId": "d934246bf3e9e596", "scanner": "scanner-primary", "fingerprint": "b9e09b6daa7d494b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:951"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b8d8a9a3dd7fde3", "level": "note", "message": {"text": "Possibly dead Python function: test_d_learning"}, "properties": {"repobilityId": "af2c602f1fcb5455", "scanner": "scanner-primary", "fingerprint": "0b8d8a9a3dd7fde3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:1112"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-69e60d9809b996ce", "level": "note", "message": {"text": "Possibly dead Python function: test_f_savings"}, "properties": {"repobilityId": "0d5b7023cd356189", "scanner": "scanner-primary", "fingerprint": "69e60d9809b996ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:1168"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-671f1a490ba8cd17", "level": "note", "message": {"text": "Possibly dead Python function: test_self_consumption_schedule"}, "properties": {"repobilityId": "c1ae10ecae9b0a34", "scanner": "scanner-primary", "fingerprint": "671f1a490ba8cd17", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sim/wattson_sim.py:1197"}, "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-a5f786efd4005dc1", "level": "note", "message": {"text": "Very large file: custom_components/wattson/coordinator.py (1231 lines)"}, "properties": {"repobilityId": "cddcd708af16a5c9", "scanner": "scanner-primary", "fingerprint": "a5f786efd4005dc1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7407cf67cdd38051", "level": "note", "message": {"text": "Very large file: custom_components/wattson/planner.py (2175 lines)"}, "properties": {"repobilityId": "9e3b68e92dddd3c5", "scanner": "scanner-primary", "fingerprint": "7407cf67cdd38051", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9d1d039e702dbcf9", "level": "note", "message": {"text": "Very large file: sim/wattson_sim.py (2729 lines)"}, "properties": {"repobilityId": "413bfe7da95ba064", "scanner": "scanner-primary", "fingerprint": "9d1d039e702dbcf9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "be4c3bce88d2a5af", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "7a7c1b89d82bda04", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "10f947cbfe2634f5", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "2a1af3c23e3f90c5", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "2d06443e716c0b3d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "6d1ca6a5e1d65292", "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": "ecddf0afc9ab24da", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f71d4e50ec307afa", "level": "none", "message": {"text": "Commented-code block (6 lines) in custom_components/wattson/horizon.py:119"}, "properties": {"repobilityId": "fdf15c5dafe79fcb", "scanner": "scanner-primary", "fingerprint": "f71d4e50ec307afa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e0f48be7f4835a8", "level": "none", "message": {"text": "Commented-code block (7 lines) in custom_components/wattson/telemetry.py:268"}, "properties": {"repobilityId": "61557433faaf96ef", "scanner": "scanner-primary", "fingerprint": "5e0f48be7f4835a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78e08a9fb7306a84", "level": "none", "message": {"text": "Commented-code block (5 lines) in custom_components/wattson/control.py:20"}, "properties": {"repobilityId": "670a10d9497f5554", "scanner": "scanner-primary", "fingerprint": "78e08a9fb7306a84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-087d7393aeb4fbaf", "level": "none", "message": {"text": "Commented-code block (6 lines) in custom_components/wattson/models.py:127"}, "properties": {"repobilityId": "375a332fa08a3935", "scanner": "scanner-primary", "fingerprint": "087d7393aeb4fbaf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36c97dfbe2d09d11", "level": "none", "message": {"text": "Commented-code block (5 lines) in custom_components/wattson/coordinator.py:198"}, "properties": {"repobilityId": "501f47e9f61e8698", "scanner": "scanner-primary", "fingerprint": "36c97dfbe2d09d11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4466baf5a3f337ae", "level": "none", "message": {"text": "Commented-code block (8 lines) in custom_components/wattson/mapping.py:355"}, "properties": {"repobilityId": "5985a23140074c4b", "scanner": "scanner-primary", "fingerprint": "4466baf5a3f337ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46867aa6f1be6278", "level": "none", "message": {"text": "Commented-code block (5 lines) in custom_components/wattson/const.py:39"}, "properties": {"repobilityId": "ebef913dda13b9d6", "scanner": "scanner-primary", "fingerprint": "46867aa6f1be6278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b0f2093b9801326", "level": "none", "message": {"text": "Commented-code block (6 lines) in custom_components/wattson/planner.py:51"}, "properties": {"repobilityId": "5bebb914b1a52b00", "scanner": "scanner-primary", "fingerprint": "7b0f2093b9801326", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3545cf4262136469", "level": "note", "message": {"text": "Legacy-named symbol `w_old` in sim/wattson_backtest.py:335"}, "properties": {"repobilityId": "3fee5ca5918e9a0a", "scanner": "scanner-primary", "fingerprint": "3545cf4262136469", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1147400e16993c9b", "level": "note", "message": {"text": "Legacy-named symbol `w_old` in sim/wattson_analyze.py:44"}, "properties": {"repobilityId": "4029360c74964d94", "scanner": "scanner-primary", "fingerprint": "1147400e16993c9b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9f1a65e5ffa2789b", "level": "none", "message": {"text": "Commented-code block (7 lines) in sim/wattson_analyze.py:53"}, "properties": {"repobilityId": "3a2a5e78a94a97a4", "scanner": "scanner-primary", "fingerprint": "9f1a65e5ffa2789b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dee9130bac2b1c7a", "level": "note", "message": {"text": "Legacy-named symbol `bp_legacy` in sim/wattson_sim.py:813"}, "properties": {"repobilityId": "d549c1269ae58f4b", "scanner": "scanner-primary", "fingerprint": "dee9130bac2b1c7a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9e44621fb8a99d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in sim/wattson_sim.py:917"}, "properties": {"repobilityId": "dc3b3907cea4511b", "scanner": "scanner-primary", "fingerprint": "a9e44621fb8a99d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc23dfa4fc29392a", "level": "note", "message": {"text": "Stub function `get` (body is just `pass`/`return`) \u2014 sim/wattson_sim.py:1038"}, "properties": {"repobilityId": "70d3b3aae5fb4617", "scanner": "scanner-primary", "fingerprint": "fc23dfa4fc29392a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "a710eeab71d935ee", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "2a87b9e530b114a7", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "a0931d3a68b484e7", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "c7ed5fe47820de0a", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "d39754b3f5f7eaee", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2218c2ab3b214577", "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": "ddbb5f8a9af14483", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "075ba1a85a7d1f63", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "79e6a7ea31d0327c", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "23dab8c60e2b445d", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "adfd9d378aa12d6a", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "e7189c4c7f287865", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "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": "ab374809f0c8fcb0", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "908be39a88288a7e", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "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": "fc71bc70afa4c438", "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": "21135e181b6d683c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "23960a3ad70cf9b6", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-46969939caf8120b", "level": "note", "message": {"text": "Near-duplicate function bodies in 9 places"}, "properties": {"repobilityId": "05ea5640b1d6ddaf", "scanner": "scanner-primary", "fingerprint": "46969939caf8120b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-6297377883dd7783", "level": "note", "message": {"text": "Near-duplicate function bodies in 13 places"}, "properties": {"repobilityId": "2854624824aa13d8", "scanner": "scanner-primary", "fingerprint": "6297377883dd7783", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "30c0557aa6802dc1", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}