Repository Analysis

hacs/integration

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

12.5 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of hacs/integration, a Python project with 7,591 GitHub stars. SynthScan v2.0 examined 29,256 lines of code across 593 source files, recording 354 pattern matches distributed across 8 syntactic categories. The overall adjusted score of 12.5 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

12.5
Adjusted Score
12.5
Raw Score
100%
Time Factor
2026-07-31
Last Push
7.6K
Stars
Python
Language
29.3K
Lines of Code
593
Files
354
Pattern Hits
2026-08-02
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 0MEDIUM 4LOW 350

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 354 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers224 hits · 233 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.py116def category_test_data_parametrized(CODE
LOWtests/common.py237def 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
LOWtests/validate/test_integration_manifest_check.py6async def test_integration_no_manifest(repository_integration):CODE
LOWtests/validate/test_integration_manifest_check.py12async def test_integration_manifest_with_valid_manifest(repository_integration):CODE
LOWtests/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
LOWtests/validate/test_license.py11async def test_repository_no_license(repository):CODE
LOWtests/validate/test_license.py19async def test_repository_unrecognized_license(repository):CODE
LOWtests/validate/test_license.py29async def test_repository_missing_spdx_id(repository):CODE
LOWtests/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
LOWtests/validate/test_hacsjson_check.py51async def test_hacs_manifest_with_missing_filename(repository, caplog):CODE
164 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.py16CODE
LOWtests/common.py19CODE
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…
Deep Nesting32 hits · 28 pts
SeverityFileLineSnippetContext
LOWtests/common.py150CODE
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
LOWcustom_components/hacs/update.py149 def _update_download_progress(self, data: dict) -> None:CODE
LOWcustom_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