AI Slop Code RIsk Monitor

hacs/integration

HACS gives you a powerful UI to handle downloads of all your custom needs.

13.7 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for hacs/integration, a Python project with 7,783 GitHub stars. SynthScan examined 29,306 lines of code across 593 source files, recording 362 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 13.7 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

13.7
Adjusted Signal
13.7
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
7.8K
Stars
Python
Language
29.3K
Lines of Code
593
Files
362
Pattern Hits
2026-10-12
Scan Date
0.01
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 36.8/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 261 finding(s).

Hallucinated Dependency & Supply Chain Risk 10.7/100 · LOW

Are imports declared and package/API names verified? 66 finding(s).

Agent Over-Engineering Ratio 40.1/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 260 finding(s).

PR Review Velocity Impact 49.9/100 · MEDIUM

Which changes need focused human review? 362 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 7MEDIUM 4LOW 351

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 362 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers225 hits · 234 pts
SeverityFileLineSnippetContext
LOWtests/test_diagnostics.py33async def test_diagnostics_with_exception(CODE
LOWtests/test_init_function.py21async def test_async_remove_config_entry_device_success(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py39async def test_async_remove_config_entry_device_no_identifier(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py55async def test_async_remove_config_entry_device_hacs_system_id(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py70async def test_async_remove_config_entry_device_still_downloaded(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py95async def test_async_remove_config_entry_device_empty_identifiers(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py110async def test_async_remove_config_entry_device_invalid_identifier_format(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py129async def test_async_remove_config_entry_device_multiple_identifiers(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py151async def test_async_remove_config_entry_device_with_integer_id(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init_function.py169async def test_async_remove_config_entry_device_system_id_with_multiple_identifiers(hass: HomeAssistant, hacs: HacsBase)CODE
LOWtests/__init__.py11def async_suggest_report_issue_mock(*args, **kwargs):CODE
LOWtests/common.py117def category_test_data_parametrized(CODE
LOWtests/common.py151def normalize_voluptuous_paths(text: str) -> str:CODE
LOWtests/common.py257def ensure_auth_manager_loaded(auth_mgr):CODE
LOWtests/test_config_flow.py35async def test_full_user_flow_implementation(CODE
LOWtests/test_config_flow.py120async def test_flow_with_remove_while_activating(CODE
LOWtests/test_config_flow.py187async def test_flow_with_registration_failure(CODE
LOWtests/test_config_flow.py229async def test_flow_with_activation_failure(CODE
LOWtests/test_data_client.py27async def test_basic_functionality_data(CODE
LOWtests/test_data_client.py42async def test_basic_functionality_repositories(CODE
LOWtests/test_data_client.py168async def test_basic_functionality_data_validate(CODE
LOWtests/test_data_client.py205async def test_discard_invalid_repo_data(CODE
LOWtests/test_init.py16async def test_async_remove_config_entry_device_no_identifier(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py32async def test_async_remove_config_entry_device_hacs_system_id(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py47async def test_async_remove_config_entry_device_success(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py64async def test_async_remove_config_entry_device_still_downloaded(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py89async def test_async_remove_config_entry_device_empty_identifiers(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py104async def test_async_remove_config_entry_device_invalid_identifier_format(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py123async def test_async_remove_config_entry_device_multiple_identifiers(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py144async def test_async_remove_config_entry_device_with_integer_id(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_init.py161async def test_async_remove_config_entry_device_system_id_with_multiple_identifiers(hass: HomeAssistant, hacs: HacsBase)CODE
LOWtests/test_init.py180async def test_async_remove_config_entry_device_finds_first_valid_identifier(hass: HomeAssistant, hacs: HacsBase):CODE
LOWtests/test_system_health.py74async def test_system_health_after_unload(CODE
LOWtests/test_system_health.py90async def test_system_health_no_hacs(CODE
LOWtests/validate/test_repository_topics_check.py4async def test_repository_no_topics(repository):CODE
LOWtests/validate/test_repository_topics_check.py11async def test_repository_hacs_topics(repository):CODE
LOWtests/validate/test_repository_issues_check.py4async def test_repository_issues_enabled(repository):CODE
LOWtests/validate/test_repository_issues_check.py11async def test_repository_issues_not_enabled(repository):CODE
LOW⚡tests/validate/test_integration_manifest_check.py6async def test_integration_no_manifest(repository_integration):CODE
LOW⚡tests/validate/test_integration_manifest_check.py12async def test_integration_manifest_with_valid_manifest(repository_integration):CODE
LOW⚡tests/validate/test_integration_manifest_check.py19 async def _async_get_integration_manifest(**__):CODE
LOWtests/validate/test_integration_manifest_check.py36async def test_hacs_manifest_with_invalid_manifest(repository_integration):CODE
LOWtests/validate/test_integration_manifest_check.py43 async def _async_get_integration_manifest(**__):CODE
LOWtests/validate/test_repository_archived_check.py11async def test_repository_not_archived(repository):CODE
LOW⚡tests/validate/test_license.py11async def test_repository_no_license(repository):CODE
LOW⚡tests/validate/test_license.py19async def test_repository_unrecognized_license(repository):CODE
LOW⚡tests/validate/test_license.py29async def test_repository_missing_spdx_id(repository):CODE
LOW⚡tests/validate/test_license.py39async def test_repository_non_osi_license(repository):CODE
LOWtests/validate/test_license.py53async def test_spdx_license_list_fetch_failure(repository, response_mocker: ResponseMocker):CODE
LOWtests/validate/test_license.py66async def test_repository_popular_license_skips_fetch(CODE
LOWtests/validate/test_license.py85async def test_repository_uncommon_osi_license(repository, response_mocker: ResponseMocker):CODE
LOWtests/validate/test_images_check.py4async def test_repository_has_images(repository):CODE
LOWtests/validate/test_images_check.py8 async def _async_get_info_file_contents(*_, **__):CODE
LOWtests/validate/test_images_check.py19async def test_repository_has_not_images(repository):STRING
LOWtests/validate/test_images_check.py23 async def _async_get_info_file_contents(*_, **__):STRING
LOWtests/validate/test_repository_description_check.py4async def test_repository_no_description(repository):CODE
LOWtests/validate/test_repository_description_check.py11async def test_repository_hacs_description(repository):CODE
LOWtests/validate/test_hacsjson_check.py17async def test_hacs_manifest_no_manifest(repository, caplog):CODE
LOWtests/validate/test_hacsjson_check.py24async def test_hacs_manifest_with_valid_manifest(repository):CODE
LOWtests/validate/test_hacsjson_check.py38async def test_hacs_manifest_with_invalid_manifest(repository):CODE
165 more matches not shown…
Unused Imports66 hits · 66 pts
SeverityFileLineSnippetContext
LOWtests/patch_time.py5CODE
LOWtests/conftest.py2CODE
LOWtests/conftest.py8CODE
LOWtests/__init__.py1CODE
LOWtests/__init__.py3CODE
LOWtests/__init__.py4CODE
LOWtests/common.py2CODE
LOWtests/common.py17CODE
LOWtests/common.py20CODE
LOWtests/homeassistantfixtures/min.py8CODE
LOWtests/homeassistantfixtures/dev.py8CODE
LOWtests/repositories/test_update_repository.py4CODE
LOWtests/repositories/test_get_documentation.py3CODE
LOWcustom_components/hacs/update.py3CODE
LOWcustom_components/hacs/coordinator.py3CODE
LOWcustom_components/hacs/diagnostics.py3CODE
LOWcustom_components/hacs/frontend.py3CODE
LOWcustom_components/hacs/__init__.py7CODE
LOWcustom_components/hacs/__init__.py115CODE
LOWcustom_components/hacs/switch.py3CODE
LOWcustom_components/hacs/repairs.py3CODE
LOWcustom_components/hacs/data_client.py3CODE
LOWcustom_components/hacs/data_client.py5CODE
LOWcustom_components/hacs/entity.py3CODE
LOWcustom_components/hacs/base.py3CODE
LOWcustom_components/hacs/base.py64CODE
LOWcustom_components/hacs/config_flow.py3CODE
LOWcustom_components/hacs/validate/integration_manifest.py1CODE
LOWcustom_components/hacs/validate/issues.py1CODE
LOWcustom_components/hacs/validate/archived.py1CODE
LOWcustom_components/hacs/validate/description.py1CODE
LOWcustom_components/hacs/validate/information.py1CODE
LOWcustom_components/hacs/validate/hacsjson.py1CODE
LOWcustom_components/hacs/validate/topics.py1CODE
LOWcustom_components/hacs/validate/brands.py1CODE
LOWcustom_components/hacs/validate/images.py1CODE
LOWcustom_components/hacs/validate/license.py1CODE
LOWcustom_components/hacs/validate/manager.py3CODE
LOWcustom_components/hacs/validate/base.py3CODE
LOWcustom_components/hacs/websocket/critical.py3CODE
LOWcustom_components/hacs/websocket/__init__.py3CODE
LOWcustom_components/hacs/websocket/repositories.py3CODE
LOWcustom_components/hacs/websocket/repository.py3CODE
LOWcustom_components/hacs/utils/backup.py3CODE
LOWcustom_components/hacs/utils/version.py3CODE
LOWcustom_components/hacs/utils/decorator.py3CODE
LOWcustom_components/hacs/utils/validate.py3CODE
LOWcustom_components/hacs/utils/file_system.py3CODE
LOWcustom_components/hacs/utils/path.py3CODE
LOWcustom_components/hacs/utils/json.py3CODE
LOWcustom_components/hacs/utils/regex.py3CODE
LOWcustom_components/hacs/utils/filters.py3CODE
LOWcustom_components/hacs/utils/data.py3CODE
LOWcustom_components/hacs/utils/queue_manager.py3CODE
LOWcustom_components/hacs/repositories/theme.py3CODE
LOWcustom_components/hacs/repositories/__init__.py3CODE
LOWcustom_components/hacs/repositories/integration.py3CODE
LOWcustom_components/hacs/repositories/plugin.py3CODE
LOWcustom_components/hacs/repositories/template.py3CODE
LOWcustom_components/hacs/repositories/appdaemon.py3CODE
6 more matches not shown…
Empty Error Handlers7 hits · 35 pts
SeverityFileLineSnippetContext
HIGHcustom_components/hacs/__init__.py85except BaseException: # lgtm [py/catch-base-exception] pylint: disable=broad-exceptCODE
HIGHcustom_components/hacs/__init__.py215except AttributeError:CODE
HIGHcustom_components/hacs/__init__.py116except ImportError:CODE
HIGHcustom_components/hacs/base.py1046except HacsException:CODE
HIGHcustom_components/hacs/utils/version.py25except (AwesomeVersionException, AttributeError, KeyError):CODE
HIGHcustom_components/hacs/utils/data.py164except HomeAssistantError:CODE
HIGHcustom_components/hacs/repositories/base.py723except BaseException:CODE
Deep Nesting32 hits · 26 pts
SeverityFileLineSnippetContext
LOWtests/common.py170CODE
LOWtests/repositories/test_download_counting.py157CODE
LOWtests/repositories/test_download_counting.py179CODE
LOWtests/repositories/test_download_counting.py205CODE
LOWtests/repositories/test_download_counting.py233CODE
LOWtests/repositories/test_download_counting.py258CODE
LOWtests/repositories/test_download_counting.py281CODE
LOWtests/repositories/test_download_counting.py304CODE
LOWtests/repositories/test_download_counting.py329CODE
LOWtests/repositories/test_download_counting.py356CODE
LOWtests/hacsbase/test_hacsbase_data.py24CODE
LOWtests/hacsbase/test_hacsbase_data.py27CODE
LOWcustom_components/hacs/base.py424CODE
LOWcustom_components/hacs/base.py517CODE
LOWcustom_components/hacs/base.py669CODE
LOWcustom_components/hacs/base.py848CODE
LOWcustom_components/hacs/base.py427CODE
LOWcustom_components/hacs/validate/information.py21CODE
LOWcustom_components/hacs/utils/filters.py8CODE
LOWcustom_components/hacs/utils/data.py156CODE
LOWcustom_components/hacs/repositories/plugin.py99CODE
LOWcustom_components/hacs/repositories/base.py197CODE
LOWcustom_components/hacs/repositories/base.py358CODE
LOWcustom_components/hacs/repositories/base.py408CODE
LOWcustom_components/hacs/repositories/base.py653CODE
LOWcustom_components/hacs/repositories/base.py777CODE
LOWcustom_components/hacs/repositories/base.py1047CODE
LOWcustom_components/hacs/repositories/base.py1176CODE
LOWcustom_components/hacs/repositories/base.py680CODE
LOWaction/action.py94CODE
LOWscripts/data/validate_category_data.py19CODE
LOWscripts/data/generate_category_data.py199CODE
Modern Structural Boilerplate18 hits · 19 pts
SeverityFileLineSnippetContext
LOW⚡custom_components/hacs/update.py149 def _update_download_progress(self, data: dict) -> None:CODE
LOW⚡custom_components/hacs/update.py156 def _update_in_progress(self, progress: int | bool) -> None:CODE
LOWcustom_components/hacs/entity.py68 def _update_and_write_state(self, _: Any) -> None:CODE
LOWcustom_components/hacs/base.py137 def update_from_dict(self, data: dict) -> None:CODE
LOWcustom_components/hacs/base.py389 def set_stage(self, stage: HacsStage | None) -> None:CODE
LOWcustom_components/hacs/base.py775 def set_active_categories(self) -> None:CODE
LOWcustom_components/hacs/base.py1004 async def update_repository(repository: HacsRepository) -> None:CODE
LOWcustom_components/hacs/base.py1020 async def update_coordinators() -> None:CODE
LOWcustom_components/hacs/utils/json.py5__all__ = ["json_loads"]CODE
LOWcustom_components/hacs/repositories/theme.py113 def update_filenames(self) -> None:CODE
LOWcustom_components/hacs/repositories/plugin.py99 def update_filenames(self) -> None:CODE
LOWcustom_components/hacs/repositories/plugin.py193 async def update_dashboard_resources(self) -> None:CODE
LOWcustom_components/hacs/repositories/appdaemon.py50 async def update_repository(self, ignore_issues: bool = False, force: bool = False) -> None:CODE
LOWcustom_components/hacs/repositories/python_script.py105 def update_filenames(self) -> None:CODE
LOWcustom_components/hacs/repositories/base.py197 def update_data(self, data: dict, action: bool = False) -> None:CODE
LOWcustom_components/hacs/repositories/base.py254 def update_data(self, data: dict) -> None:CODE
LOWcustom_components/hacs/repositories/base.py465 async def update_repository(self, ignore_issues=False, force=False) -> None:CODE
LOWcustom_components/hacs/repositories/base.py1016 def update_filenames(self) -> None:CODE
Excessive Try-Catch Wrapping10 hits · 12 pts
SeverityFileLineSnippetContext
LOWcustom_components/hacs/data_client.py57 except Exception as exception:CODE
LOWcustom_components/hacs/validate/license.py78 except Exception as err:CODE
LOWcustom_components/hacs/websocket/repository.py50 except Exception as exception: # pylint: disable=broad-exceptCODE
LOWcustom_components/hacs/websocket/repository.py266 except Exception as exception: # pylint: disable=broad-exceptCODE
LOWcustom_components/hacs/websocket/repository.py351 except Exception as exception:CODE
LOWcustom_components/hacs/utils/decorator.py53 except Exception: # pylint: disable=broad-exceptCODE
LOWcustom_components/hacs/utils/decorator.py60 except Exception: # pylint: disable=broad-exceptCODE
MEDIUMcustom_components/hacs/utils/decorator.py50def sync_wrapper(*args, **kwargs):CODE
MEDIUMcustom_components/hacs/utils/decorator.py57def async_wrapper(*args, **kwargs):CODE
LOWcustom_components/hacs/repositories/integration.py215 except Exception: # pylint: disable=broad-exceptCODE
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_init_function.py72 # Create a mock repositoryCOMMENT
MEDIUMtests/test_init.py66 # Create a mock repositoryCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWcustom_components/hacs/validate/brands.py37 # Check if the integraiton provides local brand assetsCOMMENT
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…et_documentation/installed_false_last_version_2_0_0.md1## Example readme file (2.0.0)COMMENT