Skip to content

Latest commit

 

History

History
70 lines (53 loc) · 8.26 KB

AGENTS.md

File metadata and controls

70 lines (53 loc) · 8.26 KB

AI Agent Instructions

This repository contains the core of Home Assistant, a Python 3 based home automation application.

Git Commit Guidelines

  • Do NOT amend, squash, or rebase commits that have already been pushed to the PR branch after the PR is opened - Reviewers need to follow the commit history, as well as see what changed since their last review

Pull Requests

  • When opening a pull request, use the repository's PR template (.github/PULL_REQUEST_TEMPLATE.md). NEVER REMOVE ANYTHING from the template.
  • Do not remove checkboxes that are not checked — leave all unchecked checkboxes in place so reviewers can see which options were not selected.

Code review

  • Start review comments with a short, one-sentence summary of the suggested fix.
  • Do not comment on code style, formatting or linting issues.
  • When reviewing changes under homeassistant/components/ or tests/components/, use the ha-integration-knowledge skill as the primary reference.
  • Flag comments that over-explain straightforward code, narrate the obvious, or read like AI commentary (multi-sentence justifications for a single line).
  • A Pull Request with a dependency version bump should only contain changes required for the version bump. If the PR includes other changes, request that they are removed from the PR.
  • Do not ask to mark a Pull Request as a breaking change when it removes a YAML import whose deprecation period has ended; the deprecation already announced the removal.
  • Check that the PR description is complete and filled in according to the PR template in .github/PULL_REQUEST_TEMPLATE.md. Every section and checklist item from the template must be present, except the ## Breaking change section which is optional. No content from the template should be missing, except for HTML comments and Markdown link reference definitions (lines of the form [name]: url), which do not render and cannot be verified from the description. Even unchecked checkboxes or empty sections must be present. This is a hard requirement.
  • Skip the PR template check for pull requests generated by automated dependency bots. These are identifiable by their description: Renovate PRs contain "This PR was generated by [Mend Renovate]" and Dependabot PRs contain "Dependabot commands and options". All other review instructions still apply to these PRs.

Development Commands

  • Run "python3" in current virtual environment to ensure the correct Python version is used for testing.
  • When entering a new environment or worktree, run script/setup to set up the virtual environment with all development dependencies (pylint, pre-commit hooks, etc.). This is required before committing. If uv reports that no download was found for the required Python version, the environment is running an outdated version of uv; upgrade it with curl -LsSf https://astral.sh/uv/install.sh | sh and run script/setup again.
  • .vscode/tasks.json contains useful commands used for development.
  • After finishing a code session, run base=$(git merge-base HEAD dev) && uv run --no-sync prek run --files $(git diff --name-only --diff-filter=d "$base"; git ls-files --others --exclude-standard) to check the files changed on the branch (committed, uncommitted and untracked) for linting and formatting issues.

Python Syntax Notes

  • Home Assistant officially supports Python 3.14 as its minimum version. Do not flag syntax or features that require Python 3.14 as issues, and do not suggest workarounds for older Python versions.
  • Python 3.14 explicitly allows except TypeA, TypeB: without parentheses. Never flag this as an issue.
  • Python 3.14 evaluates annotations lazily (PEP 649). Forward references in annotations do not need to be quoted — annotations can reference names defined later in the module without quoting them or using from __future__ import annotations. Do not flag unquoted forward references in annotations as issues.

Testing

  • Use uv run --no-sync pytest to run tests
  • After modifying strings.json for an integration, regenerate the English translation file before running tests: python3 -m script.translations develop --integration <integration_name>. Tests load translations from the generated translations/en.json, not directly from strings.json.
  • When writing or modifying tests, ensure all test function parameters have type annotations.
  • Prefer concrete types (for example, HomeAssistant, MockConfigEntry, etc.) over Any.
  • Prefer @pytest.mark.usefixtures over arguments, if the argument is not going to be used.
  • Avoid using conditions/branching in tests. Instead, either split tests or adjust the test parametrization to cover all cases without branching.
  • If multiple tests share most of their code, use pytest.mark.parametrize to merge them into a single parameterized test instead of duplicating the body. Use pytest.param with an id parameter to name the test cases clearly.
  • We use Syrupy for snapshot testing. Leverage .ambr snapshots instead of repetitive and exhaustive generation of test data within Python code itself.
  • Hardcoded entity_ids in tests are fine. If the same one is repeated, use a constant.

Good practices

  • Integrations with Platinum or Gold level in the Integration Quality Scale reflect a high standard of code quality and maintainability. When looking for examples of something, these are good places to start. The level is indicated in the manifest.json of the integration.
  • When reviewing entity actions, do not suggest extra defensive checks for input fields that are already validated by Home Assistant's service/action schemas and entity selection filters. Suggest additional guards only when data bypasses those validators or is transformed into a less-safe form.
  • When validation guarantees a dict key exists, prefer direct key access (data["key"]) instead of .get("key") so contract violations are surfaced instead of silently masked.
  • Keep comments concise. Prefer one short line stating the non-obvious constraint, or no comment at all.
  • Do not add comments that just restate the code on the following line(s) (e.g. # Check if initialized above if self.initialized:). Comments should only explain why (non-obvious constraints, surprising behavior, or workarounds), never what. Never add comments that justify a change by referencing what the code looked like before. Comments in tests that explain why a function call or assertion is made are ok.
  • Do not add section or divider comments (e.g. # --- XYZ Triggers ---) inside or outside of functions, since those can easily become stale and be misleading.
  • When catching exceptions, try-clauses should be as small as possible, i.e. avoid wrapping large blocks of code in a try-clause, and avoid catching exceptions from functions that are not expected to raise them.
  • Avoid passing the stringified original exception (e.g. str(err)) as a translation placeholder of a translated exception such as HomeAssistantError, ServiceValidationError, ConfigEntryNotReady or UpdateFailed. It mixes untranslated text into a translated message, and Home Assistant already logs most of these exceptions (service calls, coordinator updates, config entry setup). Instead use more specific errors that can be translated and a central handler (decorator or helper method).
  • Asserts that exist only to narrow types for the type checker must be placed behind an if TYPE_CHECKING: guard, so they are not executed at runtime.
  • Sensitive service actions, i.e. those that can change configuration or have security implications, should require an admin user. Register them with the async_register_admin_service service helper, which checks this for you.
  • Constants that more than one module of an integration uses go in const.py; a constant only one module uses stays in that module. Tests do not count as a user. This includes entity descriptions and service schemas. Never import a constant from one platform module into another; move it to const.py instead. Pre-existing constants that a change does not touch can stay where they are.

AI policy

This project follows the Open Home Foundation AI Policy. Autonomous contributions are not accepted: a human must review, understand, and be able to explain every change before it is submitted. Do not open issues or pull requests autonomously, and do not post comments on behalf of a user without their review.