mirror of
https://github.com/home-assistant/core.git
synced 2026-08-28 10:16:02 -05:00
The honest full-tree compat baseline (all 1148 integration suites through the real in-process lane) and its analysis, preserved under sandbox/reports/2026-07-08/ so a re-run can't clobber it: - COMPAT.csv / COMPAT_LATEST.md — baseline at9c0d69d8f3(60.5% test-level pass across the 763 engaged suites). - COMPAT-postfix.csv / .md — re-sweep after the reauth/reconfigure fix (402e7987bd): 60.5% -> 62.4% pass, errors -887. - clusters/ — failure clustering (clusters.md + clusters.json) over the --tb=line dumps. - FINDINGS.md — the diagnosis: eight cross-cutting root-cause clusters ranked by leverage, with the fix each suggests. Cluster 1 (reauth/ reconfigure) is the one already fixed; its writeback residual, the SETUP_RETRY gap (333 integrations), and the snapshot refresh are the next levers. runtime_data (50 integrations) is documented as an inherent white-box divergence, not a bug. Tooling: sandbox/cluster_failures.py (reusable clusterer, reads $SANDBOX_ERRORS_DIR), run_compat.py gains --jobs parallelism, --tb=line + wide columns for full failure reasons, and the tagged-vs-engaged 'main'/'no_op' bucket split. reports/README.md documents the convention; the generated report archive is excluded from codespell/prettier. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QCotUYum6AoisyrxshoiJJ
145 lines
6.0 KiB
YAML
145 lines
6.0 KiB
YAML
repos:
|
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
rev: v0.15.20
|
|
hooks:
|
|
- id: ruff-check
|
|
args:
|
|
- --fix
|
|
- id: ruff-format
|
|
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.(py|pyi)$
|
|
- repo: https://github.com/codespell-project/codespell
|
|
rev: v2.4.2
|
|
hooks:
|
|
- id: codespell
|
|
args:
|
|
- --ignore-words-list=aiport,astroid,checkin,currenty,hass,iif,incomfort,lookin,nam,NotIn
|
|
- --skip="./.*,*.csv,*.json,*.ambr"
|
|
- --quiet-level=2
|
|
exclude_types: [csv, json, html]
|
|
exclude: ^tests/fixtures/|homeassistant/generated/|tests/components/.*/snapshots/|sandbox/reports/
|
|
- repo: https://github.com/zizmorcore/zizmor-pre-commit
|
|
rev: v1.24.1
|
|
hooks:
|
|
- id: zizmor
|
|
args:
|
|
- --pedantic
|
|
exclude: ^\.github/workflows/.*\.lock\.yml$|^sandbox/reports/
|
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
rev: v6.0.0
|
|
hooks:
|
|
- id: check-executables-have-shebangs
|
|
stages: [manual]
|
|
- id: check-json
|
|
exclude: (.vscode|.devcontainer)
|
|
- id: no-commit-to-branch
|
|
args:
|
|
- --branch=dev
|
|
- --branch=master
|
|
- --branch=rc
|
|
- repo: https://github.com/adrienverge/yamllint.git
|
|
rev: v1.38.0
|
|
hooks:
|
|
- id: yamllint
|
|
- repo: https://github.com/rbubley/mirrors-prettier
|
|
rev: v3.6.2
|
|
hooks:
|
|
- id: prettier
|
|
additional_dependencies:
|
|
- prettier@3.6.2
|
|
- prettier-plugin-sort-json@4.2.0
|
|
exclude: ^\.github/workflows/.*\.lock\.yml$
|
|
- repo: https://github.com/cdce8p/python-typing-update
|
|
rev: v0.6.0
|
|
hooks:
|
|
# Run `python-typing-update` hook manually from time to time
|
|
# to update python typing syntax.
|
|
# Will require manual work, before submitting changes!
|
|
# prek run --hook-stage manual python-typing-update --all-files
|
|
- id: python-typing-update
|
|
stages: [manual]
|
|
args:
|
|
- --py311-plus
|
|
- --force
|
|
- --keep-updates
|
|
files: ^(homeassistant|tests|script)/.+\.py$
|
|
- repo: local
|
|
hooks:
|
|
# Drift guard for the checked-in sandbox protobuf gencode. Manual
|
|
# stage only (grpcio-tools is not a project dep, so it bootstraps a
|
|
# throwaway venv and degrades gracefully when uv is absent): run with
|
|
# `prek run --hook-stage manual sandbox-proto-drift` or in a CI lane.
|
|
- id: sandbox-proto-drift
|
|
name: sandbox protobuf gencode drift guard
|
|
entry: sandbox/proto/check_drift.sh
|
|
language: script
|
|
pass_filenames: false
|
|
stages: [manual]
|
|
files: ^sandbox/proto/sandbox\.proto$
|
|
# Drift guard for the hand-mirrored sandbox wire modules (channel.py,
|
|
# codec_protobuf.py, messages.py) and the checked-in protobuf gencode
|
|
# pair (_proto/sandbox_pb2.py/.pyi). A plain byte-for-byte diff with no
|
|
# external tooling, so — unlike the proto gencode guard above — it runs as
|
|
# a regular hook whenever either copy of a mirrored file changes.
|
|
- id: sandbox-mirror-drift
|
|
name: sandbox wire-module mirror drift guard
|
|
entry: sandbox/proto/check_mirror_drift.sh
|
|
language: script
|
|
pass_filenames: false
|
|
files: ^(homeassistant/components/sandbox|sandbox/hass_client/hass_client)/((channel|codec_protobuf|messages)\.py|_proto/sandbox_pb2\.(py|pyi))$
|
|
# Run mypy through our wrapper script in order to get the possible
|
|
# pyenv and/or virtualenv activated; it may not have been e.g. if
|
|
# committing from a GUI tool that was not launched from an activated
|
|
# shell.
|
|
- id: mypy
|
|
name: mypy
|
|
entry: script/run-in-env.sh mypy
|
|
language: script
|
|
require_serial: true
|
|
types_or: [python, pyi]
|
|
files: ^(homeassistant|pylint)/.+\.(py|pyi)$
|
|
# Checked-in protobuf gencode (sandbox): the .py + .pyi pair trips
|
|
# mypy's duplicate-module check, and it is machine-generated anyway.
|
|
exclude: _pb2\.(py|pyi)$
|
|
- id: pylint
|
|
name: pylint
|
|
entry: script/run-in-env.sh pylint --ignore-missing-annotations=y
|
|
language: script
|
|
require_serial: true
|
|
types_or: [python, pyi]
|
|
files: ^(homeassistant|tests)/.+\.(py|pyi)$
|
|
- id: gen_requirements_all
|
|
name: gen_requirements_all
|
|
entry: script/run-in-env.sh python3 -m script.gen_requirements_all
|
|
pass_filenames: false
|
|
language: script
|
|
types: [text]
|
|
files: ^(homeassistant/.+/manifest\.json|homeassistant/brands/.+\.json|pyproject\.toml|\.pre-commit-config\.yaml|script/gen_requirements_all\.py)$
|
|
- id: gen_copilot_instructions
|
|
name: gen_copilot_instructions
|
|
entry: script/run-in-env.sh python3 -m script.gen_copilot_instructions
|
|
pass_filenames: false
|
|
language: script
|
|
types: [text]
|
|
files: ^(AGENTS\.md|\.claude/skills/(?!github-pr-reviewer/).+/SKILL\.md|\.github/copilot-instructions\.md|script/gen_copilot_instructions\.py)$
|
|
- id: hassfest
|
|
name: hassfest
|
|
entry: script/run-in-env.sh python3 -m script.hassfest
|
|
pass_filenames: false
|
|
language: script
|
|
types: [text]
|
|
files: ^(homeassistant/.+/(icons|manifest|strings)\.json|homeassistant/.+/(conditions|quality_scale|services|triggers)\.yaml|homeassistant/brands/.*\.json|script/hassfest/(?!metadata|mypy_config).+\.py|homeassistant/components/sensor/const\.py|requirements.+\.txt)$
|
|
- id: hassfest-metadata
|
|
name: hassfest-metadata
|
|
entry: script/run-in-env.sh python3 -m script.hassfest -p metadata,docker
|
|
pass_filenames: false
|
|
language: script
|
|
types: [text]
|
|
files: ^(script/hassfest/(metadata|docker)\.py|homeassistant/const\.py$|pyproject\.toml)$
|
|
- id: hassfest-mypy-config
|
|
name: hassfest-mypy-config
|
|
entry: script/run-in-env.sh python3 -m script.hassfest -p mypy_config
|
|
pass_filenames: false
|
|
language: script
|
|
types: [text]
|
|
files: ^(script/hassfest/mypy_config\.py|\.strict-typing|mypy\.ini)$
|